private uint CreateNSObject(DB_WorldObject obj)
        {
            if (_nsObjects.ContainsKey(obj.Guid))
            {
                ServerLogger.LogServer(_server, $"Duplicate NS guid {obj.Guid}");
            }
            else
            {
                switch (obj.Type)
                {
                case 0:    //Spawn
                    return(new WO_Spawn(obj, this).Guid);

                case 1:    //Switch
                    return(new WO_Switch(obj, this).Guid);

                case 2:    //Spawn Pool
                    return(new WO_SpawnPool(obj, this).Guid);

                default:
                    ServerLogger.LogWarning($"{_server.Name}({_mapID}) unknow NS map object type {obj.Type} guid {obj.Guid}");
                    break;
                }
            }
            return(0);
        }
 public SwitchTrigger(DB_WorldObject data)
     : base()
 {
     m_data     = data;
     m_position = m_data.Position;
     m_rotation = m_data.Rotation;
 }
Beispiel #3
0
        private void DoSpawn()
        {
            var posX = Constants.RND.Next((int)(m_data.Rotation.X));
            var posZ = Constants.RND.Next((int)(m_data.Rotation.Z));
            var posY = Constants.RND.Next((int)(m_bound.Max.Y - m_bound.Min.Y));

            var rotation = new Vector3(0f, Constants.RND.Next(-180, +181), 0f);
            var position = new Vector3(m_bound.Min.X + posX, m_data.Position.Y, m_bound.Min.Z + posZ);

            if (!IsSpawned)
            {
                return;
            }
            WorldObject wObj;

            if ((m_data.Flags & 1) != 0)
            {
                var obj = new DB_WorldObject(m_data.Map, ushort.MaxValue, Math.Abs(m_data.ObjectID), 1, 0, position, rotation, -1,
                                             Constants.RND.Next(MinCountOrLevel, MaxCountOrLevel + 1), m_data.Data01);
                wObj = new WO_Pickup(obj, Manager);
            }
            else
            {
                var obj = new DB_WorldObject(m_data.Map, ushort.MaxValue, Math.Abs(m_data.ObjectID), 1, 0, position, rotation, -1,
                                             MinCountOrLevel, MaxCountOrLevel);
                wObj = new WO_MOB(obj, Manager);
            }
            wObj.OnDestroy += WoObj_OnDestroy;
            m_objects.Add(wObj);
        }
Beispiel #4
0
 public WO_NPC(DB_WorldObject data, ObjectsMgr manager)
     : base(manager.GetNewGuid() | Constants.ReleaseGuide, manager)
 {
     _data = data;
     if (!DataMgr.Select(data.ObjectID, out _npc))
     {
         ServerLogger.LogError($"NPC id {data.ObjectID} doesn't exist");
     }
     if ((_npc.Flags & NPCFlags.Dialog) > 0)
     {
         _dialog = _server.Dialogs.GetDialog(_npc.Dialog);
     }
     if ((_npc.Flags & NPCFlags.Trader) > 0)
     {
         shop_ser = new SER_Shop(_npc.Items, $"{_npc.Pony.Name}'s shop");
     }
     if ((_npc.Flags & NPCFlags.Wears) > 0)
     {
         DB_Item entry; byte slot;
         _wears    = new Dictionary <int, InventoryItem>();
         wears_ser = new SER_Wears(_wears);
         foreach (var item in _npc.Wears)
         {
             if (item > 0 && DataMgr.Select(item, out entry))
             {
                 slot = entry.Slot.ToWearableIndex();
                 if (_wears.ContainsKey(slot))
                 {
                     ServerLogger.LogWarn($"NPC id {data.ObjectID} duplicate wear slot {entry.Slot}");
                 }
                 else
                 {
                     _wears[slot] = new InventoryItem(item);
                 }
             }
         }
     }
     OnSpawn   += WO_NPC_OnSpawn;
     OnDespawn += WO_NPC_OnDespawn;
     OnDestroy += WO_NPC_OnDestroy;
     if ((_npc.Flags & NPCFlags.ScriptedMovement) > 0)
     {
         AddComponent(new ScriptedMovement(_npc.Movement, this));
     }
     else
     {
         AddComponent(new NullMovement(this));
     }
     m_char = new Character(_npc.ID, -1, _npc.Level, -1, _npc.Pony, null);
     Spawn();
 }
Beispiel #5
0
 public WO_NPC(WO_NPC original, MapPlayer owner)
     : base(original._manager.GetNewGuid() | Constants.CRObject, original._manager)
 {
     _owner    = owner;
     _original = original;
     _npc      = original._npc;
     _data     = original._data;
     if ((_npc.Flags & NPCFlags.Dialog) > 0)
     {
         _dialog = _server.Dialogs.GetClone(_npc.Dialog, owner);
     }
     if ((_npc.Flags & NPCFlags.Trader) > 0)
     {
         shop_ser = new SER_Shop(_npc.Items, $"{_npc.Pony.Name}'s shop");
     }
     if ((_npc.Flags & NPCFlags.Wears) > 0)
     {
         DB_Item entry; byte slot;
         _wears    = new Dictionary <int, InventoryItem>();
         wears_ser = new SER_Wears(_wears);
         foreach (var item in _npc.Wears)
         {
             if (item > 0 && DataMgr.Select(item, out entry))
             {
                 slot = entry.Slot.ToWearableIndex();
                 if (_wears.ContainsKey(slot))
                 {
                     ServerLogger.LogWarn($"NPC id {_data.ObjectID} duplicate wear slot {entry.Slot}");
                 }
                 else
                 {
                     _wears[slot] = new InventoryItem(item);
                 }
             }
         }
     }
     OnSpawn   += WO_NPC_OnSpawn;
     OnDespawn += WO_NPC_OnDespawn;
     OnDestroy += WO_NPC_OnDestroy;
     if ((_npc.Flags & NPCFlags.ScriptedMovement) > 0)
     {
         AddComponent(new ScriptedMovement(original._movement as ScriptedMovement, this));
     }
     else
     {
         AddComponent(new NullMovement(this));
     }
     m_char = new Character(_npc.ID, -1, _npc.Level, -1, _npc.Pony, null);
     Spawn();
 }
