All pastes #45223 Raw Edit

Someone

public text v1 · immutable
#45223 ·published 2006-03-11 09:17 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);
            }
        }