Commands refactor part 1. Read more...

- Commands no longer need to be registered.
- No need for combat command registration.  This is detectable by if it has a value for characterAbility.
- No need for alias registration.  Use core.callScript.callCommand() in the duplicate script.
- No need for GM cmd registration.  There is a column called godLevel for this.
- Command ranges were not checked, allowing buggy issues like buffs being applied from 2000m away!
- Buffs will be auto applied now to target or self without needing to be scripted.
- Target types and command types are in the table (whether the cmd should be used on you, ally target, enemy target or group) as described here https://github.com/ProjectSWGCore/NGECore2/issues/370 <-- This is going to save us months of wasteful scripting and combat bugs
- Invalid weapons are now checked
- Cooldowns now check for cooldown group rather than commandName
- HitType no longer needs to determine attack range; this info is in the commands table
- Locomotion is partially checked and states fully checked
- Command table breaks when it's found the command for efficiency

In general, we were hardly using any of the info in the commands table and instead struggling to script it and experiencing loads of bugs as a result.  It's a waste of time to script what is already there.
This commit is contained in:
Treeku
2014-04-06 22:39:30 +01:00
parent 87db82f6fa
commit 0ff0c2657f
+221 -33
View File
@@ -25,6 +25,9 @@ import engine.clientdata.ClientFileManager;
import engine.clientdata.visitors.DatatableVisitor;
import engine.resources.common.CRC;
import java.util.ArrayList;
import java.util.List;
public class BaseSWGCommand implements Cloneable {
private String commandName;
@@ -33,26 +36,115 @@ public class BaseSWGCommand implements Cloneable {
private int maxRangeToTarget;
private int commandCRC;
private boolean isGmCommand = false;
private String requiredAbility;
private String characterAbility;
private int target;
private int targetType;
private boolean callOnTarget = false;
private int commandGroup;
private boolean disabled = true;
private int maxRangeToTarget;
private int godLevel;
private int displayGroup;
private boolean combatCommand = false;
private int validWeapon;
private int invalidWeapon;
private String cooldownGroup;
private float cooldown;
private float executeTime;
private float warmupTime;
//private long[] invalidLocomotions; // Not tracked anywhere
private byte[] invalidPostures;
private long[] invalidStates;
public BaseSWGCommand(String commandName) {
setCommandName(commandName);
setCommandCRC(CRC.StringtoCRC(commandName));
try {
List<Long> invalidStates = new ArrayList<Long>();
List<Byte> invalidPostures = new ArrayList<Byte>();
DatatableVisitor visitor2 = ClientFileManager.loadFile("datatables/command/command_table.iff", DatatableVisitor.class);
for (int i = 0; i < visitor2.getRowCount(); i++) {
if (visitor2.getObject(i, 0) != null) {
if (((String) visitor2.getObject(i, 0)).equalsIgnoreCase(commandName)) {
requiredAbility = (String) visitor2.getObject(i, 7);
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 = (Integer) 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(8))) invalidPostures.add(0B);
if (!((Boolean) visitor2.getObject(9))) invalidPostures.add(3B);
if (!((Boolean) visitor2.getObject(16))) invalidPostures.add(2B);
if (!((Boolean) visitor2.getObject(19))) invalidPostures.add(5B);
if (!((Boolean) visitor2.getObject(21))) invalidPostures.add(6B);
if (!((Boolean) visitor2.getObject(22))) invalidPostures.add(7B);
if (!((Boolean) visitor2.getObject(23))) invalidPostures.add(8B);
if (!((Boolean) visitor2.getObject(24))) invalidPostures.add(9B);
if (!((Boolean) visitor2.getObject(25))) invalidPostures.add(10B);
if (!((Boolean) visitor2.getObject(26))) invalidPostures.add(11B);
if (!((Boolean) visitor2.getObject(27))) invalidPostures.add(12B);
if (!((Boolean) visitor2.getObject(28))) invalidPostures.add(13B);
if (!((Boolean) visitor2.getObject(29))) invalidPostures.add(14B);
if (!((Boolean) visitor2.getObject(30))) invalidPostures.add(4B);
if (!((Boolean) visitor2.getObject(32))) invalidStates.add(1L);
if (!((Boolean) visitor2.getObject(33))) invalidStates.add(2L);
if (!((Boolean) visitor2.getObject(34))) invalidStates.add(4L);
if (!((Boolean) visitor2.getObject(35))) invalidStates.add(8L);
if (!((Boolean) visitor2.getObject(36))) invalidStates.add(16L);
if (!((Boolean) visitor2.getObject(37))) invalidStates.add(32L);
if (!((Boolean) visitor2.getObject(38))) invalidStates.add(64L);
if (!((Boolean) visitor2.getObject(39))) invalidStates.add(128L);
if (!((Boolean) visitor2.getObject(40))) invalidStates.add(256L);
if (!((Boolean) visitor2.getObject(41))) invalidStates.add(512L);
if (!((Boolean) visitor2.getObject(42))) invalidStates.add(1024L);
if (!((Boolean) visitor2.getObject(43))) invalidStates.add(2048L);
if (!((Boolean) visitor2.getObject(44))) invalidStates.add(4096L);
if (!((Boolean) visitor2.getObject(45))) invalidStates.add(8192L);
if (!((Boolean) visitor2.getObject(46))) invalidStates.add(16384L);
if (!((Boolean) visitor2.getObject(47))) invalidStates.add(32768L);
if (!((Boolean) visitor2.getObject(48))) invalidStates.add(65536L);
if (!((Boolean) visitor2.getObject(49))) invalidStates.add(131072L);
if (!((Boolean) visitor2.getObject(50))) invalidStates.add(262144L);
if (!((Boolean) visitor2.getObject(51))) invalidStates.add(524288L);
if (!((Boolean) visitor2.getObject(52))) invalidStates.add(1048576L);
if (!((Boolean) visitor2.getObject(53))) invalidStates.add(2097152L);
if (!((Boolean) visitor2.getObject(54))) invalidStates.add(4194304L);
if (!((Boolean) visitor2.getObject(55))) invalidStates.add(8388608L);
if (!((Boolean) visitor2.getObject(56))) invalidStates.add(16777216L);
if (!((Boolean) visitor2.getObject(57))) invalidStates.add(33554432L);
if (!((Boolean) visitor2.getObject(58))) invalidStates.add(67108864L);
if (!((Boolean) visitor2.getObject(59))) invalidStates.add(134217728L);
if (!((Boolean) visitor2.getObject(60))) invalidStates.add(268435456L);
if (!((Boolean) visitor2.getObject(61))) invalidStates.add(536870912L);
if (!((Boolean) visitor2.getObject(62))) invalidStates.add(1073741824L);
if (!((Boolean) visitor2.getObject(63))) invalidStates.add(2147483648L);
if (!((Boolean) visitor2.getObject(64))) invalidStates.add(4294967296L);
if (!((Boolean) visitor2.getObject(65))) invalidStates.add(8589934592L);
if (!((Boolean) visitor2.getObject(66))) invalidStates.add(17179869184L);
if (!((Boolean) visitor2.getObject(67))) invalidStates.add(34359738368L);
if (!((Boolean) visitor2.getObject(68))) invalidStates.add(68719476736L);
if (!((Boolean) visitor2.getObject(69))) invalidStates.add(137438953472L);
if (!((Boolean) visitor2.getObject(70))) invalidStates.add(274877906944L);
this.invalidPostures = (byte[]) invalidPostures.toArray();
this.invalidStates = (long[]) invalidStates.toArray();
break;
}
}
}
@@ -60,97 +152,193 @@ public class BaseSWGCommand implements Cloneable {
e.printStackTrace();
}
}
public String getCommandName() {
return commandName;
}
public void setCommandName(String commandName) {
this.commandName = commandName;
}
public String getClientEffectSelf() {
return clientEffectSelf;
}
public void setClientEffectSelf(String clientEffectSelf) {
this.clientEffectSelf = clientEffectSelf;
}
public String getClientEffectTarget() {
return clientEffectTarget;
}
public void setClientEffectTarget(String clientEffectTarget) {
this.clientEffectTarget = clientEffectTarget;
}
public int getMaxRangeToTarget() {
return maxRangeToTarget;
}
public void setMaxRangeToTarget(int maxRangeToTarget) {
this.maxRangeToTarget = maxRangeToTarget;
}
public int getCommandCRC() {
return commandCRC;
}
public void setCommandCRC(int commandCRC) {
this.commandCRC = commandCRC;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public boolean isGmCommand() {
return isGmCommand;
return (godLevel > 0);
}
public void setGmCommand(boolean isGmCommand) {
this.isGmCommand = isGmCommand;
}
public String getRequiredAbility() {
return requiredAbility;
public String getCharacterAbility() {
return characterAbility;
}
public void setRequiredAbility(String requiredAbility) {
this.requiredAbility = requiredAbility;
public void setcharacterAbility(String characterAbility) {
this.characterAbility = characterAbility;
}
public byte[] getInvalidPostures() {
return invalidPostures;
}
public long[] getInvalidStates() {
return invalidStates;
}
public int getTarget() {
return target;
}
public void setTarget(int target) {
this.target = target;
}
public void getTargetType() {
return targetType;
}
public void setTargetType() {
return targetType;
}
public boolean shouldCallOnTarget() {
return callOnTarget;
}
public void setCallOnTarget(boolean callOnTarget) {
this.callOnTarget = callOnTarget;
}
public int getCommandGroup() {
return commandGroup;
}
public void setCommandGroup(int commandGroup) {
this.commandGroup = commandGroup;
}
public boolean isDisabled() {
return disabled;
}
public void setDisabled(boolean disabled) {
this.disabled = disabled;
}
public int getMaxRangeToTarget() {
return maxRangeToTarget;
}
public void setMaxRangeToTarget(int maxRangeToTarget) {
this.maxRangeToTarget = maxRangeToTarget;
}
public int getGodLevel() {
return godLevel;
}
public void setGodLevel(int godLevel) {
this.godLevel = godLevel;
}
public int getDisplayGroup() {
return displayGroup;
}
public void setDisplayGroup(int displayGroup) {
this.displayGroup = displayGroup;
}
public boolean isCombatCommand() {
return combatCommand;
}
public void setCombatCommand(boolean combatCommand) {
this.combatCommand = combatCommand;
}
public int getValidWeapon() {
return validWeapon;
}
public void setValidWeapon(int validWeapon) {
this.validWeapon = validWeapon;
}
public int getInvalidWeapon() {
return invalidWeapon;
}
public void setInvalidWeapon(int invalidWeapon) {
this.invalidWeapon = invalidWeapon;
}
public String getCooldownGroup() {
return cooldownGroup;
}
public void setCooldownGroup(String cooldownGroup) {
this.cooldownGroup = cooldownGroup;
}
public float getCooldown() {
return cooldown;
}
public void setCooldown(float cooldown) {
this.cooldown = cooldown;
}
public float getExecuteTime() {
return executeTime;
}
public void setExecuteTime(float executeTime) {
this.executeTime = executeTime;
}
public float getWarmupTime() {
return warmupTime;
}
public void setWarmupTime(float warmupTime) {
this.warmupTime = warmupTime;
}
}