Search in sources :

Example 6 with Pair

use of tools.Pair in project HeavenMS by ronancpl.

the class MapleCharacter method updateEffects.

private void updateEffects(Set<MapleBuffStat> removedStats) {
    chrLock.lock();
    try {
        Map<Integer, Pair<MapleStatEffect, Long>> retrievedEffects = new LinkedHashMap<>();
        Map<MapleBuffStat, Pair<Integer, Integer>> maxStatups = new LinkedHashMap<>();
        for (Entry<Integer, Map<MapleBuffStat, MapleBuffStatValueHolder>> bel : buffEffects.entrySet()) {
            for (Entry<MapleBuffStat, MapleBuffStatValueHolder> belv : bel.getValue().entrySet()) {
                if (removedStats.contains(belv.getKey())) {
                    if (!retrievedEffects.containsKey(bel.getKey())) {
                        retrievedEffects.put(bel.getKey(), new Pair<>(belv.getValue().effect, belv.getValue().startTime));
                    }
                    Pair<Integer, Integer> thisStat = maxStatups.get(belv.getKey());
                    if (thisStat == null || belv.getValue().value > thisStat.getRight()) {
                        maxStatups.put(belv.getKey(), new Pair<>(bel.getKey(), belv.getValue().value));
                    }
                }
            }
        }
        Map<Integer, Pair<MapleStatEffect, Long>> bestEffects = new LinkedHashMap<>();
        for (Entry<MapleBuffStat, Pair<Integer, Integer>> lmsee : maxStatups.entrySet()) {
            Integer srcid = lmsee.getValue().getLeft();
            if (!bestEffects.containsKey(srcid)) {
                bestEffects.put(srcid, retrievedEffects.get(srcid));
            }
        }
        for (Entry<Integer, Pair<MapleStatEffect, Long>> lmse : bestEffects.entrySet()) {
            lmse.getValue().getLeft().updateBuffEffect(this, getActiveStatupsFromSourceid(lmse.getKey()), lmse.getValue().getRight());
        }
    } finally {
        chrLock.unlock();
    }
}
Also used : LinkedHashMap(java.util.LinkedHashMap) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) EnumMap(java.util.EnumMap) LinkedHashMap(java.util.LinkedHashMap) MapleMap(server.maps.MapleMap) Pair(tools.Pair)

Example 7 with Pair

use of tools.Pair in project HeavenMS by ronancpl.

the class FredrickHandler method handlePacket.

@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    MapleCharacter chr = c.getPlayer();
    byte operation = slea.readByte();
    switch(operation) {
        case // Will never come...
        0x19:
            // c.announce(MaplePacketCreator.getFredrick((byte) 0x24));
            break;
        case 0x1A:
            List<Pair<Item, MapleInventoryType>> items;
            try {
                items = ItemFactory.MERCHANT.loadItems(chr.getId(), false);
                if (!check(chr, items)) {
                    c.announce(MaplePacketCreator.fredrickMessage((byte) 0x21));
                    return;
                }
                chr.gainMeso(chr.getMerchantMeso(), false);
                chr.setMerchantMeso(0);
                if (deleteItems(chr)) {
                    if (chr.getHiredMerchant() != null)
                        chr.getHiredMerchant().clearItems();
                    for (int i = 0; i < items.size(); i++) {
                        Item item = items.get(i).getLeft();
                        MapleInventoryManipulator.addFromDrop(c, item, false);
                        String itemName = MapleItemInformationProvider.getInstance().getName(item.getItemId());
                        FilePrinter.print(FilePrinter.FREDRICK + chr.getName() + ".txt", chr.getName() + " gained " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")\r\n");
                    }
                    c.announce(MaplePacketCreator.fredrickMessage((byte) 0x1E));
                } else {
                    chr.message("An unknown error has occured.");
                }
                break;
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            break;
        case // Exit
        0x1C:
            break;
        default:
    }
}
Also used : Item(client.inventory.Item) MapleCharacter(client.MapleCharacter) SQLException(java.sql.SQLException) Pair(tools.Pair)

