Inventory check for alchemy conversion.

This commit is contained in:
MobiusDevelopment
2019-03-19 00:32:19 +00:00
parent 8d1410672d
commit 6921c60868
7 changed files with 182 additions and 35 deletions

View File

@@ -19,11 +19,14 @@ package com.l2jmobius.gameserver.network.clientpackets.alchemy;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.AlchemyData; import com.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.PrivateStoreType; import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData; import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -68,26 +71,26 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player)) if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
return; return;
} }
else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE)) else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
return; return;
} }
else if (player.isDead()) else if (player.isDead())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
return; return;
} }
else if (player.isMovementDisabled()) else if (player.isMovementDisabled())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
return; return;
} }
@@ -132,6 +135,10 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
} }
// Calculate success and failure count. // Calculate success and failure count.
final L2Item successItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionSuccess().getId());
final L2Item failureItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionFailure().getId());
int totalWeight = 0;
int totalslots = (successItemTemplate.isStackable() ? 1 : 0) + (failureItemTemplate.isStackable() ? 1 : 0);
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
for (int i = 0; i < _craftTimes; i++) for (int i = 0; i < _craftTimes; i++)
@@ -139,23 +146,37 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (Rnd.get(100) < baseChance) if (Rnd.get(100) < baseChance)
{ {
successCount++; successCount++;
totalWeight += successItemTemplate.getWeight();
totalslots += successItemTemplate.isStackable() ? 0 : 1;
} }
else else
{ {
failureCount++; failureCount++;
totalWeight += failureItemTemplate.getWeight();
totalslots += failureItemTemplate.isStackable() ? 0 : 1;
} }
} }
// Check if player has enough ingredients.
for (ItemHolder ingredient : data.getIngredients()) for (ItemHolder ingredient : data.getIngredients())
{ {
if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes)) if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes))
{ {
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
return; return;
} }
} }
// Weight and capacity check.
final PcInventory inventory = player.getInventory();
if (!inventory.validateWeight(totalWeight) || ((totalslots > 0) && !inventory.validateCapacity(totalslots)))
{
player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.THERE_IS_NOT_ENOUGH_INVENTORY_SPACE_PLEASE_MAKE_MORE_ROOM_AND_TRY_AGAIN);
return;
}
final InventoryUpdate ui = new InventoryUpdate(); final InventoryUpdate ui = new InventoryUpdate();
// Destroy ingredients. // Destroy ingredients.

View File

@@ -19,11 +19,14 @@ package com.l2jmobius.gameserver.network.clientpackets.alchemy;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.AlchemyData; import com.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.PrivateStoreType; import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData; import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -68,26 +71,26 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player)) if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
return; return;
} }
else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE)) else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
return; return;
} }
else if (player.isDead()) else if (player.isDead())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
return; return;
} }
else if (player.isMovementDisabled()) else if (player.isMovementDisabled())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
return; return;
} }
@@ -132,6 +135,10 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
} }
// Calculate success and failure count. // Calculate success and failure count.
final L2Item successItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionSuccess().getId());
final L2Item failureItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionFailure().getId());
int totalWeight = 0;
int totalslots = (successItemTemplate.isStackable() ? 1 : 0) + (failureItemTemplate.isStackable() ? 1 : 0);
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
for (int i = 0; i < _craftTimes; i++) for (int i = 0; i < _craftTimes; i++)
@@ -139,23 +146,37 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (Rnd.get(100) < baseChance) if (Rnd.get(100) < baseChance)
{ {
successCount++; successCount++;
totalWeight += successItemTemplate.getWeight();
totalslots += successItemTemplate.isStackable() ? 0 : 1;
} }
else else
{ {
failureCount++; failureCount++;
totalWeight += failureItemTemplate.getWeight();
totalslots += failureItemTemplate.isStackable() ? 0 : 1;
} }
} }
// Check if player has enough ingredients.
for (ItemHolder ingredient : data.getIngredients()) for (ItemHolder ingredient : data.getIngredients())
{ {
if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes)) if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes))
{ {
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
return; return;
} }
} }
// Weight and capacity check.
final PcInventory inventory = player.getInventory();
if (!inventory.validateWeight(totalWeight) || ((totalslots > 0) && !inventory.validateCapacity(totalslots)))
{
player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.THERE_IS_NOT_ENOUGH_INVENTORY_SPACE_PLEASE_MAKE_MORE_ROOM_AND_TRY_AGAIN);
return;
}
final InventoryUpdate ui = new InventoryUpdate(); final InventoryUpdate ui = new InventoryUpdate();
// Destroy ingredients. // Destroy ingredients.

