Large diffs are not rendered by default.

Large diffs are not rendered by default.

@@ -14,7 +14,12 @@ dependencies {

compile group: 'org.reflections', name: 'reflections', version: '0.9.10'
compile group: 'net.sf.trove4j', name: 'trove4j', version: '3.0.3'

compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '9.0.0.M8', {
exclude module: "tomcat-coyote"
exclude module: "tomcat-servlet-api"
exclude module: "tomcat-jni"
}

// DEPENDENCY INJECTION
compile group: 'com.google.inject', name: 'guice', version: '4.0'
compile group: 'com.google.inject.extensions', name: 'guice-persist', version: '4.0'
@@ -11,8 +11,6 @@
import org.mdev.revolution.communication.encryption.HabboEncryption;
import org.mdev.revolution.communication.packets.PacketManager;
import org.mdev.revolution.database.DatabaseManager;
import org.mdev.revolution.database.domain.Player;
import org.mdev.revolution.game.players.PlayerService;
import org.mdev.revolution.network.Server;
import org.mdev.revolution.network.sessions.SessionManager;
import org.mdev.revolution.utilities.Configuration;
@@ -142,8 +140,6 @@ public static void main(String[] args) {
Thread hook = new Thread(Revolution::shutdown);
Runtime.getRuntime().addShutdownHook(hook);

PlayerService.getInstance().findPlayer("542abedcbca62eb7d0220b32a5b88689");

while (true) {}
}

@@ -1,4 +1,18 @@
package org.mdev.revolution.communication.packets.incoming.handshake;

import org.mdev.revolution.communication.encryption.HabboEncryption;
import org.mdev.revolution.communication.packets.PacketEvent;
import org.mdev.revolution.communication.packets.incoming.ClientPacket;
import org.mdev.revolution.communication.packets.incoming.ClientPacketHeader;
import org.mdev.revolution.communication.packets.outgoing.handshake.NoobnessLevelMessageComposer;
import org.mdev.revolution.communication.packets.outgoing.handshake.UserObjectComposer;
import org.mdev.revolution.network.sessions.Session;

public class InfoRetrieveMessageEvent {
}
@PacketEvent(number = ClientPacketHeader.InfoRetrieveMessageEvent)
public static void infoRetrieve(Session session, ClientPacket packet) {
session.sendQueued(new UserObjectComposer(session.getPlayerBean()))
.sendQueued(new NoobnessLevelMessageComposer())
.getChannel().flush();
}
}
@@ -3,15 +3,15 @@
import org.mdev.revolution.communication.packets.PacketEvent;
import org.mdev.revolution.communication.packets.incoming.ClientPacket;
import org.mdev.revolution.communication.packets.incoming.ClientPacketHeader;
import org.mdev.revolution.communication.packets.outgoing.handshake.UniqueIDComposer;
import org.mdev.revolution.communication.packets.outgoing.handshake.UniqueMachineIDComposer;
import org.mdev.revolution.network.sessions.Session;

