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