diff --git a/nge.backup b/nge.backup index c8d2eac6..164ef16a 100644 --- a/nge.backup +++ b/nge.backup @@ -62,7 +62,8 @@ CREATE TABLE accounts ( id integer NOT NULL, "user" character varying(16) NOT NULL, pass character varying(34) NOT NULL, - email character varying(32) NOT NULL + email character varying(32) NOT NULL, + gmflag boolean ); diff --git a/ngengine_public.jar b/ngengine_public.jar index c1044759..5ebf1391 100644 Binary files a/ngengine_public.jar and b/ngengine_public.jar differ diff --git a/src/protocol/swg/LoginClusterStatus.java b/src/protocol/swg/LoginClusterStatus.java index 30028b44..725a8c8b 100644 --- a/src/protocol/swg/LoginClusterStatus.java +++ b/src/protocol/swg/LoginClusterStatus.java @@ -26,6 +26,8 @@ import java.util.TimeZone; import org.apache.mina.core.buffer.IoBuffer; +import engine.clients.Client; + public class LoginClusterStatus extends SWGMessage { private byte[] servers; @@ -46,7 +48,7 @@ public class LoginClusterStatus extends SWGMessage { result.flip(); return result; } - public void addServer(int galaxyID, String serverIP, int serverPort, int pingPort, int maxCharacters, int status, int recommended, int population) { + public void addServer(int galaxyID, String serverIP, int serverPort, int pingPort, int maxCharacters, int status, int recommended, int population, Client client) { IoBuffer result = IoBuffer.allocate(39 + serverIP.length()).order(ByteOrder.LITTLE_ENDIAN); int populationStatus = 0; @@ -64,6 +66,8 @@ public class LoginClusterStatus extends SWGMessage { populationStatus = 6; status = 3; } + if(status == 3 && client.isGM()) + status = 2; result.putInt(populationStatus); // 0 = very light, 1 = light, 2 = medium , 3 = heavy, 4 = very heavy, 5 = extremely heavy, 6 = full result.putInt(maxCharacters); //result.putInt(0xFFFF8F80); // Distance? diff --git a/src/resources/objects/player/PlayerMessageBuilder.java b/src/resources/objects/player/PlayerMessageBuilder.java index 4e0c61c3..52ee9080 100644 --- a/src/resources/objects/player/PlayerMessageBuilder.java +++ b/src/resources/objects/player/PlayerMessageBuilder.java @@ -156,10 +156,10 @@ public class PlayerMessageBuilder extends ObjectMessageBuilder { if(player.getXpList().isEmpty()) { buffer.putInt(0); - buffer.putInt(0); + buffer.putInt(player.getXpListUpdateCounter()); } else { buffer.putInt(player.getXpList().size()); - buffer.putInt(0); + buffer.putInt(player.getXpListUpdateCounter()); // no need for locking here, concurrent hash map iterator wont throw concurrency exceptions and multiple thread access at zone in is unlikely to occur for the PlayerObject for(Entry entry : player.getXpList().entrySet()) { diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index aee93138..9d265f47 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -328,7 +328,7 @@ public class CharacterService implements INetworkDispatch { CreateCharacterSuccess success = new CreateCharacterSuccess(object.getObjectID()); session.write(new HeartBeatMessage().serialize()); session.write(core.loginService.getLoginCluster().serialize()); - session.write(core.loginService.getLoginClusterStatus().serialize()); + session.write(core.loginService.getLoginClusterStatus(client).serialize()); session.write(success.serialize()); session.write((new ClientMfdStatusUpdateMessage((float) 2, "/GroundHUD.MFDStatus.vsp.role.targetLevel")).serialize()); diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java index a2f291ed..9acee192 100644 --- a/src/services/ConnectionService.java +++ b/src/services/ConnectionService.java @@ -94,6 +94,7 @@ public class ConnectionService implements INetworkDispatch { if (resultSet.next()) { client.setAccountId(resultSet.getLong("accountId")); client.setSessionKey(clientIdMsg.getSessionKey()); + client.setGM(core.loginService.checkForGmPermission((int) resultSet.getLong("accountId"))); AccountFeatureBits accountFeatureBits = new AccountFeatureBits(); ClientPermissionsMessage clientPermissionsMessage = new ClientPermissionsMessage(); session.write(new HeartBeatMessage().serialize()); diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 5343ecae..e02e5a6a 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -133,6 +133,7 @@ public class LoginService implements INetworkDispatch{ client.setAccountId(id); //client.setAccountEmail(email); client.setSession(session); + client.setGM(checkForGmPermission(id)); core.addClient((Integer)session.getAttribute("connectionId"), client); @@ -143,7 +144,7 @@ public class LoginService implements INetworkDispatch{ persistSession(client); LoginEnumCluster servers = getLoginCluster(); - LoginClusterStatus serverStatus = getLoginClusterStatus(); + LoginClusterStatus serverStatus = getLoginClusterStatus(client); EnumerateCharacterId characters = getEnumerateCharacterId(id); LoginClientToken clientToken = new LoginClientToken(client.getSessionKey(), id, user); @@ -205,6 +206,18 @@ public class LoginService implements INetworkDispatch{ } + public boolean checkForGmPermission(int id) { + PreparedStatement preparedStatement; + try { + preparedStatement = databaseConnection1.preparedStatement("SELECT * FROM characters WHERE \"accountId\"=" + id + ""); + ResultSet resultSet = preparedStatement.executeQuery(); + return resultSet.getBoolean("gmflag"); + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + /** * Saves session data to DB so Zone Server can link sessions to accounts. * @param client Client that needs a session save. @@ -287,7 +300,7 @@ public class LoginService implements INetworkDispatch{ * Generates LoginClusterStatus packet. * @return LoginClusterStatus packet. */ - public LoginClusterStatus getLoginClusterStatus() { + public LoginClusterStatus getLoginClusterStatus(Client client) { LoginClusterStatus clusterStatus = new LoginClusterStatus(); ResultSet resultSet; try { @@ -302,7 +315,8 @@ public class LoginService implements INetworkDispatch{ 100, resultSet.getInt("statusId"), 1, - core.getActiveZoneClients()); + core.getActiveZoneClients(), + client); } catch (SQLException e) { e.printStackTrace(); } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index a8bd62e8..47b9004c 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -126,14 +126,14 @@ public class SimulationService implements INetworkDispatch { core.commandService.registerCommand("sitserver"); core.commandService.registerCommand("kneel"); core.commandService.registerCommand("serverdestroyobject"); - core.commandService.registerCommand("giveitem"); - core.commandService.registerCommand("object"); + core.commandService.registerGmCommand("giveitem"); + core.commandService.registerGmCommand("object"); core.commandService.registerCommand("getattributesbatch"); core.commandService.registerCommand("pvp"); core.commandService.registerCommand("setcurrentskilltitle"); core.commandService.registerCommand("tip"); core.commandService.registerCommand("faction"); - core.commandService.registerCommand("setspeed"); + core.commandService.registerGmCommand("setspeed"); core.commandService.registerCommand("waypoint"); core.commandService.registerCommand("setwaypointactivestatus"); core.commandService.registerCommand("setwaypointname"); @@ -145,7 +145,7 @@ public class SimulationService implements INetworkDispatch { core.commandService.registerCommand("boardshuttle"); core.commandService.registerCommand("getplayerid"); core.commandService.registerCommand("inspire"); - core.commandService.registerCommand("setgodmode"); + core.commandService.registerGmCommand("setgodmode"); core.commandService.registerCommand("requestwaypointatposition"); core.commandService.registerCommand("meditate"); @@ -547,6 +547,7 @@ public class SimulationService implements INetworkDispatch { return; CreatureObject object = (CreatureObject) client.getParent(); + object.setClient(null); PlayerObject ghost = (PlayerObject) object.getSlottedObject("ghost"); if(object.getGroupId() != 0) @@ -590,11 +591,11 @@ public class SimulationService implements INetworkDispatch { // object.getContainer().remove(object); //} - core.objectService.destroyObject(object); object.createTransaction(core.getCreatureODB().getEnvironment()); core.getCreatureODB().put(object, Long.class, CreatureObject.class, object.getTransaction()); object.getTransaction().commitSync(); + core.objectService.destroyObject(object); core.getActiveConnectionsMap().remove((Integer) session.getAttribute("connectionId")); diff --git a/src/services/command/BaseSWGCommand.java b/src/services/command/BaseSWGCommand.java index d89c4455..2d727994 100644 --- a/src/services/command/BaseSWGCommand.java +++ b/src/services/command/BaseSWGCommand.java @@ -30,6 +30,7 @@ public class BaseSWGCommand implements Cloneable { private String clientEffectTarget; private int maxRangeToTarget; private int commandCRC; + private boolean isGmCommand = false; public BaseSWGCommand(String commandName) { setCommandName(commandName); @@ -80,4 +81,12 @@ public class BaseSWGCommand implements Cloneable { return super.clone(); } + public boolean isGmCommand() { + return isGmCommand; + } + + public void setGmCommand(boolean isGmCommand) { + this.isGmCommand = isGmCommand; + } + } diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index d02d5521..99e6f3f9 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -95,6 +95,9 @@ public class CommandService implements INetworkDispatch { System.out.println("NULL Object"); return; } + + if(command.isGmCommand() && !client.isGM()) + return; CreatureObject actor = (CreatureObject) client.getParent(); @@ -131,6 +134,15 @@ public class CommandService implements INetworkDispatch { } + public BaseSWGCommand registerGmCommand(String name) { + + BaseSWGCommand command = new BaseSWGCommand(name.toLowerCase()); + command.setGmCommand(true); + commandLookup.add(command); + return command; + + } + public void registerAlias(String name, String target) { Vector commands = new Vector(commandLookup); // copy for thread safety BaseSWGCommand targetCommand = null; diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 42726dde..49fc1106 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -501,7 +501,9 @@ public class ObjectService implements INetworkDispatch { } else { creature = (CreatureObject) getObject(objectId); - + if(creature.getClient() != null) + return; + } creature.setClient(client); @@ -770,7 +772,7 @@ public class ObjectService implements INetworkDispatch { object.setAttachment("bigSpawnRange", new Boolean(true)); core.simulationService.add(object, object.getPosition().x, object.getPosition().z); } else if(containerId != 0) { - object = createObject(template, 0, planet, new Point3D(px, py, pz), new Quaternion(qw, qx, qy, qz)); + object = createObject(template, objectId, planet, new Point3D(px, py, pz), new Quaternion(qw, qx, qy, qz)); if(containers.contains(containerId)) { object.setisInSnapshot(false); containers.add(objectId);