コード例 #1
0
        public static void GenerateRaid(FactionType raidType)
        {
            RaidInstance =
                ServerManager.Instance.Act6Raids.FirstOrDefault(s => s.Id == (raidType == FactionType.Angel ? 23 : 24));

            if (RaidInstance == null)
            {
                Logger.Log.Info(Language.Instance.GetMessageFromKey("CANT_CREATE_RAIDS"));
                return;
            }

            EntryMap = ServerManager.GetMapInstance(
                ServerManager.GetBaseMapInstanceIdByMapId(RaidInstance.MapId));

            if (EntryMap == null)
            {
                Logger.Log.Info(Language.Instance.GetMessageFromKey("MAP_MISSING"));
                return;
            }

            EntryMap.CreatePortal(new Portal
            {
                Type        = (byte)PortalType.Raid,
                SourceMapId = RaidInstance.MapId,
                SourceX     = RaidInstance.PositionX,
                SourceY     = RaidInstance.PositionY
            }, 3600, true);
        }
コード例 #2
0
        public static void GenerateRaid(FactionType raidType)
        {
            RaidInstance = null;
            if (ServerManager.Instance.Act6Raids.Count > 0)
            {
                switch (raidType)
                {
                case FactionType.Angel:
                    foreach (ScriptedInstance instance in ServerManager.Instance.Act6Raids)
                    {
                        if (instance.Id == 23)
                        {
                            RaidInstance = instance;
                            break;
                        }
                    }
                    break;

                case FactionType.Demon:
                    foreach (ScriptedInstance instance in ServerManager.Instance.Act6Raids)
                    {
                        if (instance.Id == 24)
                        {
                            RaidInstance = instance;
                            break;
                        }
                    }
                    break;
                }
            }

            if (RaidInstance == null)
            {
                Logger.Log.Info(Language.Instance.GetMessageFromKey("CANT_CREATE_RAIDS"));
                return;
            }

            EntryMap = ServerManager.GetMapInstance(
                ServerManager.GetBaseMapInstanceIdByMapId(RaidInstance.MapId));

            if (EntryMap == null)
            {
                Logger.Log.Info(Language.Instance.GetMessageFromKey("MAP_MISSING"));
                return;
            }

            EntryMap.CreatePortalTemp(new Portal
            {
                Type        = (byte)PortalType.Raid,
                SourceMapId = RaidInstance.MapId,
                SourceX     = RaidInstance.PositionX,
                SourceY     = RaidInstance.PositionY
            }, 3600, true);
        }
コード例 #3
0
 public static bool ToScriptedInstanceDTO(ScriptedInstance input, ScriptedInstanceDTO output)
 {
     if (input == null)
     {
         return(false);
     }
     output.MapId              = input.MapId;
     output.PositionX          = input.PositionX;
     output.PositionY          = input.PositionY;
     output.Script             = input.Script;
     output.ScriptedInstanceId = input.ScriptedInstanceId;
     output.Type = input.Type;
     return(true);
 }
コード例 #4
0
        /// <summary>
        /// RSelPacket packet
        /// </summary>
        /// <param name="packet"></param>
        public void GetGift(RSelPacket packet)
        {
            if (Session.CurrentMapInstance.MapInstanceType != MapInstanceType.TimeSpaceInstance)
            {
                return;
            }
            Guid             mapInstanceId = ServerManager.Instance.GetBaseMapInstanceIdByMapId(Session.Character.MapId);
            MapInstance      map           = ServerManager.Instance.GetMapInstance(mapInstanceId);
            ScriptedInstance si            = map.ScriptedInstances.FirstOrDefault(s => s.PositionX == Session.Character.MapX && s.PositionY == Session.Character.MapY);

            if (si == null || map.InstanceBag.EndState != 5)
            {
                return;
            }
            Session.Character.GetReput(si.Reputation);

            Session.Character.Gold = Session.Character.Gold + si.Gold > ServerManager.Instance.MaxGold ? ServerManager.Instance.MaxGold : Session.Character.Gold + si.Gold;
            Session.SendPacket(Session.Character.GenerateGold());
            Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("GOLD_TS_END"), si.Gold), 10));

            int    rand  = new Random().Next(si.DrawItems.Count);
            string repay = "repay ";

            Session.Character.GiftAdd(si.DrawItems[rand].VNum, si.DrawItems[rand].Amount);

            for (int i = 0; i < 3; i++)
            {
                Gift gift = si.GiftItems.ElementAtOrDefault(i);
                repay += gift == null ? "-1.0.0 " : $"{gift.VNum}.0.{gift.Amount} ";
                if (gift != null)
                {
                    Session.Character.GiftAdd(gift.VNum, gift.Amount);
                }
            }

            // TODO: Add HasAlreadyDone
            for (int i = 0; i < 2; i++)
            {
                Gift gift = si.SpecialItems.ElementAtOrDefault(i);
                repay += gift == null ? "-1.0.0 " : $"{gift.VNum}.0.{gift.Amount} ";
                if (gift != null)
                {
                    Session.Character.GiftAdd(gift.VNum, gift.Amount);
                }
            }

            repay += $"{si.DrawItems[rand].VNum}.0.{si.DrawItems[rand].Amount}";
            Session.SendPacket(repay);
            map.InstanceBag.EndState = 6;
        }
コード例 #5
0
        public async void GenerateRaid(byte type, byte faction)
        {
            ScriptedInstance raid  = ServerManager.Instance.Act4Raids.FirstOrDefault(r => r.Id == type);
            MapInstance      lobby = ServerManager.Instance.Act4Maps.FirstOrDefault(m => m.Map.MapId == 134);

            if (raid == null || lobby == null)
            {
                Logger.Log.Error(raid == null ? $"Act4 raids is missing - type : {type}" : "There is no map in Act4Maps with MapId == 134");
                return;
            }

            ServerManager.Instance.Act4RaidStart = DateTime.Now;
            lobby.CreatePortal(new Portal()
            {
                SourceMapId = 134,
                SourceX     = 139,
                SourceY     = 100,
                Type        = (short)(9 + faction)
            }, 3600, true);

            foreach (MapInstance map in ServerManager.Instance.Act4Maps)
            {
                map.Sessions.Where(s => s?.Character?.Faction == (FactionType)faction).ToList().ForEach(s =>
                                                                                                        s.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("ACT4_RAID_OPEN"), ((Act4RaidType)type).ToString()), 0)));
            }

            lock (ServerManager.Instance.FamilyList)
            {
                foreach (Family family in ServerManager.Instance.FamilyList.Where(f => f != null))
                {
                    family.Act4Raid = ServerManager.Instance.Act4Raids.FirstOrDefault(r => r.Id == type)?.GetClone();
                    family.Act4Raid?.LoadScript(MapInstanceType.RaidInstance);
                    if (family.Act4Raid?.FirstMap == null)
                    {
                        continue;
                    }
                    family.Act4Raid.FirstMap.InstanceBag.Lock = true;
                }
            }

            await Task.Delay(60 * 60 * 1000);

            foreach (Family family in ServerManager.Instance.FamilyList.Where(f => f?.Act4Raid != null))
            {
                family.Act4Raid.MapInstanceDictionary?.Values.ToList().ForEach(m => m?.Dispose());
                family.Act4Raid = null;
            }
        }
コード例 #6
0
    public void LoadScript(string ScriptName)
    {
        try
        {
            ScriptedInstance.RegisterTypesRuntime();
            this._Script = new Script();
            _FileName    = ScriptName;

            string LuaData = ContentLoader.Instance.GetScript(ScriptName);


            //= File.ReadAllText(PathBuilder.GetScriptsFile(_FileName));



            this._Script.DoString(LuaData);
            Table  BaseTable = _Script.Call(_Script.Globals ["ListFileDepedencies"]).Table;
            string FileData  = "";
            foreach (DynValue value in BaseTable.Values)
            {
                FileData = EngineInstance.Instance._ContentLoader.GetScript(value.String);
                this._Script.DoString(FileData);
            }

            this._Script.Globals ["Debug"]  = (Action <string>)ScriptAPI.IDebug;
            this._Script.Globals["KeyCode"] = UserData.CreateStatic <KeyCode>();

            this._Script.Globals["Color"]   = (Func <float, float, float, float, Color>)ScriptAPI.CreateColor;
            this._Script.Globals["Vector3"] = (Func <float, float, float, Vector3>)ScriptAPI.CreateVector3;


            this._Script.Globals["SaveNode"] = UserData.CreateStatic <SaveNode>();

            this._Script.Globals["Framework"] = UserData.CreateStatic <ScriptAPI>();

            if (this._Script == null)
            {
                Debug.LogError("MY SCRIPT IS NULL ????????????????");
            }
        }
        catch (SyntaxErrorException ex)
        {
            Debug.LogError("Error trying to loading script [" + ScriptName + "] ! " + ex.DecoratedMessage);
        }
    }
コード例 #7
0
        public static bool ToScriptedInstance(ScriptedInstanceDTO input, ScriptedInstance output)
        {
            if (input == null)
            {
                return(false);
            }

            output.MapId              = input.MapId;
            output.PositionX          = input.PositionX;
            output.PositionY          = input.PositionY;
            output.Script             = input.Script;
            output.ScriptedInstanceId = input.ScriptedInstanceId;
            output.Type             = input.Type;
            output.QuestTimeSpaceId = input.QuestTimeSpaceId;
            output.IsSinglePortal   = input.IsSinglePortal;

            return(true);
        }
コード例 #8
0
        internal static void EnterInstance(this ClientSession session, ScriptedInstance input)
        {
            if (input != null)
            {
                ScriptedInstance instance = new ScriptedInstance(input);
                instance.LoadGlobals();
                instance.LoadScript(MapInstanceType.TimeSpaceInstance);
                if (instance.FirstMap == null)
                {
                    return;
                }

                if (session.Character.Level < instance.LevelMinimum)
                {
                    session.SendPacket(
                        UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_REQUIERED_LEVEL"), 0));
                    return;
                }

                foreach (Gift gift in instance.RequiredItems)
                {
                    if (session.Character.Inventory.CountItem(gift.VNum) < gift.Amount)
                    {
                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                               string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_REQUIERED_ITEM"),
                                                             ServerManager.GetItem(gift.VNum).Name), 0));
                        return;
                    }

                    session.Character.Inventory.RemoveItemAmount(gift.VNum, gift.Amount);
                }

                session.Character.MapX = instance.PositionX;
                session.Character.MapY = instance.PositionY;
                ServerManager.Instance.TeleportOnRandomPlaceInMap(session, instance.FirstMap.MapInstanceId);
                instance.InstanceBag.CreatorId = session.Character.CharacterId;
                session.SendPackets(instance.GenerateMinimap());
                session.SendPacket(instance.GenerateMainInfo());
                session.SendPacket(instance.FirstMap.InstanceBag.GenerateScore());

                session.Character.Timespace = instance;
            }
        }
コード例 #9
0
        private void ExecuteHandler(ClientSession session)
        {
            ScriptedInstance orgTimespace = session.CurrentMapInstance.ScriptedInstances
                                            .Find(s => X == s.PositionX && Y == s.PositionY);

            if (orgTimespace != null)
            {
                ScriptedInstance timespace = new ScriptedInstance(orgTimespace);
                timespace.LoadGlobals();
                if (StartPress == 1 || RecordPress == 1)
                {
                    session.EnterInstance(timespace);
                }
                else
                {
                    session.SendPacket(timespace.GenerateRbr());
                }
            }
        }
コード例 #10
0
        /// <summary>
        /// treq packet
        /// </summary>
        /// <param name="treqPacket"></param>
        public void GetTreq(TreqPacket treqPacket)
        {
            ScriptedInstance timespace = Session.CurrentMapInstance.ScriptedInstances.FirstOrDefault(s => treqPacket.X == s.PositionX && treqPacket.Y == s.PositionY).GetClone();

            if (timespace == null)
            {
                return;
            }
            if (treqPacket.StartPress == 1 || treqPacket.RecordPress == 1)
            {
                timespace.LoadScript(MapInstanceType.TimeSpaceInstance);
                if (timespace.FirstMap == null)
                {
                    return;
                }
                foreach (Gift i in timespace.RequieredItems)
                {
                    if (Session.Character.Inventory.CountItem(i.VNum) < i.Amount)
                    {
                        Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_REQUIERED_ITEM"), ServerManager.Instance.GetItem(i.VNum).Name), 0));
                        return;
                    }
                    Session.Character.Inventory.RemoveItemAmount(i.VNum, i.Amount);
                }
                if (timespace.LevelMinimum > Session.Character.Level)
                {
                    Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_REQUIERED_LEVEL"), 0));
                    return;
                }

                Session.Character.MapX = timespace.PositionX;
                Session.Character.MapY = timespace.PositionY;
                ServerManager.Instance.TeleportOnRandomPlaceInMap(Session, timespace.FirstMap.MapInstanceId);
                timespace.FirstMap.InstanceBag.Creator = Session.Character.CharacterId;
                Session.SendPackets(timespace.GenerateMinimap());
                Session.SendPacket(timespace.GenerateMainInfo());
                Session.SendPacket(timespace.FirstMap.InstanceBag.GenerateScore());
            }
            else
            {
                Session.SendPacket(timespace.GenerateRbr());
            }
        }
コード例 #11
0
    public void LoadScriptInEditor()
    {
        try
        {
            ScriptedInstance.RegisterTypesEditor();
            this._Script = new Script();

            string LuaData = ContentLoader.GetScriptInEditor(this._FileName);

            this._Script.DoString(LuaData);
            Table  BaseTable = _Script.Call(_Script.Globals ["ListFileDepedencies"]).Table;
            string FileData  = "";
            foreach (DynValue value in BaseTable.Values)
            {
                FileData = ContentLoader.GetScriptInEditor(value.String);
                this._Script.DoString(FileData);
            }

            this._Script.Globals ["Debug"]  = (Action <string>)ScriptAPIEditor.IDebug;
            this._Script.Globals["KeyCode"] = UserData.CreateStatic <KeyCode>();

            this._Script.Globals["Color"]   = (Func <float, float, float, float, Color>)ScriptAPIEditor.CreateColor;
            this._Script.Globals["Vector3"] = (Func <float, float, float, Vector3>)ScriptAPIEditor.CreateVector3;


            this._Script.Globals["SaveNode"] = UserData.CreateStatic <SaveNode>();
            Debug.Log("Adding Framework to script");
            this._Script.Globals["Framework"] = UserData.CreateStatic <ScriptAPIEditor>();


            if (this._Script == null)
            {
                Debug.LogError("MY SCRIPT IS NULL ????????????????");
            }
        }
        catch (SyntaxErrorException ex)
        {
            Debug.LogError("Error trying to loading script [" + this._FileName + "] ! " + ex.DecoratedMessage);
        }
    }
コード例 #12
0
 public void Insert(List <ScriptedInstanceDTO> scriptedInstances)
 {
     try
     {
         using (OpenNosContext context = DataAccessHelper.CreateContext())
         {
             context.Configuration.AutoDetectChangesEnabled = false;
             foreach (ScriptedInstanceDTO scriptedInstance in scriptedInstances)
             {
                 ScriptedInstance entity = new ScriptedInstance();
                 Mapper.Mappers.ScriptedInstanceMapper.ToScriptedInstance(scriptedInstance, entity);
                 context.ScriptedInstance.Add(entity);
             }
             context.Configuration.AutoDetectChangesEnabled = true;
             context.SaveChanges();
         }
     }
     catch (Exception e)
     {
         Logger.Error(e);
     }
 }
コード例 #13
0
        public ScriptedInstanceDTO Insert(ScriptedInstanceDTO scriptedInstance)
        {
            try
            {
                using (OpenNosContext context = DataAccessHelper.CreateContext())
                {
                    ScriptedInstance entity = new ScriptedInstance();
                    Mapper.Mappers.ScriptedInstanceMapper.ToScriptedInstance(scriptedInstance, entity);
                    context.ScriptedInstance.Add(entity);
                    context.SaveChanges();
                    if (Mapper.Mappers.ScriptedInstanceMapper.ToScriptedInstanceDTO(entity, scriptedInstance))
                    {
                        return(scriptedInstance);
                    }

                    return(null);
                }
            }
            catch (Exception e)
            {
                Logger.Error(e);
                return(null);
            }
        }
コード例 #14
0
        public void GenerateRaid(byte type, byte faction)
        {
            Act4Guardians = new List <MapMonster>();
            ScriptedInstance raid  = ServerManager.Instance.Act4Raids.FirstOrDefault(r => r.Id == type);
            MapInstance      lobby = ServerManager.Instance.Act4Maps.FirstOrDefault(m => m.Map.MapId == 134);

            if (raid == null || lobby == null)
            {
                Logger.Log.Error(raid == null ? $"Act4 raids is missing - type : {type}" : "There is no map in Act4Maps with MapId == 134");
                return;
            }

            ServerManager.Instance.Act4RaidStart = DateTime.Now;

            lobby.CreatePortal(new Portal
            {
                SourceMapId = 134,
                SourceX     = 139,
                SourceY     = 100,
                Type        = (short)(9 + faction)
            }, 3600, true);

            #region Guardian Spawning

            Act4Guardians.Add(new MapMonster
            {
                MonsterVNum   = (short)(678 + faction),
                MapX          = 147,
                MapY          = 88,
                MapId         = 134,
                Position      = 2,
                IsMoving      = false,
                MapMonsterId  = lobby.GetNextId(),
                ShouldRespawn = false,
                IsHostile     = true
            });
            Act4Guardians.Add(new MapMonster
            {
                MonsterVNum   = (short)(678 + faction),
                MapX          = 149,
                MapY          = 94,
                MapId         = 134,
                Position      = 2,
                IsMoving      = false,
                MapMonsterId  = lobby.GetNextId(),
                ShouldRespawn = false,
                IsHostile     = true
            });
            Act4Guardians.Add(new MapMonster
            {
                MonsterVNum   = (short)(678 + faction),
                MapX          = 147,
                MapY          = 101,
                MapId         = 134,
                Position      = 2,
                IsMoving      = false,
                MapMonsterId  = lobby.GetNextId(),
                ShouldRespawn = false,
                IsHostile     = true
            });
            Act4Guardians.Add(new MapMonster
            {
                MonsterVNum   = (short)(678 + faction),
                MapX          = 139,
                MapY          = 105,
                MapId         = 134,
                Position      = 2,
                IsMoving      = false,
                MapMonsterId  = lobby.GetNextId(),
                ShouldRespawn = false,
                IsHostile     = true
            });
            Act4Guardians.Add(new MapMonster
            {
                MonsterVNum   = (short)(678 + faction),
                MapX          = 132,
                MapY          = 101,
                MapId         = 134,
                Position      = 2,
                IsMoving      = false,
                MapMonsterId  = lobby.GetNextId(),
                ShouldRespawn = false,
                IsHostile     = true
            });
            Act4Guardians.Add(new MapMonster
            {
                MonsterVNum   = (short)(678 + faction),
                MapX          = 129,
                MapY          = 94,
                MapId         = 134,
                Position      = 2,
                IsMoving      = false,
                MapMonsterId  = lobby.GetNextId(),
                ShouldRespawn = false,
                IsHostile     = true
            });
            Act4Guardians.Add(new MapMonster
            {
                MonsterVNum   = (short)(678 + faction),
                MapX          = 132,
                MapY          = 88,
                MapId         = 134,
                Position      = 2,
                IsMoving      = false,
                MapMonsterId  = lobby.GetNextId(),
                ShouldRespawn = false,
                IsHostile     = true
            });

            foreach (MapMonster monster in Act4Guardians)
            {
                if (monster == null)
                {
                    continue;
                }

                monster.Initialize();
                lobby.AddMonster(monster);
                lobby.Broadcast(monster.GenerateIn());
            }

            Observable.Timer(TimeSpan.FromMinutes(60)).Subscribe(s =>
            {
                foreach (MapMonster monster in Act4Guardians)
                {
                    lobby.RemoveMonster(monster);
                    lobby.Broadcast(monster.GenerateOut());
                }
                Act4Guardians.Clear();
            });

            #endregion

            foreach (MapInstance map in ServerManager.Instance.Act4Maps)
            {
                map.Sessions.Where(s => s?.Character?.Faction == (FactionType)faction).ToList().ForEach(s =>
                                                                                                        s.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("ACT4_RAID_OPEN"), ((Act4RaidType)type).ToString()), 0)));
            }

            lock (ServerManager.Instance.FamilyList)
            {
                foreach (Family family in ServerManager.Instance.FamilyList.GetAllItems())
                {
                    if (family == null)
                    {
                        continue;
                    }
                    family.Act4Raid = ServerManager.Instance.Act4Raids.FirstOrDefault(r => r.Id == type)?.GetClone();
                    family.Act4Raid?.LoadScript(MapInstanceType.RaidInstance);
                    if (family.Act4Raid?.FirstMap == null)
                    {
                        continue;
                    }
                    family.Act4Raid.FirstMap.InstanceBag.Lock = true;
                }
            }

            Observable.Timer(TimeSpan.FromSeconds(3600)).Subscribe(s =>
            {
                foreach (Family family in ServerManager.Instance.FamilyList.GetAllItems())
                {
                    if (family == null)
                    {
                        continue;
                    }
                    family.Act4Raid?.MapInstanceDictionary?.Values.ToList().ForEach(m => m?.Dispose());
                    family.Act4Raid = null;
                }
            });
        }
