public static void combineTalismans(Player activeChar)
{
List<int[]> sameIds = new ArrayList<>();
for (ItemInstance item : activeChar.getInventory().getItems())
{
// Getting talisman
if ((item.getLifeTime() > 0) && item.getName().contains("Talisman"))
{
talismanAddToCurrent(sameIds, item.getItemId());
}
}
int allCount = 0;
int newCount = 0;
for (int[] idCount : sameIds)
{
// Item Count > 1
if (idCount[1] > 1)
{
int lifeTime = 0;
List<ItemInstance> existingTalismans = activeChar.getInventory().getItemsByItemId(idCount[0]);
for (ItemInstance existingTalisman : existingTalismans)
{
lifeTime += existingTalisman.getLifeTime();
activeChar.getInventory().destroyItem(existingTalisman, "Combine Talismans");
}
ItemInstance newTalisman = activeChar.getInventory().addItem(idCount[0], 1L, "Combine Talismans");
newTalisman.setLifeTime(lifeTime);
newTalisman.setJdbcState(JdbcEntityState.UPDATED);
newTalisman.update();
activeChar.sendPacket(new InventoryUpdate().addModifiedItem(newTalisman));
allCount += idCount[0];
newCount++;
}
}
if (allCount > 0)
{
activeChar.sendMessage(allCount + " Talismans were combined into " + newCount);
}
else
{
activeChar.sendMessage("You don't have Talismans to combine!");
}
}
private static void talismanAddToCurrent(List<int[]> sameIds, int itemId)
{
for (int i = 0; i < sameIds.size(); i++)
{
if (sameIds.get(i)[0] == itemId)
{
sameIds.get(i)[1] = sameIds.get(i)[1] + 1;
return;
}
}
sameIds.add(new int[]
{
itemId,
1
});
}
else if (command.equalsIgnoreCase("combinetalismans"))
{
activeChar.sendMessage("Combining talismans...");
try
{
// TalismanId, List<TalismansWithThisId>
Map<Integer, List<L2ItemInstance>> talismans = new FastMap<>();
for (L2ItemInstance item : activeChar.getInventory().getItems())
{
if (item == null || !item.isShadowItem()) // Talismans are shadow items.
continue;
int itemId = item.getItemId();
// Get only the talismans.
if (!Util.contains(TALISMAN_IDS, itemId))
continue;
if (!talismans.containsKey(itemId))
talismans.put(itemId, new FastList<L2ItemInstance>());
talismans.get(itemId).add(item);
}
activeChar.sendMessage("... results:");
// Now same talismans are under 1 list. Loop this list to combine them.
for (Entry<Integer, List<L2ItemInstance>> n3 : talismans.entrySet())
{
List<L2ItemInstance> sameTalismans = n3.getValue();
if (sameTalismans.size() <= 1) // We need at least 2 talismans.
continue;
List<L2ItemInstance> talismansToCharge = new FastList<>(); // The talisman(s) that isnt(arent) going to be destroyed, but charged.
// First, find the equipped talisman, it is with charge priority.
for (L2ItemInstance talisman : sameTalismans)
{
if (talisman.isEquipped())
{
talismansToCharge.add(talisman); // Add to the chargable talismans.
sameTalismans.remove(talisman); // and remove it from the list, because we will loop it again and we dont want that item there.
}
}
if (talismansToCharge.isEmpty())
talismansToCharge.add(sameTalismans.remove(0));
// Second loop, charge the talismans.
int index = 0;
for (L2ItemInstance talisman : sameTalismans)
{
if (index >= talismansToCharge.size())
index = 0;
L2ItemInstance talismanToCharge = talismansToCharge.get(index++);
int chargeMana = talisman.getMana();
if (activeChar.destroyItem("Talisman Charge Delete", talisman.getObjectId(), 1, talismanToCharge, false))
talismanToCharge.decreaseMana(false, -chargeMana); // Minus in decrease = increase :P
}
String talismanIdName = ItemTable.getInstance().createDummyItem(n3.getKey()).getName();
activeChar.sendMessage(talismanIdName + " has successfully combined.");
}
}
catch (Exception e)
{
activeChar.sendMessage("There was a problem while combining your talismans, please consult with an admin, and tell him this date: " + Util.getDateString(new Date(System.currentTimeMillis())));
_log.log(Level.WARNING, "Error while combining talismans: ", e);
}
}
public static final int[] TALISMAN_IDS =
{
9914, // Blue Talisman of Power
9915, // Blue Talisman of Wild Magic
9916, // Blue Talisman of Defense
9917, // Red Talisman of Minimum Clarity
9918, // Red Talisman of Maximum Clarity
9919, // Blue Talisman of Reflection
9920, // Blue Talisman of Invisibility
9921, // Blue Talisman - Shield Protection
9922, // Black Talisman - Mending
9923, // Black Talisman - Escape
9924, // Blue Talisman of Healing
9925, // Red Talisman of Recovery
9926, // Blue Talisman of Defense
9927, // Blue Talisman of Magic Defense
9928, // Red Talisman of Mental Regeneration
9929, // Blue Talisman of Protection
9930, // Blue Talisman of Evasion
9931, // Red Talisman of Meditation
9932, // Blue Talisman - Divine Protection
9933, // Yellow Talisman of Power
9934, // Yellow Talisman of Violent Haste
9935, // Yellow Talisman of Arcane Defense
9936, // Yellow Talisman of Arcane Power
9937, // Yellow Talisman of Arcane Haste
9938, // Yellow Talisman of Accuracy
9939, // Yellow Talisman of Defense
9940, // Yellow Talisman of Alacrity
9941, // Yellow Talisman of Speed
9942, // Yellow Talisman of Critical Reduction
9943, // Yellow Talisman of Critical Damage
9944, // Yellow Talisman of Critical Dodging
9945, // Yellow Talisman of Evasion
9946, // Yellow Talisman of Healing
9947, // Yellow Talisman of CP Regeneration
9948, // Yellow Talisman of Physical Regeneration
9949, // Yellow Talisman of Mental Regeneration
9950, // Grey Talisman of Weight Training
9951, // Grey Talisman of Mid-Grade Fishing
9952, // Orange Talisman - Hot Springs CP Potion
9953, // Orange Talisman - Elixir of Life
9954, // Orange Talisman - Elixir of Mental Strength
9955, // Black Talisman - Vocalization
9956, // Black Talisman - Arcane Freedom
9957, // Black Talisman - Physical Freedom
9958, // Black Talisman - Rescue
9959, // Black Talisman - Free Speech
9960, // White Talisman of Bravery
9961, // White Talisman of Motion
9962, // White Talisman of Grounding
9963, // White Talisman of Attention
9964, // White Talisman of Bandages
9965, // White Talisman of Protection
9966, // White Talisman of Freedom
10141, // Grey Talisman - Yeti Transform
10142, // Grey Talisman - Buffalo Transform
10158, // Grey Talisman of Upper Grade Fishing
10416, // Blue Talisman - Explosion
10417, // Blue Talisman - Magic Explosion
10418, // White Talisman - Storm
10419, // White Talisman - Darkness
10420, // White Talisman - Water
10421, // White Talisman - Fire
10422, // White Talisman - Light
10423, // Blue Talisman - Self-Destruction
10424, // Blue Talisman - Greater Healing
10518, // Red Talisman - Life Force
10519, // White Talisman - Earth
10533, // Blue Talisman - P. Atk.
10534, // Blue Talisman - Shield Defense
10535, // Yellow Talisman - P. Def.
10536, // Yellow Talisman - M. Atk.
10537, // Yellow Talisman - Evasion
10538, // Yellow Talisman - Healing Power
10539, // Yellow Talisman - CP Recovery Rate
10540, // Yellow Talisman - HP Recovery Rate
10541, // Yellow Talisman - Low Grade MP Recovery Rate
10542, // Red Talisman - HP/CP Recovery
10543, // Yellow Talisman - Speed
12815, // Red Talisman - Max CP
12816, // Red Talisman - CP Regeneration
12817, // Yellow Talisman - Increase Force
12818, // Yellow Talisman - Damage Transition
14604, // Red Talisman - Territory Guardian
14605, // Red Talisman - Territory Guard
14810, // Blue Talisman - Buff Cancel
14811, // Blue Talisman - Buff Steal
14812, // Red Talisman - Territory Guard
14813, // Blue Talisman - Lord's Divine Protection
14814, // White Talisman - All Resistance
17051, // Talisman - STR
17052, // Talisman - DEX
17053, // Talisman - CON
17054, // Talisman - WIT
17055, // Talisman - INT
17056, // Talisman - MEN
17057, // Talisman - Resistance to Stun
17058, // Talisman - Resistance to Sleep
17059, // Talisman - Resistance to Hold
17060, // Talisman - Paralyze Resistance
17061, // Talisman - ALL STAT
22326, // Blue Talisman - Buff Cancel
22327 // Blue Talisman - Buff Steal
};
else if (command.equalsIgnoreCase("combinetalismans"))
{
activeChar.sendMessage(new CustomMessage("wp.gameserver.handler.voicecommands.impl.randomcommands.message6", activeChar));
try
{
InventoryUpdate iu = new InventoryUpdate();
// TalismanId, List<TalismansWithThisId>
Map<Integer, List<ItemInstance>> talismans = new FastMap<>();
for (ItemInstance item : activeChar.getInventory().getItems())
{
if (item == null || !item.isShadowItem()) // Talismans are shadow items.
continue;
int itemId = item.getItemId();
if (!Util.contains(ItemFunctions.TALISMAN_IDS, itemId))
continue;
if (!talismans.containsKey(itemId))
talismans.put(itemId, new FastTable<ItemInstance>());
talismans.get(itemId).add(item);
}
activeChar.sendMessage(new CustomMessage("wp.gameserver.handler.voicecommands.impl.randomcommands.message7", activeChar));
// Now same talismans are under 1 list. Loop this list to combine them.
for (List<ItemInstance> sameTalismans : talismans.values())
{
if (sameTalismans.size() <= 1) // We need at least 2 talismans.
continue;
ItemInstance talismanToCharge = null; // The talisman that isnt going to be destroyed, but charged.
talismanToCharge = sameTalismans.stream().filter(t -> t.isEquipped()).findAny().orElse(sameTalismans.remove(0)); // Equipped talismans are chosen to be charged, else a random one.
// Charge the talisman with the other talismans of the same kind.
int lifeTime = talismanToCharge.getLifeTime();
lifeTime += sameTalismans.stream().filter(t -> activeChar.getInventory().destroyItem(t)).mapToInt(t -> t.getLifeTime()).sum();
talismanToCharge.setLifeTime(lifeTime);
talismanToCharge.setJdbcState(JdbcEntityState.UPDATED);
talismanToCharge.update();
activeChar.sendMessage(new CustomMessage("wp.gameserver.handler.voicecommands.impl.randomcommands.message8", activeChar).addString(talismanToCharge.getName()));
iu.addModifiedItem(talismanToCharge);
}
activeChar.sendPacket(iu);
}
catch (Exception e)
{
activeChar.sendMessage(new CustomMessage("wp.gameserver.handler.voicecommands.impl.randomcommands.message9", activeChar).addString(TimeUtils.getDateString(new Date(System.currentTimeMillis()))));
_log.warn("Error while combining talismans: ", e);
}
}