public void OnMapObjectClose(CM_MAPOBJECT_CLOSE p) { if (currentMapObj != null) { SM_MAPOBJECT_CLOSE p1 = new SM_MAPOBJECT_CLOSE() { ActorID = p.ActorID }; Network.SendPacket(p1); UpdateEvent evt = new UpdateEvent() { Actor = chara, UpdateType = UpdateTypes.Actor, Target = chara }; evt.AddActorPara(PacketParameter.PickingObject, 0); evt.AddActorPara(PacketParameter.PickingStatus, 0); map.SendEventToAllActorsWhoCanSeeActor(MapEvents.EVENT_BROADCAST, evt, chara, true); evt = new UpdateEvent() { Actor = chara, UpdateType = UpdateTypes.MapObjectInteraction, Target = currentMapObj, UserData = (byte)1 }; map.SendEventToAllActorsWhoCanSeeActor(MapEvents.EVENT_BROADCAST, evt, chara, true); currentMapObj = null; } }
public MapObjRespawnTask(ActorMapObj actor) : base(actor.RespawnTime, actor.RespawnTime, "Respawn") { this.actor = actor; if (actor.Tasks.TryRemove("Respawn", out Task removed)) { removed.Deactivate(); } actor.Tasks["Respawn"] = this; }
private void MapTeleport(ActorMapObj stream) { int disappearEffect = DisappearEffect(stream.SpecialMapID); if (disappearEffect != -1) { chara.Status.ShouldLoadMap = false; chara.Status.DisappearEffect = disappearEffect; Map.Map map = MapManager.Instance.GetMap(stream.SpecialMapID, chara.CharID, chara.PartyID); RespawnPoint res; res.X = (short)stream.X; res.Y = (short)stream.Y; res.Z = (short)stream.Z; Map.SendActorToMap(chara, map, res.X, res.Y, res.Z); } }
private void DoOperateMapObject(ActorMapObj obj) { //if (obj.Available) { obj.Available = false; QuestManager.Instance.ProcessQuest(chara, obj); ulong scriptID = obj.ToULong(); if (ScriptManager.Instance.MapObjectScripts.ContainsKey(scriptID)) { ScriptManager.Instance.MapObjectScripts[scriptID].OnOperate(chara, map); }/* * List<Common.Item.Item> items = new List<Common.Item.Item>(); * foreach (uint i in obj.ItemIDs.Keys) * { * Common.Item.Item item = Item.ItemFactory.Instance.CreateNewItem(i); * if (item == null) * { * Logger.Log.Warn("Cannot find item:" + i); * continue; * } * item.Count = (ushort)obj.ItemIDs[i]; * items.Add(item); * } * obj.Items = items.ToArray(); * if (obj.MinGold > 0) * obj.Gold = Global.Random.Next(obj.MinGold, obj.MaxGold); * * if (obj.RespawnTime > 0) * { * Tasks.Actor.MapObjRespawnTask task = new Tasks.Actor.MapObjRespawnTask(obj); * task.Activate(); * } * * UpdateEvent evt = new UpdateEvent(); * evt.Actor = obj; * evt.UpdateType = UpdateTypes.MapObjectVisibilityChange; * map.SendEventToAllActors(MapEvents.EVENT_BROADCAST, evt, obj, true);*/ } }
public void OnMapObjectOpen(CM_MAPOBJECT_OPEN p) { Logger.Log.Info("MapObj:" + (p.ActorID & 0xFFFFFFFF)); if (map.MapObjects.ContainsKey(p.ActorID)) { currentMapObj = map.MapObjects[p.ActorID]; UpdateEvent evt = new UpdateEvent() { Actor = chara, UpdateType = UpdateTypes.MapObjectOperate, Target = currentMapObj, UserData = (byte)0 }; map.SendEventToAllActorsWhoCanSeeActor(MapEvents.EVENT_BROADCAST, evt, chara, true); SmartEngine.Network.Tasks.SimpleTask sp = new SmartEngine.Network.Tasks.SimpleTask("sp", 2000, (task) => { currentMapObj.Available = false; evt = new UpdateEvent() { Actor = currentMapObj, UpdateType = UpdateTypes.MapObjectVisibilityChange, Target = chara }; map.SendEventToAllActorsWhoCanSeeActor(MapEvents.EVENT_BROADCAST, evt, chara, true); evt = new UpdateEvent() { Actor = chara, UpdateType = UpdateTypes.MapObjectOperate, Target = currentMapObj, UserData = (byte)1 }; map.SendEventToAllActorsWhoCanSeeActor(MapEvents.EVENT_BROADCAST, evt, chara, true); }); sp.Activate(); } }
public void ProcessQuest(ActorPC pc, ActorMapObj obj) { ulong objID = obj.ToULong(); if (mapObjectMapping.ContainsKey(objID)) { foreach (uint questID in mapObjectMapping[objID].Keys) { if (items.ContainsKey(questID)) { QuestDetail detail = items[questID]; byte step = mapObjectMapping[objID][questID]; Quest quest; if (detail.Steps.ContainsKey(step)) { QuestStep s = detail.Steps[step]; byte index = 0; foreach (QuestTarget t in s.Targets) { if (t.TargetType == StepTargetType.MapObject && t.TargetIDs.Contains(obj.ObjectID) && t.TargetMapID == obj.MapID) { if (s.DropItem > 0) { if (pc.HoldingItem != null && s.DropItem == pc.HoldingItem.ObjectID) { HoldItemCancel(pc, s.DropItem); } else { continue; } } if (pc.Quests.ContainsKey((ushort)questID)) { quest = pc.Quests[(ushort)questID]; } else { continue; } bool finished = ProcessTarget(pc, quest, s, t, t.SpecifyIndex >= 0 ? t.SpecifyIndex : index); if (finished) { ProcessQuestSub(pc, quest, s, detail, 0); } else { UpdateQuest(pc, quest); } QuestArgument arg = new QuestArgument() { Player = pc, Quest = quest, Step = quest.Step }; pc.Client().Map.SendEventToAllActorsWhoCanSeeActor(MapEvents.QUEST_UPDATE, arg, pc, false); } index++; } } } } } }
private void OnMapTeleport(ActorMapObj stream, bool Debugging) { List <UpdateEvent> events = new List <UpdateEvent>(); UpdateEvent toadd4, toadd3, toadd2, toadd; LockForTeleport(true); toadd = new UpdateEvent() { Actor = chara, Target = stream, UpdateType = UpdateTypes.DragonStream, AdditionCount = 0, X = 0, Y = 0, Z = 0 }; events.Add(toadd); toadd2 = new UpdateEvent() { Actor = chara, Target = stream, UpdateType = UpdateTypes.DragonStream, AdditionCount = 1, X = (short)stream.X, Y = (short)stream.Y, Z = (short)stream.Z }; events.Add(toadd2); toadd3 = new UpdateEvent() { Actor = chara, Target = chara, UpdateType = UpdateTypes.Actor, AdditionID = 65002, AdditionSession = 0x7001, ExtraActivateMode = UpdateEvent.ExtraUpdateModes.Activate, SkillSession = 0xFF }; //toadd3.AddActorPara(Common.Packets.GameServer.PacketParameter.UnkD4, 1); events.Add(toadd3); toadd4 = new UpdateEvent() { UpdateType = UpdateTypes.ActorExtension, Actor = chara, ExtraActivateMode = UpdateEvent.ExtraUpdateModes.Activate, AdditionID = 65002, AdditionSession = 0x7001, RestTime = 0x1388, AdditionCount = 1 }; events.Add(toadd4); SendActorUpdates(events); toadd.ActorUpdateParameters.Clear(); toadd2.ActorUpdateParameters.Clear(); toadd3.ActorUpdateParameters.Clear(); toadd4.ActorUpdateParameters.Clear(); events.Clear(); toadd = null; toadd2 = null; chara.X = stream.X; chara.Y = stream.Y; chara.Z = stream.Z; LockForTeleport(false); toadd3.ExtraActivateMode = UpdateEvent.ExtraUpdateModes.Cancel; //toadd3.AddActorPara(Common.Packets.GameServer.PacketParameter.UnkD4, 0); toadd3.UserData = Conversions.HexStr2Bytes("090000"); events.Add(toadd3); toadd4.ExtraActivateMode = UpdateEvent.ExtraUpdateModes.Cancel; events.Add(toadd4); SendActorUpdates(events); toadd3.ActorUpdateParameters.Clear(); toadd4.ActorUpdateParameters.Clear(); events.Clear(); if (Debugging) { SM_SERVER_MESSAGE c = new SM_SERVER_MESSAGE() { MessagePosition = SM_SERVER_MESSAGE.Positions.ChatWindow, Message = string.Format("Dragon Stream:0x{0:X16}", stream.ActorID) }; Network.SendPacket(c); } }
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); } }
public static ulong ToULong(this ActorMapObj mapObj) { return((ulong)mapObj.MapID << 32 | mapObj.ObjectID); }