I have created a resource for attaching missiles and bombs to vehicles, however the client of the player who has fired some projectiles sometimes crashes after the projectiles have exploded.
Server code:
function addVehicleBomb(vehicle, xoff, yoff, zoff, key)
local attachedBombs={}
if getElementData(vehicle,"bombObjs") then
attachedBombs=getElementData(vehicle,"bombObjs")
end
local bombObject = createObject(1636,0,0,0,0,0,0)
attachElements(bombObject,vehicle,xoff,yoff,zoff)
setElementData(bombObject,"bombAvailable","1")
setElementData(bombObject,"bombKey",key)
table.insert(attachedBombs,bombObject)
setElementData(vehicle,"bombObjs",attachedBombs)
triggerClientEvent("vehicleGunsChanged", getRootElement(), vehicle)
end
function removeVehicleBombs(vehicle)
if getElementData(vehicle,"bombObjs") then
attachedBombs=getElementData(vehicle,"bombObjs")
for index2,bomb in pairs(attachedBombs) do
destroyElement(bomb)
table.remove(attachedBombs,index2)
end
end
end
function addVehicleMissile(vehicle, xoff, yoff, zoff, key)
local attachedMissiles={}
if getElementData(vehicle,"missileObjs") then
attachedMissiles=getElementData(vehicle,"missileObjs")
end
local missileObject = createObject(3790,0,0,0,0,0,0)
attachElements(missileObject,vehicle,xoff,yoff,zoff,0,0,-90)
setElementData(missileObject,"missileAvailable","1")
setElementData(missileObject,"missileKey",key)
table.insert(attachedMissiles,missileObject)
setElementData(vehicle,"missileObjs",attachedMissiles)
triggerClientEvent("vehicleGunsChanged", getRootElement(), vehicle)
end
addEventHandler( "onVehicleExplode", getRootElement( ),
function()
local attachedBombs=getElementData(source,"bombObjs")
if attachedBombs then
for index2,bomb in pairs(attachedBombs) do
setElementData(bomb,"bombAvailable","0")
setElementAlpha(bomb,0)
end
end
local attachedMissiles=getElementData(source,"missileObjs")
if attachedMissiles then
for index2,missile in pairs(attachedMissiles) do
setElementData(missile,"missileAvailable","0")
setElementAlpha(missile,0)
end
end
end
)
function onVehicleRespawn ( exploded )
local attachedBombs=getElementData(source,"bombObjs")
if attachedBombs then
for index2,bomb in pairs(attachedBombs) do
setElementData(bomb,"bombAvailable","1")
setElementAlpha(bomb,255)
end
end
local attachedMissiles=getElementData(source,"missileObjs")
if attachedMissiles then
for index2,missile in pairs(attachedMissiles) do
setElementData(missile,"missileAvailable","1")
setElementAlpha(missile,255)
end
end
end
addEventHandler ( "onVehicleRespawn", getRootElement(), onVehicleRespawn )
Client code:
addEvent("vehicleGunsChanged",true);
addEventHandler("vehicleGunsChanged",getRootElement(),
function(plane)
if getElementData(plane,"bombObjs") then
local attachedBombs=getElementData(plane,"bombObjs")
for index2,obj in pairs(attachedBombs) do
setObjectScale(obj,1)
setElementCollisionsEnabled(obj,false)
end
end
if getElementData(plane,"missileObjs") then
local attachedMissiles=getElementData(plane,"missileObjs")
for index2,obj in pairs(attachedMissiles) do
setObjectScale(obj,0.5)
setElementCollisionsEnabled(obj,false)
end
end
end)
function keyInput(key, keyState )
local player = getLocalPlayer()
local vehicle = getPedOccupiedVehicle(player)
outputChatBox("pressed")
if keyState == "down" then
local attachedBombs=getElementData(vehicle,"bombObjs")
if attachedBombs then
for index2,bomb in pairs(attachedBombs) do
if ((getElementData(bomb,"bombAvailable")=="1") and (getElementData(bomb,"bombKey")==key)) then
local x,y,z=getElementPosition(bomb)
z=z-1
local rx,ry,rz=getElementRotation(vehicle)
local vx,vy,vz=getElementVelocity(vehicle)
createProjectile( getLocalPlayer(), 21, x, y, z, 1.0, nil, rx, ry, rz, vx, vy, vz,1636)
setElementData(bomb,"bombAvailable","0")
setElementAlpha(bomb,0)
break
end
end
end
local attachedMissiles=getElementData(vehicle,"missileObjs")
if attachedMissiles then
for index2,missile in pairs(attachedMissiles) do
if ((getElementData(missile,"missileAvailable")=="1") and (getElementData(missile,"missileKey")==key)) then
outputChatBox("fire?")
local x,y,z=getElementPosition(missile)
z=z-1
local rx,ry,rz=getElementRotation(missile)
rz=rz+90
local vx,vy,vz=getElementVelocity(vehicle)
createProjectile(getLocalPlayer(), 19, x, y, z, 1.0, nil, rx, ry, rz, vx*3, vy*3, vz*3)
setElementData(missile,"missileAvailable","0")
setElementAlpha(missile,0)
break
end
end
end
end
end
function addKeyBindings(vehicle)
outputChatBox("bound")
local player = getLocalPlayer()
local attachedBombs=getElementData(vehicle,"bombObjs")
if attachedBombs then
for index2,bomb in pairs(attachedBombs) do
unbindKey(getElementData(bomb,"bombKey"))
bindKey(getElementData(bomb,"bombKey"),"both",keyInput)
end
end
local attachedMissiles=getElementData(vehicle,"missileObjs")
if attachedMissiles then
for index2,missile in pairs(attachedMissiles) do
unbindKey(getElementData(missile,"missileKey"))
bindKey(getElementData(missile,"missileKey"),"both",keyInput)
end
end
end
function removeKeyBindings(vehicle)
local player = getLocalPlayer()
outputChatBox("unbound")
local attachedBombs=getElementData(vehicle,"bombObjs")
if attachedBombs then
for index2,bomb in pairs(attachedBombs) do
unbindKey(getElementData(bomb,"bombKey"))
end
end
local attachedMissiles=getElementData(vehicle,"missileObjs")
if attachedMissiles then
for index2,missile in pairs(attachedMissiles) do
unbindKey(getElementData(missile,"missileKey"))
end
end
end
addEventHandler("onClientVehicleEnter", getRootElement(),
function(thePlayer, seat)
if (thePlayer == getLocalPlayer()) and (seat==0) then
addKeyBindings(source)
end
end
)
addEventHandler("onClientVehicleExit", getRootElement(),
function(thePlayer, seat)
if (thePlayer == getLocalPlayer()) then
removeKeyBindings(source)
end
end
)
addEventHandler("onClientPlayerWasted", getLocalPlayer(),
function()
local vehicle = getPedOccupiedVehicle(player)
if (vehicle) then
removeKeyBindings(vehicle)
end
end
)
addEventHandler( "onClientResourceStart", getResourceRootElement( ),
function()
local vehicles = getElementsByType("vehicle")
for index,plane in pairs(vehicles) do
triggerEvent("vehicleGunsChanged",getRootElement(),plane)
end
end)
When i comment out both createProjectile lines, it doesn't crash. Is there a problem in my script or is this a bug?