Private shop packet improvements.
This commit is contained in:
@@ -36,8 +36,8 @@ public class TradeItem
|
|||||||
private long _count;
|
private long _count;
|
||||||
private long _storeCount;
|
private long _storeCount;
|
||||||
private long _price;
|
private long _price;
|
||||||
private final byte _elemAtkType;
|
private byte _elemAtkType;
|
||||||
private final int _elemAtkPower;
|
private int _elemAtkPower;
|
||||||
private final int[] _elemDefAttr =
|
private final int[] _elemDefAttr =
|
||||||
{
|
{
|
||||||
0,
|
0,
|
||||||
@@ -48,8 +48,8 @@ public class TradeItem
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
private final int[] _enchantOptions;
|
private final int[] _enchantOptions;
|
||||||
private final Collection<EnsoulOption> _soulCrystalOptions;
|
private Collection<EnsoulOption> _soulCrystalOptions;
|
||||||
private final Collection<EnsoulOption> _soulCrystalSpecialOptions;
|
private Collection<EnsoulOption> _soulCrystalSpecialOptions;
|
||||||
private int _visualId;
|
private int _visualId;
|
||||||
private int _augmentationOption1 = -1;
|
private int _augmentationOption1 = -1;
|
||||||
private int _augmentationOption2 = -1;
|
private int _augmentationOption2 = -1;
|
||||||
@@ -95,7 +95,7 @@ public class TradeItem
|
|||||||
_count = count;
|
_count = count;
|
||||||
_storeCount = count;
|
_storeCount = count;
|
||||||
_price = price;
|
_price = price;
|
||||||
_elemAtkType = Elementals.NONE;
|
_elemAtkType = AttributeType.NONE.getClientId();
|
||||||
_elemAtkPower = 0;
|
_elemAtkPower = 0;
|
||||||
_enchantOptions = L2ItemInstance.DEFAULT_ENCHANT_OPTIONS;
|
_enchantOptions = L2ItemInstance.DEFAULT_ENCHANT_OPTIONS;
|
||||||
_soulCrystalOptions = Collections.emptyList();
|
_soulCrystalOptions = Collections.emptyList();
|
||||||
@@ -191,16 +191,31 @@ public class TradeItem
|
|||||||
return _price;
|
return _price;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAttackElementType(AttributeType attackElement)
|
||||||
|
{
|
||||||
|
_elemAtkType = attackElement.getClientId();
|
||||||
|
}
|
||||||
|
|
||||||
public byte getAttackElementType()
|
public byte getAttackElementType()
|
||||||
{
|
{
|
||||||
return _elemAtkType;
|
return _elemAtkType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAttackElementPower(int attackElementPower)
|
||||||
|
{
|
||||||
|
_elemAtkPower = attackElementPower;
|
||||||
|
}
|
||||||
|
|
||||||
public int getAttackElementPower()
|
public int getAttackElementPower()
|
||||||
{
|
{
|
||||||
return _elemAtkPower;
|
return _elemAtkPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setElementDefAttr(AttributeType element, int value)
|
||||||
|
{
|
||||||
|
_elemDefAttr[element.getClientId()] = value;
|
||||||
|
}
|
||||||
|
|
||||||
public int getElementDefAttr(byte i)
|
public int getElementDefAttr(byte i)
|
||||||
{
|
{
|
||||||
return _elemDefAttr[i];
|
return _elemDefAttr[i];
|
||||||
@@ -211,14 +226,24 @@ public class TradeItem
|
|||||||
return _enchantOptions;
|
return _enchantOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSoulCrystalOptions(Collection<EnsoulOption> soulCrystalOptions)
|
||||||
|
{
|
||||||
|
_soulCrystalOptions = soulCrystalOptions;
|
||||||
|
}
|
||||||
|
|
||||||
public Collection<EnsoulOption> getSoulCrystalOptions()
|
public Collection<EnsoulOption> getSoulCrystalOptions()
|
||||||
{
|
{
|
||||||
return _soulCrystalOptions;
|
return _soulCrystalOptions == null ? Collections.emptyList() : _soulCrystalOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSoulCrystalSpecialOptions(Collection<EnsoulOption> soulCrystalSpecialOptions)
|
||||||
|
{
|
||||||
|
_soulCrystalSpecialOptions = soulCrystalSpecialOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<EnsoulOption> getSoulCrystalSpecialOptions()
|
public Collection<EnsoulOption> getSoulCrystalSpecialOptions()
|
||||||
{
|
{
|
||||||
return _soulCrystalSpecialOptions;
|
return _soulCrystalSpecialOptions == null ? Collections.emptyList() : _soulCrystalSpecialOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAugmentation(int option1, int option2)
|
public void setAugmentation(int option1, int option2)
|
||||||
@@ -237,6 +262,11 @@ public class TradeItem
|
|||||||
return _augmentationOption2;
|
return _augmentationOption2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setVisualId(int visualItemId)
|
||||||
|
{
|
||||||
|
_visualId = visualItemId;
|
||||||
|
}
|
||||||
|
|
||||||
public int getVisualId()
|
public int getVisualId()
|
||||||
{
|
{
|
||||||
return _visualId;
|
return _visualId;
|
||||||
|
@@ -40,45 +40,40 @@ public final class RequestPrivateStoreSell implements IClientIncomingPacket
|
|||||||
public boolean read(L2GameClient client, PacketReader packet)
|
public boolean read(L2GameClient client, PacketReader packet)
|
||||||
{
|
{
|
||||||
_storePlayerId = packet.readD();
|
_storePlayerId = packet.readD();
|
||||||
final int count = packet.readD();
|
int itemsCount = packet.readD();
|
||||||
if ((count <= 0) || (count > Config.MAX_ITEM_IN_PACKET))
|
if ((itemsCount <= 0) || (itemsCount > Config.MAX_ITEM_IN_PACKET))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_items = new ItemRequest[count];
|
_items = new ItemRequest[itemsCount];
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < itemsCount; i++)
|
||||||
{
|
{
|
||||||
final int objectId = packet.readD();
|
final int slot = packet.readD();
|
||||||
final int itemId = packet.readD();
|
final int itemId = packet.readD();
|
||||||
@SuppressWarnings("unused")
|
packet.readH(); // TODO analyse this
|
||||||
final int enchantLevel = packet.readH(); // TODO: use this
|
packet.readH(); // TODO analyse this
|
||||||
@SuppressWarnings("unused")
|
final long count = packet.readQ();
|
||||||
final int nameExists = packet.readH(); // TODO: use this
|
|
||||||
final long cnt = packet.readQ();
|
|
||||||
final long price = packet.readQ();
|
final long price = packet.readQ();
|
||||||
@SuppressWarnings("unused")
|
packet.readD(); // visual id
|
||||||
final int augmentationEffect1 = packet.readD(); // TODO: use this
|
packet.readD(); // option 1
|
||||||
@SuppressWarnings("unused")
|
packet.readD(); // option 2
|
||||||
final int augmentationEffect2 = packet.readD(); // TODO: use this
|
int soulCrystals = packet.readC();
|
||||||
@SuppressWarnings("unused")
|
for (int s = 0; s < soulCrystals; s++)
|
||||||
final int visualId = packet.readD(); // TODO: use this
|
{
|
||||||
final int primarySpecialAbilities = packet.readC();
|
packet.readD(); // soul crystal option
|
||||||
for (int a = 0; a < primarySpecialAbilities; a++)
|
}
|
||||||
|
int soulCrystals2 = packet.readC();
|
||||||
|
for (int s = 0; s < soulCrystals2; s++)
|
||||||
{
|
{
|
||||||
packet.readD(); // sa effect
|
packet.readD(); // sa effect
|
||||||
}
|
}
|
||||||
final int secondarySpecialAbilities = packet.readC();
|
if (/* (slot < 1) || */ (itemId < 1) || (count < 1) || (price < 0))
|
||||||
for (int a = 0; a < secondarySpecialAbilities; a++)
|
|
||||||
{
|
|
||||||
packet.readD(); // sa effect
|
|
||||||
}
|
|
||||||
if (/* (objectId < 1) || */ (itemId < 1) || (cnt < 1) || (price < 0))
|
|
||||||
{
|
{
|
||||||
_items = null;
|
_items = null;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_items[i] = new ItemRequest(objectId, itemId, cnt, price);
|
_items[i] = new ItemRequest(slot, itemId, count, price);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -20,9 +20,13 @@ import static com.l2jmobius.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
|
|||||||
|
|
||||||
import com.l2jmobius.Config;
|
import com.l2jmobius.Config;
|
||||||
import com.l2jmobius.commons.network.PacketReader;
|
import com.l2jmobius.commons.network.PacketReader;
|
||||||
|
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||||
|
import com.l2jmobius.gameserver.enums.AttributeType;
|
||||||
import com.l2jmobius.gameserver.enums.PrivateStoreType;
|
import com.l2jmobius.gameserver.enums.PrivateStoreType;
|
||||||
|
import com.l2jmobius.gameserver.model.TradeItem;
|
||||||
import com.l2jmobius.gameserver.model.TradeList;
|
import com.l2jmobius.gameserver.model.TradeList;
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||||
|
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||||
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import com.l2jmobius.gameserver.network.L2GameClient;
|
import com.l2jmobius.gameserver.network.L2GameClient;
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
@@ -34,7 +38,7 @@ import com.l2jmobius.gameserver.util.Util;
|
|||||||
|
|
||||||
public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
||||||
{
|
{
|
||||||
private Item[] _items = null;
|
private TradeItem[] _items = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean read(L2GameClient client, PacketReader packet)
|
public boolean read(L2GameClient client, PacketReader packet)
|
||||||
@@ -45,18 +49,23 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_items = new Item[count];
|
_items = new TradeItem[count];
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
final int itemId = packet.readD();
|
int itemId = packet.readD();
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
final L2Item template = ItemTable.getInstance().getTemplate(itemId);
|
||||||
final int enchantLevel = packet.readH(); // TODO: use this
|
if (template == null)
|
||||||
@SuppressWarnings("unused")
|
{
|
||||||
final int nameExists = packet.readH(); // TODO: use this
|
_items = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
final long cnt = packet.readQ();
|
final int enchantLevel = packet.readH();
|
||||||
final long price = packet.readQ();
|
packet.readH(); // TODO analyse this
|
||||||
|
|
||||||
|
long cnt = packet.readQ();
|
||||||
|
long price = packet.readQ();
|
||||||
|
|
||||||
if ((itemId < 1) || (cnt < 1) || (price < 0))
|
if ((itemId < 1) || (cnt < 1) || (price < 0))
|
||||||
{
|
{
|
||||||
@@ -64,30 +73,29 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
final int option1 = packet.readD();
|
||||||
final int augmentationEffect1 = packet.readD(); // TODO: use this
|
final int option2 = packet.readD();
|
||||||
@SuppressWarnings("unused")
|
final short attackAttributeId = (short) packet.readH();
|
||||||
final int augmentationEffect2 = packet.readD(); // TODO: use this
|
final int attackAttributeValue = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceFire = packet.readH();
|
||||||
final int attackElement = packet.readH(); // TODO: use this
|
final int defenceWater = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceWind = packet.readH();
|
||||||
final int attackElementPower = packet.readH(); // TODO: use this
|
final int defenceEarth = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceHoly = packet.readH();
|
||||||
final int fireDefense = packet.readH(); // TODO: use this
|
final int defenceDark = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int waterDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int windDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int earthDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int holyDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int darkDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int visualId = packet.readD(); // TODO: use this
|
|
||||||
|
|
||||||
_items[i] = new Item(itemId, cnt, price);
|
final TradeItem item = new TradeItem(template, cnt, price);
|
||||||
|
item.setEnchant(enchantLevel);
|
||||||
|
item.setAugmentation(option1, option2);
|
||||||
|
item.setAttackElementType(AttributeType.findByClientId(attackAttributeId));
|
||||||
|
item.setAttackElementPower(attackAttributeValue);
|
||||||
|
item.setElementDefAttr(AttributeType.FIRE, defenceFire);
|
||||||
|
item.setElementDefAttr(AttributeType.WATER, defenceWater);
|
||||||
|
item.setElementDefAttr(AttributeType.WIND, defenceWind);
|
||||||
|
item.setElementDefAttr(AttributeType.EARTH, defenceEarth);
|
||||||
|
item.setElementDefAttr(AttributeType.HOLY, defenceHoly);
|
||||||
|
item.setElementDefAttr(AttributeType.DARK, defenceDark);
|
||||||
|
_items[i] = item;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -130,7 +138,7 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final TradeList tradeList = player.getBuyList();
|
TradeList tradeList = player.getBuyList();
|
||||||
tradeList.clear();
|
tradeList.clear();
|
||||||
|
|
||||||
// Check maximum number of allowed slots for pvt shops
|
// Check maximum number of allowed slots for pvt shops
|
||||||
@@ -142,15 +150,17 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
}
|
}
|
||||||
|
|
||||||
long totalCost = 0;
|
long totalCost = 0;
|
||||||
for (Item i : _items)
|
for (TradeItem i : _items)
|
||||||
{
|
{
|
||||||
if (!i.addToTradeList(tradeList))
|
if ((MAX_ADENA / i.getCount()) < i.getPrice())
|
||||||
{
|
{
|
||||||
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
totalCost += i.getCost();
|
tradeList.addItemByItemId(i.getItem().getId(), i.getCount(), i.getPrice());
|
||||||
|
|
||||||
|
totalCost += (i.getCount() * i.getPrice());
|
||||||
if (totalCost > MAX_ADENA)
|
if (totalCost > MAX_ADENA)
|
||||||
{
|
{
|
||||||
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set total price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set total price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
||||||
@@ -171,34 +181,4 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
player.broadcastUserInfo();
|
player.broadcastUserInfo();
|
||||||
player.broadcastPacket(new PrivateStoreMsgBuy(player));
|
player.broadcastPacket(new PrivateStoreMsgBuy(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class Item
|
|
||||||
{
|
|
||||||
private final int _itemId;
|
|
||||||
private final long _count;
|
|
||||||
private final long _price;
|
|
||||||
|
|
||||||
public Item(int id, long num, long pri)
|
|
||||||
{
|
|
||||||
_itemId = id;
|
|
||||||
_count = num;
|
|
||||||
_price = pri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean addToTradeList(TradeList list)
|
|
||||||
{
|
|
||||||
if ((MAX_ADENA / _count) < _price)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
list.addItemByItemId(_itemId, _count, _price);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getCost()
|
|
||||||
{
|
|
||||||
return _count * _price;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -163,15 +163,15 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
|
|
||||||
private static class Item
|
private static class Item
|
||||||
{
|
{
|
||||||
private final int _itemId;
|
private final int _objectId;
|
||||||
private final long _count;
|
private final long _count;
|
||||||
private final long _price;
|
private final long _price;
|
||||||
|
|
||||||
public Item(int id, long num, long pri)
|
public Item(int objectId, long count, long price)
|
||||||
{
|
{
|
||||||
_itemId = id;
|
_objectId = objectId;
|
||||||
_count = num;
|
_count = count;
|
||||||
_price = pri;
|
_price = price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addToTradeList(TradeList list)
|
public boolean addToTradeList(TradeList list)
|
||||||
@@ -181,7 +181,7 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
list.addItem(_itemId, _count, _price);
|
list.addItem(_objectId, _count, _price);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,5 +190,4 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
return _count * _price;
|
return _count * _price;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -36,8 +36,8 @@ public class TradeItem
|
|||||||
private long _count;
|
private long _count;
|
||||||
private long _storeCount;
|
private long _storeCount;
|
||||||
private long _price;
|
private long _price;
|
||||||
private final byte _elemAtkType;
|
private byte _elemAtkType;
|
||||||
private final int _elemAtkPower;
|
private int _elemAtkPower;
|
||||||
private final int[] _elemDefAttr =
|
private final int[] _elemDefAttr =
|
||||||
{
|
{
|
||||||
0,
|
0,
|
||||||
@@ -48,8 +48,8 @@ public class TradeItem
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
private final int[] _enchantOptions;
|
private final int[] _enchantOptions;
|
||||||
private final Collection<EnsoulOption> _soulCrystalOptions;
|
private Collection<EnsoulOption> _soulCrystalOptions;
|
||||||
private final Collection<EnsoulOption> _soulCrystalSpecialOptions;
|
private Collection<EnsoulOption> _soulCrystalSpecialOptions;
|
||||||
private int _visualId;
|
private int _visualId;
|
||||||
private int _augmentationOption1 = -1;
|
private int _augmentationOption1 = -1;
|
||||||
private int _augmentationOption2 = -1;
|
private int _augmentationOption2 = -1;
|
||||||
@@ -95,7 +95,7 @@ public class TradeItem
|
|||||||
_count = count;
|
_count = count;
|
||||||
_storeCount = count;
|
_storeCount = count;
|
||||||
_price = price;
|
_price = price;
|
||||||
_elemAtkType = Elementals.NONE;
|
_elemAtkType = AttributeType.NONE.getClientId();
|
||||||
_elemAtkPower = 0;
|
_elemAtkPower = 0;
|
||||||
_enchantOptions = L2ItemInstance.DEFAULT_ENCHANT_OPTIONS;
|
_enchantOptions = L2ItemInstance.DEFAULT_ENCHANT_OPTIONS;
|
||||||
_soulCrystalOptions = Collections.emptyList();
|
_soulCrystalOptions = Collections.emptyList();
|
||||||
@@ -191,16 +191,31 @@ public class TradeItem
|
|||||||
return _price;
|
return _price;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAttackElementType(AttributeType attackElement)
|
||||||
|
{
|
||||||
|
_elemAtkType = attackElement.getClientId();
|
||||||
|
}
|
||||||
|
|
||||||
public byte getAttackElementType()
|
public byte getAttackElementType()
|
||||||
{
|
{
|
||||||
return _elemAtkType;
|
return _elemAtkType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAttackElementPower(int attackElementPower)
|
||||||
|
{
|
||||||
|
_elemAtkPower = attackElementPower;
|
||||||
|
}
|
||||||
|
|
||||||
public int getAttackElementPower()
|
public int getAttackElementPower()
|
||||||
{
|
{
|
||||||
return _elemAtkPower;
|
return _elemAtkPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setElementDefAttr(AttributeType element, int value)
|
||||||
|
{
|
||||||
|
_elemDefAttr[element.getClientId()] = value;
|
||||||
|
}
|
||||||
|
|
||||||
public int getElementDefAttr(byte i)
|
public int getElementDefAttr(byte i)
|
||||||
{
|
{
|
||||||
return _elemDefAttr[i];
|
return _elemDefAttr[i];
|
||||||
@@ -211,14 +226,24 @@ public class TradeItem
|
|||||||
return _enchantOptions;
|
return _enchantOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSoulCrystalOptions(Collection<EnsoulOption> soulCrystalOptions)
|
||||||
|
{
|
||||||
|
_soulCrystalOptions = soulCrystalOptions;
|
||||||
|
}
|
||||||
|
|
||||||
public Collection<EnsoulOption> getSoulCrystalOptions()
|
public Collection<EnsoulOption> getSoulCrystalOptions()
|
||||||
{
|
{
|
||||||
return _soulCrystalOptions;
|
return _soulCrystalOptions == null ? Collections.emptyList() : _soulCrystalOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSoulCrystalSpecialOptions(Collection<EnsoulOption> soulCrystalSpecialOptions)
|
||||||
|
{
|
||||||
|
_soulCrystalSpecialOptions = soulCrystalSpecialOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<EnsoulOption> getSoulCrystalSpecialOptions()
|
public Collection<EnsoulOption> getSoulCrystalSpecialOptions()
|
||||||
{
|
{
|
||||||
return _soulCrystalSpecialOptions;
|
return _soulCrystalSpecialOptions == null ? Collections.emptyList() : _soulCrystalSpecialOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAugmentation(int option1, int option2)
|
public void setAugmentation(int option1, int option2)
|
||||||
@@ -237,6 +262,11 @@ public class TradeItem
|
|||||||
return _augmentationOption2;
|
return _augmentationOption2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setVisualId(int visualItemId)
|
||||||
|
{
|
||||||
|
_visualId = visualItemId;
|
||||||
|
}
|
||||||
|
|
||||||
public int getVisualId()
|
public int getVisualId()
|
||||||
{
|
{
|
||||||
return _visualId;
|
return _visualId;
|
||||||
|
@@ -40,45 +40,40 @@ public final class RequestPrivateStoreSell implements IClientIncomingPacket
|
|||||||
public boolean read(L2GameClient client, PacketReader packet)
|
public boolean read(L2GameClient client, PacketReader packet)
|
||||||
{
|
{
|
||||||
_storePlayerId = packet.readD();
|
_storePlayerId = packet.readD();
|
||||||
final int count = packet.readD();
|
int itemsCount = packet.readD();
|
||||||
if ((count <= 0) || (count > Config.MAX_ITEM_IN_PACKET))
|
if ((itemsCount <= 0) || (itemsCount > Config.MAX_ITEM_IN_PACKET))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_items = new ItemRequest[count];
|
_items = new ItemRequest[itemsCount];
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < itemsCount; i++)
|
||||||
{
|
{
|
||||||
final int objectId = packet.readD();
|
final int slot = packet.readD();
|
||||||
final int itemId = packet.readD();
|
final int itemId = packet.readD();
|
||||||
@SuppressWarnings("unused")
|
packet.readH(); // TODO analyse this
|
||||||
final int enchantLevel = packet.readH(); // TODO: use this
|
packet.readH(); // TODO analyse this
|
||||||
@SuppressWarnings("unused")
|
final long count = packet.readQ();
|
||||||
final int nameExists = packet.readH(); // TODO: use this
|
|
||||||
final long cnt = packet.readQ();
|
|
||||||
final long price = packet.readQ();
|
final long price = packet.readQ();
|
||||||
@SuppressWarnings("unused")
|
packet.readD(); // visual id
|
||||||
final int augmentationEffect1 = packet.readD(); // TODO: use this
|
packet.readD(); // option 1
|
||||||
@SuppressWarnings("unused")
|
packet.readD(); // option 2
|
||||||
final int augmentationEffect2 = packet.readD(); // TODO: use this
|
int soulCrystals = packet.readC();
|
||||||
@SuppressWarnings("unused")
|
for (int s = 0; s < soulCrystals; s++)
|
||||||
final int visualId = packet.readD(); // TODO: use this
|
{
|
||||||
final int primarySpecialAbilities = packet.readC();
|
packet.readD(); // soul crystal option
|
||||||
for (int a = 0; a < primarySpecialAbilities; a++)
|
}
|
||||||
|
int soulCrystals2 = packet.readC();
|
||||||
|
for (int s = 0; s < soulCrystals2; s++)
|
||||||
{
|
{
|
||||||
packet.readD(); // sa effect
|
packet.readD(); // sa effect
|
||||||
}
|
}
|
||||||
final int secondarySpecialAbilities = packet.readC();
|
if (/* (slot < 1) || */ (itemId < 1) || (count < 1) || (price < 0))
|
||||||
for (int a = 0; a < secondarySpecialAbilities; a++)
|
|
||||||
{
|
|
||||||
packet.readD(); // sa effect
|
|
||||||
}
|
|
||||||
if (/* (objectId < 1) || */ (itemId < 1) || (cnt < 1) || (price < 0))
|
|
||||||
{
|
{
|
||||||
_items = null;
|
_items = null;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_items[i] = new ItemRequest(objectId, itemId, cnt, price);
|
_items[i] = new ItemRequest(slot, itemId, count, price);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -18,11 +18,19 @@ package com.l2jmobius.gameserver.network.clientpackets;
|
|||||||
|
|
||||||
import static com.l2jmobius.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
|
import static com.l2jmobius.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import com.l2jmobius.Config;
|
import com.l2jmobius.Config;
|
||||||
import com.l2jmobius.commons.network.PacketReader;
|
import com.l2jmobius.commons.network.PacketReader;
|
||||||
|
import com.l2jmobius.gameserver.data.xml.impl.EnsoulData;
|
||||||
|
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||||
|
import com.l2jmobius.gameserver.enums.AttributeType;
|
||||||
import com.l2jmobius.gameserver.enums.PrivateStoreType;
|
import com.l2jmobius.gameserver.enums.PrivateStoreType;
|
||||||
|
import com.l2jmobius.gameserver.model.TradeItem;
|
||||||
import com.l2jmobius.gameserver.model.TradeList;
|
import com.l2jmobius.gameserver.model.TradeList;
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||||
|
import com.l2jmobius.gameserver.model.ensoul.EnsoulOption;
|
||||||
|
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||||
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import com.l2jmobius.gameserver.network.L2GameClient;
|
import com.l2jmobius.gameserver.network.L2GameClient;
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
@@ -34,7 +42,7 @@ import com.l2jmobius.gameserver.util.Util;
|
|||||||
|
|
||||||
public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
||||||
{
|
{
|
||||||
private Item[] _items = null;
|
private TradeItem[] _items = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean read(L2GameClient client, PacketReader packet)
|
public boolean read(L2GameClient client, PacketReader packet)
|
||||||
@@ -45,18 +53,23 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_items = new Item[count];
|
_items = new TradeItem[count];
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
final int itemId = packet.readD();
|
int itemId = packet.readD();
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
final L2Item template = ItemTable.getInstance().getTemplate(itemId);
|
||||||
final int enchantLevel = packet.readH(); // TODO: use this
|
if (template == null)
|
||||||
@SuppressWarnings("unused")
|
{
|
||||||
final int nameExists = packet.readH(); // TODO: use this
|
_items = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
final long cnt = packet.readQ();
|
final int enchantLevel = packet.readH();
|
||||||
final long price = packet.readQ();
|
packet.readH(); // TODO analyse this
|
||||||
|
|
||||||
|
long cnt = packet.readQ();
|
||||||
|
long price = packet.readQ();
|
||||||
|
|
||||||
if ((itemId < 1) || (cnt < 1) || (price < 0))
|
if ((itemId < 1) || (cnt < 1) || (price < 0))
|
||||||
{
|
{
|
||||||
@@ -64,30 +77,44 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
final int option1 = packet.readD();
|
||||||
final int augmentationEffect1 = packet.readD(); // TODO: use this
|
final int option2 = packet.readD();
|
||||||
@SuppressWarnings("unused")
|
final short attackAttributeId = (short) packet.readH();
|
||||||
final int augmentationEffect2 = packet.readD(); // TODO: use this
|
final int attackAttributeValue = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceFire = packet.readH();
|
||||||
final int attackElement = packet.readH(); // TODO: use this
|
final int defenceWater = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceWind = packet.readH();
|
||||||
final int attackElementPower = packet.readH(); // TODO: use this
|
final int defenceEarth = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceHoly = packet.readH();
|
||||||
final int fireDefense = packet.readH(); // TODO: use this
|
final int defenceDark = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int visualId = packet.readD();
|
||||||
final int waterDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int windDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int earthDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int holyDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int darkDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int visualId = packet.readD(); // TODO: use this
|
|
||||||
|
|
||||||
_items[i] = new Item(itemId, cnt, price);
|
final EnsoulOption[] soulCrystalOptions = new EnsoulOption[packet.readC()];
|
||||||
|
for (int k = 0; k < soulCrystalOptions.length; k++)
|
||||||
|
{
|
||||||
|
soulCrystalOptions[k] = EnsoulData.getInstance().getOption(packet.readD());
|
||||||
|
}
|
||||||
|
final EnsoulOption[] soulCrystalSpecialOptions = new EnsoulOption[packet.readC()];
|
||||||
|
for (int k = 0; k < soulCrystalSpecialOptions.length; k++)
|
||||||
|
{
|
||||||
|
soulCrystalSpecialOptions[k] = EnsoulData.getInstance().getOption(packet.readD());
|
||||||
|
}
|
||||||
|
|
||||||
|
final TradeItem item = new TradeItem(template, cnt, price);
|
||||||
|
item.setEnchant(enchantLevel);
|
||||||
|
item.setAugmentation(option1, option2);
|
||||||
|
item.setAttackElementType(AttributeType.findByClientId(attackAttributeId));
|
||||||
|
item.setAttackElementPower(attackAttributeValue);
|
||||||
|
item.setElementDefAttr(AttributeType.FIRE, defenceFire);
|
||||||
|
item.setElementDefAttr(AttributeType.WATER, defenceWater);
|
||||||
|
item.setElementDefAttr(AttributeType.WIND, defenceWind);
|
||||||
|
item.setElementDefAttr(AttributeType.EARTH, defenceEarth);
|
||||||
|
item.setElementDefAttr(AttributeType.HOLY, defenceHoly);
|
||||||
|
item.setElementDefAttr(AttributeType.DARK, defenceDark);
|
||||||
|
item.setVisualId(visualId);
|
||||||
|
item.setSoulCrystalOptions(Arrays.asList(soulCrystalOptions));
|
||||||
|
item.setSoulCrystalSpecialOptions(Arrays.asList(soulCrystalSpecialOptions));
|
||||||
|
_items[i] = item;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -130,7 +157,7 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final TradeList tradeList = player.getBuyList();
|
TradeList tradeList = player.getBuyList();
|
||||||
tradeList.clear();
|
tradeList.clear();
|
||||||
|
|
||||||
// Check maximum number of allowed slots for pvt shops
|
// Check maximum number of allowed slots for pvt shops
|
||||||
@@ -142,15 +169,17 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
}
|
}
|
||||||
|
|
||||||
long totalCost = 0;
|
long totalCost = 0;
|
||||||
for (Item i : _items)
|
for (TradeItem i : _items)
|
||||||
{
|
{
|
||||||
if (!i.addToTradeList(tradeList))
|
if ((MAX_ADENA / i.getCount()) < i.getPrice())
|
||||||
{
|
{
|
||||||
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
totalCost += i.getCost();
|
tradeList.addItemByItemId(i.getItem().getId(), i.getCount(), i.getPrice());
|
||||||
|
|
||||||
|
totalCost += (i.getCount() * i.getPrice());
|
||||||
if (totalCost > MAX_ADENA)
|
if (totalCost > MAX_ADENA)
|
||||||
{
|
{
|
||||||
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set total price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set total price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
||||||
@@ -171,34 +200,4 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
player.broadcastUserInfo();
|
player.broadcastUserInfo();
|
||||||
player.broadcastPacket(new PrivateStoreMsgBuy(player));
|
player.broadcastPacket(new PrivateStoreMsgBuy(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class Item
|
|
||||||
{
|
|
||||||
private final int _itemId;
|
|
||||||
private final long _count;
|
|
||||||
private final long _price;
|
|
||||||
|
|
||||||
public Item(int id, long num, long pri)
|
|
||||||
{
|
|
||||||
_itemId = id;
|
|
||||||
_count = num;
|
|
||||||
_price = pri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean addToTradeList(TradeList list)
|
|
||||||
{
|
|
||||||
if ((MAX_ADENA / _count) < _price)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
list.addItemByItemId(_itemId, _count, _price);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getCost()
|
|
||||||
{
|
|
||||||
return _count * _price;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -163,15 +163,15 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
|
|
||||||
private static class Item
|
private static class Item
|
||||||
{
|
{
|
||||||
private final int _itemId;
|
private final int _objectId;
|
||||||
private final long _count;
|
private final long _count;
|
||||||
private final long _price;
|
private final long _price;
|
||||||
|
|
||||||
public Item(int id, long num, long pri)
|
public Item(int objectId, long count, long price)
|
||||||
{
|
{
|
||||||
_itemId = id;
|
_objectId = objectId;
|
||||||
_count = num;
|
_count = count;
|
||||||
_price = pri;
|
_price = price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addToTradeList(TradeList list)
|
public boolean addToTradeList(TradeList list)
|
||||||
@@ -181,7 +181,7 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
list.addItem(_itemId, _count, _price);
|
list.addItem(_objectId, _count, _price);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,5 +190,4 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
return _count * _price;
|
return _count * _price;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -36,8 +36,8 @@ public class TradeItem
|
|||||||
private long _count;
|
private long _count;
|
||||||
private long _storeCount;
|
private long _storeCount;
|
||||||
private long _price;
|
private long _price;
|
||||||
private final byte _elemAtkType;
|
private byte _elemAtkType;
|
||||||
private final int _elemAtkPower;
|
private int _elemAtkPower;
|
||||||
private final int[] _elemDefAttr =
|
private final int[] _elemDefAttr =
|
||||||
{
|
{
|
||||||
0,
|
0,
|
||||||
@@ -48,8 +48,8 @@ public class TradeItem
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
private final int[] _enchantOptions;
|
private final int[] _enchantOptions;
|
||||||
private final Collection<EnsoulOption> _soulCrystalOptions;
|
private Collection<EnsoulOption> _soulCrystalOptions;
|
||||||
private final Collection<EnsoulOption> _soulCrystalSpecialOptions;
|
private Collection<EnsoulOption> _soulCrystalSpecialOptions;
|
||||||
private int _visualId;
|
private int _visualId;
|
||||||
private int _augmentationOption1 = -1;
|
private int _augmentationOption1 = -1;
|
||||||
private int _augmentationOption2 = -1;
|
private int _augmentationOption2 = -1;
|
||||||
@@ -95,7 +95,7 @@ public class TradeItem
|
|||||||
_count = count;
|
_count = count;
|
||||||
_storeCount = count;
|
_storeCount = count;
|
||||||
_price = price;
|
_price = price;
|
||||||
_elemAtkType = Elementals.NONE;
|
_elemAtkType = AttributeType.NONE.getClientId();
|
||||||
_elemAtkPower = 0;
|
_elemAtkPower = 0;
|
||||||
_enchantOptions = L2ItemInstance.DEFAULT_ENCHANT_OPTIONS;
|
_enchantOptions = L2ItemInstance.DEFAULT_ENCHANT_OPTIONS;
|
||||||
_soulCrystalOptions = Collections.emptyList();
|
_soulCrystalOptions = Collections.emptyList();
|
||||||
@@ -191,16 +191,31 @@ public class TradeItem
|
|||||||
return _price;
|
return _price;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAttackElementType(AttributeType attackElement)
|
||||||
|
{
|
||||||
|
_elemAtkType = attackElement.getClientId();
|
||||||
|
}
|
||||||
|
|
||||||
public byte getAttackElementType()
|
public byte getAttackElementType()
|
||||||
{
|
{
|
||||||
return _elemAtkType;
|
return _elemAtkType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAttackElementPower(int attackElementPower)
|
||||||
|
{
|
||||||
|
_elemAtkPower = attackElementPower;
|
||||||
|
}
|
||||||
|
|
||||||
public int getAttackElementPower()
|
public int getAttackElementPower()
|
||||||
{
|
{
|
||||||
return _elemAtkPower;
|
return _elemAtkPower;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setElementDefAttr(AttributeType element, int value)
|
||||||
|
{
|
||||||
|
_elemDefAttr[element.getClientId()] = value;
|
||||||
|
}
|
||||||
|
|
||||||
public int getElementDefAttr(byte i)
|
public int getElementDefAttr(byte i)
|
||||||
{
|
{
|
||||||
return _elemDefAttr[i];
|
return _elemDefAttr[i];
|
||||||
@@ -211,14 +226,24 @@ public class TradeItem
|
|||||||
return _enchantOptions;
|
return _enchantOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setSoulCrystalOptions(Collection<EnsoulOption> soulCrystalOptions)
|
||||||
|
{
|
||||||
|
_soulCrystalOptions = soulCrystalOptions;
|
||||||
|
}
|
||||||
|
|
||||||
public Collection<EnsoulOption> getSoulCrystalOptions()
|
public Collection<EnsoulOption> getSoulCrystalOptions()
|
||||||
{
|
{
|
||||||
return _soulCrystalOptions;
|
return _soulCrystalOptions == null ? Collections.emptyList() : _soulCrystalOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSoulCrystalSpecialOptions(Collection<EnsoulOption> soulCrystalSpecialOptions)
|
||||||
|
{
|
||||||
|
_soulCrystalSpecialOptions = soulCrystalSpecialOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<EnsoulOption> getSoulCrystalSpecialOptions()
|
public Collection<EnsoulOption> getSoulCrystalSpecialOptions()
|
||||||
{
|
{
|
||||||
return _soulCrystalSpecialOptions;
|
return _soulCrystalSpecialOptions == null ? Collections.emptyList() : _soulCrystalSpecialOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAugmentation(int option1, int option2)
|
public void setAugmentation(int option1, int option2)
|
||||||
@@ -237,6 +262,11 @@ public class TradeItem
|
|||||||
return _augmentationOption2;
|
return _augmentationOption2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setVisualId(int visualItemId)
|
||||||
|
{
|
||||||
|
_visualId = visualItemId;
|
||||||
|
}
|
||||||
|
|
||||||
public int getVisualId()
|
public int getVisualId()
|
||||||
{
|
{
|
||||||
return _visualId;
|
return _visualId;
|
||||||
|
@@ -40,45 +40,40 @@ public final class RequestPrivateStoreSell implements IClientIncomingPacket
|
|||||||
public boolean read(L2GameClient client, PacketReader packet)
|
public boolean read(L2GameClient client, PacketReader packet)
|
||||||
{
|
{
|
||||||
_storePlayerId = packet.readD();
|
_storePlayerId = packet.readD();
|
||||||
final int count = packet.readD();
|
int itemsCount = packet.readD();
|
||||||
if ((count <= 0) || (count > Config.MAX_ITEM_IN_PACKET))
|
if ((itemsCount <= 0) || (itemsCount > Config.MAX_ITEM_IN_PACKET))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_items = new ItemRequest[count];
|
_items = new ItemRequest[itemsCount];
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < itemsCount; i++)
|
||||||
{
|
{
|
||||||
final int objectId = packet.readD();
|
final int slot = packet.readD();
|
||||||
final int itemId = packet.readD();
|
final int itemId = packet.readD();
|
||||||
@SuppressWarnings("unused")
|
packet.readH(); // TODO analyse this
|
||||||
final int enchantLevel = packet.readH(); // TODO: use this
|
packet.readH(); // TODO analyse this
|
||||||
@SuppressWarnings("unused")
|
final long count = packet.readQ();
|
||||||
final int nameExists = packet.readH(); // TODO: use this
|
|
||||||
final long cnt = packet.readQ();
|
|
||||||
final long price = packet.readQ();
|
final long price = packet.readQ();
|
||||||
@SuppressWarnings("unused")
|
packet.readD(); // visual id
|
||||||
final int augmentationEffect1 = packet.readD(); // TODO: use this
|
packet.readD(); // option 1
|
||||||
@SuppressWarnings("unused")
|
packet.readD(); // option 2
|
||||||
final int augmentationEffect2 = packet.readD(); // TODO: use this
|
int soulCrystals = packet.readC();
|
||||||
@SuppressWarnings("unused")
|
for (int s = 0; s < soulCrystals; s++)
|
||||||
final int visualId = packet.readD(); // TODO: use this
|
{
|
||||||
final int primarySpecialAbilities = packet.readC();
|
packet.readD(); // soul crystal option
|
||||||
for (int a = 0; a < primarySpecialAbilities; a++)
|
}
|
||||||
|
int soulCrystals2 = packet.readC();
|
||||||
|
for (int s = 0; s < soulCrystals2; s++)
|
||||||
{
|
{
|
||||||
packet.readD(); // sa effect
|
packet.readD(); // sa effect
|
||||||
}
|
}
|
||||||
final int secondarySpecialAbilities = packet.readC();
|
if (/* (slot < 1) || */ (itemId < 1) || (count < 1) || (price < 0))
|
||||||
for (int a = 0; a < secondarySpecialAbilities; a++)
|
|
||||||
{
|
|
||||||
packet.readD(); // sa effect
|
|
||||||
}
|
|
||||||
if (/* (objectId < 1) || */ (itemId < 1) || (cnt < 1) || (price < 0))
|
|
||||||
{
|
{
|
||||||
_items = null;
|
_items = null;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_items[i] = new ItemRequest(objectId, itemId, cnt, price);
|
_items[i] = new ItemRequest(slot, itemId, count, price);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -20,9 +20,13 @@ import static com.l2jmobius.gameserver.model.itemcontainer.Inventory.MAX_ADENA;
|
|||||||
|
|
||||||
import com.l2jmobius.Config;
|
import com.l2jmobius.Config;
|
||||||
import com.l2jmobius.commons.network.PacketReader;
|
import com.l2jmobius.commons.network.PacketReader;
|
||||||
|
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||||
|
import com.l2jmobius.gameserver.enums.AttributeType;
|
||||||
import com.l2jmobius.gameserver.enums.PrivateStoreType;
|
import com.l2jmobius.gameserver.enums.PrivateStoreType;
|
||||||
|
import com.l2jmobius.gameserver.model.TradeItem;
|
||||||
import com.l2jmobius.gameserver.model.TradeList;
|
import com.l2jmobius.gameserver.model.TradeList;
|
||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||||
|
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||||
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
import com.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import com.l2jmobius.gameserver.network.L2GameClient;
|
import com.l2jmobius.gameserver.network.L2GameClient;
|
||||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||||
@@ -34,7 +38,7 @@ import com.l2jmobius.gameserver.util.Util;
|
|||||||
|
|
||||||
public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
||||||
{
|
{
|
||||||
private Item[] _items = null;
|
private TradeItem[] _items = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean read(L2GameClient client, PacketReader packet)
|
public boolean read(L2GameClient client, PacketReader packet)
|
||||||
@@ -45,18 +49,23 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_items = new Item[count];
|
_items = new TradeItem[count];
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
final int itemId = packet.readD();
|
int itemId = packet.readD();
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
final L2Item template = ItemTable.getInstance().getTemplate(itemId);
|
||||||
final int enchantLevel = packet.readH(); // TODO: use this
|
if (template == null)
|
||||||
@SuppressWarnings("unused")
|
{
|
||||||
final int nameExists = packet.readH(); // TODO: use this
|
_items = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
final long cnt = packet.readQ();
|
final int enchantLevel = packet.readH();
|
||||||
final long price = packet.readQ();
|
packet.readH(); // TODO analyse this
|
||||||
|
|
||||||
|
long cnt = packet.readQ();
|
||||||
|
long price = packet.readQ();
|
||||||
|
|
||||||
if ((itemId < 1) || (cnt < 1) || (price < 0))
|
if ((itemId < 1) || (cnt < 1) || (price < 0))
|
||||||
{
|
{
|
||||||
@@ -64,30 +73,29 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
final int option1 = packet.readD();
|
||||||
final int augmentationEffect1 = packet.readD(); // TODO: use this
|
final int option2 = packet.readD();
|
||||||
@SuppressWarnings("unused")
|
final short attackAttributeId = (short) packet.readH();
|
||||||
final int augmentationEffect2 = packet.readD(); // TODO: use this
|
final int attackAttributeValue = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceFire = packet.readH();
|
||||||
final int attackElement = packet.readH(); // TODO: use this
|
final int defenceWater = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceWind = packet.readH();
|
||||||
final int attackElementPower = packet.readH(); // TODO: use this
|
final int defenceEarth = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
final int defenceHoly = packet.readH();
|
||||||
final int fireDefense = packet.readH(); // TODO: use this
|
final int defenceDark = packet.readH();
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int waterDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int windDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int earthDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int holyDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int darkDefense = packet.readH(); // TODO: use this
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
final int visualId = packet.readD(); // TODO: use this
|
|
||||||
|
|
||||||
_items[i] = new Item(itemId, cnt, price);
|
final TradeItem item = new TradeItem(template, cnt, price);
|
||||||
|
item.setEnchant(enchantLevel);
|
||||||
|
item.setAugmentation(option1, option2);
|
||||||
|
item.setAttackElementType(AttributeType.findByClientId(attackAttributeId));
|
||||||
|
item.setAttackElementPower(attackAttributeValue);
|
||||||
|
item.setElementDefAttr(AttributeType.FIRE, defenceFire);
|
||||||
|
item.setElementDefAttr(AttributeType.WATER, defenceWater);
|
||||||
|
item.setElementDefAttr(AttributeType.WIND, defenceWind);
|
||||||
|
item.setElementDefAttr(AttributeType.EARTH, defenceEarth);
|
||||||
|
item.setElementDefAttr(AttributeType.HOLY, defenceHoly);
|
||||||
|
item.setElementDefAttr(AttributeType.DARK, defenceDark);
|
||||||
|
_items[i] = item;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -130,7 +138,7 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final TradeList tradeList = player.getBuyList();
|
TradeList tradeList = player.getBuyList();
|
||||||
tradeList.clear();
|
tradeList.clear();
|
||||||
|
|
||||||
// Check maximum number of allowed slots for pvt shops
|
// Check maximum number of allowed slots for pvt shops
|
||||||
@@ -142,15 +150,17 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
}
|
}
|
||||||
|
|
||||||
long totalCost = 0;
|
long totalCost = 0;
|
||||||
for (Item i : _items)
|
for (TradeItem i : _items)
|
||||||
{
|
{
|
||||||
if (!i.addToTradeList(tradeList))
|
if ((MAX_ADENA / i.getCount()) < i.getPrice())
|
||||||
{
|
{
|
||||||
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
totalCost += i.getCost();
|
tradeList.addItemByItemId(i.getItem().getId(), i.getCount(), i.getPrice());
|
||||||
|
|
||||||
|
totalCost += (i.getCount() * i.getPrice());
|
||||||
if (totalCost > MAX_ADENA)
|
if (totalCost > MAX_ADENA)
|
||||||
{
|
{
|
||||||
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set total price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
Util.handleIllegalPlayerAction(player, "Warning!! Character " + player.getName() + " of account " + player.getAccountName() + " tried to set total price more than " + MAX_ADENA + " adena in Private Store - Buy.", Config.DEFAULT_PUNISH);
|
||||||
@@ -171,34 +181,4 @@ public final class SetPrivateStoreListBuy implements IClientIncomingPacket
|
|||||||
player.broadcastUserInfo();
|
player.broadcastUserInfo();
|
||||||
player.broadcastPacket(new PrivateStoreMsgBuy(player));
|
player.broadcastPacket(new PrivateStoreMsgBuy(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class Item
|
|
||||||
{
|
|
||||||
private final int _itemId;
|
|
||||||
private final long _count;
|
|
||||||
private final long _price;
|
|
||||||
|
|
||||||
public Item(int id, long num, long pri)
|
|
||||||
{
|
|
||||||
_itemId = id;
|
|
||||||
_count = num;
|
|
||||||
_price = pri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean addToTradeList(TradeList list)
|
|
||||||
{
|
|
||||||
if ((MAX_ADENA / _count) < _price)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
list.addItemByItemId(_itemId, _count, _price);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getCost()
|
|
||||||
{
|
|
||||||
return _count * _price;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -163,15 +163,15 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
|
|
||||||
private static class Item
|
private static class Item
|
||||||
{
|
{
|
||||||
private final int _itemId;
|
private final int _objectId;
|
||||||
private final long _count;
|
private final long _count;
|
||||||
private final long _price;
|
private final long _price;
|
||||||
|
|
||||||
public Item(int id, long num, long pri)
|
public Item(int objectId, long count, long price)
|
||||||
{
|
{
|
||||||
_itemId = id;
|
_objectId = objectId;
|
||||||
_count = num;
|
_count = count;
|
||||||
_price = pri;
|
_price = price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean addToTradeList(TradeList list)
|
public boolean addToTradeList(TradeList list)
|
||||||
@@ -181,7 +181,7 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
list.addItem(_itemId, _count, _price);
|
list.addItem(_objectId, _count, _price);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,5 +190,4 @@ public class SetPrivateStoreListSell implements IClientIncomingPacket
|
|||||||
return _count * _price;
|
return _count * _price;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user