diff --git a/tp-advancedzombies/client/tp-client_main.lua b/tp-advancedzombies/client/tp-client_main.lua index 75b33b4..5ea2d59 100644 --- a/tp-advancedzombies/client/tp-client_main.lua +++ b/tp-advancedzombies/client/tp-client_main.lua @@ -63,6 +63,26 @@ function isPlayerDead() return isDead end +if Config.Zombies.Networked then + Citizen.CreateThread(function() + while true do + Wait(1000) + local playerCoords = GetEntityCoords(PlayerPedId()) + ESX.TriggerServerCallback('tp-advancedzombies:getZombies', function(cb) + if Config.Debug then + print(dump(entitys)) + end + entitys = cb + if Config.Debug then + print(dump(cb)) + end + end, playerCoords) + if Config.Debug then + print("Entity Table Updated") + end + end + end) +end if Config.Zombies.AttackPlayersOnShooting then @@ -157,14 +177,21 @@ if Config.Zombies.PlayCustomSpeakingSounds then if sounds ~= nil and next(sounds) ~= nil then local _sound = sounds[ math.random( #sounds ) ] - - SendNUIMessage({ - action = "playSound", - - sound = _sound, - soundVolume = volume - }) - + if Config.High3DSounds then + exports["high_3dsounds"]:Play3DEntity( + NetworkGetNetworkIdFromEntity(v.entity), -- entity net id + 50.0, -- distance + _sound, -- sound URL/file name + volume, -- volume + false -- looped + ) + else + SendNUIMessage({ + action = "playSound", + sound = _sound, + soundVolume = volume + }) + end end end @@ -359,7 +386,7 @@ StartCheckingZombiePedKills = function() pedX, pedY, pedZ = table.unpack(GetEntityCoords(v.entity, true)) if not DoesEntityExist(v.entity) then - table.remove(entitys, i) + removeZombie(v.entity,i) end if IsPedDeadOrDying(v.entity, 1) == 1 then @@ -397,7 +424,7 @@ StartCheckingZombiePedKills = function() local model = GetEntityModel(v.entity) SetEntityAsNoLongerNeeded(v.entity) SetModelAsNoLongerNeeded(model) - table.remove(entitys, i) + removeZombie(v.entity,i) Wait(2000) @@ -451,7 +478,7 @@ AddEventHandler("tp-advancedzombies:onZombieSync", function() SetModelAsNoLongerNeeded(GetEntityModel(v.entity)) DeleteEntity(v.entity) - table.remove(entitys,i) + removeZombie(v.entity,i) end end @@ -540,8 +567,13 @@ AddEventHandler("tp-advancedzombies:onZombieSync", function() end until canSpawn - - local entity = CreatePed(4, GetHashKey(EntityModel), posX, posY, posZ, 0.0, false, false) + + if Config.Zombies.Networked then + entity = CreatePed(4, GetHashKey(EntityModel), posX, posY, posZ, 0.0, true, false) + else + entity = CreatePed(4, GetHashKey(EntityModel), posX, posY, posZ, 0.0, false, false) + end + local entityMaxHealth = Config.ZombiePedModelsData[string.lower(EntityModel)].data.health SetEntityHealth(entity, entityMaxHealth) @@ -584,9 +616,7 @@ AddEventHandler("tp-advancedzombies:onZombieSync", function() --if not NetworkGetEntityIsNetworked(entity) then -- NetworkRegisterEntityAsNetworked(entity) --end - - table.insert(entitys, {entity = entity, name = EntityModel}) - + addZombie(entity,EntityModel) local playerX, playerY, playerZ = table.unpack(GetEntityCoords(GetPlayerPed(-1), true)) local distance = GetDistanceBetweenCoords(GetEntityCoords(GetPlayerPed(-1)), GetEntityCoords(entity), true) @@ -604,7 +634,7 @@ AddEventHandler("tp-advancedzombies:onZombieSync", function() for i, v in pairs(entitys) do if not DoesEntityExist(v.entity) then SetEntityAsNoLongerNeeded(v.entity) - table.remove(entitys, i) + removeZombie(v.entity,i) else local playerX, playerY, playerZ = table.unpack(GetEntityCoords(GetPlayerPed(-1), true)) local pedX, pedY, pedZ = table.unpack(GetEntityCoords(v.entity, true)) @@ -614,7 +644,7 @@ AddEventHandler("tp-advancedzombies:onZombieSync", function() SetEntityAsNoLongerNeeded(v.entity) SetModelAsNoLongerNeeded(model) --Citizen.Trace("Zombie Eliminated\n") - table.remove(entitys, i) + removeZombie(v.entity,i) end end @@ -623,7 +653,7 @@ AddEventHandler("tp-advancedzombies:onZombieSync", function() SetEntityAsNoLongerNeeded(v.entity) SetModelAsNoLongerNeeded(model) DeleteEntity(v.entity) - table.remove(entitys,i) + removeZombie(v.entity,i) --Citizen.Trace("Zombie Eliminated from Water\n") end end @@ -703,7 +733,7 @@ AddEventHandler('tp-advancedzombies:clearZombies', function() for i, v in pairs(entitys) do if not DoesEntityExist(v.entity) then - table.remove(entitys, i) + removeZombie(v.entity,i) end local model = GetEntityModel(v.entity) @@ -721,3 +751,40 @@ AddEventHandler("onResourceStop", function(resourceName) TriggerEvent('tp-advancedzombies:clearZombies') end) + + +function addZombie(entity,EntityModel) + if Config.Debug then + print("add zombie called") + print(entity) + end + if Config.Zombies.Networked then + TriggerServerEvent("tp-advancedzombies:addZombie", entity) + if Config.Debug then + print("added via client") + end + else + table.insert(entitys, {entity = entity, name = EntityModel}) + end +end + +function removeZombie(entity,tableRow) + if Config.Zombies.Networked then + TriggerServerEvent("tp-advancedzombies:removeZombie", entity) + else + table.remove(entitys, tableRow) + end +end + +function dump(o) + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end + s = s .. '['..k..'] = ' .. dump(v) .. ',' + end + return s .. '} ' + else + return tostring(o) + end + end \ No newline at end of file diff --git a/tp-advancedzombies/config.lua b/tp-advancedzombies/config.lua index 513cb4f..120ca75 100644 --- a/tp-advancedzombies/config.lua +++ b/tp-advancedzombies/config.lua @@ -93,6 +93,8 @@ Config.ZombiePedModelWalks = { "move_lester_CaneUp", } +Config.High3DSounds = false -- Enables intergration with High3DSounds and disables NUI Player + -- https://www.high-scripts.com/package/5035810 Config.MuteAmbience = true Config.NotHealthRecharge = true @@ -103,6 +105,7 @@ Config.Zombies = { -- If you set this to true, zombies will only spawn in zones where you allow. SpawnZombiesOnlyInZones = false, + Networked = false, -- Requires ESX for callbacks SpawnZombieAtDaylight = 5, SpawnZombieAtNight = 10, diff --git a/tp-advancedzombies/server/tp-server_functions.lua b/tp-advancedzombies/server/tp-server_functions.lua index 413c7df..33b794a 100644 --- a/tp-advancedzombies/server/tp-server_functions.lua +++ b/tp-advancedzombies/server/tp-server_functions.lua @@ -1,6 +1,7 @@ -- ESX & QBCore Support. ESX, QBCore = nil, nil +zombieEntites = {} if Config.Framework == "ESX" then TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) @@ -51,4 +52,60 @@ function getOnlinePlayers() return QBCore.Functions.GetPlayers() end -end \ No newline at end of file +end + +function addEntityToTable(entity,EntityModel) + table.insert(zombieEntites, {entity = entity, name = EntityModel}) +end + +function getEntityTable() + return zombieEntites +end + +function removeEntityFromTable(entity) + for i, v in ipairs (zombieEntites) do + if (v.entity == entity) then + zombieEntites[i] = nil + end + end +end + +RegisterServerEvent("tp-advancedzombies:addZombie") +AddEventHandler("tp-advancedzombies:addZombie", function(entity, EntityModel) + if Config.Debug then + print("entity added | server table") + end + addEntityToTable(entity,EntityModel) +end) + +RegisterServerEvent("tp-advancedzombies:removeZombie") +AddEventHandler("tp-advancedzombies:removeZombie", function(entity, EntityModel) + if Config.Debug then + print("entity removed | server table") + end + removeEntityFromTable(entity) +end) + +ESX.RegisterServerCallback('tp-advancedzombies:getZombies', function(source, cb) + if Config.Debug then + print("callback initiated") + end + zombies = getEntityTable() + if Config.Debug then + print(dump(zombies)) + end + cb(zombies) +end) + +function dump(o) + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end + s = s .. '['..k..'] = ' .. dump(v) .. ',' + end + return s .. '} ' + else + return tostring(o) + end + end \ No newline at end of file