Example 8 with Pair

use of tools.Pair in project HeavenMS by ronancpl.

the class MakerSkillHandler method handlePacket.

@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
    int type = slea.readInt();
    int toCreate = slea.readInt();
    int toDisassemble = -1, pos = -1;
    boolean makerSucceeded = true;
    MakerItemCreateEntry recipe;
    Map<Integer, Short> reagentids = new LinkedHashMap<>();
    int stimulantid = -1;
    if (type == 3) {
        // building monster crystal
        int fromLeftover = toCreate;
        toCreate = ii.getMakerCrystalFromLeftover(toCreate);
        if (toCreate == -1) {
            c.announce(MaplePacketCreator.serverNotice(1, ii.getName(toCreate) + " is unavailable for Monster Crystal conversion."));
            return;
        }
        recipe = MakerItemFactory.generateLeftoverCrystalEntry(fromLeftover);
    } else if (type == 4) {
        // disassembling
        // 1... probably inventory type
        slea.readInt();
        pos = slea.readInt();
        Item it = c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem((short) pos);
        if (it != null && it.getItemId() == toCreate) {
            Pair<Integer, Integer> p;
            if ((p = generateDisassemblyInfo(toCreate)) != null) {
                recipe = MakerItemFactory.generateDisassemblyCrystalEntry(p.getLeft(), p.getRight());
                toDisassemble = toCreate;
                toCreate = ii.getMakerCrystalFromEquip(toCreate);
            } else {
                c.announce(MaplePacketCreator.serverNotice(1, ii.getName(toCreate) + " is unavailable for Monster Crystal disassembly."));
                return;
            }
        } else {
            c.announce(MaplePacketCreator.serverNotice(1, "An unknown error occurred when trying to apply that item for disassembly."));
            return;
        }
    } else {
        if (ItemConstants.isEquipment(toCreate)) {
            // only equips uses stimulant and reagents
            if (slea.readByte() != 0) {
                // stimulant
                stimulantid = getMakerStimulant(toCreate);
                if (!c.getAbstractPlayerInteraction().haveItem(stimulantid)) {
                    stimulantid = -1;
                }
            }
            int reagents = Math.min(slea.readInt(), getMakerReagentSlots(toCreate));
            for (int i = 0; i < reagents; i++) {
                // crystals
                int reagentid = slea.readInt();
                if (ItemConstants.isMakerReagent(reagentid)) {
                    Short rs = reagentids.get(reagentid);
                    if (rs == null) {
                        reagentids.put(reagentid, (short) 1);
                    } else {
                        reagentids.put(reagentid, (short) (rs + 1));
                    }
                }
            }
            List<Pair<Integer, Short>> toUpdate = new LinkedList<>();
            for (Entry<Integer, Short> r : reagentids.entrySet()) {
                int qty = c.getAbstractPlayerInteraction().getItemQuantity(r.getKey());
                if (qty < r.getValue()) {
                    toUpdate.add(new Pair<>(r.getKey(), (short) qty));
                }
            }
            // remove those not present on player inventory
            if (!toUpdate.isEmpty()) {
                for (Pair<Integer, Short> rp : toUpdate) {
                    if (rp.getRight() > 0) {
                        reagentids.put(rp.getLeft(), rp.getRight());
                    } else {
                        reagentids.remove(rp.getLeft());
                    }
                }
            }
            if (!reagentids.isEmpty())
                removeOddMakerReagents(toCreate, reagentids);
        }
        recipe = MakerItemFactory.getItemCreateEntry(toCreate, stimulantid, reagentids);
    }
    short createStatus = getCreateStatus(c, recipe);
    switch(createStatus) {
        case // non-available for Maker itemid has been tried to forge
        -1:
            FilePrinter.printError(FilePrinter.EXPLOITS, "Player " + c.getPlayer().getName() + " tried to craft itemid " + toCreate + " using the Maker skill.");
            c.announce(MaplePacketCreator.serverNotice(1, "The requested item could not be crafted on this operation."));
            break;
        case // no items
        1:
            c.announce(MaplePacketCreator.serverNotice(1, "You don't have all required items in your inventory to make " + recipe.getRewardAmount() + " " + ii.getName(toCreate) + "."));
            break;
        case // no meso
        2:
            NumberFormat nf = new DecimalFormat("#,###,###,###");
            c.announce(MaplePacketCreator.serverNotice(1, "You don't have enough mesos (" + nf.format(recipe.getCost()) + ") to complete this operation."));
            break;
        case // no req level
        3:
            c.announce(MaplePacketCreator.serverNotice(1, "You don't have enough level to complete this operation."));
            break;
        case // no req skill level
        4:
            c.announce(MaplePacketCreator.serverNotice(1, "You don't have enough Maker level to complete this operation."));
            break;
        default:
            if (MapleInventoryManipulator.checkSpace(c, toCreate, (short) recipe.getRewardAmount(), "")) {
                for (Pair<Integer, Integer> p : recipe.getReqItems()) {
                    c.getAbstractPlayerInteraction().gainItem(p.getLeft(), (short) -p.getRight());
                }
                if (toDisassemble != -1) {
                    MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIP, (short) pos, (short) 1, false);
                    c.announce(MaplePacketCreator.getShowItemGain(toDisassemble, (short) -1, true));
                }
                int cost = recipe.getCost();
                if (stimulantid == -1 && reagentids.isEmpty()) {
                    if (cost > 0)
                        c.getPlayer().gainMeso(-cost);
                    c.getPlayer().setCS(true);
                    c.getAbstractPlayerInteraction().gainItem(toCreate, (short) recipe.getRewardAmount());
                    c.getPlayer().setCS(false);
                } else {
                    if (stimulantid != -1)
                        c.getAbstractPlayerInteraction().gainItem(stimulantid, (short) -1);
                    if (!reagentids.isEmpty()) {
                        for (Entry<Integer, Short> r : reagentids.entrySet()) {
                            c.getAbstractPlayerInteraction().gainItem(r.getKey(), (short) (-1 * r.getValue()));
                        }
                    }
                    if (cost > 0)
                        c.getPlayer().gainMeso(-cost);
                    makerSucceeded = addBoostedMakerItem(c, toCreate, stimulantid, reagentids);
                }
                if (makerSucceeded)
                    c.announce(MaplePacketCreator.serverNotice(1, "You have successfully created " + recipe.getRewardAmount() + " " + ii.getName(toCreate) + "."));
                else
                    c.getPlayer().dropMessage(5, "The Maker skill lights up, but the skill winds up as if nothing happened.");
                c.announce(MaplePacketCreator.showMakerEffect(makerSucceeded));
                c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showForeignMakerEffect(c.getPlayer().getId(), makerSucceeded), false);
                if (toCreate == 4260003 && c.getPlayer().getQuestStatus(6033) == 1) {
                    c.getAbstractPlayerInteraction().setQuestProgress(6033, 1);
                }
            } else {
                c.announce(MaplePacketCreator.serverNotice(1, "Your inventory is full."));
            }
    }
}
Also used : DecimalFormat(java.text.DecimalFormat) LinkedHashMap(java.util.LinkedHashMap) Item(client.inventory.Item) MakerItemCreateEntry(server.MakerItemFactory.MakerItemCreateEntry) Entry(java.util.Map.Entry) List(java.util.List) LinkedList(java.util.LinkedList) MakerItemCreateEntry(server.MakerItemFactory.MakerItemCreateEntry) Pair(tools.Pair) NumberFormat(java.text.NumberFormat)