View File

@@ -19,11 +19,14 @@ package com.l2jmobius.gameserver.network.clientpackets.alchemy;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.AlchemyData; import com.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.PrivateStoreType; import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData; import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -68,26 +71,26 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player)) if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
return; return;
} }
else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE)) else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
return; return;
} }
else if (player.isDead()) else if (player.isDead())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
return; return;
} }
else if (player.isMovementDisabled()) else if (player.isMovementDisabled())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
return; return;
} }
@@ -132,6 +135,10 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
} }
// Calculate success and failure count. // Calculate success and failure count.
final L2Item successItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionSuccess().getId());
final L2Item failureItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionFailure().getId());
int totalWeight = 0;
int totalslots = (successItemTemplate.isStackable() ? 1 : 0) + (failureItemTemplate.isStackable() ? 1 : 0);
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
for (int i = 0; i < _craftTimes; i++) for (int i = 0; i < _craftTimes; i++)
@@ -139,23 +146,37 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (Rnd.get(100) < baseChance) if (Rnd.get(100) < baseChance)
{ {
successCount++; successCount++;
totalWeight += successItemTemplate.getWeight();
totalslots += successItemTemplate.isStackable() ? 0 : 1;
} }
else else
{ {
failureCount++; failureCount++;
totalWeight += failureItemTemplate.getWeight();
totalslots += failureItemTemplate.isStackable() ? 0 : 1;
} }
} }
// Check if player has enough ingredients.
for (ItemHolder ingredient : data.getIngredients()) for (ItemHolder ingredient : data.getIngredients())
{ {
if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes)) if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes))
{ {
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
return; return;
} }
} }
// Weight and capacity check.
final PcInventory inventory = player.getInventory();
if (!inventory.validateWeight(totalWeight) || ((totalslots > 0) && !inventory.validateCapacity(totalslots)))
{
player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.THERE_IS_NOT_ENOUGH_INVENTORY_SPACE_PLEASE_MAKE_MORE_ROOM_AND_TRY_AGAIN);
return;
}
final InventoryUpdate ui = new InventoryUpdate(); final InventoryUpdate ui = new InventoryUpdate();
// Destroy ingredients. // Destroy ingredients.

View File

@@ -19,11 +19,14 @@ package com.l2jmobius.gameserver.network.clientpackets.alchemy;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.AlchemyData; import com.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.PrivateStoreType; import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData; import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -68,26 +71,26 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player)) if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
return; return;
} }
else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE)) else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
return; return;
} }
else if (player.isDead()) else if (player.isDead())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
return; return;
} }
else if (player.isMovementDisabled()) else if (player.isMovementDisabled())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
return; return;
} }
@@ -132,6 +135,10 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
} }
// Calculate success and failure count. // Calculate success and failure count.
final L2Item successItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionSuccess().getId());
final L2Item failureItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionFailure().getId());
int totalWeight = 0;
int totalslots = (successItemTemplate.isStackable() ? 1 : 0) + (failureItemTemplate.isStackable() ? 1 : 0);
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
for (int i = 0; i < _craftTimes; i++) for (int i = 0; i < _craftTimes; i++)
@@ -139,23 +146,37 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (Rnd.get(100) < baseChance) if (Rnd.get(100) < baseChance)
{ {
successCount++; successCount++;
totalWeight += successItemTemplate.getWeight();
totalslots += successItemTemplate.isStackable() ? 0 : 1;
} }
else else
{ {
failureCount++; failureCount++;
totalWeight += failureItemTemplate.getWeight();
totalslots += failureItemTemplate.isStackable() ? 0 : 1;
} }
} }
// Check if player has enough ingredients.
for (ItemHolder ingredient : data.getIngredients()) for (ItemHolder ingredient : data.getIngredients())
{ {
if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes)) if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes))
{ {
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
return; return;
} }
} }
// Weight and capacity check.
final PcInventory inventory = player.getInventory();
if (!inventory.validateWeight(totalWeight) || ((totalslots > 0) && !inventory.validateCapacity(totalslots)))
{
player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.THERE_IS_NOT_ENOUGH_INVENTORY_SPACE_PLEASE_MAKE_MORE_ROOM_AND_TRY_AGAIN);
return;
}
final InventoryUpdate ui = new InventoryUpdate(); final InventoryUpdate ui = new InventoryUpdate();
// Destroy ingredients. // Destroy ingredients.

