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; }
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); }
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_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(); }
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(); }
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); }
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; }