Ejemplo n.º 1
0
        public async Task CBloodCastleMove(GSSession session, CBloodCastleMove message)
        {
            var plr   = session.Player;
            var @char = session.Player.Character;

            var invisibleCloack = @char.Inventory.Get(message.ItemPos);
            var itemLevel       = BloodCastles.GetNeededLevel(plr);

            if (invisibleCloack.Plus != message.Bridge && invisibleCloack.Number != ItemNumber.FromTypeIndex(13, 47))
            {
                await session.SendAsync(new SBloodCastleMove(1));

                return;
            }

            if (itemLevel != invisibleCloack.Plus)
            {
                await session.SendAsync(new SBloodCastleMove((byte)(itemLevel > invisibleCloack.Plus ? 4 : 3)));

                return;
            }

            if (!BloodCastles.TryAdd(message.Bridge, plr))
            {
                await session.SendAsync(new SBloodCastleMove(5));

                return;
            }

            @char.Inventory.Delete(message.ItemPos);
        }
Ejemplo n.º 2
0
        public async Task CBloodCastleMove(GSSession session, CBloodCastleMove message)
        {
            var plr   = session.Player;
            var @char = session.Player.Character;

            var invisibleCloack = @char.Inventory.Get(message.ItemPos);
            var evbc            = Program.EventManager.GetEvent <BloodCastles>();
            var itemLevel       = evbc.GetEventNumber(plr);

            if (invisibleCloack.Plus != message.Bridge && invisibleCloack.Number != ItemNumber.FromTypeIndex(13, 47))
            {
                await session.SendAsync(new SBloodCastleMove(1));

                return;
            }

            if (itemLevel != invisibleCloack.Plus)
            {
                await session.SendAsync(new SBloodCastleMove((byte)(itemLevel > invisibleCloack.Plus ? 4 : 3)));

                return;
            }

            if (!evbc.TryAdd(plr))
            {
                await session.SendAsync(new SBloodCastleMove(5));

                return;
            }

            await @char.Inventory.Delete(message.ItemPos);
        }
Ejemplo n.º 3
0
        public async Task CQuestEXPEventItemEPList(GSSession session)
        {
            var @char = session.Player.Character;

            if (@char.BaseClass == HeroClass.DarkLord || @char.BaseClass == HeroClass.MagicGladiator || @char.BaseClass == HeroClass.RageFighter)
            {
                return;
            }
            var rings = session.Player.Character.Inventory.FindAllItems(ItemNumber.FromTypeIndex(13, 20)).Where(x => x.Plus == 1 || x.Plus == 2);

            if (@char.Level >= 80 || rings.Any())
            {
                return;
            }

            var qs = @char.Quests.GetEpisodeState(1);

            if (qs < 3)
            {
                var q = @char.Quests.GetEpisode <QuestInfoIndex>(1, 0);
                await session.SendAsync(new SQuestSwitchListEvent
                {
                    QuestList = new uint[] { q.Index },
                });
            }
        }
Ejemplo n.º 4
0
        public override bool TryAdd(Player plr)
        {
            var result = new SImperialEnterResult
            {
                Day       = DateTime.Now.DayOfWeek,
                Index     = plr.ID,
                Result    = 0,
                State     = 1,
                Unk       = 0,
                EntryTime = 0,
            };

            if (plr.Character.Party == null)
            {
                result.Result = 6;
                _             = plr.Session.SendAsync(result);
                return(false);
            }

            var itNum      = ItemNumber.FromTypeIndex(14, (ushort)(result.Day == DayOfWeek.Sunday ? 109 : 102));
            var invitation = plr.Character.Inventory.FindAll(itNum);

            if (invitation.Length <= 0)
            {
                result.Result = 2;
                _             = plr.Session.SendAsync(result);
                return(false);
            }

            if (CurrentState != EventState.Open && _players.First().Player.Character.Party != plr.Character.Party)
            {
                result.Result = 1;
                _             = plr.Session.SendAsync(result);
                return(false);
            }

            _          = plr.Character.Inventory.Delete(invitation.First());
            plr.Window = null;
            _          = plr.Character.WarpTo(_imperialGates[(int)result.Day]);

            _players.Add(new PlayerEventInfo {
                Eventer = true, Player = plr
            });
            plr.Character.MapChanged   += OnPlayerLeave;
            plr.Character.CharacterDie += OnPlayerDead;

            return(true);
        }
Ejemplo n.º 5
0
        public MixInfo FindMix(Character @char)
        {
            var cbItems     = @char.Inventory.ChaosBox.Items;
            var items       = from obj in cbItems select obj.Value;
            var MixMatching = new Dictionary <MixInfo, int>();
            var npc         = @char.Player.Window as Monster;

            foreach (var m in Mixes.Where(x => x.NPC == npc.Info.Monster))
            {
                var ingCount  = 0;
                var iteCount  = 0;
                var itemsUsed = new List <Item>();
                foreach (var ing in m.Ingredients)
                {
                    ingCount += ing.Count;
                    var a = items.Where(x => ing.Match(x));
                    itemsUsed.AddRange(a);
                    iteCount += a.Count();
                }
                var res = (float)iteCount;

                res /= ingCount;
                res *= 100.0f;
                var leftItems = items.Except(itemsUsed);
                var leftItemsWithOutJewels = leftItems.Where(x => x.Number != ItemNumber.FromTypeIndex(14, 13) && x.Number != ItemNumber.FromTypeIndex(14, 14));

                if (leftItemsWithOutJewels.Count() > 0)
                {
                    res = 0;
                }

                MixMatching.Add(m, (int)res);
            }

            return(MixMatching
                   //.OrderByDescending(x => x.Value)
                   .Where(x => x.Value == 100)
                   .Select(x => x.Key)
                   .FirstOrDefault());
        }