コード例 #15
0
        public void RunEvent(EventContainer evt, ClientSession session = null, MapMonster monster = null)
        {
            if (evt != null)
            {
                if (session != null)
                {
                    evt.MapInstance = session.CurrentMapInstance;
                    switch (evt.EventActionType)
                    {
                        #region EventForUser

                    case EventActionType.NPCDIALOG:
                        session.SendPacket(session.Character.GenerateNpcDialog((int)evt.Parameter));
                        break;

                    case EventActionType.SENDPACKET:
                        session.SendPacket((string)evt.Parameter);
                        break;

                        #endregion
                    }
                }
                if (evt.MapInstance != null)
                {
                    switch (evt.EventActionType)
                    {
                        #region EventForUser

                    case EventActionType.NPCDIALOG:
                    case EventActionType.SENDPACKET:
                        if (session == null)
                        {
                            evt.MapInstance.Sessions.ToList().ForEach(e => RunEvent(evt, e));
                        }
                        break;

                        #endregion

                        #region MapInstanceEvent

                    case EventActionType.REGISTEREVENT:
                        Tuple <string, List <EventContainer> > even = (Tuple <string, List <EventContainer> >)evt.Parameter;
                        switch (even.Item1)
                        {
                        case "OnCharacterDiscoveringMap":
                            even.Item2.ForEach(s => evt.MapInstance.OnCharacterDiscoveringMapEvents.Add(new Tuple <EventContainer, List <long> >(s, new List <long>())));
                            break;

                        case "OnMoveOnMap":
                            evt.MapInstance.OnMoveOnMapEvents.AddRange(even.Item2);
                            break;

                        case "OnMapClean":
                            evt.MapInstance.OnMapClean.AddRange(even.Item2);
                            break;

                        case "OnLockerOpen":
                            evt.MapInstance.UnlockEvents.AddRange(even.Item2);
                            break;
                        }
                        break;

                    case EventActionType.REGISTERWAVE:
                        evt.MapInstance.WaveEvents.Add((EventWave)evt.Parameter);
                        break;

                    case EventActionType.SETAREAENTRY:
                        ZoneEvent even2 = (ZoneEvent)evt.Parameter;
                        evt.MapInstance.OnAreaEntryEvents.Add(even2);
                        break;

                    case EventActionType.REMOVEMONSTERLOCKER:
                        EventContainer evt2 = (EventContainer)evt.Parameter;
                        if (evt.MapInstance.InstanceBag.MonsterLocker.Current > 0)
                        {
                            evt.MapInstance.InstanceBag.MonsterLocker.Current--;
                        }
                        if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                        {
                            evt.MapInstance.UnlockEvents.ForEach(s => RunEvent(s));
                            evt.MapInstance.UnlockEvents.RemoveAll(s => s != null);
                        }
                        break;

                    case EventActionType.REMOVEBUTTONLOCKER:
                        evt2 = (EventContainer)evt.Parameter;
                        if (evt.MapInstance.InstanceBag.ButtonLocker.Current > 0)
                        {
                            evt.MapInstance.InstanceBag.ButtonLocker.Current--;
                        }
                        if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                        {
                            evt.MapInstance.UnlockEvents.ForEach(s => RunEvent(s));
                            evt.MapInstance.UnlockEvents.RemoveAll(s => s != null);
                        }
                        break;

                    case EventActionType.EFFECT:
                        short evt3 = (short)evt.Parameter;
                        if (monster != null)
                        {
                            monster.LastEffect = DateTime.Now;
                            evt.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Monster, monster.MapMonsterId, evt3));
                        }
                        break;

                    case EventActionType.CONTROLEMONSTERINRANGE:
                        if (monster != null)
                        {
                            Tuple <short, byte, List <EventContainer> > evnt = (Tuple <short, byte, List <EventContainer> >)evt.Parameter;
                            List <MapMonster> MapMonsters = evt.MapInstance.GetListMonsterInRange(monster.MapX, monster.MapY, evnt.Item2);
                            if (evnt.Item1 != 0)
                            {
                                MapMonsters.RemoveAll(s => s.MonsterVNum != evnt.Item1);
                            }
                            MapMonsters.ForEach(s => evnt.Item3.ForEach(e => RunEvent(e, monster: s)));
                        }
                        break;

                    case EventActionType.ONTARGET:
                        if (monster.MoveEvent?.InZone(monster.MapX, monster.MapY) == true)
                        {
                            monster.MoveEvent = null;
                            monster.Path      = new List <Node>();
                            ((List <EventContainer>)evt.Parameter).ForEach(s => RunEvent(s, monster: monster));
                        }
                        break;

                    case EventActionType.MOVE:
                        ZoneEvent evt4 = (ZoneEvent)evt.Parameter;
                        if (monster != null)
                        {
                            monster.MoveEvent = evt4;
                            monster.Path      = BestFirstSearch.FindPathJagged(new Node {
                                X = monster.MapX, Y = monster.MapY
                            }, new Node {
                                X = evt4.X, Y = evt4.Y
                            }, evt.MapInstance?.Map.JaggedGrid);
                        }
                        break;

                    case EventActionType.CLOCK:
                        evt.MapInstance.InstanceBag.Clock.TotalSecondsAmount = Convert.ToInt32(evt.Parameter);
                        evt.MapInstance.InstanceBag.Clock.SecondsRemaining   = Convert.ToInt32(evt.Parameter);
                        break;

                    case EventActionType.SETMONSTERLOCKERS:
                        evt.MapInstance.InstanceBag.MonsterLocker.Current = Convert.ToByte(evt.Parameter);
                        evt.MapInstance.InstanceBag.MonsterLocker.Initial = Convert.ToByte(evt.Parameter);
                        break;

                    case EventActionType.SETBUTTONLOCKERS:
                        evt.MapInstance.InstanceBag.ButtonLocker.Current = Convert.ToByte(evt.Parameter);
                        evt.MapInstance.InstanceBag.ButtonLocker.Initial = Convert.ToByte(evt.Parameter);
                        break;

                    case EventActionType.SCRIPTEND:
                        switch (evt.MapInstance.MapInstanceType)
                        {
                        case MapInstanceType.TimeSpaceInstance:
                            evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                            ClientSession client = evt.MapInstance.Sessions.FirstOrDefault();
                            if (client != null)
                            {
                                Guid             MapInstanceId = ServerManager.GetBaseMapInstanceIdByMapId(client.Character.MapId);
                                MapInstance      map           = ServerManager.GetMapInstance(MapInstanceId);
                                ScriptedInstance si            = map.ScriptedInstances.Find(s => s.PositionX == client.Character.MapX && s.PositionY == client.Character.MapY);
                                byte             penalty       = 0;
                                if (penalty > (client.Character.Level - si.LevelMinimum) * 2)
                                {
                                    penalty = penalty > 100 ? (byte)100 : penalty;
                                    client.SendPacket(client.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("TS_PENALTY"), penalty), 10));
                                }
                                int    point      = evt.MapInstance.InstanceBag.Point * (100 - penalty) / 100;
                                string perfection = string.Empty;
                                perfection += evt.MapInstance.InstanceBag.MonstersKilled >= si.MonsterAmount ? 1 : 0;
                                perfection += evt.MapInstance.InstanceBag.NpcsKilled == 0 ? 1 : 0;
                                perfection += evt.MapInstance.InstanceBag.RoomsVisited >= si.RoomAmount ? 1 : 0;
                                evt.MapInstance.Broadcast($"score  {evt.MapInstance.InstanceBag.EndState} {point} 27 47 18 {si.DrawItems.Count} {evt.MapInstance.InstanceBag.MonstersKilled} {si.NpcAmount - evt.MapInstance.InstanceBag.NpcsKilled} {evt.MapInstance.InstanceBag.RoomsVisited} {perfection} 1 1");
                            }
                            break;

                        case MapInstanceType.RaidInstance:
                            evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                            client = evt.MapInstance.Sessions.FirstOrDefault();
                            if (client != null)
                            {
                                Group grp = client?.Character?.Group;
                                if (grp == null)
                                {
                                    return;
                                }
                                if (evt.MapInstance.InstanceBag.EndState == 1 && evt.MapInstance.Monsters.Any(s => s.IsBoss))
                                {
                                    foreach (ClientSession sess in grp.Characters.Where(s => s.CurrentMapInstance.Monsters.Any(e => e.IsBoss)))
                                    {
                                        foreach (Gift gift in grp?.Raid?.GiftItems)
                                        {
                                            const byte rare = 0;

                                            // TODO: add random rarity for some object
                                            sess.Character.GiftAdd(gift.VNum, gift.Amount, rare, 0, gift.Design, gift.IsRandomRare);
                                        }
                                    }
                                    foreach (MapMonster mon in evt.MapInstance.Monsters)
                                    {
                                        mon.CurrentHp = 0;
                                        evt.MapInstance.Broadcast(StaticPacketHelper.Out(UserType.Monster, mon.MapMonsterId));
                                        evt.MapInstance.RemoveMonster(mon);
                                    }
                                    Logger.LogUserEvent("RAID_SUCCESS", grp.Characters.ElementAt(0).Character.Name, $"RaidId: {grp.GroupId}");

                                    ServerManager.Instance.Broadcast(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("RAID_SUCCEED"), grp?.Raid?.Label, grp.Characters.ElementAt(0).Character.Name), 0));
                                }

                                Observable.Timer(TimeSpan.FromSeconds(evt.MapInstance.InstanceBag.EndState == 1 ? 30 : 0)).Subscribe(o =>
                                {
                                    ClientSession[] grpmembers = new ClientSession[40];
                                    grp.Characters.CopyTo(grpmembers);
                                    foreach (ClientSession targetSession in grpmembers)
                                    {
                                        if (targetSession != null)
                                        {
                                            if (targetSession.Character.Hp <= 0)
                                            {
                                                targetSession.Character.Hp = 1;
                                                targetSession.Character.Mp = 1;
                                            }
                                            targetSession.SendPacket(Character.GenerateRaidBf(evt.MapInstance.InstanceBag.EndState));
                                            targetSession.SendPacket(targetSession.Character.GenerateRaid(1, true));
                                            targetSession.SendPacket(targetSession.Character.GenerateRaid(2, true));
                                            grp.LeaveGroup(targetSession);
                                        }
                                    }
                                    ServerManager.Instance.GroupList.RemoveAll(s => s.GroupId == grp.GroupId);
                                    ServerManager.Instance.GroupsThreadSafe.Remove(grp.GroupId);
                                    evt.MapInstance.Dispose();
                                });
                            }
                            break;

                        case MapInstanceType.Act4Morcos:
                        case MapInstanceType.Act4Hatus:
                        case MapInstanceType.Act4Calvina:
                        case MapInstanceType.Act4Berios:
                            client = evt.MapInstance.Sessions.FirstOrDefault();
                            if (client != null)
                            {
                                Family fam = evt.MapInstance.Sessions.FirstOrDefault(s => s?.Character?.Family != null)?.Character.Family;
                                if (fam != null)
                                {
                                    fam.Act4Raid.Portals.RemoveAll(s => s.DestinationMapInstanceId.Equals(fam.Act4RaidBossMap.MapInstanceId));
                                    short destX      = 38;
                                    short destY      = 179;
                                    short rewardVNum = 882;
                                    switch (evt.MapInstance.MapInstanceType)
                                    {
                                    //Morcos is default
                                    case MapInstanceType.Act4Hatus:
                                        destX      = 18;
                                        destY      = 10;
                                        rewardVNum = 185;
                                        break;

                                    case MapInstanceType.Act4Calvina:
                                        destX      = 25;
                                        destY      = 7;
                                        rewardVNum = 942;
                                        break;

                                    case MapInstanceType.Act4Berios:
                                        destX      = 16;
                                        destY      = 25;
                                        rewardVNum = 999;
                                        break;
                                    }
                                    int count = evt.MapInstance.Sessions.Count(s => s?.Character != null);
                                    foreach (ClientSession sess in evt.MapInstance.Sessions)
                                    {
                                        if (sess?.Character != null)
                                        {
                                            sess.Character.GiftAdd(rewardVNum, 1, forceRandom: true, minRare: 1, design: 255);
                                            sess.Character.GenerateFamilyXp(10000 / count);
                                        }
                                    }
                                    Logger.LogEvent("FAMILYRAID_SUCCESS", $"[fam.Name]FamilyRaidId: {evt.MapInstance.MapInstanceType.ToString()}");

                                    //TODO: Famlog
                                    CommunicationServiceClient.Instance.SendMessageToCharacter(new SCSCharacterMessage
                                    {
                                        DestinationCharacterId = fam.FamilyId,
                                        SourceCharacterId      = client.Character.CharacterId,
                                        SourceWorldId          = ServerManager.Instance.WorldId,
                                        Message = UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("FAMILYRAID_SUCCESS"), 0),
                                        Type    = MessageType.Family
                                    });
                                    //ServerManager.Instance.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("FAMILYRAID_SUCCESS"), grp?.Raid?.Label, grp.Characters.ElementAt(0).Character.Name), 0));

                                    Observable.Timer(TimeSpan.FromSeconds(30)).Subscribe(o =>
                                    {
                                        foreach (ClientSession targetSession in evt.MapInstance.Sessions.ToArray())
                                        {
                                            if (targetSession != null)
                                            {
                                                if (targetSession.Character.Hp <= 0)
                                                {
                                                    targetSession.Character.Hp = 1;
                                                    targetSession.Character.Mp = 1;
                                                }

                                                ServerManager.Instance.ChangeMapInstance(targetSession.Character.CharacterId, fam.Act4Raid.MapInstanceId, destX, destY);
                                            }
                                        }
                                        evt.MapInstance.Dispose();
                                    });
                                }
                            }
                            break;

                        case MapInstanceType.CaligorInstance:

                            FactionType winningFaction = CaligorRaid.AngelDamage > CaligorRaid.DemonDamage ? FactionType.Angel : FactionType.Demon;

                            foreach (ClientSession sess in evt.MapInstance.Sessions)
                            {
                                if (sess?.Character != null)
                                {
                                    if (CaligorRaid.RemainingTime > 2400)
                                    {
                                        if (sess.Character.Faction == winningFaction)
                                        {
                                            sess.Character.GiftAdd(302, 1, 0, 0, 51);
                                        }
                                        else
                                        {
                                            sess.Character.GiftAdd(302, 1, 0, 0, 51);
                                        }
                                    }
                                    else
                                    {
                                        if (sess.Character.Faction == winningFaction)
                                        {
                                            sess.Character.GiftAdd(302, 1, 0, 0, 51);
                                        }
                                        else
                                        {
                                            sess.Character.GiftAdd(302, 1, 0, 0, 51);
                                        }
                                    }
                                    sess.Character.GiftAdd(1244, 50);
                                    sess.Character.GiftAdd(1134, 1);
                                    sess.Character.GenerateFamilyXp(500);
                                }
                            }
                            evt.MapInstance.Broadcast(UserInterfaceHelper.GenerateCHDM(ServerManager.GetNpc(2305).MaxHP, CaligorRaid.AngelDamage, CaligorRaid.DemonDamage, CaligorRaid.RemainingTime));
                            break;
                        }
                        break;

                    case EventActionType.MAPCLOCK:
                        evt.MapInstance.Clock.TotalSecondsAmount = Convert.ToInt32(evt.Parameter);
                        evt.MapInstance.Clock.SecondsRemaining   = Convert.ToInt32(evt.Parameter);
                        break;

                    case EventActionType.STARTCLOCK:
                        Tuple <List <EventContainer>, List <EventContainer> > eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                        evt.MapInstance.InstanceBag.Clock.StopEvents    = eve.Item1;
                        evt.MapInstance.InstanceBag.Clock.TimeoutEvents = eve.Item2;
                        evt.MapInstance.InstanceBag.Clock.StartClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                        break;

                    case EventActionType.TELEPORT:
                        Tuple <short, short, short, short> tp = (Tuple <short, short, short, short>)evt.Parameter;
                        List <Character> characters           = evt.MapInstance.GetCharactersInRange(tp.Item1, tp.Item2, 5).ToList();
                        characters.ForEach(s =>
                        {
                            s.PositionX = tp.Item3;
                            s.PositionY = tp.Item4;
                            evt.MapInstance?.Broadcast(s.Session, s.GenerateTp(), ReceiverType.Group);
                        });
                        break;

                    case EventActionType.STOPCLOCK:
                        evt.MapInstance.InstanceBag.Clock.StopClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                        break;

                    case EventActionType.STARTMAPCLOCK:
                        eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                        evt.MapInstance.Clock.StopEvents    = eve.Item1;
                        evt.MapInstance.Clock.TimeoutEvents = eve.Item2;
                        evt.MapInstance.Clock.StartClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                        break;

                    case EventActionType.STOPMAPCLOCK:
                        evt.MapInstance.Clock.StopClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                        break;

                    case EventActionType.SPAWNPORTAL:
                        evt.MapInstance.CreatePortal((Portal)evt.Parameter);
                        break;

                    case EventActionType.REFRESHMAPITEMS:
                        evt.MapInstance.MapClear();
                        break;

                    case EventActionType.NPCSEFFECTCHANGESTATE:
                        evt.MapInstance.Npcs.ForEach(s => s.EffectActivated = (bool)evt.Parameter);
                        break;

                    case EventActionType.CHANGEPORTALTYPE:
                        Tuple <int, PortalType> param = (Tuple <int, PortalType>)evt.Parameter;
                        Portal portal = evt.MapInstance.Portals.Find(s => s.PortalId == param.Item1);
                        if (portal != null)
                        {
                            portal.Type = (short)param.Item2;
                        }
                        break;

                    case EventActionType.CHANGEDROPRATE:
                        evt.MapInstance.DropRate = (int)evt.Parameter;
                        break;

                    case EventActionType.CHANGEXPRATE:
                        evt.MapInstance.XpRate = (int)evt.Parameter;
                        break;

                    case EventActionType.DISPOSEMAP:
                        evt.MapInstance.Dispose();
                        break;

                    case EventActionType.SPAWNBUTTON:
                        evt.MapInstance.SpawnButton((MapButton)evt.Parameter);
                        break;

                    case EventActionType.UNSPAWNMONSTERS:
                        evt.MapInstance.DespawnMonster((int)evt.Parameter);
                        break;

                    case EventActionType.SPAWNMONSTER:
                        evt.MapInstance.SummonMonster((MonsterToSummon)evt.Parameter);
                        break;

                    case EventActionType.SPAWNMONSTERS:
                        evt.MapInstance.SummonMonsters((List <MonsterToSummon>)evt.Parameter);
                        break;

                    case EventActionType.REFRESHRAIDGOAL:
                        ClientSession cl = evt.MapInstance.Sessions.FirstOrDefault();
                        if (cl?.Character != null)
                        {
                            ServerManager.Instance.Broadcast(cl, cl.Character?.Group?.GeneraterRaidmbf(cl), ReceiverType.Group);
                            ServerManager.Instance.Broadcast(cl, UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEW_MISSION"), 0), ReceiverType.Group);
                        }
                        break;

                    case EventActionType.SPAWNNPC:
                        evt.MapInstance.SummonNpc((NpcToSummon)evt.Parameter);
                        break;

                    case EventActionType.SPAWNNPCS:
                        evt.MapInstance.SummonNpcs((List <NpcToSummon>)evt.Parameter);
                        break;

                    case EventActionType.DROPITEMS:
                        evt.MapInstance.DropItems((List <Tuple <short, int, short, short> >)evt.Parameter);
                        break;

                    case EventActionType.THROWITEMS:
                        Tuple <int, short, byte, int, int> parameters = (Tuple <int, short, byte, int, int>)evt.Parameter;
                        if (monster != null)
                        {
                            parameters = new Tuple <int, short, byte, int, int>(monster.MapMonsterId, parameters.Item2, parameters.Item3, parameters.Item4, parameters.Item5);
                        }
                        evt.MapInstance.ThrowItems(parameters);
                        break;

                    case EventActionType.SPAWNONLASTENTRY:
                        Character lastincharacter = evt.MapInstance.Sessions.OrderByDescending(s => s.RegisterTime).FirstOrDefault()?.Character;
                        List <MonsterToSummon> summonParameters = new List <MonsterToSummon>();
                        MapCell hornSpawn = new MapCell
                        {
                            X = lastincharacter?.PositionX ?? 154,
                            Y = lastincharacter?.PositionY ?? 140
                        };
                        long hornTarget = lastincharacter?.CharacterId ?? -1;
                        summonParameters.Add(new MonsterToSummon(Convert.ToInt16(evt.Parameter), hornSpawn, hornTarget, true));
                        evt.MapInstance.SummonMonsters(summonParameters);
                        break;

                        #endregion
                    }
                }
            }
        }
