59public class NpcDefinition {
65 private final String name;
66 private int combatLevel;
72 private int turn90CCW;
73 private int attackAnim;
74 private int blockAnim;
75 private int deathAnim;
76 private int deathTimer;
77 private boolean attackable;
78 private boolean aggressive;
79 private boolean retaliate;
80 private boolean poisonous;
81 private boolean poisonImmunity;
82 private boolean venomImmunity;
83 private boolean flying;
85 private int[] bonuses;
86 private int attackDelay;
87 private int attackRadius;
88 private int respawnTime;
89 private CombatAttackData combatAttackData;
92 public NpcDefinition(
int id, String name) {
102 this.attackAnim = -1;
107 this.attackable =
false;
108 this.aggressive =
false;
109 this.retaliate =
false;
110 this.poisonous =
false;
111 this.poisonImmunity =
false;
112 this.venomImmunity =
false;
113 this.skills = EMPTY_SKILLS;
114 this.bonuses = EMPTY_BONUSES;
115 this.attackDelay = 4;
116 this.attackRadius = 1;
117 this.respawnTime = 30;
120 public static void main(String[] args) {
125 public static GsonParser createParser() {
126 return new GsonParser(
"def/npc/npc_definitions",
false) {
129 protected void parse(JsonObject data) {
130 int id = data.get(
"id").getAsInt();
131 boolean convertId =
true;
132 if (data.has(
"convert-id")) {
133 convertId = data.get(
"convert-id").getAsBoolean();
136 int newId = OldToNew.get(
id);
142 final CacheNpcDefinition cacheDef = CacheNpcDefinition.lookup(
id);
143 final String cacheDefName = cacheDef.name;
145 definition.size = cacheDef.size;
146 definition.combatLevel = cacheDef.combatLevel;
147 definition.stand = cacheDef.standingAnimation;
148 definition.walk = cacheDef.walkingAnimation;
149 definition.turn180 = cacheDef.halfTurnAnimation;
150 definition.turn90CW = cacheDef.quarterClockwiseTurnAnimation;
151 definition.turn90CCW = cacheDef.quarterAnticlockwiseTurnAnimation;
153 definition.deathTimer = 3;
154 if (data.has(
"death-timer")) {
155 definition.deathTimer = data.get(
"death-timer").getAsInt();
158 if (data.has(
"attack-animation")) {
159 definition.attackAnim = data.get(
"attack-animation").getAsInt();
162 if (data.has(
"block-animation")) {
163 definition.blockAnim = data.get(
"block-animation").getAsInt();
166 if (data.has(
"death-animation")) {
167 definition.deathAnim = data.get(
"death-animation").getAsInt();
170 if (data.has(
"attackable")) {
171 definition.attackable = data.get(
"attackable").getAsBoolean();
174 if (data.has(
"aggressive")) {
175 definition.aggressive = data.get(
"aggressive").getAsBoolean();
179 if (data.has(
"retaliate")) {
180 definition.retaliate = data.get(
"retaliate").getAsBoolean();
183 if (data.has(
"poisonous")) {
184 definition.poisonous = data.get(
"poisonous").getAsBoolean();
187 if (data.has(
"flying")) {
188 definition.flying = data.get(
"flying").getAsBoolean();
191 if (data.has(
"poison-immunity")) {
192 definition.poisonImmunity = data.get(
"poison-immunity").getAsBoolean();
195 if (data.has(
"venom-immunity")) {
196 definition.venomImmunity = data.get(
"venom-immunity").getAsBoolean();
199 if (data.has(
"attack-cooldown")) {
200 definition.attackDelay = data.get(
"attack-cooldown").getAsInt();
203 if (data.has(
"attack-radius")) {
204 definition.attackRadius = data.get(
"attack-radius").getAsInt();
207 if (data.has(
"combat-type") && data.has(
"projectile-key")) {
208 CombatType type = CombatType.valueOf(data.get(
"combat-type").getAsString());
209 String key = data.get(
"projectile-key").getAsString();
210 definition.combatAttackData =
new CombatAttackData(type, key);
213 if (data.has(
"respawn")) {
214 definition.respawnTime = data.get(
"respawn").getAsInt();
217 for (
int index = 0; index < SKILL_FIELD_NAMES.length; index++) {
218 String skillName = SKILL_FIELD_NAMES[index];
219 if (data.has(skillName)) {
220 if (definition.skills == EMPTY_SKILLS) {
221 definition.skills =
new int[EMPTY_SKILLS.length];
223 definition.skills[index] = data.get(skillName).getAsInt();
227 for (
int index = 0; index < BONUS_CONFIG_FIELD_NAMES.length; index++) {
228 String bonusName = BONUS_CONFIG_FIELD_NAMES[index];
229 if (data.has(bonusName)) {
230 if (definition.bonuses == EMPTY_BONUSES) {
231 definition.bonuses =
new int[EMPTY_BONUSES.length];
233 definition.bonuses[index] = data.get(bonusName).getAsInt();
241 protected void onEnd() {
242 MonsterDefLoader.load();
249 public static NpcDefinition
get(
int id) {
257 return new NpcDefinition(
id,
"null");
264 if (definition !=
null && definition.getName().equals(name)) {
271 public static String getCombatLevelRange(String name) {
272 List<Integer> levels =
new ArrayList<>();
275 if (definition !=
null && definition.
getName().contains(name)) {
280 if (levels.isEmpty()) {
284 Collections.sort(levels);
286 return levels.get(0) +
"-" + levels.get(levels.size() - 1);
349 public int getDeathTimer() {
375 return poisonImmunity;
380 return venomImmunity;
383 public boolean isFlying() {
412 public void setAggressive(
boolean aggressive) {
413 this.aggressive = aggressive;
416 public void setRetaliate(
boolean retaliate) {
417 this.retaliate = retaliate;
420 public void setRespawnTime(
int respawnTime) {
421 this.respawnTime = respawnTime;
424 public void setCombatLevel(
int combatLevel) {
425 this.combatLevel = combatLevel;
428 public void setSize(
int size) {
432 public void setStand(
int stand) {
436 public void setWalk(
int walk) {
440 public void setTurn180(
int turn180) {
441 this.turn180 = turn180;
444 public void setTurn90CW(
int turn90CW) {
445 this.turn90CW = turn90CW;
448 public void setTurn90CCW(
int turn90CCW) {
449 this.turn90CCW = turn90CCW;
452 public int getAttackAnim() {
456 public void setAttackAnim(
int attackAnim) {
457 this.attackAnim = attackAnim;
460 public int getBlockAnim() {
464 public void setBlockAnim(
int blockAnim) {
465 this.blockAnim = blockAnim;
468 public int getDeathAnim() {
472 public void setDeathAnim(
int deathAnim) {
473 this.deathAnim = deathAnim;
476 public void setDeathTimer(
int deathTimer) {
477 this.deathTimer = deathTimer;
480 public void setAttackable(
boolean attackable) {
481 this.attackable = attackable;
484 public void setPoisonous(
boolean poisonous) {
485 this.poisonous = poisonous;
488 public boolean isPoisonImmunity() {
489 return poisonImmunity;
492 public void setPoisonImmunity(
boolean poisonImmunity) {
493 this.poisonImmunity = poisonImmunity;
496 public boolean isVenomImmunity() {
497 return venomImmunity;
500 public void setVenomImmunity(
boolean venomImmunity) {
501 this.venomImmunity = venomImmunity;
504 public void setFlying(
boolean flying) {
505 this.flying = flying;
508 public void setSkills(
int[] skills) {
509 this.skills = skills;
512 public void setBonuses(
int[] bonuses) {
513 this.bonuses = bonuses;
516 public void setAttackDelay(
int attackDelay) {
517 this.attackDelay = attackDelay;
520 public void setAttackRadius(
int attackRadius) {
521 this.attackRadius = attackRadius;
524 public void setCombatAttackData(CombatAttackData combatAttackData) {
525 this.combatAttackData = combatAttackData;
528 public Player getPlayer() {
532 public void setPlayer(Player player) {
533 this.player = player;
536 public Optional<CombatAttackData> getCombatAttackData() {
537 return Optional.ofNullable(combatAttackData);
541 public int hashCode() {
542 return Objects.hash(
id, name, size);
546 public boolean equals(Object obj) {
547 return obj ==
this || (obj instanceof NpcDefinition && ((NpcDefinition) obj).id == id);
550 public static final class CombatAttackData {
552 public final CombatType type;
554 public final String key;
556 public CombatAttackData(CombatType type, String key) {
561 public CombatProjectile getDefinition() {
562 return CombatProjectile.getDefinition(key);