diff --git a/scripts/buffs/me_evasion_1.py b/scripts/buffs/me_evasion_1.py index 81ea7c1d..723b5ad5 100644 --- a/scripts/buffs/me_evasion_1.py +++ b/scripts/buffs/me_evasion_1.py @@ -7,6 +7,8 @@ def add(core, actor, buff): core.skillModService.addSkillMod(actor, 'expertise_dodge', 35) core.skillModService.addSkillMod(actor, 'display_only_evasion', 5000) core.skillModService.addSkillMod(actor, 'combat_evasion_value', 50) + + core.combatService.endCombat(actor) return def remove(core, actor, buff): diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 051f1690..bf7cc26e 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -775,8 +775,7 @@ public class SimulationService implements INetworkDispatch { core.removeClient(session); object.setAttachment("disconnectTask", disconnectTask); - for(TangibleObject obj : new Vector(object.getDefendersList())) - object.removeDefender(obj); // temp fix for being stuck in combat + core.combatService.endCombat(object); // temp fix for ending combat on disconnect } diff --git a/src/services/combat/CombatService.java b/src/services/combat/CombatService.java index 6115344a..08a6cee5 100644 --- a/src/services/combat/CombatService.java +++ b/src/services/combat/CombatService.java @@ -1381,6 +1381,13 @@ public class CombatService implements INetworkDispatch { } + public void endCombat(CreatureObject defender) { + Vector defenderList = new Vector(defender.getDefendersList()); + if (defenderList.size() > 0) { + defenderList.stream().forEach(attacker -> defender.removeDefender(attacker)); + } + } + public enum HitType{; public static final byte MISS = 0; diff --git a/src/services/command/BaseSWGCommand.java b/src/services/command/BaseSWGCommand.java index 7ded241d..0448a8ea 100644 --- a/src/services/command/BaseSWGCommand.java +++ b/src/services/command/BaseSWGCommand.java @@ -35,7 +35,7 @@ public class BaseSWGCommand implements Cloneable { private String clientEffectTarget; private int commandCRC; private boolean isGmCommand = false; - private String characterAbility = null; + private String characterAbility; private int target; private int targetType; private boolean callOnTarget = false; @@ -60,9 +60,11 @@ public class BaseSWGCommand implements Cloneable { setCommandCRC(CRC.StringtoCRC(commandName)); try { + boolean foundCommand = false; + String[] tableArray = new String[] { "client_command_table", "client_command_table_ground", "client_command_table_space", - "command_table", "command_table_ground", "command_table_space", "command_table_atmospheric_flight" }; + "command_table", "command_table_ground", "command_table_space" }; for (int n = 0; n < tableArray.length; n++) { List invalidStates = new ArrayList(); @@ -73,87 +75,105 @@ public class BaseSWGCommand implements Cloneable { for (int i = 0; i < visitor2.getRowCount(); i++) { if (visitor2.getObject(i, 0) != null) { if (((String) visitor2.getObject(i, 0)).equalsIgnoreCase(commandName)) { + int sub = 0; // Subtract due to command table structures being different + characterAbility = (String) visitor2.getObject(i, 7); - target = (Integer) visitor2.getObject(i, 72); - targetType = (Integer) visitor2.getObject(i, 73); - callOnTarget = (Boolean) visitor2.getObject(i, 76); - commandGroup = (Integer) visitor2.getObject(i, 77); - disabled = (Boolean) visitor2.getObject(i, 78); - maxRangeToTarget = (Float) visitor2.getObject(i, 79); - godLevel = (Integer) visitor2.getObject(i, 80); - displayGroup = (Integer) visitor2.getObject(i, 81); - combatCommand = (Boolean) visitor2.getObject(i, 82); - validWeapon = (Integer) visitor2.getObject(i, 83); - invalidWeapon = (Integer) visitor2.getObject(i, 84); - cooldownGroup = (String) visitor2.getObject(i, 85); - warmupTime = (Float) visitor2.getObject(i, 86); - executeTime = (Float) visitor2.getObject(i, 87); - cooldown = (Float) visitor2.getObject(i, 88); - if (!((Boolean) visitor2.getObject(i, 8))) invalidPostures.add((byte) 0); - if (!((Boolean) visitor2.getObject(i, 9))) invalidPostures.add((byte) 3); - if (!((Boolean) visitor2.getObject(i, 16))) invalidPostures.add((byte) 2); - if (!((Boolean) visitor2.getObject(i, 19))) invalidPostures.add((byte) 5); - if (!((Boolean) visitor2.getObject(i, 21))) invalidPostures.add((byte) 6); - if (!((Boolean) visitor2.getObject(i, 22))) invalidPostures.add((byte) 7); - if (!((Boolean) visitor2.getObject(i, 23))) invalidPostures.add((byte) 8); - if (!((Boolean) visitor2.getObject(i, 24))) invalidPostures.add((byte) 9); - if (!((Boolean) visitor2.getObject(i, 25))) invalidPostures.add((byte) 10); - if (!((Boolean) visitor2.getObject(i, 26))) invalidPostures.add((byte) 11); - if (!((Boolean) visitor2.getObject(i, 27))) invalidPostures.add((byte) 12); - if (!((Boolean) visitor2.getObject(i, 28))) invalidPostures.add((byte) 13); - if (!((Boolean) visitor2.getObject(i, 29))) invalidPostures.add((byte) 14); - if (!((Boolean) visitor2.getObject(i, 30))) invalidPostures.add((byte) 4); + if (!((Boolean) visitor2.getObject(i, 8-sub))) invalidPostures.add((byte) 0); + if (!((Boolean) visitor2.getObject(i, 9-sub))) invalidPostures.add((byte) 3); + if (!((Boolean) visitor2.getObject(i, 15-sub))) invalidPostures.add((byte) 2); + if (!((Boolean) visitor2.getObject(i, 18-sub))) invalidPostures.add((byte) 5); + if (!((Boolean) visitor2.getObject(i, 20-sub))) invalidPostures.add((byte) 6); + if (!((Boolean) visitor2.getObject(i, 21-sub))) invalidPostures.add((byte) 7); + if (!((Boolean) visitor2.getObject(i, 22-sub))) invalidPostures.add((byte) 8); + if (!((Boolean) visitor2.getObject(i, 23-sub))) invalidPostures.add((byte) 9); + if (!((Boolean) visitor2.getObject(i, 24-sub))) invalidPostures.add((byte) 10); + if (!((Boolean) visitor2.getObject(i, 25-sub))) invalidPostures.add((byte) 11); + if (!((Boolean) visitor2.getObject(i, 26-sub))) invalidPostures.add((byte) 12); + if (!((Boolean) visitor2.getObject(i, 27-sub))) invalidPostures.add((byte) 13); + if (!((Boolean) visitor2.getObject(i, 28-sub))) invalidPostures.add((byte) 14); + if (!((Boolean) visitor2.getObject(i, 29-sub))) invalidPostures.add((byte) 4); - if (!((Boolean) visitor2.getObject(i, 32))) invalidStates.add(1L); - if (!((Boolean) visitor2.getObject(i, 33))) invalidStates.add(2L); - if (!((Boolean) visitor2.getObject(i, 34))) invalidStates.add(4L); - if (!((Boolean) visitor2.getObject(i, 35))) invalidStates.add(8L); - if (!((Boolean) visitor2.getObject(i, 36))) invalidStates.add(16L); - if (!((Boolean) visitor2.getObject(i, 37))) invalidStates.add(32L); - if (!((Boolean) visitor2.getObject(i, 38))) invalidStates.add(64L); - if (!((Boolean) visitor2.getObject(i, 39))) invalidStates.add(128L); - if (!((Boolean) visitor2.getObject(i, 40))) invalidStates.add(256L); - if (!((Boolean) visitor2.getObject(i, 41))) invalidStates.add(512L); - if (!((Boolean) visitor2.getObject(i, 42))) invalidStates.add(1024L); - if (!((Boolean) visitor2.getObject(i, 43))) invalidStates.add(2048L); - if (!((Boolean) visitor2.getObject(i, 44))) invalidStates.add(4096L); - if (!((Boolean) visitor2.getObject(i, 45))) invalidStates.add(8192L); - if (!((Boolean) visitor2.getObject(i, 46))) invalidStates.add(16384L); - if (!((Boolean) visitor2.getObject(i, 47))) invalidStates.add(32768L); - if (!((Boolean) visitor2.getObject(i, 48))) invalidStates.add(65536L); - if (!((Boolean) visitor2.getObject(i, 49))) invalidStates.add(131072L); - if (!((Boolean) visitor2.getObject(i, 50))) invalidStates.add(262144L); - if (!((Boolean) visitor2.getObject(i, 51))) invalidStates.add(524288L); - if (!((Boolean) visitor2.getObject(i, 52))) invalidStates.add(1048576L); - if (!((Boolean) visitor2.getObject(i, 53))) invalidStates.add(2097152L); - if (!((Boolean) visitor2.getObject(i, 54))) invalidStates.add(4194304L); - if (!((Boolean) visitor2.getObject(i, 55))) invalidStates.add(8388608L); - if (!((Boolean) visitor2.getObject(i, 56))) invalidStates.add(16777216L); - if (!((Boolean) visitor2.getObject(i, 57))) invalidStates.add(33554432L); - if (!((Boolean) visitor2.getObject(i, 58))) invalidStates.add(67108864L); - if (!((Boolean) visitor2.getObject(i, 59))) invalidStates.add(134217728L); - if (!((Boolean) visitor2.getObject(i, 60))) invalidStates.add(268435456L); - if (!((Boolean) visitor2.getObject(i, 61))) invalidStates.add(536870912L); - if (!((Boolean) visitor2.getObject(i, 62))) invalidStates.add(1073741824L); - if (!((Boolean) visitor2.getObject(i, 63))) invalidStates.add(2147483648L); - if (!((Boolean) visitor2.getObject(i, 64))) invalidStates.add(4294967296L); - if (!((Boolean) visitor2.getObject(i, 65))) invalidStates.add(8589934592L); - if (!((Boolean) visitor2.getObject(i, 66))) invalidStates.add(17179869184L); - if (!((Boolean) visitor2.getObject(i, 67))) invalidStates.add(34359738368L); - if (!((Boolean) visitor2.getObject(i, 68))) invalidStates.add(68719476736L); - if (!((Boolean) visitor2.getObject(i, 69))) invalidStates.add(137438953472L); - if (!((Boolean) visitor2.getObject(i, 70))) invalidStates.add(274877906944L); + if (tableArray[n].startsWith("client_") || tableArray[n].startsWith("command_table_")) { + sub += 1; + } + + if (!((Boolean) visitor2.getObject(i, 32-sub))) invalidStates.add(1L); + if (!((Boolean) visitor2.getObject(i, 33-sub))) invalidStates.add(2L); + if (!((Boolean) visitor2.getObject(i, 34-sub))) invalidStates.add(4L); + if (!((Boolean) visitor2.getObject(i, 35-sub))) invalidStates.add(8L); + if (!((Boolean) visitor2.getObject(i, 36-sub))) invalidStates.add(16L); + if (!((Boolean) visitor2.getObject(i, 37-sub))) invalidStates.add(32L); + if (!((Boolean) visitor2.getObject(i, 38-sub))) invalidStates.add(64L); + if (!((Boolean) visitor2.getObject(i, 39-sub))) invalidStates.add(128L); + if (!((Boolean) visitor2.getObject(i, 40-sub))) invalidStates.add(256L); + if (!((Boolean) visitor2.getObject(i, 41-sub))) invalidStates.add(512L); + if (!((Boolean) visitor2.getObject(i, 42-sub))) invalidStates.add(1024L); + if (!((Boolean) visitor2.getObject(i, 43-sub))) invalidStates.add(2048L); + if (!((Boolean) visitor2.getObject(i, 44-sub))) invalidStates.add(4096L); + if (!((Boolean) visitor2.getObject(i, 45-sub))) invalidStates.add(8192L); + if (!((Boolean) visitor2.getObject(i, 46-sub))) invalidStates.add(16384L); + if (!((Boolean) visitor2.getObject(i, 47-sub))) invalidStates.add(32768L); + if (!((Boolean) visitor2.getObject(i, 48-sub))) invalidStates.add(65536L); + if (!((Boolean) visitor2.getObject(i, 49-sub))) invalidStates.add(131072L); + if (!((Boolean) visitor2.getObject(i, 50-sub))) invalidStates.add(262144L); + if (!((Boolean) visitor2.getObject(i, 51-sub))) invalidStates.add(524288L); + if (!((Boolean) visitor2.getObject(i, 52-sub))) invalidStates.add(1048576L); + if (!((Boolean) visitor2.getObject(i, 53-sub))) invalidStates.add(2097152L); + if (!((Boolean) visitor2.getObject(i, 54-sub))) invalidStates.add(4194304L); + if (!((Boolean) visitor2.getObject(i, 55-sub))) invalidStates.add(8388608L); + if (!((Boolean) visitor2.getObject(i, 56-sub))) invalidStates.add(16777216L); + if (!((Boolean) visitor2.getObject(i, 57-sub))) invalidStates.add(33554432L); + if (!((Boolean) visitor2.getObject(i, 58-sub))) invalidStates.add(67108864L); + if (!((Boolean) visitor2.getObject(i, 59-sub))) invalidStates.add(134217728L); + + if (!tableArray[n].equals("client_command_table_space")) { + if (!((Boolean) visitor2.getObject(i, 60-sub))) invalidStates.add(268435456L); + if (!((Boolean) visitor2.getObject(i, 61-sub))) invalidStates.add(536870912L); + if (!((Boolean) visitor2.getObject(i, 62-sub))) invalidStates.add(1073741824L); + if (!((Boolean) visitor2.getObject(i, 63-sub))) invalidStates.add(2147483648L); + if (!((Boolean) visitor2.getObject(i, 64-sub))) invalidStates.add(4294967296L); + } else { + sub += 5; + } + + if (!tableArray[n].startsWith("client_") && !tableArray[n].startsWith("command_table_")) { + if (!((Boolean) visitor2.getObject(i, 65-sub))) invalidStates.add(8589934592L); + if (!((Boolean) visitor2.getObject(i, 66-sub))) invalidStates.add(17179869184L); + if (!((Boolean) visitor2.getObject(i, 67-sub))) invalidStates.add(34359738368L); + if (!((Boolean) visitor2.getObject(i, 68-sub))) invalidStates.add(68719476736L); + if (!((Boolean) visitor2.getObject(i, 69-sub))) invalidStates.add(137438953472L); + if (!((Boolean) visitor2.getObject(i, 70-sub))) invalidStates.add(274877906944L); + } else { + sub += 6; + } + + target = (Integer) visitor2.getObject(i, 72-sub); + targetType = (Integer) visitor2.getObject(i, 73-sub); + callOnTarget = (Boolean) visitor2.getObject(i, 76-sub); + commandGroup = (Integer) visitor2.getObject(i, 77-sub); + disabled = (Boolean) visitor2.getObject(i, 78-sub); + maxRangeToTarget = (Float) visitor2.getObject(i, 79-sub); + godLevel = (Integer) visitor2.getObject(i, 80-sub); + displayGroup = (Integer) visitor2.getObject(i, 81-sub); + combatCommand = (Boolean) visitor2.getObject(i, 82-sub); + validWeapon = (Integer) visitor2.getObject(i, 83-sub); + invalidWeapon = (Integer) visitor2.getObject(i, 84-sub); + cooldownGroup = (String) visitor2.getObject(i, 85-sub); + warmupTime = (Float) visitor2.getObject(i, 86-sub); + executeTime = (Float) visitor2.getObject(i, 87-sub); + cooldown = (Float) visitor2.getObject(i, 88-sub); this.invalidPostures = invalidPostures.toArray(new Byte[] { }); this.invalidStates = invalidStates.toArray(new Long[] { }); + foundCommand = true; break; } } } - if (characterAbility != null) { + if (foundCommand) { break; } } diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index c6b5fab0..8e9bcf44 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -258,7 +258,7 @@ public class CommandService implements INetworkDispatch { try { String[] tableArray = new String[] { "client_command_table", "command_table", "client_command_table_ground", "command_table_ground", - "client_command_table_space", "command_table_space", "command_table_atmospheric_flight" }; + "client_command_table_space", "command_table_space" }; for (int n = 0; n < tableArray.length; n++) { DatatableVisitor visitor = ClientFileManager.loadFile("datatables/command/" + tableArray[n] + ".iff", DatatableVisitor.class); @@ -268,8 +268,22 @@ public class CommandService implements INetworkDispatch { String name = ((String) visitor.getObject(i, 0)).toLowerCase(); if (CRC.StringtoCRC(name) == commandCRC) { - boolean hasCharacterAbility = (((String) visitor.getObject(i, 7)).length() > 0); - boolean isCombatCommand = (Boolean) visitor.getObject(i, 82); + int sub = 0; + + boolean hasCharacterAbility = (((String) visitor.getObject(i, 7-sub)).length() > 0); + + if (tableArray[n].startsWith("client_") && tableArray[n].startsWith("command_table_")) { + sub += 7; + } + + if (tableArray[n].equals("client_command_table_space")) { + sub += 5; + } + + boolean isCombatCommand = false; + + if(visitor.getObject(i, 82-sub) instanceof Boolean) + isCombatCommand = (Boolean) visitor.getObject(i, 82-sub); if (hasCharacterAbility || isCombatCommand) { CombatCommand command = new CombatCommand(name.toLowerCase()); @@ -305,7 +319,7 @@ public class CommandService implements INetworkDispatch { try { String[] tableArray = new String[] { "client_command_table", "command_table", "client_command_table_ground", "command_table_ground", - "client_command_table_space", "command_table_space", "command_table_atmospheric_flight" }; + "client_command_table_space", "command_table_space" }; for (int n = 0; n < tableArray.length; n++) { DatatableVisitor visitor = ClientFileManager.loadFile("datatables/command/" + tableArray[n] + ".iff", DatatableVisitor.class); @@ -315,8 +329,22 @@ public class CommandService implements INetworkDispatch { String commandName = ((String) visitor.getObject(i, 0)).toLowerCase(); if (commandName.equalsIgnoreCase(name)) { - boolean hasCharacterAbility = (((String) visitor.getObject(i, 7)).length() > 0); - boolean isCombatCommand = (Boolean) visitor.getObject(i, 82); + int sub = 0; + + boolean hasCharacterAbility = (((String) visitor.getObject(i, 7-sub)).length() > 0); + + if (tableArray[n].startsWith("client_") && tableArray[n].startsWith("command_table_")) { + sub += 7; + } + + if (tableArray[n].equals("client_command_table_space")) { + sub += 5; + } + + boolean isCombatCommand = false; + + if(visitor.getObject(i, 82-sub) instanceof Boolean) + isCombatCommand = (Boolean) visitor.getObject(i, 82-sub); if (hasCharacterAbility || isCombatCommand) { CombatCommand command = new CombatCommand(commandName);