コード例 #16
0
        public void RunEvent(EventContainer evt, ClientSession session = null)
        {
            if (session != null)
            {
                evt.MapInstance = session.CurrentMapInstance;
                switch (evt.EventActionType)
                {
                    #region EventForUser

                case EventActionType.NPCDIALOG:
                    session.SendPacket(session.Character.GenerateNpcDialog((int)evt.Parameter));
                    break;

                case EventActionType.SENDPACKET:
                    session.SendPacket((string)evt.Parameter);
                    break;

                    #endregion
                }
            }
            if (evt.MapInstance != null)
            {
                switch (evt.EventActionType)
                {
                    #region EventForUser

                case EventActionType.NPCDIALOG:
                case EventActionType.SENDPACKET:
                    if (session == null)
                    {
                        evt.MapInstance.Sessions.ToList().ForEach(e =>
                        {
                            RunEvent(evt, e);
                        });
                    }
                    break;

                    #endregion

                    #region MapInstanceEvent

                case EventActionType.REGISTEREVENT:
                    Tuple <string, List <EventContainer> > even = (Tuple <string, List <EventContainer> >)evt.Parameter;
                    switch (even.Item1)
                    {
                    case "OnCharacterDiscoveringMap":
                        even.Item2.ForEach(s => evt.MapInstance.OnCharacterDiscoveringMapEvents.Add(new Tuple <EventContainer, List <long> >(s, new List <long>())));
                        break;

                    case "OnMoveOnMap":
                        evt.MapInstance.OnMoveOnMapEvents.AddRange(even.Item2);
                        break;

                    case "OnMapClean":
                        evt.MapInstance.OnMapClean.AddRange(even.Item2);
                        break;
                    }
                    break;

                case EventActionType.CLOCK:
                    evt.MapInstance.InstanceBag.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                    evt.MapInstance.InstanceBag.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                    break;

                case EventActionType.SCRIPTEND:
                    switch (evt.MapInstance.MapInstanceType)
                    {
                    case MapInstanceType.TimeSpaceInstance:
                        evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                        ClientSession client = evt.MapInstance.Sessions.FirstOrDefault();
                        if (client != null)
                        {
                            Guid             MapInstanceId = ServerManager.Instance.GetBaseMapInstanceIdByMapId(client.Character.MapId);
                            MapInstance      map           = ServerManager.Instance.GetMapInstance(MapInstanceId);
                            ScriptedInstance si            = map.TimeSpaces.FirstOrDefault(s => s.PositionX == client.Character.MapX && s.PositionY == client.Character.MapY);
                            byte             penalty       = 0;
                            if (penalty > (client.Character.Level - si.LevelMinimum) * 2)
                            {
                                penalty = penalty > 100 ? (byte)100 : penalty;
                                client.SendPacket(client.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("TS_PENALTY"), penalty), 10));
                            }
                            int    point      = evt.MapInstance.InstanceBag.Point * (100 - penalty) / 100;
                            string perfection = string.Empty;
                            perfection += evt.MapInstance.InstanceBag.MonstersKilled >= si.MonsterAmount ? 1 : 0;
                            perfection += evt.MapInstance.InstanceBag.NpcsKilled == 0 ? 1 : 0;
                            perfection += evt.MapInstance.InstanceBag.RoomsVisited >= si.RoomAmount ? 1 : 0;

                            evt.MapInstance.Broadcast($"score  {evt.MapInstance.InstanceBag.EndState} {point} 27 47 18 {si.DrawItems.Count()} {evt.MapInstance.InstanceBag.MonstersKilled} { si.NpcAmount - evt.MapInstance.InstanceBag.NpcsKilled} {evt.MapInstance.InstanceBag.RoomsVisited} {perfection} 1 1");
                        }
                        break;
                    }
                    break;

                case EventActionType.MAPCLOCK:
                    evt.MapInstance.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                    evt.MapInstance.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                    break;

                case EventActionType.STARTCLOCK:
                    Tuple <List <EventContainer>, List <EventContainer> > eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                    evt.MapInstance.InstanceBag.Clock.StopEvents    = eve.Item2;
                    evt.MapInstance.InstanceBag.Clock.TimeoutEvents = eve.Item1;
                    evt.MapInstance.InstanceBag.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                    break;

                case EventActionType.STOPCLOCK:
                    evt.MapInstance.InstanceBag.Clock.StopClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                    break;

                case EventActionType.STARTMAPCLOCK:
                    eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                    evt.MapInstance.Clock.StopEvents    = eve.Item2;
                    evt.MapInstance.Clock.TimeoutEvents = eve.Item1;
                    evt.MapInstance.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                    break;

                case EventActionType.STOPMAPCLOCK:
                    evt.MapInstance.Clock.StopClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                    break;

                case EventActionType.SPAWNPORTAL:
                    evt.MapInstance.CreatePortal((Portal)evt.Parameter);
                    break;

                case EventActionType.REFRESHMAPITEMS:
                    evt.MapInstance.MapClear();
                    break;

                case EventActionType.NPCSEFFECTCHANGESTATE:
                    evt.MapInstance.Npcs.ForEach(s => s.EffectActivated = (bool)evt.Parameter);
                    break;

                case EventActionType.CHANGEPORTALTYPE:
                    Tuple <int, PortalType> param = (Tuple <int, PortalType>)evt.Parameter;
                    Portal portal = evt.MapInstance.Portals.FirstOrDefault(s => s.PortalId == param.Item1);
                    if (portal != null)
                    {
                        portal.Type = (short)param.Item2;
                    }
                    break;

                case EventActionType.CHANGEDROPRATE:
                    evt.MapInstance.DropRate = (int)evt.Parameter;
                    break;

                case EventActionType.CHANGEXPRATE:
                    evt.MapInstance.XpRate = (int)evt.Parameter;
                    break;

                case EventActionType.DISPOSEMAP:
                    evt.MapInstance.Dispose();
                    break;

                case EventActionType.SPAWNBUTTON:
                    evt.MapInstance.SpawnButton((MapButton)evt.Parameter);
                    break;

                case EventActionType.UNSPAWNMONSTERS:
                    evt.MapInstance.UnspawnMonsters((int)evt.Parameter);
                    break;

                case EventActionType.SPAWNMONSTERS:
                    evt.MapInstance.SummonMonsters((List <MonsterToSummon>)evt.Parameter);
                    break;

                case EventActionType.SPAWNNPCS:
                    evt.MapInstance.SummonNpcs((List <NpcToSummon>)evt.Parameter);
                    break;

                case EventActionType.DROPITEMS:
                    evt.MapInstance.DropItems((List <Tuple <short, int, short, short> >)evt.Parameter);
                    break;

                case EventActionType.SPAWNONLASTENTRY:

                    //TODO REVIEW THIS CASE
                    Character lastincharacter = evt.MapInstance.Sessions.OrderByDescending(s => s.RegisterTime).FirstOrDefault()?.Character;
                    List <MonsterToSummon> summonParameters = new List <MonsterToSummon>();
                    MapCell hornSpawn = new MapCell
                    {
                        X = lastincharacter?.PositionX ?? 154,
                        Y = lastincharacter?.PositionY ?? 140
                    };
                    long hornTarget = lastincharacter?.CharacterId ?? -1;
                    summonParameters.Add(new MonsterToSummon((short)evt.Parameter, hornSpawn, hornTarget, true, new List <EventContainer>()));
                    evt.MapInstance.SummonMonsters(summonParameters);
                    break;

                    #endregion
                }
            }
        }
