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; }
public CreatureObject(uint guid, ObjectsMgr manager) : base(Constants.CreatureObject | guid, manager) { OnSpawn += CreatureObject_OnSpawn; OnDespawn += CreatureObject_OnDespawn; OnDestroy += CreatureObject_OnDestroy; OnInitialize += CreatureObject_OnInitialize; }
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); }
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); }
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(); }
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(); }
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(); }
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(); }
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; }
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(); }
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(); }
public WO_Spawn(DB_WorldObject data, ObjectsMgr manager) : base(data, manager) { Spawn(); }
public ServerObject(DB_WorldObject data, ObjectsMgr manager) : base(data.Guid | Constants.ServerObject, manager) { _data = data; }