示例#1
0
 public override void CallBack()
 {
     Deactivate();
     actor.Tasks.TryRemove("Respawn", out Task task);
     Map.Map map = Map.MapManager.Instance.GetMap(actor.MapInstanceID);
     if (map != null)
     {
         actor.X           = actor.X_Ori;
         actor.Y           = actor.Y_Ori;
         actor.Z           = actor.Z_Ori;
         actor.Status.Dead = false;
         actor.HP          = actor.MaxHP;
         map.RegisterActor(actor);
         actor.Invisible = false;
         map.OnActorVisibilityChange(actor);
         map.SendVisibleActorsToActor(actor);
     }
 }
示例#2
0
        public void OnLoginStart(CM_LOGIN_START p)
        {
            loginTime = DateTime.Now;

            map = MapManager.Instance.GetMap(chara.MapID, chara.CharID, chara.PartyID);
            if (chara.Party != null && chara.Offline)
            {
                SessionID = chara.ActorID;
            }
            else
            {
                SessionID = nextSessionID++;
            }

            chara.EventHandler = new ActorEventHandlers.PCEventHandler(this);

            broadcastService = new Services.BroadcastService(this);
            broadcastService.Activate();
            map.RegisterActor(chara, SessionID);
        }
示例#3
0
        public override void OnDie(ActorExt killedBy)
        {
            if (npc.Tasks.TryGetValue("ActorCatch", out Task removed))
            {
                removed.Deactivate();
            }

            if (firstAttacker != null && npc.BaseData.QuestIDs.Count > 0)
            {
                ActorPC       pc      = firstAttacker;
                List <ushort> already = new List <ushort>();
                foreach (ushort i in npc.BaseData.QuestIDs)
                {
                    if (!already.Contains(i))
                    {
                        already.Add(i);
                    }
                    else
                    {
                        continue;
                    }

                    if (pc.Quests.TryGetValue(i, out Common.Quests.Quest q))
                    {
                        try
                        {
                            Quests.QuestManager.Instance.ProcessQuest(pc, i, q.NextStep, q, npc, false, true);
                        }
                        catch (Exception ex)
                        {
                            Logger.Log.Error(ex);
                        }
                    }
                }
            }
            if (ShouldRespawn != null)
            {
                ShouldRespawn();
            }

            AI.Deactivate();
            Map.Map     map    = MapManager.Instance.GetMap(npc.MapInstanceID);
            ActorCorpse corpse = new ActorCorpse(npc);

            if (firstAttacker != null)
            {
                corpse.Owner = Party.PartyManager.Instance.GetPartyLootOwner(firstAttacker);
            }

            corpse.MapID        = npc.MapID;
            corpse.X            = npc.X;
            corpse.Y            = npc.Y;
            corpse.Z            = npc.Z;
            corpse.EventHandler = new DummyEventHandler();

            if (firstAttacker != null)
            {
                uint exp = (uint)(npc.Level / 2 + 10);
                Manager.ExperienceManager.Instance.ApplyExp(firstAttacker, exp);
                List <Common.Item.Item> items = new List <Common.Item.Item>();
                foreach (uint i in npc.BaseData.Items.Keys)
                {
                    int rate = npc.BaseData.Items[i];
                    if (Global.Random.Next(0, 99) < rate)
                    {
                        Common.Item.Item item = Item.ItemFactory.Instance.CreateNewItem(i);
                        item.Count = npc.BaseData.ItemCounts[i];
                        items.Add(item);
                    }
                }
                //corpse.Gold = 200;
                corpse.Items = items.ToArray();
            }
            map.RegisterActor(corpse);
            npc.Status.CorpseActorID = corpse.ActorID;

            Tasks.Actor.CorpseDeleteTask task = new Tasks.Actor.CorpseDeleteTask(npc.BaseData.CorpseItemID > 0 ? 20000 : 10000, corpse);
            task.Activate();

            foreach (NPCDeathSpawn i in npc.BaseData.DeathSpawns)
            {
                for (int j = 0; j < i.Count; j++)
                {
                    short x = (short)Global.Random.Next(npc.X - 15, npc.X + 15);
                    short y = (short)Global.Random.Next(npc.Y - 15, npc.Y + 15);
                    short z = (short)npc.Z;
                    Scripting.Utils.SpawnNPC(map, i.NPCID, i.AppearEffect, x, y, z, 0, i.Motion);
                }
            }
            firstAttacker = null;
        }
