public override void OnEvent(MapEvents etype, MapEventArgs args, Actor sActor, Actor dActor) { switch (etype) { case MapEvents.APPEAR: { sActor.EventHandler.OnActorAppears(dActor); } break; case MapEvents.DISAPPEAR: { sActor.EventHandler.OnActorDisappears(dActor); } break; case MapEvents.CHAT: if (sActor.ActorType == ActorType.PC) { ((ActorEventHandlers.PCEventHandler)sActor.EventHandler).OnChat((ChatArgument)args); } break; case MapEvents.PORTAL_ENTER: ((BNSActorEventHandler)sActor.EventHandler).OnActorEnterPortal(dActor); break; case MapEvents.QUEST_UPDATE: { Scripting.NPCScriptHandler npc = sActor.EventHandler as Scripting.NPCScriptHandler; QuestArgument arg = args as QuestArgument; if (npc != null && arg != null && arg.OriginNPC != npc.NpcID) { npc.OnQuest(arg.Player, arg.Quest.QuestID, arg.Step, arg.Quest); } } break; default: if (sActor.ActorType == ActorType.PC) { ((ActorEventHandlers.PCEventHandler)sActor.EventHandler).OnBroadcastEvt((UpdateEvent)args); } break; } }
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); } }