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

游戏

开发平台:

Java

  1.     /*
  2.         This file is part of the OdinMS Maple Story Server
  3.         Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
  4.         Matthias Butz <matze@odinms.de>
  5.         Jan Christian Meyer <vimes@odinms.de>
  6.         This program is free software: you can redistribute it and/or modify
  7.         it under the terms of the GNU Affero General Public License version 3
  8.         as published by the Free Software Foundation. You may not use, modify
  9.         or distribute this program under any other version of the
  10.         GNU Affero General Public License.
  11.         This program is distributed in the hope that it will be useful,
  12.         but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.         GNU Affero General Public License for more details.
  15.         You should have received a copy of the GNU Affero General Public License
  16.         along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. package net.sf.odinms.server.life;
  19. import java.awt.Point;
  20. import java.awt.Rectangle;
  21. import java.util.ArrayList;
  22. import java.util.Collections;
  23. import java.util.List;
  24. import java.util.Random;
  25. import net.sf.odinms.client.MapleCharacter;
  26. import net.sf.odinms.client.MapleDisease;
  27. import net.sf.odinms.client.status.MonsterStatus;
  28. import net.sf.odinms.server.MaplePortal;
  29. import net.sf.odinms.server.maps.MapleMap;
  30. import net.sf.odinms.server.maps.MapleMapObject;
  31. import net.sf.odinms.server.maps.MapleMapObjectType;
  32. /**
  33.  *
  34.  * @author Danny (Leifde)
  35.  */
  36. public class MobSkill {
  37.     private int skillId;
  38.     private int skillLevel;
  39.     private int mpCon;
  40.     private List<Integer> toSummon = new ArrayList<Integer>();
  41.     private int spawnEffect;
  42.     private int hp;
  43.     private int x;
  44.     private int y;
  45.     private long duration;
  46.     private long cooltime;
  47.     private float prop;
  48.     private Point lt,  rb;
  49.     private int limit;
  50.     public MobSkill(int skillId, int level) {
  51.         this.skillId = skillId;
  52.         this.skillLevel = level;
  53.     }
  54.     public void setMpCon(int mpCon) {
  55.         this.mpCon = mpCon;
  56.     }
  57.     public void addSummons(List<Integer> toSummon) {
  58.         for (Integer summon : toSummon) {
  59.             this.toSummon.add(summon);
  60.         }
  61.     }
  62.     public void setSpawnEffect(int spawnEffect) {
  63.         this.spawnEffect = spawnEffect;
  64.     }
  65.     public void setHp(int hp) {
  66.         this.hp = hp;
  67.     }
  68.     public void setX(int x) {
  69.         this.x = x;
  70.     }
  71.     public void setY(int y) {
  72.         this.y = y;
  73.     }
  74.     public void setDuration(long duration) {
  75.         this.duration = duration;
  76.     }
  77.     public void setCoolTime(long cooltime) {
  78.         this.cooltime = cooltime;
  79.     }
  80.     public void setProp(float prop) {
  81.         this.prop = prop;
  82.     }
  83.     public void setLtRb(Point lt, Point rb) {
  84.         this.lt = lt;
  85.         this.rb = rb;
  86.     }
  87.     public void setLimit(int limit) {
  88.         this.limit = limit;
  89.     }
  90.     public void applyEffect(MapleCharacter player, MapleMonster monster, boolean skill) {
  91.         MonsterStatus monStat = null;
  92.         MapleDisease disease = null;
  93.         boolean heal = false;
  94.         boolean dispel = false;
  95.         boolean seduce = false;
  96.         boolean banish = false;
  97.                 if (skillId > 119 && skillId < 140 && player.isGM()) {
  98.             return;
  99.         }
  100.         switch (skillId) {
  101.             case 100:
  102.             case 110:
  103.                 monStat = MonsterStatus.WEAPON_ATTACK_UP;
  104.                 break;
  105.             case 101:
  106.             case 111:
  107.                 monStat = MonsterStatus.MAGIC_ATTACK_UP;
  108.                 break;
  109.             case 102:
  110.             case 112:
  111.                 monStat = MonsterStatus.WEAPON_DEFENSE_UP;
  112.                 break;
  113.             case 103:
  114.             case 113:
  115.                 monStat = MonsterStatus.MAGIC_DEFENSE_UP;
  116.                 break;
  117.             case 114: // Heal
  118.                 heal = true;
  119.                 break;
  120.             case 120:
  121.                 disease = MapleDisease.SEAL;
  122.                 break;
  123.             case 121:
  124.                 disease = MapleDisease.DARKNESS;
  125.                 break;
  126.             case 122:
  127.                 disease = MapleDisease.WEAKEN;
  128.                 break;
  129.             case 123:
  130.                 disease = MapleDisease.STUN;
  131.                 break;
  132.             case 124: // Curse TODO
  133.                 break;
  134.             case 125:
  135.                 disease = MapleDisease.POISON;
  136.                 break;
  137.             case 126: // Slow
  138.                 disease = MapleDisease.SLOW;
  139.                 break;
  140.             case 127:
  141.                 dispel = true;
  142.                 break;
  143.             case 128: // Seduce
  144.                 seduce = true;
  145.                 break;
  146.             case 129: // Banish
  147.                 banish = true; // player gets dmg = send to town... needs to be fixed
  148.                 break;
  149.             case 140:
  150.                 if (makeChanceResult() && !monster.isBuffed(MonsterStatus.MAGIC_IMMUNITY)) {
  151.                     monStat = MonsterStatus.WEAPON_IMMUNITY;
  152.                 }
  153.                 break;
  154.             case 141:
  155.                 if (makeChanceResult() && !monster.isBuffed(MonsterStatus.WEAPON_IMMUNITY)) {
  156.                     monStat = MonsterStatus.MAGIC_IMMUNITY;
  157.                 }
  158.                 break;
  159.             case 200:
  160.                 if (monster.getMap().getSpawnedMonstersOnMap() < 80) {
  161.                     for (Integer mobId : getSummons()) {
  162.                         MapleMonster toSpawn = MapleLifeFactory.getMonster(mobId);
  163.                         toSpawn.setPosition(monster.getPosition());
  164.                         int ypos, xpos;
  165.                         xpos = (int) monster.getPosition().getX();
  166.                         ypos = (int) monster.getPosition().getY();
  167.                         switch (mobId) {
  168.                             case 8500003: // Pap bomb high
  169.                                 toSpawn.setFh((int) Math.ceil(Math.random() * 19.0));
  170.                                 ypos = -590;
  171.                             case 8500004: // Pap bomb
  172.                                 //Spawn between -500 and 500 from the monsters X position
  173.                                 xpos = (int) (monster.getPosition().getX() + Math.ceil(Math.random() * 1000.0) - 500);
  174.                                 if (ypos != -590) {
  175.                                     ypos = (int) monster.getPosition().getY();
  176.                                 }
  177.                                 break;
  178.                             case 8510100: //Pianus bomb
  179.                                 if (Math.ceil(Math.random() * 5) == 1) {
  180.                                     ypos = 78;
  181.                                     xpos = (int) (0 + Math.ceil(Math.random() * 5)) + ((Math.ceil(Math.random() * 2) == 1) ? 180 : 0);
  182.                                 } else {
  183.                                     xpos = (int) (monster.getPosition().getX() + Math.ceil(Math.random() * 1000.0) - 500);
  184.                                 }
  185.                                 break;
  186.                         }
  187.                         // Get spawn coordinates (This fixes monster lock)
  188.                         // TODO get map left and right wall. Any suggestions? PM TheRamon
  189.                         switch (monster.getMap().getId()) {
  190.                             case 220080001: //Pap map
  191.                                 if (xpos < -890) {
  192.                                     xpos = (int) (-890 + Math.ceil(Math.random() * 150));
  193.                                 } else if (xpos > 230) {
  194.                                     xpos = (int) (230 - Math.ceil(Math.random() * 150));
  195.                                 }
  196.                                 break;
  197.                             case 230040420: // Pianus map
  198.                                 if (xpos < -239) {
  199.                                     xpos = (int) (-239 + Math.ceil(Math.random() * 150));
  200.                                 } else if (xpos > 371) {
  201.                                     xpos = (int) (371 - Math.ceil(Math.random() * 150));
  202.                                 }
  203.                                 break;
  204.                         }
  205.                         toSpawn.setPosition(new Point(xpos, ypos));
  206.                         monster.getMap().spawnMonsterWithEffect(toSpawn, getSpawnEffect(), toSpawn.getPosition());
  207.                     }
  208.                 }
  209.                 break;
  210.         }
  211.         if (monStat != null || heal) {
  212.             if (lt != null && rb != null && skill) {
  213.                 List<MapleMapObject> objects = getObjectsInRange(monster, MapleMapObjectType.MONSTER);
  214.                 if (heal) {
  215.                     for (MapleMapObject mons : objects) {
  216.                         ((MapleMonster) mons).heal(getX(), getY());
  217.                     }
  218.                 } else {
  219.                     for (MapleMapObject mons : objects) {
  220.                         if (!monster.isBuffed(monStat)) {
  221.                             ((MapleMonster) mons).applyMonsterBuff(monStat, getX(), getSkillId(), getDuration(), this);
  222.                         }
  223.                     }
  224.                 }
  225.             } else {
  226.                 if (heal) {
  227.                     monster.heal(getX(), getY());
  228.                 } else {
  229.                     if (!monster.isBuffed(monStat)) {
  230.                         monster.applyMonsterBuff(monStat, getX(), getSkillId(), getDuration(), this);
  231.                     }
  232.                 }
  233.             }
  234.         }
  235.         if (disease != null || dispel || seduce || banish) {
  236.             if (new Random().nextInt(6) < 4) { // makes a number between 0 - 5. If 0, 1, 2, or 3 then give desiease
  237.                 if (skill && lt != null && rb != null) {
  238.                     int i = 0;
  239.                     List<MapleCharacter> characters = getPlayersInRange(monster, player);
  240.                     for (MapleCharacter character : characters) {
  241.                         if (dispel) {
  242.                             character.dispel();
  243.                         } else if (banish) {
  244.                             MapleMap to = player.getMap().getReturnMap();
  245.                             MaplePortal pto = to.getPortal(new Random().nextInt(to.getPortals().size()));
  246.                             character.changeMap(to, pto);
  247.                         } else if (seduce && i < 10) {
  248.                             character.giveDebuff(MapleDisease.SEDUCE, this);
  249.                             i++;
  250.                         } else {
  251.                             character.giveDebuff(disease, this);
  252.                         }
  253.                     }
  254.                 } else {
  255.                     if (dispel) {
  256.                         player.dispel();
  257.                     } else {
  258.                         player.giveDebuff(disease, this);
  259.                     }
  260.                 }
  261.             }
  262.         }
  263.         monster.usedSkill(skillId, skillLevel, cooltime);
  264.         monster.setMp(monster.getMp() - getMpCon());
  265.     }
  266.     public int getSkillId() {
  267.         return skillId;
  268.     }
  269.     public int getSkillLevel() {
  270.         return skillLevel;
  271.     }
  272.     public int getMpCon() {
  273.         return mpCon;
  274.     }
  275.     public List<Integer> getSummons() {
  276.         return Collections.unmodifiableList(toSummon);
  277.     }
  278.     public int getSpawnEffect() {
  279.         return spawnEffect;
  280.     }
  281.     public int getHP() {
  282.         return hp;
  283.     }
  284.     public int getX() {
  285.         return x;
  286.     }
  287.     public int getY() {
  288.         return y;
  289.     }
  290.     public long getDuration() {
  291.         return duration;
  292.     }
  293.     public long getCoolTime() {
  294.         return cooltime;
  295.     }
  296.     public Point getLt() {
  297.         return lt;
  298.     }
  299.     public Point getRb() {
  300.         return rb;
  301.     }
  302.     public int getLimit() {
  303.         return limit;
  304.     }
  305.     public boolean makeChanceResult() {
  306.         return prop == 1.0 || Math.random() < prop;
  307.     }
  308.     private Rectangle calculateBoundingBox(Point posFrom, boolean facingLeft) {
  309.         Point mylt;
  310.         Point myrb;
  311.         if (facingLeft) {
  312.             mylt = new Point(lt.x + posFrom.x, lt.y + posFrom.y);
  313.             myrb = new Point(rb.x + posFrom.x, rb.y + posFrom.y);
  314.         } else {
  315.             myrb = new Point(lt.x * -1 + posFrom.x, rb.y + posFrom.y);
  316.             mylt = new Point(rb.x * -1 + posFrom.x, lt.y + posFrom.y);
  317.         }
  318.         Rectangle bounds = new Rectangle(mylt.x, mylt.y, myrb.x - mylt.x, myrb.y - mylt.y);
  319.         return bounds;
  320.     }
  321.     private List<MapleCharacter> getPlayersInRange(MapleMonster monster, MapleCharacter player) {
  322.         Rectangle bounds = calculateBoundingBox(monster.getPosition(), monster.isFacingLeft());
  323.         List<MapleCharacter> players = new ArrayList<MapleCharacter>();
  324.         players.add(player);
  325.         return monster.getMap().getPlayersInRect(bounds, players);
  326.     }
  327.     private List<MapleMapObject> getObjectsInRange(MapleMonster monster, MapleMapObjectType objectType) {
  328.         Rectangle bounds = calculateBoundingBox(monster.getPosition(), monster.isFacingLeft());
  329.         List<MapleMapObjectType> objectTypes = new ArrayList<MapleMapObjectType>();
  330.         objectTypes.add(objectType);
  331.         return monster.getMap().getMapObjectsInRect(bounds, objectTypes);
  332.     }
  333. }