forked from Simnation/Main
232 lines
7.5 KiB
Lua
232 lines
7.5 KiB
Lua
--[[ require ]]
|
|
|
|
local Utils = require 'modules.utils.client'
|
|
local Target = require 'modules.target.client'
|
|
|
|
--[[ state ]]
|
|
|
|
Explode = {}
|
|
|
|
local plantModel = 'prop_bomb_01'
|
|
|
|
local ownedAtmObjects = {}
|
|
local ownedCashPiles = {}
|
|
|
|
--[[ functions ]]
|
|
|
|
local function deleteOwnedCashPile(entity)
|
|
for key, value in pairs(ownedCashPiles) do
|
|
if value == entity then
|
|
if DoesEntityExist(value) then
|
|
SetEntityAsMissionEntity(value, true, true)
|
|
DeleteEntity(value)
|
|
end
|
|
table.remove(ownedCashPiles, key)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
local function deleteOwnedAtmObjects()
|
|
for key, value in pairs(ownedAtmObjects) do
|
|
if DoesEntityExist(value) then
|
|
SetEntityAsMissionEntity(value, true, true)
|
|
DeleteEntity(value)
|
|
end
|
|
end
|
|
for key, value in pairs(ownedCashPiles) do
|
|
if DoesEntityExist(value) then
|
|
SetEntityAsMissionEntity(value, true, true)
|
|
DeleteEntity(value)
|
|
end
|
|
local zoneKey = string.format('atmrobbery_explode_pickup_money_%d', key)
|
|
Target.removeZone(zoneKey)
|
|
end
|
|
ownedAtmObjects = {}
|
|
ownedCashPiles = {}
|
|
end
|
|
|
|
local function createMoneyObject(entity)
|
|
local coords = GetOffsetFromEntityInWorldCoords(entity, 0.0, -.5, 1.0)
|
|
local rotation = GetEntityRotation(entity)
|
|
local model = 'bkr_prop_bkr_cashpile_05'
|
|
|
|
local objectCashPile = Utils.CreateObject(model, coords, rotation, true, true, false)
|
|
|
|
table.insert(ownedCashPiles, objectCashPile)
|
|
|
|
lib.waitFor(function()
|
|
return PlaceObjectOnGroundProperly(objectCashPile)
|
|
end, nil, 1000)
|
|
|
|
local zoneKey = string.format('atmrobbery_explode_pickup_money_%d', #ownedCashPiles)
|
|
Target.addBoxZone(zoneKey, {
|
|
coords = GetEntityCoords(objectCashPile),
|
|
size = vector3(1.75, 1.75, 1.75),
|
|
debug = false,
|
|
options = {
|
|
{
|
|
icon = 'fa-solid fa-hand-fist',
|
|
label = locale('collect'),
|
|
distance = 1.5,
|
|
pile = objectCashPile,
|
|
onSelect = function()
|
|
client.setBusy(false, 'explode.onCashPileCollected')
|
|
local playerPedId = cache.ped
|
|
Target.removeZone(zoneKey)
|
|
lib.playAnim(playerPedId, 'pickup_object', 'pickup_low', nil, nil, 1000)
|
|
|
|
Citizen.Wait(1000)
|
|
ClearPedTasks(playerPedId)
|
|
deleteOwnedCashPile(objectCashPile)
|
|
|
|
lib.callback.await(_e('server:explode:collectAtmCashPile'), false)
|
|
end
|
|
}
|
|
}
|
|
})
|
|
end
|
|
|
|
function Explode.PlantBomb(_, model)
|
|
Utils.debug('Explode.PlantBomb | Selected ATM Model: ', model)
|
|
|
|
local pedCoords = GetEntityCoords(cache.ped)
|
|
|
|
local entity = GetClosestObjectOfType(pedCoords.x, pedCoords.y, pedCoords.z, 2.0,
|
|
model, false, false, false)
|
|
|
|
if not DoesEntityExist(entity) then return end
|
|
|
|
local atmCoords = GetEntityCoords(entity)
|
|
local atmRotation = GetEntityRotation(entity)
|
|
local atmModel = GetEntityModel(entity)
|
|
|
|
if Entity(entity).state.robbed then
|
|
return Utils.Notify(locale('atm_can_not_be_rob'), 'error')
|
|
end
|
|
|
|
if lib.callback.await(_e('server:IsAtmHacked'), false, atmModel, atmCoords) then
|
|
return Utils.Notify(locale('atm_can_not_be_hack'), 'error')
|
|
end
|
|
|
|
if not lib.callback.await(_e('server:HasItem'), false, Config.Explode.requiredItem.name) then
|
|
return Utils.Notify(locale('need_item', Config.Explode.requiredItem.label), 'error')
|
|
end
|
|
|
|
Utils.TriggerPoliceAlert(atmCoords)
|
|
client.setHeadingToObject(atmModel)
|
|
client.setBusy(true, 'explode.plantbomb')
|
|
|
|
local modelOffset = Config.PlantOffset[atmModel] or vector3(0.0, 0.0, 1.0)
|
|
local playerPedId = cache.ped
|
|
local animDict = 'anim@heists@ornate_bank@thermal_charge'
|
|
local animName = 'thermal_charge'
|
|
|
|
lib.requestAnimDict(animDict)
|
|
|
|
local sceneCoord = GetOffsetFromEntityInWorldCoords(entity, modelOffset.x, modelOffset.y, modelOffset.z)
|
|
local sceneRot = atmRotation
|
|
|
|
local plantScene = NetworkCreateSynchronisedScene(sceneCoord.x, sceneCoord.y, sceneCoord.z,
|
|
sceneRot.x, sceneRot.y, sceneRot.z, 2,
|
|
false, false, 1065353216, 0, 1.3)
|
|
NetworkAddPedToSynchronisedScene(playerPedId,
|
|
plantScene, animDict,
|
|
animName,
|
|
1.5, -4.0, 1, 16, 1148846080, 0)
|
|
NetworkStartSynchronisedScene(plantScene)
|
|
|
|
Citizen.Wait(1500)
|
|
|
|
local plantObject = Utils.CreateObject(plantModel, vector3(0.0, 0.0, 0.0), nil, true, false, false)
|
|
SetEntityCollision(plantObject, false, true)
|
|
AttachEntityToEntity(plantObject, playerPedId,
|
|
GetPedBoneIndex(playerPedId, 28422),
|
|
0.0, 0.0, 0.0, 0.0, 0.0, 200.0,
|
|
true, true, false, true, 1, true)
|
|
|
|
Citizen.Wait(2500)
|
|
local coords = GetEntityCoords(plantObject)
|
|
local rotation = GetEntityRotation(plantObject)
|
|
DeleteEntity(plantObject)
|
|
ClearPedTasks(playerPedId)
|
|
RemoveAnimDict(animDict)
|
|
|
|
TriggerServerEvent(_e('server:RemoveItem'), Config.Explode.requiredItem.name)
|
|
|
|
local data = {
|
|
bombCoords = coords,
|
|
bombRot = rotation,
|
|
atmCoords = atmCoords,
|
|
atmModel = atmModel
|
|
}
|
|
|
|
TriggerServerEvent(_e('server:explode:onBombPlanted'), data)
|
|
end
|
|
|
|
function Explode.Clear()
|
|
deleteOwnedAtmObjects()
|
|
end
|
|
|
|
--[[ events ]]
|
|
|
|
RegisterNetEvent(_e('client:explode:onBombPlanted'), function(data, owner)
|
|
local atmCoords = data.atmCoords
|
|
local atmModel = data.atmModel
|
|
local atmEntity = GetClosestObjectOfType(atmCoords.x, atmCoords.y, atmCoords.z, 2.0,
|
|
atmModel, false, false, false)
|
|
|
|
if not DoesEntityExist(atmEntity) then return end
|
|
|
|
Entity(atmEntity).state.robbed = true
|
|
|
|
local bombCoords = data.bombCoords
|
|
local bombRot = data.bombRot
|
|
|
|
local bombObject = Utils.CreateObject(plantModel, bombCoords, bombRot, true, false, false)
|
|
|
|
for i = 7, 1, -1 do
|
|
PlaySoundFromCoord(-1, 'Beep_Red',
|
|
bombCoords.x, bombCoords.y, bombCoords.z,
|
|
'DLC_HEIST_HACKING_SNAKE_SOUNDS', 0, 0, 0)
|
|
Citizen.Wait(1000)
|
|
end
|
|
|
|
AddExplosion(bombCoords.x, bombCoords.y, bombCoords.z, 2, 2.0, true, false, 1.0, false)
|
|
PlaySoundFromCoord(-1, 'Bomb_Disarmed',
|
|
bombCoords.x, bombCoords.y, bombCoords.z,
|
|
'GTAO_Speed_Convoy_Soundset', 0, 0, 0)
|
|
|
|
DeleteEntity(bombObject)
|
|
|
|
|
|
if owner == cache.serverId then
|
|
createMoneyObject(atmEntity)
|
|
|
|
local ownedAtm = Utils.CreateObject(atmModel,
|
|
GetEntityCoords(atmEntity), GetEntityRotation(atmEntity),
|
|
false, true, false)
|
|
ActivatePhysics(ownedAtm)
|
|
SetEntityDynamic(ownedAtm, true)
|
|
table.insert(ownedAtmObjects, ownedAtm)
|
|
|
|
Entity(ownedAtm).state.robbed = true
|
|
|
|
SetEntityAsMissionEntity(atmEntity, true, true)
|
|
DeleteEntity(atmEntity)
|
|
|
|
local forceDirection = vector3(1.0, 1.0, 1.0)
|
|
ApplyForceToEntity(ownedAtm, 1,
|
|
forceDirection.x, forceDirection.y, forceDirection.z,
|
|
0, 0, 0, true, true, true, true, false, true)
|
|
|
|
Citizen.CreateThread(function()
|
|
local ownedAtm = ownedAtm
|
|
Citizen.Wait(10000)
|
|
SetEntityAsNoLongerNeeded(ownedAtm)
|
|
end)
|
|
else
|
|
SetEntityAsMissionEntity(atmEntity, true, true)
|
|
DeleteEntity(atmEntity)
|
|
end
|
|
end)
|