Beispiel #1
0
 private static void SendRewards(ArenaTeamMember member, bool win)
 {
     if (win)
     {
         member.Session.Character.GetXp(RewardsHelper.Instance.ArenaXpReward(member.Session.Character.Level));
         member.Session.Character.GetReput(500);
         member.Session.Character.GiftAdd(2800, 1);
         member.Session.Character.GetGold(member.Session.Character.Level * 1000);
         member.Session.Character.TalentWin++;
     }
     else
     {
         member.Session.Character.GetXp(RewardsHelper.Instance.ArenaXpReward(member.Session.Character.Level) / 2);
         member.Session.Character.GetReput(200);
         member.Session.Character.GiftAdd(2801, 3);
         member.Session.Character.GetGold(member.Session.Character.Level * 500);
         member.Session.Character.TalentLose++;
     }
     if (win)
     {
         member.Session.SendPacket(member.ArenaTeamType == ArenaTeamType.ERENIA
             ? member.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ERENIA"), 10)
             : member.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ZENAS"), 10));
     }
     else
     {
         member.Session.SendPacket(member.ArenaTeamType == ArenaTeamType.ZENAS
             ? member.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ERENIA"), 10)
             : member.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ZENAS"), 10));
     }
     member.Session.SendPacket(member.Session.Character.GenerateTaF(2));
 }
Beispiel #2
0
        private static void SendRewards(ArenaTeamMember member, bool win)
        {
            ItemInstance SpInstance = null;

            if (member.Session.Character.Inventory != null && member.Session.Character.UseSp)
            {
                SpInstance = (member.Session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, InventoryType.Wear));
            }
            if (win)
            {
                member.Session.Character.GetXp(RewardsHelper.ArenaXpReward(member.Session.Character.Level), false);
                member.Session.Character.GetJobExp(RewardsHelper.ArenaXpReward(SpInstance != null ? SpInstance.SpLevel : member.Session.Character.JobLevel), false);
                member.Session.Character.GetReputation(500);
                member.Session.Character.GiftAdd(2800, 1);
                member.Session.Character.GetGold(member.Session.Character.Level * 1000);
                member.Session.Character.TalentWin++;
            }
            else
            {
                member.Session.Character.GetXp(RewardsHelper.ArenaXpReward(member.Session.Character.Level) / 2, false);
                member.Session.Character.GetJobExp(RewardsHelper.ArenaXpReward(SpInstance != null ? SpInstance.SpLevel : member.Session.Character.JobLevel) / 2, false);
                member.Session.Character.GetReputation(200);
                member.Session.Character.GiftAdd(2801, 3);
                member.Session.Character.GetGold(member.Session.Character.Level * 500);
                member.Session.Character.TalentLose++;
            }
        }
Beispiel #3
0
        public void SearchName(TawPacket packet)
        {
            ConcurrentBag <ArenaTeamMember> at = ServerManager.Instance.ArenaTeams.FirstOrDefault(s => s.Any(o => o.Session.Character.Name == packet.Username));

            if (at != null)
            {
                ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, at.FirstOrDefault(s => s.Session != null).Session.CurrentMapInstance.MapInstanceId, 69, 100);

                ArenaTeamMember zenas  = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ZENAS);
                ArenaTeamMember erenia = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ERENIA);
                Session.SendPacket(Session.Character.GenerateTaM(0));
                Session.SendPacket(Session.Character.GenerateTaM(3));
                Session.SendPacket("taw_sv 0");
                Session.SendPacket(zenas?.Session.Character.GenerateTaP(0, true));
                Session.SendPacket(erenia?.Session.Character.GenerateTaP(2, true));
                Session.SendPacket(zenas?.Session.Character.GenerateTaFc(0));
                Session.SendPacket(erenia?.Session.Character.GenerateTaFc(1));
            }
            else
            {
                Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("USER_NOT_FOUND_IN_ARENA")));
            }
        }
