示例#1
0
        public override void Execute(string[] command, NecClient client, ChatMessage message,
                                     List <ChatResponse> responses)
        {
            Logger.Debug($"Entering");
            if (command[0] == null)
            {
                responses.Add(ChatResponse.CommandError(client, $"Invalid argument: {command[0]}"));
            }

            Logger.Debug($"command [0]");

            int.TryParse(command[1], out int x);
            int.TryParse(command[2], out int y);
            int.TryParse(command[3], out int z);


            switch (command[0])
            {
            case "dagger":
                Item item = null;
                if (y == 0)
                {
                    RecvCharaUpdateAlignment charAlign = new RecvCharaUpdateAlignment(1);
                    _server.Router.Send(charAlign, client);
                    item = SendItemInstanceUnidentified(client, 10200101, x, (int)ITEM_TYPE.DAGGER, "Dagger");
                }
                else
                {
                    item = SendItemInstance(client, 10200101, (int)ITEM_TYPE.DAGGER, "Dagger");
                }

                if (item == null)
                {
                    return;
                }
                Logger.Debug($"dagger instanceId [{item.InstanceId}]");
                break;

            case "healpot":
                Item healItem = null;
                if (y == 0)
                {
                    healItem = SendItemInstanceUnidentified(client, 50100101, x, (int)ITEM_TYPE.DRUG, "Heal Pot");
                }
                else
                {
                    //healItem = SendItemInstance(client, "Test");
                }

                Logger.Debug($"dagger instanceId [{healItem.InstanceId}]");
                break;

            case "create":
                Item createItem = null;
                if (y == 0)
                {
                    createItem = SendItemInstanceUnidentified(client, x, 1, y, "");
                }
                else
                {
                    //createItem = SendItemInstance(client, "Test");
                }

                Logger.Debug($"dagger instanceId [{createItem.InstanceId}]");
                break;

            case "draw":
                RecvPartyNotifyAddDrawItem itemMsg = new RecvPartyNotifyAddDrawItem((ulong)x, 30.0F, 0);
                _server.Router.Send(itemMsg, client);
                break;

            case "getitema":
                IBuffer resa = BufferProvider.Provide();
                //recv_normal_system_message = 0xAE2B,
                resa.WriteInt32(x);
                resa.WriteCString(command[3]);
                resa.WriteByte((byte)y);
                Router.Send(client, (ushort)AreaPacketId.recv_party_notify_get_item, resa, ServerType.Area);
                break;

            case "getitemm":
                IBuffer resm = BufferProvider.Provide();
                //recv_normal_system_message = 0xAE2B,
                resm.WriteInt32(x);
                resm.WriteCString(command[3]);
                resm.WriteByte((byte)y);
                Router.Send(client, (ushort)MsgPacketId.recv_party_notify_get_item, resm, ServerType.Msg);
                break;

            case "soulitem":
                IBuffer res19 = BufferProvider.Provide();
                res19.WriteInt32(Util.GetRandomNumber(62000001, 62000015));     //soul_dispitem.csv
                Router.Send(client, (ushort)AreaPacketId.recv_soul_dispitem_notify_data, res19, ServerType.Area);
                break;

            case "soulmat":
                for (int i = 0; i < x; i++)
                {
                    IBuffer res20 = BufferProvider.Provide();
                    res20.WriteInt32(Util.GetRandomNumber(998000, 1000000));

                    res20.WriteFloat(client.Character.X);                                   //X
                    res20.WriteFloat(client.Character.Y);                                   //Y
                    res20.WriteFloat(client.Character.Z);                                   //Z

                    res20.WriteFloat(client.Character.X + Util.GetRandomNumber(-300, 300)); //X
                    res20.WriteFloat(client.Character.Y + Util.GetRandomNumber(-300, 200)); //Y
                    res20.WriteFloat(client.Character.Z + 10);                              //Z
                    res20.WriteByte((byte)Util.GetRandomNumber(0, 255));

                    res20.WriteInt32(Util.GetRandomNumber(0, 199999));

                    res20.WriteInt32(Util.GetRandomNumber(0, 199999));
                    res20.WriteInt32(Util.GetRandomNumber(0, 199999));
                    res20.WriteInt32(Util.GetRandomNumber(0, 1000));     // bitmask  0bxxxxx1 = arch  0bxxxxx0 = no arch
                    y = Util.GetRandomNumber(1, 4);
                    if (y == 1)
                    {
                        Router.Send(client, (ushort)AreaPacketId.recv_data_notify_goldobject_data, res20,
                                    ServerType.Area);
                    }

                    res20.WriteInt32(Util.GetRandomNumber(0, 199999));
                    if (y == 2)
                    {
                        Router.Send(client, (ushort)AreaPacketId.recv_data_notify_soulmaterialobject_data, res20,
                                    ServerType.Area);
                    }
                    if (y == 3)
                    {
                        Router.Send(client, (ushort)AreaPacketId.recv_data_notify_itemobject_data, res20,
                                    ServerType.Area);
                    }
                }

                break;

            case "physics":
                IBuffer res21 = BufferProvider.Provide();
                res21.WriteInt64(x);        //item instance id
                res21.WriteInt16((short)y); //item's attack stat
                Router.Send(client, (ushort)AreaPacketId.recv_item_update_physics, res21, ServerType.Area);
                break;

            case "leatherguard":
            case "lg":
                if (y == 0)
                {
                    item = SendItemInstanceUnidentified(client, 100101, x, (int)ITEM_TYPE.HELMET, "Leather Guard");
                }
                else
                {
                    item = SendItemInstance(client, 100101, (int)ITEM_TYPE.HELMET, "Leather Guard");
                }

                if (item == null)
                {
                    return;
                }
                Logger.Debug($"dagger instanceId [{item.InstanceId}]");
                break;

            case "rottenleathermail":
            case "rlm":
                if (x == 0)
                {
                    item = SendItemInstanceUnidentified(client, 200110, 1, y, "Rotten Leather Mail");
                }
                else
                {
                    item = SendItemInstance(client, 200110, (int)ITEM_TYPE.COAT, "Rotten Leather Mail");
                }

                if (item == null)
                {
                    return;
                }
                Logger.Debug($"dagger instanceId [{item.InstanceId}]");
                break;

            case "buff":
                Buff[] selfBuffs = new Buff[1];
                Buff   testBuff  = new Buff();
                testBuff.buffId   = x;
                testBuff.unknown1 = y;
                testBuff.unknown2 = z;
                selfBuffs[0]      = testBuff;
                RecvSelfBuffNotify selfBuff = new RecvSelfBuffNotify(selfBuffs);
                _server.Router.Send(selfBuff, client);
                break;

            case "itemt":
                IBuffer res = BufferProvider.Provide();
                res.WriteUInt64(invItem.InstanceId);
                res.WriteInt16((short)x);
                Router.Send(client, (ushort)AreaPacketId.recv_0x746F, res, ServerType.Area);
                break;

            case "testitem":
                Item         item1    = SendItemInstanceUnidentified(client, 10200101, 1, (int)ITEM_TYPE.DAGGER, "Dagger");
                RecvItemTest recvTest = new RecvItemTest((ulong)item1.InstanceId, (ushort)x, (uint)y, (uint)z);
                Router.Send(recvTest, client);
                break;

            default:
                Logger.Error($"There is no recv of type : {command[0]} ");
                break;
            }
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            int instanceID = packet.Data.ReadInt32();

            Logger.Debug($"{client.Character.Name} is {client.Character.Alignmentid}");


            IBuffer res = null;

            //res2.WriteInt32(instanceID);

            //Router.Send(client, (ushort) AreaPacketId.recv_loot_access_object_r, res2, ServerType.Area);

            res = BufferProvider.Provide();
            res.WriteInt32(instanceID);

            Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area);

            MonsterSpawn monster = client.Map.GetMonsterByInstanceId((uint)instanceID);

            DropTables dropTable = new DropTables(_server);
            DropItem   dropItem  = dropTable.GetLoot(monster.MonsterId);

            if (dropItem == null)
            {
                return;
            }
            InventoryItem invItem =
                client.Character.GetNextInventoryItem(_server, (byte)dropItem.NumItems, dropItem.Item);

            if (invItem == null)
            {
                res = BufferProvider.Provide();
                res.WriteInt32(-207);
                Router.Send(client, (ushort)AreaPacketId.recv_loot_access_object_r, res, ServerType.Area);

                RecvNormalSystemMessage noSpace = new RecvNormalSystemMessage("Inventory is full!!!!");
                _server.Router.Send(noSpace, client);
                return;
            }

            string lootMsg = $"Looted {dropItem.NumItems} {dropItem.Item.Name} from {monster.Name}.";

            Logger.Debug($"Loot is {dropItem.NumItems} of {dropItem.Item.Id}");

            if (dropItem.Item.Id == 1)
            {
                client.Character.AdventureBagGold += dropItem.NumItems;
                RecvSelfMoneyNotify addMoney = new RecvSelfMoneyNotify(client.Character.AdventureBagGold);
                Router.Send(addMoney, client);
            }
            else
            {
                res = null;
                res = BufferProvider.Provide();

                //res.WriteInt64(dropItem.Item.Id); //Item Object Instance ID
                res.WriteUInt64(dropItem.Item.InstanceId); //Item Object Instance ID

                res.WriteCString(dropItem.Item.Name);      //Name

                //res.WriteInt32(dropItem.Item.IconType);
                res.WriteInt32(dropItem.Item.IconType); //item type

                res.WriteInt32(0);

                res.WriteByte((byte)dropItem.NumItems); //Number of items

                res.WriteInt32(0);                      //Item status 0 = identified

                res.WriteInt32(dropItem.Item.Id);       //Item icon 50100301 = camp
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteInt32(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);

                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(1); // bool
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);
                res.WriteByte(0);

                res.WriteByte(invItem.StorageType);  // 0 = adventure bag. 1 = character equipment
                res.WriteByte(invItem.StorageId);    // 0~2
                res.WriteInt16(invItem.StorageSlot); // bag index
                res.WriteInt32(
                    0);                              //bit mask. This indicates where to put items.   e.g. 01 head 010 arm 0100 feet etc (0 for not equipped)

                res.WriteInt64(0);

                res.WriteInt32(0);

                Router.Send(client, (ushort)AreaPacketId.recv_item_instance_unidentified, res, ServerType.Area);
            }

            RecvMonsterStateUpdateNotify monsterState = new RecvMonsterStateUpdateNotify((uint)instanceID, 1);

            Router.Send(client.Map, monsterState);

            if (dropItem.Item.Id != 1)
            {
                //RecvPartyNotifyGetItem itemMsg = new RecvPartyNotifyGetItem(dropItem.Item.Id, dropItem.Item.Name, (byte)dropItem.NumItems);

                RecvPartyNotifyAddDrawItem itemMsg = new RecvPartyNotifyAddDrawItem(dropItem.Item.InstanceId, 30.0F, 0);
                _server.Router.Send(itemMsg, client);
            }
        }