diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_carrion_kreetle_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_carrion_kreetle_01.py deleted file mode 100644 index db1bc7c3..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_carrion_kreetle_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('carrion_kreetle') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_carrion_kreetle_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_carrion_kreetle_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_city_sewer_rats_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_city_sewer_rats_01.py deleted file mode 100644 index 37c76c65..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_city_sewer_rats_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('city_sewer_swamprat') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_city_sewer_rats_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_city_sewer_rats_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_mound_mites_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_mound_mites_01.py deleted file mode 100644 index 46f2eddb..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_mound_mites_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('mound_mite') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_mound_mites_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_mound_mites_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_rock_mites_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_rock_mites_01.py deleted file mode 100644 index ead62ff3..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_rock_mites_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('rockmite') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_rock_mites_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_rock_mites_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_sickly_womp_rats_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_sickly_womp_rats_01.py deleted file mode 100644 index 73f1a14d..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_sickly_womp_rats_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('sickly_womprat') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_sickly_womp_rats_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_sickly_womp_rats_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_tame_worrts_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_tame_worrts_01.py deleted file mode 100644 index 148f876b..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_tame_worrts_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('tame_worrt') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_tame_worrts_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_tame_worrts_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_tempest_rills_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_tempest_rills_01.py deleted file mode 100644 index cb230f4f..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_tempest_rills_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('tempest_rill') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_tempest_rills_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_tempest_rills_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/mos_eisley_womp_rats_01.py b/scripts/mobiles/dynamicgroups/mos_eisley_womp_rats_01.py deleted file mode 100644 index 00637d0f..00000000 --- a/scripts/mobiles/dynamicgroups/mos_eisley_womp_rats_01.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -from services.spawn import DynamicSpawnGroup -from services.spawn import MobileTemplate -from java.util import Vector - -def addDynamicGroup(core): - dynamicGroup = DynamicSpawnGroup() - mobileTemplates = Vector() - mobileTemplates.add('womprat') - dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(1) - dynamicGroup.setName('mos_eisley_womprats_01') - dynamicGroup.setMaxSpawns(-1) - dynamicGroup.setMinSpawnDistance(5) - core.spawnService.addDynamicGroup('mos_eisley_womprats_01', dynamicGroup) - return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_1.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_1.py deleted file mode 100644 index e397088d..00000000 --- a/scripts/mobiles/spawnareas/legacy_starter_tatooine_1.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys -from java.util import Vector - -def addSpawnArea(core): - dynamicGroups = Vector() - dynamicGroups.add('mos_eisley_carrion_kreetle_01') - dynamicGroups.add('mos_eisley_city_sewer_rats_01') - core.spawnService.addDynamicSpawnArea(dynamicGroups, 3216, -4465, 100, 'tatooine') - return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_2.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_2.py deleted file mode 100644 index 60c6b356..00000000 --- a/scripts/mobiles/spawnareas/legacy_starter_tatooine_2.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys -from java.util import Vector - -def addSpawnArea(core): - dynamicGroups = Vector() - dynamicGroups.add('mos_eisley_tame_worrts_01') - dynamicGroups.add('mos_eisley_sickly_womp_rats_01') - core.spawnService.addDynamicSpawnArea(dynamicGroups, 3115, -4758, 100, 'tatooine') - return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_3.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_3.py deleted file mode 100644 index 140d9432..00000000 --- a/scripts/mobiles/spawnareas/legacy_starter_tatooine_3.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys -from java.util import Vector - -def addSpawnArea(core): - dynamicGroups = Vector() - dynamicGroups.add('mos_eisley_tame_worrts_01') - dynamicGroups.add('mos_eisley_rock_mites_01') - core.spawnService.addDynamicSpawnArea(dynamicGroups, 3153, -4945, 100, 'tatooine') - return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_4.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_4.py deleted file mode 100644 index 8edcc45b..00000000 --- a/scripts/mobiles/spawnareas/legacy_starter_tatooine_4.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys -from java.util import Vector - -def addSpawnArea(core): - dynamicGroups = Vector() - dynamicGroups.add('mos_eisley_tempest_rills_01') - dynamicGroups.add('mos_eisley_mound_mites_01') - core.spawnService.addDynamicSpawnArea(dynamicGroups, 3841, -4345, 100, 'tatooine') - return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/legacy_starter_tatooine_5.py b/scripts/mobiles/spawnareas/legacy_starter_tatooine_5.py deleted file mode 100644 index 44fcbc17..00000000 --- a/scripts/mobiles/spawnareas/legacy_starter_tatooine_5.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys -from java.util import Vector - -def addSpawnArea(core): - dynamicGroups = Vector() - dynamicGroups.add('mos_eisley_womprats_01') - dynamicGroups.add('mos_eisley_mound_mites_01') - core.spawnService.addDynamicSpawnArea(dynamicGroups, 3587, -4354, 100, 'tatooine') - return \ No newline at end of file diff --git a/src/services/ConversationService.java b/src/services/ConversationService.java index b2b3854a..29dd18ec 100644 --- a/src/services/ConversationService.java +++ b/src/services/ConversationService.java @@ -57,6 +57,8 @@ public class ConversationService implements INetworkDispatch { if(player.getConversingNpc() != null && player.getConversingNpc() != npc) handleEndConversation(player, player.getConversingNpc()); + core.simulationService.faceTarget(npc, player); + player.setConversingNpc(npc); sendStartConversation(player, npc); core.scriptService.callScript("scripts/conversation/", (String) npc.getAttachment("conversationFile"), "startConversation", core, player, npc); diff --git a/src/services/EquipmentService.java b/src/services/EquipmentService.java index 029edcdf..7cc326e0 100644 --- a/src/services/EquipmentService.java +++ b/src/services/EquipmentService.java @@ -123,6 +123,8 @@ public class EquipmentService implements INetworkDispatch { return false; } + if(item.getTemplate().startsWith("object/weapon/") && item.getTemplate().contains("lightsaber") && item.getAttachment("hasColorCrystal") == null) item.setAttachment("hasColorCrystal", false); + if(item.getAttachment("hasColorCrystal") != null && (Boolean) item.getAttachment("hasColorCrystal") == false) { actor.sendSystemMessage("You may not equip a light saber that has no color crystal!", (byte) 0); @@ -320,7 +322,7 @@ public class EquipmentService implements INetworkDispatch { if(!item.getTemplate().startsWith("object/tangible/component/weapon/lightsaber/")) return; if(lightsaber.getAttachment("hasColorCrystal") == null) lightsaber.setAttachment("hasColorCrystal", false); - if(item.getAttributes().containsKey("@obj_attr_n:color") && (Boolean) lightsaber.getAttachment("hasColorCrystal")) return; + if(item.getAttributes().containsKey("@obj_attr_n:color") && (Boolean) lightsaber.getAttachment("hasColorCrystal") && !(targetContainer.getContainer() instanceof CreatureObject)) return; // Find our tuner if(item.getAttachment("tunerId") == null) item.setAttachment("tunerId", 0); @@ -335,6 +337,8 @@ public class EquipmentService implements INetworkDispatch { else item.getContainer().transferTo(actor, targetContainer, item); // Calculate attributes + lightsaber.setAttachment("hasColorCrystal", false); + lightsaberInventory.viewChildren(lightsaberInventory, false, false, new Traverser() { WeaponObject saber; @@ -342,7 +346,7 @@ public class EquipmentService implements INetworkDispatch { int minDamageBonus = 0; int maxDamageBonus = 0; - Boolean hasColorCrystal = false; + Boolean hasColorCrystal = false; public void process(SWGObject item) { @@ -359,10 +363,10 @@ public class EquipmentService implements INetworkDispatch { saber.setCustomizationVariable("private/alternate_shader_blade", bladeType); saber.setCustomizationVariable("/private/index_color_blade", bladeColor); - // System.out.println("bladeColorName: " + item.getAttributes().get("@obj_attr_n:color")); - // System.out.println("bladeColor: " + bladeColor); - // System.out.println("bladeType: " + bladeType); - // System.out.println(); + // System.out.println("bladeColorName: " + item.getAttributes().get("@obj_attr_n:color")); + // System.out.println("bladeColor: " + bladeColor); + // System.out.println("bladeType: " + bladeType); + // System.out.println(); hasColorCrystal = true; } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index cf7f0705..97d2e06f 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -948,6 +948,36 @@ public class SimulationService implements INetworkDispatch { teleport(obj, obj.getPosition(), newRotation, obj.getParentId()); } + public void rotateToFaceTarget(SWGObject object, SWGObject target) { + float radians = (float) (((float) Math.atan2(target.getPosition().z - object.getPosition().z, target.getPosition().x - object.getPosition().x)) - object.getRadians()); + transform(object, radians, object.getPosition()); + } + + public void faceTarget(SWGObject object, SWGObject target) { + float direction = (float) Math.atan2(target.getWorldPosition().x - object.getWorldPosition().x, target.getWorldPosition().z - object.getWorldPosition().z); + + if (direction < 0) { + direction = (float) (2 * Math.PI + direction); + } + + if (Math.abs(direction - object.getRadians()) < 0.05) { + return; + } + + Quaternion quaternion = new Quaternion((float) Math.cos(direction / 2), 0, (float) Math.sin(direction / 2), 0); + + if (quaternion.y < 0.0f && quaternion.w > 0.0f) { + quaternion.y *= -1; + quaternion.w *= -1; + } + + if (object.getContainer() instanceof CellObject) { + NGECore.getInstance().simulationService.moveObject(object, object.getPosition(), quaternion, object.getMovementCounter(), 0, (CellObject) object.getContainer()); + } else { + NGECore.getInstance().simulationService.moveObject(object, object.getPosition(), quaternion, object.getMovementCounter(), 0, null); + } + } + public void teleport(SWGObject obj, Point3D position, Quaternion orientation, long cellId) { if(cellId == 0) { diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index c778a25f..226612b6 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -47,6 +47,7 @@ import protocol.swg.ObjControllerMessage; import protocol.swg.objectControllerObjects.CommandEnqueue; import protocol.swg.objectControllerObjects.CommandEnqueueRemove; import protocol.swg.objectControllerObjects.StartTask; +import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; @@ -141,6 +142,11 @@ public class CommandService implements INetworkDispatch { return false; } + + if (!target.isInQuadtree() && (target.getContainer() == null || !(target.getContainer() instanceof CellObject))) { + break; + } + if (!core.simulationService.checkLineOfSight(actor, target)) { actor.showFlyText("@combat_effects:cant_see", 1.5f, new RGB(72, 209, 204), 1, true); return false; @@ -170,6 +176,10 @@ public class CommandService implements INetworkDispatch { return false; } + if (!target.isInQuadtree() && (target.getContainer() == null || !(target.getContainer() instanceof CellObject))) { + break; + } + if (!core.simulationService.checkLineOfSight(actor, target)) { actor.showFlyText("@combat_effects:cant_see", 1.5f, new RGB(72, 209, 204), 1, true); return false; @@ -218,6 +228,10 @@ public class CommandService implements INetworkDispatch { return false; } + if (!target.isInQuadtree() && (target.getContainer() == null || !(target.getContainer() instanceof CellObject))) { + break; + } + if (!core.simulationService.checkLineOfSight(actor, target)) { actor.showFlyText("@combat_effects:cant_see", 1.5f, new RGB(72, 209, 204), 1, true); return false;