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

游戏

开发平台:

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.maps;
  19. import java.awt.Rectangle;
  20. import net.sf.odinms.client.MapleClient;
  21. import net.sf.odinms.net.MaplePacket;
  22. import net.sf.odinms.scripting.reactor.ReactorScriptManager;
  23. import net.sf.odinms.server.TimerManager;
  24. import net.sf.odinms.tools.MaplePacketCreator;
  25. import net.sf.odinms.tools.Pair;
  26. /**
  27.  *
  28.  * @author Lerk
  29.  */
  30. public class MapleReactor extends AbstractMapleMapObject {
  31.     //private static Logger log = LoggerFactory.getLogger(MapleReactor.class);
  32.     private int rid;
  33.     private MapleReactorStats stats;
  34.     private byte state;
  35.     private int delay;
  36.     private MapleMap map;
  37.     private boolean alive;
  38.     private String name;
  39.     private boolean timerActive;
  40.     public MapleReactor(MapleReactorStats stats, int rid) {
  41.         this.stats = stats;
  42.         this.rid = rid;
  43.         alive = true;
  44.     }
  45.     public void setTimerActive(boolean active) {
  46.         this.timerActive = active;
  47.     }
  48.     public boolean isTimerActive() {
  49.         return timerActive;
  50.     }
  51.     public int getReactorId() {
  52.         return rid;
  53.     }
  54.     public void setState(byte state) {
  55.         this.state = state;
  56.     }
  57.     public byte getState() {
  58.         return state;
  59.     }
  60.     public int getId() {
  61.         return rid;
  62.     }
  63.     public void setDelay(int delay) {
  64.         this.delay = delay;
  65.     }
  66.     public int getDelay() {
  67.         return delay;
  68.     }
  69.     @Override
  70.     public MapleMapObjectType getType() {
  71.         return MapleMapObjectType.REACTOR;
  72.     }
  73.     public int getReactorType() {
  74.         return stats.getType(state);
  75.     }
  76.     public void setMap(MapleMap map) {
  77.         this.map = map;
  78.     }
  79.     public MapleMap getMap() {
  80.         return map;
  81.     }
  82.     public Pair<Integer, Integer> getReactItem() {
  83.         return stats.getReactItem(state);
  84.     }
  85.     public boolean isAlive() {
  86.         return alive;
  87.     }
  88.     public void setAlive(boolean alive) {
  89.         this.alive = alive;
  90.     }
  91.     @Override
  92.     public void sendDestroyData(MapleClient client) {
  93.         client.getSession().write(makeDestroyData());
  94.     }
  95.     public MaplePacket makeDestroyData() {
  96.         return MaplePacketCreator.destroyReactor(this);
  97.     }
  98.     @Override
  99.     public void sendSpawnData(MapleClient client) {
  100.         client.getSession().write(makeSpawnData());
  101.     }
  102.     public MaplePacket makeSpawnData() {
  103.         return MaplePacketCreator.spawnReactor(this);
  104.     }
  105.     public void delayedHitReactor(final MapleClient c, long delay) {
  106.         TimerManager.getInstance().schedule(new Runnable() {
  107.             @Override
  108.             public void run() {
  109.                 hitReactor(c);
  110.             }
  111.         }, delay);
  112.     }
  113.     //hitReactor command for item-triggered reactors
  114.     public void hitReactor(MapleClient c) {
  115.         hitReactor(0, (short) 0, c);
  116.     }
  117.     public void hitReactor(int charPos, short stance, MapleClient c) {
  118.         if (stats.getType(state) < 999 && stats.getType(state) != -1) {
  119.             //type 2 = only hit from right (kerning swamp plants), 00 is air left 02 is ground left
  120.             if (!(stats.getType(state) == 2 && (charPos == 0 || charPos == 2))) {
  121.                 //get next state
  122.                 state = stats.getNextState(state);
  123.                 if (stats.getNextState(state) == -1) {//end of reactor
  124.                     if (stats.getType(state) < 100) { //reactor broken
  125.                         if (delay > 0) {
  126.                             map.destroyReactor(getObjectId());
  127.                         } else {//trigger as normal
  128.                             map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
  129.                         }
  130.                     } else { //item-triggered on final step
  131.                         map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
  132.                     }
  133.                     ReactorScriptManager.getInstance().act(c, this);
  134.                 } else { //reactor not broken yet
  135.                     map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
  136.                     if (state == stats.getNextState(state)) { //current state = next state, looping reactor
  137.                         ReactorScriptManager.getInstance().act(c, this);
  138.                     }
  139.                 }
  140.             }
  141.         } else {
  142.             state++;
  143.             map.broadcastMessage(MaplePacketCreator.triggerReactor(this, stance));
  144.             ReactorScriptManager.getInstance().act(c, this);
  145.         }
  146.     }
  147.     public Rectangle getArea() {
  148.         int height = stats.getBR().y - stats.getTL().y;
  149.         int width = stats.getBR().x - stats.getTL().x;
  150.         int origX = getPosition().x + stats.getTL().x;
  151.         int origY = getPosition().y + stats.getTL().y;
  152.         return new Rectangle(origX, origY, width, height);
  153.     }
  154.     public String getName() {
  155.         return name;
  156.     }
  157.     public void setName(String name) {
  158.         this.name = name;
  159.     }
  160.     @Override
  161.     public String toString() {
  162.         return "Reactor " + getObjectId() + " of id " + rid + " at position " + getPosition().toString() + " state" + state + " type " + stats.getType(state);
  163.     }
  164. }