Питомцы Без имени, Имя уже существует.

Статус
В этой теме нельзя размещать новые ответы.

LifeGame32

Прославленный
Местный
Сообщения
244
Розыгрыши
0
Решения
5
Репутация
287
Реакции
180
Баллы
1 408
Хроники
  1. Goddess of Destruction Epeisodion / Valiance
Исходники
Присутствуют
Сборка
L2J_Ertheia
Через какой параметр предмета передается переменная для установки - Без имени, Имя уже существует.

Java:
/*
 * Copyright (C) 2004-2015 L2J Server
 *
 * This file is part of L2J Server.
 *
 * L2J Server 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.
 *
 * L2J Server 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 this program. If not, see <http://www.gnu.org/licenses/>.
 */
package gameserver.network.serverpackets;

import com.l2jserver.gameserver.enums.ItemListType;
import com.l2jserver.gameserver.model.ItemInfo;
import com.l2jserver.gameserver.model.TradeItem;
import com.l2jserver.gameserver.model.buylist.Product;
import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
import com.l2jserver.gameserver.model.items.L2WarehouseItem;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;

/**
 * @author UnAfraid
 */
public abstract class AbstractItemPacket extends AbstractMaskPacket<ItemListType>
{
    private static final byte[] MASKS =
    {
        0x00
    };
    
    @Override
    protected byte[] getMasks()
    {
        return MASKS;
    }
    
    @Override
    protected void onNewMaskAdded(ItemListType component)
    {
    }
    
    protected void writeItem(TradeItem item)
    {
        writeItem(new ItemInfo(item));
    }
    
    protected void writeItem(L2WarehouseItem item)
    {
        writeItem(new ItemInfo(item));
    }
    
    protected void writeItem(L2ItemInstance item)
    {
        writeItem(new ItemInfo(item));
    }
    
    protected void writeItem(Product item)
    {
        writeItem(new ItemInfo(item));
    }
    
    protected void writeTradeItem(TradeItem item)
    {
        writeH(item.getItem().getType1());
        writeD(item.getObjectId()); // ObjectId
        writeD(item.getItem().getDisplayId()); // ItemId
        writeQ(item.getCount()); // Quantity
        writeC(item.getItem().getType2()); // Item Type 2 : 00-weapon, 01-shield/armor, 02-ring/earring/necklace, 03-questitem, 04-adena, 05-item
        writeC(item.getCustomType1()); // Filler (always 0)
        writeQ(item.getItem().getBodyPart()); // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand
        writeH(item.getEnchant()); // Enchant level (pet level shown in control item)
        writeH(0x00); // Equipped : 00-No, 01-yes
        writeH(item.getCustomType2());
        writeItemElementalAndEnchant(new ItemInfo(item));
    }
    
    protected void writeItem(ItemInfo item)
    {
        final int mask = calculateMask(item);
        // cddcQcchQccddc
        writeC(mask);
        writeD(item.getObjectId()); // ObjectId
        writeD(item.getItem().getDisplayId()); // ItemId
        writeC(item.getEquipped() == 0 ? item.getLocation() : 0xFF); // T1
        writeQ(item.getCount()); // Quantity
        writeC(item.getItem().getType2()); // Item Type 2 : 00-weapon, 01-shield/armor, 02-ring/earring/necklace, 03-questitem, 04-adena, 05-item
        writeC(item.getCustomType1()); // Filler (always 0)
        writeH(item.getEquipped()); // Equipped : 00-No, 01-yes
        writeQ(item.getItem().getBodyPart()); // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand
        writeH(item.getEnchant()); // Enchant level (pet level shown in control item)
        writeD(item.getMana());
        writeD(item.getTime());
        writeC(0x01); // GOD Item enabled = 1 disabled (red) = 0
        if (containsMask(mask, ItemListType.AUGMENT_BONUS))
        {
            writeD(item.getAugmentationBonus());
        }
        if (containsMask(mask, ItemListType.ELEMENTAL_ATTRIBUTE))
        {
            writeItemElemental(item);
        }
        if (containsMask(mask, ItemListType.ENCHANT_EFFECT))
        {
            writeItemEnchantEffect(item);
        }
        if (containsMask(mask, ItemListType.VISUAL_ID))
        {
            writeD(item.getVisualId()); // Item remodel visual ID
        }
    }
    