Ejemplo n.º 6
0
        public async Task CNewQuestInfo(GSSession session, CNewQuestInfo message)
        {
            if (message.dwQuestInfoIndexID == 0)
            {
                return;
            }
            var @char  = session.Player.Character;
            var quest2 = ResourceLoader.XmlLoader <QuestEXPDto>("./Data/QuestEXP.xml");

            QuestInfoIndex info = message.dwQuestInfoIndexID;// @char.Quests.GetEpisodeByIndex();

            var result = quest2
                         .QuestList
                         .FirstOrDefault(x => x.QuestInfo.Any(y => y.Episode == info.Episode))?
                         .QuestInfo
                         .FirstOrDefault(x => x.Episode == info.Episode) ?? null;

            if (result == null)
            {
                await session.SendAsync(new SQuestEXP { Result = 1 });

                return;
            }
            var state = result
                        .QuestState
                        .Where(x => x.State == info.Switch && (x.Class == @char.BaseClass || x.Class == HeroClass.End))
                        .FirstOrDefault();

            if (state == null)
            {
                await session.SendAsync(new SQuestEXP { Result = 1 });

                return;
            }

            byte rewardCount = 0;
            var  ask         = new AskInfoDto[5];
            var  reward      = new RewardInfoDto[5];

            for (var i = 0; i < 5; i++)
            {
                ask[i]    = new AskInfoDto();
                reward[i] = new RewardInfoDto();
            }

            if (state.RewardEXP > 0)
            {
                reward[rewardCount].Type  = RewardType.Exp;
                reward[rewardCount].Value = state.RewardEXP;
                rewardCount++;
            }

            if (state.RewardGENS > 0)
            {
                reward[rewardCount].Type  = RewardType.Point;
                reward[rewardCount].Value = state.RewardGENS;
                rewardCount++;
            }

            if (state.RewardZEN > 0)
            {
                reward[rewardCount].Type  = RewardType.Zen;
                reward[rewardCount].Value = state.RewardZEN;
                rewardCount++;
            }

            byte askCount = 0;

            switch (state.Type)
            {
            case AskType.Tutorial:
                ask[askCount].Type = state.Type;
                break;

            case AskType.Item:
                foreach (var it in state.Item)
                {
                    var item = new Item(ItemNumber.FromTypeIndex(it.Type, it.Index), Options: new { Plus = it.Level });

                    var list = @char.Inventory.FindAllItems(ItemNumber.FromTypeIndex(it.Type, it.Index))
                               .Where(x => x.Plus == it.Level && it.Skill == x.Skill && it.Option == x.Option28 && it.Excellent == x.OptionExe);

                    ask[askCount].Type         = state.Type;
                    ask[askCount].ItemInfo     = item.GetBytes();
                    ask[askCount].CurrentValue = (uint)list.Count();
                    ask[askCount].Value        = it.Count;
                    askCount++;
                }
                break;

            case AskType.Monster:
                var infoM = @char.Quests.GetEpisode <QuestInfoMonster>((int)info.Episode, info.Switch);
                infoM.Type = state.Type;
                foreach (var it in state.Monster)
                {
                    ask[askCount].Type         = state.Type;
                    ask[askCount].Index        = it.Index;
                    ask[askCount].CurrentValue = infoM.Current;
                    ask[askCount].Value        = it.Count;
                    infoM.MonsterClass         = it.Index;
                    askCount++;
                }
                break;
            }
            await session.SendAsync(new SSendQuestEXPInfo
            {
                dwQuestInfoIndexID = QuestInfoIndex.FromEpisodeSwitch(info.Episode, info.Switch),
                AskCnt             = askCount,
                RandRewardCnt      = 0,
                RewardCnt          = rewardCount,
                Asks    = ask,
                Rewards = reward,
            });
        }
Ejemplo n.º 7
0
        public override bool TryAdd(Player plr)
        {
            var result = new SImperialEnterResult
            {
                Day       = (byte)DateTime.Now.DayOfWeek,
                Index     = plr.ID,
                Result    = 0,
                State     = 1,
                Unk       = 0,
                EntryTime = 0,
            };

            /*if(plr.Character.Party == null)
             * {
             *  result.Result = 6;
             *  _ = plr.Session.SendAsync(result);
             *  return false;
             * }*/

            var itNum      = ItemNumber.FromTypeIndex(14, (ushort)(result.Day == (byte)DayOfWeek.Sunday ? 109 : 102));
            var invitation = plr.Character.Inventory.FindAll(itNum);

            if (invitation.Length <= 0)
            {
                result.Result = 2;
                _             = plr.Session.SendAsync(result);
                return(false);
            }

            if (
                CurrentState != EventState.Open &&
                (_players.First().Player.Character.Party != plr.Character.Party ||
                 CurrentZone.CurrentState != FortressZoneState.BeginWaitPlayer)
                )
            {
                result.Result = 1;
                _             = plr.Session.SendAsync(result);
                return(false);
            }

            _          = plr.Character.Inventory.Delete(invitation.First());
            plr.Window = null;
            _          = plr.Character.WarpTo(_imperialGates[(int)result.Day]);

            _players.Add(new PlayerEventInfo {
                Eventer = true, Player = plr
            });
            plr.Character.MapChanged   += OnPlayerLeave;
            plr.Character.CharacterDie += OnPlayerDead;

            if (CurrentState == EventState.Open)
            {
                _zones[0].Trigger(FortressZoneState.BeginWaitPlayer);
                _zones[0].AddPlayer(plr);
            }
            else
            {
                CurrentZone.AddPlayer(plr);
            }

            return(true);
        }