Beispiel #1
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_event_union_storage_close_r, res, ServerType.Area);

            RecvEventEnd eventEnd = new RecvEventEnd(0);

            router.Send(eventEnd, client);
        }
Beispiel #2
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            NecClient targetClient = server.clients.GetByCharacterInstanceId((uint)client.character.eventSelectExecCode);

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_trade_abort_r, res, ServerType.Area);

            RecvEventEnd eventEnd = new RecvEventEnd(0);

            if (targetClient != null)
            {
                RecvTradeNotifyAborted notifyAborted = new RecvTradeNotifyAborted();
                router.Send(notifyAborted, targetClient);
                router.Send(eventEnd, targetClient);
                targetClient.character.tradeWindowSlot     = new ulong[20];
                targetClient.character.eventSelectExecCode = 0;
            }

            router.Send(eventEnd, client);
            client.character.tradeWindowSlot     = new ulong[20];
            client.character.eventSelectExecCode = 0;
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte notifyProblemSysMsg   = 0;
            int  clientItemCount       = 0;
            int  targetClientItemcount = 0;

            NecClient   targetClient      = server.clients.GetByCharacterInstanceId((uint)client.character.eventSelectExecCode);
            ItemService itemService       = new ItemService(client.character);
            ItemService targetItemService = new ItemService(targetClient.character);

            RecvTradeNotifyFixed notifyFixed  = new RecvTradeNotifyFixed(0);
            RecvTradeFix         recvTradeFix = new RecvTradeFix();

            for (int i = 0; i < 20; i++)
            {
                if (client.character.tradeWindowSlot[i] > 0)
                {
                    clientItemCount++;
                }
                if (targetClient.character.tradeWindowSlot[i] > 0)
                {
                    targetClientItemcount++;
                }
            }

            _Logger.Debug($"Transferred items {clientItemCount}:{targetClientItemcount}");
            _Logger.Debug($"Free Space{client.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag)}:{targetClient.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag)}");

            //ToDo:  improve this logic when GetTotalFreeSpace can check all bags
            if (client.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag) < targetClientItemcount - clientItemCount)
            {
                notifyProblemSysMsg = 1;                                                                                                                               //doesnt work. GetTotalFreeSpace is not accurate. problem with itemService.PutLootedItem updating count.
            }
            if (targetClient.character.itemLocationVerifier.GetTotalFreeSpace(ItemZoneType.AdventureBag) < clientItemCount - targetClientItemcount)
            {
                notifyProblemSysMsg = 1;
            }
            //ToDo:  add other trade preventing scenarios here


            RecvTradeNotifyProblem recvTradeNotifyProblem = new RecvTradeNotifyProblem(0, notifyProblemSysMsg);

            router.Send(client, recvTradeNotifyProblem.ToPacket());
            if (targetClient != null)
            {
                router.Send(targetClient, recvTradeNotifyProblem.ToPacket());
            }


            if (notifyProblemSysMsg == 0)
            {
                //player 1 sends
                router.Send(client, notifyFixed.ToPacket());
                router.Send(client, recvTradeFix.ToPacket());

                //player 2 sends
                if (targetClient != null)
                {
                    router.Send(targetClient, notifyFixed.ToPacket());
                    router.Send(targetClient, recvTradeFix.ToPacket());
                }

                //Get stuff from targetClient
                for (int i = 0; i < 20; i++)
                {
                    ItemInstance itemInstance = targetClient.character.itemLocationVerifier.GetItemByInstanceId(targetClient.character.tradeWindowSlot[i]);
                    if (itemInstance != null)
                    {
                        RecvItemRemove recvItemRemove = new RecvItemRemove(targetClient, itemInstance);
                        if (targetClient != null)
                        {
                            router.Send(recvItemRemove);
                        }

                        targetClient.character.itemLocationVerifier.RemoveItem(itemInstance);

                        //put the item in the new owners inventory
                        itemInstance = itemService.PutLootedItem(itemInstance);

                        RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                        router.Send(client, recvItemInstance.ToPacket());
                    }

                    //}
                    //give stuff to targetClient
                    //for (int i = 0; i < 20; i++)
                    //{
                    ItemInstance itemInstance2 = client.character.itemLocationVerifier.GetItemByInstanceId(client.character.tradeWindowSlot[i]);
                    if (itemInstance2 != null)
                    {
                        RecvItemRemove recvItemRemove2 = new RecvItemRemove(client, itemInstance2);
                        if (client != null)
                        {
                            router.Send(recvItemRemove2);
                        }

                        client.character.itemLocationVerifier.RemoveItem(itemInstance2);

                        //put the item in the new owners inventory
                        itemInstance2 = targetItemService.PutLootedItem(itemInstance2);

                        RecvItemInstance recvItemInstance2 = new RecvItemInstance(targetClient, itemInstance2);
                        if (targetClient != null)
                        {
                            router.Send(targetClient, recvItemInstance2.ToPacket());
                        }
                    }
                }

                client.character.tradeWindowSlot       = new ulong[20];
                targetClient.character.tradeWindowSlot = new ulong[20];

                Task.Delay(TimeSpan.FromSeconds(5)).ContinueWith
                    (t1 =>
                {
                    RecvEventEnd eventEnd = new RecvEventEnd(0);
                    if (targetClient != null)
                    {
                        router.Send(targetClient, eventEnd.ToPacket());
                    }
                    router.Send(client, eventEnd.ToPacket());
                }
                    );
            }
        }
        private void ResolveInn(NecClient client, int objectId, NpcSpawn npcSpawn)
        {
            if (client.character.eventSelectExecCode == 0)
            {
                int[]   hPandMPperChoice   = { 100, 50, 100, 100, 100, 100, 100, 50, 80, 100, 100 };
                byte[]  conditionPerChoice = { 150, 50, 100, 110, 120, 160, 150, 50, 80, 100, 120 };
                ulong[] goldCostPerChoice  = { 0, 0, 60, 300, 1200, 3000, 100, 0, 60, 300, 10000 };
                _Logger.Debug($"The selection you have made is {client.character.eventSelectExtraSelectionCode}");

                if (client.character.adventureBagGold < goldCostPerChoice[client.character.eventSelectExtraSelectionCode])
                {
                    IBuffer res = BufferProvider.Provide();
                    res.WriteCString("You don't have enough gold! This is why I don't like doing business with adventurers.");
                    router.Send(client, (ushort)AreaPacketId.recv_event_system_message, res, ServerType.Area); // show system message on middle of the screen.
                    RecvEventEnd(client);
                }
                else
                {
                    client.character.hp.SetCurrent((sbyte)hPandMPperChoice[client.character.eventSelectExtraSelectionCode], true);
                    client.character.mp.SetCurrent((sbyte)hPandMPperChoice[client.character.eventSelectExtraSelectionCode], true);
                    client.character.condition.SetCurrent(conditionPerChoice[client.character.eventSelectExtraSelectionCode]);
                    client.character.od.ToMax();
                    client.character.gp.ToMax();
                    client.character.adventureBagGold -= goldCostPerChoice[client.character.eventSelectExtraSelectionCode];
                    if (client.character.hp.current >= client.character.hp.max)
                    {
                        client.character.hp.ToMax();
                    }
                    if (client.character.mp.current >= client.character.mp.current)
                    {
                        client.character.mp.ToMax();
                    }

                    RecvCharaUpdateHp recvCharaUpdateHp = new RecvCharaUpdateHp(client.character.hp.current);
                    router.Send(recvCharaUpdateHp, client);
                    RecvCharaUpdateMp recvCharaUpdateMp = new RecvCharaUpdateMp(client.character.mp.current);
                    router.Send(recvCharaUpdateMp, client);
                    RecvCharaUpdateCon recvCharaUpdateCon = new RecvCharaUpdateCon(conditionPerChoice[client.character.eventSelectExtraSelectionCode]);
                    router.Send(recvCharaUpdateCon, client);
                    RecvSelfMoneyNotify recvSelfMoneyNotify = new RecvSelfMoneyNotify(client, client.character.adventureBagGold);
                    router.Send(recvSelfMoneyNotify, client);
                    RecvEventScriptPlay recvEventScriptPlay = new RecvEventScriptPlay("inn/fade_bgm", client.character.instanceId);
                    router.Send(recvEventScriptPlay, client);
                    Experience experience = new Experience();

                    //Level up stuff after inn cutscene
                    Task.Delay(TimeSpan.FromSeconds(6)).ContinueWith
                        (t1 =>
                    {
                        if (client.character.experienceCurrent > experience.CalculateLevelUp((uint)client.character.level + 1).cumulativeExperience)
                        {
                            RecvEventStart recvEventStart = new RecvEventStart(0, 0);
                            router.Send(recvEventStart, client);

                            LevelUpCheck(client);

                            Task.Delay(TimeSpan.FromSeconds(10)).ContinueWith
                                (t1 =>
                            {
                                RecvEventEnd recvEventEnd = new RecvEventEnd(0);
                                router.Send(recvEventEnd, client);         //Need a better way to end the event at the right time.
                            }
                                );
                        }
                    }
                        );
                }
            }
            else
            {
                SendEventEnd(client);
            }

            client.character.eventSelectExtraSelectionCode = 0;
            client.character.eventSelectExecCode           = 0;
            client.character.eventSelectReadyCode          = 0;
            client.character.secondInnAccess = false;
            server.database.UpdateCharacter(client.character);
        }