MapleCharacter.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:217k
源码类别:

游戏

开发平台:

Java

  1.         getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  2.         } catch (RemoteException e) {
  3.         getClient().getChannelServer().reconnectWorld();
  4.         }
  5.         }
  6.         maxhp = Math.min(30000, maxhp);
  7.         maxmp = Math.min(30000, maxmp);
  8.         List<Pair<MapleStat, Integer>> statup = new ArrayList<Pair<MapleStat, Integer>>(8);
  9.         statup.add(new Pair<MapleStat, Integer>(MapleStat.AVAILABLEAP, Integer.valueOf(remainingAp)));
  10.         statup.add(new Pair<MapleStat, Integer>(MapleStat.MAXHP, Integer.valueOf(maxhp)));
  11.         statup.add(new Pair<MapleStat, Integer>(MapleStat.MAXMP, Integer.valueOf(maxmp)));
  12.         statup.add(new Pair<MapleStat, Integer>(MapleStat.HP, Integer.valueOf(maxhp)));
  13.         statup.add(new Pair<MapleStat, Integer>(MapleStat.MP, Integer.valueOf(maxmp)));
  14.         statup.add(new Pair<MapleStat, Integer>(MapleStat.EXP, Integer.valueOf(exp.get())));
  15.         statup.add(new Pair<MapleStat, Integer>(MapleStat.LEVEL, Integer.valueOf(level)));
  16.         if (job != MapleJob.BEGINNER) {
  17.             remainingSp += 30;
  18.             statup.add(new Pair<MapleStat, Integer>(MapleStat.AVAILABLESP, Integer.valueOf(remainingSp)));
  19.         }
  20.         setHp(maxhp);
  21.         setMp(maxmp);
  22.         getClient().getSession().write(MaplePacketCreator.updatePlayerStats(statup));
  23.         getMap().broadcastMessage(this, MaplePacketCreator.showLevelup(getId()), false);
  24.         recalcLocalStats();
  25.         silentPartyUpdate();
  26.         guildUpdate();
  27.     }
  28.     public MapleInventory getInventory(MapleInventoryType type) {
  29.         return inventory[type.ordinal()];
  30.     }
  31.     public MapleShop getShop() {
  32.         return shop;
  33.     }
  34.     public void setShop(MapleShop shop) {
  35.         this.shop = shop;
  36.     }
  37.     public int getMeso() {
  38.         return meso.get();
  39.     }
  40.     public int getSavedLocation(SavedLocationType type) {
  41.         return savedLocations[type.ordinal()];
  42.     }
  43.     public void saveLocation(SavedLocationType type) {
  44.         savedLocations[type.ordinal()] = getMapId();
  45.     }
  46.     public void clearSavedLocation(SavedLocationType type) {
  47.         savedLocations[type.ordinal()] = -1;
  48.     }
  49.     public void setMeso(int set) {
  50.         meso.set(set);
  51.         updateSingleStat(MapleStat.MESO, set, false);
  52.     }
  53.     public void gainMeso(int gain) {
  54.         gainMeso(gain, true, false, false);
  55.     }
  56.     public void gainMeso(int gain, boolean show) {
  57.         gainMeso(gain, show, false, false);
  58.     }
  59.     public void gainMeso(int gain, boolean show, boolean enableActions) {
  60.         gainMeso(gain, show, enableActions, false);
  61.     }
  62.     public void gainMeso(int gain, boolean show, boolean enableActions, boolean inChat) {
  63.         int newVal;
  64.         if (meso.get() + gain >= Integer.MAX_VALUE) {
  65.             meso.set(Integer.MAX_VALUE);
  66.             newVal = Integer.MAX_VALUE;
  67.         } else if (meso.get() + gain < 0) {
  68.             meso.set(0);
  69.             newVal = 0;
  70.         } else {
  71.             newVal = meso.addAndGet(gain);
  72.         }
  73.         updateSingleStat(MapleStat.MESO, newVal, enableActions);
  74.         if (show) {
  75.             client.getSession().write(MaplePacketCreator.getShowMesoGain(gain, inChat));
  76.         }
  77.     }
  78.     /**
  79.      * Adds this monster to the controlled list. The monster must exist on the Map.
  80.      *
  81.      * @param monster
  82.      */
  83.     public void controlMonster(MapleMonster monster, boolean aggro) {
  84.         monster.setController(this);
  85.         controlled.add(monster);
  86.         client.getSession().write(MaplePacketCreator.controlMonster(monster, false, aggro));
  87.     }
  88.     public void stopControllingMonster(MapleMonster monster) {
  89.         controlled.remove(monster);
  90.     }
  91.     public void checkMonsterAggro(MapleMonster monster) {
  92.         if (!monster.isControllerHasAggro()) {
  93.             if (monster.getController() == this) {
  94.                 monster.setControllerHasAggro(true);
  95.             } else {
  96.                 monster.switchController(this, true);
  97.             }
  98.         }
  99.     }
  100.     public Collection<MapleMonster> getControlledMonsters() {
  101.         return Collections.unmodifiableCollection(controlled);
  102.     }
  103.     public int getNumControlledMonsters() {
  104.         return controlled.size();
  105.     }
  106.     @Override
  107.     public String toString() {
  108.         return "Character: " + this.name;
  109.     }
  110.     public int getAccountID() {
  111.         return accountid;
  112.     }
  113.     public void mobKilled(int id) {
  114.         for (MapleQuestStatus q : quests.values()) {
  115.             if (q.getStatus() == MapleQuestStatus.Status.COMPLETED || q.getQuest().canComplete(this, null)) {
  116.                 continue;
  117.             }
  118.             if (q.mobKilled(id) && !(q.getQuest() instanceof MapleCustomQuest)) {
  119.                 client.getSession().write(MaplePacketCreator.updateQuestMobKills(q));
  120.                 if (q.getQuest().canComplete(this, null)) {
  121.                     client.getSession().write(MaplePacketCreator.getShowQuestCompletion(q.getQuest().getId()));
  122.                 }
  123.             }
  124.         }
  125.     }
  126.     public final List<MapleQuestStatus> getStartedQuests() {
  127.         List<MapleQuestStatus> ret = new LinkedList<MapleQuestStatus>();
  128.         for (MapleQuestStatus q : quests.values()) {
  129.             if (q.getStatus().equals(MapleQuestStatus.Status.STARTED) && !(q.getQuest() instanceof MapleCustomQuest)) {
  130.                 ret.add(q);
  131.             }
  132.         }
  133.         return Collections.unmodifiableList(ret);
  134.     }
  135.     public final List<MapleQuestStatus> getCompletedQuests() {
  136.         List<MapleQuestStatus> ret = new LinkedList<MapleQuestStatus>();
  137.         for (MapleQuestStatus q : quests.values()) {
  138.             if (q.getStatus().equals(MapleQuestStatus.Status.COMPLETED) && !(q.getQuest() instanceof MapleCustomQuest)) {
  139.                 ret.add(q);
  140.             }
  141.         }
  142.         return Collections.unmodifiableList(ret);
  143.     }
  144.     public IPlayerInteractionManager getInteraction() {
  145.         return interaction;
  146.     }
  147.     public void setInteraction(IPlayerInteractionManager box) {
  148.         interaction = box;
  149.     }
  150.     public Map<ISkill, SkillEntry> getSkills() {
  151.         return Collections.unmodifiableMap(skills);
  152.     }
  153.     public void dispelSkill(int skillid) {
  154.         LinkedList<MapleBuffStatValueHolder> allBuffs = new LinkedList<MapleBuffStatValueHolder>(effects.values());
  155.         for (MapleBuffStatValueHolder mbsvh : allBuffs) {
  156.             if (skillid == 0) {
  157.                 if (mbsvh.effect.isSkill()) {
  158.                     switch (mbsvh.effect.getSourceId()) {
  159.                         case 1004:
  160.                         case 1321007:
  161.                         case 2121005:
  162.                         case 2221005:
  163.                         case 2311006:
  164.                         case 2321003:
  165.                         case 3111002:
  166.                         case 3111005:
  167.                         case 3211002:
  168.                         case 3211005:
  169.                         case 4111002:
  170.                             cancelEffect(mbsvh.effect, false, mbsvh.startTime);
  171.                     }
  172.                 }
  173.             } else {
  174.                 if (mbsvh.effect.isSkill() && mbsvh.effect.getSourceId() == skillid) {
  175.                     cancelEffect(mbsvh.effect, false, mbsvh.startTime);
  176.                 }
  177.             }
  178.         }
  179.     }
  180.     public boolean isActiveBuffedValue(int skillid) {
  181.         LinkedList<MapleBuffStatValueHolder> allBuffs = new LinkedList<MapleBuffStatValueHolder>(effects.values());
  182.         for (MapleBuffStatValueHolder mbsvh : allBuffs) {
  183.             if (mbsvh.effect.isSkill() && mbsvh.effect.getSourceId() == skillid) {
  184.                 return true;
  185.             }
  186.         }
  187.         return false;
  188.     }
  189.     public int getSkillLevel(ISkill skill) {
  190.         SkillEntry ret = skills.get(skill);
  191.         if (ret == null) {
  192.             return 0;
  193.         }
  194.         return ret.skillevel;
  195.     }
  196.     public int getMasterLevel(ISkill skill) {
  197.         SkillEntry ret = skills.get(skill);
  198.         if (ret == null) {
  199.             return 0;
  200.         }
  201.         return ret.masterlevel;
  202.     }
  203.     // the equipped inventory only contains equip... I hope
  204.     public int getTotalDex() {
  205.         return localdex;
  206.     }
  207.     public int getTotalInt() {
  208.         return localint;
  209.     }
  210.     public int getTotalStr() {
  211.         return localstr;
  212.     }
  213.     public int getTotalLuk() {
  214.         return localluk;
  215.     }
  216.     public int getTotalMagic() {
  217.         return magic;
  218.     }
  219.     public double getSpeedMod() {
  220.         return speedMod;
  221.     }
  222.     public double getJumpMod() {
  223.         return jumpMod;
  224.     }
  225.     public int getTotalWatk() {
  226.         return watk;
  227.     }
  228.     public static int rand(int lbound, int ubound) {
  229.         return (int) ((Math.random() * (ubound - lbound + 1)) + lbound);
  230.     }
  231.     public int getMaxDis(MapleCharacter player) {
  232.         IItem weapon_item = player.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
  233.         if (weapon_item != null) {
  234.             MapleWeaponType weapon = MapleItemInformationProvider.getInstance().getWeaponType(weapon_item.getItemId());
  235.             if (weapon == MapleWeaponType.SPEAR || weapon == MapleWeaponType.POLE_ARM) {
  236.                 maxDis = 106;
  237.             }
  238.             if (weapon == MapleWeaponType.DAGGER || weapon == MapleWeaponType.SWORD1H || weapon == MapleWeaponType.AXE1H || weapon == MapleWeaponType.BLUNT1H) {
  239.                 maxDis = 63;
  240.             }
  241.             if (weapon == MapleWeaponType.SWORD2H || weapon == MapleWeaponType.AXE1H || weapon == MapleWeaponType.BLUNT1H) {
  242.                 maxDis = 73;
  243.             }
  244.             if (weapon == MapleWeaponType.STAFF || weapon == MapleWeaponType.WAND) {
  245.                 maxDis = 51;
  246.             }
  247.             if (weapon == MapleWeaponType.CLAW) {
  248.                 skil = SkillFactory.getSkill(4000001);
  249.                 skill = player.getSkillLevel(skil);
  250.                 if (skill > 0) {
  251.                     maxDis = (skil.getEffect(player.getSkillLevel(skil)).getRange()) + 205;
  252.                 } else {
  253.                     maxDis = 205;
  254.                 }
  255.             }
  256.             if (weapon == MapleWeaponType.BOW || weapon == MapleWeaponType.CROSSBOW) {
  257.                 skil = SkillFactory.getSkill(3000002);
  258.                 skill = player.getSkillLevel(skil);
  259.                 if (skill > 0) {
  260.                     maxDis = (skil.getEffect(player.getSkillLevel(skil)).getRange()) + 270;
  261.                 } else {
  262.                     maxDis = 270;
  263.                 }
  264.             }
  265.         }
  266.         return maxDis;
  267.     }
  268.     public int getMesoMode() {
  269.         return Mesomode;
  270.     }
  271.     public MonsterCarnival getMonsterCarnival() {
  272.         return monsterCarnival;
  273.     }
  274.     public void setMonsterCarnival(MonsterCarnival monsterCarnival) {
  275.         this.monsterCarnival = monsterCarnival;
  276.     }
  277.     public int getReborns() {
  278.         return reborns;
  279.     }
  280.     public void gainReborns(int reborns) {
  281.             this.reborns += 1;
  282. }
  283.     public void gainvip(int vip) {
  284.             this.vip += 1;
  285. }
  286.     public int calculateMaxBaseDamage(int watk) {
  287.         int maxbasedamage;
  288.         if (watk == 0) {
  289.             maxbasedamage = 1;
  290.         } else {
  291.             IItem weapon_item = getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
  292.             if (weapon_item != null) {
  293.                 MapleWeaponType weapon = MapleItemInformationProvider.getInstance().getWeaponType(weapon_item.getItemId());
  294.                 int mainstat;
  295.                 int secondarystat;
  296.                 if (weapon == MapleWeaponType.BOW || weapon == MapleWeaponType.CROSSBOW) {
  297.                     mainstat = localdex;
  298.                     secondarystat = localstr;
  299.                 } else if (getJob().isA(MapleJob.THIEF) && (weapon == MapleWeaponType.CLAW || weapon == MapleWeaponType.DAGGER)) {
  300.                     mainstat = localluk;
  301.                     secondarystat = localdex + localstr;
  302.                 } else {
  303.                     mainstat = localstr;
  304.                     secondarystat = localdex;
  305.                 }
  306.                 maxbasedamage = (int) (((weapon.getMaxDamageMultiplier() * mainstat + secondarystat) / 100.0) * watk);
  307.                 //just some saveguard against rounding errors, we want to a/b for this
  308.                 maxbasedamage += 10;
  309.             } else {
  310.                 maxbasedamage = 0;
  311.             }
  312.         }
  313.         return maxbasedamage;
  314.     }
  315.     public int calculateMinBaseDamage(MapleCharacter player) {
  316.         int minbasedamage = 0;
  317.         int atk = player.getTotalWatk();
  318.         if (atk == 0) {
  319.             minbasedamage = 1;
  320.         } else {
  321.             IItem weapon_item = getInventory(MapleInventoryType.EQUIPPED).getItem((byte) - 11);
  322.             if (weapon_item != null) {
  323.                 MapleWeaponType weapon = MapleItemInformationProvider.getInstance().getWeaponType(weapon_item.getItemId());
  324.                 //mastery start
  325.                 if (player.getJob().isA(MapleJob.FIGHTER)) {
  326.                     skil = SkillFactory.getSkill(1100000);
  327.                     skill = player.getSkillLevel(skil);
  328.                     if (skill > 0) {
  329.                         sword = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  330.                     } else {
  331.                         sword = 0.1;
  332.                     }
  333.                 } else {
  334.                     skil = SkillFactory.getSkill(1200000);
  335.                     skill = player.getSkillLevel(skil);
  336.                     if (skill > 0) {
  337.                         sword = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  338.                     } else {
  339.                         sword = 0.1;
  340.                     }
  341.                 }
  342.                 skil = SkillFactory.getSkill(1100001);
  343.                 skill = player.getSkillLevel(skil);
  344.                 if (skill > 0) {
  345.                     axe = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  346.                 } else {
  347.                     axe = 0.1;
  348.                 }
  349.                 skil = SkillFactory.getSkill(1200001);
  350.                 skill = player.getSkillLevel(skil);
  351.                 if (skill > 0) {
  352.                     blunt = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  353.                 } else {
  354.                     blunt = 0.1;
  355.                 }
  356.                 skil = SkillFactory.getSkill(1300000);
  357.                 skill = player.getSkillLevel(skil);
  358.                 if (skill > 0) {
  359.                     spear = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  360.                 } else {
  361.                     spear = 0.1;
  362.                 }
  363.                 skil = SkillFactory.getSkill(1300001);
  364.                 skill = player.getSkillLevel(skil);
  365.                 if (skill > 0) {
  366.                     polearm = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  367.                 } else {
  368.                     polearm = 0.1;
  369.                 }
  370.                 skil = SkillFactory.getSkill(3200000);
  371.                 skill = player.getSkillLevel(skil);
  372.                 if (skill > 0) {
  373.                     crossbow = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  374.                 } else {
  375.                     crossbow = 0.1;
  376.                 }
  377.                 skil = SkillFactory.getSkill(3100000);
  378.                 skill = player.getSkillLevel(skil);
  379.                 if (skill > 0) {
  380.                     bow = ((skil.getEffect(player.getSkillLevel(skil)).getMastery() * 5 + 10) / 100);
  381.                 } else {
  382.                     bow = 0.1;
  383.                 }
  384.                 //end mastery
  385.                 if (weapon == MapleWeaponType.CROSSBOW) {
  386.                     minbasedamage = (int) (localdex * 0.9 * 3.6 * crossbow + localstr) / 100 * (atk + 15);
  387.                 }
  388.                 if (weapon == MapleWeaponType.BOW) {
  389.                     minbasedamage = (int) (localdex * 0.9 * 3.4 * bow + localstr) / 100 * (atk + 15);
  390.                 }
  391.                 if (getJob().isA(MapleJob.THIEF) && (weapon == MapleWeaponType.DAGGER)) {
  392.                     minbasedamage = (int) (localluk * 0.9 * 3.6 * dagger + localstr + localdex) / 100 * atk;
  393.                 }
  394.                 if (!getJob().isA(MapleJob.THIEF) && (weapon == MapleWeaponType.DAGGER)) {
  395.                     minbasedamage = (int) (localstr * 0.9 * 4.0 * dagger + localdex) / 100 * atk;
  396.                 }
  397.                 if (getJob().isA(MapleJob.THIEF) && (weapon == MapleWeaponType.CLAW)) {
  398.                     minbasedamage = (int) (localluk * 0.9 * 3.6 * claw + localstr + localdex) / 100 * (atk + 15);
  399.                 }
  400.                 if (weapon == MapleWeaponType.SPEAR) {
  401.                     minbasedamage = (int) (localstr * 0.9 * 3.0 * spear + localdex) / 100 * atk;
  402.                 }
  403.                 if (weapon == MapleWeaponType.POLE_ARM) {
  404.                     minbasedamage = (int) (localstr * 0.9 * 3.0 * polearm + localdex) / 100 * atk;
  405.                 }
  406.                 if (weapon == MapleWeaponType.SWORD1H) {
  407.                     minbasedamage = (int) (localstr * 0.9 * 4.0 * sword + localdex) / 100 * atk;
  408.                 }
  409.                 if (weapon == MapleWeaponType.SWORD2H) {
  410.                     minbasedamage = (int) (localstr * 0.9 * 4.6 * sword + localdex) / 100 * atk;
  411.                 }
  412.                 if (weapon == MapleWeaponType.AXE1H) {
  413.                     minbasedamage = (int) (localstr * 0.9 * 3.2 * axe + localdex) / 100 * atk;
  414.                 }
  415.                 if (weapon == MapleWeaponType.BLUNT1H) {
  416.                     minbasedamage = (int) (localstr * 0.9 * 3.2 * blunt + localdex) / 100 * atk;
  417.                 }
  418.                 if (weapon == MapleWeaponType.AXE2H) {
  419.                     minbasedamage = (int) (localstr * 0.9 * 3.4 * axe + localdex) / 100 * atk;
  420.                 }
  421.                 if (weapon == MapleWeaponType.BLUNT2H) {
  422.                     minbasedamage = (int) (localstr * 0.9 * 3.4 * blunt + localdex) / 100 * atk;
  423.                 }
  424.                 if (weapon == MapleWeaponType.STAFF || weapon == MapleWeaponType.WAND) {
  425.                     minbasedamage = (int) (localstr * 0.9 * 3.0 * staffwand + localdex) / 100 * atk;
  426.                 }
  427.             }
  428.         }
  429.         return minbasedamage;
  430.     }
  431.     public int getRandomage(MapleCharacter player) {
  432.         int maxdamage = player.getCurrentMaxBaseDamage();
  433.         int mindamage = player.calculateMinBaseDamage(player);
  434.         return MapleCharacter.rand(mindamage, maxdamage);
  435.     }
  436.     public void levelUp() {
  437.         ISkill improvingMaxHP = null;
  438.         int improvingMaxHPLevel = 0;
  439.         ISkill improvingMaxMP = SkillFactory.getSkill(2000001);
  440.         int improvingMaxMPLevel = getSkillLevel(improvingMaxMP);
  441.         remainingAp += 5 + getVip();
  442.         if (job == MapleJob.BEGINNER) {
  443.             maxhp += rand(12, 16);
  444.             maxmp += rand(10, 12);
  445.         } else if (job.isA(MapleJob.WARRIOR)) {
  446.             improvingMaxHP = SkillFactory.getSkill(1000001);
  447.             improvingMaxHPLevel = getSkillLevel(improvingMaxHP);
  448.             maxhp += rand(24, 28);
  449.             maxmp += rand(4, 6);
  450.         } else if (job.isA(MapleJob.MAGICIAN)) {
  451.             maxhp += rand(10, 14);
  452.             maxmp += rand(22, 24);
  453.         } else if (job.isA(MapleJob.BOWMAN) || job.isA(MapleJob.THIEF)) {
  454.             maxhp += rand(20, 24);
  455.             maxmp += rand(14, 16);
  456.         } else if (job.isA(MapleJob.GM)) {
  457.             maxhp += 30000;
  458.             maxmp += 30000;
  459.         } else if (job.isA(MapleJob.PIRATE)) {
  460.             improvingMaxHP = SkillFactory.getSkill(5100000);
  461.             improvingMaxHPLevel = getSkillLevel(improvingMaxHP);
  462.             maxhp += rand(22, 28);
  463.             maxmp += rand(18, 23);
  464.         }
  465.         if (improvingMaxHPLevel > 0 && (job.isA(MapleJob.WARRIOR) || job.isA(MapleJob.PIRATE)))
  466.             maxhp += improvingMaxHP.getEffect(improvingMaxHPLevel).getX();
  467.         if (improvingMaxMPLevel > 0 && (job.isA(MapleJob.MAGICIAN) || job == MapleJob.CRUSADER || job == MapleJob.HERO))
  468.             maxmp += improvingMaxMP.getEffect(improvingMaxMPLevel).getX();
  469.         maxmp += getTotalInt() / 10;
  470.         exp.addAndGet(-ExpTable.getExpNeededForLevel(level));
  471.         level += 1;
  472.                 if (juankuan == 1888)
  473.         {
  474.             getClient().getSession().write(MaplePacketCreator.serverNotice(1, "恭喜,你的慈善捐款的数目已经达到" + getjuankuan() + "亿冒险币.."));
  475.             getClient().getSession().write(MaplePacketCreator.serverNotice(1, "恭喜玩家:" + getName() + "的慈善捐款的数目已经达到" + getjuankuan() + "亿冒险币!"));
  476.         }
  477.       if (getLevel() == 250) {
  478.             exp.set(0);
  479.             if(exp.get() > 0)
  480.                     exp.set(0);
  481.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到250级.让我们一起来喝彩他吧!");
  482.             try {
  483.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  484.             } catch (RemoteException e) {
  485.                 getClient().getChannelServer().reconnectWorld();
  486.             }
  487.         }
  488.                                 if (getLevel() == 249) {
  489.             exp.set(0);
  490.             if(exp.get() > 0)
  491.                     exp.set(0);
  492.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到249级.他还差最后一步就到250级.他的精神是崇高无上的!");
  493.             try {
  494.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  495.             } catch (RemoteException e) {
  496.                 getClient().getChannelServer().reconnectWorld();
  497.             }
  498.         }
  499.            if (getLevel() == 240) {
  500.             exp.set(0);
  501.             if(exp.get() > 0)
  502.                     exp.set(0);
  503.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到240级.让我们一起来喝彩他吧!");
  504.             try {
  505.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  506.             } catch (RemoteException e) {
  507.                 getClient().getChannelServer().reconnectWorld();
  508.             }
  509.         }
  510.                                 if (getLevel() == 239) {
  511.             exp.set(0);
  512.             if(exp.get() > 0)
  513.                     exp.set(0);
  514.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到239级.他还差最后一步就到240级.让我们为他加油吧!");
  515.             try {
  516.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  517.             } catch (RemoteException e) {
  518.                 getClient().getChannelServer().reconnectWorld();
  519.             }
  520.         }
  521.            if (getLevel() == 230) {
  522.             exp.set(0);
  523.             if(exp.get() > 0)
  524.                     exp.set(0);
  525.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到230级.让我们一起来喝彩他吧!");
  526.             try {
  527.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  528.             } catch (RemoteException e) {
  529.                 getClient().getChannelServer().reconnectWorld();
  530.             }
  531.         }
  532.                                 if (getLevel() == 229) {
  533.             exp.set(0);
  534.             if(exp.get() > 0)
  535.                     exp.set(0);
  536.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到229级.他还差最后一步就到230级.让我们为他加油吧!");
  537.             try {
  538.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  539.             } catch (RemoteException e) {
  540.                 getClient().getChannelServer().reconnectWorld();
  541.             }
  542.         }
  543.            if (getLevel() == 220) {
  544.             exp.set(0);
  545.             if(exp.get() > 0)
  546.                     exp.set(0);
  547.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到220级.让我们一起来喝彩他吧!");
  548.             try {
  549.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  550.             } catch (RemoteException e) {
  551.                 getClient().getChannelServer().reconnectWorld();
  552.             }
  553.         }
  554.                                 if (getLevel() == 219) {
  555.             exp.set(0);
  556.             if(exp.get() > 0)
  557.                     exp.set(0);
  558.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到219级.他还差最后一步就到220级.让我们为他加油吧!");
  559.             try {
  560.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  561.             } catch (RemoteException e) {
  562.                 getClient().getChannelServer().reconnectWorld();
  563.             }
  564.         }
  565.            if (getLevel() == 210) {
  566.             exp.set(0);
  567.             if(exp.get() > 0)
  568.                     exp.set(0);
  569.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到210级.让我们一起来喝彩他吧!");
  570.             try {
  571.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  572.             } catch (RemoteException e) {
  573.                 getClient().getChannelServer().reconnectWorld();
  574.             }
  575.         }
  576.                         if (getLevel() == 209) {
  577.             exp.set(0);
  578.             if(exp.get() > 0)
  579.                     exp.set(0);
  580.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到209级.他还差最后一步就到210级.让我们为他加油吧!");
  581.             try {
  582.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  583.             } catch (RemoteException e) {
  584.                 getClient().getChannelServer().reconnectWorld();
  585.             }
  586.         }
  587.         if (getLevel() == 200) {
  588.             exp.set(0);
  589.             if(exp.get() > 0)
  590.                     exp.set(0);
  591.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到200级.让我们一起来喝彩他吧!");
  592.             try {
  593.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  594.             } catch (RemoteException e) {
  595.                 getClient().getChannelServer().reconnectWorld();
  596.             }
  597.         }
  598.                 if (getLevel() == 199) {
  599.             exp.set(0);
  600.             if(exp.get() > 0)
  601.                     exp.set(0);
  602.             MaplePacket packet = MaplePacketCreator.serverNotice(6, "[公告事项]:恭喜玩家 " + getName() + " 终于辛苦达到199级.他还差最后一步就到200级了.让我们为他加油吧!");
  603.             try {
  604.                 getClient().getChannelServer().getWorldInterface().broadcastMessage(getName(), packet.getBytes());
  605.             } catch (RemoteException e) {
  606.                 getClient().getChannelServer().reconnectWorld();
  607.             }
  608.         }
  609.         //70,120自动转职
  610.         NPCScriptManager npc = NPCScriptManager.getInstance();
  611.         if (level == 10 || level == 30) {
  612.            npc.start(client, 1002006, null, null);
  613.         }
  614.         if (level == 255) {
  615.            npc.start(client, 1002006, null, null);
  616.         }
  617.         if (level == 70) {
  618.             int[] autojob = {110, 120, 130, 210, 220, 230, 310, 320, 410, 420, 510, 520};
  619.             for (int j : autojob) {
  620.                 if (getJob().getId() == j) {
  621.                     changeJob(MapleJob.getById(getJob().getId()+1));
  622.                 }
  623.             }
  624.         }
  625.         if (level == 120) {
  626.             int[] autojob = {111, 121, 131, 211, 221, 231, 311, 321, 411, 421, 511, 521};
  627.             for (int j : autojob) {
  628.                 if (getJob().getId() == j) {
  629.                     changeJob(MapleJob.getById(getJob().getId()+1));
  630.                 }
  631.             }
  632.         }
  633.         //结束
  634.         maxhp = Math.min(30000, maxhp);
  635.         maxmp = Math.min(30000, maxmp);
  636.         List<Pair<MapleStat, Integer>> statup = new ArrayList<Pair<MapleStat, Integer>>(8);
  637.         statup.add(new Pair<MapleStat, Integer>(MapleStat.AVAILABLEAP, Integer.valueOf(remainingAp)));
  638.         statup.add(new Pair<MapleStat, Integer>(MapleStat.MAXHP, Integer.valueOf(maxhp)));
  639.         statup.add(new Pair<MapleStat, Integer>(MapleStat.MAXMP, Integer.valueOf(maxmp)));
  640.         statup.add(new Pair<MapleStat, Integer>(MapleStat.HP, maxhp));
  641.         statup.add(new Pair<MapleStat, Integer>(MapleStat.MP, maxmp));
  642.         statup.add(new Pair<MapleStat, Integer>(MapleStat.EXP, Integer.valueOf(exp.get())));
  643.         statup.add(new Pair<MapleStat, Integer>(MapleStat.LEVEL, Integer.valueOf(level)));
  644.         if (job != MapleJob.BEGINNER) {//新手
  645.             remainingSp += 3;
  646.             statup.add(new Pair<MapleStat, Integer>(MapleStat.AVAILABLESP, Integer.valueOf(remainingSp)));
  647.         }
  648.         setHp(maxhp);
  649.         setMp(maxmp);
  650.         getClient().getSession().write(MaplePacketCreator.updatePlayerStats(statup));
  651.         getMap().broadcastMessage(this, MaplePacketCreator.showForeignEffect(getId(), 0), false);
  652.         recalcLocalStats();
  653.         silentPartyUpdate();
  654.         guildUpdate();
  655.     }
  656.     public void setExpEnabled(boolean c) {
  657.         this.expEnabled = c;
  658.     }
  659.     public void gainFame(int delta) {
  660.         this.addFame(delta);
  661.         this.updateSingleStat(MapleStat.FAME, this.fame);
  662.     }
  663.     public int getCpqRanking() {
  664.         return cpqRanking;
  665.     }
  666.     public void setCpqRanking(int cpqRanking) {
  667.         this.cpqRanking = cpqRanking;
  668.     }
  669.     
  670.     public long getLastPlayerKill() {
  671.         return playerkill;
  672.     }
  673.     public void setLastPlayerKill(long Z) {
  674.         playerkill = Z;
  675.     }
  676.     public void setPlayerShop(MaplePlayerShop playerShop) {
  677.         this.playerShop = playerShop;
  678.     }
  679.     public boolean isChallenged() {
  680.         return challenged;
  681.     }
  682.     public void changeKeybinding(int key, MapleKeyBinding keybinding) {
  683.         if (keybinding.getType() != 0) {
  684.             keymap.put(Integer.valueOf(key), keybinding);
  685.         } else {
  686.             keymap.remove(Integer.valueOf(key));
  687.         }
  688.     }
  689.     public void sendKeymap() {
  690.         getClient().getSession().write(MaplePacketCreator.getKeymap(keymap));
  691.     }
  692.     public void sendMacros() {
  693.         boolean macros = false;
  694.         for (int i = 0; i < 5; i++) {
  695.             if (skillMacros[i] != null) {
  696.                 macros = true;
  697.             }
  698.         }
  699.         if (macros) {
  700.             getClient().getSession().write(MaplePacketCreator.getMacros(skillMacros));
  701.         }
  702.     }
  703.     public int hasexp() {
  704.         if (getLevel()<=30){
  705.             return 4;//低于30级打怪得到5倍经验
  706.         }else if (getLevel()>=31 && getLevel()<=70 && getVip()<9){
  707.             return 3;//31-70级4倍经验
  708.         }else if (getLevel()>=71 && getLevel()<=90 && getVip()<8){
  709.             return 2;
  710.         }else if (getLevel()>=91 && getLevel()<=120 && getVip()<5){
  711.             return 1;
  712.         }else{
  713.             return 0;
  714.         }
  715.     }
  716.     public void updateMacros(int position, SkillMacro updateMacro) {
  717.         skillMacros[position] = updateMacro;
  718.     }
  719.     public void setSlot(int slotid) {
  720.         slots = slotid;
  721.     }
  722.      public int getSlot() {
  723.         return slots;
  724.     }
  725.      public int getSlots(byte b) {
  726.         for (Pair<Byte, Integer> curPair : inventorySlots)
  727.             if (curPair.getLeft() == b)
  728.                 return curPair.getRight();
  729.         return 100;
  730.     }
  731.     public void tempban(String reason, Calendar duration, int greason) {
  732.         tempban(reason, duration, greason, client.getAccID());
  733.         client.getSession().write(MaplePacketCreator.sendGMPolice(greason, reason, (int) (duration.getTimeInMillis() / 1000))); //put duration as seconds
  734.         TimerManager.getInstance().schedule(new Runnable() {
  735.             public void run() {
  736.                 client.getSession().close();
  737.             }
  738.         }, 10000);
  739.     }
  740.     public static boolean tempban(String reason, Calendar duration, int greason, int accountid) {
  741.         try {
  742.             Connection con = DatabaseConnection.getConnection();
  743.             PreparedStatement ps = con.prepareStatement("UPDATE accounts SET tempban = ?, banreason = ?, greason = ? WHERE id = ?");
  744.             Timestamp TS = new Timestamp(duration.getTimeInMillis());
  745.             ps.setTimestamp(1, TS);
  746.             ps.setString(2, reason);
  747.             ps.setInt(3, greason);
  748.             ps.setInt(4, accountid);
  749.             ps.executeUpdate();
  750.             ps.close();
  751.             return true;
  752.         } catch (SQLException ex) {
  753.             System.err.println("Error while tempbanning");
  754.         }
  755.         return false;
  756.     }
  757.     public void ban(String reason, boolean permBan) {
  758.         if (!client.isGuest()) {
  759.             try {
  760.                 Connection con = DatabaseConnection.getConnection();
  761.                 PreparedStatement ps;
  762.                 if (permBan) {
  763.                     getClient().banMacs();
  764.                     ps = con.prepareStatement("INSERT INTO ipbans VALUES (DEFAULT, ?)");
  765.                     String[] ipSplit = client.getSession().getRemoteAddress().toString().split(":");
  766.                     ps.setString(1, ipSplit[0]);
  767.                     ps.executeUpdate();
  768.                     ps.close();
  769.                 }
  770.                 ps = con.prepareStatement("UPDATE accounts SET banned = ?, banreason = ?, greason = ? WHERE id = ?");
  771.                 ps.setInt(1, 1);
  772.                 ps.setString(2, reason);
  773.                 ps.setInt(3, 12);
  774.                 ps.setInt(4, accountid);
  775.                 ps.executeUpdate();
  776.                 ps.close();
  777.             } catch (SQLException ex) {
  778.                 System.err.println("Error while banning");
  779.             }
  780.         }
  781.         client.getSession().write(MaplePacketCreator.sendGMPolice(0, reason, 1000000)); // Thanks zerofusion.
  782.         TimerManager.getInstance().schedule(new Runnable() {
  783.             public void run() {
  784.                 client.getSession().close();
  785.             }
  786.         }, 10000);
  787.     }
  788.     public int getAuto(String type) {
  789.                 ServernoticeMapleClientMessageCallback cm = new ServernoticeMapleClientMessageCallback(this.getClient());
  790.         Connection con = DatabaseConnection.getConnection();
  791.                 PreparedStatement ps;
  792.         String name = this.getName();
  793.         int autoint = 0;
  794.         try {
  795.             ps = con.prepareStatement("SELECT * FROM characters WHERE name = ?");
  796.                     ps.setString(1, name);
  797.                     ResultSet rs = ps.executeQuery();
  798.                     if (!rs.next())
  799.                     {
  800.                         ps.close();
  801.                     }
  802.                     autoint = rs.getInt("auto"+type);
  803.                     ps.close();
  804.                     return autoint;
  805.             }
  806.             catch (SQLException e) {cm.dropMessage("Exception has occured: "+e);}
  807.             return autoint;
  808.         }
  809.     public void setAuto(String type, int num) {
  810.                 ServernoticeMapleClientMessageCallback cm = new ServernoticeMapleClientMessageCallback(this.getClient());
  811.         Connection con = DatabaseConnection.getConnection();
  812.                 PreparedStatement ps;
  813.         String name = this.getName();
  814.         try {
  815.             ps = con.prepareStatement("UPDATE characters SET auto"+type+" = "+num+" WHERE name = ?");
  816.                     ps.setString(1, name);
  817.                     ps.executeUpdate();
  818.                     ps.close();
  819.          }
  820.             catch (SQLException e) {cm.dropMessage("Exception has occured: "+e); return;}
  821.         }
  822.     public static boolean ban(String id, String reason, boolean accountId) {
  823.         try {
  824.             Connection con = DatabaseConnection.getConnection();
  825.             PreparedStatement ps;
  826.             if (id.matches("/[0-9]{1,3}\..*")) {
  827.                 //ps = con.prepareStatement("INSERT INTO ipbans VALUES (DEFAULT, ?)");
  828.                 ps = con.prepareStatement("INSERT INTO macbans VALUES (DEFAULT, ?)");
  829.                 ps.setString(1, id);
  830.                 ps.executeUpdate();
  831.                 ps.close();
  832.             }
  833.             if (accountId) {
  834.                 ps = con.prepareStatement("SELECT id FROM accounts WHERE name = ?");
  835.             } else {
  836.                 ps = con.prepareStatement("SELECT accountid FROM characters WHERE name = ?");
  837.             }
  838.             boolean ret = false;
  839.             ps.setString(1, id);
  840.             ResultSet rs = ps.executeQuery();
  841.             if (rs.next()) {
  842.                 ps = con.prepareStatement("UPDATE accounts SET banned = 1, banreason = ? WHERE id = ?");
  843.                 ps.setString(1, reason);
  844.                 ps.setInt(2, rs.getInt(1));
  845.                 ps.executeUpdate();
  846.                 ret = true;
  847.             }
  848.             rs.close();
  849.             ps.close();
  850.             return ret;
  851.         } catch (SQLException ex) {
  852.             System.err.println("Error while banning");
  853.         }
  854.         return false;
  855.     }
  856.     public static int getAccIdFromCNAME(String name) {
  857.         Connection con = DatabaseConnection.getConnection();
  858.         try {
  859.             PreparedStatement ps = con.prepareStatement("SELECT accountid FROM characters WHERE name = ?");
  860.             ps.setString(1, name);
  861.             ResultSet rs = ps.executeQuery();
  862.             if (!rs.next()) {
  863.                 ps.close();
  864.                 return -1;
  865.             }
  866.             int id_ = rs.getInt("accountid");
  867.             ps.close();
  868.             return id_;
  869.         } catch (SQLException e) {
  870.             System.err.println("ERROR");
  871.         }
  872.         return -1;
  873.     }
  874.     public void setChallenged(boolean challenged) {
  875.         this.challenged = challenged;
  876.     }
  877.     /**
  878.      * Oid of players is always = the cid
  879.      */
  880.     @Override
  881.     public int getObjectId() {
  882.         return getId();
  883.     }
  884.     /**
  885.      * Throws unsupported operation exception, oid of players is read only
  886.      */
  887.     @Override
  888.     public void setObjectId(int id) {
  889.         throw new UnsupportedOperationException();
  890.     }
  891.     public MapleStorage getStorage() {
  892.         return storage;
  893.     }
  894.     public int getCurrentMaxHp() {
  895.         return localmaxhp;
  896.     }
  897.     public int getCurrentMaxMp() {
  898.         return localmaxmp;
  899.     }
  900.     public int getCurrentMaxBaseDamage() {
  901.         return localmaxbasedamage;
  902.     }
  903.     public int getTotalMdef() {
  904.         return mdef;
  905.     }
  906.     public int getTotalWdef() {
  907.         return wdef;
  908.     }
  909.     public void addVisibleMapObject(MapleMapObject mo) {
  910.         visibleMapObjects.add(mo);
  911.     }
  912.     public void removeVisibleMapObject(MapleMapObject mo) {
  913.         visibleMapObjects.remove(mo);
  914.     }
  915.     public boolean isMapObjectVisible(MapleMapObject mo) {
  916.         return visibleMapObjects.contains(mo);
  917.     }
  918.     public Collection<MapleMapObject> getVisibleMapObjects() {
  919.         return Collections.unmodifiableCollection(visibleMapObjects);
  920.     }
  921.     public boolean isAlive() {
  922.         return this.hp > 0;
  923.     }
  924.     public boolean isDead() {
  925.         return this.hp <= 0;
  926.     }
  927.     @Override
  928.     public void sendDestroyData(MapleClient client) {
  929.         client.getSession().write(MaplePacketCreator.removePlayerFromMap(this.getObjectId()));
  930.     }
  931.     @Override
  932.     public void sendSpawnData(MapleClient client) {
  933.         if ((this.isHidden() && client.getPlayer().isGM()) || !this.isHidden()) {
  934.             client.getSession().write(MaplePacketCreator.spawnPlayerMapobject(this));
  935.             for (int i = 0; i < 3; i++) {
  936.                 if (pets[i] != null) {
  937.                     client.getSession().write(MaplePacketCreator.showPet(this, pets[i], false, false));
  938.                 } else {
  939.                     break;
  940.                 }
  941.             }
  942.         }
  943.     }
  944.     private void recalcLocalStats() {
  945.         int oldmaxhp = localmaxhp;
  946.         localmaxhp = getMaxHp();
  947.         localmaxmp = getMaxMp();
  948.         localdex = getDex();
  949.         localint = getInt();
  950.         localstr = getStr();
  951.         localluk = getLuk();
  952.         int speed = 100;
  953.         int jump = 100;
  954.         magic = localint;
  955.         watk = 0;
  956.         wdef = 0;
  957.         mdef = 0;
  958.         for (IItem item : getInventory(MapleInventoryType.EQUIPPED)) {
  959.             IEquip equip = (IEquip) item;
  960.             localmaxhp += equip.getHp();
  961.             localmaxmp += equip.getMp();
  962.             localdex += equip.getDex();
  963.             localint += equip.getInt();
  964.             localstr += equip.getStr();
  965.             localluk += equip.getLuk();
  966.             magic += equip.getMatk() + equip.getInt();
  967.             watk += equip.getWatk();
  968.             speed += equip.getSpeed();
  969.             jump += equip.getJump();
  970.             wdef += equip.getWdef();
  971.             mdef += equip.getMdef();
  972.         }
  973.         magic = Math.min(magic, 2000);
  974.         Integer hbhp = getBuffedValue(MapleBuffStat.HYPERBODYHP);
  975.         if (hbhp != null) {
  976.             localmaxhp += (hbhp.doubleValue() / 100) * localmaxhp;
  977.         }
  978.         Integer hbmp = getBuffedValue(MapleBuffStat.HYPERBODYMP);
  979.         if (hbmp != null) {
  980.             localmaxmp += (hbmp.doubleValue() / 100) * localmaxmp;
  981.         }
  982.         localmaxhp = Math.min(30000, localmaxhp);
  983.         localmaxmp = Math.min(30000, localmaxmp);
  984.         Integer watkbuff = getBuffedValue(MapleBuffStat.WATK);
  985.         if (watkbuff != null) {
  986.             watk += watkbuff.intValue();
  987.         }
  988.         if (job.isA(MapleJob.BOWMAN)) {
  989.             ISkill expert = null;
  990.             if (job.isA(MapleJob.CROSSBOWMASTER)) {
  991.                 expert = SkillFactory.getSkill(3220004);
  992.             } else if (job.isA(MapleJob.BOWMASTER)) {
  993.                 expert = SkillFactory.getSkill(3120005);
  994.             }
  995.             if (expert != null) {
  996.                 int boostLevel = getSkillLevel(expert);
  997.                 if (boostLevel > 0) {
  998.                     watk += expert.getEffect(boostLevel).getX();
  999.                 }
  1000.             }
  1001.         }
  1002.         Integer matkbuff = getBuffedValue(MapleBuffStat.MATK);
  1003.         if (matkbuff != null) {
  1004.             magic += matkbuff.intValue();
  1005.         }
  1006.         Integer speedbuff = getBuffedValue(MapleBuffStat.SPEED);
  1007.         if (speedbuff != null) {
  1008.             speed += speedbuff.intValue();
  1009.         }
  1010.         Integer jumpbuff = getBuffedValue(MapleBuffStat.JUMP);
  1011.         if (jumpbuff != null) {
  1012.             jump += jumpbuff.intValue();
  1013.         }
  1014.         if (speed > 140) {
  1015.             speed = 140;
  1016.         }
  1017.         if (jump > 123) {
  1018.             jump = 123;
  1019.         }
  1020.         speedMod = speed / 100.0;
  1021.         jumpMod = jump / 100.0;
  1022.         Integer mount = getBuffedValue(MapleBuffStat.MONSTER_RIDING);
  1023.         if (mount != null) {
  1024.             jumpMod = 1.23;
  1025.             switch (mount.intValue()) {
  1026.                 case 1:
  1027.                     speedMod = 1.5;
  1028.                     break;
  1029.                 case 2:
  1030.                     speedMod = 1.7;
  1031.                     break;
  1032.                 case 3:
  1033.                     speedMod = 1.8;
  1034.                     break;
  1035.                 case 5:
  1036.                     speedMod = 1.0;
  1037.                     jumpMod = 1.0;
  1038.                     break;
  1039.                 default:
  1040.                     speedMod = 2.0;
  1041.             }
  1042.         }
  1043.         localmaxbasedamage = calculateMaxBaseDamage(watk);
  1044.         if (oldmaxhp != 0 && oldmaxhp != localmaxhp) {
  1045.             updatePartyMemberHP();
  1046.         }
  1047.     }
  1048.     public void Mount(int id, int skillid) {
  1049.         maplemount = new MapleMount(this, id, skillid);
  1050.     }
  1051.     public MapleMount getMount() {
  1052.         return maplemount;
  1053.     }
  1054.     public void equipChanged() {
  1055.         getMap().broadcastMessage(this, MaplePacketCreator.updateCharLook(this), false);
  1056.         recalcLocalStats();
  1057.         enforceMaxHpMp();
  1058.         if (getClient().getPlayer().getMessenger() != null) {
  1059.             WorldChannelInterface wci = ChannelServer.getInstance(getClient().getChannel()).getWorldInterface();
  1060.             try {
  1061.                 wci.updateMessenger(getClient().getPlayer().getMessenger().getId(), getClient().getPlayer().getName(), getClient().getChannel());
  1062.             } catch (RemoteException e) {
  1063.                 getClient().getChannelServer().reconnectWorld();
  1064.             }
  1065.         }
  1066.     }
  1067.     public MaplePet getPet(int index) {
  1068.         return pets[index];
  1069.     }
  1070.     public void addPet(MaplePet pet) {
  1071.         for (int i = 0; i < 3; i++) {
  1072.             if (pets[i] == null) {
  1073.                 pets[i] = pet;
  1074.                 return;
  1075.             }
  1076.         }
  1077.     }
  1078.     public void removePet(MaplePet pet, boolean shift_left) {
  1079.         int slot = -1;
  1080.         for (int i = 0; i < 3; i++) {
  1081.             if (pets[i] != null) {
  1082.                 if (pets[i].getUniqueId() == pet.getUniqueId()) {
  1083.                     pets[i] = null;
  1084.                     slot = i;
  1085.                     break;
  1086.                 }
  1087.             }
  1088.         }
  1089.         if (shift_left) {
  1090.             if (slot > -1) {
  1091.                 for (int i = slot; i < 3; i++) {
  1092.                     if (i != 2) {
  1093.                         pets[i] = pets[i + 1];
  1094.                     } else {
  1095.                         pets[i] = null;
  1096.                     }
  1097.                 }
  1098.             }
  1099.         }
  1100.     }
  1101.     public int getNoPets() {
  1102.         int ret = 0;
  1103.         for (int i = 0; i < 3; i++) {
  1104.             if (pets[i] != null) {
  1105.                 ret++;
  1106.             } else {
  1107.                 break;
  1108.             }
  1109.         }
  1110.         return ret;
  1111.     }
  1112.     public int getPetIndex(MaplePet pet) {
  1113.         for (int i = 0; i < 3; i++) {
  1114.             if (pets[i] != null) {
  1115.                 if (pets[i].getUniqueId() == pet.getUniqueId()) {
  1116.                     return i;
  1117.                 }
  1118.             } else {
  1119.                 break;
  1120.             }
  1121.         }
  1122.         return -1;
  1123.     }
  1124.     public int getPetIndex(int petId) {
  1125.         for (int i = 0; i < 3; i++) {
  1126.             if (pets[i] != null) {
  1127.                 if (pets[i].getUniqueId() == petId) {
  1128.                     return i;
  1129.                 }
  1130.             } else {
  1131.                 break;
  1132.             }
  1133.         }
  1134.         return -1;
  1135.     }
  1136.     public int getNextEmptyPetIndex() {
  1137.         for (int i = 0; i < 3; i++) {
  1138.             if (pets[i] == null) {
  1139.                 return i;
  1140.             }
  1141.         }
  1142.         return 3;
  1143.     }
  1144.     public MaplePet[] getPets() {
  1145.         return pets;
  1146.     }
  1147.     public void unequipAllPets() {
  1148.         for (int i = 0; i < 3; i++) {
  1149.             if (pets[i] != null) {
  1150.                 unequipPet(pets[i], true);
  1151.                 cancelFullnessSchedule(i);
  1152.             } else {
  1153.                 break;
  1154.             }
  1155.         }
  1156.     }
  1157.     public void unequipPet(MaplePet pet, boolean shift_left) {
  1158.         unequipPet(pet, shift_left, false);
  1159.     }
  1160.     public void unequipPet(MaplePet pet, boolean shift_left, boolean hunger) {
  1161.         cancelFullnessSchedule(getPetIndex(pet));
  1162.         pet.saveToDb();
  1163.         // Broadcast the packet to the map - with null instead of MaplePet
  1164.         getMap().broadcastMessage(this, MaplePacketCreator.showPet(this, pet, true, hunger), true);
  1165.         // Make a new list for the stat updates
  1166.         List<Pair<MapleStat, Integer>> stats = new ArrayList<Pair<MapleStat, Integer>>();
  1167.         stats.add(new Pair<MapleStat, Integer>(MapleStat.PET, Integer.valueOf(0)));
  1168.         // Write the stat update to the player...
  1169.         getClient().getSession().write(MaplePacketCreator.petStatUpdate(this));
  1170.         getClient().getSession().write(MaplePacketCreator.enableActions());
  1171.         // Un-assign the pet set to the player
  1172.         removePet(pet, shift_left);
  1173.     }
  1174.     public void shiftPetsRight() {
  1175.         if (pets[2] == null) {
  1176.             pets[2] = pets[1];
  1177.             pets[1] = pets[0];
  1178.             pets[0] = null;
  1179.         }
  1180.     }
  1181.     public FameStatus canGiveFame(MapleCharacter from) {
  1182.         if (lastfametime >= System.currentTimeMillis() - 60 * 60 * 24 * 1000) {
  1183.             return FameStatus.NOT_TODAY;
  1184.         } else if (lastmonthfameids.contains(Integer.valueOf(from.getId()))) {
  1185.             return FameStatus.NOT_THIS_MONTH;
  1186.         } else {
  1187.             return FameStatus.OK;
  1188.         }
  1189.     }
  1190.     public void hasGivenFame(MapleCharacter to) {
  1191.         lastfametime = System.currentTimeMillis();
  1192.         lastmonthfameids.add(Integer.valueOf(to.getId()));
  1193.         Connection con = DatabaseConnection.getConnection();
  1194.         try {
  1195.             PreparedStatement ps = con.prepareStatement("INSERT INTO famelog (characterid, characterid_to) VALUES (?, ?)");
  1196.             ps.setInt(1, getId());
  1197.             ps.setInt(2, to.getId());
  1198.             ps.executeUpdate();
  1199.             ps.close();
  1200.         } catch (SQLException e) {
  1201.             System.err.println("ERROR writing famelog for char " + getName() + " to " + to.getName());
  1202.         }
  1203.     }
  1204.     public MapleParty getParty() {
  1205.         return party;
  1206.     }
  1207.     public int getPartyId() {
  1208.         return (party != null ? party.getId() : -1);
  1209.     }
  1210.     public int getWorld() {
  1211.         return world;
  1212.     }
  1213.     public void setWorld(int world) {
  1214.         this.world = world;
  1215.     }
  1216.     public void setParty(MapleParty party) {
  1217.         this.party = party;
  1218.     }
  1219.     public MapleTrade getTrade() {
  1220.         return trade;
  1221.     }
  1222.     public void setTrade(MapleTrade trade) {
  1223.         this.trade = trade;
  1224.     }
  1225.     public EventInstanceManager getEventInstance() {
  1226.         return eventInstance;
  1227.     }
  1228.     public void setEventInstance(EventInstanceManager eventInstance) {
  1229.         this.eventInstance = eventInstance;
  1230.     }
  1231.     public void addDoor(MapleDoor door) {
  1232.         doors.add(door);
  1233.     }
  1234.     public void clearDoors() {
  1235.         doors.clear();
  1236.     }
  1237.     public List<MapleDoor> getDoors() {
  1238.         return new ArrayList<MapleDoor>(doors);
  1239.     }
  1240.     public boolean canDoor() {
  1241.         return canDoor;
  1242.     }
  1243.     public void disableDoor() {
  1244.         canDoor = false;
  1245.         TimerManager tMan = TimerManager.getInstance();
  1246.         tMan.schedule(new Runnable() {
  1247.             @Override
  1248.             public void run() {
  1249.                 canDoor = true;
  1250.             }
  1251.         }, 5000);
  1252.     }
  1253.     public Map<Integer, MapleSummon> getSummons() {
  1254.         return summons;
  1255.     }
  1256.     public int getChair() {
  1257.         return chair;
  1258.     }
  1259.     public int getItemEffect() {
  1260.         return itemEffect;
  1261.     }
  1262.     public void setChair(int chair) {
  1263.         this.chair = chair;
  1264.     }
  1265.     public void setItemEffect(int itemEffect) {
  1266.         this.itemEffect = itemEffect;
  1267.     }
  1268.     @Override
  1269.     public Collection<MapleInventory> allInventories() {
  1270.         return Arrays.asList(inventory);
  1271.     }
  1272.     @Override
  1273.     public MapleMapObjectType getType() {
  1274.         return MapleMapObjectType.PLAYER;
  1275.     }
  1276.     public int getGuildId() {
  1277.         return guildid;
  1278.     }
  1279.     public int getGuildRank() {
  1280.         return guildrank;
  1281.     }
  1282.     public void setGuildId(int _id) {
  1283.         guildid = _id;
  1284.         if (guildid > 0) {
  1285.             if (mgc == null) {
  1286.                 mgc = new MapleGuildCharacter(this);
  1287.             } else {
  1288.                 mgc.setGuildId(guildid);
  1289.             }
  1290.         } else {
  1291.             mgc = null;
  1292.         }
  1293.     }
  1294.     public void setGuildRank(int _rank) {
  1295.         guildrank = _rank;
  1296.         if (mgc != null) {
  1297.             mgc.setGuildRank(_rank);
  1298.         }
  1299.     }
  1300.     public void setAllianceRank(int rank) {
  1301.         allianceRank = rank;
  1302.         if (mgc != null) {
  1303.             mgc.setAllianceRank(rank);
  1304.         }
  1305.     }
  1306.     public int getAllianceRank() {
  1307.         return this.allianceRank;
  1308.     }
  1309.     public MapleGuildCharacter getMGC() {
  1310.         return mgc;
  1311.     }
  1312.     public void guildUpdate() {
  1313.         if (this.guildid <= 0) {
  1314.             return;
  1315.         }
  1316.         mgc.setLevel(this.level);
  1317.         mgc.setJobId(this.job.getId());
  1318.         try {
  1319.             this.client.getChannelServer().getWorldInterface().memberLevelJobUpdate(this.mgc);
  1320.             int allianceId = getGuild().getAllianceId();
  1321.             if (allianceId > 0) {
  1322.                 client.getChannelServer().getWorldInterface().allianceMessage(allianceId, MaplePacketCreator.updateAllianceJobLevel(this), getId(), -1);
  1323.             }
  1324.         } catch (RemoteException re) {
  1325.             System.err.println("RemoteExcept while trying to update level/job in guild.");
  1326.         }
  1327.     }
  1328.     private NumberFormat nf = new DecimalFormat("#,###,###,###");
  1329.     public String guildCost() {
  1330.         return nf.format(MapleGuild.CREATE_GUILD_COST);
  1331.     }
  1332.     public String emblemCost() {
  1333.         return nf.format(MapleGuild.CHANGE_EMBLEM_COST);
  1334.     }
  1335.     public String capacityCost() {
  1336.         return nf.format(MapleGuild.INCREASE_CAPACITY_COST);
  1337.     }
  1338.     public void genericGuildMessage(int code) {
  1339.         this.client.getSession().write(MaplePacketCreator.genericGuildMessage((byte) code));
  1340.     }
  1341.     public void disbandGuild() {
  1342.         if (guildid <= 0 || guildrank != 1) {
  1343.             log.warn(this.name + " tried to disband and s/he is either not in a guild or not leader.");
  1344.             return;
  1345.         }
  1346.         try {
  1347.             client.getChannelServer().getWorldInterface().disbandGuild(this.guildid);
  1348.         } catch (RemoteException e) {
  1349.             client.getChannelServer().reconnectWorld();
  1350.             System.err.println("Error while disbanding guild.");
  1351.         }
  1352.     }
  1353.     public void increaseGuildCapacity() {
  1354.         if (this.getMeso() < MapleGuild.INCREASE_CAPACITY_COST) {
  1355.             client.getSession().write(MaplePacketCreator.serverNotice(1, "You do not have enough mesos."));
  1356.             return;
  1357.         }
  1358.         if (this.guildid <= 0) {
  1359.             log.info(this.name + " is trying to increase guild capacity without being in the guild.");
  1360.             return;
  1361.         }
  1362.         try {
  1363.             client.getChannelServer().getWorldInterface().increaseGuildCapacity(this.guildid);
  1364.         } catch (RemoteException e) {
  1365.             client.getChannelServer().reconnectWorld();
  1366.             System.err.println("Error while increasing capacity.");
  1367.             return;
  1368.         }
  1369.         this.gainMeso(-MapleGuild.INCREASE_CAPACITY_COST, true, false, true);
  1370.     }
  1371.     public void saveGuildStatus() {
  1372.         Connection con = DatabaseConnection.getConnection();
  1373.         try {
  1374.             PreparedStatement ps = con.prepareStatement("UPDATE characters SET guildid = ?, guildrank = ?, allianceRank = ? WHERE id = ?");
  1375.             ps.setInt(1, this.guildid);
  1376.             ps.setInt(2, this.guildrank);
  1377.             ps.setInt(3, this.allianceRank);
  1378.             ps.setInt(4, this.id);
  1379.             ps.execute();
  1380.             ps.close();
  1381.         } catch (SQLException se) {
  1382.             System.err.println("SQL error: " + se.getLocalizedMessage());
  1383.         }
  1384.     }
  1385.     /**
  1386.      * Allows you to change someone's NXCash, Maple Points, and Gift Tokens!
  1387.      *
  1388.      * Created by Acrylic/Penguins
  1389.      *
  1390.      * @param type: 0 = NX, 1 = MP, 2 = GT
  1391.      * @param quantity: how much to modify it by. Negatives subtract points, Positives add points.
  1392.      */
  1393.     public void modifyCSPoints(int type, int quantity) {
  1394.         switch (type) {
  1395.             case 1:
  1396.                 this.paypalnx += quantity;
  1397.                 break;
  1398.             case 2:
  1399.                 this.maplepoints += quantity;
  1400.                 break;
  1401.             case 4:
  1402.                 this.cardnx += quantity;
  1403.                 break;
  1404.         }
  1405.     }
  1406.     public int getCSPoints(int type) {
  1407.         switch (type) {
  1408.             case 1:
  1409.                 return this.paypalnx;
  1410.             case 2:
  1411.                 return this.maplepoints;
  1412.             case 4:
  1413.                 return this.cardnx;
  1414.             default:
  1415.                 return 0;
  1416.         }
  1417.     }
  1418.     public boolean haveItem(int itemid, int quantity, boolean checkEquipped, boolean greaterOrEquals) {
  1419.         int possesed = getItemQuantity(itemid, checkEquipped);
  1420.         if (greaterOrEquals) {
  1421.             return possesed >= quantity;
  1422.         } else {
  1423.             return possesed == quantity;
  1424.         }
  1425.     }
  1426.      public void makeVip() {
  1427.     this.client.getSession().close();
  1428.     try {
  1429.       Connection con = DatabaseConnection.getConnection();
  1430.       PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1431.       ps.setInt(1, 1);
  1432.       ps.setInt(2, this.id);
  1433.       ps.executeUpdate();
  1434.       ps.close();
  1435.     }
  1436.     catch (SQLException ex) {
  1437.     }
  1438.   }
  1439.    public void unVip() {
  1440.     this.client.getSession().close();
  1441.     try {
  1442.       Connection con = DatabaseConnection.getConnection();
  1443.       PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1444.       ps.setInt(1, 0);
  1445.       ps.setInt(2, this.id);
  1446.       ps.executeUpdate();
  1447.       ps.close();
  1448.     } catch (SQLException ex) {
  1449.     }
  1450.   }
  1451.   public void makeVip2() {
  1452.     this.client.getSession().close();
  1453.     try {
  1454.       Connection con = DatabaseConnection.getConnection();
  1455.       PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1456.       ps.setInt(1, 2);
  1457.       ps.setInt(2, this.id);
  1458.       ps.executeUpdate();
  1459.       ps.close();
  1460.     }
  1461.     catch (SQLException ex) {
  1462.     }
  1463.   }
  1464.   public void makeVip3() {
  1465.     this.client.getSession().close();
  1466.     try {
  1467.       Connection con = DatabaseConnection.getConnection();
  1468.       PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1469.       ps.setInt(1, 3);
  1470.       ps.setInt(2, this.id);
  1471.       ps.executeUpdate();
  1472.       ps.close();
  1473.     } catch (SQLException ex) {
  1474.     }
  1475.   }
  1476.   public void makeVip4() {
  1477.     this.client.getSession().close();
  1478.     try {
  1479.       Connection con = DatabaseConnection.getConnection();
  1480.       PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1481.       ps.setInt(1, 4);
  1482.       ps.setInt(2, this.id);
  1483.       ps.executeUpdate();
  1484.       ps.close();
  1485.     }
  1486.     catch (SQLException ex) {
  1487.     }
  1488.   }
  1489.     private static class MapleBuffStatValueHolder {
  1490.         public MapleStatEffect effect;
  1491.         public long startTime;
  1492.         public int value;
  1493.         public ScheduledFuture<?> schedule;
  1494.         public MapleBuffStatValueHolder(MapleStatEffect effect, long startTime, ScheduledFuture<?> schedule, int value) {
  1495.             super();
  1496.             this.effect = effect;
  1497.             this.startTime = startTime;
  1498.             this.schedule = schedule;
  1499.             this.value = value;
  1500.         }
  1501.     }
  1502.     public static class MapleCoolDownValueHolder {
  1503.         public int skillId;
  1504.         public long startTime;
  1505.         public long length;
  1506.         public ScheduledFuture<?> timer;
  1507.         public MapleCoolDownValueHolder(int skillId, long startTime, long length, ScheduledFuture<?> timer) {
  1508.             super();
  1509.             this.skillId = skillId;
  1510.             this.startTime = startTime;
  1511.             this.length = length;
  1512.             this.timer = timer;
  1513.         }
  1514.     }
  1515.     public static class SkillEntry {
  1516.         public int skillevel;
  1517.         public int masterlevel;
  1518.         public SkillEntry(int skillevel, int masterlevel) {
  1519.             this.skillevel = skillevel;
  1520.             this.masterlevel = masterlevel;
  1521.         }
  1522.         @Override
  1523.         public String toString() {
  1524.             return skillevel + ":" + masterlevel;
  1525.         }
  1526.     }
  1527.     public enum FameStatus {
  1528.         OK, NOT_TODAY, NOT_THIS_MONTH
  1529.     }
  1530.     public int getBuddyCapacity() {
  1531.         return buddylist.getCapacity();
  1532.     }
  1533.     public void setBuddyCapacity(int capacity) {
  1534.         buddylist.setCapacity(capacity);
  1535.         client.getSession().write(MaplePacketCreator.updateBuddyCapacity(capacity));
  1536.     }
  1537.     public MapleMessenger getMessenger() {
  1538.         return messenger;
  1539.     }
  1540.     public void setMessenger(MapleMessenger messenger) {
  1541.         this.messenger = messenger;
  1542.     }
  1543.     public void checkMessenger() {
  1544.         if (messenger != null && messengerposition < 4 && messengerposition > -1) {
  1545.             try {
  1546.                 WorldChannelInterface wci = ChannelServer.getInstance(client.getChannel()).getWorldInterface();
  1547.                 MapleMessengerCharacter messengerplayer = new MapleMessengerCharacter(client.getPlayer(), messengerposition);
  1548.                 wci.silentJoinMessenger(messenger.getId(), messengerplayer, messengerposition);
  1549.                 wci.updateMessenger(getClient().getPlayer().getMessenger().getId(), getClient().getPlayer().getName(), getClient().getChannel());
  1550.             } catch (RemoteException e) {
  1551.                 client.getChannelServer().reconnectWorld();
  1552.             }
  1553.         }
  1554.     }
  1555.     public int getMessengerPosition() {
  1556.         return messengerposition;
  1557.     }
  1558.     public void setMessengerPosition(int position) {
  1559.         this.messengerposition = position;
  1560.     }
  1561.     public int hasEXPCard() {
  1562.         int hr = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);  //增加时间函数
  1563.         if ((haveItem(5211048) && hr > 0 && hr < 24)
  1564.                 || (haveItem(5211000) && hr > 17 && hr < 21)
  1565.                 || (haveItem(5211014) && hr > 6 && hr < 12)
  1566.                 || (haveItem(5211015) && hr > 9 && hr < 15)
  1567.                 || (haveItem(5211016) && hr > 12 && hr < 18)
  1568.                 || (haveItem(5211017) && hr > 15 && hr < 21)
  1569.                 || (haveItem(5211018) && hr > 14)
  1570.                 || (haveItem(5211039) && hr < 5)
  1571.                 || (haveItem(5211042) && hr > 2 && hr < 8)
  1572.                 || (haveItem(5211045) && hr > 5 && hr < 11)) {
  1573.             return 2;
  1574.         }
  1575.         return 1;
  1576.     }
  1577.     public void setInCS(boolean yesno) {
  1578.         this.incs = yesno;
  1579.     }
  1580.     public boolean inCS() {
  1581.         return this.incs;
  1582.     }
  1583.     public void setInMTS(boolean yesno) {
  1584.         this.inmts = yesno;
  1585.     }
  1586.     public boolean inMTS() {
  1587.         return this.inmts;
  1588.     }
  1589.     public void addCooldown(int skillId, long startTime, long length, ScheduledFuture<?> timer) {
  1590.         if (this.coolDowns.containsKey(Integer.valueOf(skillId))) {
  1591.             this.coolDowns.remove(skillId);
  1592.         }
  1593.         this.coolDowns.put(Integer.valueOf(skillId), new MapleCoolDownValueHolder(skillId, startTime, length, timer));
  1594.     }
  1595.     public void removeCooldown(int skillId) {
  1596.         if (this.coolDowns.containsKey(Integer.valueOf(skillId))) {
  1597.             this.coolDowns.remove(Integer.valueOf(skillId));
  1598.             client.getSession().write(MaplePacketCreator.skillCooldown(skillId, 0));
  1599.         }
  1600.     }
  1601.     public boolean skillisCooling(int skillId) {
  1602.         return this.coolDowns.containsKey(Integer.valueOf(skillId));
  1603.     }
  1604.     public void giveCoolDowns(final List<PlayerCoolDownValueHolder> cooldowns) {
  1605.         for (PlayerCoolDownValueHolder cooldown : cooldowns) {
  1606.             int time = (int) ((cooldown.length + cooldown.startTime) - System.currentTimeMillis());
  1607.             ScheduledFuture<?> timer = TimerManager.getInstance().schedule(new CancelCooldownAction(this, cooldown.skillId), time);
  1608.             addCooldown(cooldown.skillId, System.currentTimeMillis(), time, timer);
  1609.         }
  1610.     }
  1611.     public void giveCoolDowns(final int skillid, long starttime, long length) {
  1612.         int time = (int) ((length + starttime) - System.currentTimeMillis());
  1613.         ScheduledFuture<?> timer = TimerManager.getInstance().schedule(new CancelCooldownAction(this, skillid), time);
  1614.         addCooldown(skillid, System.currentTimeMillis(), time, timer);
  1615.     }
  1616.     public List<PlayerCoolDownValueHolder> getAllCooldowns() {
  1617.         List<PlayerCoolDownValueHolder> ret = new ArrayList<PlayerCoolDownValueHolder>();
  1618.         for (MapleCoolDownValueHolder mcdvh : coolDowns.values()) {
  1619.             ret.add(new PlayerCoolDownValueHolder(mcdvh.skillId, mcdvh.startTime, mcdvh.length));
  1620.         }
  1621.         return ret;
  1622.     }
  1623.     public static class CancelCooldownAction implements Runnable {
  1624.         private int skillId;
  1625.         private WeakReference<MapleCharacter> target;
  1626.         public CancelCooldownAction(MapleCharacter target, int skillId) {
  1627.             this.target = new WeakReference<MapleCharacter>(target);
  1628.             this.skillId = skillId;
  1629.         }
  1630.         @Override
  1631.         public void run() {
  1632.             MapleCharacter realTarget = target.get();
  1633.             if (realTarget != null) {
  1634.                 realTarget.removeCooldown(skillId);
  1635.             }
  1636.         }
  1637.     }
  1638.     public void giveDebuff(MapleDisease disease, MobSkill skill) {
  1639.         if (!isGM()) {
  1640.             synchronized (diseases) {
  1641.                 if (isAlive() && !isActiveBuffedValue(2321005) && !diseases.contains(disease) && diseases.size() < 2) {
  1642.                     diseases.add(disease);
  1643.                     List<Pair<MapleDisease, Integer>> debuff = Collections.singletonList(new Pair<MapleDisease, Integer>(disease, Integer.valueOf(skill.getX())));
  1644.                     long mask = 0;
  1645.                     for (Pair<MapleDisease, Integer> statup : debuff) {
  1646.                         mask |= statup.getLeft().getValue();
  1647.                     }
  1648.                     getClient().getSession().write(MaplePacketCreator.giveDebuff(mask, debuff, skill));
  1649.                     getMap().broadcastMessage(this, MaplePacketCreator.giveForeignDebuff(id, mask, skill), false);
  1650.                     if (isAlive()) {
  1651.                         final MapleCharacter character = this;
  1652.                         final MapleDisease disease_ = disease;
  1653.                         TimerManager.getInstance().schedule(new Runnable() {
  1654.                             @Override
  1655.                             public void run() {
  1656.                                 if (character.diseases.contains(disease_)) {
  1657.                                     dispelDebuff(disease_);
  1658.                                 }
  1659.                             }
  1660.                         }, skill.getDuration());
  1661.                     }
  1662.                 }
  1663.             }
  1664.         }
  1665.     }
  1666.     public void dispelDebuff(MapleDisease debuff) {
  1667.         if (diseases.contains(debuff)) {
  1668.             diseases.remove(debuff);
  1669.             long mask = debuff.getValue();
  1670.             getClient().getSession().write(MaplePacketCreator.cancelDebuff(mask));
  1671.             getMap().broadcastMessage(this, MaplePacketCreator.cancelForeignDebuff(id, mask), false);
  1672.         }
  1673.     }
  1674.     public MapleCharacter getPartner() {
  1675.         return client.getChannelServer().getPlayerStorage().getCharacterById(partnerid);
  1676.     }
  1677.     public void dispelDebuffs() {
  1678.         MapleDisease[] disease = {MapleDisease.POISON, MapleDisease.SLOW, MapleDisease.SEAL, MapleDisease.DARKNESS, MapleDisease.WEAKEN, MapleDisease.CURSE};
  1679.         for (int i = 0; i < diseases.size(); i++) {
  1680.             if (diseases.contains(disease[i])) {
  1681.                 diseases.remove(disease);
  1682.                 long mask = 0;
  1683.                 for (MapleDisease statup : diseases) {
  1684.                     mask |= statup.getValue();
  1685.                 }
  1686.                 getClient().getSession().write(MaplePacketCreator.cancelDebuff(mask));
  1687.                 getMap().broadcastMessage(this, MaplePacketCreator.cancelForeignDebuff(id, mask), false);
  1688.             }
  1689.         }
  1690.     }
  1691.     public void setLevel(int level) {
  1692.         this.level = level - 1;
  1693.     }
  1694.     public void setMap(int PmapId) {
  1695.         this.mapid = PmapId;
  1696.     }
  1697.     public List<Integer> getQuestItemsToShow() {
  1698.         Set<Integer> delta = new HashSet<Integer>();
  1699.         for (Map.Entry<MapleQuest, MapleQuestStatus> questEntry : this.quests.entrySet()) {
  1700.             if (questEntry.getValue().getStatus() != MapleQuestStatus.Status.STARTED) {
  1701.                 delta.addAll(questEntry.getKey().getQuestItemsToShowOnlyIfQuestIsActivated());
  1702.             }
  1703.         }
  1704.         List<Integer> returnThis = new ArrayList<Integer>();
  1705.         returnThis.addAll(delta);
  1706.         return Collections.unmodifiableList(returnThis);
  1707.     }
  1708.     public void showNote() throws SQLException {
  1709.         Connection con = DatabaseConnection.getConnection();
  1710.         PreparedStatement ps = con.prepareStatement("SELECT * FROM notes WHERE `to`=?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
  1711.         ps.setInt(1, getId());
  1712.         ResultSet rs = ps.executeQuery();
  1713.         rs.last();
  1714.         int count = rs.getRow();
  1715.         rs.first();
  1716.         client.getSession().write(MaplePacketCreator.showNotes(rs, count));
  1717.         ps.close();
  1718.     }
  1719.     public int getMarriageQuestLevel() {
  1720.         return marriageQuestLevel;
  1721.     }
  1722.     public void setMarriageQuestLevel(int nf) {
  1723.         marriageQuestLevel = nf;
  1724.     }
  1725.     public void addMarriageQuestLevel() {
  1726.         marriageQuestLevel++;
  1727.     }
  1728.     public void subtractMarriageQuestLevel() {
  1729.         marriageQuestLevel -= 1;
  1730.     }
  1731.     public void setZakumLevel(int level) {
  1732.         this.zakumLvl = level;
  1733.     }
  1734.     public int getZakumLevel() {
  1735.         return this.zakumLvl;
  1736.     }
  1737.     public void addZakumLevel() {
  1738.         this.zakumLvl += 1;
  1739.     }
  1740.     public void subtractZakumLevel() {
  1741.         this.zakumLvl -= 1;
  1742.     }
  1743.     public void setPartnerId(int pem) {
  1744.         this.partnerid = pem;
  1745.     }
  1746.     public int getPartnerId() {
  1747.         return partnerid;
  1748.     }
  1749.     public void checkBerserk() {
  1750.         if (BerserkSchedule != null) {
  1751.             BerserkSchedule.cancel(false);
  1752.         }
  1753.         final MapleCharacter chr = this;
  1754.         ISkill BerserkX = SkillFactory.getSkill(1320006);
  1755.         final int skilllevel = getSkillLevel(BerserkX);
  1756.         if (chr.getJob().equals(MapleJob.DARKKNIGHT) && skilllevel >= 1) {
  1757.             MapleStatEffect ampStat = BerserkX.getEffect(skilllevel);
  1758.             int x = ampStat.getX();
  1759.             int HP = chr.getHp();
  1760.             int MHP = chr.getMaxHp();
  1761.             int ratio = HP * 100 / MHP;
  1762.             if (ratio > x) {
  1763.                 Berserk = false;
  1764.             } else {
  1765.                 Berserk = true;
  1766.             }
  1767.             BerserkSchedule = TimerManager.getInstance().register(new Runnable() {
  1768.                 @Override
  1769.                 public void run() {
  1770.                     getClient().getSession().write(MaplePacketCreator.showOwnBerserk(skilllevel, Berserk));
  1771.                     getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.showBerserk(getId(), skilllevel, Berserk), false);
  1772.                 }
  1773.             }, 5000, 3000);
  1774.         }
  1775.     }
  1776.     private void prepareBeholderEffect() {
  1777.         if (beholderHealingSchedule != null) {
  1778.             beholderHealingSchedule.cancel(false);
  1779.         }
  1780.         if (beholderBuffSchedule != null) {
  1781.             beholderBuffSchedule.cancel(false);
  1782.         }
  1783.         ISkill bHealing = SkillFactory.getSkill(1320008);
  1784.         if (getSkillLevel(bHealing) > 0) {
  1785.             final MapleStatEffect healEffect = bHealing.getEffect(getSkillLevel(bHealing));
  1786.             beholderHealingSchedule = TimerManager.getInstance().register(new Runnable() {
  1787.                 @Override
  1788.                 public void run() {
  1789.                     addHP(healEffect.getHp());
  1790.                     getClient().getSession().write(MaplePacketCreator.showOwnBuffEffect(1321007, 2));
  1791.                     getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.summonSkill(getId(), 1321007, 5), true);
  1792.                     getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.showBuffeffect(getId(), 1321007, 2, (byte) 3), false);
  1793.                 }
  1794.             }, healEffect.getX() * 1000, healEffect.getX() * 1000);
  1795.         }
  1796.         ISkill bBuffing = SkillFactory.getSkill(1320009);
  1797.         if (getSkillLevel(bBuffing) > 0) {
  1798.             final MapleStatEffect buffEffect = bBuffing.getEffect(getSkillLevel(bBuffing));
  1799.             beholderBuffSchedule = TimerManager.getInstance().register(new Runnable() {
  1800.                 @Override
  1801.                 public void run() {
  1802.                     buffEffect.applyTo(MapleCharacter.this);
  1803.                     getClient().getSession().write(MaplePacketCreator.beholderAnimation(getId(), 1320009));
  1804.                     getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.summonSkill(getId(), 1321007, (int) (Math.random() * 3) + 6), true);
  1805.                     getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.showBuffeffect(getId(), 1321007, 2, (byte) 3), false);
  1806.                 }
  1807.             }, buffEffect.getX() * 1000, buffEffect.getX() * 1000);
  1808.         }
  1809.     }
  1810.     public void setChalkboard(String text) {
  1811.         if (interaction != null) {
  1812.             return;
  1813.         }
  1814.         this.chalktext = text;
  1815.         for (FakeCharacter ch : fakes) {
  1816.             ch.getFakeChar().setChalkboard(text);
  1817.         }
  1818.         if (chalktext == null) {
  1819.             getMap().broadcastMessage(MaplePacketCreator.useChalkboard(this, true));
  1820.         } else {
  1821.             getMap().broadcastMessage(MaplePacketCreator.useChalkboard(this, false));
  1822.         }
  1823.     }
  1824.     public String getChalkboard() {
  1825.         return this.chalktext;
  1826.     }
  1827.     public void setDefaultKeyMap() {
  1828.         keymap.clear();
  1829.         int[] num1 = {2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 23, 25, 26, 27, 29, 31, 34, 35, 37, 38, 40, 41, 43, 44, 45, 46, 48, 50, 56, 57, 59, 60, 61, 62, 63, 64, 65};
  1830.         int[] num2 = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6};
  1831.         int[] num3 = {10, 12, 13, 18, 24, 21, 8, 5, 0, 4, 1, 19, 14, 15, 52, 2, 17, 11, 3, 20, 16, 23, 9, 50, 51, 6, 22, 7, 53, 54, 100, 101, 102, 103, 104, 105, 106};
  1832.         for (int i = 0; i < num1.length; i++) {
  1833.             keymap.put(Integer.valueOf(num1[i]), new MapleKeyBinding(num2[i], num3[i]));
  1834.         }
  1835.         sendKeymap();
  1836.     }
  1837.     public void setReborns(int amt) {
  1838.         reborns = amt;
  1839.     }
  1840. public void reloadFakeChars() {
  1841.         TimerManager.getInstance().schedule(new Runnable() {
  1842.             @Override
  1843.             public void run() {
  1844.                 for (int i = 0; i < 1 && i + getFakeChars().size() <= 6; i++) {
  1845.                     FakeCharacter fc = new FakeCharacter(getClient().getPlayer(), getId() + getFakeChars().size() + 1 + i);
  1846.                     getFakeChars().add(fc);
  1847.                     getClient().getChannelServer().addClone(fc);
  1848.                 }
  1849.             }
  1850.         }, 5000);
  1851.     }
  1852. public void upVip1() {
  1853.              client.getSession().close();
  1854. try {
  1855. Connection con = DatabaseConnection.getConnection();
  1856. PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1857. ps.setInt(1, 1);
  1858. ps.setInt(2, id);
  1859. ps.executeUpdate();
  1860. ps.close();
  1861. } catch (SQLException ex) {
  1862. System.err.println("Error while changing status"+ ex);
  1863. }
  1864. }
  1865. public void upVip2() {
  1866.              client.getSession().close();
  1867. try {
  1868. Connection con = DatabaseConnection.getConnection();
  1869. PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1870. ps.setInt(1, 2);
  1871. ps.setInt(2, id);
  1872. ps.executeUpdate();
  1873. ps.close();
  1874. } catch (SQLException ex) {
  1875. System.err.println("Error while changing status"+ ex);
  1876. }
  1877. }
  1878.     public void upVip3() {
  1879.              client.getSession().close();
  1880. try {
  1881. Connection con = DatabaseConnection.getConnection();
  1882. PreparedStatement ps = con.prepareStatement("UPDATE characters SET vip = ? WHERE id = ?");
  1883. ps.setInt(1, 3);
  1884. ps.setInt(2, id);
  1885. ps.executeUpdate();
  1886. ps.close();
  1887. } catch (SQLException ex) {
  1888. System.err.println("Error while changing status"+ ex);
  1889. }
  1890. }
  1891. public boolean isApprovedList() {
  1892.         String[] approvedArray = {"Administrator", "Admin"};
  1893.         for (String approved : approvedArray) {
  1894.             if (getName().equals(approved)) {
  1895.                 return true;
  1896.             }
  1897.         }
  1898.         return false;
  1899.     }
  1900. public int gmLevel() {
  1901.         return gmLevel;
  1902.     }
  1903. public void gainExp(int gain, boolean show, boolean inChat, boolean white, boolean etcLose) {
  1904.         int levelCap = getClient().getChannelServer().getLevelCap();
  1905.         if (!etcLose && gain < 0) {
  1906.             gain += Integer.MAX_VALUE;
  1907.             if (getLevel() < levelCap) levelUp();
  1908.             while (gain > 0) {
  1909.                 gain -= (ExpTable.getExpNeededForLevel(level) - this.exp.get());
  1910.                 if (getLevel() < levelCap) levelUp();
  1911.             }
  1912.             setExp(0);
  1913.             updateSingleStat(MapleStat.EXP, exp.get());
  1914.             client.getSession().write(MaplePacketCreator.getShowExpGain(Integer.MAX_VALUE, inChat, white));
  1915.             return;
  1916.         }
  1917.         if (getLevel() < levelCap) {
  1918.             if ((long) this.exp.get() + (long) gain > (long) Integer.MAX_VALUE) {
  1919.                 int gainFirst = ExpTable.getExpNeededForLevel(level) - this.exp.get();
  1920.                 gain -= gainFirst + 1;
  1921.                 this.gainExp(gainFirst + 1, false, inChat, white);
  1922.             }
  1923.             updateSingleStat(MapleStat.EXP, this.exp.addAndGet(gain));
  1924.         } else {
  1925.             return;
  1926.         }
  1927.         if (show && gain != 0) {
  1928.             client.getSession().write(MaplePacketCreator.getShowExpGain(gain, inChat, white));
  1929.         }
  1930.         if (level < levelCap && exp.get() >= ExpTable.getExpNeededForLevel(level)) {
  1931.            if (getClient().getChannelServer().getMultiLevel()) {
  1932.                 while (level < levelCap && exp.get() >= ExpTable.getExpNeededForLevel(level)) {
  1933.                     levelUp();
  1934.                 }
  1935.             } else {
  1936.                 levelUp();
  1937.                 int need = ExpTable.getExpNeededForLevel(level);
  1938.                 if (exp.get() >= need) {
  1939.                     setExp(need - 1);
  1940.                     updateSingleStat(MapleStat.EXP, exp.get());
  1941.                 }
  1942.             }
  1943.         }
  1944.     }
  1945. public void setvip(int r) {
  1946.         this.vip = r;
  1947.     }
  1948. public MaplePlayerShop getPlayerShop() {
  1949.         return playerShop;
  1950.     }
  1951.     public void setPvpDeaths(int amount) {
  1952.         pvpdeaths = amount;
  1953.     }
  1954.     public void setPvpKills(int amount) {
  1955.         pvpkills = amount;
  1956.     }
  1957.     public void gainPvpDeath() {
  1958.         pvpdeaths += 1;
  1959.     }
  1960.     public void gainPvpKill() {
  1961.         pvpkills += 1;
  1962.     }
  1963.     public boolean getCanSmega() {
  1964.         return canSmega;
  1965.     }
  1966.     public void setCanSmega(boolean yn) {
  1967.         canSmega = yn;
  1968.     }
  1969.     public boolean getSmegaEnabled() {
  1970.         return smegaEnabled;
  1971.     }
  1972.     public void setSmegaEnabled(boolean yn) {
  1973.         smegaEnabled = yn;
  1974.     }
  1975.     public boolean getCanTalk() {
  1976.         return canTalk;
  1977.     }
  1978.     public boolean canTalk(boolean yn) {
  1979.         return canTalk = yn;
  1980.     }
  1981.     public int getPvpKills() {
  1982.         return pvpkills;
  1983.     }
  1984. public int getEngagerId() throws SQLException {
  1985.         return getIdByName(getEngager(), 0);
  1986.     }
  1987. public IItem lockitem(int slot, boolean lock) {
  1988.         byte set = (byte) 0;
  1989.         byte eqslot = (byte) slot;
  1990.         ServernoticeMapleClientMessageCallback cm = new ServernoticeMapleClientMessageCallback(this.getClient());
  1991.         Equip nEquip = (Equip) this.getInventory(MapleInventoryType.EQUIP).getItem(eqslot);
  1992.         if (nEquip != null) {
  1993.             if (lock) {
  1994.                 set = (byte) 1;
  1995.                 cm.dropMessage("物品 " + slot + " 锁定成功");
  1996.             } else {
  1997.                 cm.dropMessage("物品 " + slot + " 解锁成功");
  1998.             }
  1999.             nEquip.setLocked(set);
  2000.             getClient().getSession().write(MaplePacketCreator.getCharInfo(this));
  2001.             getMap().removePlayer(this);
  2002.             getMap().addPlayer(this);
  2003.         } else {
  2004.             cm.dropMessage("Item Slot " + slot + " Equip Null.");
  2005.         }
  2006.         return nEquip;
  2007.     }
  2008.     public int itemid(int slot) {
  2009.         byte eqslot = (byte) slot;
  2010.         int itemid = 0;
  2011.         ServernoticeMapleClientMessageCallback cm = new ServernoticeMapleClientMessageCallback(this.getClient());
  2012.         Equip nEquip = (Equip) this.getInventory(MapleInventoryType.EQUIP).getItem(eqslot);
  2013.         if (nEquip != null)
  2014.             itemid = nEquip.getItemId();
  2015.          else
  2016.             cm.dropMessage("Item Slot " + slot + " Equip Null.");
  2017.         return itemid;
  2018.     }
  2019.     public MapleGuild getGuild() {
  2020.         try {
  2021.             return getClient().getChannelServer().getWorldInterface().getGuild(getGuildId(), null);
  2022.         } catch (RemoteException ex) {
  2023.             client.getChannelServer().reconnectWorld();
  2024.         }
  2025.         return null;
  2026.     }
  2027.     public void gainGP(int amount) {
  2028.         getGuild().gainGP(amount);
  2029.     }
  2030.     public int getBombPoints() {
  2031.         return bombpoints;
  2032.     }
  2033.     public void setBombPoints(int bombpoints) {
  2034.         this.bombpoints = bombpoints;
  2035.     }
  2036.     public void addBuddyCapacity(int capacity) {
  2037.         buddylist.addCapacity(capacity);
  2038.         client.getSession().write(MaplePacketCreator.updateBuddyCapacity(getBuddyCapacity()));
  2039.     }
  2040.     public void maxSkill(int skillid) {
  2041.         if (Math.floor(skillid / 10000) == getJob().getId() || isGM() || skillid < 2000) { // lmao im lazy
  2042.             ISkill skill_ = SkillFactory.getSkill(skillid);
  2043.             int maxlevel = skill_.getMaxLevel(); // TODO - Find a less laggy way.. our xml style skill maxer was fine T____T
  2044.             changeSkillLevel(skill_, maxlevel, maxlevel);
  2045.         }
  2046.     }
  2047.     public void maxAllSkills() {
  2048.         int[] skillId = {8, /*1000, 1001, 1002,*/ 1003, 1004, 1000000, 1000001, 1000002, 1001003, 1001004, 1001005, 2000000, 2000001,
  2049.             2001002, 2001003, 2001004, 2001005, 3000000, 3000001, 3000002, 3001003, 3001004, 3001005, 4000000, 4000001, 4001002, 4001003,
  2050.             4001334, 4001344, 1100000, 1100001, 1100002, 1100003, 1101004, 1101005, 1101006, 1101007, 1200000, 1200001, 1200002, 1200003,
  2051.             1201004, 1201005, 1201006, 1201007, 1300000, 1300001, 1300002, 1300003, 1301004, 1301005, 1301006, 1301007, 2100000, 2101001,
  2052.             2101002, 2101003, 2101004, 2101005, 2200000, 2201001, 2201002, 2201003, 2201004, 2201005, 2300000, 2301001, 2301002, 2301003,
  2053.             2301004, 2301005, 3100000, 3100001, 3101002, 3101003, 3101004, 3101005, 3200000, 3200001, 3201002, 3201003, 3201004, 3201005,
  2054.             4100000, 4100001, 4100002, 4101003, 4101004, 4101005, 4200000, 4200001, 4201002, 4201003, 4201004, 4201005, 1110000, 1110001,
  2055.             1111002, 1111003, 1111004, 1111005, 1111006, 1111007, 1111008, 1210000, 1210001, 1211002, 1211003, 1211004, 1211005, 1211006,
  2056.             1211007, 1211008, 1211009, 1310000, 1311001, 1311002, 1311003, 1311004, 1311005, 1311006, 1311007, 1311008, 2110000, 2110001,
  2057.             2111002, 2111003, 2111004, 2111005, 2111006, 2210000, 2210001, 2211002, 2211003, 2211004, 2211005, 2211006, 2310000, 2311001,
  2058.             2311002, 2311003, 2311004, 2311005, 2311006, 3110000, 3110001, 3111002, 3111003, 3111004, 3111005, 3111006, 3210000, 3210001,
  2059.             3211002, 3211003, 3211004, 3211005, 3211006, 4110000, 4111001, 4111002, 4111003, 4111004, 4111005, 4111006, 4210000, 4211001,
  2060.             4211002, 4211003, 4211004, 4211005, 4211006, 1120003, 1120004, 1120005, 1121000, 1121001, 1121002, 1121006, 1121008, 1121010,
  2061.             1121011, 1220005, 1220006, 1220010, 1221000, 1221001, 1221002, 1221003, 1221004, 1221007, 1221009, 1221011, 1221012, 1320005,
  2062.             1320006, 1320008, 1320009, 1321000, 1321001, 1321002, 1321003, 1321007, 1321010, 2121000, 2121001, 2121002, 2121003, 2121004,
  2063.             2121005, 2121006, 2121007, 2121008, 2221000, 2221001, 2221002, 2221003, 2221004, 2221005, 2221006, 2221007, 2221008, 2321000,
  2064.             2321001, 2321002, 2321003, 2321004, 2321005, 2321006, 2321007, 2321008, 2321009, 3120005, 3121000, 3121002, 3121003, 3121004,
  2065.             3121006, 3121007, 3121008, 3121009, 3220004, 3221000, 3221001, 3221002, 3221003, 3221005, 3221006, 3221007, 3221008, 4120002,
  2066.             4120005, 4121000, 4121003, 4121004, 4121006, 4121007, 4121008, 4121009, 4220002, 4220005, 4221000, 4221001, 4221003, 4221004,
  2067.             4221006, 4221007, 4221008, 5000000, 5001001, 5001002, 5001003, 5001005, 5100000, 5100001, 5101002, 5101003, 5101004, 5101005,
  2068.             5101006, 5101007, 5200000, 5201001, 5201002, 5201003, 5201004, 5201005, 5201006, 5110000, 5110001, 5111002, 5111004, 5111005,
  2069.             5111006, 5220011, 5221010, 5221009, 5221008, 5221007, 5221006, 5221004, 5221003, 5220002, 5220001, 5221000, 5121010, 5121009,
  2070.             5121008, 5121007, 5121005, 5121004, 5121003, 5121002, 5121001, 5121000, 5211006, 5211005, 5211004, 5211002, 5211001, 5210000,
  2071.             9001000, 9001001, 9001002, 9101000, 9101001, 9101002, 9101003, 9101004, 9101005, 9101006, 9101007, 9101008
  2072.         };
  2073.         for (int skillzors_ : skillId) {
  2074.             maxSkill(skillzors_);
  2075.         }
  2076.     }
  2077.     public void unequipEverything() {
  2078.         MapleInventory equipped = this.getInventory(MapleInventoryType.EQUIPPED);
  2079.         List<Byte> position = new ArrayList<Byte>();
  2080.         for (IItem item : equipped.list()) {
  2081.             position.add(item.getPosition());
  2082.         }
  2083.         for (byte pos : position) {
  2084.             MapleInventoryManipulator.unequip(client, pos, getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
  2085.         }
  2086.     }
  2087.     public void setOffOnline(boolean online) {
  2088.         try {
  2089.             WorldChannelInterface wci = client.getChannelServer().getWorldInterface();
  2090.             if (online) { // Ugh should be one function --.
  2091.                 wci.loggedOn(getName(), getId(), client.getChannel(), getBuddylist().getBuddyIds());
  2092.             } else {
  2093.                 wci.loggedOff(getName(), getId(), client.getChannel(), getBuddylist().getBuddyIds());
  2094.             }
  2095.         } catch (RemoteException e) {
  2096.             client.getChannelServer().reconnectWorld();
  2097.         }
  2098.     }
  2099.     public static boolean unban(String name) {
  2100.         try {
  2101.             int accountid = -1;
  2102.             Connection con = DatabaseConnection.getConnection();
  2103.             PreparedStatement ps = con.prepareStatement("SELECT accountid FROM characters WHERE name = ?");
  2104.             ps.setString(1, name);
  2105.             ResultSet rs = ps.executeQuery();
  2106.             if (rs.next()) {
  2107.                 accountid = rs.getInt("accountid");
  2108.             }
  2109.             ps.close();
  2110.             rs.close();
  2111.             if (accountid == -1) {
  2112.                 return false;
  2113.             }
  2114.             ps = con.prepareStatement("UPDATE accounts SET banned = -1 WHERE id = ?");
  2115.             ps.setInt(1, accountid);
  2116.             ps.executeUpdate();
  2117.             ps.close();
  2118.         } catch (SQLException ex) {
  2119.             System.err.println("Error while unbanning");
  2120.             return false;
  2121.         }
  2122.         return true;
  2123.     }
  2124.     public void dropMessage(String message) {
  2125.         dropMessage(6, message);
  2126.     }
  2127.     public void dropMessage(int type, String message) {
  2128.         client.getSession().write(MaplePacketCreator.serverNotice(type, message));
  2129.     }
  2130.     public void setClan(int num) {
  2131.         clan = num;
  2132.     }
  2133.     public int getClan() {
  2134.         return clan;
  2135.     }
  2136.     public void setJob(int job) {
  2137.         if (isfake) {
  2138.             this.job = MapleJob.getById(job);
  2139.         } else {
  2140.             this.changeJob(MapleJob.getById(job));
  2141.         }
  2142.     }
  2143.     public void setFake() {
  2144.         isfake = true;
  2145.     }
  2146.     public void setJob(MapleJob job) {
  2147.         this.changeJob(job);
  2148.     }
  2149.     public int isDonator() {
  2150.         return this.donatePoints;
  2151.     }
  2152.     public void setDonator(int set) {
  2153.         donatePoints = set;
  2154.     }
  2155.     public void setID(int id) {
  2156.         this.id = id;
  2157.     }
  2158.     public void setInventory(MapleInventoryType type, MapleInventory inv) {
  2159.         inventory[type.ordinal()] = inv;
  2160.     }
  2161.     public boolean hasFakeChar() {
  2162.         if (fakes.size() > 0) {
  2163.             return true;
  2164.         }
  2165.         return false;
  2166.     }
  2167.     public List<FakeCharacter> getFakeChars() {
  2168.         return fakes;
  2169.     }
  2170.     public void setGMText(int text) {
  2171.         gmtext = text;
  2172.     }
  2173.     public int getGMText() {
  2174.         return gmtext;
  2175.     }
  2176.     public void setExp(int set) {
  2177.         exp.set(set);
  2178.         if (exp.get() < 0) {
  2179.             exp.set(0);
  2180.         }
  2181.     }
  2182.     public void giveItemBuff(int itemID) {
  2183.         MapleItemInformationProvider mii = MapleItemInformationProvider.getInstance();
  2184.         MapleStatEffect statEffect = mii.getItemEffect(itemID);
  2185.         statEffect.applyTo(this);
  2186.     }
  2187.     public void cancelAllDebuffs() {
  2188.         for (int i = 0; i < diseases.size(); i++) {
  2189.             diseases.remove(i);
  2190.             long mask = 0;
  2191.             for (MapleDisease statup : diseases) {
  2192.                 mask |= statup.getValue();
  2193.             }
  2194.             getClient().getSession().write(MaplePacketCreator.cancelDebuff(mask));
  2195.             getMap().broadcastMessage(this, MaplePacketCreator.cancelForeignDebuff(id, mask), false);
  2196.         }
  2197.     }
  2198.     public List<MapleDisease> getDiseases() {
  2199.         return diseases;
  2200.     }
  2201.     @SuppressWarnings("unchecked")
  2202.     public void removeJobSkills() {
  2203.         HashMap<Integer, MapleKeyBinding> keymapCloned = (HashMap<Integer, MapleKeyBinding>) keymap.clone();
  2204.         for (Integer keys : keymapCloned.keySet()) {
  2205.             if (SkillFactory.getSkillName(keys) != null) {
  2206.                 if (keymapCloned.get(keys).getAction() >= 1000000) {
  2207.                     keymap.remove(keys);
  2208.                 }
  2209.             }
  2210.         }
  2211.         sendKeymap();
  2212.     }
  2213.     /*
  2214.     public List<Integer> getJobs() {
  2215.     return jobs;
  2216.     }
  2217.      */
  2218.     public void changePage(int page) {
  2219.         this.currentPage = page;
  2220.     }
  2221.     public void changeTab(int tab) {
  2222.         this.currentTab = tab;
  2223.     }
  2224.     public void changeType(int type) {
  2225.         this.currentType = type;
  2226.     }
  2227.     public int getCurrentPage() {
  2228.         return currentPage;
  2229.     }
  2230.     public int getCurrentTab() {
  2231.         return currentTab;
  2232.     }
  2233.     public int getCurrentType() {
  2234.         return currentType;
  2235.     }
  2236. public void handleEnergyChargeGain() {
  2237.         ISkill energycharge = SkillFactory.getSkill(5110001);
  2238.         int energyChargeSkillLevel = getSkillLevel(energycharge);
  2239.         MapleStatEffect ceffect = null;
  2240.         ceffect = energycharge.getEffect(energyChargeSkillLevel);
  2241.         if (energyChargeSkillLevel > 0) {
  2242.             if (energybar < 10000) {
  2243.                 energybar = (energybar + 102);
  2244.                 if (energybar > 10000) {
  2245.                     energybar = 10000;
  2246.                 }
  2247.             getClient().getSession().write(MaplePacketCreator.giveEnergyCharge(energybar * getClient().getChannelServer().getEnergyRate(), 0));
  2248.             }
  2249.             if (energybar >= 10000 && energybar < 11000) {
  2250.                 energybar = 15000;
  2251.                 TimerManager tMan = TimerManager.getInstance();
  2252.                 tMan.schedule(new Runnable() {
  2253.                     @Override
  2254.                     public void run() {
  2255.                         getClient().getSession().write(MaplePacketCreator.giveEnergyCharge(0, 0));
  2256.                         energybar = 0;
  2257.                     }
  2258.                }, ceffect.getDuration());
  2259.             }
  2260.         }
  2261.     }
  2262.     public int getEnergyBar() {
  2263.         return this.energybar;
  2264.     }
  2265.     public void setEnergyBar(int set) {
  2266.         energybar = set;
  2267.     }
  2268.     public long getAfkTime() {
  2269.         return afkTime;
  2270.     }
  2271.     public void resetAfkTime() {
  2272.         if (this.chalktext != null && this.chalktext.equals("I'm afk ! drop me a message <3")) {
  2273.             setChalkboard(null);
  2274.         }
  2275.         afkTime = System.currentTimeMillis();
  2276.     }
  2277.     public void setClient(MapleClient c) {
  2278.         client = c;
  2279.     }
  2280.     public boolean isFake() {
  2281.         return this.isfake;
  2282.     }
  2283.     public long getLastLogin() {
  2284.         return lastLogin;
  2285.     }
  2286.     public boolean hasMerchant() {
  2287.         return hasMerchant;
  2288.     }
  2289.     public void setHasMerchant(boolean set) {
  2290.         try {
  2291.             PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("UPDATE characters SET HasMerchant = ? WHERE id = ?");
  2292.             ps.setInt(1, set ? 1 : 0);
  2293.             ps.setInt(2, getId());
  2294.             ps.executeUpdate();
  2295.             ps.close();
  2296.         } catch (SQLException se) {
  2297.         }
  2298.         hasMerchant = set;
  2299.     }
  2300.     public List<Integer> getVIPRockMaps(int type) {
  2301.         List<Integer> rockmaps = new LinkedList<Integer>();
  2302.         try {
  2303.             PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("SELECT mapid FROM VIPRockMaps WHERE cid = ? AND type = ?");
  2304.             ps.setInt(1, id);
  2305.             ps.setInt(2, type);
  2306.             ResultSet rs = ps.executeQuery();
  2307.             while (rs.next()) {
  2308.                 rockmaps.add(rs.getInt("mapid"));
  2309.             }
  2310.             rs.close();
  2311.             ps.close();
  2312.         } catch (SQLException se) {
  2313.             return null;
  2314.         }
  2315.         return rockmaps;
  2316.     }
  2317.     //getBossLog module
  2318. public int getBossLog(String bossid) {
  2319. Connection con1 = DatabaseConnection.getConnection();
  2320. try {
  2321. int ret_count = 0;
  2322. PreparedStatement ps;
  2323. ps = con1.prepareStatement("select count(*) from bosslog where characterid = ? and bossid = ? and lastattempt >= subtime(current_timestamp, '1 0:0:0.0')");
  2324. ps.setInt(1, id);
  2325. ps.setString(2, bossid);
  2326. ResultSet rs = ps.executeQuery();
  2327. if (rs.next()) {
  2328. ret_count = rs.getInt(1);
  2329. } else {
  2330. ret_count = -1;
  2331. }
  2332. rs.close();
  2333. ps.close();
  2334. return ret_count;
  2335. } catch (Exception Ex) {
  2336. System.err.println("Error while read bosslog.");
  2337. return -1;
  2338. }
  2339. }
  2340. public int getExt(String bossid) {
  2341. Connection con1 = DatabaseConnection.getConnection();
  2342. try {
  2343. int ret_count = 0;
  2344. PreparedStatement ps;
  2345. ps = con1.prepareStatement("select count(*) from bosslog where characterid = ? and bossid = ? ");
  2346. ps.setInt(1, id);
  2347. ps.setString(2, bossid);
  2348. ResultSet rs = ps.executeQuery();
  2349. if (rs.next()) {
  2350. ret_count = rs.getInt(1);
  2351. } else {
  2352. ret_count = -1;
  2353. }
  2354. rs.close();
  2355. ps.close();
  2356. return ret_count;
  2357. } catch (Exception Ex) {
  2358. System.err.println("Error while read bosslog.");
  2359. return -1;
  2360. }
  2361. }
  2362. public int getDay()
  2363. {
  2364. Calendar cal = Calendar.getInstance();
  2365. int day = cal.get(7);
  2366. return day;
  2367. }
  2368. public int getHour()
  2369. {
  2370. Calendar cal = Calendar.getInstance();
  2371. int hour = cal.get(11);
  2372. return hour;
  2373. }
  2374. public int getMin()
  2375. {
  2376. Calendar cal = Calendar.getInstance();
  2377. int min = cal.get(12);
  2378. return min;
  2379. }
  2380. public int getSec()
  2381. {
  2382. Calendar cal = Calendar.getInstance();
  2383. int sec = cal.get(13);
  2384. return sec;
  2385. }
  2386.         public List<MTSItemInfo> getTransfer(int cid) {
  2387.         List<MTSItemInfo> items = new ArrayList<MTSItemInfo>();
  2388.         Connection con = DatabaseConnection.getConnection();
  2389.         PreparedStatement ps;
  2390.         ResultSet rs;
  2391.         try
  2392.         {
  2393.             ps = con.prepareStatement("SELECT * FROM mts_items WHERE transfer = 1 AND seller = ? ORDER BY id DESC");
  2394.             ps.setInt(1, cid);
  2395.             rs = ps.executeQuery();
  2396.             while (rs.next()) {
  2397.                 if(rs.getInt("type") != 1)
  2398.                 {
  2399.                     Item i = new Item(rs.getInt("itemid"), (byte)0, (short)rs.getInt("quantity"));
  2400.                     i.setOwner(rs.getString("owner"));
  2401.                     items.add(new MTSItemInfo((IItem)i, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
  2402.                 } else {
  2403.                     Equip equip = new Equip(rs.getInt("itemid"), (byte) rs.getInt("position"), -1);
  2404.                     equip.setOwner(rs.getString("owner"));
  2405.                     equip.setQuantity((short) 1);
  2406.                     equip.setAcc((short) rs.getInt("acc"));
  2407.                     equip.setAvoid((short) rs.getInt("avoid"));
  2408.                     equip.setDex((short) rs.getInt("dex"));
  2409.                     equip.setHands((short) rs.getInt("hands"));
  2410.                     equip.setHp((short) rs.getInt("hp"));
  2411.                     equip.setInt((short) rs.getInt("int"));
  2412.                     equip.setJump((short) rs.getInt("jump"));
  2413.                     equip.setLuk((short) rs.getInt("luk"));
  2414.                     equip.setMatk((short) rs.getInt("matk"));
  2415.                     equip.setMdef((short) rs.getInt("mdef"));
  2416.                     equip.setMp((short) rs.getInt("mp"));
  2417.                     equip.setSpeed((short) rs.getInt("speed"));
  2418.                     equip.setStr((short) rs.getInt("str"));
  2419.                     equip.setWatk((short) rs.getInt("watk"));
  2420.                     equip.setWdef((short) rs.getInt("wdef"));
  2421.                     equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
  2422.                     equip.setLocked((byte) rs.getInt("locked"));
  2423.                     equip.setLevel((byte) rs.getInt("level"));
  2424.                     items.add(new MTSItemInfo((IItem)equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
  2425.                 }
  2426.             }
  2427.             rs.close();
  2428.             ps.close();
  2429.         }
  2430.         catch(SQLException e) {
  2431.             log.error("Err7: " + e);
  2432.         }
  2433.         return items;
  2434.     }
  2435.         public void warpFreeMarket(){
  2436.             MapleClient c = getClient();
  2437.             if ((c.getPlayer().getMapId() != 910000000)) {
  2438.                     if (c.getPlayer().isAlive() || c.getPlayer().getHp()>0) {
  2439.                         new ServernoticeMapleClientMessageCallback(5, c).dropMessage("你被奇妙的拽到自由市场去啦.");
  2440.                         c.getSession().write(MaplePacketCreator.enableActions());
  2441.                         MapleMap to;
  2442.                         MaplePortal pto;
  2443.                         to = ChannelServer.getInstance(c.getChannel()).getMapFactory().getMap(910000000);
  2444.                         c.getPlayer().saveLocation(SavedLocationType.FREE_MARKET);
  2445.                         pto = to.getPortal("out00");
  2446.                         c.getPlayer().changeMap(to, pto);
  2447.                      } else {
  2448.                         new ServernoticeMapleClientMessageCallback(5, c).dropMessage("GM是不会让你这个死人去自由市场滴.");
  2449.                         c.getSession().write(MaplePacketCreator.enableActions());
  2450.                      }
  2451.                 } else {
  2452.                     new ServernoticeMapleClientMessageCallback(5, c).dropMessage("你已经在自由市场里了哦!");
  2453.                     c.getSession().write(MaplePacketCreator.enableActions());
  2454.                 }
  2455.         }
  2456.         public void warpMTS(){
  2457.             MapleClient c = getClient();
  2458.         if (c.getPlayer().getNoPets() > 0) {
  2459.                 c.getPlayer().unequipAllPets();
  2460.                         }
  2461.             c.getPlayer().cancelAllBuffs();
  2462.             c.getPlayer().getMap().removePlayer(c.getPlayer());
  2463.             c.getSession().write(MaplePacketCreator.warpMTS(c));
  2464.             c.getPlayer().setInMTS(true);
  2465.             c.getSession().write(MaplePacketCreator.enableMTS());
  2466.             c.getSession().write(MaplePacketCreator.MTSWantedListingOver(0, 0));
  2467.             c.getSession().write(MaplePacketCreator.showMTSCash(c.getPlayer()));
  2468.             List<MTSItemInfo> items = new ArrayList<MTSItemInfo>();
  2469.                         int pages = 0;
  2470.                         try
  2471.                         {
  2472.                             Connection con = DatabaseConnection.getConnection();
  2473.                             PreparedStatement ps = con.prepareStatement("SELECT * FROM mts_items WHERE tab = 1 AND transfer = 0 ORDER BY id DESC LIMIT ?, 16");
  2474.                             ps.setInt(1, 0);
  2475.                             ResultSet rs = ps.executeQuery();
  2476.                             while (rs.next()) {
  2477.                                 if(rs.getInt("type") != 1)
  2478.                                 {
  2479.                                     Item i = new Item(rs.getInt("itemid"), (byte)0, (short)rs.getInt("quantity"));
  2480.                                     i.setOwner(rs.getString("owner"));
  2481.                                     items.add(new MTSItemInfo(i, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
  2482.                     } else {
  2483.                         Equip equip = new Equip(rs.getInt("itemid"), (byte) rs.getInt("position"), -1);
  2484.                         equip.setOwner(rs.getString("owner"));
  2485.                         equip.setQuantity((short) 1);
  2486.                         equip.setAcc((short) rs.getInt("acc"));
  2487.                         equip.setAvoid((short) rs.getInt("avoid"));
  2488.                         equip.setDex((short) rs.getInt("dex"));
  2489.                         equip.setHands((short) rs.getInt("hands"));
  2490.                         equip.setHp((short) rs.getInt("hp"));
  2491.                         equip.setInt((short) rs.getInt("int"));
  2492.                         equip.setJump((short) rs.getInt("jump"));
  2493.                         equip.setLuk((short) rs.getInt("luk"));
  2494.                         equip.setMatk((short) rs.getInt("matk"));
  2495.                         equip.setMdef((short) rs.getInt("mdef"));
  2496.                         equip.setMp((short) rs.getInt("mp"));
  2497.                         equip.setSpeed((short) rs.getInt("speed"));
  2498.                         equip.setStr((short) rs.getInt("str"));
  2499.                         equip.setWatk((short) rs.getInt("watk"));
  2500.                         equip.setWdef((short) rs.getInt("wdef"));
  2501.                         equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
  2502.                         equip.setLocked((byte) rs.getInt("locked"));
  2503.                         equip.setLevel((byte) rs.getInt("level"));
  2504.                         items.add(new MTSItemInfo((IItem) equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
  2505.                     }
  2506.                 }
  2507.                 rs.close();
  2508.                 ps.close();
  2509.                 ps = con.prepareStatement("SELECT COUNT(*) FROM mts_items");
  2510.                 rs = ps.executeQuery();
  2511.                 if (rs.next()) {
  2512.                     pages = (int) Math.ceil(rs.getInt(1) / 16);
  2513.                 }
  2514.                 rs.close();
  2515.                 ps.close();
  2516.             }
  2517.             catch(SQLException e) {
  2518.                 log.error("Err1: " + e);
  2519.             }
  2520.             c.getSession().write(MaplePacketCreator.sendMTS(items, 1, 0, 0, pages));
  2521.             c.getSession().write(MaplePacketCreator.TransferInventory(getTransfer(c.getPlayer().getId())));
  2522.             c.getSession().write(MaplePacketCreator.NotYetSoldInv(getNotYetSold(c.getPlayer().getId())));
  2523.         }
  2524.         public List<MTSItemInfo> getNotYetSold(int cid) {
  2525.         List<MTSItemInfo> items = new ArrayList<MTSItemInfo>();
  2526.         Connection con = DatabaseConnection.getConnection();
  2527.         PreparedStatement ps;
  2528.         ResultSet rs;
  2529.         try
  2530.         {
  2531.             ps = con.prepareStatement("SELECT * FROM mts_items WHERE seller = ? AND transfer = 0 ORDER BY id DESC");
  2532.             ps.setInt(1, cid);
  2533.             rs = ps.executeQuery();
  2534.             while (rs.next()) {
  2535.                 if(rs.getInt("type") != 1)
  2536.                 {
  2537.                     Item i = new Item(rs.getInt("itemid"), (byte)0, (short)rs.getInt("quantity"));
  2538.                     i.setOwner(rs.getString("owner"));
  2539.                     items.add(new MTSItemInfo((IItem)i, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
  2540.                 } else {
  2541.                     Equip equip = new Equip(rs.getInt("itemid"), (byte) rs.getInt("position"), -1);
  2542.                     equip.setOwner(rs.getString("owner"));
  2543.                     equip.setQuantity((short) 1);
  2544.                     equip.setAcc((short) rs.getInt("acc"));
  2545.                     equip.setAvoid((short) rs.getInt("avoid"));
  2546.                     equip.setDex((short) rs.getInt("dex"));
  2547.                     equip.setHands((short) rs.getInt("hands"));
  2548.                     equip.setHp((short) rs.getInt("hp"));
  2549.                     equip.setInt((short) rs.getInt("int"));
  2550.                     equip.setJump((short) rs.getInt("jump"));
  2551.                     equip.setLuk((short) rs.getInt("luk"));
  2552.                     equip.setMatk((short) rs.getInt("matk"));
  2553.                     equip.setMdef((short) rs.getInt("mdef"));
  2554.                     equip.setMp((short) rs.getInt("mp"));
  2555.                     equip.setSpeed((short) rs.getInt("speed"));
  2556.                     equip.setStr((short) rs.getInt("str"));
  2557.                     equip.setWatk((short) rs.getInt("watk"));
  2558.                     equip.setWdef((short) rs.getInt("wdef"));
  2559.                     equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
  2560.                     equip.setLocked((byte) rs.getInt("locked"));
  2561.                     equip.setLevel((byte) rs.getInt("level"));
  2562.                     items.add(new MTSItemInfo((IItem)equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
  2563.                 }
  2564.             }
  2565.             rs.close();
  2566.             ps.close();
  2567.         }
  2568.         catch(SQLException e) {
  2569.             log.error("Err8: " + e);
  2570.         }
  2571.         return items;
  2572.     }
  2573. //setBossLog module
  2574. public void setBossLog(String bossid) {
  2575. Connection con1 = DatabaseConnection.getConnection();
  2576. try {
  2577. PreparedStatement ps;
  2578. ps = con1.prepareStatement("insert into bosslog (characterid, bossid) values (?,?)");
  2579. ps.setInt(1, id);
  2580. ps.setString(2, bossid);
  2581. ps.executeUpdate();
  2582. ps.close();
  2583. } catch (Exception Ex) {
  2584. log.error("Error while insert bosslog.", Ex);
  2585. }
  2586. }
  2587. }