Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
 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);*/
     }
 }
Ejemplo n.º 5
0
        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();
            }
        }
Ejemplo n.º 6
0
        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++;
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
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);
            }
        }
Ejemplo n.º 9
0
 public static ulong ToULong(this ActorMapObj mapObj)
 {
     return((ulong)mapObj.MapID << 32 | mapObj.ObjectID);
 }