View File

@@ -19,11 +19,14 @@ package com.l2jmobius.gameserver.network.clientpackets.alchemy;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.AlchemyData; import com.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.PrivateStoreType; import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData; import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -68,26 +71,26 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player)) if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
return; return;
} }
else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE)) else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
return; return;
} }
else if (player.isDead()) else if (player.isDead())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
return; return;
} }
else if (player.isMovementDisabled()) else if (player.isMovementDisabled())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
return; return;
} }
@@ -132,6 +135,10 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
} }
// Calculate success and failure count. // Calculate success and failure count.
final L2Item successItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionSuccess().getId());
final L2Item failureItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionFailure().getId());
int totalWeight = 0;
int totalslots = (successItemTemplate.isStackable() ? 1 : 0) + (failureItemTemplate.isStackable() ? 1 : 0);
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
for (int i = 0; i < _craftTimes; i++) for (int i = 0; i < _craftTimes; i++)
@@ -139,23 +146,37 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (Rnd.get(100) < baseChance) if (Rnd.get(100) < baseChance)
{ {
successCount++; successCount++;
totalWeight += successItemTemplate.getWeight();
totalslots += successItemTemplate.isStackable() ? 0 : 1;
} }
else else
{ {
failureCount++; failureCount++;
totalWeight += failureItemTemplate.getWeight();
totalslots += failureItemTemplate.isStackable() ? 0 : 1;
} }
} }
// Check if player has enough ingredients.
for (ItemHolder ingredient : data.getIngredients()) for (ItemHolder ingredient : data.getIngredients())
{ {
if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes)) if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes))
{ {
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
return; return;
} }
} }
// Weight and capacity check.
final PcInventory inventory = player.getInventory();
if (!inventory.validateWeight(totalWeight) || ((totalslots > 0) && !inventory.validateCapacity(totalslots)))
{
player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.THERE_IS_NOT_ENOUGH_INVENTORY_SPACE_PLEASE_MAKE_MORE_ROOM_AND_TRY_AGAIN);
return;
}
final InventoryUpdate ui = new InventoryUpdate(); final InventoryUpdate ui = new InventoryUpdate();
// Destroy ingredients. // Destroy ingredients.

View File

@@ -19,11 +19,14 @@ package com.l2jmobius.gameserver.network.clientpackets.alchemy;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.AlchemyData; import com.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.PrivateStoreType; import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData; import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -68,26 +71,26 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player)) if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
return; return;
} }
else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE)) else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
return; return;
} }
else if (player.isDead()) else if (player.isDead())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
return; return;
} }
else if (player.isMovementDisabled()) else if (player.isMovementDisabled())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
return; return;
} }
@@ -132,6 +135,10 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
} }
// Calculate success and failure count. // Calculate success and failure count.
final L2Item successItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionSuccess().getId());
final L2Item failureItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionFailure().getId());
int totalWeight = 0;
int totalslots = (successItemTemplate.isStackable() ? 1 : 0) + (failureItemTemplate.isStackable() ? 1 : 0);
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
for (int i = 0; i < _craftTimes; i++) for (int i = 0; i < _craftTimes; i++)
@@ -139,23 +146,37 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (Rnd.get(100) < baseChance) if (Rnd.get(100) < baseChance)
{ {
successCount++; successCount++;
totalWeight += successItemTemplate.getWeight();
totalslots += successItemTemplate.isStackable() ? 0 : 1;
} }
else else
{ {
failureCount++; failureCount++;
totalWeight += failureItemTemplate.getWeight();
totalslots += failureItemTemplate.isStackable() ? 0 : 1;
} }
} }
// Check if player has enough ingredients.
for (ItemHolder ingredient : data.getIngredients()) for (ItemHolder ingredient : data.getIngredients())
{ {
if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes)) if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes))
{ {
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
return; return;
} }
} }
// Weight and capacity check.
final PcInventory inventory = player.getInventory();
if (!inventory.validateWeight(totalWeight) || ((totalslots > 0) && !inventory.validateCapacity(totalslots)))
{
player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.THERE_IS_NOT_ENOUGH_INVENTORY_SPACE_PLEASE_MAKE_MORE_ROOM_AND_TRY_AGAIN);
return;
}
final InventoryUpdate ui = new InventoryUpdate(); final InventoryUpdate ui = new InventoryUpdate();
// Destroy ingredients. // Destroy ingredients.

