Hello, everyone! So i've been doing some scripts in my free time. So i am doing some testing with some ideas and currently i am writing a vehicle pickup system (some kind of vehicle deathmatch). I wanted to create custom pickup elements with few additional variables and different animation. Since models cannot be attached to custom elements, i created new object and set it as a child. I did this all server-side and passed it to client-side file because i wanted it animated client-side using onClientRender.
Here is server-side file:
pickups = {}
local BOX_MDL = 1271
local respawnTime = 30000
function createVehiclePickup(pickupType, x, y, z)
local pickup = {
element = nil,
model = nil,
isActive = true,
rot_angle = 0,
startZ = z
}
if (pickupType == 1) then
pickup.element = createElement("vdm_pickup", "weapon_pickup")
pickup.model = createObject(BOX_MDL, x, y, z)
setElementParent(pickup.model, pickup.element)
setElementCollisionsEnabled(pickup.model, false)
elseif (pickupType == 2) then
pickup.element = createElement("vdm_pickup", "powerup_pickup")
end
table.insert(pickups, pickup)
end
function getPickupList()
return pickups
end
addEventHandler("onPlayerChat", getRootElement(), function(message)
if (message == "test") then
destroyElement(pickups[1].element)
table.remove(pickups, 1)
elseif (message == "test2") then
setElementModel(pickups[1].model, 1272)
end
end)
And here is client-side file:
cl_pickups = {}
function clientUpdatePickupListHandler(list)
local len = #list
table.insert(cl_pickups, list[len])
end
addEvent("clientUpdatePickupList", true)
addEventHandler("clientUpdatePickupList", getResourceRootElement(), clientUpdatePickupListHandler)
local delta_phi = 6
addEventHandler("onClientRender", getRootElement(), function()
if (#cl_pickups == 0) then return false
else
for i = 1, #cl_pickups do
if (cl_pickups[i].isActive) then
if (cl_pickups[i].rot_angle == 360) then
cl_pickups[i].rot_angle = 0
end
local x, y, z = getElementPosition(cl_pickups[i].model)
local rx, ry, rz = getElementRotation(cl_pickups[i].model)
setElementPosition(cl_pickups[i].model, x, y, cl_pickups[i].startZ + 0.2 * math.sin(math.rad(cl_pickups[i].rot_angle)))
setElementRotation(cl_pickups[i].model, rx, 5 * math.sin(math.rad(cl_pickups[i].rot_angle)), cl_pickups[i].rot_angle)
cl_pickups[i].rot_angle = cl_pickups[i].rot_angle + delta_phi
end
end
end
end)
addEventHandler("onClientCharacter", getRootElement(), function(char)
if (char == 'o') then
setElementModel(cl_pickups[1].model, 1270)
end
end)
Tested it and works as it should. I have few questions:
1. I am using tables to pass data. I know i can also use setElementData. Which method is better in this case?
2. I already mentioned it is animated using onClientRender. Is this good approach? I know i could use timers on server and animate it that way and i understand animations would be synced for all clients but animation will lag as the server lags. Client-side approach is independent on server connection, but it is not synced between clients. However, i think that it does not matter since animation is purely aesthetic.
3. I added onPlayerChat and onClientCharacter as a debug functions. When i type "test2", since it is server-side function, model is changed for all clients and it does. When i press 'o', since it is client-side function, it changes model for that particular player only. So if i understand right, am i passing reference to elements and objects when i pass tables from server to clients?
Thanks everyone and i apologise for a longer post!