Beispiel #4
0
        internal static void GenerateTalentArena()
        {
            long        groupid = 0;
            int         seconds = 0;
            IDisposable obs     = Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(start2 =>
            {
                ServerManager.Instance.ArenaMembers.Where(s => s.ArenaType == EventType.TALENTARENA).ToList().ForEach(s =>
                {
                    s.Time -= 1;
                    List <long> groupids = new List <long>();
                    ServerManager.Instance.ArenaMembers.Where(o => o.GroupId != null).ToList().ForEach(o =>
                    {
                        if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == o.GroupId) != 3)
                        {
                            return;
                        }
                        if (o.GroupId != null)
                        {
                            groupids.Add(o.GroupId.Value);
                        }
                    });

                    if (s.Time > 0)
                    {
                        if (s.GroupId == null)
                        {
                            List <ArenaMember> members = ServerManager.Instance.ArenaMembers
                                                         .Where(e => e.Session != s.Session && e.ArenaType == EventType.TALENTARENA && e.Session.Character.Level <= s.Session.Character.Level + 5 &&
                                                                e.Session.Character.Level >= s.Session.Character.Level - 5).ToList();
                            members.RemoveAll(o => o.GroupId != null && groupids.Contains(o.GroupId.Value));
                            ArenaMember member = members.FirstOrDefault();
                            if (member == null)
                            {
                                return;
                            }
                            {
                                if (member.GroupId == null)
                                {
                                    groupid++;
                                    member.GroupId = groupid;
                                }
                                s.GroupId = member.GroupId;
                                ServerManager.Instance.ArenaMembers.Where(e => e.ArenaType == EventType.TALENTARENA && e.GroupId == member.GroupId).ToList().ForEach(o =>
                                {
                                    o.Session.SendPacket(o.Session.Character.GenerateBsInfo(1, 2, -1, 6));
                                    o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ARENA_TEAM_FOUND"), 10));
                                    Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time =>
                                    {
                                        s.Time = 300;
                                        if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == s.GroupId) < 3)
                                        {
                                            o.Session.SendPacket(o.Session.Character.GenerateBsInfo(0, 2, s.Time, 8));
                                            o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_ARENA_TEAM"), 10));
                                        }
                                        else
                                        {
                                            o.Session.SendPacket(o.Session.Character.GenerateBsInfo(0, 2, s.Time, 1));
                                            o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_RIVAL_ARENA_TEAM"), 10));
                                        }
                                    });
                                });
                            }
                        }
                        else
                        {
                            if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == s.GroupId) != 3)
                            {
                                return;
                            }
                            ArenaMember member =
                                ServerManager.Instance.ArenaMembers.FirstOrDefault(o => o.GroupId != null && o.GroupId != s.GroupId && groupids.Contains(o.GroupId.Value) &&
                                                                                   o.Session.Character.Level <= s.Session.Character.Level + 5 &&
                                                                                   o.Session.Character.Level >= s.Session.Character.Level - 5);
                            if (member == null)
                            {
                                return;
                            }

                            MapInstance map = ServerManager.Instance.GenerateMapInstance(2015, MapInstanceType.TalentArenaMapInstance, new InstanceBag());
                            ConcurrentBag <ArenaTeamMember> arenaTeam = new ConcurrentBag <ArenaTeamMember>();
                            ServerManager.Instance.ArenaTeams.Add(arenaTeam);

                            ArenaMember[] arenamembers = ServerManager.Instance.ArenaMembers.Where(o => o.GroupId == member.GroupId || o.GroupId == s.GroupId).OrderBy(o => o.GroupId)
                                                         .ToArray();
                            for (int i = 0; i < 6; i++)
                            {
                                ItemInstance item = Inventory.InstantiateItemInstance((short)(4433 + (i > 2 ? 5 - i : i)), member.Session.Character.CharacterId);
                                item.Design       = (short)(4433 + (i > 2 ? 5 - i : i));
                                map.MapDesignObjects.Add(new MapDesignObject
                                {
                                    ItemInstance   = item,
                                    ItemInstanceId = item.Id,
                                    CharacterId    = member.Session.Character.CharacterId,
                                    MapX           = (short)(i > 2 ? 120 : 19),
                                    MapY           = (short)(i > 2 ? 35 + i % 3 * 4 : 36 + i % 3 * 4)
                                });
                            }
                            map.InstanceBag.Clock.BasesSecondRemaining = 60;
                            map.InstanceBag.Clock.DeciSecondRemaining  = 600;
                            map.InstanceBag.Clock.StartClock();
                            IDisposable obs4 = null;
                            IDisposable obs2 = null;
                            IDisposable obs3 = null;
                            IDisposable obs6 = null;
                            Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(time2 =>
                            {
                                obs3 = Observable.Interval(TimeSpan.FromSeconds(5)).Subscribe(effect =>
                                {
                                    arenamembers.ToList().ForEach(o => map.Broadcast(o.Session.Character.GenerateEff(o.GroupId == s.GroupId ? 3012 : 3013)));
                                });
                            });
                            IDisposable obs5 = Observable.Interval(TimeSpan.FromMilliseconds(500)).Subscribe(start3 =>
                            {
                                map.Broadcast(arenamembers.FirstOrDefault(o => o.Session != null)?.Session.Character.GenerateTaPs());
                                List <ArenaTeamMember> erenia = arenaTeam.Replace(team => team.ArenaTeamType == ArenaTeamType.ERENIA).ToList();
                                List <ArenaTeamMember> zenas  = arenaTeam.Replace(team => team.ArenaTeamType == ArenaTeamType.ZENAS).ToList();
                                BuffTeam(erenia);
                                BuffTeam(zenas);
                            });
                            arenamembers.ToList().ForEach(o =>
                            {
                                o.Session.SendPacket(o.Session.Character.GenerateBsInfo(0, 2, s.Time, 2));
                                o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("RIVAL_ARENA_TEAM_FOUND"), 10));

                                Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time =>
                                {
                                    o.Session.SendPacket("ta_close");
                                    Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(time2 =>
                                    {
                                        o.Session.Character.Mates.Where(m => m.IsTeamMember).ToList().ForEach(m => m.IsTeamMember = false);
                                        o.Session.Character.GeneralLogs.Add(new GeneralLogDTO
                                        {
                                            AccountId   = o.Session.Account.AccountId,
                                            CharacterId = o.Session.Character.CharacterId,
                                            IpAddress   = o.Session.IpAddress,
                                            LogData     = "Entry",
                                            LogType     = "TalentArena",
                                            Timestamp   = DateTime.Now
                                        });
                                        List <BuffType> bufftodisable = new List <BuffType> {
                                            BuffType.Bad, BuffType.Good, BuffType.Neutral
                                        };
                                        o.Session.Character.DisableBuffs(bufftodisable);
                                        int i = Array.IndexOf(arenamembers, o) + 1;
                                        o.Session.Character.Hp = (int)o.Session.Character.HPLoad();
                                        o.Session.Character.Mp = (int)o.Session.Character.MPLoad();
                                        ServerManager.Instance.ChangeMapInstance(o.Session.Character.CharacterId, map.MapInstanceId, o.GroupId == member.GroupId ? 125 : 14,
                                                                                 (o.GroupId == member.GroupId ? 37 : 38) + i % 3 * 2);
                                        o.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA_TIME"), 0));
                                        o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA_TIME"), 10));
                                        o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA"), 10));
                                        o.Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SELECT_ORDER_ARENA"), 0));
                                        o.Session.SendPacket(o.Session.Character.GenerateTaM(0));
                                        o.Session.SendPacket("ta_sv 0");
                                        o.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch));
                                        o.Session.SendPacket(o.Session.Character.GenerateTaM(3));


                                        o.Session.SendPacket(o.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey(o.GroupId == s.GroupId ? "ZENAS" : "ERENIA"), 10));
                                        arenaTeam.Add(new ArenaTeamMember(o.Session, o.GroupId == s.GroupId ? ArenaTeamType.ZENAS : ArenaTeamType.ERENIA, null));
                                        o.Session.SendPacket(o.Session.Character.GenerateTaP(0, false));

                                        obs2 = Observable.Interval(TimeSpan.FromMilliseconds(100)).Subscribe(start3 =>
                                        {
                                            bool resettap = false;
                                            map.MapDesignObjects.ToList().ForEach(e =>
                                            {
                                                if (e.ItemInstance.Design >= 4433 && e.ItemInstance.Design <= 4435)
                                                {
                                                    Character chara = map.GetCharactersInRange(e.MapX, e.MapY, 0).FirstOrDefault();
                                                    if (chara != null)
                                                    {
                                                        resettap = true;
                                                        ArenaTeamMember teammember = arenaTeam.FirstOrDefault(at => at.Session == chara.Session);
                                                        if (teammember != null &&
                                                            !arenaTeam.Any(at => at.Order == (e.ItemInstance.ItemVNum - 4433) &&
                                                                           at.ArenaTeamType == (e.MapX == 120 ? ArenaTeamType.ERENIA : ArenaTeamType.ZENAS)))
                                                        {
                                                            if (teammember.Order != null)
                                                            {
                                                                MapDesignObject obj =
                                                                    map.MapDesignObjects.FirstOrDefault(mapobj => mapobj.ItemInstance.ItemVNum == e.ItemInstance.ItemVNum &&
                                                                                                        e.MapX == (teammember.ArenaTeamType == ArenaTeamType.ERENIA ? 120 : 19));
                                                                if (obj != null)
                                                                {
                                                                    obj.ItemInstance.Design = obj.ItemInstance.ItemVNum;
                                                                }
                                                            }
                                                            teammember.Order = (byte)(e.ItemInstance.ItemVNum - 4433);
                                                        }
                                                    }
                                                }
                                                else if (e.ItemInstance.Design == 4436)
                                                {
                                                    if (!map.GetCharactersInRange(e.MapX, e.MapY, 0).Any())
                                                    {
                                                        resettap = true;
                                                        ArenaTeamMember teammember = arenaTeam.FirstOrDefault(at =>
                                                                                                              at.Order == (e.ItemInstance.ItemVNum - 4433) && at.ArenaTeamType == (e.MapX == 120 ? ArenaTeamType.ERENIA : ArenaTeamType.ZENAS));
                                                        if (teammember != null)
                                                        {
                                                            teammember.Order = null;
                                                        }
                                                    }
                                                }
                                                if (!arenaTeam.Any(at => at.Order == (e.ItemInstance.ItemVNum - 4433) && at.ArenaTeamType == (e.MapX == 120 ? ArenaTeamType.ERENIA : ArenaTeamType.ZENAS)))
                                                {
                                                    if (e.ItemInstance.Design != 4436)
                                                    {
                                                        return;
                                                    }
                                                    e.ItemInstance.Design = e.ItemInstance.ItemVNum;
                                                    map.Broadcast(e.GenerateEffect(false));
                                                }
                                                else if (e.ItemInstance.Design != 4436)
                                                {
                                                    e.ItemInstance.Design = 4436;
                                                    map.Broadcast(e.GenerateEffect(false));
                                                }
                                            });

                                            if (resettap)
                                            {
                                                arenaTeam.ToList().ForEach(arenauser => { arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaP(2, false)); });
                                            }
                                        });

                                        Observable.Timer(TimeSpan.FromSeconds(map.InstanceBag.Clock.BasesSecondRemaining)).Subscribe(start =>
                                        {
                                            obs2.Dispose();
                                            arenaTeam.ToList().ForEach(arenauser =>
                                            {
                                                if (arenauser.Order == null)
                                                {
                                                    for (byte x = 0; x < 3; x++)
                                                    {
                                                        if (!arenaTeam.Any(at => at.ArenaTeamType == arenauser.ArenaTeamType && at.Order == x))
                                                        {
                                                            arenauser.Order = x;
                                                        }
                                                    }
                                                }
                                                arenauser.Session.SendPacket($"ta_pn {arenauser.Order + 1}");
                                                arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaP(2, true));
                                            });
                                            map.MapDesignObjects.ToList().ForEach(md => map.Broadcast(md.GenerateEffect(true)));
                                            map.MapDesignObjects.Clear();
                                        });
                                    });
                                });
                            });
                            Observable.Timer(TimeSpan.FromSeconds(map.InstanceBag.Clock.BasesSecondRemaining)).Subscribe(start =>
                            {
                                bool newround1   = true;
                                bool newround2   = true;
                                int count1       = 0;
                                int count2       = 0;
                                IDisposable obs7 = obs4;
                                obs4             = Observable.Interval(TimeSpan.FromMilliseconds(500)).Subscribe(start3 =>
                                {
                                    int ereniacount = arenaTeam.Count(at => at.Dead && at.ArenaTeamType == ArenaTeamType.ERENIA);
                                    int zenascount  = arenaTeam.Count(at => at.Dead && at.ArenaTeamType == ArenaTeamType.ZENAS);
                                    if (count1 != ereniacount || count2 != zenascount)
                                    {
                                        if (count1 != ereniacount)
                                        {
                                            newround1 = true;
                                        }
                                        if (count2 != zenascount)
                                        {
                                            newround2 = true;
                                        }
                                        count1 = ereniacount;
                                        count2 = zenascount;
                                    }

                                    ArenaTeamMember tm  = arenaTeam.OrderBy(tm3 => tm3.Order).FirstOrDefault(tm3 => tm3.ArenaTeamType == ArenaTeamType.ERENIA && !tm3.Dead);
                                    ArenaTeamMember tm2 = arenaTeam.OrderBy(tm3 => tm3.Order).FirstOrDefault(tm3 => tm3.ArenaTeamType == ArenaTeamType.ZENAS && !tm3.Dead);

                                    if (!newround1 && !newround2)
                                    {
                                        return;
                                    }
                                    map.InstanceBag.Clock.BasesSecondRemaining = 300;
                                    map.InstanceBag.Clock.DeciSecondRemaining  = 3000;
                                    arenaTeam.ToList().ForEach(friends =>
                                    {
                                        friends.Session.SendPacket(friends.Session.Character.GenerateTaM(2));
                                        friends.Session.SendPacket(friends.Session.Character.GenerateTaM(3));
                                    });
                                    map.Sessions.Except(arenaTeam.Select(ss => ss.Session)).ToList().ForEach(o =>
                                    {
                                        o.SendPacket(tm2?.Session.Character.GenerateTaM(2));
                                        o.SendPacket(tm2?.Session.Character.GenerateTaM(3));
                                    });

                                    obs6?.Dispose();
                                    obs6 = Observable.Timer(TimeSpan.FromSeconds(map.InstanceBag.Clock.BasesSecondRemaining)).Subscribe(start4 =>
                                    {
                                        if (tm2 != null && tm != null)
                                        {
                                            tm.Dead  = true;
                                            tm2.Dead = true;
                                            tm.Session.Character.PositionX  = 120;
                                            tm.Session.Character.PositionY  = 39;
                                            tm2.Session.Character.PositionX = 19;
                                            tm2.Session.Character.PositionY = 40;
                                            map.Broadcast(tm2.Session, tm.Session.Character.GenerateTp());
                                            map.Broadcast(tm2.Session, tm2.Session.Character.GenerateTp());
                                            tm.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch));
                                            tm2.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch));
                                            arenaTeam.Replace(friends => friends.ArenaTeamType == tm.ArenaTeamType).ToList().ForEach(friends =>
                                            {
                                                friends.Session.SendPacket(friends.Session.Character.GenerateTaFc(0));
                                            });
                                        }
                                        newround1 = true;
                                        newround2 = true;
                                        arenaTeam.ToList().ForEach(arenauser => { arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaP(2, true)); });
                                    });

                                    if (tm != null && tm2 != null)
                                    {
                                        map.IsPVP = false;
                                        arenaTeam.Replace(at => at.LastSummoned != null).ToList().ForEach(at =>
                                        {
                                            at.LastSummoned = null;
                                            at.Session.Character.PositionX = at.ArenaTeamType == ArenaTeamType.ERENIA ? (short)120 : (short)19;
                                            at.Session.Character.PositionY = at.ArenaTeamType == ArenaTeamType.ERENIA ? (short)39 : (short)40;
                                            at.Session.CurrentMapInstance.Broadcast(at.Session.Character.GenerateTp());
                                            at.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch));
                                        });
                                        if (newround1)
                                        {
                                            map.Broadcast(tm.Session.Character.GenerateTaFc(1));
                                            tm.Session.Character.PositionX = 87;
                                            tm.Session.Character.PositionY = 39;
                                            map.Broadcast(tm.Session, tm.Session.Character.GenerateTp());
                                        }

                                        if (newround2)
                                        {
                                            tm2.Session.Character.PositionX = 56;
                                            tm2.Session.Character.PositionY = 40;
                                            map.Broadcast(tm2.Session, tm2.Session.Character.GenerateTp());
                                        }

                                        arenaTeam.ToList().ForEach(friends =>
                                        {
                                            friends.Session.SendPacket(friends.ArenaTeamType == ArenaTeamType.ERENIA
                                                ? tm.Session.Character.GenerateTaFc(0)
                                                : tm2.Session.Character.GenerateTaFc(0));
                                        });

                                        map.Sessions.Except(arenaTeam.Select(ss => ss.Session)).ToList().ForEach(ss =>
                                        {
                                            ss.SendPacket(tm.Session.Character.GenerateTaFc(0));
                                            ss.SendPacket(tm2.Session.Character.GenerateTaFc(1));
                                        });

                                        tm.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Call));
                                        tm2.Session.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Call));

                                        map.Broadcast("ta_s");
                                        Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(start4 => { map.IsPVP = true; });
                                    }
                                    else
                                    {
                                        switch (tm)
                                        {
                                        case null when tm2 == null:
                                            map.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQUALITY"), 0));
                                            arenaTeam.ToList().ForEach(arenauser =>
                                            {
                                                arenauser.Session.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("EQUALITY"), 10));
                                                arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaF(3));
                                            });
                                            map.Sessions.Except(arenamembers.Select(x => x.Session)).ToList().ForEach(
                                                x =>
                                            {
                                                ArenaTeamMember arenauser = arenaTeam.FirstOrDefault(se => se.Session != null);
                                                if (arenauser == null)
                                                {
                                                    return;
                                                }
                                                x.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("EQUALITY"), 10));
                                                x.SendPacket(arenauser.Session.Character.GenerateTaF(0));
                                            }
                                                );
                                            break;

                                        case null:
                                            map.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("VICTORIOUS_ZENAS"), 0));

                                            arenaTeam.ToList().ForEach(arenauser =>
                                            {
                                                SendRewards(arenauser, arenauser.ArenaTeamType == ArenaTeamType.ZENAS);
                                            });
                                            map.Sessions.Except(arenamembers.Select(x => x.Session)).ToList().ForEach(x =>
                                            {
                                                ArenaTeamMember arenauser = arenaTeam.FirstOrDefault(se => se.Session != null);
                                                if (arenauser == null)
                                                {
                                                    return;
                                                }
                                                x.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ZENAS"), 10));
                                                x.SendPacket(arenauser.Session.Character.GenerateTaF(1));
                                            });
                                            break;

                                        default:
                                            map.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("VICTORIOUS_ERENIA"), 0));
                                            arenaTeam.ToList().ForEach(arenauser =>
                                            {
                                                SendRewards(arenauser, arenauser.ArenaTeamType == ArenaTeamType.ERENIA);
                                            });
                                            map.Sessions.Except(arenamembers.Select(x => x.Session)).ToList().ForEach(
                                                x =>
                                            {
                                                ArenaTeamMember arenauser = arenaTeam.FirstOrDefault(se => se.Session != null);
                                                if (arenauser == null)
                                                {
                                                    return;
                                                }
                                                x.SendPacket(arenauser.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("VICTORIOUS_ERENIA"), 10));
                                                x.SendPacket(arenauser.Session.Character.GenerateTaF(2));
                                            }
                                                );
                                            break;
                                        }
                                        obs3.Dispose();
                                        obs2.Dispose();
                                        obs7?.Dispose();
                                        obs5.Dispose();
                                        Observable.Timer(TimeSpan.FromSeconds(30)).Subscribe(start4 =>
                                        {
                                            map.Dispose();
                                            arenaTeam.ToList().ForEach(o =>
                                            {
                                                if (o.Session?.CurrentMapInstance?.MapInstanceType == MapInstanceType.TalentArenaMapInstance)
                                                {
                                                    ServerManager.Instance.TeleportOnRandomPlaceInMap(o.Session, ServerManager.Instance.ArenaInstance.MapInstanceId);
                                                }
                                            });
                                        });
                                    }
                                    newround1 = false;
                                    newround2 = false;
                                });
                            });
                            ServerManager.Instance.ArenaMembers.Where(o => o.GroupId == member.GroupId || o.GroupId == s.GroupId).ToList()
                            .ForEach(se => { se.Session.SendPacket(se.Session.Character.GenerateBsInfo(2, 2, 0, 0)); });

                            ServerManager.Instance.ArenaMembers.RemoveAll(o => o.GroupId == member.GroupId || o.GroupId == s.GroupId);
                        }
                    }
                    else
                    {
                        if (s.GroupId == null)
                        {
                            if (s.Time != -1)
                            {
                                s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, s.Time, 7));
                                s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NO_TEAM_ARENA"), 10));
                            }
                            s.Time = 300;
                            s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, s.Time, 5));
                            s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_ARENA_TEAM"), 10));
                        }
                        else if (ServerManager.Instance.ArenaMembers.Count(g => g.GroupId == s.GroupId) < 3)
                        {
                            s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, -1, 4));
                            Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time =>
                            {
                                s.Time = 300;
                                s.Session.SendPacket(s.Session.Character.GenerateBsInfo(1, 2, s.Time, 8));
                                s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("RETRY_SEARCH_ARENA_TEAM"), 10));
                            });
                        }
                        else
                        {
                            s.Session.SendPacket(s.Session.Character.GenerateBsInfo(0, 2, -1, 3));
                            Observable.Timer(TimeSpan.FromSeconds(1)).Subscribe(time =>
                            {
                                s.Time = 300;
                                s.Session.SendPacket(s.Session.Character.GenerateBsInfo(0, 2, s.Time, 1));
                                s.Session.SendPacket(s.Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("SEARCH_RIVAL_ARENA_TEAM"), 10));
                            });
                        }
                    }
                });
                seconds++;
            });

            Observable.Timer(TimeSpan.FromHours(7)).Subscribe(start2 =>
            {
                ServerManager.Instance.StartedEvents.Remove(EventType.TALENTARENA);
                obs.Dispose();
            });
        }