コード例 #17
0
        public override void Use(ClientSession session, ref ItemInstance inv, byte option = 0,
                                 string[] packetsplit = null)
        {
            inv.Item.BCards.ForEach(c => c.ApplyBCards(session.Character));

            switch (Effect)
            {
            case 0:
                switch (VNum)
                {
                case 5370:
                    if (session.Character.Buff.Any(s => s.Card.CardId == 393))
                    {
                        session.SendPacket(session.Character.GenerateSay(
                                               string.Format(Language.Instance.GetMessageFromKey("ALREADY_GOT_BUFF"),
                                                             session.Character.Buff.FirstOrDefault(s => s.Card.CardId == 393)?.Card.Name),
                                               10));
                        return;
                    }

                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.Character.AddStaticBuff(new StaticBuffDTO {
                        CardId = 393
                    });
                    break;

                case 1428:
                    session.SendPacket("guri 18 1");
                    break;

                case 1429:
                    session.SendPacket("guri 18 0");
                    break;

                case 1430:
                    if (packetsplit == null)
                    {
                        return;
                    }

                    if (packetsplit.Length < 9)
                    {
                        // MODIFIED PACKET
                        return;
                    }

                    if (!short.TryParse(packetsplit[9], out short eqSlot) ||
                        !Enum.TryParse(packetsplit[8], out InventoryType eqType))
                    {
                        return;
                    }

                    var eq =
                        session.Character.Inventory.LoadBySlotAndType <WearableInstance>(eqSlot, eqType);
                    if (eq == null)
                    {
                        // PACKET MODIFIED
                        return;
                    }

                    if (eq.Item.ItemType != ItemType.Armor && eq.Item.ItemType != ItemType.Weapon)
                    {
                        return;
                    }

                    eq.EquipmentOptions.Clear();
                    eq.ShellRarity = null;
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(
                            Language.Instance.GetMessageFromKey("SHELL_ERASED"), 0));
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateGuri(17, 1, session.Character.CharacterId));
                    break;

                case 1904:
                    short[] items = { 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903 };
                    for (int i = 0; i < 5; i++)
                    {
                        session.Character.GiftAdd(items[ServerManager.Instance.RandomNumber(0, items.Length)],
                                                  1);
                    }

                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    break;

                case 5916:
                    session.Character.AddStaticBuff(new StaticBuffDTO
                    {
                        CardId        = 340,
                        CharacterId   = session.Character.CharacterId,
                        RemainingTime = 7200
                    });
                    session.Character.RemoveBuff(339, true);
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    break;

                case 5929:
                    session.Character.AddStaticBuff(new StaticBuffDTO
                    {
                        CardId        = 340,
                        CharacterId   = session.Character.CharacterId,
                        RemainingTime = 600
                    });
                    session.Character.RemoveBuff(339, true);
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    break;

                default:
                    IEnumerable <RollGeneratedItemDTO> roll =
                        DaoFactory.RollGeneratedItemDao.LoadByItemVNum(VNum);
                    IEnumerable <RollGeneratedItemDTO> rollGeneratedItemDtos =
                        roll as IList <RollGeneratedItemDTO> ?? roll.ToList();
                    if (!rollGeneratedItemDtos.Any())
                    {
                        return;
                    }

                    int probabilities = rollGeneratedItemDtos.Sum(s => s.Probability);
                    int rnd           = ServerManager.Instance.RandomNumber(0, probabilities);
                    int currentrnd    = 0;
                    foreach (RollGeneratedItemDTO rollitem in rollGeneratedItemDtos)
                    {
                        if (rollitem.Probability == 10000)
                        {
                            session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount);
                            continue;
                        }

                        currentrnd += rollitem.Probability;
                        if (currentrnd < rnd)
                        {
                            continue;
                        }

                        if (rollitem.IsSuperReward)
                        {
                            CommunicationServiceClient.Instance.SendMessageToCharacter(new SCSCharacterMessage
                            {
                                DestinationCharacterId = null,
                                SourceCharacterId      = session.Character.CharacterId,
                                SourceWorldId          = ServerManager.Instance.WorldId,
                                Message = string.Format(Language.Instance.GetMessageFromKey("SUPER_REWARD"), session.Character.Name,
                                                        ServerManager.Instance.GetItem(rollitem.ItemGeneratedVNum).Name),
                                Type = MessageType.Shout
                            });
                        }

                        session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount, 0,
                                                  rollitem.ItemGeneratedUpgrade);
                        break;
                    }

                    session.Character.Inventory.RemoveItemAmount(VNum);
                    break;
                }

                break;

            // sp point potions
            case 150:
            case 151:
                session.Character.SpAdditionPoint += EffectValue;
                if (session.Character.SpAdditionPoint > 1000000)
                {
                    session.Character.SpAdditionPoint = 1000000;
                }

                session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                       string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDED"), EffectValue), 0));
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.SendPacket(session.Character.GenerateSpPoint());
                break;

            case 204:
                session.Character.SpPoint         += EffectValue;
                session.Character.SpAdditionPoint += EffectValue * 3;
                if (session.Character.SpAdditionPoint > 1000000)
                {
                    session.Character.SpAdditionPoint = 1000000;
                }

                if (session.Character.SpPoint > 10000)
                {
                    session.Character.SpPoint = 10000;
                }

                session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                       string.Format(Language.Instance.GetMessageFromKey("SP_POINTSADDEDBOTH"), EffectValue,
                                                     EffectValue * 3), 0));
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.SendPacket(session.Character.GenerateSpPoint());
                break;

            case 250:
                if (session.Character.Buff.Any(s => s.Card.CardId == 131))
                {
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("ALREADY_GOT_BUFF"),
                                                         session.Character.Buff.FirstOrDefault(s => s.Card.CardId == 131)?.Card.Name), 10));
                    return;
                }

                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.Character.AddStaticBuff(new StaticBuffDTO {
                    CardId = 131
                });
                session.CurrentMapInstance.Broadcast(session.Character.GeneratePairy());
                session.SendPacket(session.Character.GeneratePairy());
                break;

            case 208:
                if (session.Character.Buff.Any(s => s.Card.CardId == 121))
                {
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("ALREADY_GOT_BUFF"),
                                                         session.Character.Buff.FirstOrDefault(s => s.Card.CardId == 121)?.Card.Name), 10));
                    return;
                }

                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                session.Character.AddStaticBuff(new StaticBuffDTO
                {
                    CardId        = 121,
                    CharacterId   = session.Character.CharacterId,
                    RemainingTime = 3600
                });
                break;

            case 301:
                if (ServerManager.Instance.IsCharacterMemberOfGroup(session.Character.CharacterId))
                {
                    //TODO you are in group
                    return;
                }

                var raidSeal =
                    session.Character.Inventory.LoadBySlotAndType <ItemInstance>(inv.Slot, InventoryType.Main);

                ScriptedInstance raid = ServerManager.Instance?.Raids?.FirstOrDefault(s =>
                {
                    return(s?.RequieredItems != null &&
                           s.RequieredItems.Any(obj => obj?.VNum == raidSeal?.ItemVNum));
                })?.GetClone();
                if (raid != null)
                {
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, raidSeal.Id);
                    var groupType = GroupType.Team;
                    switch (raidSeal.Item.EffectValue)
                    {
                    case 20:
                        groupType = GroupType.GiantTeam;
                        break;

                    case 23:
                        groupType = GroupType.BigTeam;
                        break;
                    }

                    var group = new Group(groupType);
                    group.Raid = raid;
                    group.JoinGroup(session.Character.CharacterId);
                    ServerManager.Instance.AddGroup(group);
                    session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(
                                           string.Format(Language.Instance.GetMessageFromKey("YOU_ARE_RAID_CHIEF"),
                                                         session.Character.Name), 0));
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("YOU_ARE_RAID_CHIEF"),
                                                         session.Character.Name), 10));
                    if (session.Character.Level > raid.LevelMaximum || session.Character.Level < raid.LevelMinimum)
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(
                                Language.Instance.GetMessageFromKey("RAID_LEVEL_INCORRECT"), 10));
                    }

                    session.SendPacket(session.Character.GenerateRaid(2, false));
                    session.SendPacket(session.Character.GenerateRaid(0, false));
                    session.SendPacket(session.Character.GenerateRaid(1, false));
                    session.SendPacket(group.GenerateRdlst());
                }

                break;

            case 305:
                Mate partner = session.Character.Mates
                               .FirstOrDefault(x =>
                                               x.IsTeamMember &&
                                               (x.NpcMonsterVNum == 317 || x.NpcMonsterVNum == 318 || x.NpcMonsterVNum == 319) &&
                                               x.MateType == MateType.Partner);
                if (partner == null)
                {
                    return;
                }

                switch (partner.NpcMonsterVNum)
                {
                case 317:
                    if (inv.Item.VNum == 1103 && partner.Skin != inv.Item.Morph)
                    {
                        partner.Skin = inv.Item.Morph;
                    }
                    else
                    {
                        return;
                    }

                    break;

                case 318:
                    if (inv.Item.VNum == 1141 && partner.Skin != inv.Item.Morph)
                    {
                        partner.Skin = inv.Item.Morph;
                    }
                    else
                    {
                        return;
                    }

                    break;

                case 319:
                    if (inv.Item.VNum == 1142 && partner.Skin != inv.Item.Morph)
                    {
                        partner.Skin = inv.Item.Morph;
                    }
                    else
                    {
                        return;
                    }

                    break;
                }

                session.Character?.Inventory?.RemoveItemAmountFromInventory(1, inv.Id);
                session.CurrentMapInstance?.Broadcast(partner.GenerateCMode(partner.Skin));
                break;

            //suction Funnel (Quest Item / QuestId = 1724)
            case 400:
                if (session.Character == null || session.Character.Quests.All(q => q.QuestId != 1724))
                {
                    break;
                }

                MapMonster kenko = session.CurrentMapInstance?.Monsters.FirstOrDefault(m =>
                                                                                       m.MapMonsterId == session.Character.LastMonsterId && m.MonsterVNum == 146);
                if (kenko == null)
                {
                    break;
                }

                kenko.GenerateDeath(session.Character);
                kenko.GenerateOut();
                session.Character.Inventory.AddNewToInventory(1174);     // Kenko Bead
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            //speed booster
            case 998:
                if (!session.Character.IsVehicled || session.Character.Buff.Any(s => s.Card.CardId == 336))
                {
                    return;
                }

                session.CurrentMapInstance?.Broadcast(session.Character.GenerateEff(885), session.Character.MapX,
                                                      session.Character.MapY);
                session.Character.AddBuff(new Buff.Buff(336));
                session.Character.Speed += 5;
                switch (session.Character.Morph)
                {
                case 2517:         // Nossi M
                case 2518:         // Nossi F
                case 2522:         // Roller M
                case 2523:         // Roller F
                    // Removes <= lv 4 debuffs
                    List <BuffType> bufftodisable = new List <BuffType> {
                        BuffType.Bad
                    };
                    session.Character.DisableBuffs(bufftodisable, 4);
                    break;
                }

                Observable.Timer(TimeSpan.FromSeconds(session.Character.BuffRandomTime * 0.1D)).Subscribe(o =>
                {
                    session.Character.Speed -= 5;
                    session.Character.LoadSpeed();
                    switch (session.Character.Morph)
                    {
                    case 2526:         // White male unicorn
                    case 2527:         // White female unicorn
                    case 2528:         // Pink male unicorn
                    case 2529:         // Pink female unicorn
                    case 2530:         // Black male unicorn
                    case 2531:         // Black Female Unicorn
                    case 2928:         // Male UFO
                    case 2929:         // Female UFO
                    case 3679:         // Male squelettic dragon
                    case 3680:         // Female squelettic dragon
                        ServerManager.Instance.TeleportOnRandomPlaceInMap(session,
                                                                          session.Character.MapInstanceId, true);
                        break;

                    case 2432:         // Magic broom
                    case 2433:         // Magic broom F
                    case 2520:         // VTT M
                    case 2521:         // VTT F
                        switch (session.Character.Direction)
                        {
                        case 0:
                            // -y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   session.Character.PositionX, (short)(session.Character.PositionY - 5));
                            break;

                        case 1:
                            // +x
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   (short)(session.Character.PositionX + 5), session.Character.PositionY);
                            break;

                        case 2:
                            // +y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   session.Character.PositionX, (short)(session.Character.PositionY + 5));
                            break;

                        case 3:
                            // -x
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   (short)(session.Character.PositionX - 5), session.Character.PositionY);
                            break;

                        case 4:
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   (short)(session.Character.PositionX - 5),
                                                                   (short)(session.Character.PositionY - 5));
                            // -x -y
                            break;

                        case 5:
                            // +x +y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   (short)(session.Character.PositionX - 5),
                                                                   (short)(session.Character.PositionY - 5));
                            break;

                        case 6:
                            // +x -y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   (short)(session.Character.PositionX + 5),
                                                                   (short)(session.Character.PositionY + 5));
                            break;

                        case 7:
                            // -x +y
                            ServerManager.Instance.TeleportForward(session, session.Character.MapInstanceId,
                                                                   (short)(session.Character.PositionX - 5),
                                                                   (short)(session.Character.PositionY + 5));
                            break;
                        }

                        break;

                    case 2524:
                    case 2525:
                        if (session.Character.Hp > 0)
                        {
                            session.Character.Hp += session.Character.Level * 15;
                            if (session.Character.Hp > session.Character.HpLoad())
                            {
                                session.Character.Hp = (int)session.Character.HpLoad();
                            }
                        }

                        break;
                    }
                });
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            //Atk/Def/HP/Exp potions
            case 6600:
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            // Divorce letter
            case 6969:     // this is imaginary number I = √(-1)
                CharacterRelationDTO rel =
                    session.Character.CharacterRelations.FirstOrDefault(s =>
                                                                        s.RelationType == CharacterRelationType.Spouse);
                if (rel != null)
                {
                    session.Character.DeleteRelation(rel.CharacterId == session.Character.CharacterId
                            ? rel.RelatedCharacterId
                            : rel.CharacterId);
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("DIVORCED")));
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                }

                break;

            // Cupid's arrow
            case 34:
                if (packetsplit != null && packetsplit.Length > 3)
                {
                    if (long.TryParse(packetsplit[3], out long characterId))
                    {
                        if (session.Character.CharacterRelations.Any(s =>
                                                                     s.RelationType == CharacterRelationType.Spouse))
                        {
                            session.SendPacket($"info {Language.Instance.GetMessageFromKey("ALREADY_MARRIED")}");
                            return;
                        }

                        ClientSession otherSession = ServerManager.Instance.GetSessionByCharacterId(characterId);
                        if (otherSession != null)
                        {
                            otherSession.SendPacket(UserInterfaceHelper.Instance.GenerateDialog(
                                                        $"#fins^-34^{session.Character.CharacterId} #fins^-69^{session.Character.CharacterId} {string.Format(Language.Instance.GetMessageFromKey("MARRY_REQUEST"), session.Character.Name)}"));
                            session.Character.FriendRequestCharacters.Add(characterId);
                            //session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                        }
                    }
                }

                break;

            case 570:
                if (session.CurrentMapInstance?.MapInstanceType == MapInstanceType.Act4Instance)
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(
                            Language.Instance.GetMessageFromKey("MUST_BE_IN_CLASSIC_MAP"), 0));
                    return;
                }

                if (EffectValue < 3)
                {
                    if (session.Character.Faction == (FactionType)EffectValue)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateMsg(
                                Language.Instance.GetMessageFromKey("SAME_FACTION"), 0));
                        return;
                    }

                    session.SendPacket(session.Character.Family == null
                            ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}"
                            : UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("IN_FAMILY"),
                                                                       0));
                }
                else
                {
                    if (session.Character.Family == null)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateMsg(
                                Language.Instance.GetMessageFromKey("NO_FAMILY"), 0));
                        return;
                    }

                    if ((session.Character.Family.FamilyFaction / 2) == EffectValue)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateMsg(
                                Language.Instance.GetMessageFromKey("SAME_FACTION"), 0));
                        return;
                    }

                    session.SendPacket(session.Character.Family != null
                            ? $"qna #guri^750^{EffectValue} {Language.Instance.GetMessageFromKey($"ASK_CHANGE_FACTION{EffectValue}")}"
                            : UserInterfaceHelper.Instance.GenerateMsg(
                                           Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"),
                                           0));
                }

                break;

            // wings
            case 650:
                if (session.Character.UseSp && session.Character.SpInstance != null)
                {
                    if (option == 0)
                    {
                        session.SendPacket(
                            $"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^3 {Language.Instance.GetMessageFromKey("ASK_WINGS_CHANGE")}");
                    }
                    else
                    {
                        CharacterHelper.Instance.RemoveSpecialistWingsBuff(session);
                        CharacterHelper.Instance.AddSpecialistWingsBuff(session);
                        session.Character.SpInstance.Design = (byte)EffectValue;
                        session.Character.MorphUpgrade2     = EffectValue;
                        session.CurrentMapInstance?.Broadcast(session.Character.GenerateCMode());
                        session.SendPacket(session.Character.GenerateStat());
                        session.SendPacket(session.Character.GenerateStatChar());
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }
                else
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NO_SP"), 0));
                }

                break;

            // presentation messages
            case 203:
                if (!session.Character.IsVehicled)
                {
                    if (option == 0)
                    {
                        session.SendPacket(
                            UserInterfaceHelper.Instance.GenerateGuri(10, 2, session.Character.CharacterId, 1));
                    }
                }

                break;

            // magic lamps
            case 651:
                if (session.Character.Inventory.All(i => i.Value.Type != InventoryType.Wear))
                {
                    if (option == 0)
                    {
                        session.SendPacket(
                            $"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^3 {Language.Instance.GetMessageFromKey("ASK_USE")}");
                    }
                    else
                    {
                        session.Character.ChangeSex();
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }
                else
                {
                    session.SendPacket(
                        UserInterfaceHelper.Instance.GenerateMsg(
                            Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0));
                }

                break;

            // vehicles
            case 1000:
                if (session.Character.HasShopOpened)
                {
                    return;
                }

                if (Morph > 0)
                {
                    if (option == 0 && !session.Character.IsVehicled)
                    {
                        if (session.Character.IsSitting)
                        {
                            session.Character.IsSitting = false;
                            session.CurrentMapInstance?.Broadcast(session.Character.GenerateRest());
                        }

                        session.Character.LastDelay = DateTime.Now;
                        session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 3,
                                                                                      $"#u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^2"));
                    }
                    else
                    {
                        if (!session.Character.IsVehicled && option != 0)
                        {
                            DateTime delay = DateTime.Now.AddSeconds(-4);
                            if (session.Character.LastDelay > delay &&
                                session.Character.LastDelay < delay.AddSeconds(2))
                            {
                                session.Character.Speed         = Speed;
                                session.Character.IsVehicled    = true;
                                session.Character.VehicleSpeed  = Speed;
                                session.Character.MorphUpgrade  = 0;
                                session.Character.MorphUpgrade2 = 0;
                                session.Character.Morph         = Morph + (byte)session.Character.Gender;
                                session.Character.Mates?.ForEach(x =>
                                                                 session.CurrentMapInstance?.Broadcast(x.GenerateOut()));
                                session.CurrentMapInstance?.Broadcast(session.Character.GenerateEff(196),
                                                                      session.Character.MapX, session.Character.MapY);
                                session.CurrentMapInstance?.Broadcast(session.Character.GenerateCMode());
                                session.SendPacket(session.Character.GenerateCond());
                                session.Character.LastSpeedChange = DateTime.Now;
                            }
                        }
                        else if (session.Character.IsVehicled)
                        {
                            session.Character.Mates?.Where(s => s.IsTeamMember).ToList().ForEach(x =>
                            {
                                x.PositionX = session.Character.PositionX;
                                x.PositionY = session.Character.PositionY;
                                session.CurrentMapInstance?.Broadcast(x.GenerateIn());
                            });
                            session.Character.RemoveVehicle();
                        }
                    }
                }

                break;

            case 1002:
                if (session.HasCurrentMapInstance)
                {
                    if (session.CurrentMapInstance.Map.MapTypes.All(m => m.MapTypeId != (short)MapTypeEnum.Act4))
                    {
                        short[] vnums =
                        {
                            1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399,
                            1400, 1401, 1402, 1403, 1404, 1405
                        };
                        short vnum = vnums[ServerManager.Instance.RandomNumber(0, 20)];

                        NpcMonster npcmonster = ServerManager.Instance.GetNpc(vnum);
                        if (npcmonster == null)
                        {
                            return;
                        }

                        var monster = new MapMonster
                        {
                            MonsterVNum   = vnum,
                            MapY          = session.Character.MapY,
                            MapX          = session.Character.MapX,
                            MapId         = session.Character.MapInstance.Map.MapId,
                            Position      = (byte)session.Character.Direction,
                            IsMoving      = true,
                            MapMonsterId  = session.CurrentMapInstance.GetNextId(),
                            ShouldRespawn = false
                        };
                        monster.Initialize(session.CurrentMapInstance);
                        session.CurrentMapInstance.AddMonster(monster);
                        session.CurrentMapInstance.Broadcast(monster.GenerateIn());
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }

                break;

            case 69:
                session.Character.GetReput(ReputPrice, true);
                session.SendPacket(session.Character.GenerateFd());
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            case 789:
                session.Character.GiftAdd((short)inv.Item.EffectValue, 1);
                session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                break;

            case 1003:
                if (!session.Character.StaticBonusList.Any(s =>
                                                           s.StaticBonusType == StaticBonusType.BazaarMedalGold ||
                                                           s.StaticBonusType == StaticBonusType.BazaarMedalSilver))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.BazaarMedalGold
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }

                break;

            case 1004:
                if (!session.Character.StaticBonusList.Any(s =>
                                                           s.StaticBonusType == StaticBonusType.BazaarMedalGold ||
                                                           s.StaticBonusType == StaticBonusType.BazaarMedalGold))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.BazaarMedalSilver
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }

                break;

            case 1005:
                if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.BackPack))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.BackPack
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateExts());
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }

                break;

            case 1006:
                if (option == 0)
                {
                    session.SendPacket(
                        $"qna #u_i^1^{session.Character.CharacterId}^{(byte)inv.Type}^{inv.Slot}^2 {Language.Instance.GetMessageFromKey("ASK_PET_MAX")}");
                }
                else
                {
                    if (session.Character.MaxMateCount < 30)
                    {
                        session.SendPacket(
                            session.Character.GenerateSay(Language.Instance.GetMessageFromKey("GET_PET_PLACES"),
                                                          10));
                        session.SendPacket(session.Character.GenerateScpStc());
                        session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    }
                }

                break;

            case 1007:
                if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.PetBasket))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.PetBasket
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateExts());
                    session.SendPacket("ib 1278 1");
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }

                break;

            case 1008:
                if (session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.PetBackPack))
                {
                    session.Character.StaticBonusList.Add(new StaticBonusDTO
                    {
                        CharacterId     = session.Character.CharacterId,
                        DateEnd         = DateTime.Now.AddDays(EffectValue),
                        StaticBonusType = StaticBonusType.PetBackPack
                    });
                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    session.SendPacket(session.Character.GenerateExts());
                    session.SendPacket(session.Character.GenerateSay(
                                           string.Format(Language.Instance.GetMessageFromKey("EFFECT_ACTIVATED"), Name), 12));
                }

                break;

            default:
                List <RollGeneratedItemDTO> rolls = inv.Item.RollGeneratedItems?.ToList();
                if (rolls != null && rolls.Any())
                {
                    if (option == 0)
                    {
                        if (packetsplit != null && packetsplit.Length == 9 || inv.Item.ItemSubType == 3)
                        {
                            session.SendPacket(
                                $"qna #guri^4999^8023^{inv.Slot} {Language.Instance.GetMessageFromKey("ASK_OPEN_BOX")}");
                        }

                        break;
                    }

                    int probabilities          = rolls.Sum(s => s.Probability);
                    int rnd                    = ServerManager.Instance.RandomNumber(0, probabilities);
                    int currentrnd             = 0;
                    List <ItemInstance> newInv = null;
                    foreach (RollGeneratedItemDTO rollitem in rolls)
                    {
                        if (rollitem.Probability == 10000)
                        {
                            session.Character.GiftAdd(rollitem.ItemGeneratedVNum, rollitem.ItemGeneratedAmount);
                            continue;
                        }

                        currentrnd += rollitem.Probability;
                        if (newInv != null || currentrnd < rnd)
                        {
                            continue;
                        }

                        newInv = session.Character.Inventory.AddNewToInventory(rollitem.ItemGeneratedVNum,
                                                                               rollitem.ItemGeneratedAmount, upgrade: rollitem.ItemGeneratedUpgrade);
                        short slot = inv.Slot;
                        if (!newInv.Any() || slot == -1)
                        {
                            continue;
                        }

                        session.SendPacket(session.Character.GenerateSay(
                                               $"{Language.Instance.GetMessageFromKey("ITEM_ACQUIRED")}: {newInv.FirstOrDefault()?.Item.Name ?? ""} x {rollitem.ItemGeneratedAmount})",
                                               12));
                        session.SendPacket($"rdi {rollitem.ItemGeneratedVNum} {rollitem.ItemGeneratedAmount}");
                        newInv.ForEach(s => session.SendPacket(s?.GenerateInventoryAdd()));
                    }

                    session.Character.Inventory.RemoveItemAmountFromInventory(1, inv.Id);
                    break;
                }

                Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_HANDLER_ITEM"), GetType()));
                break;
            }

            session.Character.IncrementQuests(QuestType.Use, inv.ItemVNum);
        }
