ChangedEnchantTargetItemProbabilityList passive chance does not work with no-grade items.

Contributed by Fakee.
This commit is contained in:
MobiusDevelopment
2022-11-04 01:46:29 +00:00
parent 703c8874f7
commit 54b206e595
4 changed files with 184 additions and 40 deletions

View File

@@ -23,6 +23,7 @@ import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest; import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest;
import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll; import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll;
import org.l2jmobius.gameserver.model.item.type.CrystalType;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -47,8 +48,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
{ {
return false; return false;
} }
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null)) if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null))
{ {
return false; return false;
@@ -60,24 +61,35 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
count = request.getMultiEnchantingItemsCount(); count = request.getMultiEnchantingItemsCount();
} }
final double supportRate = getSupportRate(request);
final double passiveRate = getPassiveRate();
OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet); OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet);
packet.writeD(count); packet.writeD(count);
for (int i = 1; i <= count; i++) for (int i = 1; i <= count; i++)
{ {
// 100,00 % = 10000, because last 2 numbers going after float comma. // 100,00 % = 10000, because last 2 numbers going after float comma.
double baseRate; double baseRate;
double passiveRate;
if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0)) if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0))
{ {
baseRate = getBaseRate(request, i); baseRate = getBaseRate(request, i);
passiveRate = getPassiveRate(request, i);
} }
else else
{ {
baseRate = 0; baseRate = 0;
passiveRate = 0;
} }
double totalRate = baseRate + supportRate + passiveRate; double supportBaseRate = 0;
double passiveBaseRate = 0;
final double supportRate = getSupportRate(request);
if (supportRate != 0)
{
supportBaseRate = (baseRate * supportRate) / 10000;
}
if (passiveRate != 0)
{
passiveBaseRate = (baseRate * passiveRate) / 10000;
}
double totalRate = baseRate + supportBaseRate + passiveBaseRate;
if (totalRate >= 10000) if (totalRate >= 10000)
{ {
totalRate = 10000; totalRate = 10000;
@@ -92,8 +104,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
} }
packet.writeD((int) totalRate); // Total success. packet.writeD((int) totalRate); // Total success.
packet.writeD((int) baseRate); // Base success. packet.writeD((int) baseRate); // Base success.
packet.writeD((int) supportRate); // Support success. packet.writeD((int) supportBaseRate); // Support success.
packet.writeD((int) passiveRate); // Passive success (items, skills). packet.writeD((int) passiveBaseRate); // Passive success (items, skills).
} }
return true; return true;
} }
@@ -115,13 +127,37 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
return (int) supportRate; return (int) supportRate;
} }
private int getPassiveRate() private int getPassiveRate(EnchantItemRequest request, int iteration)
{ {
double passiveRate = 0; double passiveRate = 0;
if (_player.getStat().getValue(ENCHANT_RATE) != 0) if (_player.getStat().getValue(ENCHANT_RATE) != 0)
{ {
passiveRate = _player.getStat().getValue(ENCHANT_RATE); if (!_isMulti)
passiveRate = passiveRate * 100; {
final int crystalLevel = request.getEnchantingItem().getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
else
{
final int crystalLevel = _player.getInventory().getItemByObjectId(request.getMultiEnchantingItemsBySlot(iteration)).getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
} }
return (int) passiveRate; return (int) passiveRate;
} }

View File

@@ -23,6 +23,7 @@ import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest; import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest;
import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll; import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll;
import org.l2jmobius.gameserver.model.item.type.CrystalType;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -47,8 +48,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
{ {
return false; return false;
} }
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null)) if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null))
{ {
return false; return false;
@@ -60,24 +61,35 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
count = request.getMultiEnchantingItemsCount(); count = request.getMultiEnchantingItemsCount();
} }
final double supportRate = getSupportRate(request);
final double passiveRate = getPassiveRate();
OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet); OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet);
packet.writeD(count); packet.writeD(count);
for (int i = 1; i <= count; i++) for (int i = 1; i <= count; i++)
{ {
// 100,00 % = 10000, because last 2 numbers going after float comma. // 100,00 % = 10000, because last 2 numbers going after float comma.
double baseRate; double baseRate;
double passiveRate;
if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0)) if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0))
{ {
baseRate = getBaseRate(request, i); baseRate = getBaseRate(request, i);
passiveRate = getPassiveRate(request, i);
} }
else else
{ {
baseRate = 0; baseRate = 0;
passiveRate = 0;
} }
double totalRate = baseRate + supportRate + passiveRate; double supportBaseRate = 0;
double passiveBaseRate = 0;
final double supportRate = getSupportRate(request);
if (supportRate != 0)
{
supportBaseRate = (baseRate * supportRate) / 10000;
}
if (passiveRate != 0)
{
passiveBaseRate = (baseRate * passiveRate) / 10000;
}
double totalRate = baseRate + supportBaseRate + passiveBaseRate;
if (totalRate >= 10000) if (totalRate >= 10000)
{ {
totalRate = 10000; totalRate = 10000;
@@ -92,8 +104,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
} }
packet.writeD((int) totalRate); // Total success. packet.writeD((int) totalRate); // Total success.
packet.writeD((int) baseRate); // Base success. packet.writeD((int) baseRate); // Base success.
packet.writeD((int) supportRate); // Support success. packet.writeD((int) supportBaseRate); // Support success.
packet.writeD((int) passiveRate); // Passive success (items, skills). packet.writeD((int) passiveBaseRate); // Passive success (items, skills).
} }
return true; return true;
} }
@@ -115,13 +127,37 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
return (int) supportRate; return (int) supportRate;
} }
private int getPassiveRate() private int getPassiveRate(EnchantItemRequest request, int iteration)
{ {
double passiveRate = 0; double passiveRate = 0;
if (_player.getStat().getValue(ENCHANT_RATE) != 0) if (_player.getStat().getValue(ENCHANT_RATE) != 0)
{ {
passiveRate = _player.getStat().getValue(ENCHANT_RATE); if (!_isMulti)
passiveRate = passiveRate * 100; {
final int crystalLevel = request.getEnchantingItem().getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
else
{
final int crystalLevel = _player.getInventory().getItemByObjectId(request.getMultiEnchantingItemsBySlot(iteration)).getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
} }
return (int) passiveRate; return (int) passiveRate;
} }

View File

@@ -23,6 +23,7 @@ import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest; import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest;
import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll; import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll;
import org.l2jmobius.gameserver.model.item.type.CrystalType;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -47,8 +48,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
{ {
return false; return false;
} }
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null)) if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null))
{ {
return false; return false;
@@ -60,24 +61,35 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
count = request.getMultiEnchantingItemsCount(); count = request.getMultiEnchantingItemsCount();
} }
final double supportRate = getSupportRate(request);
final double passiveRate = getPassiveRate();
OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet); OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet);
packet.writeD(count); packet.writeD(count);
for (int i = 1; i <= count; i++) for (int i = 1; i <= count; i++)
{ {
// 100,00 % = 10000, because last 2 numbers going after float comma. // 100,00 % = 10000, because last 2 numbers going after float comma.
double baseRate; double baseRate;
double passiveRate;
if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0)) if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0))
{ {
baseRate = getBaseRate(request, i); baseRate = getBaseRate(request, i);
passiveRate = getPassiveRate(request, i);
} }
else else
{ {
baseRate = 0; baseRate = 0;
passiveRate = 0;
} }
double totalRate = baseRate + supportRate + passiveRate; double supportBaseRate = 0;
double passiveBaseRate = 0;
final double supportRate = getSupportRate(request);
if (supportRate != 0)
{
supportBaseRate = (baseRate * supportRate) / 10000;
}
if (passiveRate != 0)
{
passiveBaseRate = (baseRate * passiveRate) / 10000;
}
double totalRate = baseRate + supportBaseRate + passiveBaseRate;
if (totalRate >= 10000) if (totalRate >= 10000)
{ {
totalRate = 10000; totalRate = 10000;
@@ -92,8 +104,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
} }
packet.writeD((int) totalRate); // Total success. packet.writeD((int) totalRate); // Total success.
packet.writeD((int) baseRate); // Base success. packet.writeD((int) baseRate); // Base success.
packet.writeD((int) supportRate); // Support success. packet.writeD((int) supportBaseRate); // Support success.
packet.writeD((int) passiveRate); // Passive success (items, skills). packet.writeD((int) passiveBaseRate); // Passive success (items, skills).
} }
return true; return true;
} }
@@ -115,13 +127,37 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
return (int) supportRate; return (int) supportRate;
} }
private int getPassiveRate() private int getPassiveRate(EnchantItemRequest request, int iteration)
{ {
double passiveRate = 0; double passiveRate = 0;
if (_player.getStat().getValue(ENCHANT_RATE) != 0) if (_player.getStat().getValue(ENCHANT_RATE) != 0)
{ {
passiveRate = _player.getStat().getValue(ENCHANT_RATE); if (!_isMulti)
passiveRate = passiveRate * 100; {
final int crystalLevel = request.getEnchantingItem().getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
else
{
final int crystalLevel = _player.getInventory().getItemByObjectId(request.getMultiEnchantingItemsBySlot(iteration)).getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
} }
return (int) passiveRate; return (int) passiveRate;
} }

View File

@@ -23,6 +23,7 @@ import org.l2jmobius.gameserver.data.xml.EnchantItemData;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest; import org.l2jmobius.gameserver.model.actor.request.EnchantItemRequest;
import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll; import org.l2jmobius.gameserver.model.item.enchant.EnchantScroll;
import org.l2jmobius.gameserver.model.item.type.CrystalType;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -47,8 +48,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
{ {
return false; return false;
} }
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
final EnchantItemRequest request = _player.getRequest(EnchantItemRequest.class);
if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null)) if ((!_isMulti && (request.getEnchantingItem() == null)) || request.isProcessing() || (request.getEnchantingScroll() == null))
{ {
return false; return false;
@@ -60,24 +61,35 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
count = request.getMultiEnchantingItemsCount(); count = request.getMultiEnchantingItemsCount();
} }
final double supportRate = getSupportRate(request);
final double passiveRate = getPassiveRate();
OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet); OutgoingPackets.EX_CHANGED_ENCHANT_TARGET_ITEM_PROB_LIST.writeId(packet);
packet.writeD(count); packet.writeD(count);
for (int i = 1; i <= count; i++) for (int i = 1; i <= count; i++)
{ {
// 100,00 % = 10000, because last 2 numbers going after float comma. // 100,00 % = 10000, because last 2 numbers going after float comma.
double baseRate; double baseRate;
double passiveRate;
if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0)) if (!_isMulti || (request.getMultiEnchantingItemsBySlot(i) != 0))
{ {
baseRate = getBaseRate(request, i); baseRate = getBaseRate(request, i);
passiveRate = getPassiveRate(request, i);
} }
else else
{ {
baseRate = 0; baseRate = 0;
passiveRate = 0;
} }
double totalRate = baseRate + supportRate + passiveRate; double supportBaseRate = 0;
double passiveBaseRate = 0;
final double supportRate = getSupportRate(request);
if (supportRate != 0)
{
supportBaseRate = (baseRate * supportRate) / 10000;
}
if (passiveRate != 0)
{
passiveBaseRate = (baseRate * passiveRate) / 10000;
}
double totalRate = baseRate + supportBaseRate + passiveBaseRate;
if (totalRate >= 10000) if (totalRate >= 10000)
{ {
totalRate = 10000; totalRate = 10000;
@@ -92,8 +104,8 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
} }
packet.writeD((int) totalRate); // Total success. packet.writeD((int) totalRate); // Total success.
packet.writeD((int) baseRate); // Base success. packet.writeD((int) baseRate); // Base success.
packet.writeD((int) supportRate); // Support success. packet.writeD((int) supportBaseRate); // Support success.
packet.writeD((int) passiveRate); // Passive success (items, skills). packet.writeD((int) passiveBaseRate); // Passive success (items, skills).
} }
return true; return true;
} }
@@ -115,13 +127,37 @@ public class ChangedEnchantTargetItemProbabilityList implements IClientOutgoingP
return (int) supportRate; return (int) supportRate;
} }
private int getPassiveRate() private int getPassiveRate(EnchantItemRequest request, int iteration)
{ {
double passiveRate = 0; double passiveRate = 0;
if (_player.getStat().getValue(ENCHANT_RATE) != 0) if (_player.getStat().getValue(ENCHANT_RATE) != 0)
{ {
passiveRate = _player.getStat().getValue(ENCHANT_RATE); if (!_isMulti)
passiveRate = passiveRate * 100; {
final int crystalLevel = request.getEnchantingItem().getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
else
{
final int crystalLevel = _player.getInventory().getItemByObjectId(request.getMultiEnchantingItemsBySlot(iteration)).getTemplate().getCrystalType().getLevel();
if ((crystalLevel == CrystalType.NONE.getLevel()) || (crystalLevel == CrystalType.EVENT.getLevel()))
{
passiveRate = 0;
}
else
{
passiveRate = _player.getStat().getValue(ENCHANT_RATE);
passiveRate = passiveRate * 100;
}
}
} }
return (int) passiveRate; return (int) passiveRate;
} }