diff --git a/ngengine_public.jar b/ngengine_public.jar index e77c59f5..ebf3d16a 100644 Binary files a/ngengine_public.jar and b/ngengine_public.jar differ diff --git a/src/main/NGECore.java b/src/main/NGECore.java index f796f811..8a68784c 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -112,6 +112,7 @@ public class NGECore { private Config config = null; private volatile boolean isShuttingDown = false; + private long galacticTime = System.currentTimeMillis(); private ConcurrentHashMap clients = new ConcurrentHashMap(); @@ -541,6 +542,11 @@ public class NGECore { } + + public long getGalacticTime() { + return System.currentTimeMillis() - galacticTime; + } + } diff --git a/src/resources/common/SpawnPoint.java b/src/resources/common/SpawnPoint.java index 2068dbb4..f0fac9af 100644 --- a/src/resources/common/SpawnPoint.java +++ b/src/resources/common/SpawnPoint.java @@ -21,6 +21,10 @@ ******************************************************************************/ package resources.common; +import java.util.Random; + +import main.NGECore; + import com.sleepycat.persist.model.Persistent; import engine.resources.scene.Point3D; @@ -79,5 +83,30 @@ public class SpawnPoint { public void setCellNumber(int cellNumber) { this.cellNumber = cellNumber; } + + public Point3D getRandomPosition(float minDistance, float maxDistance) { + + Random random = new Random(); + float distance = random.nextInt((int) (maxDistance - minDistance) + 1) + minDistance; + float angle = (float) (random.nextInt(360) * (Math.PI / 180)); + float x = (float) (position.x + distance * Math.cos(angle)); + float z = (float) (position.z + distance * Math.sin(angle)); + + return new Point3D(x, 0, z); + + } + + public static Point3D getRandomPosition(Point3D position, float minDistance, float maxDistance, int planetId) { + + Random random = new Random(); + float distance = random.nextInt((int) (maxDistance - minDistance) + 1) + minDistance; + float angle = (float) (random.nextInt(360) * (Math.PI / 180)); + float x = (float) (position.x + distance * Math.cos(angle)); + float z = (float) (position.z + distance * Math.sin(angle)); + + return new Point3D(x, NGECore.getInstance().terrainService.getHeight(planetId, x, z), z); + + } + } diff --git a/src/resources/objects/ObjectMessageBuilder.java b/src/resources/objects/ObjectMessageBuilder.java index b422edd9..4ae29461 100644 --- a/src/resources/objects/ObjectMessageBuilder.java +++ b/src/resources/objects/ObjectMessageBuilder.java @@ -63,7 +63,7 @@ public abstract class ObjectMessageBuilder { } public IoBuffer createDelta(String objectType, byte viewType, short updateCount, short updateType, IoBuffer data, int size) { - IoBuffer buffer = bufferPool.allocate(27 + size, false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = bufferPool.allocate(23 + size, false).order(ByteOrder.LITTLE_ENDIAN); buffer.putShort((short) 5); buffer.putInt(Opcodes.DeltasMessage); diff --git a/src/resources/objects/guild/GuildMessageBuilder.java b/src/resources/objects/guild/GuildMessageBuilder.java index 487a30dc..ade7d71d 100644 --- a/src/resources/objects/guild/GuildMessageBuilder.java +++ b/src/resources/objects/guild/GuildMessageBuilder.java @@ -77,6 +77,7 @@ public class GuildMessageBuilder extends ObjectMessageBuilder { for (Entry entry : guilds.getOtherServerGCWTotalPercentMap().entries()) capacity += (11 + entry.getKey().length() + entry.getValue().getBytes().length); IoBuffer buffer = bufferPool.allocate(capacity, false).order(ByteOrder.LITTLE_ENDIAN); + buffer.setAutoExpand(true); buffer.putShort((short) 9); // Object Count buffer.putInt(guilds.getServerId()); buffer.put(getAsciiString(guilds.getSTFFile())); diff --git a/src/resources/objects/player/PlayerMessageBuilder.java b/src/resources/objects/player/PlayerMessageBuilder.java index e727df21..29254766 100644 --- a/src/resources/objects/player/PlayerMessageBuilder.java +++ b/src/resources/objects/player/PlayerMessageBuilder.java @@ -597,7 +597,7 @@ public class PlayerMessageBuilder extends ObjectMessageBuilder { } public IoBuffer buildFlagBitmask(int bitmask) { - IoBuffer buffer = bufferPool.allocate(30, false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = bufferPool.allocate(20, false).order(ByteOrder.LITTLE_ENDIAN); buffer.putInt(4); buffer.putInt(bitmask); buffer.putInt(0); diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index f2b86ce9..15758b21 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -195,7 +195,7 @@ public class PlayerObject extends IntangibleObject { synchronized(objectMutex) { this.totalPlayTime = totalPlayTime; } - getContainer().notifyObservers(messageBuilder.buildTotalPlayTimeDelta(totalPlayTime), true); + notifyObservers(messageBuilder.buildTotalPlayTimeDelta(totalPlayTime), true); } public String getHome() { diff --git a/src/resources/objects/tangible/TangibleMessageBuilder.java b/src/resources/objects/tangible/TangibleMessageBuilder.java index 904a2574..720a366a 100644 --- a/src/resources/objects/tangible/TangibleMessageBuilder.java +++ b/src/resources/objects/tangible/TangibleMessageBuilder.java @@ -63,8 +63,8 @@ public class TangibleMessageBuilder extends ObjectMessageBuilder { buffer.putInt(0); buffer.putInt(0); - buffer.putInt(0); - //buffer.putInt(tangible.getOptionsBitmask()); + //buffer.putInt(0); + buffer.putInt(tangible.getOptionsBitmask()); buffer.putInt(0); // number of item uses buffer.putInt(tangible.getConditionDamage()); buffer.putInt(tangible.getMaxDamage()); diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 2b89cd36..a1fe700f 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -351,8 +351,8 @@ public class TangibleObject extends SWGObject { destination.getSession().write(messageBuilder.buildBaseline3()); destination.getSession().write(messageBuilder.buildBaseline6()); - destination.getSession().write(messageBuilder.buildBaseline8()); - destination.getSession().write(messageBuilder.buildBaseline9()); + //destination.getSession().write(messageBuilder.buildBaseline8()); + //destination.getSession().write(messageBuilder.buildBaseline9()); if(getPvPBitmask() != 0) { UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(getObjectID()); diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index c9fc5897..33e40de1 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -230,7 +230,7 @@ public class CharacterService implements INetworkDispatch { object.setCustomName(clientCreateCharacter.getName()); object.setHeight(clientCreateCharacter.getScale()); object.setPersistent(true); - object.setPosition(new Point3D(3528, 0, -4804)); + object.setPosition(SpawnPoint.getRandomPosition(new Point3D(3528, 0, -4804), (float) 0.5, 3, core.terrainService.getPlanetByName("tatooine").getID())); object.setCashCredits(100); object.setBankCredits(1000); object.setOptionsBitmask(Options.ATTACKABLE); diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java index 18ac17e1..584bf73d 100644 --- a/src/services/ConnectionService.java +++ b/src/services/ConnectionService.java @@ -217,9 +217,7 @@ public class ConnectionService implements INetworkDispatch { core.chatService.playerStatusChange(objectShortName, (byte) 0); } - - session.suspendWrite(); - + long parentId = object.getParentId(); if(object.getContainer() == null) { @@ -242,6 +240,7 @@ public class ConnectionService implements INetworkDispatch { ghost.toggleFlag(PlayerFlags.LD); object.setAttachment("disconnectTask", null); + object.setAttachment("buffWorkshop", null); object.createTransaction(core.getCreatureODB().getEnvironment()); core.getCreatureODB().put(object, Long.class, CreatureObject.class, object.getTransaction()); object.getTransaction().commitSync(); diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 8e47b430..5c861834 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -50,6 +50,7 @@ import resources.common.ObjControllerOpcodes; import resources.common.Opcodes; import resources.common.RGB; import resources.common.SpawnPoint; +import resources.datatables.PlayerFlags; import resources.objects.Buff; import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; @@ -85,34 +86,30 @@ public class PlayerService implements INetworkDispatch { public PlayerService(final NGECore core) { this.core = core; - scheduler.scheduleAtFixedRate(new Runnable() { - - @Override - public void run() { - ServerTimeMessage time = new ServerTimeMessage(System.currentTimeMillis() / 1000); - IoBuffer packet = time.serialize(); - synchronized(core.getActiveConnectionsMap()) { - for(Client c : core.getActiveConnectionsMap().values()) { - if(c.getParent() != null) { - c.getSession().write(packet); - } - } - } - } - - }, 0, 30, TimeUnit.SECONDS); } public void postZoneIn(final CreatureObject creature) { + scheduler.scheduleAtFixedRate(new Runnable() { + + @Override + public void run() { + ServerTimeMessage time = new ServerTimeMessage(core.getGalacticTime() / 1000); + IoBuffer packet = time.serialize(); + creature.getClient().getSession().write(packet); + } + + }, 0, 45, TimeUnit.SECONDS); + + scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost"); - player.setTotalPlayTime(player.getTotalPlayTime() + 30); + player.setTotalPlayTime((int) (player.getTotalPlayTime() + ((System.currentTimeMillis() - player.getLastPlayTimeUpdate()) / 1000))); player.setLastPlayTimeUpdate(System.currentTimeMillis()); core.collectionService.checkExplorationRegions(creature); @@ -148,6 +145,11 @@ public class PlayerService implements INetworkDispatch { }, 0, 1000, TimeUnit.MILLISECONDS); + PlayerObject ghost = (PlayerObject) creature.getSlottedObject("ghost"); + + if (ghost.isSet(PlayerFlags.LD)) { + ghost.toggleFlag(PlayerFlags.LD); + } } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index cd4d9f20..b3adb121 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -570,7 +570,9 @@ public class SimulationService implements INetworkDispatch { //session.suspendWrite(); - ghost.toggleFlag(PlayerFlags.LD); + + if(!ghost.isSet(PlayerFlags.LD)) + ghost.toggleFlag(PlayerFlags.LD); /* object.createTransaction(core.getCreatureODB().getEnvironment()); @@ -616,11 +618,7 @@ public class SimulationService implements INetworkDispatch { } PlayerObject ghost = (PlayerObject) object.getSlottedObject("ghost"); - - if (ghost.isSet(PlayerFlags.LD)) { - ghost.toggleFlag(PlayerFlags.LD); - } - + core.weatherService.sendWeather(object); if (!object.hasSkill(ghost.getProfessionWheelPosition())) { diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 6b2c608c..28160104 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -120,11 +120,8 @@ public class ObjectService implements INetworkDispatch { synchronized(objectList) { for(SWGObject obj : objectList.values()) { - if(obj.getSlottedObject("ghost") != null) { - CreatureObject creature = (CreatureObject) obj; - creature.setAttachment("disconnectTask", null); - creature.createTransaction(core.getCreatureODB().getEnvironment()); - core.getCreatureODB().put(creature, Long.class, CreatureObject.class, creature.getTransaction()); + if(obj.getClient() != null && obj.getClient().getSession() != null) { + core.connectionService.disconnect(obj.getClient().getSession()); } } @@ -597,7 +594,7 @@ public class ObjectService implements INetworkDispatch { core.buffService.clearBuffs(creature); - CmdStartScene startScene = new CmdStartScene((byte) 0, objectId, creature.getPlanet().getPath(), creature.getTemplate(), position.x, position.y, position.z, System.currentTimeMillis() / 1000, 0); + CmdStartScene startScene = new CmdStartScene((byte) 0, objectId, creature.getPlanet().getPath(), creature.getTemplate(), position.x, position.y, position.z, core.getGalacticTime(), 0); session.write(startScene.serialize()); ParametersMessage parameters = new ParametersMessage();