Beispiel #5
0
        public void Call(TaCallPacket packet)
        {
            ConcurrentBag <ArenaTeamMember> arenateam = ServerManager.Instance.ArenaTeams.FirstOrDefault(s => s.Any(o => o.Session == Session));

            if (arenateam == null || Session.CurrentMapInstance.MapInstanceType != MapInstanceType.TalentArenaMapInstance)
            {
                return;
            }
            IEnumerable <ArenaTeamMember> ownteam = arenateam.Where(s => s.ArenaTeamType == arenateam?.FirstOrDefault(e => e.Session == Session)?.ArenaTeamType);
            ClientSession   client = ownteam.Where(s => s.Session != Session).OrderBy(s => s.Order).Skip(packet.CalledIndex).FirstOrDefault()?.Session;
            ArenaTeamMember memb   = arenateam.FirstOrDefault(s => s.Session == client);

            if (client == null || client.CurrentMapInstance != Session.CurrentMapInstance || memb == null || memb.LastSummoned != null || ownteam.Sum(s => s.SummonCount) >= 5)
            {
                return;
            }
            memb.SummonCount++;
            arenateam.ToList().ForEach(arenauser => { arenauser.Session.SendPacket(arenauser.Session.Character.GenerateTaP(2, true)); });
            ArenaTeamMember arenaTeamMember = arenateam.FirstOrDefault(s => s.Session == client);

            if (arenaTeamMember != null)
            {
                arenaTeamMember.LastSummoned = DateTime.Now;
            }
            Session.CurrentMapInstance.Broadcast(Session.Character.GenerateEff(4432));
            for (int i = 0; i < 3; i++)
            {
                Observable.Timer(TimeSpan.FromSeconds(i)).Subscribe(o =>
                {
                    client.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("ARENA_CALLED"), 3 - i), 0));
                    client.SendPacket(client.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("ARENA_CALLED"), 3 - i), 10));
                });
            }
            short      x     = Session.Character.PositionX;
            short      y     = Session.Character.PositionY;
            const byte timer = 30;

            Observable.Timer(TimeSpan.FromSeconds(3)).Subscribe(o =>
            {
                Session.CurrentMapInstance.Broadcast($"ta_t 0 {client.Character.CharacterId} {timer}");
                client.Character.PositionX = x;
                client.Character.PositionY = y;
                Session.CurrentMapInstance.Broadcast(client.Character.GenerateTp());

                client.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Nothing));
            });

            Observable.Timer(TimeSpan.FromSeconds(timer + 3)).Subscribe(o =>
            {
                DateTime?lastsummoned = arenateam.FirstOrDefault(s => s.Session == client)?.LastSummoned;
                if (lastsummoned == null || ((DateTime)lastsummoned).AddSeconds(timer) >= DateTime.Now)
                {
                    return;
                }
                ArenaTeamMember firstOrDefault = arenateam.FirstOrDefault(s => s.Session == client);
                if (firstOrDefault != null)
                {
                    firstOrDefault.LastSummoned = null;
                }
                client.Character.PositionX = memb.ArenaTeamType == ArenaTeamType.ERENIA ? (short)120 : (short)19;
                client.Character.PositionY = memb.ArenaTeamType == ArenaTeamType.ERENIA ? (short)39 : (short)40;
                Session?.CurrentMapInstance.Broadcast(client.Character.GenerateTp());
                client.SendPacket(UserInterfaceHelper.Instance.GenerateTaSt(TalentArenaOptionType.Watch));
            });
        }