Beispiel #6
0
 public WO_Switch(DB_WorldObject data, ObjectsMgr manager)
     : base(data, manager)
 {
     if (!DataMgr.Select(data.Data01, out m_map))
     {
         ServerLogger.LogError($"Map Switch {data.Guid} map {data.Data01} doesn't exist");
     }
     else
     {
         m_view = _server.Room.SceneViewManager.CreateNetworkedSceneObjectView(_data.Guid);
         m_view.SubscribeToRpc(1, RPC_001);
         OnDestroy += WO_Switch_OnDestroy;
     }
     Spawn();
 }
Beispiel #7
0
        public WO_SpawnPool(DB_WorldObject data, ObjectsMgr manager)
            : base(data, manager)
        {
            OnUpdate       += WO_SpawnPool_OnUpdate;
            OnDestroy      += WO_SpawnPool_OnDestroy;
            OnDespawn      += WO_SpawnPool_OnDespawn;
            MinSpawnsCount  = (ushort)(data.Data02 & 0xFFFF);
            MaxSpawnsCount  = (ushort)(data.Data02 >> 16);
            MinCountOrLevel = (ushort)(data.Data03 & 0xFFFF);
            MaxCountOrLevel = (ushort)(data.Data03 >> 16);
            m_objects       = new List <WorldObject>(MaxSpawnsCount);
            var offset = data.Rotation / 2f;

            m_bound.Min = data.Position - offset;
            m_bound.Max = data.Position + offset;
            m_next      = data.Time;
            Spawn();
        }
        private uint CreateNVObject(DB_WorldObject obj)
        {
            switch (obj.Type)
            {
            case 0:    //NPC
                return(new WO_NPC(obj, this).Guid);

            case 1:    //Pickup
                return(new WO_Pickup(obj, this).Guid);

            case 2:    //Creature
                return(new WO_MOB(obj, this).Guid);

            default:
                ServerLogger.LogWarning($"{_server.Name}({_mapID}) unknow NV map object type {obj.Type} guid {obj.Guid}");
                break;
            }
            return(0);
        }
Beispiel #9
0
 public WO_MOB(DB_WorldObject data, ObjectsMgr manager)
     : base(manager.GetNewGuid() | Constants.ReleaseGuide, manager)
 {
     _data = data;
     if (!DataMgr.Select(data.ObjectID, out _creature))
     {
         ServerLogger.LogError($"Creature id {data.ObjectID} doesn't exist");
     }
     else if (string.IsNullOrEmpty(_resource = DataMgr.SelectResource(_creature.Resource)))
     {
         ServerLogger.LogError($"Resource id {_creature.Resource} doesn't exist");
     }
     OnSpawn      += WO_MOB_OnSpawn;
     OnDespawn    += WO_MOB_OnDespawn;
     OnDestroy    += WO_MOB_OnDestroy;
     OnInitialize += WO_MOB_OnInitialize;
     OnKilled     += WO_MOB_OnKilled;
     AddComponent(new BasicAI(this));
     AddComponent(new MobStatsMgr(this));
     AddComponent(new MobMovement(this));
     AddComponent(new MobThreatMgr(this));
     Spawn();
 }
Beispiel #10
0
 public WO_Pickup(DB_WorldObject data, ObjectsMgr manager)
     : base(manager.GetNewGuid() | Constants.IRObject, manager)
 {
     _data = data;
     if (data.Data01 <= 0)
     {
         ServerLogger.LogWarn($"Pickup {data.Guid} on map {data.Map} has negative or zero amount {data.Data01} of {data.ObjectID}");
     }
     if ((_data.Flags & 1) == 1 && data.Time.TotalSeconds <= 0)
     {
         ServerLogger.LogWarn($"Pickup {data.Guid} on map {data.Map} has respawn flag but negative or zero respawn time {data.Time}");
         _data.Flags &= 254;
     }
     if (!DataMgr.Select(data.ObjectID, out _item))
     {
         ServerLogger.LogError($"Item id {data.ObjectID} doesn't exist");
     }
     _resource  = DataMgr.SelectResource(data.Data02);
     OnSpawn   += WO_Pickup_OnSpawn;
     OnDespawn += WO_Pickup_OnDespawn;
     OnDestroy += WO_Pickup_OnDestroy;
     Spawn();
 }
Beispiel #11
0
 public WO_Spawn(DB_WorldObject data, ObjectsMgr manager)
     : base(data, manager)
 {
     Spawn();
 }
Beispiel #12
0
 public ServerObject(DB_WorldObject data, ObjectsMgr manager)
     : base(data.Guid | Constants.ServerObject, manager)
 {
     _data = data;
 }