コード例 #18
0
        /// <summary>
        /// Run Event
        /// </summary>
        /// <param name="evt">Event Container</param>
        /// <param name="session">Character Session that run the event</param>
        /// <param name="monster">Monster that run the event</param>
        public void RunEvent(EventContainer evt, ClientSession session = null, MapMonster monster = null)
        {
            if (session != null)
            {
                evt.MapInstance = session.CurrentMapInstance;
                switch (evt.EventActionType)
                {
                    #region EventForUser

                case EventActionType.NPCDIALOG:
                    session.SendPacket(session.Character.GenerateNpcDialog((int)evt.Parameter));
                    break;

                case EventActionType.SENDPACKET:
                    session.SendPacket((string)evt.Parameter);
                    break;

                    #endregion
                }
            }
            if (evt.MapInstance == null)
            {
                return;
            }
            switch (evt.EventActionType)
            {
                #region EventForUser

            case EventActionType.NPCDIALOG:
            case EventActionType.SENDPACKET:
                if (session == null)
                {
                    evt.MapInstance.Sessions.ToList().ForEach(e =>
                    {
                        RunEvent(evt, e);
                    });
                }
                break;

                #endregion

                #region MapInstanceEvent

            case EventActionType.REGISTEREVENT:
                Tuple <string, ConcurrentBag <EventContainer> > even = (Tuple <string, ConcurrentBag <EventContainer> >)evt.Parameter;
                switch (even.Item1)
                {
                case "OnCharacterDiscoveringMap":
                    even.Item2.ToList().ForEach(s => evt.MapInstance.OnCharacterDiscoveringMapEvents.Add(new Tuple <EventContainer, List <long> >(s, new List <long>())));
                    break;

                case "OnMoveOnMap":
                    evt.MapInstance.OnMoveOnMapEvents.AddRange(even.Item2);
                    break;

                case "OnMapClean":
                    evt.MapInstance.OnMapClean.AddRange(even.Item2);
                    break;

                case "OnLockerOpen":
                    even.Item2.ToList().ForEach(s => evt.MapInstance.InstanceBag.UnlockEvents.Add(s));
                    break;
                }
                break;

            case EventActionType.REGISTERWAVE:
                evt.MapInstance.WaveEvents.Add((EventWave)evt.Parameter);
                break;

            case EventActionType.SETAREAENTRY:
                ZoneEvent even2 = (ZoneEvent)evt.Parameter;
                evt.MapInstance.OnAreaEntryEvents.Add(even2);

                break;

            case EventActionType.REMOVEMONSTERLOCKER:
                if (evt.MapInstance.InstanceBag.MonsterLocker.Current > 0)
                {
                    evt.MapInstance.InstanceBag.MonsterLocker.Current--;
                }
                if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                {
                    evt.MapInstance.InstanceBag.UnlockEvents.ToList().ForEach(s => RunEvent(s));
                    evt.MapInstance.InstanceBag.UnlockEvents.Clear();
                }
                break;

            case EventActionType.REMOVEBUTTONLOCKER:
                if (evt.MapInstance.InstanceBag.ButtonLocker.Current > 0)
                {
                    evt.MapInstance.InstanceBag.ButtonLocker.Current--;
                }
                if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                {
                    evt.MapInstance.InstanceBag.UnlockEvents.ToList().ForEach(s => RunEvent(s));
                    evt.MapInstance.InstanceBag.UnlockEvents.Clear();
                }
                break;

            case EventActionType.EFFECT:
                short evt3 = (short)evt.Parameter;
                if (monster != null && (DateTime.Now - monster.LastEffect).TotalSeconds >= 5)
                {
                    evt.MapInstance.Broadcast(monster.GenerateEff(evt3));
                    monster.ShowEffect();
                }
                break;

            case EventActionType.CONTROLEMONSTERINRANGE:
                if (monster != null)
                {
                    Tuple <short, byte, ConcurrentBag <EventContainer> > evnt = (Tuple <short, byte, ConcurrentBag <EventContainer> >)evt.Parameter;
                    List <MapMonster> mapMonsters = evt.MapInstance.GetListMonsterInRange(monster.MapX, monster.MapY, evnt.Item2);
                    if (evnt.Item1 != 0)
                    {
                        mapMonsters.RemoveAll(s => s.MonsterVNum != evnt.Item1);
                    }
                    mapMonsters.ForEach(s => evnt.Item3.ToList().ForEach(e => RunEvent(e, monster: s)));
                }
                break;

            case EventActionType.ONTARGET:
                if (monster?.MoveEvent != null && monster.MoveEvent.InZone(monster.MapX, monster.MapY))
                {
                    ((ConcurrentBag <EventContainer>)evt.Parameter).ToList().ForEach(s => RunEvent(s, monster: monster));
                }
                break;

            case EventActionType.MOVE:
                ZoneEvent evt4 = (ZoneEvent)evt.Parameter;
                if (monster != null)
                {
                    monster.FirstX    = evt4.X;
                    monster.FirstY    = evt4.Y;
                    monster.MoveEvent = evt4;
                    monster.Path      = BestFirstSearch.FindPath(new Node {
                        X = monster.MapX, Y = monster.MapY
                    }, new Node {
                        X = evt4.X, Y = evt4.Y
                    }, evt.MapInstance?.Map.Grid);
                }
                break;

            case EventActionType.CLOCK:
                evt.MapInstance.InstanceBag.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                evt.MapInstance.InstanceBag.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                break;

            case EventActionType.SETMONSTERLOCKERS:
                evt.MapInstance.InstanceBag.MonsterLocker.Current = Convert.ToByte(evt.Parameter);
                evt.MapInstance.InstanceBag.MonsterLocker.Initial = Convert.ToByte(evt.Parameter);
                break;

            case EventActionType.SETBUTTONLOCKERS:
                evt.MapInstance.InstanceBag.ButtonLocker.Current = Convert.ToByte(evt.Parameter);
                evt.MapInstance.InstanceBag.ButtonLocker.Initial = Convert.ToByte(evt.Parameter);
                break;

            case EventActionType.SCRIPTEND:
                switch (evt.MapInstance.MapInstanceType)
                {
                case MapInstanceType.TimeSpaceInstance:
                    evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                    ClientSession client = evt.MapInstance.Sessions.FirstOrDefault();
                    if (client != null)
                    {
                        Guid             mapInstanceId = ServerManager.Instance.GetBaseMapInstanceIdByMapId(client.Character.MapId);
                        MapInstance      map           = ServerManager.Instance.GetMapInstance(mapInstanceId);
                        ScriptedInstance si            = map.ScriptedInstances.FirstOrDefault(s => s.PositionX == client.Character.MapX && s.PositionY == client.Character.MapY);
                        byte             penalty       = 0;
                        if (si != null && penalty > (client.Character.Level - si.LevelMinimum) * 2)
                        {
                            penalty = penalty > 100 ? (byte)100 : penalty;
                            client.SendPacket(client.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("TS_PENALTY"), penalty), 10));
                        }
                        int    point      = evt.MapInstance.InstanceBag.Point * (100 - penalty) / 100;
                        string perfection = string.Empty;
                        perfection += si != null && evt.MapInstance.InstanceBag.MonstersKilled >= si.MonsterAmount ? 1 : 0;
                        perfection += evt.MapInstance.InstanceBag.NpcsKilled == 0 ? 1 : 0;
                        perfection += si != null && evt.MapInstance.InstanceBag.RoomsVisited >= si.RoomAmount ? 1 : 0;

                        if (si != null)
                        {
                            evt.MapInstance.Broadcast(
                                $"score  {evt.MapInstance.InstanceBag.EndState} {point} 27 47 18 {si.DrawItems.Count()} {evt.MapInstance.InstanceBag.MonstersKilled} {si.NpcAmount - evt.MapInstance.InstanceBag.NpcsKilled} {evt.MapInstance.InstanceBag.RoomsVisited} {perfection} 1 1");
                        }
                    }
                    break;

                case MapInstanceType.RaidInstance:
                    evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                    client = evt.MapInstance.Sessions.FirstOrDefault();
                    List <ClientSession> toBan = new List <ClientSession>();
                    if (client != null)
                    {
                        Group grp = client.Character?.Group;
                        if (grp == null)
                        {
                            return;
                        }
                        if (evt.MapInstance.InstanceBag.EndState == 1 && evt.MapInstance.Monsters.Any(s => s.IsBoss && !s.IsAlive))
                        {
                            foreach (ClientSession sess in grp.Characters.Replace(s => s.CurrentMapInstance.Monsters.Any(e => e.IsBoss)))
                            {
                                // TODO REMOTE THAT FOR PUBLIC RELEASE
                                if (grp.Characters.Count(s => s.IpAddress.Equals(sess.IpAddress)) > 2)
                                {
                                    toBan.Add(sess);
                                    continue;
                                }
                                if (grp.Raid?.GiftItems == null)
                                {
                                    continue;
                                }
                                if (grp.Raid.Reputation > 0)
                                {
                                    sess.Character.GetReput(grp.Raid.Reputation);
                                }
                                if (sess.Character.Dignity < 0)
                                {
                                    sess.Character.Dignity += 100;
                                }
                                else
                                {
                                    sess.Character.Dignity = 100;
                                }
                                if (sess.Character.Level > grp.Raid.LevelMaximum)
                                {
                                    // RAID CERTIFICATE
                                    sess.Character.GiftAdd(2320, 1);
                                }
                                else
                                {
                                    foreach (Gift gift in grp.Raid?.GiftItems)
                                    {
                                        sbyte rare = 0;
                                        if (gift.IsRandomRare)
                                        {
                                            rare = (sbyte)ServerManager.Instance.RandomNumber(-2, 7);
                                        }
                                        //TODO add random rarity for some object
                                        sess.Character.GiftAdd(gift.VNum, gift.Amount, gift.Design, rare: rare);
                                    }
                                }
                            }
                            // Remove monster when raid is over
                            foreach (MapMonster e in evt.MapInstance.Monsters.Where(s => !s.IsBoss))
                            {
                                evt.MapInstance.DespawnMonster(e.MonsterVNum);
                            }
                            evt.MapInstance.WaveEvents.Clear();

                            ServerManager.Instance.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(
                                                                 string.Format(Language.Instance.GetMessageFromKey("RAID_SUCCEED"), grp.Raid?.Label, grp.Characters.ElementAt(0).Character.Name), 0));

                            Observable.Timer(TimeSpan.FromSeconds(evt.MapInstance.InstanceBag.EndState == 1 ? 30 : 0)).Subscribe(obj =>
                            {
                                ClientSession[] grpmembers = new ClientSession[40];
                                grp.Characters.ToList().CopyTo(grpmembers);
                                List <MapInstance> mapinstances = new List <MapInstance>();
                                foreach (ClientSession targetSession in grpmembers)
                                {
                                    if (targetSession == null)
                                    {
                                        continue;
                                    }
                                    if (targetSession.Character.Hp <= 0)
                                    {
                                        targetSession.Character.Hp = 1;
                                        targetSession.Character.Mp = 1;
                                    }
                                    targetSession.SendPacket(targetSession.Character.GenerateRaidBf(evt.MapInstance.InstanceBag.EndState));
                                    targetSession.SendPacket(targetSession.Character.GenerateRaid(1, true));
                                    targetSession.SendPacket(targetSession.Character.GenerateRaid(2, true));
                                    if (!mapinstances.Any(s => s.MapInstanceId == targetSession?.CurrentMapInstance.MapInstanceId && s.MapInstanceType == MapInstanceType.RaidInstance))
                                    {
                                        mapinstances.Add(targetSession.CurrentMapInstance);
                                    }
                                    grp.LeaveGroup(targetSession);
                                }
                                ServerManager.Instance.GroupList.RemoveAll(s => s.GroupId == grp.GroupId);
                                ServerManager.Instance.GroupsThreadSafe.TryRemove(grp.GroupId, out Group _);
                                mapinstances.ForEach(s => s.Dispose());
                            });
                        }
                    }
                    break;
                }
                break;

            case EventActionType.MAPCLOCK:
                evt.MapInstance.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                evt.MapInstance.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                break;

            case EventActionType.STARTCLOCK:
                Tuple <List <EventContainer>, List <EventContainer> > eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                if (eve != null)
                {
                    evt.MapInstance.InstanceBag.Clock.StopEvents    = eve.Item2;
                    evt.MapInstance.InstanceBag.Clock.TimeoutEvents = eve.Item1;
                    evt.MapInstance.InstanceBag.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                }
                break;

            case EventActionType.TELEPORT:
                Tuple <short, short, short, short> tp = (Tuple <short, short, short, short>)evt.Parameter;
                List <Character> characters           = evt.MapInstance.GetCharactersInRange(tp.Item1, tp.Item2, 5).ToList();
                characters.ForEach(s =>
                {
                    s.PositionX = tp.Item3;
                    s.PositionY = tp.Item4;
                    evt.MapInstance?.Broadcast(s.Session, s.GenerateTp(), ReceiverType.Group);
                });
                break;

            case EventActionType.STOPCLOCK:
                evt.MapInstance.InstanceBag.Clock.StopClock();
                evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                break;

            case EventActionType.STARTMAPCLOCK:
                eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                if (eve != null)
                {
                    evt.MapInstance.Clock.StopEvents    = eve.Item2;
                    evt.MapInstance.Clock.TimeoutEvents = eve.Item1;
                    evt.MapInstance.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                }
                break;

            case EventActionType.STOPMAPCLOCK:
                evt.MapInstance.Clock.StopClock();
                evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                break;

            case EventActionType.SPAWNPORTAL:
                evt.MapInstance.CreatePortal((Portal)evt.Parameter);
                break;

            case EventActionType.REFRESHMAPITEMS:
                evt.MapInstance.MapClear();
                break;

            case EventActionType.NPCSEFFECTCHANGESTATE:
                evt.MapInstance.Npcs.ForEach(s => s.EffectActivated = (bool)evt.Parameter);
                break;

            case EventActionType.CHANGEPORTALTYPE:
                Tuple <int, PortalType> param = (Tuple <int, PortalType>)evt.Parameter;
                Portal portal = evt.MapInstance.Portals.FirstOrDefault(s => s.PortalId == param.Item1);
                if (portal != null)
                {
                    portal.Type = (short)param.Item2;
                }
                break;

            case EventActionType.CHANGEDROPRATE:
                evt.MapInstance.DropRate = (int)evt.Parameter;
                break;

            case EventActionType.CHANGEXPRATE:
                evt.MapInstance.XpRate = (int)evt.Parameter;
                break;

            case EventActionType.DISPOSEMAP:
                evt.MapInstance.Dispose();
                break;

            case EventActionType.SPAWNBUTTON:
                evt.MapInstance.SpawnButton((MapButton)evt.Parameter);
                break;

            case EventActionType.UNSPAWNMONSTERS:
                evt.MapInstance.DespawnMonster((int)evt.Parameter);
                break;

            case EventActionType.SPAWNMONSTERS:
                evt.MapInstance.SummonMonsters(((ConcurrentBag <MonsterToSummon>)evt.Parameter).ToList());
                break;

            case EventActionType.REFRESHRAIDGOAL:
                ClientSession cl = evt.MapInstance.Sessions.FirstOrDefault();
                if (cl?.Character != null)
                {
                    ServerManager.Instance.Broadcast(cl, cl.Character?.Group?.GeneraterRaidmbf(), ReceiverType.Group);
                    ServerManager.Instance.Broadcast(cl, UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEW_MISSION"), 0), ReceiverType.Group);
                }
                break;

            case EventActionType.SPAWNNPCS:
                evt.MapInstance.SummonNpcs((List <NpcToSummon>)evt.Parameter);
                break;

            case EventActionType.DROPITEMS:
                evt.MapInstance.DropItems((List <Tuple <short, int, short, short> >)evt.Parameter);
                break;

            case EventActionType.THROWITEMS:
                Tuple <int, short, byte, int, int> parameters = (Tuple <int, short, byte, int, int>)evt.Parameter;
                if (monster != null)
                {
                    parameters = new Tuple <int, short, byte, int, int>(monster.MapMonsterId, parameters.Item2, parameters.Item3, parameters.Item4, parameters.Item5);
                }
                evt.MapInstance.ThrowItems(parameters);
                break;

            case EventActionType.SPAWNONLASTENTRY:
                Character lastincharacter = evt.MapInstance.Sessions.OrderByDescending(s => s.RegisterTime).FirstOrDefault()?.Character;
                List <MonsterToSummon> summonParameters = new List <MonsterToSummon>();
                MapCell hornSpawn = new MapCell
                {
                    X = lastincharacter?.PositionX ?? 154,
                    Y = lastincharacter?.PositionY ?? 140
                };
                long hornTarget = lastincharacter?.CharacterId ?? -1;
                summonParameters.Add(new MonsterToSummon(Convert.ToInt16(evt.Parameter), hornSpawn, hornTarget, true));
                evt.MapInstance.SummonMonsters(summonParameters);
                break;

                #endregion
            }
        }
