package net.scapeemulator.cache.def;
import java.nio.ByteBuffer;
import net.scapeemulator.cache.util.ByteBufferUtils;
import net.scapeemulator.game.model.mob.combat.AttackType;
import net.scapeemulator.game.model.mob.combat.CombatBonuses;
import net.scapeemulator.game.model.player.skills.magic.CombatSpell;
public final class NPCDefinition implements Comparable<NPCDefinition> {
private int id;
private String name;
private int combatLevel;
private String[] options;
private int size;
private int stance;
private int[] modelIds;
// Values after this comment are not in the cache
private String examine;
// Combat information
private boolean attackable;
private int aggressiveRange;
private int respawnTime;
private int leashRange = 3;
private int attackRange;
private int attackDelay;
private AttackType attackType;
private int hpLevel, attLevel, defLevel, strLevel, mageLevel, rangeLevel;
private CombatBonuses bonuses;
private int attackEmote;
private int defendEmote;
private int deathEmote;
// Magic information
private CombatSpell autoCast;
// Range information
private int projectileGFX;
private int projectileSplashGFX;
// TODO more projectile info needed?
@SuppressWarnings("unused")
public static NPCDefinition decode(int id, ByteBuffer buffer) {
NPCDefinition def = new NPCDefinition();
def.id = id;
def.options = new String[5];
def.size = 1;
while (true) {
int opcode = buffer.get() & 0xFF;
if (opcode == 0) {
break;
}
if (opcode == 1) {
def.setModelIds(new int[buffer.get() & 0xFF]);
for (int i = 0; i < def.getModelIds().length; i++) {
int modelId = buffer.getShort() & 0xffff;
if (modelId == 65535) {
modelId = -1;
}
def.getModelIds()[i] = modelId;
}
}
if (opcode == 2) {
def.name = ByteBufferUtils.getString(buffer);
}
if (opcode == 12) {
def.size = buffer.get() & 0xff;
}
if (opcode >= 30 && opcode <= 35) {
def.options[opcode - 30] = ByteBufferUtils.getString(buffer);
if (def.options[opcode - 30].equals("hidden")) {
def.options[opcode - 30] = null;
}
}
if (opcode == 40) {
int var0 = buffer.get() & 0xff;
for (int i = 0; i < var0; i++) {
int var1 = buffer.getShort() & 0xffff;
int var2 = buffer.getShort() & 0xffff;
}
}
if (opcode == 41) {
int var0 = buffer.get() & 0xff;
for (int i = 0; i < var0; i++) {
int var1 = buffer.getShort() & 0xffff;
int var2 = buffer.getShort() & 0xffff;
}
}
if (opcode == 42) {
int var0 = buffer.get() & 0xff;
for (int i = 0; i < var0; i++) {
int var1 = buffer.get();
}
}
if (opcode == 60) {
int var0 = buffer.get() & 0xff;
for (int i = 0; i < var0; i++) {
int var1 = buffer.getShort() & 0xffff;
}
}
if (opcode == 95) {
def.combatLevel = buffer.getShort() & 0xffff;
}
if (opcode == 97) {
int var0 = buffer.getShort() & 0xffff; // Scale x
}
if (opcode == 98) {
int var0 = buffer.getShort() & 0xffff; // scale y
}
if (opcode == 100) {
int var0 = buffer.get() & 0xff;
}
if (opcode == 101) {
int var0 = buffer.get() & 0xff;
}
if (opcode == 102) {
int var0 = buffer.getShort() & 0xffff; // Head icon
}
if (opcode == 103) {
int var0 = buffer.getShort() & 0xffff;
}
if (opcode == 106 || opcode == 118) {
int var0 = buffer.getShort() & 0xffff;
int var1 = buffer.getShort() & 0xffff;
if (opcode == 118) {
int var3 = buffer.getShort() & 0xffff;
}
int var4 = buffer.get() & 0xff;
for (int i = 0; i <= var4; i++) {
int var5 = buffer.getShort() & 0xffff;
}
}
if (opcode == 113) {
int var0 = buffer.getShort() & 0xffff;
int var1 = buffer.getShort() & 0xffff;
}
if (opcode == 114) {
int var0 = buffer.get() & 0xff;
int var1 = buffer.get() & 0xff;
}
if (opcode == 115) {
int var0 = buffer.get() & 0xff;
int var1 = buffer.get() & 0xff;
}
if (opcode == 119) {
int var0 = buffer.get() & 0xff;
}
if (opcode == 121) {
int var0 = buffer.get() & 0xff;
for (int i = 0; i < var0; i++) {
int var1 = buffer.get() & 0xff;
int var2 = buffer.get() & 0xff;
int var3 = buffer.get() & 0xff;
int var4 = buffer.get() & 0xff;
}
}
if (opcode == 122) {
int var0 = buffer.getShort() & 0xffff;
}
if (opcode == 123) {
int var0 = buffer.getShort() & 0xffff;
}
if (opcode == 125) {
int var0 = buffer.get();
}
if (opcode == 126) {
int var0 = buffer.getShort() & 0xffff;
}
if (opcode == 127) {
def.stance = buffer.getShort() & 0xffff;
}
if (opcode == 128) {
int var0 = buffer.get() & 0xff;
}
if (opcode == 134) {
int var0 = buffer.getShort() & 0xffff;
int var1 = buffer.getShort() & 0xffff;
int var2 = buffer.getShort() & 0xffff;
int var3 = buffer.getShort() & 0xffff;
int var4 = buffer.get() & 0xff;
}
if (opcode == 135) {
int var0 = buffer.get() & 0xff;
int var1 = buffer.getShort() & 0xffff;
}
if (opcode == 136) {
int var0 = buffer.get() & 0xff;
int var1 = buffer.getShort() & 0xffff;
}
if (opcode == 137) {
int var0 = buffer.getShort() & 0xffff;
}
if (opcode == 249) {
int length = buffer.get() & 0xFF;
for (int index = 0; index < length; index++) {
boolean stringInstance = buffer.get() == 1;
int key = ByteBufferUtils.getTriByte(buffer);
Object value = stringInstance ? ByteBufferUtils.getJagexString(buffer) : buffer.getInt();
}
}
}
return def;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getSize() {
return size;
}
public String[] getOptions() {
return options;
}
public String getExamine() {
return examine;
}
public boolean isAttackable() {
return attackable;
}
public int getCombatLevel() {
return combatLevel;
}
public int aggressiveRange() {
return aggressiveRange;
}
public int getStance() {
return stance;
}
public int getHPLevel() {
return hpLevel;
}
public void setHPLevel(int level) {
this.hpLevel = level;
}
public int getAttackLevel() {
return attLevel;
}
public void setAttackLevel(int level) {
this.attLevel = level;
}
public int getStrengthLevel() {
return strLevel;
}
public void setStrengthLevel(int level) {
this.strLevel = level;
}
public int getDefenceLevel() {
return defLevel;
}
public void setDefenceLevel(int level) {
this.defLevel = level;
}
public int getRangeLevel() {
return rangeLevel;
}
public void setRangeLevel(int level) {
this.rangeLevel = level;
}
public int getMagicLevel() {
return mageLevel;
}
public void setMagicLevel(int level) {
this.mageLevel = level;
}
public CombatBonuses getCombatBonuses() {
return bonuses;
}
public void setCombatBonuses(CombatBonuses bonuses) {
this.bonuses = bonuses;
}
public int getAttackEmote() {
return attackEmote;
}
public int getDefendEmote() {
return defendEmote;
}
public int getDeathEmote() {
return deathEmote;
}
public int[] getModelIds() {
return modelIds;
}
public void setModelIds(int[] modelIds) {
this.modelIds = modelIds;
}
public int getProjectileGFX() {
return projectileGFX;
}
public int getProjectileSplashGFX() {
return projectileSplashGFX;
}
public int getAttackDelay() {
return attackDelay;
}
public AttackType getAttackType() {
return attackType;
}
public int getAttackRange() {
return attackRange;
}
public int getRespawnTime() {
return respawnTime;
}
public int getLeashRange() {
return leashRange;
}
public int getAggressiveRange() {
return aggressiveRange;
}
public void setAggressiveRange(int aggressiveRange) {
this.aggressiveRange = aggressiveRange;
}
public CombatSpell getAutoCast() {
return autoCast;
}
public void setAutoCast(CombatSpell autoCast) {
this.autoCast = autoCast;
}
public void setExamine(String examine) {
this.examine = examine;
}
public void setStance(int stance) {
this.stance = stance;
}
public void setCombatLevel(int combatLevel) {
this.combatLevel = combatLevel;
}
public void setAttackable(boolean attackable) {
this.attackable = attackable;
}
public void setRespawnTime(int respawnTime) {
this.respawnTime = respawnTime;
}
public void setAttackRange(int attackRange) {
this.attackRange = attackRange;
}
public void setAttackDelay(int attackDelay) {
this.attackDelay = attackDelay;
}
public void setAttackType(AttackType attackType) {
this.attackType = attackType;
}
public void setAttackEmote(int attackEmote) {
this.attackEmote = attackEmote;
}
public void setDefendEmote(int defendEmote) {
this.defendEmote = defendEmote;
}
public void setDeathEmote(int deathEmote) {
this.deathEmote = deathEmote;
}
public void setProjectileGFX(int projectileGFX) {
this.projectileGFX = projectileGFX;
}
public void setProjectileSplashGFX(int projectileSplashGFX) {
this.projectileSplashGFX = projectileSplashGFX;
}
@Override
public int compareTo(NPCDefinition other) {
if (other.id == id) {
return 0;
}
return id > other.id ? 1 : -1;
}
@Override
public String toString() {
return name + " (id: " + id + ", lvl: " + combatLevel + ")";
}
}