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

游戏

开发平台:

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.scripting.reactor;
  19. import java.awt.Point;
  20. import java.util.Iterator;
  21. import java.util.LinkedList;
  22. import java.util.List;
  23. import net.sf.odinms.client.Equip;
  24. import net.sf.odinms.client.IItem;
  25. import net.sf.odinms.client.Item;
  26. import net.sf.odinms.client.MapleClient;
  27. import net.sf.odinms.client.MapleInventoryType;
  28. import net.sf.odinms.net.channel.ChannelServer;
  29. import net.sf.odinms.scripting.AbstractPlayerInteraction;
  30. import net.sf.odinms.server.MapleItemInformationProvider;
  31. import net.sf.odinms.server.MaplePortal;
  32. import net.sf.odinms.server.life.MapleLifeFactory;
  33. import net.sf.odinms.server.life.MapleMonster;
  34. import net.sf.odinms.server.life.MapleMonsterInformationProvider.DropEntry;
  35. import net.sf.odinms.server.maps.BossMapMonitor;
  36. import net.sf.odinms.server.maps.MapleMap;
  37. import net.sf.odinms.server.maps.MapleReactor;
  38. /**
  39.  * @author Lerk
  40.  */
  41. public class ReactorActionManager extends AbstractPlayerInteraction {
  42.     // private static final Logger log = LoggerFactory.getLogger(ReactorActionManager.class);
  43.     private MapleReactor reactor;
  44.     public ReactorActionManager(MapleClient c, MapleReactor reactor) {
  45.         super(c);
  46.         this.reactor = reactor;
  47.     }
  48.     // only used for meso = false, really. No minItems because meso is used to fill the gap
  49.     public void dropItems() {
  50.         dropItems(false, 0, 0, 0, 0);
  51.     }
  52.     public void dropItems(boolean meso, int mesoChance, int minMeso, int maxMeso) {
  53.         dropItems(meso, mesoChance, minMeso, maxMeso, 0);
  54.     }
  55.     public void dropItems(boolean meso, int mesoChance, int minMeso, int maxMeso, int minItems) {
  56.         List<DropEntry> chances = getDropChances();
  57.         List<DropEntry> items = new LinkedList<DropEntry>();
  58.         int numItems = 0;
  59.         if (meso && Math.random() < (1 / (double) mesoChance)) {
  60.             items.add(new DropEntry(0, mesoChance));
  61.         }
  62.         // narrow list down by chances
  63.         Iterator<DropEntry> iter = chances.iterator();
  64.         // for (DropEntry d : chances){
  65.         while (iter.hasNext()) {
  66.             DropEntry d = (DropEntry) iter.next();
  67.             if (Math.random() < (1 / (double) d.chance)) {
  68.                 numItems++;
  69.                 items.add(d);
  70.             }
  71.         }
  72.         // if a minimum number of drops is required, add meso
  73.         while (items.size() < minItems) {
  74.             items.add(new DropEntry(0, mesoChance));
  75.             numItems++;
  76.         }
  77.         // randomize drop order
  78.         java.util.Collections.shuffle(items);
  79.         final Point dropPos = reactor.getPosition();
  80.         dropPos.x -= (12 * numItems);
  81.         for (DropEntry d : items) {
  82.             if (d.itemId == 0) {
  83.                 int range = maxMeso - minMeso;
  84.                 int displayDrop = (int) (Math.random() * range) + minMeso;
  85.                 int mesoDrop = (int) (displayDrop * ChannelServer.getInstance(getClient().getChannel()).getMesoRate());
  86.                 reactor.getMap().spawnMesoDrop(mesoDrop, displayDrop, dropPos, reactor, getPlayer(), meso);
  87.             } else {
  88.                 IItem drop;
  89.                 MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
  90.                 if (ii.getInventoryType(d.itemId) != MapleInventoryType.EQUIP) {
  91.                     drop = new Item(d.itemId, (byte) 0, (short) 1);
  92.                 } else {
  93.                     drop = ii.randomizeStats(getClient(), (Equip) ii.getEquipById(d.itemId));
  94.                 }
  95.                 reactor.getMap().spawnItemDrop(reactor, getPlayer(), drop, dropPos, false, true);
  96.             }
  97.             dropPos.x += 25;
  98.         }
  99.     }
  100.     private List<DropEntry> getDropChances() {
  101.         return ReactorScriptManager.getInstance().getDrops(reactor.getId());
  102.     }
  103.     // summon one monster on reactor location
  104.     public void spawnMonster(int id) {
  105.         spawnMonster(id, 1, getPosition());
  106.     }
  107.     // summon one monster, remote location
  108.     public void spawnMonster(int id, int x, int y) {
  109.         spawnMonster(id, 1, new Point(x, y));
  110.     }
  111.     // multiple monsters, reactor location
  112.     public void spawnMonster(int id, int qty) {
  113.         spawnMonster(id, qty, getPosition());
  114.     }
  115.     // multiple monsters, remote location
  116.     public void spawnMonster(int id, int qty, int x, int y) {
  117.         spawnMonster(id, qty, new Point(x, y));
  118.     }
  119.     // handler for all spawnMonster
  120.     private void spawnMonster(int id, int qty, Point pos) {
  121.         for (int i = 0; i < qty; i++) {
  122.             MapleMonster mob = MapleLifeFactory.getMonster(id);
  123.             reactor.getMap().spawnMonsterOnGroudBelow(mob, pos);
  124.         }
  125.     }
  126.     // returns slightly above the reactor's position for monster spawns
  127.     public Point getPosition() {
  128.         Point pos = reactor.getPosition();
  129.         pos.y -= 10;
  130.         return pos;
  131.     }
  132.     /**
  133.      * Spawns an NPC at the reactor's location
  134.      * @param [Int] npcId
  135.      */
  136.     public void spawnNpc(int npcId) {
  137.         spawnNpc(npcId, getPosition());
  138.     }
  139.     /**
  140.      * Spawns an NPC at a custom position
  141.      * @param [Int] npcId
  142.      * @param [Int] X
  143.      * @param [Int] Y
  144.      */
  145.     public void spawnNpc(int npcId, int x, int y) {
  146.         spawnNpc(npcId, new Point(x, y));
  147.     }
  148.     public MapleReactor getReactor() {
  149.         return reactor;
  150.     }
  151.     public void spawnFakeMonster(int id) {
  152.         spawnFakeMonster(id, 1, getPosition());
  153.     }
  154.     // summon one monster, remote location
  155.     public void spawnFakeMonster(int id, int x, int y) {
  156.         spawnFakeMonster(id, 1, new Point(x, y));
  157.     }
  158.     // multiple monsters, reactor location
  159.     public void spawnFakeMonster(int id, int qty) {
  160.         spawnFakeMonster(id, qty, getPosition());
  161.     }
  162.     // multiple monsters, remote location
  163.     public void spawnFakeMonster(int id, int qty, int x, int y) {
  164.         spawnFakeMonster(id, qty, new Point(x, y));
  165.     }
  166.     // handler for all spawnFakeMonster
  167.     private void spawnFakeMonster(int id, int qty, Point pos) {
  168.         for (int i = 0; i < qty; i++) {
  169.             MapleMonster mob = MapleLifeFactory.getMonster(id);
  170.             reactor.getMap().spawnFakeMonsterOnGroundBelow(mob, pos);
  171.         }
  172.     }
  173.     public void killAll() {
  174.         reactor.getMap().killAllMonsters(false);
  175.     }
  176.     public void killMonster(int monsId) {
  177.         reactor.getMap().killMonster(monsId);
  178.     }
  179.     public void closePortal(int mapid, String pName) {
  180.         getClient().getChannelServer().getMapFactory().getMap(mapid).getPortal(pName).setPortalState(MaplePortal.CLOSE);
  181.     }
  182.     public void openPortal(int mapid, String pName) {
  183.         getClient().getChannelServer().getMapFactory().getMap(mapid).getPortal(pName).setPortalState(MaplePortal.OPEN);
  184.     }
  185.     public void closeDoor(int mapid) {
  186.         getClient().getChannelServer().getMapFactory().getMap(mapid).setReactorState();
  187.     }
  188.     public void openDoor(int mapid) {
  189.         getClient().getChannelServer().getMapFactory().getMap(mapid).resetReactors();
  190.     }
  191.     public void createMapMonitor(int pMapId, String pName) {
  192.         MapleMap pMap = getClient().getChannelServer().getMapFactory().getMap(pMapId);
  193.         MaplePortal portal = pMap.getPortal(pName);
  194.         BossMapMonitor bmm = new BossMapMonitor(getPlayer().getMap(), pMap, portal);
  195.     }
  196. }