    protected static final int calculateMask(ItemInfo item)
    {
        int mask = 0;
        if (item.getAugmentationBonus() > 0)
        {
            mask |= ItemListType.AUGMENT_BONUS.getMask();
        }
        
        if (item.getAttackElementType() >= 0)
        {
            mask |= ItemListType.ELEMENTAL_ATTRIBUTE.getMask();
        }
        else
        {
            for (byte i = 0; i < 6; i++)
            {
                if (item.getElementDefAttr(i) >= 0)
                {
                    mask |= ItemListType.ELEMENTAL_ATTRIBUTE.getMask();
                    break;
                }
            }
        }
        
        if (item.getEnchantOptions() != null)
        {
            for (int id : item.getEnchantOptions())
            {
                if (id > 0)
                {
                    mask |= ItemListType.ENCHANT_EFFECT.getMask();
                    break;
                }
            }
        }
        
        if (item.getVisualId() > 0)
        {
            mask |= ItemListType.VISUAL_ID.getMask();
        }
        return mask;
    }
    
    protected void writeItemElementalAndEnchant(ItemInfo item)
    {
        writeItemElemental(item);
        writeItemEnchantEffect(item);
    }
    
    protected void writeItemElemental(ItemInfo item)
    {
        writeH(item.getAttackElementType());
        writeH(item.getAttackElementPower());
        for (byte i = 0; i < 6; i++)
        {
            writeH(item.getElementDefAttr(i));
        }
    }
    
    protected void writeItemEnchantEffect(ItemInfo item)
    {
        // Enchant Effects
        for (int op : item.getEnchantOptions())
        {
            writeH(op);
        }
    }
    
    protected void writeInventoryBlock(PcInventory inventory)
    {
        if (inventory.hasInventoryBlock())
        {
            writeH(inventory.getBlockItems().length);
            writeC(inventory.getBlockMode());
            for (int i : inventory.getBlockItems())
            {
                writeD(i);
            }
        }
        else
        {
            writeH(0x00);
        }
    }
    
    protected void writeCommissionItem(ItemInfo item)
    {
        writeD(0); // Always 0
        writeD(item.getItem().getId());
        writeQ(item.getCount());
        writeH(item.getItem().getType2());
        writeQ(item.getItem().getBodyPart());
        writeH(item.getEnchant());
        writeH(item.getCustomType2());
        writeItemElementalAndEnchant(item);
        writeD(item.getVisualId());
    }
}
 

Вложения

  • 2021-07-14_20-58-13.png
    2021-07-14_20-58-13.png
    79,1 КБ · Просмотры: 33
Решение
Index: AbstractItemPacket.java
===================================================================
--- AbstractItemPacket.java (revision 553)
+++ AbstractItemPacket.java (working copy)
@@ -95,7 +95,8 @@
writeC(item.getCustomType1()); // Filler (always 0)
writeH(item.getEquipped()); // Equipped : 00-No, 01-yes
writeQ(item.getItem().getBodyPart()); // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand
- writeH(item.getEnchant()); // Enchant level (pet level shown in control item)
+ writeC(item.getEnchant()); // Enchant level (pet level shown in control item)
+ writeC(item.getCustomType2())...
Index: AbstractItemPacket.java
===================================================================
--- AbstractItemPacket.java (revision 553)
+++ AbstractItemPacket.java (working copy)
@@ -95,7 +95,8 @@
writeC(item.getCustomType1()); // Filler (always 0)
writeH(item.getEquipped()); // Equipped : 00-No, 01-yes
writeQ(item.getItem().getBodyPart()); // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand
- writeH(item.getEnchant()); // Enchant level (pet level shown in control item)
+ writeC(item.getEnchant()); // Enchant level (pet level shown in control item)
+ writeC(item.getCustomType2()); // Pet Name. 0 - Без имени. 1 - Имя уже существует.
writeD(item.getMana());
writeD(item.getTime());
writeC(0x01); // GOD Item enabled = 1 disabled (red) = 0

Java:
package l2jofficial.gameserver.network.game.serverpackets;

import l2jofficial.gameserver.instancemanager.ServerPacketOpCodeManager;
import l2jofficial.gameserver.model.items.ItemInfo;
import l2jofficial.gameserver.model.items.TradeItem;
import l2jofficial.gameserver.model.items.base.L2WarehouseItem;
import l2jofficial.gameserver.model.items.base.instance.L2ItemInstance;
import l2jofficial.gameserver.network.L2GameClient;
import l2jofficial.gameserver.network.mmocore.SendablePacket;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

/**
 * @author KenM
 */

public abstract class L2GameServerPacket extends SendablePacket<L2GameClient>
{
    public static final Logger _log = LogManager.getLogger(L2GameServerPacket.class);

    protected boolean _invisible;

    private int check_Augmentation; // 603
    private int check_ElementType; // 603
    private int check_EnchantOption; // 603

    /**
     * @return {@code true} if packet originated from invisible character.
     */
    public boolean isInvisible()
    {
        return _invisible;
    }

    /**
     * Set "invisible" boolean flag in the packet.
     * Packets from invisible characters will not be broadcasted to players.
     * @param b
     */
    public void setInvisible(boolean b)
    {
        _invisible = b;
    }

