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)