diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 4303f58a0..32728711f 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -137,6 +137,24 @@ public class ObjectManager extends Manager { } } + public SWGObject deleteObject(long objId) { + synchronized (objects) { + SWGObject obj = objects.remove(objId); + if (obj == null) + return null; + Location loc = obj.getLocation(); + if (loc != null && loc.getTerrain() != null) + quadTree.get(loc.getTerrain()).remove(loc.getX(), loc.getZ(), obj); + for (SWGObject child : obj.getChildren()) + if (child != null) + deleteObject(child.getObjectId()); + for (SWGObject slot : obj.getSlots().values()) + if (slot != null) + deleteObject(slot.getObjectId()); + return obj; + } + } + public SWGObject createObject(String template) { return createObject(template, null); } diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index 187ccb9d0..70c1f0892 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -1,5 +1,6 @@ package services.player; +import intents.GalacticIntent; import intents.LoginEventIntent; import intents.LoginEventIntent.LoginEvent; @@ -18,6 +19,8 @@ import network.packets.swg.ServerUnixEpochTime; import network.packets.swg.login.CharacterCreationDisabled; import network.packets.swg.login.EnumerateCharacterId; import network.packets.swg.login.EnumerateCharacterId.SWGCharacter; +import network.packets.swg.login.creation.DeleteCharacterRequest; +import network.packets.swg.login.creation.DeleteCharacterResponse; import network.packets.swg.login.LoginClientId; import network.packets.swg.login.LoginClientToken; import network.packets.swg.login.LoginClusterStatus; @@ -42,6 +45,7 @@ public class LoginService extends Service { private PreparedStatement getUser; private PreparedStatement getGalaxies; private PreparedStatement getCharacters; + private PreparedStatement deleteCharacter; private boolean autoLogin; public LoginService() { @@ -53,11 +57,12 @@ public class LoginService extends Service { getUser = getLocalDatabase().prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?"); getGalaxies = getLocalDatabase().prepareStatement("SELECT * FROM galaxies"); getCharacters = getLocalDatabase().prepareStatement("SELECT * FROM characters WHERE userid = ?"); + deleteCharacter = getLocalDatabase().prepareStatement("DELETE FROM CHARACTERS WHERE id = ?"); autoLogin = (getConfig(ConfigFile.PRIMARY).getInt("AUTO-LOGIN", 0) == 1 ? true : false); return super.initialize(); } - public void handlePacket(Player player, Packet p) { + public void handlePacket(GalacticIntent intent, Player player, Packet p) { if (p instanceof SessionRequest) { player.setConnectionId(((SessionRequest)p).getConnectionID()); player.setPlayerState(PlayerState.DISCONNECTED); @@ -65,6 +70,8 @@ public class LoginService extends Service { } if (p instanceof LoginClientId) handleLogin(player, (LoginClientId) p); + if (p instanceof DeleteCharacterRequest) + handleCharDeletion(intent, player, (DeleteCharacterRequest) p); } private void sendServerInfo(Player player) { @@ -75,6 +82,11 @@ public class LoginService extends Service { sendPacket(player.getNetworkId(), new ServerId(id)); } + private void handleCharDeletion(GalacticIntent intent, Player player, DeleteCharacterRequest request) { + intent.getObjectManager().deleteObject(request.getPlayerId()); + sendPacket(player, new DeleteCharacterResponse(deleteCharacter(request.getPlayerId()))); + } + private void handleLogin(Player player, LoginClientId id) { if (player.getPlayerState() != PlayerState.DISCONNECTED) { System.err.println("Player cannot login when " + player.getPlayerState()); @@ -209,4 +221,16 @@ public class LoginService extends Service { return characters.toArray(new SWGCharacter[characters.size()]); } + private boolean deleteCharacter(long id) { + synchronized (deleteCharacter) { + try { + deleteCharacter.setLong(1, id); + return deleteCharacter.executeUpdate() > 0; + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + } + } diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index c8dacb27b..aa5beab36 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -64,7 +64,7 @@ public class PlayerManager extends Manager { if (player != null) { player.updateLastPacketTimestamp(); if (type == ServerType.LOGIN) - loginService.handlePacket(player, packet); + loginService.handlePacket(gpi, player, packet); else if (type == ServerType.ZONE) zoneService.handlePacket(gpi, player, networkId, packet); }