All pastes #45224 Raw Edit

soul crystal bug fix

public java v1 · immutable
#45224 ·published 2006-03-11 09:18 UTC
rendered paste body
// Init some more info now        Random _rnd = new Random();        int dice = _rnd.nextInt(100);        int crystalId = 0;+       int crystalObjectId = 0;        int oldCrystalId = 0;        int newCrystalId = 0;        int crystalOffset = 0;        int crystalsCount = 0;        SystemMessage sm = new SystemMessage(614);        success = false;                // Now we got four choices:        // 1- The Monster level is too low for the crystal. Nothing happens.        // 2- Everything is correct, but it failed. Nothing happens. (57.5%)        // 3- Everything is correct, but it failed. The crystal scatters. A sound event is played. (10%)        // 4- Everything is correct, the crystal level up. A sound event is played. (32.5%)                List<L2PcInstance> players = new FastList<L2PcInstance>();        if (levelPartyCrystals && killer.isInParty())        {            players = killer.getParty().getPartyMembers();        }        else        {            players.add(killer);         }        for (L2PcInstance player : players)        {            // Check how many soul crystals the player has in his inventory and which soul crystal he has            canIncreaseCrystal = true;            success = true;            final L2ItemInstance[] inv = player.getInventory().getItems();            for (int index = 0; index < inv.length; index++)             {                final L2ItemInstance item = inv[index];                if ( (((item.getItemId() >= _REDCRYSTAL_OFFSET) || (item.getItemId() >= _GREENCRYSTAL_OFFSET) || (item.getItemId() >= _BLUECRYSTAL_OFFSET)) &&                     ((item.getItemId() <= _REDCRYSTAL_OFFSET+10) || (item.getItemId() <= _GREENCRYSTAL_OFFSET+10) || (item.getItemId() <= _BLUECRYSTAL_OFFSET+10))) ||                     (item.getItemId() == _REDCRYSTAL_LVL11) || (item.getItemId() == _BLUECRYSTAL_LVL11) || (item.getItemId() == _GREENCRYSTAL_LVL11) ||                      (item.getItemId() == _REDCRYSTAL_LVL12) || (item.getItemId() == _BLUECRYSTAL_LVL12) || (item.getItemId() == _GREENCRYSTAL_LVL12) )                {                    crystalsCount++;                    if (crystalsCount > 1)                    {                        success = false;                        break;    // break the "findCrystals" loop, as we already found more than one crystal.                    }                    crystalId = item.getItemId();+                   crystalObjectId = item.getObjectId();                    crystalOffset = 0;                    for (int crystalLevel = 0; crystalLevel <= _MAX_CRYSTALS_LEVEL; crystalLevel++)                    {                        // Get a crystal offset to calculate the new crystal ID                        if (crystalId == (_REDCRYSTAL_OFFSET + crystalLevel)) crystalOffset = _REDCRYSTAL_OFFSET;                        if (crystalId == (_GREENCRYSTAL_OFFSET + crystalLevel)) crystalOffset = _GREENCRYSTAL_OFFSET;                          if (crystalId == (_BLUECRYSTAL_OFFSET + crystalLevel)) crystalOffset = _BLUECRYSTAL_OFFSET;                        if (crystalLevel > 9)                        {                            if (crystalId == (_REDCRYSTAL_OFFSET+10)) crystalOffset = _REDCRYSTAL_LVL11 - (crystalLevel + 1);                            if (crystalId == (_GREENCRYSTAL_OFFSET+10)) crystalOffset = _GREENCRYSTAL_LVL11 - (crystalLevel + 1);                            if (crystalId == (_BLUECRYSTAL_OFFSET+10)) crystalOffset = _BLUECRYSTAL_LVL11 - (crystalLevel + 1);                            if (crystalId == (_REDCRYSTAL_LVL11)) crystalOffset = _REDCRYSTAL_LVL12 - (crystalLevel + 1);                            if (crystalId == (_GREENCRYSTAL_LVL11)) crystalOffset = _GREENCRYSTAL_LVL12 - (crystalLevel + 1);                            if (crystalId == (_BLUECRYSTAL_LVL11)) crystalOffset = _BLUECRYSTAL_LVL12 - (crystalLevel + 1);                        }                        // If the crystal level is way too high for this mob, say that we can't increase it                        if ((crystalLevel >= minCrystalLevel) && (crystalLevel < maxCrystalLevel))                        {                            canIncreaseCrystal = true;                        }                        else                        {                            canIncreaseCrystal = false;                        }                        // Define crystals' IDs based on the crystalOffset found                        if (crystalOffset > 0)                        {                            oldCrystalId = crystalId;                            newCrystalId = (crystalOffset + crystalLevel) + 1;                            break;   // Break the "findLevel" loop, as we already got the crystal Level.                        }                    }                }            }            // The player has no crystals at all, reset our control vars and skip this player            if (crystalsCount < 1)            {                oldCrystalId = 0;                newCrystalId = 0;                crystalOffset = 0;                crystalsCount = 0;                continue;   // The player doesn't have any crystals with him. Get to the next player.            }            // The player has more than one soul crystal with him, the crystal resonates and we skip this player            if (!success)            {                sm.addString("The soul crystal resonated.");                player.sendPacket(new PlaySound("ItemSound2.broken_key"));                player.sendPacket(sm);                                oldCrystalId = 0;                newCrystalId = 0;                crystalOffset = 0;                crystalsCount = 0;                continue;   // The player failed to increase his crystal as he has more than one crystal.            }            // The soul crystal stage of the player is way too high, refuse to increase it            if (!canIncreaseCrystal)            {                sm.addString("The soul crystal has refused to absorb the soul.");                player.sendPacket(sm);                                oldCrystalId = 0;                newCrystalId = 0;                crystalOffset = 0;                crystalsCount = 0;                continue;   // The player failed to increase his crystal cuz mob is wrong for his crystal level.            }            // If the killer succeeds or it is a boss mob, level up the crystal            if ((dice < _LEVEL_CHANCE) || levelPartyCrystals)            {                // Remove old crystal from the killer's inventory-               final L2ItemInstance oldCrystal = player.getInventory().destroyItem("Absorb", oldCrystalId, 1, player, this);+           	final L2ItemInstance oldCrystal = player.getInventory().destroyItem("Absorb", crystalObjectId, 1, player, this);                if (oldCrystal != null)                 {                    // Add new crystal to the killer's inventory                	player.getInventory().addItem("Absorb", newCrystalId, 1, player, this);                    final SystemMessage sms = new SystemMessage(SystemMessage.EARNED_ITEM);                    // Send a sound event and text message to the player                    player.sendPacket(new PlaySound("ItemSound.quest_itemget"));                    sms.addItemName(newCrystalId);                    player.sendPacket(sms);                    // Send Server->Client packets to notify the killer and update his Inventory                }                player.sendPacket(new ItemList(player, false));            }            else if ((dice >= 100.0 - _BREAK_CHANCE) && !levelPartyCrystals)            {                // Remove old crystal from the killer's inventory-               final L2ItemInstance oldCrystal = player.getInventory().destroyItem("Absorb", oldCrystalId, 1, player, this);+               final L2ItemInstance oldCrystal = player.getInventory().destroyItem("Absorb", crystalObjectId, 1, player, this);                killer.sendPacket(new PlaySound("ItemSound3.sys_enchant_failed"));                //sm.addString("The soul crystal scattered itself.");                killer.sendPacket(sm);                _absorbed = false;                _absorbersList = null;                return;            }            else            {                sm.addString("The soul crystal has failed to absorb the soul.");                player.sendPacket(sm);            }        }