コード例 #19
0
        /// <summary>
        ///     Run Event
        /// </summary>
        /// <param name="evt">Event Container</param>
        /// <param name="session">Character Session that run the event</param>
        /// <param name="monster">Monster that run the event</param>
        public void RunEvent(EventContainer evt, ClientSession session = null, MapMonster monster = null)
        {
            if (session != null)
            {
                evt.MapInstance = session.CurrentMapInstance;
                switch (evt.EventActionType)
                {
                    #region EventForUser

                case EventActionType.NPCDIALOG:
                    session.SendPacket(session.Character.GenerateNpcDialog((int)evt.Parameter));
                    break;

                case EventActionType.SENDPACKET:
                    session.SendPacket((string)evt.Parameter);
                    break;

                    #endregion
                }
            }

            if (evt.MapInstance == null)
            {
                return;
            }

            switch (evt.EventActionType)
            {
                #region EventForUser

            case EventActionType.NPCDIALOG:
            case EventActionType.SENDPACKET:
                if (session == null)
                {
                    evt.MapInstance.Sessions.ToList().ForEach(e => { RunEvent(evt, e); });
                }

                break;

                #endregion

                #region MapInstanceEvent

            case EventActionType.REGISTEREVENT:
                Tuple <string, ConcurrentBag <EventContainer> > even =
                    (Tuple <string, ConcurrentBag <EventContainer> >)evt.Parameter;
                switch (even.Item1)
                {
                case "OnCharacterDiscoveringMap":
                    even.Item2.ToList().ForEach(s =>
                                                evt.MapInstance.OnCharacterDiscoveringMapEvents.Add(
                                                    new Tuple <EventContainer, List <long> >(s, new List <long>())));
                    break;

                case "OnMoveOnMap":
                    even.Item2.ToList().ForEach(s => evt.MapInstance.OnMoveOnMapEvents.Add(s));
                    break;

                case "OnMapClean":
                    even.Item2.ToList().ForEach(s => evt.MapInstance.OnMapClean.Add(s));
                    break;

                case "OnLockerOpen":
                    if (evt.MapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                    {
                        even.Item2.ToList().ForEach(s => evt.MapInstance.UnlockEvents.Add(s));
                        break;
                    }

                    even.Item2.ToList().ForEach(s => evt.MapInstance.InstanceBag.UnlockEvents.Add(s));
                    break;
                }

                break;

            case EventActionType.REGISTERWAVE:
                evt.MapInstance.WaveEvents.Add((EventWave)evt.Parameter);
                break;

            case EventActionType.SETAREAENTRY:
                var even2 = (ZoneEvent)evt.Parameter;
                evt.MapInstance.OnAreaEntryEvents.Add(even2);
                break;

            case EventActionType.REMOVEMONSTERLOCKER:
                session = evt.MapInstance.Sessions.FirstOrDefault();
                if (evt.MapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                {
                    if (evt.MapInstance.MonsterLocker.Current > 0)
                    {
                        evt.MapInstance.MonsterLocker.Current--;
                    }

                    if (evt.MapInstance.MonsterLocker.Current == 0 && evt.MapInstance.ButtonLocker.Current == 0)
                    {
                        foreach (EventContainer s in evt.MapInstance.UnlockEvents)
                        {
                            RunEvent(s);
                        }

                        evt.MapInstance.UnlockEvents.Clear();
                    }

                    evt.MapInstance.Broadcast(session?.Character?.Group?.GeneraterRaidmbf(evt.MapInstance));
                    break;
                }

                if (evt.MapInstance.InstanceBag.MonsterLocker.Current > 0)
                {
                    evt.MapInstance.InstanceBag.MonsterLocker.Current--;
                }

                if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 &&
                    evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                {
                    evt.MapInstance.InstanceBag.UnlockEvents.ToList().ForEach(s => RunEvent(s));
                    evt.MapInstance.InstanceBag.UnlockEvents.Clear();
                }

                break;

            case EventActionType.REMOVEBUTTONLOCKER:
                session = evt.MapInstance.Sessions.FirstOrDefault();
                if (evt.MapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                {
                    if (evt.MapInstance.ButtonLocker.Current > 0)
                    {
                        evt.MapInstance.ButtonLocker.Current--;
                    }

                    if (evt.MapInstance.MonsterLocker.Current == 0 && evt.MapInstance.ButtonLocker.Current == 0)
                    {
                        evt.MapInstance.UnlockEvents.ToList().ForEach(s => RunEvent(s));
                        evt.MapInstance.UnlockEvents.Clear();
                    }

                    evt.MapInstance.Broadcast(session?.Character?.Group?.GeneraterRaidmbf(evt.MapInstance));
                    break;
                }

                if (evt.MapInstance.InstanceBag.ButtonLocker.Current > 0)
                {
                    evt.MapInstance.InstanceBag.ButtonLocker.Current--;
                }

                if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 &&
                    evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                {
                    evt.MapInstance.InstanceBag.UnlockEvents.ToList().ForEach(s => RunEvent(s));
                    evt.MapInstance.InstanceBag.UnlockEvents.Clear();
                }

                break;

            case EventActionType.EFFECT:
                short evt3 = (short)evt.Parameter;
                if (monster != null && (DateTime.Now - monster.LastEffect).TotalSeconds >= 5)
                {
                    evt.MapInstance.Broadcast(monster.GenerateEff(evt3));
                    monster.ShowEffect();
                }

                break;

            case EventActionType.INSTANTBATLLEREWARDS:
                RunEvent(new EventContainer(evt.MapInstance, EventActionType.SPAWNPORTAL,
                                            new Portal {
                    SourceX = 47, SourceY = 33, DestinationMapId = 1
                }));
                evt.MapInstance.Broadcast(
                    UserInterfaceHelper.Instance.GenerateMsg(
                        Language.Instance.GetMessageFromKey("INSTANTBATTLE_SUCCEEDED"), 0));
                Parallel.ForEach(evt.MapInstance.Sessions.Where(s => s.Character != null), cli =>
                {
                    cli.Character.GetReput(cli.Character.Level * 50, true);
                    cli.Character.GetGold(cli.Character.Level * 1000);
                    cli.Character.SpAdditionPoint += cli.Character.Level * 100;
                    cli.Character.SpAdditionPoint  = cli.Character.SpAdditionPoint > 1000000
                            ? 1000000
                            : cli.Character.SpAdditionPoint;
                    cli.SendPacket(cli.Character.GenerateSpPoint());
                    cli.SendPacket(cli.Character.GenerateGold());
                    cli.SendPacket(cli.Character.GenerateSay(
                                       string.Format(Language.Instance.GetMessageFromKey("WIN_SP_POINT"),
                                                     cli.Character.Level * 100), 10));
                });
                break;

            case EventActionType.CONTROLEMONSTERINRANGE:
                if (monster != null)
                {
                    Tuple <short, byte, ConcurrentBag <EventContainer> > evnt =
                        (Tuple <short, byte, ConcurrentBag <EventContainer> >)evt.Parameter;
                    List <MapMonster> mapMonsters =
                        evt.MapInstance.GetListMonsterInRange(monster.MapX, monster.MapY, evnt.Item2);
                    if (evnt.Item1 != 0)
                    {
                        mapMonsters.RemoveAll(s => s.MonsterVNum != evnt.Item1);
                    }

                    mapMonsters.ForEach(s => evnt.Item3.ToList().ForEach(e => RunEvent(e, monster: s)));
                }

                break;

            case EventActionType.ONTARGET:
                if (monster?.MoveEvent != null && monster.MoveEvent.InZone(monster.MapX, monster.MapY))
                {
                    monster.MoveEvent = null;
                    monster.Path      = null;
                    foreach (EventContainer s in (ConcurrentBag <EventContainer>)evt.Parameter)
                    {
                        RunEvent(s, monster: monster);
                    }
                }

                break;

            case EventActionType.MOVE:
                var evt4 = (ZoneEvent)evt.Parameter;
                if (monster != null)
                {
                    monster.MoveEvent = evt4;
                    monster.Path      = BestFirstSearch.FindPath(new Node {
                        X = monster.MapX, Y = monster.MapY
                    },
                                                                 new Node {
                        X = evt4.X, Y = evt4.Y
                    }, evt.MapInstance?.Map.Grid);
                }

                break;

            case EventActionType.CLOCK:
                evt.MapInstance.InstanceBag.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                evt.MapInstance.InstanceBag.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                break;

            case EventActionType.SETMONSTERLOCKERS:
                if (evt.MapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                {
                    evt.MapInstance.MonsterLocker.Current = Convert.ToByte(evt.Parameter);
                    evt.MapInstance.MonsterLocker.Initial = Convert.ToByte(evt.Parameter);
                    break;
                }

                evt.MapInstance.InstanceBag.MonsterLocker.Current = Convert.ToByte(evt.Parameter);
                evt.MapInstance.InstanceBag.MonsterLocker.Initial = Convert.ToByte(evt.Parameter);
                break;

            case EventActionType.SETBUTTONLOCKERS:
                if (evt.MapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                {
                    evt.MapInstance.ButtonLocker.Current = Convert.ToByte(evt.Parameter);
                    evt.MapInstance.ButtonLocker.Initial = Convert.ToByte(evt.Parameter);
                    break;
                }

                evt.MapInstance.InstanceBag.ButtonLocker.Current = Convert.ToByte(evt.Parameter);
                evt.MapInstance.InstanceBag.ButtonLocker.Initial = Convert.ToByte(evt.Parameter);
                break;

            case EventActionType.SCRIPTEND:
                ClientSession client = evt.MapInstance.Sessions.FirstOrDefault();
                if (client == null)
                {
                    return;
                }

                switch (evt.MapInstance.MapInstanceType)
                {
                case MapInstanceType.TimeSpaceInstance:
                    evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                    Guid mapInstanceId =
                        ServerManager.Instance.GetBaseMapInstanceIdByMapId(client.Character.MapId);
                    MapInstance      map = ServerManager.Instance.GetMapInstance(mapInstanceId);
                    ScriptedInstance si  = map?.ScriptedInstances?.FirstOrDefault(s =>
                                                                                  s.PositionX == client.Character.MapX && s.PositionY == client.Character.MapY);
                    if (si == null)
                    {
                        return;
                    }

                    byte penalty = (byte)(client.Character.Level - si.LevelMinimum > 50
                                ? 100
                                : (client.Character.Level - si.LevelMinimum) * 2);
                    if (penalty > 0)
                    {
                        client.SendPacket(client.Character.GenerateSay(
                                              string.Format(Language.Instance.GetMessageFromKey("TS_PENALTY"), penalty), 10));
                    }

                    int    point      = evt.MapInstance.InstanceBag.Point * (100 - penalty) / 100;
                    string perfection =
                        $"{(evt.MapInstance.InstanceBag.MonstersKilled >= si.MonsterAmount ? 1 : 0)}{(evt.MapInstance.InstanceBag.NpcsKilled == 0 ? 1 : 0)}{(evt.MapInstance.InstanceBag.RoomsVisited >= si.RoomAmount ? 1 : 0)}";
                    evt.MapInstance.Broadcast(
                        $"score  {evt.MapInstance.InstanceBag.EndState} {point} 27 47 18 {si.DrawItems.Count} {evt.MapInstance.InstanceBag.MonstersKilled} {si.NpcAmount - evt.MapInstance.InstanceBag.NpcsKilled} {evt.MapInstance.InstanceBag.RoomsVisited} {perfection} 1 1");
                    break;

                case MapInstanceType.RaidInstance:
                    evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;

                    if (client.Character?.Family?.Act4Raid?.Maps?.FirstOrDefault(m =>
                                                                                 m != client.Character?.Family?.Act4Raid?.FirstMap) ==
                        evt.MapInstance)         // Act 4 raids
                    {
                        ScriptedInstance instance = client.Character?.Family?.Act4Raid;
                        if (instance?.FirstMap == null)
                        {
                            return;
                        }

                        Instance.RunEvent(new EventContainer(instance.FirstMap, EventActionType.REMOVEPORTAL,
                                                             instance.FirstMap.Portals.FirstOrDefault(port =>
                                                                                                      port.DestinationMapInstanceId == client.CurrentMapInstance.MapInstanceId)));
                        Instance.ScheduleEvent(TimeSpan.FromSeconds(5),
                                               new EventContainer(evt.MapInstance, EventActionType.SENDPACKET,
                                                                  UserInterfaceHelper.Instance.GenerateMsg(
                                                                      string.Format(Language.Instance.GetMessageFromKey("TELEPORTED_IN"), 10),
                                                                      0)));
                        foreach (ClientSession cli in evt.MapInstance.Sessions)
                        {
                            if (DaoFactory.RaidLogDao.LoadByFamilyId(cli.Character.Family.FamilyId).Any(s =>
                                                                                                        s.RaidId == instance.Id && s.Time.AddHours(24) <= DateTime.Now))
                            {
                                // Raid has not been done in the last 24 hours
                                cli.Character.GenerateFamilyXp(instance.Fxp / evt.MapInstance.Sessions.Count());
                            }
                            else
                            {
                                // Raid has already been done in the last 24 hours
                                cli.Character.GenerateFamilyXp(
                                    instance.Fxp / 5 / evt.MapInstance.Sessions.Count());
                            }

                            cli.SendPacket(cli.Character.GenerateSay(
                                               string.Format(Language.Instance.GetMessageFromKey("FXP_INCREASE"),
                                                             instance.Fxp), 11));
                            cli.Character.IncrementQuests(QuestType.WinRaid, instance.Id);
                            if (evt.MapInstance.Sessions.Count(s => s.IpAddress.Equals(cli.IpAddress)) > 2 ||
                                instance.GiftItems == null)
                            {
                                continue;
                            }

                            foreach (Gift gift in instance.GiftItems)
                            {
                                sbyte rare = (sbyte)(gift.IsRandomRare
                                            ? ServerManager.Instance.RandomNumber()
                                            : 0);
                                if (rare > 90)
                                {
                                    rare = 7;
                                }
                                else if (rare > 80)
                                {
                                    rare = 6;
                                }
                                else
                                {
                                    rare = (sbyte)(gift.IsRandomRare
                                                ? ServerManager.Instance.RandomNumber(1, 6)
                                                : 0);
                                }

                                if (cli.Character.Level >= instance.LevelMinimum)
                                {
                                    cli.Character.GiftAdd(gift.VNum, gift.Amount, gift.Design, rare: rare);
                                }
                            }
                        }

                        LogHelper.Instance.InsertFamilyRaidLog(
                            evt.MapInstance.Sessions.FirstOrDefault(s => s.Character.Family != null).Character
                            .Family.FamilyId, instance.Id,
                            DateTime.Now);

                        Observable.Timer(TimeSpan.FromSeconds(15)).Subscribe(s =>
                        {
                            evt.MapInstance.Sessions.ToList().ForEach(cli =>
                                                                      ServerManager.Instance.ChangeMapInstance(cli.Character.CharacterId,
                                                                                                               instance.FirstMap.MapInstanceId, instance.StartX, instance.StartY));
                        });
                        return;
                    }

                    // Raids
                    Group grp = client.Character?.Group;
                    if (grp == null)
                    {
                        return;
                    }

                    if (evt.MapInstance.InstanceBag.EndState == 1 &&
                        evt.MapInstance.Monsters.Any(s => s.IsBoss && !s.IsAlive))
                    {
                        foreach (ClientSession sess in grp.Characters.Where(s =>
                                                                            s.CurrentMapInstance?.Monsters.Any(e => e.IsBoss) == true))
                        {
                            // TODO REMOTE THAT FOR PUBLIC RELEASE
                            if (grp.Characters.Count(s => s.IpAddress.Equals(sess.IpAddress)) > 2 ||
                                grp.Raid?.GiftItems == null)
                            {
                                continue;
                            }

                            if (grp.Raid.Reputation > 0 && sess.Character.Level > grp.Raid.LevelMinimum)
                            {
                                sess.Character.GetReput(grp.Raid.Reputation, true);
                            }

                            sess.Character.Dignity =
                                sess.Character.Dignity < 0 ? sess.Character.Dignity + 100 : 100;

                            if (sess.Character.Level > grp.Raid.LevelMaximum)
                            {
                                sess.Character.GiftAdd(2320, 1);         // RAID CERTIFICATE
                                continue;
                            }

                            if (grp.Raid?.GiftItems == null)
                            {
                                continue;
                            }

                            foreach (Gift gift in grp.Raid.GiftItems)
                            {
                                sbyte rare;
                                if (gift.IsHeroic)
                                {
                                    rare = (sbyte)(gift.IsRandomRare ? ServerManager.Instance.RandomNumber(-2, 9) : 0);
                                }
                                else
                                {
                                    rare = (sbyte)(gift.IsRandomRare ? ServerManager.Instance.RandomNumber(-2, 8) : 0);
                                }

                                if (sess.Character.Level >= grp.Raid.LevelMinimum)
                                {
                                    sess.Character.GiftAdd(gift.VNum, gift.Amount, gift.Design, rare: rare);
                                }
                            }

                            if (DaoFactory.RaidLogDao.LoadByCharacterId(sess.Character.CharacterId).Any(s =>
                                                                                                        s.RaidId == grp.Raid.Id && s.Time.AddHours(24) >= DateTime.Now) ||
                                sess.Character.Family == null)
                            {
                                continue;
                            }

                            LogHelper.Instance.InsertRaidLog(sess.Character.CharacterId, grp.Raid.Id,
                                                             DateTime.Now);
                            sess.Character.GenerateFamilyXp(grp.Raid.Fxp);
                            sess.SendPacket(sess.Character.GenerateSay(
                                                string.Format(Language.Instance.GetMessageFromKey("FXP_INCREASE"),
                                                              grp.Raid.Fxp), 11));
                        }

                        // Remove monster when raid is over
                        evt.MapInstance.Monsters.Where(s => !s.IsBoss).ToList()
                        .ForEach(m => evt.MapInstance.DespawnMonster(m));
                        evt.MapInstance.WaveEvents.Clear();

                        ServerManager.Instance.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(
                                                             string.Format(Language.Instance.GetMessageFromKey("RAID_SUCCEED"), grp.Raid?.Label,
                                                                           grp.Characters.ElementAt(0).Character.Name), 0));
                    }

                    Observable.Timer(TimeSpan.FromSeconds(evt.MapInstance.InstanceBag.EndState == 1 ? 30 : 0))
                    .Subscribe(obj =>
                    {
                        ClientSession[] grpmembers = new ClientSession[40];
                        grp.Characters.ToList().CopyTo(grpmembers);
                        foreach (ClientSession targetSession in grpmembers)
                        {
                            if (targetSession == null)
                            {
                                continue;
                            }

                            if (targetSession.Character.Hp <= 0)
                            {
                                targetSession.Character.Hp = 1;
                                targetSession.Character.Mp = 1;
                            }

                            targetSession.SendPacket(
                                targetSession.Character.GenerateRaidBf(evt.MapInstance.InstanceBag
                                                                       .EndState));
                            targetSession.SendPacket(targetSession.Character.GenerateRaid(1, true));
                            targetSession.SendPacket(targetSession.Character.GenerateRaid(2, true));
                            grp.LeaveGroup(targetSession);
                        }

                        ServerManager.Instance.GroupList.RemoveAll(s => s.GroupId == grp.GroupId);
                        ServerManager.Instance._groups.TryRemove(grp.GroupId, out Group _);
                        grp.Raid.MapInstanceDictionary.Values.ToList().ForEach(m => m.Dispose());
                    });
                    break;

                case MapInstanceType.CaligorInstance:
                    FactionType winningFaction = Caligor.AngelDamage > Caligor.DemonDamage
                                ? FactionType.Angel
                                : FactionType.Demon;

                    foreach (ClientSession player in evt.MapInstance.Sessions)
                    {
                        if (player == null)
                        {
                            continue;
                        }

                        if (Caligor.RaidTime > 2400)
                        {
                            player.Character.GiftAdd(
                                player.Character.Faction == winningFaction ? (short)5960 : (short)5961, 1);
                        }
                        else
                        {
                            player.Character.GiftAdd(
                                player.Character.Faction == winningFaction ? (short)5961 : (short)5958, 1);
                        }

                        player.Character.GiftAdd(5959, 1);
                        player.Character.GenerateFamilyXp(500);
                    }

                    break;
                }

                break;

            case EventActionType.MAPCLOCK:
                evt.MapInstance.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                evt.MapInstance.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                break;

            case EventActionType.STARTCLOCK:
                Tuple <ConcurrentBag <EventContainer>, ConcurrentBag <EventContainer> > eve =
                    (Tuple <ConcurrentBag <EventContainer>, ConcurrentBag <EventContainer> >)evt.Parameter;
                if (eve != null)
                {
                    evt.MapInstance.InstanceBag.Clock.StopEvents    = eve.Item2.ToList();
                    evt.MapInstance.InstanceBag.Clock.TimeoutEvents = eve.Item1.ToList();
                    evt.MapInstance.InstanceBag.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                }

                break;

            case EventActionType.TELEPORT:
                Tuple <short, short, short, short> tp = (Tuple <short, short, short, short>)evt.Parameter;
                List <Character> characters           = evt.MapInstance.GetCharactersInRange(tp.Item1, tp.Item2, 5).ToList();
                characters.ForEach(s =>
                {
                    s.PositionX = tp.Item3;
                    s.PositionY = tp.Item4;
                    evt.MapInstance?.Broadcast(s.Session, s.GenerateTp(), ReceiverType.Group);
                });
                break;

            case EventActionType.STOPCLOCK:
                evt.MapInstance.InstanceBag.Clock.StopClock();
                evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                break;

            case EventActionType.STARTMAPCLOCK:
                eve = (Tuple <ConcurrentBag <EventContainer>, ConcurrentBag <EventContainer> >)evt.Parameter;
                if (eve != null)
                {
                    evt.MapInstance.Clock.StopEvents    = eve.Item2.ToList();
                    evt.MapInstance.Clock.TimeoutEvents = eve.Item1.ToList();
                    evt.MapInstance.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                }

                break;

            case EventActionType.STOPMAPCLOCK:
                evt.MapInstance.Clock.StopClock();
                evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                break;

            case EventActionType.SPAWNPORTAL:
                evt.MapInstance.CreatePortal((Portal)evt.Parameter);
                break;

            case EventActionType.REFRESHMAPITEMS:
                evt.MapInstance.MapClear();
                break;

            case EventActionType.NPCSEFFECTCHANGESTATE:
                evt.MapInstance.Npcs.ForEach(s => s.EffectActivated = (bool)evt.Parameter);
                break;

            case EventActionType.CHANGEPORTALTYPE:
                Tuple <int, PortalType> param = (Tuple <int, PortalType>)evt.Parameter;
                Portal portal = evt.MapInstance.Portals.FirstOrDefault(s => s.PortalId == param.Item1);
                if (portal != null)
                {
                    portal.Type = (short)param.Item2;
                }

                break;

            case EventActionType.CHANGEDROPRATE:
                evt.MapInstance.DropRate = (int)evt.Parameter;
                break;

            case EventActionType.CHANGEXPRATE:
                evt.MapInstance.XpRate = (int)evt.Parameter;
                break;

            case EventActionType.DISPOSEMAP:
                evt.MapInstance.Dispose();
                break;

            case EventActionType.SPAWNBUTTON:
                evt.MapInstance.SpawnButton((MapButton)evt.Parameter);
                break;

            case EventActionType.UNSPAWNMONSTERS:
                evt.MapInstance.DespawnMonster((int)evt.Parameter);
                break;

            case EventActionType.SPAWNMONSTERS:
                evt.MapInstance.SummonMonsters(((ConcurrentBag <ToSummon>)evt.Parameter).ToList());
                break;

            case EventActionType.REFRESHRAIDGOAL:
                ClientSession cl = evt.MapInstance.Sessions.FirstOrDefault();
                if (cl?.Character != null)
                {
                    evt.MapInstance.Broadcast(cl.Character?.Group?.GeneraterRaidmbf(evt.MapInstance));
                    ServerManager.Instance.Broadcast(cl,
                                                     UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEW_MISSION"),
                                                                                              0), ReceiverType.Group);
                }

                break;

            case EventActionType.SPAWNNPCS:
                evt.MapInstance.SummonNpcs((List <ToSummon>)evt.Parameter);
                break;

            case EventActionType.DROPITEMS:
                evt.MapInstance.DropItems((List <Tuple <short, int, short, short> >)evt.Parameter);
                break;

            case EventActionType.THROWITEMS:
                Tuple <int, short, byte, int, int> parameters = (Tuple <int, short, byte, int, int>)evt.Parameter;
                if (monster != null)
                {
                    parameters = new Tuple <int, short, byte, int, int>(monster.MapMonsterId, parameters.Item2,
                                                                        parameters.Item3, parameters.Item4, parameters.Item5);
                }

                evt.MapInstance.ThrowItems(parameters);
                break;

            case EventActionType.SPAWNONLASTENTRY:
                Character lastincharacter = evt.MapInstance.Sessions.OrderByDescending(s => s.RegisterTime)
                                            .FirstOrDefault()?.Character;
                List <ToSummon> summonParameters = new List <ToSummon>();
                var             hornSpawn        = new MapCell
                {
                    X = lastincharacter?.PositionX ?? 154,
                    Y = lastincharacter?.PositionY ?? 140
                };
                summonParameters.Add(new ToSummon(Convert.ToInt16(evt.Parameter), hornSpawn, lastincharacter,
                                                  true));
                evt.MapInstance.SummonMonsters(summonParameters);
                break;

            case EventActionType.REMOVEPORTAL:
                Portal portalToRemove = evt.Parameter is Portal p
                        ? evt.MapInstance.Portals.FirstOrDefault(s => s == p)
                        : evt.MapInstance.Portals.FirstOrDefault(s => s.PortalId == (int)evt.Parameter);

                if (portalToRemove == null)
                {
                    return;
                }

                evt.MapInstance.Portals.Remove(portalToRemove);
                evt.MapInstance.MapClear();
                break;

            case EventActionType.ACT4RAIDEND:
                // tp // tp X // tp Y
                Tuple <MapInstance, short, short> endParameters = (Tuple <MapInstance, short, short>)evt.Parameter;
                Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(a =>
                {
                    evt.MapInstance.Broadcast(
                        $"{UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("TELEPORTED_IN"), 10), 0)}");

                    Observable.Timer(TimeSpan.FromSeconds(10)).Subscribe(s =>
                    {
                        evt.MapInstance.Sessions.ToList().ForEach(cli =>
                                                                  ServerManager.Instance.ChangeMapInstance(cli.Character.CharacterId,
                                                                                                           endParameters.Item1.MapInstanceId, endParameters.Item2, endParameters.Item3));
                    });
                });
                break;

            case EventActionType.CLEARMAPMONSTERS:
                evt.MapInstance.Monsters.ForEach(m => evt.MapInstance.DespawnMonster(m));
                break;

            case EventActionType.STARTACT4RAID:
                Tuple <byte, byte> raidParameters = (Tuple <byte, byte>)evt.Parameter;
                PercentBar         stat           = raidParameters.Item2 == (byte)FactionType.Angel
                        ? ServerManager.Instance.Act4AngelStat
                        : ServerManager.Instance.Act4DemonStat;
                stat.Mode      = 3;
                stat.TotalTime = 3600;
                Act4Raid.Instance.GenerateRaid(raidParameters.Item1, raidParameters.Item2);
                switch ((Act4RaidType)raidParameters.Item1)
                {
                case Act4RaidType.Morcos:
                    stat.IsMorcos = true;
                    break;

                case Act4RaidType.Hatus:
                    stat.IsHatus = true;
                    break;

                case Act4RaidType.Calvina:
                    stat.IsCalvina = true;
                    break;

                case Act4RaidType.Berios:
                    stat.IsBerios = true;
                    break;
                }

                break;

            case EventActionType.ONTIMEELAPSED:
                Tuple <int, ConcurrentBag <EventContainer> > timeElapsedEvts =
                    (Tuple <int, ConcurrentBag <EventContainer> >)evt.Parameter;
                Observable.Timer(TimeSpan.FromSeconds(timeElapsedEvts.Item1)).Subscribe(e => { timeElapsedEvts.Item2.ToList().ForEach(ev => RunEvent(ev)); });
                break;

                #endregion
            }
        }
コード例 #20
0
        public void RunEvent(EventContainer evt, ClientSession session = null)
        {
            if (session != null)
            {
                evt.MapInstance = session.CurrentMapInstance;
                switch (evt.EventActionType)
                {
                    #region EventForUser

                case EventActionType.NPCDIALOG:
                    session.SendPacket(session.Character.GenerateNpcDialog((int)evt.Parameter));
                    break;

                case EventActionType.SENDPACKET:
                    session.SendPacket((string)evt.Parameter);
                    break;

                    #endregion
                }
            }
            if (evt.MapInstance != null)
            {
                switch (evt.EventActionType)
                {
                    #region EventForUser

                case EventActionType.NPCDIALOG:
                case EventActionType.SENDPACKET:
                    if (session == null)
                    {
                        evt.MapInstance.Sessions.ToList().ForEach(e =>
                        {
                            RunEvent(evt, e);
                        });
                    }
                    break;

                    #endregion

                    #region MapInstanceEvent

                case EventActionType.REGISTEREVENT:
                    Tuple <string, List <EventContainer> > even = (Tuple <string, List <EventContainer> >)evt.Parameter;
                    switch (even.Item1)
                    {
                    case "OnCharacterDiscoveringMap":
                        even.Item2.ForEach(s => evt.MapInstance.OnCharacterDiscoveringMapEvents.Add(new Tuple <EventContainer, List <long> >(s, new List <long>())));
                        break;

                    case "OnMoveOnMap":
                        evt.MapInstance.OnMoveOnMapEvents.AddRange(even.Item2);
                        break;

                    case "OnMapClean":
                        evt.MapInstance.OnMapClean.AddRange(even.Item2);
                        break;

                    case "OnLockerOpen":
                        evt.MapInstance.InstanceBag.UnlockEvents.AddRange(even.Item2);
                        break;
                    }
                    break;

                case EventActionType.REMOVEMONSTERLOCKER:
                    EventContainer evt2 = (EventContainer)evt.Parameter;
                    evt.MapInstance.InstanceBag.MonsterLocker.Current--;
                    if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                    {
                        evt.MapInstance.InstanceBag.UnlockEvents.ForEach(s => RunEvent(s));
                        evt.MapInstance.InstanceBag.UnlockEvents.RemoveAll(s => s != null);
                    }
                    break;

                case EventActionType.REMOVEBUTTONLOCKER:
                    evt2 = (EventContainer)evt.Parameter;
                    evt.MapInstance.InstanceBag.ButtonLocker.Current--;
                    if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                    {
                        evt.MapInstance.InstanceBag.UnlockEvents.ForEach(s => RunEvent(s));
                        evt.MapInstance.InstanceBag.UnlockEvents.RemoveAll(s => s != null);
                    }
                    break;

                case EventActionType.CLOCK:
                    evt.MapInstance.InstanceBag.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                    evt.MapInstance.InstanceBag.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                    break;

                case EventActionType.SETMONSTERLOCKERS:
                    evt.MapInstance.InstanceBag.MonsterLocker.Current = Convert.ToByte(evt.Parameter);
                    evt.MapInstance.InstanceBag.MonsterLocker.Initial = Convert.ToByte(evt.Parameter);
                    break;

                case EventActionType.SETBUTTONLOCKERS:
                    evt.MapInstance.InstanceBag.ButtonLocker.Current = Convert.ToByte(evt.Parameter);
                    evt.MapInstance.InstanceBag.ButtonLocker.Initial = Convert.ToByte(evt.Parameter);
                    break;

                case EventActionType.SCRIPTEND:
                    switch (evt.MapInstance.MapInstanceType)
                    {
                    case MapInstanceType.TimeSpaceInstance:
                        evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                        ClientSession client = evt.MapInstance.Sessions.FirstOrDefault();
                        if (client != null)
                        {
                            Guid             MapInstanceId = ServerManager.Instance.GetBaseMapInstanceIdByMapId(client.Character.MapId);
                            MapInstance      map           = ServerManager.Instance.GetMapInstance(MapInstanceId);
                            ScriptedInstance si            = map.ScriptedInstances.FirstOrDefault(s => s.PositionX == client.Character.MapX && s.PositionY == client.Character.MapY);
                            byte             penalty       = 0;
                            if (penalty > (client.Character.Level - si.LevelMinimum) * 2)
                            {
                                penalty = penalty > 100 ? (byte)100 : penalty;
                                client.SendPacket(client.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("TS_PENALTY"), penalty), 10));
                            }
                            int    point      = evt.MapInstance.InstanceBag.Point * (100 - penalty) / 100;
                            string perfection = string.Empty;
                            perfection += evt.MapInstance.InstanceBag.MonstersKilled >= si.MonsterAmount ? 1 : 0;
                            perfection += evt.MapInstance.InstanceBag.NpcsKilled == 0 ? 1 : 0;
                            perfection += evt.MapInstance.InstanceBag.RoomsVisited >= si.RoomAmount ? 1 : 0;

                            evt.MapInstance.Broadcast($"score  {evt.MapInstance.InstanceBag.EndState} {point} 27 47 18 {si.DrawItems.Count()} {evt.MapInstance.InstanceBag.MonstersKilled} { si.NpcAmount - evt.MapInstance.InstanceBag.NpcsKilled} {evt.MapInstance.InstanceBag.RoomsVisited} {perfection} 1 1");
                        }
                        break;

                    case MapInstanceType.RaidInstance:
                        evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                        client = evt.MapInstance.Sessions.FirstOrDefault();
                        if (client != null)
                        {
                            Group grp = client?.Character?.Group;
                            if (grp == null)
                            {
                                return;
                            }
                            if (evt.MapInstance.InstanceBag.EndState == 1)
                            {
                                foreach (ClientSession sess in grp.Characters)
                                {
                                    foreach (Gift gift in grp?.Raid?.GiftItems)
                                    {
                                        byte rare = 0;
                                        if (gift.IsRandomRare)
                                        {
                                            rare = (byte)ServerManager.Instance.RandomNumber(0, 7);
                                        }
                                        //TODO add random rarity for some object
                                        sess.Character.GiftAdd(gift.VNum, gift.Amount, rare, gift.Design);
                                    }
                                }
                                ServerManager.Instance.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("RAID_SUCCEED"), grp?.Raid?.Label, grp.Characters.ElementAt(0).Character.Name), 0));
                            }

                            Observable.Timer(TimeSpan.FromSeconds(evt.MapInstance.InstanceBag.EndState == 1 ? 30 : 0)).Subscribe(o =>
                            {
                                ClientSession[] grpmembers = new ClientSession[40];
                                grp.Characters.CopyTo(grpmembers);
                                foreach (ClientSession targetSession in grpmembers)
                                {
                                    if (targetSession != null)
                                    {
                                        if (targetSession.Character.Hp <= 0)
                                        {
                                            targetSession.Character.Hp = 1;
                                            targetSession.Character.Mp = 1;
                                        }
                                        targetSession.SendPacket(targetSession.Character.GenerateRaidBf(evt.MapInstance.InstanceBag.EndState));
                                        targetSession.SendPacket(targetSession.Character.GenerateRaid(1, true));
                                        targetSession.SendPacket(targetSession.Character.GenerateRaid(2, true));
                                        grp.LeaveGroup(targetSession);
                                    }
                                }
                                ServerManager.Instance.GroupList.RemoveAll(s => s.GroupId == grp.GroupId);
                                ServerManager.Instance.GroupsThreadSafe.Remove(grp.GroupId);
                                evt.MapInstance.Dispose();
                            });
                        }
                        break;
                    }
                    break;

                case EventActionType.MAPCLOCK:
                    evt.MapInstance.Clock.BasesSecondRemaining = Convert.ToInt32(evt.Parameter);
                    evt.MapInstance.Clock.DeciSecondRemaining  = Convert.ToInt32(evt.Parameter);
                    break;

                case EventActionType.STARTCLOCK:
                    Tuple <List <EventContainer>, List <EventContainer> > eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                    evt.MapInstance.InstanceBag.Clock.StopEvents    = eve.Item2;
                    evt.MapInstance.InstanceBag.Clock.TimeoutEvents = eve.Item1;
                    evt.MapInstance.InstanceBag.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                    break;

                case EventActionType.TELEPORT:
                    Tuple <short, short, short, short> tp = (Tuple <short, short, short, short>)evt.Parameter;
                    List <Character> characters           = evt.MapInstance.GetCharactersInRange(tp.Item1, tp.Item2, 5).ToList();
                    characters.ForEach(s =>
                    {
                        s.PositionX = tp.Item3;
                        s.PositionY = tp.Item4;
                        evt.MapInstance?.Broadcast(s.Session, s.GenerateTp(), ReceiverType.Group);
                    });
                    break;

                case EventActionType.STOPCLOCK:
                    evt.MapInstance.InstanceBag.Clock.StopClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                    break;

                case EventActionType.STARTMAPCLOCK:
                    eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                    evt.MapInstance.Clock.StopEvents    = eve.Item2;
                    evt.MapInstance.Clock.TimeoutEvents = eve.Item1;
                    evt.MapInstance.Clock.StartClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                    break;

                case EventActionType.STOPMAPCLOCK:
                    evt.MapInstance.Clock.StopClock();
                    evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                    break;

                case EventActionType.SPAWNPORTAL:
                    evt.MapInstance.CreatePortal((Portal)evt.Parameter);
                    break;

                case EventActionType.REFRESHMAPITEMS:
                    evt.MapInstance.MapClear();
                    break;

                case EventActionType.NPCSEFFECTCHANGESTATE:
                    evt.MapInstance.Npcs.ForEach(s => s.EffectActivated = (bool)evt.Parameter);
                    break;

                case EventActionType.CHANGEPORTALTYPE:
                    Tuple <int, PortalType> param = (Tuple <int, PortalType>)evt.Parameter;
                    Portal portal = evt.MapInstance.Portals.FirstOrDefault(s => s.PortalId == param.Item1);
                    if (portal != null)
                    {
                        portal.Type = (short)param.Item2;
                    }
                    break;

                case EventActionType.CHANGEDROPRATE:
                    evt.MapInstance.DropRate = (int)evt.Parameter;
                    break;

                case EventActionType.CHANGEXPRATE:
                    evt.MapInstance.XpRate = (int)evt.Parameter;
                    break;

                case EventActionType.DISPOSEMAP:
                    evt.MapInstance.Dispose();
                    break;

                case EventActionType.SPAWNBUTTON:
                    evt.MapInstance.SpawnButton((MapButton)evt.Parameter);
                    break;

                case EventActionType.UNSPAWNMONSTERS:
                    evt.MapInstance.DespawnMonster((int)evt.Parameter);
                    break;

                case EventActionType.SPAWNMONSTERS:
                    evt.MapInstance.SummonMonsters((List <MonsterToSummon>)evt.Parameter);
                    break;

                case EventActionType.REFRESHRAIDGOAL:
                    ClientSession cl = evt.MapInstance.Sessions.FirstOrDefault();
                    if (cl?.Character != null)
                    {
                        ServerManager.Instance.Broadcast(cl, cl.Character?.Group.GeneraterRaidmbf(), ReceiverType.Group);
                        ServerManager.Instance.Broadcast(cl, UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEW_MISSION"), 0), ReceiverType.Group);
                    }
                    break;

                case EventActionType.SPAWNNPCS:
                    evt.MapInstance.SummonNpcs((List <NpcToSummon>)evt.Parameter);
                    break;

                case EventActionType.DROPITEMS:
                    evt.MapInstance.DropItems((List <Tuple <short, int, short, short> >)evt.Parameter);
                    break;

                case EventActionType.THROWITEMS:
                    Tuple <int, short, byte, int, int> parameters = (Tuple <int, short, byte, int, int>)evt.Parameter;
                    evt.MapInstance.ThrowItems(parameters);
                    break;

                case EventActionType.SPAWNONLASTENTRY:
                    Character lastincharacter = evt.MapInstance.Sessions.OrderByDescending(s => s.RegisterTime).FirstOrDefault()?.Character;
                    List <MonsterToSummon> summonParameters = new List <MonsterToSummon>();
                    MapCell hornSpawn = new MapCell
                    {
                        X = lastincharacter?.PositionX ?? 154,
                        Y = lastincharacter?.PositionY ?? 140
                    };
                    long hornTarget = lastincharacter?.CharacterId ?? -1;
                    summonParameters.Add(new MonsterToSummon(Convert.ToInt16(evt.Parameter), hornSpawn, hornTarget, true, new List <EventContainer>()));
                    evt.MapInstance.SummonMonsters(summonParameters);
                    break;

                    #endregion
                }
            }
        }
