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); }
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); }
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 }, }); } }
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); }
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()); }
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, }); }
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); }