示例#4
0
        public void DoSpawn(Map.Map map)
        {
            if (IsQuest)
            {
                ActorQuest obj = new ActorQuest()
                {
                    MapID         = map.ID,
                    MapInstanceID = map.InstanceID,
                    X             = X,
                    Y             = Y,
                    Z             = Z,
                    EventHandler  = new ActorEventHandlers.QuestEventHandler()
                };
                map.RegisterActor(obj);
            }
            else if (IsCampfire)
            {
                ActorMapObj obj = new ActorMapObj(NpcID)
                {
                    ActorID           = (ulong)(map.InstanceID | 0xC00000) << 32 | NpcID,
                        MapID         = map.ID,
                        X             = X,
                        Y             = Y,
                        Z             = Z,
                        SpecialMapID  = SpecialMapID,
                        MapInstanceID = map.InstanceID,
                        EventHandler  = new ActorEventHandlers.DummyEventHandler()
                };
                map.Campfires.Add(obj.ActorID, obj);
            }
            else if (!IsMapObject)
            {
                for (int i = 0; i < Count; i++)
                {
                    short x;
                    short y;
                    if (Range > 0)
                    {
                        x = (short)Global.Random.Next(X - Range, X + Range);
                        y = (short)Global.Random.Next(Y - Range, Y + Range);
                    }
                    else
                    {
                        x = X;
                        y = Y;
                    }
                    ActorNPC npc = new ActorNPC(NPCDataFactory.Instance.Items[NpcID])
                    {
                        X              = x,
                        Y              = y,
                        Z              = Z,
                        X_Ori          = x,
                        Y_Ori          = y,
                        Z_Ori          = Z,
                        MoveRange      = MoveRange,
                        Dir            = Dir,
                        StandartMotion = Motion,
                        AppearEffect   = AppearEffect,
                        MapID          = MapID
                    };
                    if (ManaType > 0)
                    {
                        npc.ManaType = (Common.Actors.ManaType)ManaType;
                    }

                    if (Scripting.ScriptManager.Instance.NpcScripts.ContainsKey(NpcID))
                    {
                        Scripting.NPCScriptHandler handler = (Scripting.NPCScriptHandler)Activator.CreateInstance(Scripting.ScriptManager.Instance.NpcScripts[NpcID].GetType());
                        handler.NPC      = npc;
                        npc.EventHandler = handler;
                    }
                    else
                    {
                        npc.EventHandler = new ActorEventHandlers.NPCEventHandler(npc);
                    }

                    if (Delay > 0)
                    {
                        ((ActorEventHandlers.NPCEventHandler)npc.EventHandler).ShouldRespawn += () =>
                        {
                            Tasks.Actor.RespawnTask task = new Tasks.Actor.RespawnTask(Delay, npc);
                            task.Activate();
                        };
                    }
                    map.RegisterActor(npc);
                    npc.Invisible = Hidden;
                    map.OnActorVisibilityChange(npc);
                    map.SendVisibleActorsToActor(npc);
                    //spawns.Add(npc);
                }
            }
            else
            {
                ActorMapObj obj = new ActorMapObj(NpcID)
                {
                    ActorID   = (ulong)(map.InstanceID | 0x200000) << 32 | NpcID,
                        MapID = map.ID
                };
                if (Delay > 0)
                {
                    obj.RespawnTime = Delay;
                }

                obj.Special       = Special;
                obj.DragonStream  = DragonStream;
                obj.X             = X;
                obj.Y             = Y;
                obj.Z             = Z;
                obj.SpecialMapID  = SpecialMapID;
                obj.MapInstanceID = map.InstanceID;
                foreach (uint i in itemIDs.Keys)
                {
                    obj.ItemIDs[i] = itemIDs[i];
                }

                obj.MinGold      = MinGold;
                obj.MaxGold      = MaxGold;
                obj.EventHandler = new ActorEventHandlers.DummyEventHandler();
                map.MapObjects.Add(obj.ActorID, obj);
            }
        }