Beispiel #6
0
        public static void NRun(ClientSession session, NRunPacket packet)
        {
            if (!session.HasCurrentMapInstance)
            {
                return;
            }

            MapNpc        npc = session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == packet.NpcId);
            TeleporterDTO tp;
            var           rand = new Random();

            switch (packet.Runner)
            {
            case 1:
                if (session.Character.Class != (byte)ClassType.Adventurer)
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(
                            Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0));
                    return;
                }

                if (session.Character.Level < 15 || session.Character.JobLevel < 20)
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TOO_LOW_LVL"),
                                                                 0));
                    return;
                }

                if (packet.Type == (byte)session.Character.Class ||
                    packet.Type > 3 && session.Account.Authority < AuthorityType.GameMaster || packet.Type < 0)
                {
                    return;
                }

                if (session.Character.Inventory.All(i => i.Value.Type != InventoryType.Wear))
                {
                    session.Character.Inventory.AddNewToInventory((short)(4 + packet.Type * 14),
                                                                  type: InventoryType.Wear);
                    session.Character.Inventory.AddNewToInventory((short)(81 + packet.Type * 13),
                                                                  type: InventoryType.Wear);
                    switch (packet.Type)
                    {
                    case 1:
                        session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear);
                        session.Character.Inventory.AddNewToInventory(2082, 10);
                        break;

                    case 2:
                        session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear);
                        session.Character.Inventory.AddNewToInventory(2083, 10);
                        break;

                    case 3:
                        session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear);
                        break;
                    }

                    foreach (ItemInstance item in session.Character.Inventory.Values.Where(i =>
                                                                                           i.Type == InventoryType.Wear && i.Item.EquipmentSlot != EquipmentType.Sp))
                    {
                        switch (item.Slot)
                        {
                        case (byte)EquipmentType.MainWeapon:
                            session.Character.Inventory.PrimaryWeapon = (WearableInstance)item;
                            break;

                        case (byte)EquipmentType.SecondaryWeapon:
                            session.Character.Inventory.SecondaryWeapon = (WearableInstance)item;
                            break;

                        case (byte)EquipmentType.Armor:
                            session.Character.Inventory.Armor = (WearableInstance)item;
                            break;
                        }
                    }

                    session.CurrentMapInstance?.Broadcast(session.Character.GenerateEq());
                    session.SendPacket(session.Character.GenerateEquipment());
                    session.Character.ChangeClass((ClassType)packet.Type);
                }
                else
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(
                            Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0));
                }

                break;

            case 2:
                session.SendPacket("wopen 1 0");
                break;

            case 4:
                Mate mate = session.Character.Mates.FirstOrDefault(s => s.MateTransportId == packet.NpcId);
                switch (packet.Type)
                {
                case 2:
                    if (mate != null)
                    {
                        if (session.Character.Level >= mate.Level)
                        {
                            Mate teammate = session.Character.Mates.Where(s => s.IsTeamMember)
                                            .FirstOrDefault(s => s.MateType == mate.MateType);
                            if (teammate != null)
                            {
                                teammate.RemoveTeamMember();
                            }

                            mate.AddTeamMember();
                        }
                        else
                        {
                            session.SendPacket(
                                UserInterfaceHelper.Instance.GenerateMsg(
                                    Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0));
                        }
                    }

                    break;

                case 3:
                    if (mate != null && session.Character.Miniland == session.Character.MapInstance)
                    {
                        mate.RemoveTeamMember();
                    }

                    break;

                case 4:
                    if (mate != null)
                    {
                        if (session.Character.Miniland == session.Character.MapInstance)
                        {
                            mate.RemoveTeamMember();
                        }
                        else
                        {
                            session.SendPacket(
                                $"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}");
                        }
                    }

                    break;

                case 5:
                    if (mate != null)
                    {
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10,
                                                                                      $"#n_run^4^6^3^{mate.MateTransportId}"));
                    }

                    break;

                case 6:
                    if (mate != null)
                    {
                        if (session.Character.Miniland != session.Character.MapInstance)
                        {
                            mate.RemoveTeamMember();
                            session.CurrentMapInstance.Broadcast(mate.GenerateOut());
                            session.SendPacket(session.Character.GenerateSay(
                                                   string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name),
                                                   11));
                            session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                                   string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name),
                                                   0));
                        }
                    }

                    break;

                case 7:
                    if (mate != null)
                    {
                        if (session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember))
                        {
                            session.SendPacket(session.Character.GenerateSay(
                                                   Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11));
                            session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                                   Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0));
                        }
                        else
                        {
                            MateHelper.Instance.RemovePetBuffs(session);
                            session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10,
                                                                                          $"#n_run^4^9^3^{mate.MateTransportId}"));
                        }
                    }

                    break;

                case 9:
                    if (mate != null)
                    {
                        if (session.Character.Level >= mate.Level)
                        {
                            mate.PositionX = (short)(session.Character.PositionX + 1);
                        }

                        mate.PositionY = (short)(session.Character.PositionY + 1);
                        mate.AddTeamMember();
                        session.CurrentMapInstance.Broadcast(mate.GenerateIn());
                    }
                    else
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateMsg(
                                Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0));
                    }

                    break;
                }

                session.SendPacket(session.Character.GeneratePinit());
                session.SendPackets(session.Character.Mates.Where(s => s.IsTeamMember)
                                    .OrderBy(s => s.MateType)
                                    .Select(s => s.GeneratePst()));
                break;

            case 10:
                session.SendPacket("wopen 3 0");
                break;

            case 12:
                session.SendPacket($"wopen {packet.Type} 0");
                break;

            case 14:
                session.SendPacket("wopen 27 0");
                string recipelist = "m_list 2";
                if (npc != null)
                {
                    List <Recipe> tps = npc.Recipes;
                    recipelist = tps.Where(s => s.Amount > 0)
                                 .Aggregate(recipelist, (current, s) => current + $" {s.ItemVNum}");
                    recipelist += " -100";
                    session.SendPacket(recipelist);
                }

                break;

            case 15:
                if (npc != null)
                {
                    if (packet.Value == 2)
                    {
                        session.SendPacket(
                            $"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}");
                    }
                    else
                    {
                        switch (npc.MapId)
                        {
                        case 1:
                            session.Character.SetRespawnPoint(1, 79, 116);
                            break;

                        case 20:
                            session.Character.SetRespawnPoint(20, 9, 92);
                            break;

                        case 145:
                            session.Character.SetRespawnPoint(145, 13, 110);
                            break;

                        case (short)SpecialMapIdType.Lobby:
                            session.Character.SetRespawnPoint((short)SpecialMapIdType.Lobby, 145, 91);
                            break;
                        }

                        session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                               Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0));
                    }
                }

                break;

            case 16:
                tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type);
                if (tp != null)
                {
                    if (session.Character.Gold >= 1000 * packet.Type)
                    {
                        session.Character.Gold -= 1000 * packet.Type;
                        session.SendPacket(session.Character.GenerateGold());
                        ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY);
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"),
                                                          10));
                    }
                }

                break;

            case 17:
                double currentRunningSeconds =
                    (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds;
                double timeSpanSinceLastPortal = currentRunningSeconds - session.Character.LastPortal;
                if (packet.Type < 0)
                {
                    // Packet hacking allowing duplication
                    return;
                }

                if (!(timeSpanSinceLastPortal >= 4) || !session.HasCurrentMapInstance ||
                    session.CurrentMapInstance.MapInstanceType == MapInstanceType.Act4Instance)
                {
                    session.SendPacket(
                        session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10));
                    return;
                }

                if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                {
                    session.SendPacket(
                        session.Character.GenerateSay(
                            Language.Instance.GetMessageFromKey("CANT_JOIN_ARENA_IN_RAID"), 10));
                    return;
                }

                if (session.Character.Gold >= 500 * (1 + packet.Type))
                {
                    session.Character.LastPortal = currentRunningSeconds;
                    session.Character.Gold      -= 500 * (1 + packet.Type);
                    session.SendPacket(session.Character.GenerateGold());
                    ServerManager.Instance.TeleportOnRandomPlaceInMap(session,
                                                                      packet.Type == 0
                                ? ServerManager.Instance.ArenaInstance.MapInstanceId
                                : ServerManager.Instance.FamilyArenaInstance.MapInstanceId);
                }
                else
                {
                    session.SendPacket(
                        session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10));
                }

                break;

            case 18:
                session.SendPacket(session.Character.GenerateNpcDialog(17));
                break;

            case 26:
                tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type);
                if (tp != null)
                {
                    if (session.Character.Gold >= 5000 * packet.Type && packet.Type > 0)
                    {
                        session.Character.Gold -= 5000 * packet.Type;
                        ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY);
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"),
                                                          10));
                    }
                }

                break;

            case 45:
                tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type);
                if (tp != null)
                {
                    if (session.Character.Gold >= 500)
                    {
                        session.Character.Gold -= 500;
                        session.SendPacket(session.Character.GenerateGold());
                        ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY);
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"),
                                                          10));
                    }
                }

                break;

            case 61:
                if (session.Character.Inventory.CountItem(5917) <= 0 ||
                    session.Character.Inventory.CountItem(5918) <= 0 || npc == null)
                {
                    return;
                }

                session.Character.GiftAdd(5922, 1);
                session.Character.Inventory.RemoveItemAmount(5917);
                session.Character.Inventory.RemoveItemAmount(5918);
                break;

            case 62:
                if (npc == null || session.Character.Inventory.CountItem(5919) <= 0)
                {
                    return;
                }

                ServerManager.Instance.ChangeMap(session.Character.CharacterId, 2536, 26, 31);
                session.Character.Inventory.RemoveItemAmount(5919);
                break;

            case 65:
                if (npc == null)
                {
                    return;
                }

                session.Character.AddQuest(5514);
                break;

            case 66:
                if (npc == null)
                {
                    return;
                }

                session.Character.AddQuest(5914);
                break;

            case 67:
                if (npc == null)
                {
                    return;
                }

                session.Character.AddQuest(5908);
                break;

            case 68:
                if (npc == null)
                {
                    return;
                }

                session.Character.AddQuest(5919);
                break;

            case 132:
                tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type);
                if (tp != null)
                {
                    ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY);
                }

                break;

            case 137:
                session.SendPacket("taw_open");
                break;

            case 138:
                ConcurrentBag <ArenaTeamMember> at = ServerManager.Instance.ArenaTeams.OrderBy(s => rand.Next())
                                                     .FirstOrDefault();
                if (at != null)
                {
                    ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId,
                                                             at.FirstOrDefault(s => s.Session != null).Session.CurrentMapInstance.MapInstanceId, 69,
                                                             100);

                    ArenaTeamMember zenas = at.OrderBy(s => s.Order).FirstOrDefault(s =>
                                                                                    s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ZENAS);
                    ArenaTeamMember erenia = at.OrderBy(s => s.Order).FirstOrDefault(s =>
                                                                                     s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ERENIA);
                    session.SendPacket(erenia.Session.Character.GenerateTaM(0));
                    session.SendPacket(erenia.Session.Character.GenerateTaM(3));
                    session.SendPacket("taw_sv 0");
                    session.SendPacket(zenas.Session.Character.GenerateTaP(0, true));
                    session.SendPacket(erenia.Session.Character.GenerateTaP(2, true));
                    session.SendPacket(zenas.Session.Character.GenerateTaFc(0));
                    session.SendPacket(erenia.Session.Character.GenerateTaFc(1));
                }
                else
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateInfo(
                            Language.Instance.GetMessageFromKey("NO_TALENT_ARENA")));
                }

                break;

            case 135:
                if (!ServerManager.Instance.StartedEvents.Contains(EventType.TALENTARENA))
                {
                    session.SendPacket(npc?.GenerateSay(Language.Instance.GetMessageFromKey("ARENA_NOT_OPEN"), 10));
                }
                else
                {
                    int tickets = 5 - session.Character.GeneralLogs.Count(s =>
                                                                          s.LogType == "TalentArena" && s.Timestamp.Date == DateTime.Today);
                    if (ServerManager.Instance.ArenaMembers.All(s => s.Session != session) && tickets > 0)
                    {
                        if (ServerManager.Instance.IsCharacterMemberOfGroup(session.Character.CharacterId))
                        {
                            session.SendPacket(
                                UserInterfaceHelper.Instance.GenerateMsg(
                                    Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 0));
                            session.SendPacket(
                                session.Character.GenerateSay(
                                    Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 10));
                        }
                        else
                        {
                            session.SendPacket(session.Character.GenerateSay(
                                                   string.Format(Language.Instance.GetMessageFromKey("ARENA_TICKET_LEFT"), tickets),
                                                   10));
                            ServerManager.Instance.ArenaMembers.Add(new ArenaMember
                            {
                                ArenaType = EventType.TALENTARENA,
                                Session   = session,
                                GroupId   = null,
                                Time      = 0
                            });
                        }
                    }
                    else
                    {
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                               Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 0));
                        session.SendPacket(session.Character.GenerateSay(
                                               Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 10));
                    }
                }

                break;

            case 150:
                if (npc == null || !npc.EffectActivated && ServerManager.Instance.LodTimes ||
                    session.Character.Level < ServerManager.Instance.MinLodLevel)
                {
                    return;
                }

                if (session.Character?.Family == null)
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"),
                                                                 0));
                    break;
                }

                if (session.Character?.Family?.LandOfDeath != null)
                {
                    ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId,
                                                             session.Character.Family.LandOfDeath.MapInstanceId, 153, 145);
                }

                break;

            case 300:
                if (npc == null)
                {
                    return;
                }

                session.Character.AddQuest(6040);
                break;

            case 301:
                tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type);
                if (tp != null)
                {
                    ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY);
                }

                break;

            case 1600:
                session.SendPacket(session.Character.OpenFamilyWarehouse());
                break;

            case 1601:
                session.SendPackets(session.Character.OpenFamilyWarehouseHist());
                break;

            case 1602:
                if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 3 &&
                    session.Character.Family.WarehouseSize < 21)
                {
                    if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head)
                    {
                        if (500000 >= session.Character.Gold)
                        {
                            session.SendPacket(
                                session.Character.GenerateSay(
                                    Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10));
                            return;
                        }

                        session.Character.Family.WarehouseSize = 21;
                        session.Character.Gold -= 500000;
                        session.SendPacket(session.Character.GenerateGold());
                        FamilyDTO fam = session.Character.Family;
                        DaoFactory.FamilyDao.InsertOrUpdate(ref fam);
                        ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId);
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"),
                                                          10));
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateModal(
                                Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1));
                    }
                }

                break;

            case 1603:
                if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 7 &&
                    session.Character.Family.WarehouseSize < 49)
                {
                    if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head)
                    {
                        if (2000000 >= session.Character.Gold)
                        {
                            session.SendPacket(
                                session.Character.GenerateSay(
                                    Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10));
                            return;
                        }

                        session.Character.Family.WarehouseSize = 49;
                        session.Character.Gold -= 2000000;
                        session.SendPacket(session.Character.GenerateGold());
                        FamilyDTO fam = session.Character.Family;
                        DaoFactory.FamilyDao.InsertOrUpdate(ref fam);
                        ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId);
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"),
                                                          10));
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateModal(
                                Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1));
                    }
                }

                break;

            case 1604:
                if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 5 &&
                    session.Character.Family.MaxSize < 70)
                {
                    if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head)
                    {
                        if (5000000 >= session.Character.Gold)
                        {
                            session.SendPacket(
                                session.Character.GenerateSay(
                                    Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10));
                            return;
                        }

                        session.Character.Family.MaxSize = 70;
                        session.Character.Gold          -= 5000000;
                        session.SendPacket(session.Character.GenerateGold());
                        FamilyDTO fam = session.Character.Family;
                        DaoFactory.FamilyDao.InsertOrUpdate(ref fam);
                        ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId);
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"),
                                                          10));
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateModal(
                                Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1));
                    }
                }

                break;

            case 1605:
                if (session.Character.Family != null && session.Character.Family.FamilyLevel >= 9 &&
                    session.Character.Family.MaxSize < 100)
                {
                    if (session.Character.FamilyCharacter.Authority == FamilyAuthority.Head)
                    {
                        if (10000000 >= session.Character.Gold)
                        {
                            session.SendPacket(
                                session.Character.GenerateSay(
                                    Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10));
                            return;
                        }

                        session.Character.Family.MaxSize = 100;
                        session.Character.Gold          -= 10000000;
                        session.SendPacket(session.Character.GenerateGold());
                        FamilyDTO fam = session.Character.Family;
                        DaoFactory.FamilyDao.InsertOrUpdate(ref fam);
                        ServerManager.Instance.FamilyRefresh(session.Character.Family.FamilyId);
                    }
                    else
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"),
                                                          10));
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateModal(
                                Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1));
                    }
                }

                break;

            case 23:
                if (packet.Type == 0)
                {
                    if (session.Character.Group != null && session.Character.Group.CharacterCount == 3)
                    {
                        if (session.Character.Group.Characters.Any(s => s.Character.Family != null))
                        {
                            session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(
                                                   Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY")));
                            return;
                        }
                    }

                    if (session.Character.Group == null || session.Character.Group.CharacterCount != 3)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateInfo(
                                Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL")));
                        return;
                    }

                    session.SendPacket(UserInterfaceHelper.Instance.GenerateInbox(
                                           $"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}"));
                }
                else
                {
                    if (session.Character.Family == null)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateInfo(
                                Language.Instance.GetMessageFromKey("NOT_IN_FAMILY")));
                        return;
                    }

                    if (session.Character.Family != null && session.Character.FamilyCharacter != null &&
                        session.Character.FamilyCharacter.Authority != FamilyAuthority.Head)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateInfo(
                                Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD")));
                        return;
                    }

                    session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}");
                }

                break;

            case 60:
                StaticBonusDTO medal = session.Character.StaticBonusList.FirstOrDefault(s =>
                                                                                        s.StaticBonusType == StaticBonusType.BazaarMedalGold ||
                                                                                        s.StaticBonusType == StaticBonusType.BazaarMedalSilver);
                byte Medal = 0;
                int  Time  = 0;
                if (medal != null)
                {
                    Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold
                            ? (byte)MedalType.Gold
                            : (byte)MedalType.Silver;
                    Time = (int)(medal.DateEnd - DateTime.Now).TotalHours;
                }

                session.SendPacket($"wopen 32 {Medal} {Time}");
                break;

            case 3000:
                if (npc != null)
                {
                }

                break;

            case 3006:
                if (npc != null)
                {
                    session.Character.AddQuest(packet.Type);
                }

                break;

            case 5001:
                if (npc != null)
                {
                    MapInstance ship = session.Character.Faction == FactionType.Angel
                            ? ServerManager.Instance.Act4ShipAngel
                            : ServerManager.Instance.Act4ShipDemon;
                    switch (session.Character.Faction)
                    {
                    case FactionType.Neutral:
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo("NEED_FACTION_ACT4"));
                        return;
                    }

                    if (3000 > session.Character.Gold)
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"),
                                                          10));
                        return;
                    }

                    ServerManager.Instance.ChangeMapInstance(session.Character.CharacterId, ship.MapInstanceId,
                                                             ServerManager.Instance.RandomNumber(15, 25), ServerManager.Instance.RandomNumber(28, 33));
                }

                break;

            case 5002:
                if (npc != null)
                {
                    tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type);
                    if (tp != null)
                    {
                        session.SendPacket("it 3");
                        SerializableWorldServer connection =
                            CommunicationServiceClient.Instance.GetPreviousChannelByAccountId(session.Account
                                                                                              .AccountId);
                        if (connection == null || session.Character == null)
                        {
                            break;
                        }

                        session.Character.MapId = tp.MapId;
                        session.Character.MapX  = tp.MapX;
                        session.Character.MapY  = tp.MapY;
                        session.Character.ChangeChannel(connection.EndPointIp, connection.EndPointPort, 3);
                    }
                }

                break;

            case 5004:
                if (npc == null)
                {
                    return;
                }

                ServerManager.Instance.ChangeMap(session.Character.CharacterId, 145, 52, 41);
                break;

            case 5011:
                if (npc != null)
                {
                    ServerManager.Instance.ChangeMap(session.Character.CharacterId, 170, 127, 46);
                }

                break;

            case 5012:
                tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type);
                if (tp != null)
                {
                    ServerManager.Instance.ChangeMap(session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY);
                }

                break;

            default:
                Logger.Log.Warn(
                    string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner));
                break;
            }
        }