Files
community_bridge/lib/entities/server/server_entity.lua
T
Mr.Crowley f2ff03734e prep for behaviors
readded behaviors
2025-08-30 19:12:56 -05:00

114 lines
3.9 KiB
Lua

Ids = Ids or Require("lib/utility/shared/ids.lua")
Behaviors = Behaviors or Require("lib/entities/shared/behaviors.lua")
local Entities = {}
ServerEntity = {} -- Renamed from EntityRelay
ServerEntity.Behaviors = Behaviors
local Invoked = {}
--- Creates a server-side representation of an entity and notifies clients.
-- @param entityType string 'object', 'ped', or 'vehicle'
-- @param model string|number
-- @param coords vector3
-- @param rotation vector3|number Heading for peds/vehicles, rotation for objects
-- @param meta table Optional additional data
-- @return table The created entity data
function ServerEntity.New(id, entityType, model, coords, rotation, args)
assert(entityType, "EntityType is required")
assert(model, "Model is required for entity creation")
assert(coords, "Coords are required for entity creation")
local self = args or {}
self.id = id or Ids.CreateUniqueId(Entities)
self.entityType = entityType
self.model = model
self.coords = coords
self.rotation = rotation or vector3(0.0, 0.0, 0.0)
local invoking = GetInvokingResource() or "community_bridge"
self.invoking = invoking
Invoked[invoking] = Invoked[invoking] or {}
table.insert(Invoked[invoking], self)
ServerEntity.Add(self)
return self
end
function ServerEntity.Create(data)
local self = ServerEntity.New(data.id, data.entityType, data.model, data.coords, data.rotation or vector3(0.0, 0.0, data.heading or 0.0), data)
if not self then return nil end
Behaviors.Trigger("OnCreate", self)
TriggerClientEvent("community_bridge:client:CreateEntity", -1, self)
return self
end
function ServerEntity.CreateBulk(entities)
local createdEntities = {}
for _, entityData in pairs(entities) do
local id = entityData.id or Ids.CreateUniqueId(Entities)
local entity = ServerEntity.New(id, entityData.entityType, entityData.model, entityData.coords, entityData.rotation, entityData)
createdEntities[id] = entity
Behaviors.Trigger("OnCreate", entity)
end
TriggerClientEvent("community_bridge:client:CreateEntities", -1, createdEntities)
return createdEntities
end
--- Deletes a server-side entity representation and notifies clients.
-- @param id string|number The ID of the entity to delete.
function ServerEntity.Destroy(id)
if not Entities[id] then return end
ServerEntity.Remove(id)
TriggerClientEvent("community_bridge:client:DeleteEntity", -1, id)
end
ServerEntity.Delete = ServerEntity.Destroy
function ServerEntity.DestroyBulk(entityDatas)
for _, entityData in pairs(entityDatas) do
ServerEntity.Remove(entityData.id)
end
print("[ServerEntity] DestroyBulk: Removed", #entityDatas, "entities")
TriggerClientEvent("community_bridge:client:DeleteBulk", -1, entityDatas)
end
function ServerEntity.Get(id)
return Entities[id]
end
function ServerEntity.Add(self)
Entities[self.id] = self
end
function ServerEntity.Remove(id)
Entities[id] = nil
end
--- Updates data for a server-side entity and notifies clients.
-- @param id string|number The ID of the entity to update.
-- @param data table The data fields to update.
function ServerEntity.Set(id, data)
local entity = Entities[id]
if not entity then return false end
for key, value in pairs(data) do
entity[key] = value
end
TriggerClientEvent("community_bridge:client:UpdateEntity", -1, id, data)
return true
end
function ServerEntity.RegisterBehavior(id, behavior)
Behaviors.Create(id, behavior)
end
-- Clean up entities associated with a stopped resource
AddEventHandler('onResourceStop', function(resourceName)
if Invoked[resourceName] then
ServerEntity.DestroyBulk(Invoked[resourceName])
Invoked[resourceName] = nil
end
end)
AddEventHandler('community_bridge:Server:OnPlayerLoaded', function(source)
-- print("Player loaded:", source)
TriggerClientEvent("community_bridge:client:CreateEntities", source, Entities)
end)
return ServerEntity