/* This file is part of the OdinMS Maple Story Server Copyright (C) 2008 Patrick Huy Matthias Butz Jan Christian Meyer This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation version 3 as published by the Free Software Foundation. You may not use, modify or distribute this program under any other version of the GNU Affero General Public License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package server.life; import server.life.LifeFactory.BanishInfo; import server.life.LifeFactory.loseItem; import server.life.LifeFactory.selfDestruction; import tools.Pair; import java.lang.reflect.Field; import java.util.*; /** * @author Frz */ public class MonsterStats { public boolean changeable; public int exp, hp, mp, level, PADamage, PDDamage, MADamage, MDDamage, dropPeriod, cp, buffToGive = -1, removeAfter; public boolean boss, undead, ffaLoot, isExplosiveReward, firstAttack, removeOnMiss; public String name; public Map animationTimes = new HashMap<>(); public Map resistance = new HashMap<>(); public List revives = Collections.emptyList(); public byte tagColor, tagBgColor; public Set skills = new HashSet<>(); public Pair cool = null; public BanishInfo banish = null; public List loseItem = null; public selfDestruction selfDestruction = null; public int fixedStance = 0; public boolean friendly; public void setChange(boolean change) { this.changeable = change; } public boolean isChangeable() { return changeable; } public int getExp() { return exp; } public void setExp(int exp) { this.exp = exp; } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } public int getMp() { return mp; } public void setMp(int mp) { this.mp = mp; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public int removeAfter() { return removeAfter; } public void setRemoveAfter(int removeAfter) { this.removeAfter = removeAfter; } public int getDropPeriod() { return dropPeriod; } public void setDropPeriod(int dropPeriod) { this.dropPeriod = dropPeriod; } public void setBoss(boolean boss) { this.boss = boss; } public boolean isBoss() { return boss; } public void setFfaLoot(boolean ffaLoot) { this.ffaLoot = ffaLoot; } public boolean isFfaLoot() { return ffaLoot; } public void setAnimationTime(String name, int delay) { animationTimes.put(name, delay); } public int getAnimationTime(String name) { Integer ret = animationTimes.get(name); if (ret == null) { return 500; } return ret; } public boolean isMobile() { return animationTimes.containsKey("move") || animationTimes.containsKey("fly"); } public List getRevives() { return revives; } public void setRevives(List revives) { this.revives = revives; } public void setUndead(boolean undead) { this.undead = undead; } public boolean isUndead() { return undead; } public void setEffectiveness(Element e, ElementalEffectiveness ee) { resistance.put(e, ee); } public ElementalEffectiveness getEffectiveness(Element e) { ElementalEffectiveness elementalEffectiveness = resistance.get(e); if (elementalEffectiveness == null) { return ElementalEffectiveness.NORMAL; } else { return elementalEffectiveness; } } public String getName() { return name; } public void setName(String name) { this.name = name; } public byte getTagColor() { return tagColor; } public void setTagColor(int tagColor) { this.tagColor = (byte) tagColor; } public byte getTagBgColor() { return tagBgColor; } public void setTagBgColor(int tagBgColor) { this.tagBgColor = (byte) tagBgColor; } public void setSkills(Set skills) { this.skills = skills; } public Set getSkills() { return Collections.unmodifiableSet(this.skills); } public int getNoSkills() { return this.skills.size(); } public boolean hasSkill(int skillId, int level) { for (MobSkillId skill : skills) { if (skill.type().getId() == skillId && skill.level() == level) { return true; } } return false; } public void setFirstAttack(boolean firstAttack) { this.firstAttack = firstAttack; } public boolean isFirstAttack() { return firstAttack; } public void setBuffToGive(int buff) { this.buffToGive = buff; } public int getBuffToGive() { return buffToGive; } void removeEffectiveness(Element e) { resistance.remove(e); } public BanishInfo getBanishInfo() { return banish; } public void setBanishInfo(BanishInfo banish) { this.banish = banish; } public int getPADamage() { return PADamage; } public void setPADamage(int PADamage) { this.PADamage = PADamage; } public int getCP() { return cp; } public void setCP(int cp) { this.cp = cp; } public List loseItem() { return loseItem; } public void addLoseItem(loseItem li) { if (loseItem == null) { loseItem = new LinkedList<>(); } loseItem.add(li); } public selfDestruction selfDestruction() { return selfDestruction; } public void setSelfDestruction(selfDestruction sd) { this.selfDestruction = sd; } public void setExplosiveReward(boolean isExplosiveReward) { this.isExplosiveReward = isExplosiveReward; } public boolean isExplosiveReward() { return isExplosiveReward; } public void setRemoveOnMiss(boolean removeOnMiss) { this.removeOnMiss = removeOnMiss; } public boolean removeOnMiss() { return removeOnMiss; } public void setCool(Pair cool) { this.cool = cool; } public Pair getCool() { return cool; } public int getPDDamage() { return PDDamage; } public int getMADamage() { return MADamage; } public int getMDDamage() { return MDDamage; } public boolean isFriendly() { return friendly; } public void setFriendly(boolean value) { this.friendly = value; } public void setPDDamage(int PDDamage) { this.PDDamage = PDDamage; } public void setMADamage(int MADamage) { this.MADamage = MADamage; } public void setMDDamage(int MDDamage) { this.MDDamage = MDDamage; } public int getFixedStance() { return this.fixedStance; } public void setFixedStance(int stance) { this.fixedStance = stance; } public MonsterStats copy() { MonsterStats copy = new MonsterStats(); try { FieldCopyUtil.setFields(this, copy); } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(10000); } catch (Exception ex) { } } return copy; } // FieldCopyUtil src: http://www.codesenior.com/en/tutorial/Java-Copy-Fields-From-One-Object-to-Another-Object-with-Reflection private static class FieldCopyUtil { // thanks to Codesenior dev team private static void setFields(Object from, Object to) { Field[] fields = from.getClass().getDeclaredFields(); for (Field field : fields) { try { Field fieldFrom = from.getClass().getDeclaredField(field.getName()); Object value = fieldFrom.get(from); to.getClass().getDeclaredField(field.getName()).set(to, value); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } } } }