/* * This file is part of aion-unique <aion-unique.com>. * * aion-unique is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * aion-unique is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aion-unique. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.network.aion; import java.nio.ByteBuffer; import java.util.Set; import com.aionemu.gameserver.model.gameobjects.Item; import com.aionemu.gameserver.model.gameobjects.stats.modifiers.SimpleModifier; import com.aionemu.gameserver.model.gameobjects.stats.modifiers.StatModifier; import com.aionemu.gameserver.model.items.ItemSlot; import com.aionemu.gameserver.model.items.ItemStone; import com.aionemu.gameserver.model.items.ManaStone; import com.aionemu.gameserver.model.templates.item.ItemTemplate; /** * @author ATracer * */ public abstract class InventoryPacket extends AionServerPacket { /** * The header of every item block * @param buf * @param item */ protected void writeGeneralInfo(ByteBuffer buf, Item item) { writeD(buf, item.getObjectId()); ItemTemplate itemTemplate = item.getItemTemplate(); writeD(buf, itemTemplate.getTemplateId()); writeH(buf, 0x24); writeD(buf, itemTemplate.getNameId()); writeH(buf, 0); } protected void writeMailGeneralInfo(ByteBuffer buf, Item item) { writeD(buf, item.getObjectId()); ItemTemplate itemTemplate = item.getItemTemplate(); writeD(buf, itemTemplate.getTemplateId()); writeD(buf, 1); writeD(buf, 0); writeH(buf, 0x24); writeD(buf, itemTemplate.getNameId()); writeH(buf, 0); } /** * All misc items * @param buf * @param item */ protected void writeGeneralItemInfo(ByteBuffer buf, Item item, boolean privateStore, boolean mail) { writeH(buf, 0x16); //length of details writeC(buf, 0); writeH(buf, item.getItemMask()); writeD(buf, item.getItemCount()); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); if(!privateStore) writeH(buf, 0); writeC(buf, 0); if(!mail) writeH(buf, item.getEquipmentSlot()); // not equipable items } protected void writeStigmaInfo(ByteBuffer buf, Item item) { writeH(buf, 325); //length of details 45 01 writeC(buf, 0x6); if(item.isEquipped()) writeD(buf, item.getEquipmentSlot()); else writeD(buf, 0); writeC(buf, 0x7); writeH(buf, 702); //skill id writeD(buf, 0); writeH(buf, 0); writeD(buf, 0x3c); //0x3c writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 1);//1 writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeH(buf, 0); writeH(buf, 0x0b); //0b writeC(buf, 0); writeD(buf, item.getItemTemplate().getTemplateId()); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeC(buf, 0); writeD(buf, 82750); //3E 43 01 00 writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeC(buf, 0); writeC(buf, 0x22); // 22 writeH(buf, 0); } /** * * @param buf * @param item */ protected void writeKinah(ByteBuffer buf, Item item, boolean isInventory) { writeH(buf, 0x16); //length of details writeC(buf, 0); writeH(buf, item.getItemMask()); writeD(buf, item.getItemCount()); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); writeH(buf, 0); writeC(buf, 0); writeH(buf, 255); // FF FF equipment if(isInventory) writeC(buf, 0); } /** * Write weapon info for non weapon switch items * * @param buf * @param item * @param isInventory */ protected void writeWeaponInfo(ByteBuffer buf, Item item, boolean isInventory) { this.writeWeaponInfo(buf, item, isInventory, false, false, false); } /** * For all weapon. Weapon is identified by weapon_type in xml * * @param buf * @param item */ protected void writeWeaponInfo(ByteBuffer buf, Item item, boolean isInventory, boolean isWeaponSwitch, boolean privateStore, boolean mail) { int itemSlotId = item.getEquipmentSlot(); if(isWeaponSwitch) writeH(buf, 0x05); // next bytes count ?? else writeH(buf, 0x4B); // next bytes count ?? writeC(buf, 0x06); writeD(buf, item.isEquipped() ? itemSlotId : 0); if(!isWeaponSwitch) { writeC(buf, 0x01); writeD(buf, ItemSlot.getSlotsFor(item.getItemTemplate().getItemSlot()).get(0).getSlotIdMask()); writeD(buf, 0x02); writeH(buf, 0x0B); //? some details separator writeC(buf, item.getEchantLevel()); //enchant (1-10) writeD(buf, item.getItemTemplate().getTemplateId()); writeC(buf, 0); writeItemStones(buf, item); ItemStone god = item.getGodStone(); writeD(buf, god == null ? 0 : god.getItemId()); writeC(buf, 0); writeD(buf, 0); writeD(buf, 0);//unk 1.5.1.9 writeC(buf, 0);//unk 1.5.1.9 writeH(buf, item.getItemMask()); writeD(buf, item.getItemCount()); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); if(!privateStore) writeH(buf, 0); writeC(buf, 0); if(!mail) writeH(buf, item.isEquipped() ? 255 : item.getEquipmentSlot()); // FF FF equipment if(isInventory) writeC(buf, 0);//item.isEquipped() ? 1 : 0 } } /** * Writes manastones : 6C - statenum mask, 6H - value * @param buf * @param item */ private void writeItemStones(ByteBuffer buf, Item item) { int count = 0; if(item.hasManaStones()) { Set<ManaStone> itemStones = item.getItemStones(); for(ManaStone itemStone : itemStones) { if(count == 6) break; StatModifier modifier = itemStone.getFirstModifier(); if(modifier != null) { count++; writeC(buf, modifier.getStat().getItemStoneMask()); } } writeB(buf, new byte[(6-count)]); count = 0; for(ManaStone itemStone : itemStones) { if(count == 6) break; StatModifier modifier = itemStone.getFirstModifier(); if(modifier != null) { count++; writeH(buf, ((SimpleModifier)modifier).getValue()); } } writeB(buf, new byte[(6-count)*2]); } else { writeB(buf, new byte[18]); } //for now max 6 stones - write some junk } /** * For all armor. Armor is identified by armor_type in xml * @param buf * @param item */ protected void writeArmorInfo(ByteBuffer buf, Item item, boolean isInventory, boolean privateStore, boolean mail) { int itemSlotId = item.getEquipmentSlot(); writeH(buf, 0x4F); writeC(buf, 0x06); writeD(buf, item.isEquipped() ? itemSlotId : 0); writeC(buf, 0x02); writeD(buf, ItemSlot.getSlotsFor(item.getItemTemplate().getItemSlot()).get(0).getSlotIdMask()); writeD(buf, 0); writeD(buf, 0); writeH(buf, 0x0B); //? some details separator writeC(buf, item.getEchantLevel()); //enchant (1-10) writeD(buf, item.getItemTemplate().getTemplateId()); writeC(buf, 0); writeItemStones(buf, item); writeC(buf, 0); writeD(buf, item.getItemColor()); writeD(buf, 0); writeD(buf, 0);//unk 1.5.1.9 writeC(buf, 0);//unk 1.5.1.9 writeH(buf, item.getItemMask()); writeD(buf, item.getItemCount()); writeD(buf, 0); writeD(buf, 0); writeD(buf, 0); if(!privateStore) writeH(buf, 0); writeC(buf, 0); if(!mail) writeH(buf, item.isEquipped() ? 255 : item.getEquipmentSlot()); // FF FF equipment if(isInventory) writeC(buf, 1);//item.isEquipped() ? 1 : 0 } }