Example 9 with Pair

use of tools.Pair in project HeavenMS by ronancpl.

the class PlayerLoggedinHandler method getLocalStartTimes.

private static List<Pair<Long, PlayerBuffValueHolder>> getLocalStartTimes(List<PlayerBuffValueHolder> lpbvl) {
    List<Pair<Long, PlayerBuffValueHolder>> timedBuffs = new ArrayList<>();
    long curtime = System.currentTimeMillis();
    for (PlayerBuffValueHolder pb : lpbvl) {
        timedBuffs.add(new Pair<>(curtime - pb.usedTime, pb));
    }
    Collections.sort(timedBuffs, new Comparator<Pair<Long, PlayerBuffValueHolder>>() {

        @Override
        public int compare(Pair<Long, PlayerBuffValueHolder> p1, Pair<Long, PlayerBuffValueHolder> p2) {
            return p1.getLeft().compareTo(p2.getLeft());
        }
    });
    return timedBuffs;
}
Also used : PlayerBuffValueHolder(net.server.PlayerBuffValueHolder) ArrayList(java.util.ArrayList) CharacterIdChannelPair(net.server.channel.CharacterIdChannelPair) Pair(tools.Pair)

Example 10 with Pair

use of tools.Pair in project HeavenMS by ronancpl.