public class UniqueMachineIDMessageEvent {
public class UniqueIDMessageEvent {
@PacketEvent(number = ClientPacketHeader.UniqueIDMessageEvent)
public static void uniqueID(Session session, ClientPacket packet) {
String junk = packet.readString();
String machineId = packet.readString();

session.sendPacket(new UniqueIDComposer(machineId));
session.sendPacket(new UniqueMachineIDComposer(machineId));
}
}
@@ -1,5 +1,6 @@
package org.mdev.revolution.communication.packets.incoming.handshake;

import org.mdev.revolution.Revolution;
import org.mdev.revolution.communication.packets.PacketEvent;
import org.mdev.revolution.communication.packets.incoming.ClientPacket;
import org.mdev.revolution.communication.packets.incoming.ClientPacketHeader;
@@ -9,6 +10,10 @@
public class VersionCheckMessageEvent {
@PacketEvent(number = ClientPacketHeader.VersionCheckMessageEvent)
public static void versionCheck(Session session, ClientPacket packet) {
System.out.println(packet.readString());
String build = packet.readString();

if (!build.equals(Revolution.TARGET_CLIENT)) {
System.out.println("The server has detected different client versions, some packets may go unhandled!");
}
}
}
@@ -3,13 +3,20 @@
public final class ServerPacketHeader {
public static final short InitDiffieHandshakeComposer = 675;
public static final short CompleteDiffieHandshakeComposer = 3179;
public static final short UniqueIDComposer = 2935;
public static final short UniqueMachineIDComposer = 2935;
public static final short MOTDNotificationComposer = 1829;
public static final short HabboBroadcastMessageComposer = 1279;
public static final short AuthenticationOKComposer = 1442;
public static final short AvailabilityStatusMessageComposer = 2468;
public static final short NavigatorSettingsComposer = 3175;
public static final short AvatarEffectsMessageComposer = 3310;
public static final short FigureSetIdsComposer = 3469;
public static final short UserRightsMessageComposer = 1862;
public static final short AchievementsScoreComposer = 3710;
public static final short AchievementsComposer = 2066;
public static final short BuildersClubSubscriptionStatusMessageComposer = 2357;
public static final short CfhChatlogComposer = 2067;
public static final short AccountPreferencesComposer = 2921;
public static final short UserObjectComposer = 1823;
}
public static final short NoobnessLevelMessageComposer = 2807;
}
@@ -0,0 +1,14 @@
package org.mdev.revolution.communication.packets.outgoing.catalog;

import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class BuildersClubSubscriptionStatusMessageComposer extends ServerPacket {
public BuildersClubSubscriptionStatusMessageComposer() {
super(ServerPacketHeader.BuildersClubSubscriptionStatusMessageComposer);
super.writeInt(Integer.MAX_VALUE);
super.writeInt(100);
super.writeInt(0);
super.writeInt(Integer.MAX_VALUE);
}
}
@@ -0,0 +1,59 @@
package org.mdev.revolution.communication.packets.outgoing.handshake;

