예제 #1
0
 public void Stop()
 {
     if (_room == null || !_running)
     {
         return;
     }
     ServersMgr.Remove(this);
     _running = false;
     _room.Shutdown();
     _rLoop.Join();
     Thread.Sleep(50);
     _room.PlayerAdded         -= Room_PlayerAdded;
     _room.PlayerRemoved       -= Room_PlayerRemoved;
     _room.ConstructNetData    -= Room_ConstructNetData;
     _room.ServerStatusChanged -= Room_ServerStatusChanged;
     foreach (var item in _players.Values)
     {
         item.Destroy();
     }
     _players.Clear();
     _objects.Destroy();
     lock (_updatables)
         _updatables.Clear();
     _cfg     = null;
     _room    = null;
     _rLoop   = null;
     _script  = null;
     _objects = null;
 }
예제 #2
0
 public CreatureObject(uint guid, ObjectsMgr manager)
     : base(Constants.CreatureObject | guid, manager)
 {
     OnSpawn      += CreatureObject_OnSpawn;
     OnDespawn    += CreatureObject_OnDespawn;
     OnDestroy    += CreatureObject_OnDestroy;
     OnInitialize += CreatureObject_OnInitialize;
 }
예제 #3
0
 public WorldObject(uint guid, ObjectsMgr manager)
 {
     _manager    = manager;
     _lock       = new object();
     _server     = manager.Server;
     _guid       = guid | (uint)(TypeID << 16);
     _components = new ObjectComponent[Constants.ArrayCapacity];
     _manager.Add(this);
 }
예제 #4
0
 public WorldObject(uint guid, ObjectsMgr manager)
 {
     _manager    = manager;
     _lock       = new object();
     _server     = manager.Server;
     _guid       = guid | (uint)(TypeID << 16);
     _updatable  = ArrayEx.Empty <IUpdatable>();
     _components = ArrayEx.Empty <ObjectComponent>();
     _manager.Add(this);
 }
예제 #5
0
 public WO_Loot(DB_Loot loot, WorldObject at, MapPlayer onwer, ObjectsMgr manager)
     : base(manager.GetNewGuid() | Constants.IDRObject, manager)
 {
     _onwer     = onwer;
     _position  = at.Position;
     _rotation  = at.Rotation;
     _loot      = loot;
     _resource  = DataMgr.SelectResource(Constants.LootResource);
     OnSpawn   += WO_Loot_OnSpawn;
     OnDespawn += WO_Loot_OnDespawn;
     OnDestroy += WO_Loot_OnDestroy;
     Spawn();
 }
예제 #6
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();
 }
예제 #7
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();
 }
예제 #8
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();
        }
예제 #9
0
 public void Destroy()
 {
     _spawned = false;
     _manager.RemoveView(this);
     _manager.Remove(this);
     if ((_guid & Constants.ReleaseGuide) > 0)
     {
         _manager.ReleaseGuid(_guid);
     }
     if (_updatable.Length > 0 || eventOnUpdate != null)
     {
         _server.RemoveFromUpdate(this);
     }
     OnDestroy?.Invoke();
     _server     = null;
     _manager    = null;
     _updatable  = null;
     _components = null;
 }
예제 #10
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();
 }
예제 #11
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();
 }
예제 #12
0
 public WO_Spawn(DB_WorldObject data, ObjectsMgr manager)
     : base(data, manager)
 {
     Spawn();
 }
예제 #13
0
 public ServerObject(DB_WorldObject data, ObjectsMgr manager)
     : base(data.Guid | Constants.ServerObject, manager)
 {
     _data = data;
 }