    @Override
    protected void write()
    {
        try
        {
            if(isWriteOpCode())
            {
                writeOpCode();
            }
            writeImpl();

            switch(getClass().getSimpleName())
            {
                case "MTL":
                case "SocialAction":
                case "StatusUpdate":
                case "ChangeMoveType":
                case "NpcInfo":
                case "NS":
                case "MyTargetSelected":
                case "TargetSelected":
                case "ValidateLocation":
                case "ActionFail":
                case "ExAbnormalStatusUpdateFromTarget":
                case "DeleteObject":
                case "StopMove":
                    break;
                default:
                    System.out.println("[S] " + getClass().getSimpleName());
            }
        }
        catch(Exception e)
        {
            _log.log(Level.ERROR, "Client: " + getClient() + " - Failed writing: " + this + " ; " + e.getMessage(), e);
        }
    }

    public void runImpl()
    {

    }

    protected abstract void writeImpl();

    public boolean isWriteOpCode()
    {
        return true;
    }

    protected void writeOpCode()
    {
        try
        {
            int opCode = ServerPacketOpCodeManager.getInstance().getOpCodeForPacketHash(getClass().hashCode());
            if(opCode > 254)
            {
                writeC(0xFE);
                writeH(opCode - 255);

                //              Debug
                //                StringBuilder sb = new StringBuilder();
                //                sb.append(Integer.toHexString(opCode - 255));
                //                if (sb.length() < 2) {
                //                    sb.insert(0, '0'); // pad with leading zero if needed
                //                }
                //                String hex = sb.toString();
                //                System.out.println(hex);
            }
            else
            {
                writeC(opCode);
            }
        }
        catch(Exception e)
        {
            _log.log(Level.ERROR, "Client: " + getClient() + " - Failed writing: " + this + " ; " + e.getMessage(), e);
        }
    }

    /**
     * Служит для быстрой записи информации о предмете в пакете
     * @param item инстанс предмета
     */
    protected void writeItemInfo(L2ItemInstance item)
    {
        writeItemInfo(item, item.getCount());
    }

    protected void writeItemInfo(TradeItem item)
    {
        writeItemInfo(item, item.getCount());
    }

    protected void writeItemInfo(ItemInfo item)
    {
        check_Augmentation = 0;
        check_ElementType = 0;
        check_EnchantOption = 0;
        if(item.getAugmentationBonus() > 0)
        {
            check_Augmentation = 1;
        }
        if(item.getAttackElementPower() > 0)
        {
            check_ElementType = 2;
        }
        else
        {
            for(byte i = 0; i < 6; i++)
            {
                if(item.getElementDefAttr(i) > 0)
                {
                    check_ElementType = 2;
                }
            }
        }
        for(int op : item.getEnchantEffect())
        {
            if(op > 0)
            {
                check_EnchantOption = 4;
            }
        }
        writeC(check_Augmentation + check_ElementType + check_EnchantOption + 0);
        writeD(item.getObjectId()); // ObjectId
        writeD(item.getItem().getItemId()); // ItemId
        writeC((int) item.getLocation()); // 603 // T1
        writeQ(item.getCount()); // Quantity
        writeC(item.getItem().getType2()); // 603 // Item Type 2 : 00-weapon, 01-shield/armor, 02-ring/earring/necklace, 03-questitem, 04-adena, 05-item
        writeC(item.getCustomType1()); // 603 // Filler (always 0)
        writeH(item.getEquipped()); // Equipped : 00-No, 01-yes
        writeQ(item.getItem().getBodyPart()); // 603 // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand
        writeC(item.getEnchant()); // 603 // Enchant level (pet level shown in control item)
        writeC(item.getCustomType2()); // 603 // Pet name exists or not shown in control item
        writeD(item.getMana());
        writeD(item.getTime());
        writeC(item.isBlock()); // TODO Можно ли одеть? 0 нельзя 1 можно
        if(check_Augmentation > 0) // 603
        {
            writeD(item.getAugmentationBonus());
        }
        if(check_ElementType > 0)
        {
            writeH(item.getAttackElementType());
            writeH(item.getAttackElementPower());
            for(byte i = 0; i < 6; i++)
            {
                writeH(item.getElementDefAttr(i));
            }
        }
        if(check_EnchantOption > 0) // 603
        {
            for(int op : item.getEnchantEffect())
            {
                writeH(op);
            }
        }
    }