View File

@@ -19,11 +19,14 @@ package com.l2jmobius.gameserver.network.clientpackets.alchemy;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.AlchemyData; import com.l2jmobius.gameserver.data.xml.impl.AlchemyData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.PrivateStoreType; import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.enums.Race; import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData; import com.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -68,26 +71,26 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player)) if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_DURING_BATTLE);
return; return;
} }
else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE)) else if (player.isInStoreMode() || (player.getPrivateStoreType() != PrivateStoreType.NONE))
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_TRADING_OR_USING_A_PRIVATE_STORE_OR_SHOP);
return; return;
} }
else if (player.isDead()) else if (player.isDead())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_DEAD);
return; return;
} }
else if (player.isMovementDisabled()) else if (player.isMovementDisabled())
{ {
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.YOU_CANNOT_USE_ALCHEMY_WHILE_IMMOBILE);
return; return;
} }
@@ -132,6 +135,10 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
} }
// Calculate success and failure count. // Calculate success and failure count.
final L2Item successItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionSuccess().getId());
final L2Item failureItemTemplate = ItemTable.getInstance().getTemplate(data.getProductionFailure().getId());
int totalWeight = 0;
int totalslots = (successItemTemplate.isStackable() ? 1 : 0) + (failureItemTemplate.isStackable() ? 1 : 0);
int successCount = 0; int successCount = 0;
int failureCount = 0; int failureCount = 0;
for (int i = 0; i < _craftTimes; i++) for (int i = 0; i < _craftTimes; i++)
@@ -139,23 +146,37 @@ public class RequestAlchemyConversion implements IClientIncomingPacket
if (Rnd.get(100) < baseChance) if (Rnd.get(100) < baseChance)
{ {
successCount++; successCount++;
totalWeight += successItemTemplate.getWeight();
totalslots += successItemTemplate.isStackable() ? 0 : 1;
} }
else else
{ {
failureCount++; failureCount++;
totalWeight += failureItemTemplate.getWeight();
totalslots += failureItemTemplate.isStackable() ? 0 : 1;
} }
} }
// Check if player has enough ingredients.
for (ItemHolder ingredient : data.getIngredients()) for (ItemHolder ingredient : data.getIngredients())
{ {
if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes)) if (player.getInventory().getInventoryItemCount(ingredient.getId(), -1) < (ingredient.getCount() * _craftTimes))
{ {
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
player.sendPacket(new ExAlchemyConversion(0, 0)); player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS);
return; return;
} }
} }
// Weight and capacity check.
final PcInventory inventory = player.getInventory();
if (!inventory.validateWeight(totalWeight) || ((totalslots > 0) && !inventory.validateCapacity(totalslots)))
{
player.sendPacket(new ExAlchemyConversion(0, 0));
player.sendPacket(SystemMessageId.THERE_IS_NOT_ENOUGH_INVENTORY_SPACE_PLEASE_MAKE_MORE_ROOM_AND_TRY_AGAIN);
return;
}
final InventoryUpdate ui = new InventoryUpdate(); final InventoryUpdate ui = new InventoryUpdate();
// Destroy ingredients. // Destroy ingredients.