コード例 #21
0
        public void RunEvent(EventContainer evt, ClientSession session = null, MapMonster monster = null)
        {
            if (evt != null)
            {
                if (session != null)
                {
                    evt.MapInstance = session.CurrentMapInstance;
                    switch (evt.EventActionType)
                    {
                        #region EventForUser

                    case EventActionType.NpcDialog:
                        session.SendPacket(session.Character.GenerateNpcDialog((int)evt.Parameter));
                        break;

                    case EventActionType.SendPacket:
                        session.SendPacket((string)evt.Parameter);
                        break;

                        #endregion
                    }
                }
                if (evt.MapInstance != null)
                {
                    switch (evt.EventActionType)
                    {
                        #region EventForUser

                    case EventActionType.NpcDialog:
                    case EventActionType.SendPacket:
                        if (session == null)
                        {
                            evt.MapInstance.Sessions.ToList().ForEach(e => RunEvent(evt, e));
                        }
                        break;

                        #endregion

                        #region MapInstanceEvent

                    case EventActionType.RegisterEvent:
                        Tuple <string, List <EventContainer> > even = (Tuple <string, List <EventContainer> >)evt.Parameter;
                        switch (even.Item1)
                        {
                        case "OnCharacterDiscoveringMap":
                            even.Item2.ForEach(s => evt.MapInstance.OnCharacterDiscoveringMapEvents.Add(new Tuple <EventContainer, List <long> >(s, new List <long>())));
                            break;

                        case "OnMoveOnMap":
                            evt.MapInstance.OnMoveOnMapEvents.AddRange(even.Item2);
                            break;

                        case "OnMapClean":
                            evt.MapInstance.OnMapClean.AddRange(even.Item2);
                            break;

                        case "OnLockerOpen":
                            evt.MapInstance.UnlockEvents.AddRange(even.Item2);
                            break;
                        }
                        break;

                    case EventActionType.RegisterWave:
                        evt.MapInstance.WaveEvents.Add((EventWave)evt.Parameter);
                        break;

                    case EventActionType.SetAreaEntry:
                        ZoneEvent even2 = (ZoneEvent)evt.Parameter;
                        evt.MapInstance.OnAreaEntryEvents.Add(even2);
                        break;

                    case EventActionType.RemoveMonsterLocker:
                        if (evt.MapInstance.InstanceBag.MonsterLocker.Current > 0)
                        {
                            evt.MapInstance.InstanceBag.MonsterLocker.Current--;
                        }
                        if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                        {
                            evt.MapInstance.UnlockEvents.ForEach(s => RunEvent(s));
                            evt.MapInstance.UnlockEvents.RemoveAll(s => s != null);
                        }
                        break;

                    case EventActionType.RemoveButtonLocker:
                        if (evt.MapInstance.InstanceBag.ButtonLocker.Current > 0)
                        {
                            evt.MapInstance.InstanceBag.ButtonLocker.Current--;
                        }
                        if (evt.MapInstance.InstanceBag.MonsterLocker.Current == 0 && evt.MapInstance.InstanceBag.ButtonLocker.Current == 0)
                        {
                            evt.MapInstance.UnlockEvents.ForEach(s => RunEvent(s));
                            evt.MapInstance.UnlockEvents.RemoveAll(s => s != null);
                        }
                        break;

                    case EventActionType.Effect:
                        short evt3 = (short)evt.Parameter;
                        if (monster != null)
                        {
                            monster.LastEffect = DateTime.UtcNow;
                            evt.MapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Monster, monster.MapMonsterId, evt3));
                        }
                        break;

                    case EventActionType.ControleMonsterInRange:
                        if (monster != null)
                        {
                            Tuple <short, byte, List <EventContainer> > evnt = (Tuple <short, byte, List <EventContainer> >)evt.Parameter;
                            List <MapMonster> mapMonsters = evt.MapInstance.GetListMonsterInRange(monster.MapX, monster.MapY, evnt.Item2);
                            if (evnt.Item1 != 0)
                            {
                                mapMonsters.RemoveAll(s => s.MonsterVNum != evnt.Item1);
                            }
                            mapMonsters.ForEach(s => evnt.Item3.ForEach(e => RunEvent(e, monster: s)));
                        }
                        break;

                    case EventActionType.OnTarget:
                        if (monster?.MoveEvent?.InZone(monster.MapX, monster.MapY) == true)
                        {
                            monster.MoveEvent = null;
                            monster.Path      = new List <Node>();
                            ((List <EventContainer>)evt.Parameter).ForEach(s => RunEvent(s, monster: monster));
                        }
                        break;

                    case EventActionType.Move:
                        ZoneEvent evt4 = (ZoneEvent)evt.Parameter;
                        if (monster != null)
                        {
                            monster.MoveEvent = evt4;
                            monster.Path      = BestFirstSearch.FindPathJagged(new Node {
                                X = monster.MapX, Y = monster.MapY
                            }, new Node {
                                X = evt4.X, Y = evt4.Y
                            }, evt.MapInstance?.Map.JaggedGrid);
                        }
                        break;

                    case EventActionType.Clock:
                        evt.MapInstance.InstanceBag.Clock.TotalSecondsAmount = Convert.ToInt32(evt.Parameter);
                        evt.MapInstance.InstanceBag.Clock.SecondsRemaining   = Convert.ToInt32(evt.Parameter);
                        break;

                    case EventActionType.SetMonsterLockers:
                        evt.MapInstance.InstanceBag.MonsterLocker.Current = Convert.ToByte(evt.Parameter);
                        evt.MapInstance.InstanceBag.MonsterLocker.Initial = Convert.ToByte(evt.Parameter);
                        break;

                    case EventActionType.SetButtonLockers:
                        evt.MapInstance.InstanceBag.ButtonLocker.Current = Convert.ToByte(evt.Parameter);
                        evt.MapInstance.InstanceBag.ButtonLocker.Initial = Convert.ToByte(evt.Parameter);
                        break;

                    case EventActionType.ScriptEnd:
                        switch (evt.MapInstance.MapInstanceType)
                        {
                        case MapInstanceType.TimeSpaceInstance:
                            evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                            ClientSession client = evt.MapInstance.Sessions.FirstOrDefault();
                            if (client != null)
                            {
                                Guid             mapInstanceId = ServerManager.GetBaseMapInstanceIdByMapId(client.Character.MapId);
                                MapInstance      map           = ServerManager.GetMapInstance(mapInstanceId);
                                ScriptedInstance si            = map.ScriptedInstances.Find(s => s.PositionX == client.Character.MapX && s.PositionY == client.Character.MapY);
                                byte             penalty       = 0;
                                if (penalty > (client.Character.Level - si.LevelMinimum) * 2)
                                {
                                    penalty = penalty > 100 ? (byte)100 : penalty;
                                    client.SendPacket(client.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("TS_PENALTY"), penalty), 10));
                                }
                                int    point      = evt.MapInstance.InstanceBag.Point * (100 - penalty) / 100;
                                string perfection = string.Empty;
                                perfection += evt.MapInstance.InstanceBag.MonstersKilled >= si.MonsterAmount ? 1 : 0;
                                perfection += evt.MapInstance.InstanceBag.NpcsKilled == 0 ? 1 : 0;
                                perfection += evt.MapInstance.InstanceBag.RoomsVisited >= si.RoomAmount ? 1 : 0;
                                evt.MapInstance.Broadcast($"score  {evt.MapInstance.InstanceBag.EndState} {point} 27 47 18 {si.DrawItems.Count} {evt.MapInstance.InstanceBag.MonstersKilled} {si.NpcAmount - evt.MapInstance.InstanceBag.NpcsKilled} {evt.MapInstance.InstanceBag.RoomsVisited} {perfection} 1 1");
                                client.Character.OnFinishScriptedInstance(
                                    new FinishScriptedInstanceEventArgs(ScriptedInstanceType.TimeSpace, si.Id,
                                                                        point));
                            }
                            break;

                        case MapInstanceType.RaidInstance:
                            evt.MapInstance.InstanceBag.EndState = (byte)evt.Parameter;
                            client = evt.MapInstance.Sessions.FirstOrDefault();
                            if (client != null)
                            {
                                Group grp = client.Character?.Group;
                                if (grp == null)
                                {
                                    return;
                                }
                                if (evt.MapInstance.InstanceBag.EndState == 1 && evt.MapInstance.Monsters.Any(s => s.IsBoss))
                                {
                                    foreach (ClientSession sess in grp.Characters.Where(s => s.CurrentMapInstance.Monsters.Any(e => e.IsBoss)))
                                    {
                                        if (grp.Raid?.GiftItems != null)
                                        {
                                            foreach (Gift gift in grp.Raid.GiftItems)
                                            {
                                                const sbyte rare = 0;
                                                sess.Character.GiftAdd(gift.VNum, gift.Amount, rare, 0,
                                                                       gift.Design, gift.IsRandomRare);
                                            }
                                        }

                                        if (grp.Raid != null)
                                        {
                                            sess.Character.OnFinishScriptedInstance(
                                                new FinishScriptedInstanceEventArgs(ScriptedInstanceType.Raid,
                                                                                    grp.Raid.Id));
                                        }
                                    }
                                    foreach (MapMonster mon in evt.MapInstance.Monsters)
                                    {
                                        mon.CurrentHp = 0;
                                        evt.MapInstance.Broadcast(StaticPacketHelper.Out(UserType.Monster, mon.MapMonsterId));
                                        evt.MapInstance.RemoveMonster(mon);
                                    }

                                    ClientSession leader = grp.Characters.ElementAt(0);

                                    GameLogger.Instance.LogRaidSuccess(ServerManager.Instance.ChannelId,
                                                                       leader.Character.Name, leader.Character.CharacterId, grp.GroupId,
                                                                       grp.Characters.GetAllItems().Select(s => s.Character)
                                                                       .Cast <CharacterDTO>().ToList());

                                    ServerManager.Instance.Broadcast(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("RAID_SUCCEED"), grp.Raid?.Label, grp.Characters.ElementAt(0).Character.Name), 0));
                                }

                                Observable.Timer(TimeSpan.FromSeconds(evt.MapInstance.InstanceBag.EndState == 1 ? 30 : 0)).Subscribe(o =>
                                {
                                    ClientSession[] grpmembers = new ClientSession[40];
                                    grp.Characters.CopyTo(grpmembers);
                                    foreach (ClientSession targetSession in grpmembers)
                                    {
                                        if (targetSession != null)
                                        {
                                            if (targetSession.Character.Hp <= 0)
                                            {
                                                targetSession.Character.Hp = 1;
                                                targetSession.Character.Mp = 1;
                                            }
                                            targetSession.SendPacket(Character.GenerateRaidBf(evt.MapInstance.InstanceBag.EndState));
                                            targetSession.SendPacket(targetSession.Character.GenerateRaid(1, true));
                                            targetSession.SendPacket(targetSession.Character.GenerateRaid(2, true));
                                            grp.LeaveGroup(targetSession);
                                        }
                                    }
                                    ServerManager.Instance.GroupList.RemoveAll(s => s.GroupId == grp.GroupId);
                                    ServerManager.Instance.GroupsThreadSafe.Remove(grp.GroupId);
                                    evt.MapInstance.Dispose();
                                });
                            }
                            break;

                        case MapInstanceType.Act4Morcos:
                        case MapInstanceType.Act4Hatus:
                        case MapInstanceType.Act4Calvina:
                        case MapInstanceType.Act4Berios:
                            client = evt.MapInstance.Sessions.FirstOrDefault();
                            if (client != null)
                            {
                                Family fam = evt.MapInstance.Sessions.FirstOrDefault(s => s?.Character?.Family != null)?.Character.Family;
                                if (fam != null)
                                {
                                    fam.Act4Raid.Portals.RemoveAll(s => s.DestinationMapInstanceId.Equals(fam.Act4RaidBossMap.MapInstanceId));
                                    short destX      = 38;
                                    short destY      = 179;
                                    short rewardVNum = 882;
                                    switch (evt.MapInstance.MapInstanceType)
                                    {
                                    //Morcos is default
                                    case MapInstanceType.Act4Hatus:
                                        destX      = 18;
                                        destY      = 10;
                                        rewardVNum = 185;
                                        break;

                                    case MapInstanceType.Act4Calvina:
                                        destX      = 25;
                                        destY      = 7;
                                        rewardVNum = 942;
                                        break;

                                    case MapInstanceType.Act4Berios:
                                        destX      = 16;
                                        destY      = 25;
                                        rewardVNum = 999;
                                        break;
                                    }
                                    int count = evt.MapInstance.Sessions.Count(s => s?.Character != null);
                                    foreach (ClientSession sess in evt.MapInstance.Sessions)
                                    {
                                        if (sess?.Character != null)
                                        {
                                            sess.Character.GiftAdd(rewardVNum, 1, forceRandom: true, minRare: 1, design: 255);
                                            sess.Character.GenerateFamilyXp(10000 / count);
                                        }
                                    }

                                    GameLogger.Instance.LogGuildRaidSuccess(ServerManager.Instance.ChannelId,
                                                                            fam.Name, fam.FamilyId, evt.MapInstance.MapInstanceType,
                                                                            evt.MapInstance.Sessions.Select(s => s.Character).Cast <CharacterDTO>()
                                                                            .ToList());

                                    //TODO: Famlog
                                    CommunicationServiceClient.Instance.SendMessageToCharacter(new ScsCharacterMessage
                                    {
                                        DestinationCharacterId = fam.FamilyId,
                                        SourceCharacterId      = client.Character.CharacterId,
                                        SourceWorldId          = ServerManager.Instance.WorldId,
                                        Message = UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("FAMILYRAID_SUCCESS"), 0),
                                        Type    = MessageType.Family
                                    });

                                    //ServerManager.Instance.Broadcast(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("FAMILYRAID_SUCCESS"), grp?.Raid?.Label, grp.Characters.ElementAt(0).Character.Name), 0));

                                    Observable.Timer(TimeSpan.FromSeconds(30)).Subscribe(o =>
                                    {
                                        foreach (ClientSession targetSession in evt.MapInstance.Sessions.ToArray())
                                        {
                                            if (targetSession != null)
                                            {
                                                if (targetSession.Character.Hp <= 0)
                                                {
                                                    targetSession.Character.Hp = 1;
                                                    targetSession.Character.Mp = 1;
                                                }

                                                ServerManager.Instance.ChangeMapInstance(targetSession.Character.CharacterId, fam.Act4Raid.MapInstanceId, destX, destY);
                                            }
                                        }
                                        evt.MapInstance.Dispose();
                                    });
                                }
                            }
                            break;

                        case MapInstanceType.CaligorInstance:
                            FactionType winningFaction = CaligorRaid.AngelDamage > CaligorRaid.DemonDamage ? FactionType.Angel : FactionType.Demon;
                            foreach (ClientSession sess in evt.MapInstance.Sessions)
                            {
                                if (sess?.Character == null)
                                {
                                    continue;
                                }

                                if (CaligorRaid.RemainingTime > 2400)
                                {
                                    sess.Character.GiftAdd(
                                        sess.Character.Faction == winningFaction
                                                    ? (short)5960
                                                    : (short)5961, 1);
                                }
                                else
                                {
                                    sess.Character.GiftAdd(
                                        sess.Character.Faction == winningFaction
                                                    ? (short)5961
                                                    : (short)5958, 1);
                                }
                                sess.Character.GiftAdd(5959, 1);
                                sess.Character.GenerateFamilyXp(500);
                            }
                            evt.MapInstance.Broadcast(UserInterfaceHelper.GenerateChdm(ServerManager.GetNpcMonster(2305).MaxHP, CaligorRaid.AngelDamage, CaligorRaid.DemonDamage, CaligorRaid.RemainingTime));
                            break;
                        }
                        break;

                    case EventActionType.MapClock:
                        evt.MapInstance.Clock.TotalSecondsAmount = Convert.ToInt32(evt.Parameter);
                        evt.MapInstance.Clock.SecondsRemaining   = Convert.ToInt32(evt.Parameter);
                        break;

                    case EventActionType.StartClock:
                        Tuple <List <EventContainer>, List <EventContainer> > eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                        evt.MapInstance.InstanceBag.Clock.StopEvents    = eve.Item1;
                        evt.MapInstance.InstanceBag.Clock.TimeoutEvents = eve.Item2;
                        evt.MapInstance.InstanceBag.Clock.StartClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                        break;

                    case EventActionType.Teleport:
                        Tuple <short, short, short, short> tp = (Tuple <short, short, short, short>)evt.Parameter;
                        List <Character> characters           = evt.MapInstance.GetCharactersInRange(tp.Item1, tp.Item2, 5).ToList();
                        characters.ForEach(s =>
                        {
                            s.PositionX = tp.Item3;
                            s.PositionY = tp.Item4;
                            evt.MapInstance?.Broadcast(s.Session, s.GenerateTp(), ReceiverType.Group);
                        });
                        break;

                    case EventActionType.StopClock:
                        evt.MapInstance.InstanceBag.Clock.StopClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.InstanceBag.Clock.GetClock());
                        break;

                    case EventActionType.StartMapClock:
                        eve = (Tuple <List <EventContainer>, List <EventContainer> >)evt.Parameter;
                        evt.MapInstance.Clock.StopEvents    = eve.Item1;
                        evt.MapInstance.Clock.TimeoutEvents = eve.Item2;
                        evt.MapInstance.Clock.StartClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                        break;

                    case EventActionType.StopMapClock:
                        evt.MapInstance.Clock.StopClock();
                        evt.MapInstance.Broadcast(evt.MapInstance.Clock.GetClock());
                        break;

                    case EventActionType.SpawnPortal:
                        evt.MapInstance.CreatePortal((Portal)evt.Parameter);
                        break;

                    case EventActionType.RefreshMapItems:
                        evt.MapInstance.MapClear();
                        break;

                    case EventActionType.NpcsEffectChangeState:
                        evt.MapInstance.Npcs.ForEach(s => s.EffectActivated = (bool)evt.Parameter);
                        break;

                    case EventActionType.ChangePortalType:
                        Tuple <int, PortalType> param = (Tuple <int, PortalType>)evt.Parameter;
                        Portal portal = evt.MapInstance.Portals.Find(s => s.PortalId == param.Item1);
                        if (portal != null)
                        {
                            portal.Type = (short)param.Item2;
                        }
                        break;

                    case EventActionType.ChangeDropRate:
                        evt.MapInstance.DropRate = (int)evt.Parameter;
                        break;

                    case EventActionType.ChangExpRate:
                        evt.MapInstance.XpRate = (int)evt.Parameter;
                        break;

                    case EventActionType.DisposeMap:
                        evt.MapInstance.Dispose();
                        break;

                    case EventActionType.SpawnButton:
                        evt.MapInstance.SpawnButton((MapButton)evt.Parameter);
                        break;

                    case EventActionType.UnspawnMonsters:
                        evt.MapInstance.DespawnMonster((int)evt.Parameter);
                        break;

                    case EventActionType.SpawnMonster:
                        evt.MapInstance.SummonMonster((MonsterToSummon)evt.Parameter);
                        break;

                    case EventActionType.SpawnMonsters:
                        evt.MapInstance.SummonMonsters((List <MonsterToSummon>)evt.Parameter);
                        break;

                    case EventActionType.RefreshRaidGoal:
                        ClientSession cl = evt.MapInstance.Sessions.FirstOrDefault();
                        if (cl?.Character != null)
                        {
                            ServerManager.Instance.Broadcast(cl, cl.Character?.Group?.GeneraterRaidmbf(cl), ReceiverType.Group);
                            ServerManager.Instance.Broadcast(cl, UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEW_MISSION"), 0), ReceiverType.Group);
                        }
                        break;

                    case EventActionType.SpawnNpc:
                        evt.MapInstance.SummonNpc((NpcToSummon)evt.Parameter);
                        break;

                    case EventActionType.SpawnNpcs:
                        evt.MapInstance.SummonNpcs((List <NpcToSummon>)evt.Parameter);
                        break;

                    case EventActionType.DropItems:
                        evt.MapInstance.DropItems((List <Tuple <short, int, short, short> >)evt.Parameter);
                        break;

                    case EventActionType.ThrowItems:
                        Tuple <int, short, byte, int, int> parameters = (Tuple <int, short, byte, int, int>)evt.Parameter;
                        if (monster != null)
                        {
                            parameters = new Tuple <int, short, byte, int, int>(monster.MapMonsterId, parameters.Item2, parameters.Item3, parameters.Item4, parameters.Item5);
                        }
                        evt.MapInstance.ThrowItems(parameters);
                        break;

                    case EventActionType.SpawnOnLastEntry:
                        Character lastincharacter = evt.MapInstance.Sessions.OrderByDescending(s => s.RegisterTime).FirstOrDefault()?.Character;
                        List <MonsterToSummon> summonParameters = new List <MonsterToSummon>();
                        MapCell hornSpawn = new MapCell
                        {
                            X = lastincharacter?.PositionX ?? 154,
                            Y = lastincharacter?.PositionY ?? 140
                        };
                        long hornTarget = lastincharacter?.CharacterId ?? -1;
                        summonParameters.Add(new MonsterToSummon(Convert.ToInt16(evt.Parameter), hornSpawn, hornTarget, true));
                        evt.MapInstance.SummonMonsters(summonParameters);
                        break;

                        #endregion
                    }
                }
            }
        }