    protected void writeItemInfo(L2ItemInstance item, long count)
    {
        check_Augmentation = 0;
        check_ElementType = 0;
        check_EnchantOption = 0;
        if(item.getAugmentationId() > 0)
        {
            check_Augmentation = 1;
        }
        if(item.getAttackElementPower() > 0)
        {
            check_ElementType = 2;
        }
        else
        {
            for(byte i = 0; i < 6; i++)
            {
                if(item.getElementDefAttr(i) > 0)
                {
                    check_ElementType = 2;
                }
            }
        }
        for(int op : item.getEnchantEffect())
        {
            if(op > 0)
            {
                check_EnchantOption = 4;
            }
        }
        writeC(check_Augmentation + check_ElementType + check_EnchantOption + 0);
        writeD(item.getObjectId());
        writeD(item.getItemId());
        writeC((int) item.getLocationSlot());
        writeQ(count);
        writeC(item.getItem().getType2());
        writeC(item.getCustomType1());
        writeH(item.isEquipped() ? 1 : 0);
        writeQ(item.getItem().getBodyPart());
        writeC(item.getEnchantLevel());
        writeC(item.getCustomType2());
        writeD(item.getMana());
        writeD(item.isTimeLimitedItem() ? (int) (item.getRemainingTime() / 1000) : -9999);
        writeC(item.isBlocked()); // TODO Можно ли одеть? 0 нельзя 1 можно
        if(check_Augmentation > 0) // 603
        {
            writeD(item.getAugmentationId());
        }
        if(check_ElementType > 0)
        {
            writeH(item.getAttackElementType());
            writeH(item.getAttackElementPower());
            for(byte i = 0; i < 6; i++)
            {
                writeH(item.getElementDefAttr(i));
            }
        }
        if(check_EnchantOption > 0) // 603
        {
            for(int op : item.getEnchantEffect())
            {
                writeH(op);
            }
        }
    }

    protected void writeItemInfo(TradeItem item, long count)
    {
        //TODO Допилить
        writeC(0);
        writeD(item.getObjectId());
        writeD(item.getItem().getItemId());
        writeC((int) item.getLocationSlot());
        writeQ(count);
        writeC(item.getItem().getType2());
        writeC(item.getCustomType1());
        writeH(0x00);
        writeQ((int) item.getItem().getBodyPart());
        writeC(item.getEnchantLevel());
        writeC(item.getCustomType2());
        writeD(0x00);    // Augment
        writeD(-1);        // Mana
        writeD(-9999);    // Time
        writeC(item.isBlocked());
        if(check_Augmentation > 0) // 603
        {
            writeD(0x00);
        }
        if(check_ElementType > 0)
        {
            writeH(item.getAttackElementType());
            writeH(item.getAttackElementPower());
            for(byte i = 0; i < 6; i++)
            {
                writeH(item.getElementDefAttr(i));
            }
        }
        if(check_EnchantOption > 0) // 603
        {
            for(int op : item.getEnchantEffect())
            {
                writeH(op);
            }
        }
    }

    protected void writeItemInfo(L2WarehouseItem item)
    {
        check_Augmentation = 0;
        check_ElementType = 0;
        check_EnchantOption = 0;
        if(item.getAugmentationId() > 0)
        {
            check_Augmentation = 1;
        }
        if(item.getAttackElementPower() > 0)
        {
            check_ElementType = 2;
        }
        else
        {
            for(byte i = 0; i < 6; i++)
            {
                if(item.getElementDefAttr(i) > 0)
                {
                    check_ElementType = 2;
                }
            }
        }
        for(int op : item.getEnchantEffect())
        {
            if(op > 0)
            {
                check_EnchantOption = 4;
            }
        }
        writeC(check_Augmentation + check_ElementType + check_EnchantOption + 0);
        writeD(item.getObjectId());
        writeD(item.getItemId());
        writeC((int) item.getLocationSlot());
        writeQ(item.getCount());
        writeC(item.getItem().getType2());
        writeC(item.getCustomType1());
        writeH(0x00); // ToDO isEqiped ?
        writeQ(item.getItem().getBodyPart());
        writeC(item.getEnchantLevel());
        writeC(item.getCustomType2());
        writeD(item.getMana());
        writeD(item.getTime());
        writeC(item.isBlock()); // TODO Можно ли одеть? 0 нельзя 1 можно
        if(check_Augmentation > 0) // 603
        {
            writeD(item.getAugmentationId());
        }
        if(check_ElementType > 0)
        {
            writeH(item.getAttackElementType());
            writeH(item.getAttackElementPower());
            for(byte i = 0; i < 6; i++)
            {
                writeH(item.getElementDefAttr(i));
            }
        }
        if(check_EnchantOption > 0) // 603
        {
            for(int op : item.getEnchantEffect())
            {
                writeH(op);
            }
        }
    }

    @Override
    public String toString()
    {
        return "[S] " + getClass().getSimpleName();
    }
}
:) Closed
 
  • Мне нравится
Реакции: kick
Решение
Вы и сами можете отметить сообщение как решение нажав на соответствующую галочку.
1626292892111.png
 
Статус
В этой теме нельзя размещать новые ответы.

Похожие темы

Назад
Сверху Снизу