import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class NoobnessLevelMessageComposer extends ServerPacket {
public NoobnessLevelMessageComposer() {
super(ServerPacketHeader.NoobnessLevelMessageComposer);
super.writeInt(15); // Count
super.writeString("USE_GUIDE_TOOL");
super.writeString("");
super.writeBoolean(false);
super.writeString("GIVE_GUIDE_TOURS");
super.writeString("requirement.unfulfilled.helper_le");
super.writeBoolean(false);
super.writeString("JUDGE_CHAT_REVIEWS");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("VOTE_IN_COMPETITIONS");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("CALL_ON_HELPERS");
super.writeString(""); // ??
super.writeBoolean(false);
super.writeString("CITIZEN");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("TRADE");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("HEIGHTMAP_EDITOR_BETA");
super.writeString(""); // ??
super.writeBoolean(false);
super.writeString("EXPERIMENTAL_CHAT_BETA");
super.writeString("requirement.unfulfilled.helper_level_2");
super.writeBoolean(true);
super.writeString("EXPERIMENTAL_TOOLBAR");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("BUILDER_AT_WORK");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("NAVIGATOR_PHASE_ONE_2014");
super.writeString(""); // ??
super.writeBoolean(false);
super.writeString("CAMERA");
super.writeString(""); // ??
super.writeBoolean(false);
super.writeString("NAVIGATOR_PHASE_TWO_2014");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("MOUSE_ZOOM");
super.writeString(""); // ??
super.writeBoolean(true);
super.writeString("NAVIGATOR_ROOM_THUMBNAIL_CAMERA");
super.writeString(""); // ??
super.writeBoolean(false);
}
}
@@ -3,9 +3,9 @@
import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class UniqueIDComposer extends ServerPacket {
public UniqueIDComposer(String machineId) {
super(ServerPacketHeader.UniqueIDComposer);
public class UniqueMachineIDComposer extends ServerPacket {
public UniqueMachineIDComposer(String machineId) {
super(ServerPacketHeader.UniqueMachineIDComposer);
super.writeString(machineId);
}
}
@@ -2,10 +2,24 @@

import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;
import org.mdev.revolution.game.players.PlayerBean;

public class UserObjectComposer extends ServerPacket {
public UserObjectComposer() {
public UserObjectComposer(PlayerBean playerBean) {
super(ServerPacketHeader.UserObjectComposer);

super.writeInt(playerBean.getPlayer().getId());
super.writeString(playerBean.getPlayer().getUsername());
super.writeString(""); // Look
super.writeString("M"); // Gender
super.writeString("Revolution Server Developer"); // Motto
super.writeString("");
super.writeBoolean(false);
super.writeInt(0); // Respects
super.writeInt(3); // Daily Respects
super.writeInt(3); // Daily Scratches
super.writeBoolean(false); // Friends stream active
super.writeString(""); // last online?
super.writeBoolean(false); // Can change name
super.writeBoolean(false);
}
}
@@ -0,0 +1,11 @@
package org.mdev.revolution.communication.packets.outgoing.inventory.achievements;

import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class AchievementsComposer extends ServerPacket {
public AchievementsComposer() {
super(ServerPacketHeader.AchievementsComposer);
super.writeInt(0);
}
}
@@ -0,0 +1,12 @@
package org.mdev.revolution.communication.packets.outgoing.inventory.achievements;


import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class AchievementsScoreComposer extends ServerPacket {
public AchievementsScoreComposer(int achievementScore) {
super(ServerPacketHeader.AchievementsScoreComposer);
super.writeInt(achievementScore);
}
}
@@ -4,11 +4,20 @@
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;
import org.mdev.revolution.game.players.effects.AvatarEffect;

import javax.validation.constraints.NotNull;
import java.util.List;

public class AvatarEffectsMessageComposer extends ServerPacket {
@NotNull
public AvatarEffectsMessageComposer(List<AvatarEffect> effects) {
super(ServerPacketHeader.AvatarEffectsMessageComposer);

// Until Avatar Effects are cached
if (effects == null) {
super.writeInt(0);
return;
}

super.writeInt(effects.size());
effects.forEach((effect) -> {
super.writeInt(effect.getSpriteId());
@@ -0,0 +1,11 @@
package org.mdev.revolution.communication.packets.outgoing.inventory.clothes;

import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class FigureSetIdsComposer extends ServerPacket {
public FigureSetIdsComposer() {
super(ServerPacketHeader.FigureSetIdsComposer);
super.writeInt(0); // TODO
}
}
@@ -0,0 +1,104 @@
package org.mdev.revolution.communication.packets.outgoing.moderation;

import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class CfhChatlogComposer extends ServerPacket {
public CfhChatlogComposer() {
super(ServerPacketHeader.CfhChatlogComposer);
super.writeInt(6);
super.writeString("sex_and_pii");
super.writeInt(8);
super.writeString("sexual_webcam_images");
super.writeInt(1);
super.writeString("mods");
super.writeString("sexual_webcam_images_auto");
super.writeInt(2);
super.writeString("mods");
super.writeString("explicit_sexual_talk");
super.writeInt(3);
super.writeString("mods");
super.writeString("cybersex");
super.writeInt(4);
super.writeString("mods");
super.writeString("cybersex_auto");
super.writeInt(5);
super.writeString("mods");
super.writeString("meet_some");
super.writeInt(6);
super.writeString("mods");
super.writeString("meet_irl");
super.writeInt(7);
super.writeString("mods");
super.writeString("email_or_phone");
super.writeInt(8);
super.writeString("mods");
super.writeString("scamming");
super.writeInt(3);
super.writeString("stealing");
super.writeInt(9);
super.writeString("mods");
super.writeString("scamsites");
super.writeInt(10);
super.writeString("mods");
super.writeString("selling_buying_accounts_or_furni");
super.writeInt(11);
super.writeString("mods");
super.writeString("trolling");
super.writeInt(11);
super.writeString("hate_speech");
super.writeInt(12);
super.writeString("mods");
super.writeString("violent_roleplay");
super.writeInt(13);
super.writeString("mods");
super.writeString("swearing");
super.writeInt(14);
super.writeString("auto_reply");
super.writeString("drugs");
super.writeInt(15);
super.writeString("mods");
super.writeString("gambling");
super.writeInt(16);
super.writeString("mods");
super.writeString("self_threatening");
super.writeInt(17);
super.writeString("mods");
super.writeString("mild_staff_impersonation");
super.writeInt(18);
super.writeString("mods");
super.writeString("severe_staff_impersonation");
super.writeInt(19);
super.writeString("mods");
super.writeString("habbo_name");
super.writeInt(20);
super.writeString("mods");
super.writeString("minors_access");
super.writeInt(21);
super.writeString("mods");
super.writeString("bullying");
super.writeInt(22);
super.writeString("guardians");
super.writeString("interruption");
super.writeInt(2);
super.writeString("flooding");
super.writeInt(23);
super.writeString("mods");
super.writeString("doors");
super.writeInt(24);
super.writeString("mods");
super.writeString("room");
super.writeInt(1);
super.writeString("room_report");
super.writeInt(25);
super.writeString("mods");
super.writeString("help");
super.writeInt(2);
super.writeString("help_habbo");
super.writeInt(26);
super.writeString("auto_reply");
super.writeString("help_payments");
super.writeInt(27);
super.writeString("auto_reply");
}
}
@@ -0,0 +1,29 @@
package org.mdev.revolution.communication.packets.outgoing.preferences;

import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.ServerPacketHeader;

public class AccountPreferencesComposer extends ServerPacket {
public AccountPreferencesComposer() {
super(ServerPacketHeader.AccountPreferencesComposer);

// VOLUME
super.writeInt(100);
super.writeInt(100);
super.writeInt(100);

// CHAT PREFERENCE
super.writeBoolean(false);

// INVITE STATUS
super.writeBoolean(true);

// FOCUS PREFERENCE
super.writeBoolean(true);

// FRIEND BAR STATE
super.writeInt(0);
super.writeInt(0);
super.writeInt(0);
}
}
@@ -12,14 +12,11 @@
import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl;
import org.hibernate.service.ServiceRegistry;
import org.mdev.revolution.Revolution;
import org.mdev.revolution.utilities.jndi.XjbInitialContextFactory;
import org.mdev.revolution.utilities.jndi.XjbInitialContextFactoryBuilder;

import javax.inject.Inject;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.spi.InitialContextFactoryBuilder;
import java.sql.Connection;
import java.sql.SQLException;

@@ -49,7 +46,7 @@ public void initialize() {
//.applySetting(Environment.CONNECTION_PROVIDER, "com.zaxxer.hikari.hibernate.HikariConnectionProvider")
.applySetting(Environment.SESSION_FACTORY_NAME, dataSource.getDataSourceJNDI())
.applySetting(Environment.SESSION_FACTORY_NAME_IS_JNDI, "true")
.applySetting(Environment.TRANSACTION_COORDINATOR_STRATEGY, JtaTransactionCoordinatorBuilderImpl.class)
//.applySetting(Environment.TRANSACTION_COORDINATOR_STRATEGY, JtaTransactionCoordinatorBuilderImpl.class)
.applySetting(Environment.DIALECT, "org.hibernate.dialect." + (Revolution.getConfig().getString("mysql.dialect").equals("innodb") ? "MySQLInnoDBDialect" : "MySQLDialect"))
.applySetting(Environment.DATASOURCE, dataSource)
.build();
@@ -58,12 +55,19 @@ public void initialize() {

private void setupInitialContext() {
//"jdbc/default
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");

try {
XjbInitialContextFactory xjbInitialContextFactory = new XjbInitialContextFactory();
xjbInitialContextFactory.register("jdbc/default", dataSource);
}
catch(NamingException e) {
logger.error("Error while binding the Hikari DataSource to the JNDI Context", e);
final Context ctx = new InitialContext();
ctx.createSubcontext("java:");
ctx.createSubcontext("java:comp");
ctx.createSubcontext("java:comp/env");
ctx.createSubcontext("java:comp/env/jdbc");
ctx.bind("java:comp/env/jdbc/default", dataSource);
ctx.close();
} catch(NamingException e) {
logger.error("There was an error while trying to bind the DataSource to the context", e);
System.exit(0); // fatal error
}
}
@@ -13,6 +13,9 @@ public class Player implements Serializable {
@Column(name = "mail", unique = true, nullable = false)
private String email;

@Column(name = "username", unique = true, nullable = false)
private String username;

public Player() {
super();
}
@@ -24,5 +27,9 @@ public int getId() {
public String getEmail() {
return email;
}

public String getUsername() {
return username;
}
}

@@ -7,13 +7,18 @@
import org.mdev.revolution.Revolution;
import org.mdev.revolution.communication.encryption.ARC4;
import org.mdev.revolution.communication.packets.outgoing.ServerPacket;
import org.mdev.revolution.communication.packets.outgoing.inventory.achievements.AchievementsComposer;
import org.mdev.revolution.communication.packets.outgoing.inventory.achievements.AchievementsScoreComposer;
import org.mdev.revolution.communication.packets.outgoing.availability.AvailabilityStatusMessageComposer;
import org.mdev.revolution.communication.packets.outgoing.catalog.BuildersClubSubscriptionStatusMessageComposer;
import org.mdev.revolution.communication.packets.outgoing.handshake.AuthenticationOKComposer;
import org.mdev.revolution.communication.packets.outgoing.handshake.UserRightsMessageComposer;
import org.mdev.revolution.communication.packets.outgoing.inventory.avatareffect.AvatarEffectsMessageComposer;
import org.mdev.revolution.communication.packets.outgoing.moderation.CfhChatlogComposer;
import org.mdev.revolution.communication.packets.outgoing.navigator.NavigatorSettingsComposer;
import org.mdev.revolution.communication.packets.outgoing.notifications.HabboBroadcastMessageComposer;
import org.mdev.revolution.communication.packets.outgoing.notifications.MOTDNotificationComposer;
import org.mdev.revolution.communication.packets.outgoing.preferences.AccountPreferencesComposer;
import org.mdev.revolution.database.domain.Player;
import org.mdev.revolution.game.players.PlayerBean;
import org.mdev.revolution.game.players.PlayerService;
@@ -35,6 +40,10 @@ public ARC4 getRC4() {
return rc4;
}

public PlayerBean getPlayerBean() {
return playerBean;
}

public Session(Channel channel) {
this.channel = channel;
}
@@ -49,17 +58,24 @@ public boolean tryLogin(String ssoTicket) {
return false;
}

PlayerService.removeSSOTicket(player.getId());
//PlayerService.removeSSOTicket(player.getId());
PlayerService.getInstance().save(player);

playerBean = new PlayerBean(player);

sendQueued(new AuthenticationOKComposer())
.sendQueued(new AvailabilityStatusMessageComposer())
.sendQueued(new AvatarEffectsMessageComposer(null))
.sendQueued(new NavigatorSettingsComposer(0)) // HOMEROOM
.sendQueued(new UserRightsMessageComposer(true, true, false)) // CLUB, VIP, AMBASSADOR SETTINGS
.sendQueued(new AvatarEffectsMessageComposer(null))
.sendQueued(new MOTDNotificationComposer(Revolution.getConfig().getOrDefault("motd", DefaultConfig.motd)))
.sendQueued(new AvailabilityStatusMessageComposer())
.sendQueued(new AchievementsScoreComposer(0))
.sendQueued(new BuildersClubSubscriptionStatusMessageComposer())
.sendQueued(new CfhChatlogComposer())
.sendQueued(new AchievementsComposer())
.sendQueued(new AccountPreferencesComposer())
.getChannel().flush();

sendPacket(new MOTDNotificationComposer(Revolution.getConfig().getOrDefault("motd", DefaultConfig.motd)));
}
catch (Exception e) {
logger.error("Bug during user login.", e);

This file was deleted.

This file was deleted.

This file was deleted.

@@ -2,15 +2,14 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="org.mdev.revolution.jpa" transaction-type="JTA"> <!-- RESOURCE_LOCAL -->
<persistence-unit name="org.mdev.revolution.jpa" transaction-type="RESOURCE_LOCAL"> <!-- JTA -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:HikariDataSource</jta-data-source>
<jta-data-source>java:comp/env/jdbc/default</jta-data-source>
<class>org.mdev.revolution.database.domain.Player</class>
<properties>
<!-- Disable the second-level cache -->
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />

<!-- Important, Database Connection Provider -->
<!--<property name="hibernate.connection.provider_class"