diff --git a/.classpath b/.classpath
index 6da71800..6ea45b44 100644
--- a/.classpath
+++ b/.classpath
@@ -1,7 +1,6 @@
-
@@ -31,5 +30,6 @@
+
diff --git a/ngengine_public.jar b/ngengine_public.jar
index 0811dbbf..53e5bc95 100644
Binary files a/ngengine_public.jar and b/ngengine_public.jar differ
diff --git a/scripts/commands/server.py b/scripts/commands/server.py
index 946087e3..0514fa98 100644
--- a/scripts/commands/server.py
+++ b/scripts/commands/server.py
@@ -33,5 +33,8 @@ def run(core, actor, target, commandString):
actor.sendSystemMessage(str(core.getActiveZoneClients()) + ' online characters.', 0)
if command == 'shutdown':
core.initiateShutdown()
+ if command == 'getheight':
+ actor.sendSystemMessage(str(core.terrainService.getHeight(actor.getPlanetId(), actor.getWorldPosition().x, actor.getWorldPosition().z)), 0)
+
return
diff --git a/scripts/mobiles/lairgroups/naboo_starter.py b/scripts/mobiles/lairgroups/naboo_starter.py
new file mode 100644
index 00000000..a046b63e
--- /dev/null
+++ b/scripts/mobiles/lairgroups/naboo_starter.py
@@ -0,0 +1,11 @@
+import sys
+from services.spawn import LairSpawnTemplate
+from java.util import Vector
+
+def addLairGroup(core):
+ spawnTemplate1 = LairSpawnTemplate(-1, 'naboo_chuba_lair_neutral_small', 5, 20)
+
+ spawnTemplates = Vector()
+ spawnTemplates.add(spawnTemplate1)
+
+ core.spawnService.addLairGroup('naboo_starter', spawnTemplates)
\ No newline at end of file
diff --git a/scripts/mobiles/lairs/naboo_chuba_lair_neutral_small.py b/scripts/mobiles/lairs/naboo_chuba_lair_neutral_small.py
new file mode 100644
index 00000000..ac408bdb
--- /dev/null
+++ b/scripts/mobiles/lairs/naboo_chuba_lair_neutral_small.py
@@ -0,0 +1,4 @@
+import sys
+
+def addTemplate(core):
+ core.spawnService.addLairTemplate('naboo_chuba_lair_neutral_small', 'chuba', 15, 'object/tangible/lair/base/shared_poi_all_lair_brambles_small.iff')
\ No newline at end of file
diff --git a/scripts/mobiles/naboo/chuba.py b/scripts/mobiles/naboo/chuba.py
new file mode 100644
index 00000000..c40d2421
--- /dev/null
+++ b/scripts/mobiles/naboo/chuba.py
@@ -0,0 +1,15 @@
+import sys
+from services.spawn import MobileTemplate
+from java.util import Vector
+
+def addTemplate(core):
+ mobileTemplate = MobileTemplate()
+ templates = Vector()
+ templates.add('object/mobile/shared_chuba_hue.iff')
+ mobileTemplate.setTemplates(templates)
+ mobileTemplate.setLevel(5)
+ attacks = Vector()
+ mobileTemplate.setDefaultAttack('creatureMeleeAttack')
+ mobileTemplate.setAttacks(attacks)
+ core.spawnService.addMobileTemplate('chuba', mobileTemplate)
+
\ No newline at end of file
diff --git a/scripts/mobiles/spawnareas/keren_lair.py b/scripts/mobiles/spawnareas/keren_lair.py
new file mode 100644
index 00000000..8723ee3f
--- /dev/null
+++ b/scripts/mobiles/spawnareas/keren_lair.py
@@ -0,0 +1,6 @@
+import sys
+
+def addSpawnArea(core):
+ core.spawnService.addLairSpawnArea('naboo_starter', 1685, 2620, 1360, 'naboo')
+
+
diff --git a/src/protocol/swg/AttributeListMessage.java b/src/protocol/swg/AttributeListMessage.java
index da681a16..ce9cf865 100644
--- a/src/protocol/swg/AttributeListMessage.java
+++ b/src/protocol/swg/AttributeListMessage.java
@@ -47,7 +47,7 @@ public class AttributeListMessage extends SWGMessage {
@Override
public IoBuffer serialize() {
- IoBuffer result = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
+ final IoBuffer result = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN);
result.setAutoExpand(true);
result.putShort((short) 5);
@@ -58,17 +58,16 @@ public class AttributeListMessage extends SWGMessage {
synchronized(target.getMutex()) {
result.putInt(target.getAttributes().size());
-
- for(Entry e : target.getAttributes().entrySet()) {
- result.put(getAsciiString(e.getKey()));
- result.put(getUnicodeString(e.getValue()));
- }
+ target.getAttributes().forEach((key, value) -> {
+ result.put(getAsciiString(key));
+ result.put(getUnicodeString(value));
+ });
}
result.putInt(0);
int size = result.position();
- result = bufferPool.allocate(size, false).put(result.array(), 0, size);
+ IoBuffer result2 = bufferPool.allocate(size, false).put(result.array(), 0, size);
- return result.flip();
+ return result2.flip();
}
diff --git a/src/resources/objects/SWGList.java b/src/resources/objects/SWGList.java
index ae185112..18206089 100644
--- a/src/resources/objects/SWGList.java
+++ b/src/resources/objects/SWGList.java
@@ -24,9 +24,15 @@ package resources.objects;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
+import java.util.Spliterator;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+import java.util.function.UnaryOperator;
+import java.util.stream.Stream;
import org.apache.mina.core.buffer.IoBuffer;
@@ -384,5 +390,46 @@ public class SWGList implements List {
messageBuilder.sendListDelta(viewType, updateType, buffer);
}
+
+ @Override
+ public boolean removeIf(Predicate super E> filter) {
+ return false;
+ }
+
+ @Override
+ public Stream stream() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Stream parallelStream() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void forEach(Consumer super E> action) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void replaceAll(UnaryOperator operator) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void sort(Comparator super E> c) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Spliterator spliterator() {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
diff --git a/src/resources/objects/SWGMap.java b/src/resources/objects/SWGMap.java
index 57e6e7a9..0227a725 100644
--- a/src/resources/objects/SWGMap.java
+++ b/src/resources/objects/SWGMap.java
@@ -29,6 +29,9 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.Map.Entry;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Function;
import org.apache.mina.core.buffer.IoBuffer;
@@ -255,5 +258,76 @@ public class SWGMap implements Map {
messageBuilder.sendListDelta(viewType, updateType, buffer);
}
+
+ @Override
+ public V getOrDefault(Object key, V defaultValue) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void forEach(BiConsumer super K, ? super V> action) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void replaceAll(
+ BiFunction super K, ? super V, ? extends V> function) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public V putIfAbsent(K key, V value) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean remove(Object key, Object value) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean replace(K key, V oldValue, V newValue) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public V replace(K key, V value) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public V computeIfAbsent(K key,
+ Function super K, ? extends V> mappingFunction) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public V computeIfPresent(K key,
+ BiFunction super K, ? super V, ? extends V> remappingFunction) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public V compute(K key,
+ BiFunction super K, ? super V, ? extends V> remappingFunction) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public V merge(K key, V value,
+ BiFunction super V, ? super V, ? extends V> remappingFunction) {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java
index 15d84777..68f59f6a 100644
--- a/src/resources/objects/building/BuildingObject.java
+++ b/src/resources/objects/building/BuildingObject.java
@@ -60,19 +60,10 @@ public class BuildingObject extends TangibleObject implements IPersistent {
final AtomicReference ref = new AtomicReference();
synchronized(objectMutex) {
-
- this.viewChildren(this, true, false, new Traverser() {
-
- @Override
- public void process(SWGObject obj) {
-
- if(obj instanceof CellObject && ((CellObject) obj).getCellNumber() == cellNumber)
- ref.set((CellObject) obj);
-
- }
-
+ this.viewChildren(this, true, false, (obj) -> {
+ if(obj instanceof CellObject && ((CellObject) obj).getCellNumber() == cellNumber)
+ ref.set((CellObject) obj);
});
-
}
return ref.get();
diff --git a/src/resources/objects/creature/CreatureMessageBuilder.java b/src/resources/objects/creature/CreatureMessageBuilder.java
index 1d7deeb0..8f7eb18a 100644
--- a/src/resources/objects/creature/CreatureMessageBuilder.java
+++ b/src/resources/objects/creature/CreatureMessageBuilder.java
@@ -196,7 +196,7 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder {
buffer.putInt(1);
}
}
- buffer.putInt(0); // unk
+ buffer.putInt(0); // xp bar value
int size = buffer.position();
buffer = bufferPool.allocate(size, false).put(buffer.array(), 0, size);
@@ -1157,6 +1157,16 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder {
return buffer;
}
+
+ public IoBuffer buildXPBarDelta(int xpBarValue) {
+ IoBuffer buffer = bufferPool.allocate(4, false).order(ByteOrder.LITTLE_ENDIAN);
+ buffer.putInt(xpBarValue);
+ int size = buffer.position();
+ buffer.flip();
+ buffer = createDelta("CREO", (byte) 4, (short) 1, (short) 0x0F, buffer, size + 4);
+ return buffer;
+ }
+
@Override
public void sendBaselines() {
diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java
index 56239f1c..6382356a 100644
--- a/src/resources/objects/creature/CreatureObject.java
+++ b/src/resources/objects/creature/CreatureObject.java
@@ -56,7 +56,7 @@ import engine.resources.scene.Quaternion;
import resources.objects.tangible.TangibleObject;
import resources.objects.weapon.WeaponObject;
-@Entity(version=0)
+@Entity(version=2)
public class CreatureObject extends TangibleObject implements IPersistent {
@NotPersistent
@@ -94,6 +94,7 @@ public class CreatureObject extends TangibleObject implements IPersistent {
private float waterModPercent = (float) 0.75;
private SWGList abilities;
private int abilitiesUpdateCounter = 0;
+ private int xpBarValue = 0;
private SWGList missionCriticalObjects;
@NotPersistent
@@ -125,6 +126,7 @@ public class CreatureObject extends TangibleObject implements IPersistent {
private boolean groupDance = true;
private CreatureObject performanceWatchee;
private CreatureObject performanceListenee;
+ @NotPersistent
private SWGList performanceAudience = new SWGList();
private int health = 1000;
private int action = 300;
@@ -1617,5 +1619,18 @@ public class CreatureObject extends TangibleObject implements IPersistent {
this.appearanceEquipmentListUpdateCounter = appearanceEquipmentListUpdateCounter;
}
}
+
+ public int getXpBarValue() {
+ synchronized(objectMutex) {
+ return xpBarValue;
+ }
+ }
+
+ public void setXpBarValue(int xpBarValue) {
+ synchronized(objectMutex) {
+ this.xpBarValue = xpBarValue;
+ }
+ getClient().getSession().write(messageBuilder.buildXPBarDelta(xpBarValue));
+ }
}
diff --git a/src/resources/objects/group/GroupObject.java b/src/resources/objects/group/GroupObject.java
index ec9b215c..b6a75e68 100644
--- a/src/resources/objects/group/GroupObject.java
+++ b/src/resources/objects/group/GroupObject.java
@@ -41,7 +41,7 @@ public class GroupObject extends UniverseObject {
private GroupMessageBuilder messageBuilder;
public GroupObject(long objectId) {
- super(objectId, null, new Point3D(0, 0, 0), new Quaternion(0, 0, 0, 1), "object/group/shared_group_object.iff");
+ super(objectId, null, new Point3D(0, 0, 0), new Quaternion(1, 0, 0, 0), "object/group/shared_group_object.iff");
messageBuilder = new GroupMessageBuilder(this);
}
diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java
index ae29a905..1e47aeaf 100644
--- a/src/resources/objects/player/PlayerObject.java
+++ b/src/resources/objects/player/PlayerObject.java
@@ -31,6 +31,7 @@ import java.util.TreeMap;
import resources.common.Console;
import resources.objects.intangible.IntangibleObject;
import resources.objects.waypoint.WaypointObject;
+import resources.objects.creature.CreatureObject;
import com.sleepycat.persist.model.NotPersistent;
import com.sleepycat.persist.model.Persistent;
@@ -238,7 +239,9 @@ public class PlayerObject extends IntangibleObject {
if (getContainer() != null && getContainer().getClient() != null && getContainer().getClient().getSession() != null) {
getContainer().getClient().getSession().write(messageBuilder.buildXPListDelta(type, amount, xpExists));
+ ((CreatureObject) getContainer()).setXpBarValue(amount);
}
+
}
public int getXpListUpdateCounter() {
diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java
index 934efd58..9da42193 100644
--- a/src/services/ConnectionService.java
+++ b/src/services/ConnectionService.java
@@ -226,23 +226,23 @@ public class ConnectionService implements INetworkDispatch {
long parentId = object.getParentId();
- if(object.getContainer() == null) {
+ /*if(object.getContainer() == null) {
boolean remove = core.simulationService.remove(object, object.getPosition().x, object.getPosition().z);
if(remove)
System.out.println("Successful quadtree remove");
} else {
object.getContainer()._remove(object);
object.setParentId(parentId);
- }
+ }*/
- HashSet oldObservers = new HashSet(object.getObservers());
+ /*HashSet oldObservers = new HashSet(object.getObservers());
for(Iterator it = oldObservers.iterator(); it.hasNext();) {
Client observerClient = it.next();
if(observerClient.getParent() != null && !(observerClient.getSession() == session)) {
observerClient.getParent().makeUnaware(object);
}
- }
+ }*/
ghost.toggleFlag(PlayerFlags.LD);
object.setAttachment("disconnectTask", null);
diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java
index 04ff8f72..55a4b617 100644
--- a/src/services/PlayerService.java
+++ b/src/services/PlayerService.java
@@ -33,6 +33,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
@@ -99,63 +100,35 @@ public class PlayerService implements INetworkDispatch {
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);
- }
-
+ scheduler.scheduleAtFixedRate(() -> {
+ ServerTimeMessage time = new ServerTimeMessage(core.getGalacticTime() / 1000);
+ IoBuffer packet = time.serialize();
+ creature.getClient().getSession().write(packet);
}, 45, 45, TimeUnit.SECONDS);
-
- scheduler.scheduleAtFixedRate(new Runnable() {
-
- @Override
- public void run() {
-
- PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost");
- player.setTotalPlayTime((int) (player.getTotalPlayTime() + ((System.currentTimeMillis() - player.getLastPlayTimeUpdate()) / 1000)));
- player.setLastPlayTimeUpdate(System.currentTimeMillis());
- core.collectionService.checkExplorationRegions(creature);
-
- }
-
+ scheduler.scheduleAtFixedRate(() -> {
+ PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost");
+ player.setTotalPlayTime((int) (player.getTotalPlayTime() + ((System.currentTimeMillis() - player.getLastPlayTimeUpdate()) / 1000)));
+ player.setLastPlayTimeUpdate(System.currentTimeMillis());
+ core.collectionService.checkExplorationRegions(creature);
}, 30, 30, TimeUnit.SECONDS);
- scheduler.scheduleAtFixedRate(new Runnable() {
-
- @Override
- public void run() {
-
- synchronized(creature.getMutex()) {
- if(creature.getAction() < creature.getMaxAction() && creature.getPosture() != 14) {
- if(creature.getCombatFlag() == 0)
- creature.setAction(creature.getAction() + (15 + creature.getLevel() * 5));
- else
- creature.setAction(creature.getAction() + ((15 + creature.getLevel() * 5) / 2));
-
- }
+ scheduler.scheduleAtFixedRate(() -> {
+ synchronized(creature.getMutex()) {
+ if(creature.getAction() < creature.getMaxAction() && creature.getPosture() != 14) {
+ if(creature.getCombatFlag() == 0)
+ creature.setAction(creature.getAction() + (15 + creature.getLevel() * 5));
+ else
+ creature.setAction(creature.getAction() + ((15 + creature.getLevel() * 5) / 2));
}
}
-
}, 0, 1000, TimeUnit.MILLISECONDS);
-
- scheduler.scheduleAtFixedRate(new Runnable() {
-
- @Override
- public void run() {
-
- synchronized(creature.getMutex()) {
- if(creature.getHealth() < creature.getMaxHealth() && creature.getCombatFlag() == 0 && creature.getPosture() != 13 && creature.getPosture() != 14)
- creature.setHealth(creature.getHealth() + (36 + creature.getLevel() * 4));
- }
-
+ scheduler.scheduleAtFixedRate(() -> {
+ synchronized(creature.getMutex()) {
+ if(creature.getHealth() < creature.getMaxHealth() && creature.getCombatFlag() == 0 && creature.getPosture() != 13 && creature.getPosture() != 14)
+ creature.setHealth(creature.getHealth() + (36 + creature.getLevel() * 4));
}
-
}, 0, 1000, TimeUnit.MILLISECONDS);
/*final PlayerObject ghost = (PlayerObject) creature.getSlottedObject("ghost");
@@ -176,242 +149,178 @@ public class PlayerService implements INetworkDispatch {
@Override
public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) {
- objControllerOpcodes.put(ObjControllerOpcodes.ChangeRoleIconChoice, new INetworkRemoteEvent() {
+ objControllerOpcodes.put(ObjControllerOpcodes.ChangeRoleIconChoice, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer data) throws Exception {
- Client c = core.getClient(session);
- ChangeRoleIconChoice packet = new ChangeRoleIconChoice();
- PlayerObject player;
- SWGObject o;
-
- packet.deserialize(data);
- o = core.objectService.getObject(packet.getObjectId());
-
- if (c.getParent() == null || o == null || c.getParent() != o
- || !(o instanceof CreatureObject) || !(o.getSlottedObject("ghost")
- instanceof PlayerObject)) {
- return;
- }
-
- player = (PlayerObject) o.getSlottedObject("ghost");
-
- player.setProfessionIcon(packet.getIcon());
+ Client c = core.getClient(session);
+ ChangeRoleIconChoice packet = new ChangeRoleIconChoice();
+ PlayerObject player;
+ SWGObject o;
+
+ packet.deserialize(data);
+ o = core.objectService.getObject(packet.getObjectId());
+
+ if (c.getParent() == null || o == null || c.getParent() != o
+ || !(o instanceof CreatureObject) || !(o.getSlottedObject("ghost")
+ instanceof PlayerObject)) {
+ return;
}
+ player = (PlayerObject) o.getSlottedObject("ghost");
+
+ player.setProfessionIcon(packet.getIcon());
+
});
- swgOpcodes.put(Opcodes.SetWaypointColor, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.SetWaypointColor, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer data) throws Exception {
- data.order(ByteOrder.LITTLE_ENDIAN);
-
- Client client = core.getClient(session);
-
- if (client == null)
- return;
-
- SWGObject player = client.getParent();
-
- if (player == null)
- return;
-
- PlayerObject ghost = (PlayerObject) player.getSlottedObject("ghost");
-
- if (ghost == null)
- return;
-
- SetWaypointColor packet = new SetWaypointColor();
- packet.deserialize(data);
-
- WaypointObject packetWay = (WaypointObject) core.objectService.getObject(packet.getObjectId());
- WaypointObject obj = (WaypointObject) ghost.getWaypointFromList(packetWay);
-
- if (obj == null || packetWay != obj)
- return;
-
- String color = packet.getColor();
- switch(color) {
- case "purple":
- obj.setColor(WaypointObject.PURPLE);
- break;
- case "green":
- obj.setColor(WaypointObject.GREEN);
- break;
- case "blue":
- obj.setColor(WaypointObject.BLUE);
- break;
- case "yellow":
- obj.setColor(WaypointObject.YELLOW);
- break;
- case "white":
- obj.setColor(WaypointObject.WHITE);
- break;
- case "orange":
- obj.setColor(WaypointObject.ORANGE);
- break;
- }
-
- ghost.waypointUpdate(obj);
-
+ data.order(ByteOrder.LITTLE_ENDIAN);
+
+ Client client = core.getClient(session);
+
+ if (client == null)
+ return;
+
+ SWGObject player = client.getParent();
+
+ if (player == null)
+ return;
+
+ PlayerObject ghost = (PlayerObject) player.getSlottedObject("ghost");
+
+ if (ghost == null)
+ return;
+
+ SetWaypointColor packet = new SetWaypointColor();
+ packet.deserialize(data);
+
+ WaypointObject packetWay = (WaypointObject) core.objectService.getObject(packet.getObjectId());
+ WaypointObject obj = (WaypointObject) ghost.getWaypointFromList(packetWay);
+
+ if (obj == null || packetWay != obj)
+ return;
+
+ String color = packet.getColor();
+ switch(color) {
+ case "purple":
+ obj.setColor(WaypointObject.PURPLE);
+ break;
+ case "green":
+ obj.setColor(WaypointObject.GREEN);
+ break;
+ case "blue":
+ obj.setColor(WaypointObject.BLUE);
+ break;
+ case "yellow":
+ obj.setColor(WaypointObject.YELLOW);
+ break;
+ case "white":
+ obj.setColor(WaypointObject.WHITE);
+ break;
+ case "orange":
+ obj.setColor(WaypointObject.ORANGE);
+ break;
}
+ ghost.waypointUpdate(obj);
+
});
- swgOpcodes.put(Opcodes.GuildRequestMessage, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.GuildRequestMessage, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer data) throws Exception {
- data.order(ByteOrder.LITTLE_ENDIAN);
-
- Client client = core.getClient(session);
-
- if (client == null)
- return;
-
- SWGObject player = client.getParent();
-
- if (player == null)
- return;
-
- GuildRequestMessage request = new GuildRequestMessage();
- request.deserialize(data);
-
- CreatureObject targetPlayer = (CreatureObject) core.objectService.getObject(request.getCharacterId());
-
- if (targetPlayer.getGuildId() != 0) {
- Guild targetGuild = core.guildService.getGuildById(targetPlayer.getGuildId());
- GuildResponseMessage response = new GuildResponseMessage(request.getCharacterId(), targetGuild.getName());
- client.getSession().write(response.serialize());
- } else {
- GuildResponseMessage response = new GuildResponseMessage(request.getCharacterId(), "None");
- client.getSession().write(response.serialize());
- }
+ data.order(ByteOrder.LITTLE_ENDIAN);
+
+ Client client = core.getClient(session);
+
+ if (client == null)
+ return;
+
+ SWGObject player = client.getParent();
+
+ if (player == null)
+ return;
+
+ GuildRequestMessage request = new GuildRequestMessage();
+ request.deserialize(data);
+
+ CreatureObject targetPlayer = (CreatureObject) core.objectService.getObject(request.getCharacterId());
+
+ if (targetPlayer.getGuildId() != 0) {
+ Guild targetGuild = core.guildService.getGuildById(targetPlayer.getGuildId());
+ GuildResponseMessage response = new GuildResponseMessage(request.getCharacterId(), targetGuild.getName());
+ client.getSession().write(response.serialize());
+ } else {
+ GuildResponseMessage response = new GuildResponseMessage(request.getCharacterId(), "None");
+ client.getSession().write(response.serialize());
}
+
+ });
+
+ swgOpcodes.put(Opcodes.PlayerMoneyRequest, (session, data) -> {
+
+ Client client = core.getClient(session);
+
+ if (client == null)
+ return;
+
+ SWGObject player = client.getParent();
+
+ if (player == null)
+ return;
+
+ CreatureObject creature = (CreatureObject) player;
+
+ if (creature == null)
+ return;
+
+ PlayerMoneyResponse response = new PlayerMoneyResponse(creature.getCashCredits(), creature.getBankCredits());
+ session.write(response.serialize());
+
+ PlayerObject ghost = (PlayerObject) player.getSlottedObject("ghost");
+ if (ghost == null)
+ return;
+
+ CharacterSheetResponseMessage msg = new CharacterSheetResponseMessage(ghost);
+ session.write(msg.serialize());
+
+ });
+
+ swgOpcodes.put(Opcodes.GetSpecificMapLocationsMessage, (session, data) -> {
});
- swgOpcodes.put(Opcodes.PlayerMoneyRequest, new INetworkRemoteEvent() {
-
- @Override
- public void handlePacket(IoSession session, IoBuffer data) throws Exception {
-
- Client client = core.getClient(session);
-
- if (client == null)
- return;
-
- SWGObject player = client.getParent();
-
- if (player == null)
- return;
-
- CreatureObject creature = (CreatureObject) player;
-
- if (creature == null)
- return;
-
- PlayerMoneyResponse response = new PlayerMoneyResponse(creature.getCashCredits(), creature.getBankCredits());
- session.write(response.serialize());
-
- PlayerObject ghost = (PlayerObject) player.getSlottedObject("ghost");
- if (ghost == null)
- return;
-
- CharacterSheetResponseMessage msg = new CharacterSheetResponseMessage(ghost);
- session.write(msg.serialize());
- }
-
- });
- swgOpcodes.put(Opcodes.GetSpecificMapLocationsMessage, new INetworkRemoteEvent() {
-
- @Override
- public void handlePacket(IoSession session, IoBuffer data) throws Exception {
-
- }
+ swgOpcodes.put(Opcodes.SetCombatSpamFilter, (session, data) -> {
});
- swgOpcodes.put(Opcodes.SetCombatSpamFilter, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.SetCombatSpamRangeFilter, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
});
- swgOpcodes.put(Opcodes.SetCombatSpamRangeFilter, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.SetLfgInterests, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
});
- swgOpcodes.put(Opcodes.SetLfgInterests, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.CommodotiesItemTypeListRequest, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
});
- swgOpcodes.put(Opcodes.CommodotiesItemTypeListRequest, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.SetFurnitureRoationDegree, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
});
- swgOpcodes.put(Opcodes.SetFurnitureRoationDegree, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.CommoditiesResourceTypeListRequest, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
});
- swgOpcodes.put(Opcodes.CommoditiesResourceTypeListRequest, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.CollectionServerFirstListRequest, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
});
- swgOpcodes.put(Opcodes.CollectionServerFirstListRequest, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.Unknown, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
});
- swgOpcodes.put(Opcodes.Unknown, new INetworkRemoteEvent() {
+ swgOpcodes.put(Opcodes.CmdSceneReady, (session, data) -> {
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
- }
-
- });
-
- swgOpcodes.put(Opcodes.CmdSceneReady, new INetworkRemoteEvent() {
-
- @Override
- public void handlePacket(IoSession session, IoBuffer buffer) throws Exception {
-
-
- }
-
});
/*swgOpcodes.put(Opcodes.ExpertiseRequestMessage, new INetworkRemoteEvent() {
@@ -472,47 +381,36 @@ public class PlayerService implements INetworkDispatch {
if(preDesignatedCloner != null)
cloneData.put(preDesignatedCloner.getObjectID(), core.mapService.getClosestCityName(preDesignatedCloner) /*+ " (" + String.valueOf(position.getDistance2D(cloner.getPosition())) + "m)"*/);
}
-
- for(SWGObject cloner : cloners) {
-
- if(cloner != preDesignatedCloner)
- cloneData.put(cloner.getObjectID(), core.mapService.getClosestCityName(cloner) /*+ " (" + String.valueOf(position.getDistance2D(cloner.getPosition())) + "m)"*/);
-
- }
+ final long preDesignatedObjectId = preDesignatedCloner.getObjectID();
+ cloners.stream().filter(c -> c.getObjectID() != preDesignatedObjectId).forEach(c -> cloneData.put(c.getObjectID(), core.mapService.getClosestCityName(c)));
final SUIWindow window = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@base_player:revive_title", "Select the desired option and click OK.",
cloneData, creature, null, 0);
Vector returnList = new Vector();
returnList.add("List.lstList:SelectedRow");
- window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() {
-
- @SuppressWarnings("unchecked")
- @Override
- public void process(SWGObject owner, int eventType, Vector returnList) {
+ window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, (owner, eventType, resultList) -> {
- // if(((CreatureObject)owner).getPosture() != 14)
- // return;
-
- int index = Integer.parseInt(returnList.get(0));
-
- if(window.getObjectIdByIndex(index) == 0 || core.objectService.getObject(window.getObjectIdByIndex(index)) == null)
- return;
-
-
- SWGObject cloner = core.objectService.getObject(window.getObjectIdByIndex(index));
-
- if(cloner.getAttachment("spawnPoints") == null)
- return;
-
- Vector spawnPoints = (Vector) cloner.getAttachment("spawnPoints");
-
- SpawnPoint spawnPoint = spawnPoints.get(new Random().nextInt(spawnPoints.size()));
-
- handleCloneRequest((CreatureObject) owner, (BuildingObject) cloner, spawnPoint, pvpDeath);
-
- }
+ if(((CreatureObject)owner).getPosture() != 14)
+ return;
+
+ int index = Integer.parseInt(resultList.get(0));
+ if(window.getObjectIdByIndex(index) == 0 || core.objectService.getObject(window.getObjectIdByIndex(index)) == null)
+ return;
+
+
+ SWGObject cloner = core.objectService.getObject(window.getObjectIdByIndex(index));
+
+ if(cloner.getAttachment("spawnPoints") == null)
+ return;
+
+ Vector spawnPoints = (Vector) cloner.getAttachment("spawnPoints");
+
+ SpawnPoint spawnPoint = spawnPoints.get(new Random().nextInt(spawnPoints.size()));
+
+ handleCloneRequest((CreatureObject) owner, (BuildingObject) cloner, spawnPoint, pvpDeath);
+
});
core.suiService.openSUIWindow(window);
@@ -537,12 +435,7 @@ public class PlayerService implements INetworkDispatch {
if(pvpDeath) {
List buffs = new ArrayList(creature.getBuffList().get());
-
- for(Buff buff : buffs) {
- if(buff.isDecayOnPvPDeath())
- buff.incDecayCounter();
- }
-
+ buffs.stream().filter(Buff::isDecayOnPvPDeath).forEach(Buff::incDecayCounter);
creature.updateAllBuffs();
}
diff --git a/src/services/TerrainService.java b/src/services/TerrainService.java
index bb68f4b7..81f92a2f 100644
--- a/src/services/TerrainService.java
+++ b/src/services/TerrainService.java
@@ -226,7 +226,8 @@ public class TerrainService {
// wait for threads to finish loading
for(Planet planet : planets) {
try {
- threadMap.get(planet).join();
+ if(threadMap.get(planet) != null)
+ threadMap.get(planet).join();
} catch (InterruptedException e) {
e.printStackTrace();
}
diff --git a/src/services/ai/AIActor.java b/src/services/ai/AIActor.java
index 6fd3eb29..081911cd 100644
--- a/src/services/ai/AIActor.java
+++ b/src/services/ai/AIActor.java
@@ -104,13 +104,7 @@ public class AIActor {
public CreatureObject getHighestDamageDealer() {
CreatureObject highestDamageDealer = null;
- int highestDamage = 0;
- for(Entry e : damageMap.entrySet()) {
- if(e.getValue() > highestDamage && highestDamage > 0) {
- highestDamage = e.getValue();
- highestDamageDealer = e.getKey();
- }
- }
+ highestDamageDealer = damageMap.keySet().stream().max((c1, c2) -> damageMap.get(c1) - damageMap.get(c2)).orElse(null);
// return first defender if no damage has been dealt
if(highestDamageDealer == null) {
for(TangibleObject tangible : creature.getDefendersList().toArray(new TangibleObject[]{})) {
@@ -159,26 +153,11 @@ public class AIActor {
}
public void scheduleMovement() {
- scheduler.schedule(new Runnable() {
-
- @Override
- public void run() {
- doStateAction(currentState.move(AIActor.this));
- }
-
- }, 500, TimeUnit.MILLISECONDS);
+ scheduler.schedule(() -> doStateAction(currentState.move(AIActor.this)), 500, TimeUnit.MILLISECONDS);
}
public void scheduleRecovery() {
- scheduler.schedule(new Runnable() {
-
- @Override
- public void run() {
- doStateAction(currentState.recover(AIActor.this));
- }
-
- }, 2000, TimeUnit.MILLISECONDS);
-
+ scheduler.schedule(() -> doStateAction(currentState.recover(AIActor.this)), 2000, TimeUnit.MILLISECONDS);
}
public void setNextPosition(Point3D position) {
diff --git a/src/services/ai/AIService.java b/src/services/ai/AIService.java
index 7a97015d..76e46d69 100644
--- a/src/services/ai/AIService.java
+++ b/src/services/ai/AIService.java
@@ -21,11 +21,15 @@
******************************************************************************/
package services.ai;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.Random;
import java.util.Vector;
import resources.objects.cell.CellObject;
import resources.objects.creature.CreatureObject;
+import resources.objects.group.GroupObject;
+import resources.objects.player.PlayerObject;
import engine.resources.scene.Planet;
import engine.resources.scene.Point3D;
@@ -54,5 +58,57 @@ public class AIService {
path.add(endPoint);
return path;
}
+
+ public void awardExperience(AIActor actor) {
+
+ Map damageMap = actor.getDamageMap();
+ CreatureObject creature = actor.getCreature();
+ int baseXP = getBaseXP(creature);
+ for(Entry e : damageMap.entrySet()) {
+
+ CreatureObject player = e.getKey();
+ PlayerObject ghost = (PlayerObject) player.getSlottedObject("ghost");
+ if(ghost == null)
+ continue;
+ int damage = e.getValue();
+
+ short level = (player.getGroupId() == 0) ? player.getLevel() : ((GroupObject) core.objectService.getObject(player.getGroupId())).getGroupLevel();
+ int levelDifference = ((creature.getLevel() >= level) ? 0 : (level - creature.getLevel()));
+ float damagePercent = damage / creature.getMaxHealth();
+ int finalXP = (int) (damagePercent * baseXP);
+ finalXP -= ((levelDifference > 20) ? (finalXP - 1) : (((levelDifference * 5) / 100) * finalXP));
+
+ }
+
+ }
+
+ public int getBaseXP(CreatureObject creature) {
+
+ int difficulty = creature.getDifficulty();
+ int baseXP = 60;
+ for (int i = 2; i <= creature.getLevel(); i++) {
+
+ if(i < 25)
+ baseXP += 3;
+ else if(i < 50)
+ baseXP += 4;
+ else if(i < 75)
+ baseXP += 5;
+ else if(i < 100)
+ baseXP += 6;
+ else
+ baseXP += 7;
+
+ }
+
+ if(difficulty == 1) {
+ baseXP += (6 + ((creature.getLevel() - 1) / 10) * 3);
+ } else if(difficulty == 2) {
+ baseXP += (20 + (creature.getLevel() - 1));
+ }
+
+ return baseXP;
+
+ }
}
diff --git a/src/services/ai/states/AttackState.java b/src/services/ai/states/AttackState.java
index 96baf032..193699ad 100644
--- a/src/services/ai/states/AttackState.java
+++ b/src/services/ai/states/AttackState.java
@@ -57,7 +57,7 @@ public class AttackState extends AIState {
return StateResult.DEAD;
actor.getMovementPoints().clear();
if(actor.getFollowObject() != null) {
- if(actor.getSpawnPosition().getWorldPosition().getDistance(creature.getWorldPosition()) > 128 || NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), actor.getFollowObject().getWorldPosition())) {
+ if(/*actor.getSpawnPosition().getWorldPosition().getDistance(creature.getWorldPosition()) > 128 ||*/ NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), actor.getFollowObject().getWorldPosition())) {
actor.removeDefender(actor.getFollowObject());
//actor.scheduleMovement();
return StateResult.UNFINISHED;
@@ -110,7 +110,7 @@ public class AttackState extends AIState {
actor.scheduleRecovery();
return StateResult.UNFINISHED;
}
- if(target.getWorldPosition().getDistance(creature.getWorldPosition()) > 128 || target.getPosture() == 13 || target.getPosture() == 14) {
+ if(/*target.getWorldPosition().getDistance(creature.getWorldPosition()) > 128 ||*/ target.getPosture() == 13 || target.getPosture() == 14) {
actor.removeDefender(target);
actor.scheduleRecovery();
return StateResult.UNFINISHED;
diff --git a/src/services/gcw/GCWService.java b/src/services/gcw/GCWService.java
index 15a392cc..73d06d36 100644
--- a/src/services/gcw/GCWService.java
+++ b/src/services/gcw/GCWService.java
@@ -377,7 +377,7 @@ public class GCWService implements INetworkDispatch {
}
Iterator it = flagged.iterator();
-
+
while(it.hasNext()) {
SWGObject obj = it.next();
if (((CreatureObject) obj).getFactionStatus() != 2) {
diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java
index 6771397a..1e66cdeb 100644
--- a/src/services/object/ObjectService.java
+++ b/src/services/object/ObjectService.java
@@ -412,7 +412,13 @@ public class ObjectService implements INetworkDispatch {
}
});
objectList.remove(object.getObjectID());
- core.simulationService.remove(object, object.getPosition().x, object.getPosition().y);
+ if(object.getContainer() != null) {
+ long parentId = object.getParentId();
+ object.getContainer()._remove(object);
+ object.setParentId(parentId);
+ } else {
+ core.simulationService.remove(object, object.getWorldPosition().x, object.getWorldPosition().z, true);
+ }
}
@@ -468,28 +474,30 @@ public class ObjectService implements INetworkDispatch {
return objectID;*/
- long newId;
-
- synchronized(objectMutex) {
- newId = highestId.incrementAndGet();
- }
-
- PreparedStatement ps2;
-
- try {
- ps2 = databaseConnection.preparedStatement("UPDATE highestid SET id=" + newId + " WHERE id=" + (newId-1));
- ps2.executeUpdate();
- ps2.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- if(getObject(newId) == null /*&& getCreatureFromDB(newId) == null*/ && !core.getObjectIdODB().contains(newId, Long.class, ObjectId.class))
- return newId;
- else {
- System.out.println("Object ID already exists: " + newId);
- return generateObjectID();
+ long newId = 0;
+ boolean found = false;
+ // stack overflow when using recursion
+ while(!found) {
+ synchronized(objectMutex) {
+ newId = highestId.incrementAndGet();
+ }
+
+ PreparedStatement ps2;
+
+ try {
+ ps2 = databaseConnection.preparedStatement("UPDATE highestid SET id=" + newId + " WHERE id=" + (newId-1));
+ ps2.executeUpdate();
+ ps2.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ if(getObject(newId) != null || core.getObjectIdODB().contains(newId, Long.class, ObjectId.class))
+ found = false;
+ else
+ found = true;
}
+ return newId;
}