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 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 action) { + // TODO Auto-generated method stub + + } + + @Override + public void replaceAll(UnaryOperator operator) { + // TODO Auto-generated method stub + + } + + @Override + public void sort(Comparator 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 action) { + // TODO Auto-generated method stub + + } + + @Override + public void replaceAll( + BiFunction 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 mappingFunction) { + // TODO Auto-generated method stub + return null; + } + + @Override + public V computeIfPresent(K key, + BiFunction remappingFunction) { + // TODO Auto-generated method stub + return null; + } + + @Override + public V compute(K key, + BiFunction remappingFunction) { + // TODO Auto-generated method stub + return null; + } + + @Override + public V merge(K key, V value, + BiFunction 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; }