Search in sources :

Example 1 with StateData

use of server.maps.MapleReactorStats.StateData in project HeavenMS by ronancpl.

the class MapleReactorFactory method getReactor.

public static MapleReactorStats getReactor(int rid) {
    MapleReactorStats stats = reactorStats.get(Integer.valueOf(rid));
    if (stats == null) {
        int infoId = rid;
        MapleData reactorData = data.getData(StringUtil.getLeftPaddedStr(Integer.toString(infoId) + ".img", '0', 11));
        MapleData link = reactorData.getChildByPath("info/link");
        if (link != null) {
            infoId = MapleDataTool.getIntConvert("info/link", reactorData);
            stats = reactorStats.get(Integer.valueOf(infoId));
        }
        MapleData activateOnTouch = reactorData.getChildByPath("info/activateByTouch");
        boolean loadArea = false;
        if (activateOnTouch != null) {
            loadArea = MapleDataTool.getInt("info/activateByTouch", reactorData, 0) != 0;
        }
        if (stats == null) {
            reactorData = data.getData(StringUtil.getLeftPaddedStr(Integer.toString(infoId) + ".img", '0', 11));
            MapleData reactorInfoData = reactorData.getChildByPath("0");
            stats = new MapleReactorStats();
            List<StateData> statedatas = new ArrayList<>();
            if (reactorInfoData != null) {
                boolean areaSet = false;
                byte i = 0;
                while (reactorInfoData != null) {
                    MapleData eventData = reactorInfoData.getChildByPath("event");
                    if (eventData != null) {
                        int timeOut = -1;
                        for (MapleData fknexon : eventData.getChildren()) {
                            if (fknexon.getName().equals("timeOut")) {
                                timeOut = MapleDataTool.getInt(fknexon);
                            } else {
                                Pair<Integer, Integer> reactItem = null;
                                int type = MapleDataTool.getIntConvert("type", fknexon);
                                if (type == 100) {
                                    // reactor waits for item
                                    reactItem = new Pair<Integer, Integer>(MapleDataTool.getIntConvert("0", fknexon), MapleDataTool.getIntConvert("1", fknexon));
                                    if (!areaSet || loadArea) {
                                        // only set area of effect for item-triggered reactors once
                                        stats.setTL(MapleDataTool.getPoint("lt", fknexon));
                                        stats.setBR(MapleDataTool.getPoint("rb", fknexon));
                                        areaSet = true;
                                    }
                                }
                                MapleData activeSkillID = fknexon.getChildByPath("activeSkillID");
                                List<Integer> skillids = null;
                                if (activeSkillID != null) {
                                    skillids = new ArrayList<Integer>();
                                    for (MapleData skill : activeSkillID.getChildren()) {
                                        skillids.add(MapleDataTool.getInt(skill));
                                    }
                                }
                                byte nextState = (byte) MapleDataTool.getIntConvert("state", fknexon);
                                statedatas.add(new StateData(type, reactItem, skillids, nextState));
                            }
                        }
                        stats.addState(i, statedatas, timeOut);
                    }
                    i++;
                    reactorInfoData = reactorData.getChildByPath(Byte.toString(i));
                    statedatas = new ArrayList<>();
                }
            } else // sit there and look pretty; likely a reactor such as Zakum/Papulatus doors that shows if player can enter
            {
                statedatas.add(new StateData(999, null, null, (byte) 0));
                stats.addState((byte) 0, statedatas, -1);
            }
            reactorStats.put(Integer.valueOf(infoId), stats);
            if (rid != infoId) {
                reactorStats.put(Integer.valueOf(rid), stats);
            }
        } else // stats exist at infoId but not rid; add to map
        {
            reactorStats.put(Integer.valueOf(rid), stats);
        }
    }
    return stats;
}
Also used : MapleData(provider.MapleData) ArrayList(java.util.ArrayList) StateData(server.maps.MapleReactorStats.StateData)

Aggregations

ArrayList (java.util.ArrayList)1 MapleData (provider.MapleData)1 StateData (server.maps.MapleReactorStats.StateData)1