the class MapleMap method addPlayer.

public void addPlayer(final MapleCharacter chr) {
    int chrSize;
    chrWLock.lock();
    try {
        characters.add(chr);
        chrSize = characters.size();
        addPartyMemberInternal(chr);
    } finally {
        chrWLock.unlock();
    }
    chr.setMapId(mapid);
    itemMonitorTimeout = 1;
    if (chrSize == 1) {
        if (!hasItemMonitor())
            startItemMonitor();
        if (onFirstUserEnter.length() != 0 && !chr.hasEntered(onFirstUserEnter, mapid) && MapScriptManager.getInstance().scriptExists(onFirstUserEnter, true)) {
            chr.enteredScript(onFirstUserEnter, mapid);
            MapScriptManager.getInstance().getMapScript(chr.getClient(), onFirstUserEnter, true);
        }
    }
    if (onUserEnter.length() != 0) {
        if (onUserEnter.equals("cygnusTest") && (mapid < 913040000 || mapid > 913040006)) {
            chr.saveLocation("INTRO");
        }
        MapScriptManager.getInstance().getMapScript(chr.getClient(), onUserEnter, false);
    }
    if (FieldLimit.CANNOTUSEMOUNTS.check(fieldLimit) && chr.getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null) {
        chr.cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING);
        chr.cancelBuffStats(MapleBuffStat.MONSTER_RIDING);
    }
    if (mapid == 923010000 && getMonsterById(9300102) == null) {
        // Kenta's Mount Quest
        spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300102), new Point(77, 426));
    } else if (mapid == 200090060) {
        // To Rien
        chr.announce(MaplePacketCreator.getClock(60));
        TimerManager.getInstance().schedule(new Runnable() {

            @Override
            public void run() {
                if (chr.getMapId() == 200090060) {
                    chr.changeMap(140020300, 0);
                }
            }
        }, 60 * 1000);
    } else if (mapid == 200090070) {
        // To Lith Harbor
        chr.announce(MaplePacketCreator.getClock(60));
        TimerManager.getInstance().schedule(new Runnable() {

            @Override
            public void run() {
                if (chr.getMapId() == 200090070) {
                    chr.changeMap(104000000, 3);
                }
            }
        }, 60 * 1000);
    } else if (mapid == 200090030) {
        // To Ereve (SkyFerry)
        chr.getClient().announce(MaplePacketCreator.getClock(60));
        TimerManager.getInstance().schedule(new Runnable() {

            @Override
            public void run() {
                if (chr.getMapId() == 200090030) {
                    chr.changeMap(130000210, 0);
                }
            }
        }, 60 * 1000);
    } else if (mapid == 200090031) {
        // To Victoria Island (SkyFerry)
        chr.getClient().announce(MaplePacketCreator.getClock(60));
        TimerManager.getInstance().schedule(new Runnable() {

            @Override
            public void run() {
                if (chr.getMapId() == 200090031) {
                    chr.changeMap(101000400, 0);
                }
            }
        }, 60 * 1000);
    } else if (mapid == 200090021) {
        // To Orbis (SkyFerry)
        chr.getClient().announce(MaplePacketCreator.getClock(60));
        TimerManager.getInstance().schedule(new Runnable() {

            @Override
            public void run() {
                if (chr.getMapId() == 200090021) {
                    chr.changeMap(200000161, 0);
                }
            }
        }, 60 * 1000);
    } else if (mapid == 200090020) {
        // To Ereve From Orbis (SkyFerry)
        chr.getClient().announce(MaplePacketCreator.getClock(60));
        TimerManager.getInstance().schedule(new Runnable() {

            @Override
            public void run() {
                if (chr.getMapId() == 200090020) {
                    chr.changeMap(130000210, 0);
                }
            }
        }, 60 * 1000);
    } else if (mapid == 103040400) {
        if (chr.getEventInstance() != null) {
            chr.getEventInstance().movePlayer(chr);
        }
    } else if (MapleMiniDungeonInfo.isDungeonMap(mapid)) {
        MapleMiniDungeon mmd = chr.getClient().getChannelServer().getMiniDungeon(mapid);
        if (mmd != null)
            mmd.registerPlayer(chr);
    }
    MaplePet[] pets = chr.getPets();
    for (int i = 0; i < pets.length; i++) {
        if (pets[i] != null) {
            pets[i].setPos(getGroundBelow(chr.getPosition()));
            chr.announce(MaplePacketCreator.showPet(chr, pets[i], false, false));
        } else {
            break;
        }
    }
    if (chr.isHidden()) {
        broadcastGMMessage(chr, MaplePacketCreator.spawnPlayerMapObject(chr), false);
        chr.announce(MaplePacketCreator.getGMEffect(0x10, (byte) 1));
        List<Pair<MapleBuffStat, Integer>> dsstat = Collections.singletonList(new Pair<MapleBuffStat, Integer>(MapleBuffStat.DARKSIGHT, 0));
        broadcastGMMessage(chr, MaplePacketCreator.giveForeignBuff(chr.getId(), dsstat), false);
    } else {
        broadcastMessage(chr, MaplePacketCreator.spawnPlayerMapObject(chr), false);
    }
    sendObjectPlacement(chr.getClient());
    if (isStartingEventMap() && !eventStarted()) {
        chr.getMap().getPortal("join00").setPortalStatus(false);
    }
    if (hasForcedEquip()) {
        chr.getClient().announce(MaplePacketCreator.showForcedEquip(-1));
    }
    if (specialEquip()) {
        chr.getClient().announce(MaplePacketCreator.coconutScore(0, 0));
        chr.getClient().announce(MaplePacketCreator.showForcedEquip(chr.getTeam()));
    }
    objectWLock.lock();
    try {
        this.mapobjects.put(Integer.valueOf(chr.getObjectId()), chr);
    } finally {
        objectWLock.unlock();
    }
    if (chr.getPlayerShop() != null) {
        addMapObject(chr.getPlayerShop());
    }
    final MapleDragon dragon = chr.getDragon();
    if (dragon != null) {
        dragon.setPosition(chr.getPosition());
        this.addMapObject(dragon);
        if (chr.isHidden()) {
            this.broadcastGMMessage(chr, MaplePacketCreator.spawnDragon(dragon));
        } else {
            this.broadcastMessage(chr, MaplePacketCreator.spawnDragon(dragon));
        }
    }
    MapleStatEffect summonStat = chr.getStatForBuff(MapleBuffStat.SUMMON);
    if (summonStat != null) {
        MapleSummon summon = chr.getSummonByKey(summonStat.getSourceId());
        summon.setPosition(chr.getPosition());
        chr.getMap().spawnSummon(summon);
        updateMapObjectVisibility(chr, summon);
    }
    if (mapEffect != null) {
        mapEffect.sendStartData(chr.getClient());
    }
    chr.getClient().announce(MaplePacketCreator.resetForcedStats());
    if (mapid == 914000200 || mapid == 914000210 || mapid == 914000220) {
        chr.getClient().announce(MaplePacketCreator.aranGodlyStats());
    }
    if (chr.getEventInstance() != null && chr.getEventInstance().isTimerStarted()) {
        chr.getClient().announce(MaplePacketCreator.getClock((int) (chr.getEventInstance().getTimeLeft() / 1000)));
    }
    if (chr.getFitness() != null && chr.getFitness().isTimerStarted()) {
        chr.getClient().announce(MaplePacketCreator.getClock((int) (chr.getFitness().getTimeLeft() / 1000)));
    }
    if (chr.getOla() != null && chr.getOla().isTimerStarted()) {
        chr.getClient().announce(MaplePacketCreator.getClock((int) (chr.getOla().getTimeLeft() / 1000)));
    }
    if (mapid == 109060000) {
        chr.announce(MaplePacketCreator.rollSnowBall(true, 0, null, null));
    }
    MonsterCarnival carnival = chr.getCarnival();
    MonsterCarnivalParty cparty = chr.getCarnivalParty();
    if (carnival != null && cparty != null && (mapid == 980000101 || mapid == 980000201 || mapid == 980000301 || mapid == 980000401 || mapid == 980000501 || mapid == 980000601)) {
        chr.getClient().announce(MaplePacketCreator.getClock((int) (carnival.getTimeLeft() / 1000)));
        chr.getClient().announce(MaplePacketCreator.startCPQ(chr, carnival.oppositeTeam(cparty)));
    }
    if (hasClock()) {
        Calendar cal = Calendar.getInstance();
        chr.getClient().announce((MaplePacketCreator.getClockTime(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND))));
    }
    if (hasBoat() > 0) {
        if (hasBoat() == 1)
            chr.getClient().announce((MaplePacketCreator.boatPacket(true)));
        else
            chr.getClient().announce(MaplePacketCreator.boatPacket(false));
    }
    chr.receivePartyMemberHP();
}
Also used : MapleBuffStat(client.MapleBuffStat) MonsterCarnival(server.partyquest.MonsterCarnival) Calendar(java.util.Calendar) MonsterCarnivalParty(server.partyquest.MonsterCarnivalParty) Point(java.awt.Point) SpawnPoint(server.life.SpawnPoint) Point(java.awt.Point) SpawnPoint(server.life.SpawnPoint) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) MapleStatEffect(server.MapleStatEffect) MaplePet(client.inventory.MaplePet) Pair(tools.Pair)

Aggregations

Pair (tools.Pair)51 ArrayList (java.util.ArrayList)34 Point (java.awt.Point)16 Item (client.inventory.Item)15 LinkedList (java.util.LinkedList)12 MapleData (provider.MapleData)11 SQLException (java.sql.SQLException)10 PreparedStatement (java.sql.PreparedStatement)7 List (java.util.List)7 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)7 MobSkill (server.life.MobSkill)6 MapleCharacter (client.MapleCharacter)5 Connection (java.sql.Connection)5 ResultSet (java.sql.ResultSet)5 MapleMap (server.maps.MapleMap)5 LinkedHashMap (java.util.LinkedHashMap)4 CharacterIdChannelPair (net.server.channel.CharacterIdChannelPair)4 MaplePartyCharacter (net.server.world.MaplePartyCharacter)4 MapleStatEffect (server.MapleStatEffect)4 DatabaseConnection (tools.DatabaseConnection)4