forked from Simnation/Main
173 lines
No EOL
5.7 KiB
Lua
173 lines
No EOL
5.7 KiB
Lua
local spawnedAnimals = {}
|
|
local spawnedPersons = {}
|
|
local spawnedProps = {}
|
|
local isPedsSpawned = false
|
|
local count = 0
|
|
|
|
---Detete all things (Persons, Animals, Object). On resource stop.
|
|
---@param resourceName string
|
|
---@return string? count
|
|
local function deleteAll(resourceName)
|
|
if GetCurrentResourceName() ~= resourceName then
|
|
return
|
|
end
|
|
|
|
for k, v in pairs(spawnedPersons) do
|
|
DeletePed(v)
|
|
count = count + 1
|
|
end
|
|
|
|
for k, v in pairs(spawnedAnimals) do
|
|
DeletePed(v)
|
|
count = count + 1
|
|
end
|
|
|
|
for k, v in pairs(spawnedProps) do
|
|
DeleteObject(v)
|
|
count = count + 1
|
|
end
|
|
|
|
return print(('[Resource Stopped] Delete %s Persons, Animals, Props'):format(count))
|
|
end
|
|
|
|
---Load a model. Check if model is valid. If it is already loaded, it immediately returns the hash value.
|
|
---@param hash number
|
|
---@return number? hash
|
|
local function requestModel(hash)
|
|
if not tonumber(hash) then
|
|
return print(('[RequestModel Function] That value: %s its not number/hash. Use backtics ``'):format(hash))
|
|
end
|
|
|
|
if not IsModelValid(hash) then
|
|
return print(('[RequestModel Function] Attempted to load invalid model %s'):format(hash))
|
|
end
|
|
|
|
if HasModelLoaded(hash) then
|
|
return hash
|
|
end
|
|
|
|
RequestModel(hash)
|
|
while not HasModelLoaded(hash) do
|
|
Wait(50)
|
|
end
|
|
|
|
return hash
|
|
end
|
|
|
|
---Load a dict. Check if animDict is valid. If it is already loaded, it immediately returns the animDict value.
|
|
---@param animDict string
|
|
---@return string? animDict
|
|
local function requestAnimDict(animDict)
|
|
if type(animDict) ~= 'string' then
|
|
return print(('[RequestAnimDict Function] Expected animDict to have type string (received %s)'):format(type(animDict)))
|
|
end
|
|
|
|
if not DoesAnimDictExist(animDict) then
|
|
return print(('[RequestAnimDict Function] Attempted to load invalid animDict %s'):format(animDict))
|
|
end
|
|
|
|
if HasAnimDictLoaded(animDict) then
|
|
return animDict
|
|
end
|
|
|
|
RequestAnimDict(animDict)
|
|
while not HasAnimDictLoaded(animDict) do
|
|
Wait(50)
|
|
end
|
|
|
|
return animDict
|
|
end
|
|
|
|
---Spawn Persons, Animal and object. Save that things in 3 tables.
|
|
local function spawnPeds()
|
|
if isPedsSpawned then
|
|
return
|
|
end
|
|
|
|
isPedsSpawned = true
|
|
|
|
for i = 1, #Config.Animals, 1 do
|
|
local Animal = Config.Animals[i]
|
|
|
|
requestModel(Animal.animalHash)
|
|
|
|
local createdAnimal = CreatePed('ANIMAL', Animal.animalHash, Animal.animalCoords.x, Animal.animalCoords.y, Animal.animalCoords.z, Animal.animalCoords.w, false, false)
|
|
|
|
FreezeEntityPosition(createdAnimal, Animal.animalSettings.FreezeAnimal)
|
|
|
|
SetEntityInvincible(createdAnimal, Animal.animalSettings.Invincible)
|
|
SetPedDiesWhenInjured(createdAnimal, not Animal.animalSettings.Invincible)
|
|
SetPedCanPlayAmbientAnims(createdAnimal, Animal.animalSettings.Invincible)
|
|
SetPedCanRagdollFromPlayerImpact(createdAnimal, not Animal.animalSettings.Invincible)
|
|
|
|
SetBlockingOfNonTemporaryEvents(createdAnimal, Animal.animalSettings.BlockingOfNonTemporaryEvents)
|
|
|
|
SetEntityAsMissionEntity(createdAnimal, true, true)
|
|
SetModelAsNoLongerNeeded(Animal.animalHash)
|
|
|
|
if Animal.animalScenario then
|
|
TaskStartScenarioInPlace(createdAnimal, Animal.animalScenario, -1, true)
|
|
end
|
|
|
|
spawnedAnimals[i] = createdAnimal
|
|
end
|
|
|
|
for i = 1, #Config.Persons, 1 do
|
|
local Person = Config.Persons[i]
|
|
|
|
requestModel(Person.pedHash)
|
|
|
|
local createdPed = CreatePed('ANIMAL', Person.pedHash, Person.pedCoords.x, Person.pedCoords.y, Person.pedCoords.z, Person.pedCoords.w, false, false)
|
|
|
|
FreezeEntityPosition(createdPed, Person.pedSettings.FreezePerson or false)
|
|
|
|
if Person.pedSettings.Invincible then
|
|
SetEntityInvincible(createdPed, true)
|
|
SetPedDiesWhenInjured(createdPed, false)
|
|
SetPedCanPlayAmbientAnims(createdPed, true)
|
|
SetPedCanRagdollFromPlayerImpact(createdPed, false)
|
|
end
|
|
|
|
SetBlockingOfNonTemporaryEvents(createdPed, Person.pedSettings.BlockingOfNonTemporaryEvents)
|
|
|
|
SetEntityAsMissionEntity(createdPed, true, true)
|
|
SetModelAsNoLongerNeeded(Person.pedHash)
|
|
|
|
if Person.pedAnimation.animDict and Person.pedAnimation.animName and Person.pedAnimation.animFlag then
|
|
requestAnimDict(Person.pedAnimation.animDict)
|
|
|
|
TaskPlayAnim(createdPed, Person.pedAnimation.animDict, Person.pedAnimation.animName, 2.0, 2.0, -1, Person.pedAnimation.animFlag, 0, false, false, false)
|
|
end
|
|
|
|
if Person.pedProp.propHash and Person.pedProp.propBone and Person.pedProp.propPlacement then
|
|
local pedCoords = GetEntityCoords(createdPed)
|
|
local x, y, z = table.unpack(pedCoords)
|
|
local xPos, yPos, zPos, xRot, yRot, zRot = table.unpack(Person.pedProp.propPlacement)
|
|
|
|
requestModel(Person.pedProp.propHash)
|
|
|
|
local createdProp = CreateObject(Person.pedProp.propHash, x, y, z+0.2, true, true, true)
|
|
|
|
AttachEntityToEntity(createdProp, createdPed, GetPedBoneIndex(createdPed, Person.pedProp.propBone), xPos, yPos, zPos, xRot, yRot, zRot, true, true, false, true, 1, true)
|
|
SetModelAsNoLongerNeeded(Person.pedProp.propHash)
|
|
|
|
spawnedProps[i] = createdProp
|
|
end
|
|
|
|
spawnedPersons[i] = createdPed
|
|
end
|
|
end
|
|
|
|
---@param resourceName string
|
|
---@return function? spawnPeds
|
|
local function spawnPedsOnStart(resourceName)
|
|
if GetCurrentResourceName() ~= resourceName then
|
|
return
|
|
end
|
|
|
|
return spawnPeds()
|
|
end
|
|
|
|
AddEventHandler('playerSpawned', spawnPeds)
|
|
AddEventHandler('onResourceStart', spawnPedsOnStart)
|
|
AddEventHandler('onResourceStop', deleteAll) |