Hol lehet át állítani, hogy a zombik, ne a 0 -ás dimenzióba jöjjenek létre, hanem például: 1 -es dimenzióba?
client
myZombies = { }
helmetzombies = { 27, 51, 52, 99, 27, 137, 153, 167, 205, 260, 277, 278, 279, 284, 285 }
resourceRoot = getResourceRootElement()
--FORCES ZOMBIES TO MOVE ALONG AFTER THEIR TARGET PLAYER DIES
function playerdead ()
setTimer ( Zomb_release, 4000, 1 )
end
addEventHandler ( \"onClientPlayerWasted\", getLocalPlayer(), playerdead )
function Zomb_release ()
for k, ped in pairs( myZombies ) do
if (isElement(ped)) then
if (getElementData (ped, \"zombie\") == true) then
setElementData ( ped, \"target\", nil )
setElementData ( ped, \"status\", \"idle\" )
table.remove(myZombies,k)
end
end
end
end
--REMOVES A ZOMBIE FROM INFLUENCE AFTER ITS KILLED
function pedkilled ( killer, weapon, bodypart )
if (getElementData (source, \"zombie\") == true) and (getElementData (source, \"status\") ~= \"dead\" ) then
setElementData ( source, \"target\", nil )
setElementData ( source, \"status\", \"dead\" )
end
end
addEventHandler ( \"onClientPedWasted\", getRootElement(), pedkilled )
--THIS CHECKS ALL ZOMBIES EVERY SECOND TO SEE IF THEY ARE IN SIGHT
function zombie_check ()
if (getElementData (getLocalPlayer (), \"zombie\") ~= true) and ( isPlayerDead ( getLocalPlayer () ) == false ) then
local zombies = getElementsByType ( \"ped\",getRootElement(),true )
local Px,Py,Pz = getElementPosition( getLocalPlayer () )
if isPedDucked ( getLocalPlayer ()) then
local Pz = Pz-1
end
for theKey,theZomb in ipairs(zombies) do
if (isElement(theZomb)) then
local Zx,Zy,Zz = getElementPosition( theZomb )
if (getDistanceBetweenPoints3D(Px, Py, Pz, Zx, Zy, Zz) < 45 ) then
if (getElementData (theZomb, \"zombie\") == true) then
if ( getElementData ( theZomb, \"status\" ) == \"idle\" ) then --CHECKS IF AN IDLE ZOMBIE IS IN SIGHT
local isclear = isLineOfSightClear (Px, Py, Pz+1, Zx, Zy, Zz +1, true, false, false, true, false, false, false)
if (isclear == true) then
setElementData ( theZomb, \"status\", \"chasing\" )
setElementData ( theZomb, \"target\", getLocalPlayer() )
table.insert( myZombies, theZomb ) --ADDS ZOMBIE TO PLAYERS COLLECTION
table.remove( zombies, theKey)
zombieradiusalert (theZomb)
end
elseif (getElementData(theZomb,\"status\") == \"chasing\") and (getElementData(theZomb,\"target\") == nil) then --CHECKS IF AN AGGRESSIVE LOST ZOMBIE IS IN SIGHT
local isclear = isLineOfSightClear (Px, Py, Pz+1, Zx, Zy, Zz +1, true, false, false, true, false, false, false)
if (isclear == true) then
setElementData ( theZomb, \"target\", getLocalPlayer() )
isthere = \"no\"
for k, ped in pairs( myZombies ) do
if ped == theZomb then
isthere = \"yes\"
end
end
if isthere == \"no\" then
table.insert( myZombies, theZomb ) --ADDS THE WAYWARD ZOMBIE TO THE PLAYERS COLLECTION
table.remove( zombies, theKey)
end
end
elseif ( getElementData ( theZomb, \"target\" ) == getLocalPlayer() ) then --CHECKS IF AN ALREADY AGGRESSIVE ZOMBIE IS IN SIGHT
local isclear = isLineOfSightClear (Px, Py, Pz+1, Zx, Zy, Zz +1, true, false, false, true, false, false, false)
if (isclear == false) then --IF YOUR ZOMBIE LOST YOU, MAKES IT REMEMBER YOUR LAST COORDS
setElementData ( theZomb, \"target\", nil )
triggerServerEvent (\"onZombieLostPlayer\", theZomb, oldPx, oldPy, oldPz)
end
end
end
end
end
end
--this second half is for checking peds and zombies
local nonzombies = getElementsByType ( \"ped\",getRootElement(),true )
for theKey,theZomb in ipairs(zombies) do
if (isElement(theZomb)) then
if (getElementData (theZomb, \"zombie\") == true) then
local Zx,Zy,Zz = getElementPosition( theZomb )
for theKey,theNonZomb in ipairs(nonzombies) do
if (getElementData (theNonZomb, \"zombie\") ~= true) then -- if the ped isnt a zombie
local Px,Py,Pz = getElementPosition( theNonZomb )
if (getDistanceBetweenPoints3D(Px, Py, Pz, Zx, Zy, Zz) < 45 ) then
local isclear = isLineOfSightClear (Px, Py, Pz+1, Zx, Zy, Zz +1, true, false, false, true, false, false, false )
if (isclear == true) and ( getElementHealth ( theNonZomb ) > 0) then
if ( getElementData ( theZomb, \"status\" ) == \"idle\" ) then --CHECKS IF AN IDLE ZOMBIE IS IN SIGHT
triggerServerEvent (\"onZombieLostPlayer\", theZomb, Px, Py, Pz)
setElementData ( theZomb, \"status\", \"chasing\" )
setElementData ( theZomb, \"target\", theNonZomb )
zombieradiusalert (theZomb)
elseif ( getElementData ( theZomb, \"status\" ) == \"chasing\" ) and ( getElementData ( theZomb, \"target\" ) == nil) then
triggerServerEvent (\"onZombieLostPlayer\", theZomb, Px, Py, Pz)
setElementData ( theZomb, \"target\", theNonZomb )
end
end
end
if ( getElementData ( theZomb, \"target\" ) == theNonZomb ) then --CHECKS IF AN ALREADY AGGRESSIVE ZOMBIE IS IN SIGHT OF THE PED
local Px,Py,Pz = getElementPosition( theNonZomb )
if (getDistanceBetweenPoints3D(Px, Py, Pz, Zx, Zy, Zz) < 45 ) then
local isclear = isLineOfSightClear (Px, Py, Pz+1, Zx, Zy, Zz+1, true, false, false, true, false, false, false)
if (isclear == false) then --IF YOUR ZOMBIE LOST THE PED, MAKES IT REMEMBER the peds LAST COORDS
triggerServerEvent (\"onZombieLostPlayer\", theZomb, Px, Py, Pz)
setElementData ( theZomb, \"target\", nil )
end
end
end
end
end
end
end
end
end
for k, ped in pairs( myZombies ) do
if (isElement(ped) == false) then
table.remove( myZombies, k)
end
end
oldPx,oldPy,oldPz = getElementPosition( getLocalPlayer () )
end
--INITAL SETUP
function clientsetupstarter(startedresource)
if startedresource == getThisResource() then
setTimer ( clientsetup, 1234, 1)
MainClientTimer1 = setTimer ( zombie_check, 1000, 0) --STARTS THE TIMER TO CHECK FOR ZOMBIES
end
end
addEventHandler(\"onClientResourceStart\", getRootElement(), clientsetupstarter)
function clientsetup()
oldPx,oldPy,oldPz = getElementPosition( getLocalPlayer () )
throatcol = createColSphere ( 0, 0, 0, .3)
woodpic = guiCreateStaticImage( .65, .06, .1, .12, \"zombiewood.png\", true )
guiSetVisible ( woodpic, false )
--ALL ZOMBIES STFU
local zombies = getElementsByType ( \"ped\" )
for theKey,theZomb in ipairs(zombies) do
if (isElement(theZomb)) then
if (getElementData (theZomb, \"zombie\") == true) then
setPedVoice(theZomb, \"PED_TYPE_DISABLED\")
end
end
end
--SKIN REPLACEMENTS
local skin = engineLoadTXD ( \"skins/13.txd\" ) --bleedin eyes 31 by Slothman
engineImportTXD ( skin, 13 )
local skin = engineLoadTXD ( \"skins/22.txd\" ) -- slashed 12 by Wall-E
engineImportTXD ( skin, 22 )
local skin = engineLoadTXD ( \"skins/56.txd\" ) --young and blue by Slothman
engineImportTXD ( skin, 56 )
local skin = engineLoadTXD ( \"skins/67.txd\" ) -- slit r* employee
engineImportTXD ( skin, 67 )
local skin = engineLoadTXD ( \"skins/68.txd\" ) -- shredded preist by Deixell
engineImportTXD ( skin, 68 )
local skin = engineLoadTXD ( \"skins/69.txd\" ) --bleedin eyes in denim by Capitanazop
engineImportTXD ( skin, 69 )
local skin = engineLoadTXD ( \"skins/70.txd\" ) --ultra gory scientist by 50p
engineImportTXD ( skin, 70 )
local skin = engineLoadTXD ( \"skins/84.txd\" ) --guitar wolf (nonzombie) by Slothman
engineImportTXD ( skin, 84 )
local skin = engineLoadTXD ( \"skins/92.txd\" ) -- peeled flesh by xbost
engineImportTXD ( skin, 92 )
local skin = engineLoadTXD ( \"skins/97.txd\" ) -- easterboy by Slothman
engineImportTXD ( skin, 97 )
local skin = engineLoadTXD ( \"skins/105.txd\" ) --Scarred Grove Gangster by Wall-E
engineImportTXD ( skin, 105 )
local skin = engineLoadTXD ( \"skins/107.txd\" ) --ripped and slashed grove by Wall-E
engineImportTXD ( skin, 107 )
local skin = engineLoadTXD ( \"skins/108.txd\" ) -- skeleton thug by Deixell
engineImportTXD ( skin, 108 )
local skin = engineLoadTXD ( \"skins/111.txd\" ) --Frank West from dead rising (nonzombie) by Slothman
engineImportTXD ( skin, 111 )
local skin = engineLoadTXD ( \"skins/126.txd\" ) -- bullet ridden wiseguy by Slothman
engineImportTXD ( skin, 126 )
local skin = engineLoadTXD ( \"skins/127.txd\" ) --flyboy from dawn of the dead by Slothman
engineImportTXD ( skin, 127 )
local skin = engineLoadTXD ( \"skins/128.txd\" ) --holy native by Slothman
engineImportTXD ( skin, 128 )
local skin = engineLoadTXD ( \"skins/152.txd\" ) --bitten schoolgirl by Slothman
engineImportTXD ( skin, 152 )
local skin = engineLoadTXD ( \"skins/162.txd\" ) --shirtless redneck by Slothman
engineImportTXD ( skin, 162 )
local skin = engineLoadTXD ( \"skins/167.txd\" ) --dead chickenman by 50p
engineImportTXD ( skin, 167 )
local skin = engineLoadTXD ( \"skins/188.txd\" ) --burnt greenshirt by Slothman
engineImportTXD ( skin, 188 )
local skin = engineLoadTXD ( \"skins/192.txd\" ) --Alice from resident evil (nonzombie) by Slothman
engineImportTXD ( skin, 192 )
local skin = engineLoadTXD ( \"skins/195.txd\" ) --bloody ex by Slothman
engineImportTXD ( skin, 195 )
local skin = engineLoadTXD ( \"skins/206.txd\" ) -- faceless zombie by Slothman
engineImportTXD ( skin, 206 )
local skin = engineLoadTXD ( \"skins/209.txd\" ) --Noodle vendor by 50p
engineImportTXD ( skin, 209 )
local skin = engineLoadTXD ( \"skins/212.txd\" ) --brainy hobo by Slothman
engineImportTXD ( skin, 212 )
local skin = engineLoadTXD ( \"skins/229.txd\" ) --infected tourist by Slothman
engineImportTXD ( skin, 229 )
local skin = engineLoadTXD ( \"skins/230.txd\" ) --will work for brains hobo by Slothman
engineImportTXD ( skin, 230 )
local skin = engineLoadTXD ( \"skins/258.txd\" ) --bloody sided suburbanite by Slothman
engineImportTXD ( skin, 258 )
local skin = engineLoadTXD ( \"skins/264.txd\" ) --scary clown by 50p
engineImportTXD ( skin, 264 )
local skin = engineLoadTXD ( \"skins/274.txd\" ) --Ash Williams (nonzombie) by Slothman
engineImportTXD ( skin, 274 )
local skin = engineLoadTXD ( \"skins/277.txd\" ) -- gutted firefighter by Wall-E
engineImportTXD ( skin, 277 )
local skin = engineLoadTXD ( \"skins/280.txd\" ) --infected cop by Lordy
engineImportTXD ( skin, 280 )
local skin = engineLoadTXD ( \"skins/287.txd\" ) --torn army by Deixell
engineImportTXD ( skin, 287 )
end
--UPDATES PLAYERS COUNT OF AGGRESIVE ZOMBIES
addEventHandler ( \"onClientElementDataChange\", getRootElement(),
function ( dataName )
if getElementType ( source ) == \"ped\" and dataName == \"status\" then
local thestatus = (getElementData ( source, \"status\" ))
if (thestatus == \"idle\") or (thestatus == \"dead\") then
for k, ped in pairs( myZombies ) do
if ped == source and (getElementData (ped, \"zombie\") == true) then
setElementData ( ped, \"target\", nil )
table.remove( myZombies, k)
setElementData ( getLocalPlayer(), \"dangercount\", tonumber(table.getn( myZombies )) )
end
end
end
end
end )
--MAKES A ZOMBIE JUMP
addEvent( \"Zomb_Jump\", true )
function Zjump ( ped )
if (isElement(ped)) then
setPedControlState( ped, \"jump\", true )
setTimer ( function (ped) if ( isElement ( ped ) ) then setPedControlState ( ped, \"jump\", false) end end, 800, 1, ped )
end
end
addEventHandler( \"Zomb_Jump\", getRootElement(), Zjump )
--MAKES A ZOMBIE PUNCH
addEvent( \"Zomb_Punch\", true )
function Zpunch ( ped )
if (isElement(ped)) then
setPedControlState( ped, \"fire\", true )
setTimer ( function (ped) if ( isElement ( ped ) ) then setPedControlState ( ped, \"fire\", false) end end, 800, 1, ped )
end
end
addEventHandler( \"Zomb_Punch\", getRootElement(), Zpunch )
--MAKES A ZOMBIE STFU
addEvent( \"Zomb_STFU\", true )
function Zstfu ( ped )
if (isElement(ped)) then
setPedVoice(ped, \"PED_TYPE_DISABLED\")
end
end
addEventHandler( \"Zomb_STFU\", getRootElement(), Zstfu )
--MAKES A ZOMBIE MOAN
addEvent( \"Zomb_Moan\", true )
function Zmoan ( ped, randnum )
if (isElement(ped)) then
local Zx,Zy,Zz = getElementPosition( ped )
local sound = playSound3D(\"sounds/mgroan\"..randnum..\".ogg\", Zx, Zy, Zz, false)
setSoundMaxDistance(sound, 20)
end
end
addEventHandler( \"Zomb_Moan\", getRootElement(), Zmoan )
--ZOMBIE HEADSHOTS TO ALL BUT HELMETED ZOMBIES
function zombiedamaged ( attacker, weapon, bodypart )
if getElementType ( source ) == \"ped\" then
if (getElementData (source, \"zombie\") == true) then
if ( bodypart == 9 ) then
helmeted = \"no\"
local zskin = getElementModel ( source )
for k, skin in pairs( helmetzombies ) do
if skin == zskin then
helmeted = \"yes\"
end
end
if helmeted == \"no\" then
triggerServerEvent (\"headboom\", source, source, attacker, weapon, bodypart )
end
end
end
end
end
addEventHandler ( \"onClientPedDamage\", getRootElement(), zombiedamaged )
function zombiedkilled(killer, weapon, bodypart)
if getElementType ( source ) == \"ped\" then
if (getElementData (source, \"zombie\") == true) then
setElementCollisionsEnabled(source, false)
end
end
end
addEventHandler ( \"onClientPedWasted\", getRootElement(), zombiedkilled )
--CAUSES MORE DAMAGE TO PLAYER WHEN ATTACKED BY A ZOMBIE
function zombieattack ( attacker, weapon, bodypart )
if (attacker) then
if getElementType ( attacker ) == \"ped\" then
if (getElementData (attacker, \"zombie\") == true) then
local playerHealth = getElementHealth ( getLocalPlayer() )
if playerHealth > 15 then
setElementHealth ( source, playerHealth - 15 )
else
triggerServerEvent (\"playereaten\", source, source, attacker, weapon, bodypart )
end
end
end
end
end
addEventHandler ( \"onClientPlayerDamage\", getLocalPlayer(), zombieattack )
--WOOD GUI
function showwoodpic ( theElement, matchingDimension )
if ( theElement == getLocalPlayer() ) and (getElementData ( source, \"purpose\" ) == \"zombiewood\" ) then
guiSetVisible ( woodpic, true )
end
end
addEventHandler ( \"onClientColShapeHit\", getRootElement(), showwoodpic )
function hidewoodpic ( theElement, matchingDimension )
if ( theElement == getLocalPlayer() ) and (getElementData ( source, \"purpose\" ) == \"zombiewood\" ) then
guiSetVisible ( woodpic, false )
end
end
addEventHandler ( \"onClientColShapeLeave\", getRootElement(), hidewoodpic )
--ZOMBIES ATTACK FROM BEHIND AND GUI STUFF
function movethroatcol ()
local screenWidth, screenHeight = guiGetScreenSize()
local dcount = tostring(table.getn( myZombies ))
dxDrawText( dcount, screenWidth-40, screenHeight -50, screenWidth, screenHeight, tocolor ( 0, 0, 0, 255 ), 1.44, \"pricedown\" )
dxDrawText( dcount, screenWidth-42, screenHeight -52, screenWidth, screenHeight, tocolor ( 255, 255, 255, 255 ), 1.4, \"pricedown\" )
if isElement(throatcol) then
local playerrot = getPedRotation ( getLocalPlayer () )
local radRot = math.rad ( playerrot )
local radius = 1
local px,py,pz = getElementPosition( getLocalPlayer () )
local tx = px + radius * math.sin(radRot)
local ty = py + -(radius) * math.cos(radRot)
local tz = pz
setElementPosition ( throatcol, tx, ty, tz )
end
end
addEventHandler ( \"onClientRender\", getRootElement(), movethroatcol )
function choketheplayer ( theElement, matchingDimension )
if getElementType ( theElement ) == \"ped\" and ( isPlayerDead ( getLocalPlayer () ) == false ) then
if ( getElementData ( theElement, \"target\" ) == getLocalPlayer () ) and (getElementData (theElement, \"zombie\") == true) then
local px,py,pz = getElementPosition( getLocalPlayer () )
setTimer ( checkplayermoved, 600, 1, theElement, px, py, pz)
end
end
end
addEventHandler ( \"onClientColShapeHit\", getRootElement(), choketheplayer )
function checkplayermoved (zomb, px, py, pz)
if (isElement(zomb)) then
local nx,ny,nz = getElementPosition( getLocalPlayer () )
local distance = (getDistanceBetweenPoints3D (px, py, pz, nx, ny, nz))
if (distance < .7) and ( isPlayerDead ( getLocalPlayer () ) == false ) then
setElementData ( zomb, \"status\", \"throatslashing\" )
end
end
end
--ALERTS ANY IDLE ZOMBIES WITHIN A RADIUS OF 10 WHEN GUNSHOTS OCCUR OR OTHER ZOMBIES GET ALERTED
function zombieradiusalert (theElement)
local Px,Py,Pz = getElementPosition( theElement )
local zombies = getElementsByType ( \"ped\" )
for theKey,theZomb in ipairs(zombies) do
if (isElement(theZomb)) then
if (getElementData (theZomb, \"zombie\") == true) then
if ( getElementData ( theZomb, \"status\" ) == \"idle\" ) then
local Zx,Zy,Zz = getElementPosition( theZomb )
local distance = (getDistanceBetweenPoints3D (Px, Py, Pz, Zx, Zy, Zz))
if (distance < 10) and ( isPlayerDead ( getLocalPlayer () ) == false ) then
isthere = \"no\"
for k, ped in pairs( myZombies ) do
if ped == theZomb then
isthere = \"yes\"
end
end
if isthere == \"no\" and (getElementData (getLocalPlayer (), \"zombie\") ~= true) then
if (getElementType ( theElement ) == \"ped\") then
local isclear = isLineOfSightClear (Px, Py, Pz, Zx, Zy, Zz, true, false, false, true, false, false, false)
if (isclear == true) then
setElementData ( theZomb, \"status\", \"chasing\" )
setElementData ( theZomb, \"target\", getLocalPlayer () )
table.insert( myZombies, theZomb ) --ADDS ZOMBIE TO PLAYERS COLLECTION
end
else
setElementData ( theZomb, \"status\", \"chasing\" )
setElementData ( theZomb, \"target\", getLocalPlayer () )
table.insert( myZombies, theZomb ) --ADDS ZOMBIE TO PLAYERS COLLECTION
end
end
end
end
end
end
end
end
function shootingnoise ( weapon, ammo, ammoInClip, hitX, hitY, hitZ, hitElement)
if alertspacer ~= 1 then
if (weapon == 9) then
alertspacer = 1
setTimer ( resetalertspacer, 5000, 1 )
zombieradiusalert(getLocalPlayer ())
elseif (weapon > 21) and (weapon ~= 23) then
alertspacer = 1
setTimer ( resetalertspacer, 5000, 1 )
zombieradiusalert(getLocalPlayer ())
end
end
if hitElement then
if (getElementType ( hitElement ) == \"ped\") then
if (getElementData (hitElement, \"zombie\") == true) then
isthere = \"no\"
for k, ped in pairs( myZombies ) do
if ped == hitElement then
isthere = \"yes\"
end
end
if isthere == \"no\" and (getElementData (getLocalPlayer (), \"zombie\") ~= true) then
setElementData ( hitElement, \"status\", \"chasing\" )
setElementData ( hitElement, \"target\", getLocalPlayer () )
table.insert( myZombies, hitElement ) --ADDS ZOMBIE TO PLAYERS COLLECTION
zombieradiusalert (hitElement)
end
end
end
end
end
addEventHandler ( \"onClientPlayerWeaponFire\", getLocalPlayer (), shootingnoise )
function resetalertspacer ()
alertspacer = nil
end
function choketheplayer ( theElement, matchingDimension )
if getElementType ( theElement ) == \"ped\" and ( isPlayerDead ( getLocalPlayer () ) == false ) and (getElementData (theElement , \"zombie\") == true) then
if ( getElementData ( theElement, \"target\" ) == getLocalPlayer () ) then
local px,py,pz = getElementPosition( getLocalPlayer () )
setTimer ( checkplayermoved, 600, 1, theElement, px, py, pz)
end
end
end
addEvent( \"Spawn_Placement\", true )
function Spawn_Place(xcoord, ycoord)
local x,y,z = getElementPosition( getLocalPlayer() )
local posx = x+xcoord
local posy = y+ycoord
local gz = getGroundPosition ( posx, posy, z+500 )
triggerServerEvent (\"onZombieSpawn\", getLocalPlayer(), posx, posy, gz+1 )
end
addEventHandler(\"Spawn_Placement\", getRootElement(), Spawn_Place)
server
ZombieLimit = get(\"zombies.MaxZombies\")-- HOW MANY ZOMBIES SHOULD EXIST AT MAXIMUM?
ZombieStreaming = get(\"zombies.StreamMethod\") -- 1 to constantly stream zombies, 0 to only allow zombies to spawn via createZombie function, 2 to only allow spawning at set spawnpoints
ZombiePedSkins = {13,22,56,67,68,69,70,92,97,105,107,108,126,127,128,152,162,167,188,195,206,209,212,229,230,258,264,277,280,287 } --ALTERNATE SKIN LISTS FOR ZOMBIES (SHORTER LIST IS TEXTURED ZOMBIES ONLY)
--ZombiePedSkins = {7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,44,45,36,37,38,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,66,67,68,69,70,71,72,73,75,76,77,78,79,80,81,82,83,85,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,150,151,152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,209,210,211,212,213,214,215,216,217,218,219,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,275,276,277,278,279,280,281,282,283,284,285,286,287,288 }
ZombieSpeed = get(\"zombies.Speed\")
if ZombieSpeed == 0 then --super slow zombies (goofy looking)
chaseanim = \"WALK_drunk\"
checkspeed = 2000
elseif ZombieSpeed == 1 then -- normal speed
chaseanim = \"run_old\"
checkspeed = 1000
elseif ZombieSpeed == 2 then -- rocket zombies (possibly stressful on server)
chaseanim = \"Run_Wuzi\"
checkspeed = 680
else -- defaults back to normal
chaseanim = \"run_old\"
checkspeed = 1000
end
resourceRoot = getResourceRootElement()
moancount =0
moanlimit = 10
everyZombie = { }
--IDLE BEHAVIOUR OF A ZOMBIE
function Zomb_Idle (ped)
if isElement(ped) then
if ( getElementData ( ped, \"status\" ) == \"idle\" ) and ( isPedDead ( ped ) == false ) and (getElementData (ped, \"zombie\") == true) then
local action = math.random( 1, 6 )
if action < 4 then -- walk a random direction
local rdmangle = math.random( 1, 359 )
setPedRotation( ped, rdmangle )
setPedAnimation ( ped, \"PED\", \"Player_Sneak\", -1, true, true, true)
setTimer ( Zomb_Idle, 7000, 1, ped )
elseif action == 4 then -- get on the ground
setPedAnimation ( ped, \"MEDIC\", \"cpr\", -1, false, true, true)
setTimer ( Zomb_Idle, 4000, 1, ped )
elseif action == 5 then -- stand still doing nothing
setPedAnimation ( ped )
setTimer ( Zomb_Idle, 4000, 1, ped )
end
end
end
end
--BEHAVIOUR WHILE CHASING PLAYERS
function Zomb_chase (ped, Zx, Zy, Zz )
if isElement(ped) then
if (getElementData ( ped, \"status\" ) == \"chasing\") and (getElementData (ped, \"zombie\") == true) then
local x, y, z = getElementPosition( ped )
if (getElementData ( ped, \"target\" ) == nil) and getElementData ( ped, \"Tx\" ) ~= false then
local Px = getElementData ( ped, \"Tx\" )
local Py = getElementData ( ped, \"Ty\" )
local Pz = getElementData ( ped, \"Tz\" )
local Pdistance = (getDistanceBetweenPoints3D( Px, Py, Pz, x, y, z ))
if (Pdistance < 1.5 ) then
setTimer ( function (ped) if ( isElement ( ped ) ) then setElementData ( ped, \"status\", \"idle\" ) end end, 2000, 1, ped )
end
end
local distance = (getDistanceBetweenPoints3D( x, y, z, Zx, Zy, Zz ))
if (distance < 1 ) then -- IF THE PED HASNT MOVED
if (getElementData ( ped, \"target\" ) == nil) then
local giveup = math.random( 1, 15 )
if giveup == 1 then
setElementData ( ped, \"status\", \"idle\" )
else
local action = math.random( 1, 2 )
if action == 1 then
setPedAnimation ( ped )
triggerClientEvent ( \"Zomb_Punch\", getRootElement(), ped )
setTimer ( function (ped) if ( isElement ( ped ) ) then setPedAnimation ( ped, \"ped\", chaseanim, -1, true, true, true ) end end, 800, 1, ped )
setTimer ( Zomb_chase, 2000, 1, ped, x, y, z )
elseif action == 2 then
setPedAnimation ( ped )
triggerClientEvent ( \"Zomb_Jump\", getRootElement(), ped )
setTimer ( Zomb_chase, 3500, 1, ped, x, y, z )
end
end
else
local Ptarget = (getElementData ( ped, \"target\" ))
if isElement(Ptarget) then
local Px, Py, Pz = getElementPosition( Ptarget )
local Pdistance = (getDistanceBetweenPoints3D( Px, Py, Pz, Zx, Zy, Zz ))
if (Pdistance < 1.2 ) then -- ATTACK A PLAYER IF THEY ARE CLOSE
if ( isPedDead ( Ptarget ) ) then --EAT A DEAD PLAYER
setPedAnimation ( ped )
setPedAnimation ( ped, \"MEDIC\", \"cpr\", -1, false, true, false)
setTimer ( function (ped) if ( isElement ( ped ) ) then setElementData ( ped, \"status\", \"idle\" ) end end, 10000, 1, ped )
setTimer ( function (ped) if ( isElement ( ped ) ) then setPedRotation ( ped, getPedRotation(ped)-180) end end, 10000, 1, ped )
zmoan(ped)
else
local action = math.random( 1, 6 )
if action == 1 then
setPedAnimation ( ped)
triggerClientEvent ( \"Zomb_Jump\", getRootElement(), ped )
setTimer ( Zomb_chase, 2000, 1, ped, x, y, z )
else
setPedAnimation ( ped)
triggerClientEvent ( \"Zomb_Punch\", getRootElement(), ped )
setTimer ( function (ped) if ( isElement ( ped ) ) then setPedAnimation ( ped, \"ped\", chaseanim, -1, true, true, true ) end end, 800, 1, ped )
setTimer ( Zomb_chase, 2000, 1, ped, x, y, z )
end
end
else
if ( isPedDead (Ptarget) ) then
setTimer ( function (ped) if ( isElement ( ped ) ) then setElementData ( ped, \"status\", \"idle\" ) end end, 2000, 1, ped )
setTimer ( function (ped) if ( isElement ( ped ) ) then setPedRotation ( ped, getPedRotation(ped)-180) end end, 1800, 1, ped )
else
local action = math.random( 1, 2 )
if action == 1 then
setPedAnimation ( ped)
triggerClientEvent ( \"Zomb_Punch\", getRootElement(), ped )
setTimer ( function (ped) if ( isElement ( ped ) ) then setPedAnimation ( ped, \"ped\", chaseanim, -1, true, true, true ) end end, 800, 1, ped )
setTimer ( Zomb_chase, 2000, 1, ped, x, y, z )
elseif action == 2 then
setPedAnimation ( ped)
triggerClientEvent ( \"Zomb_Jump\", getRootElement(), ped )
setTimer ( Zomb_chase, 2000, 1, ped, x, y, z )
end
end
end
else
setElementData ( ped, \"status\", \"idle\" )
end
end
else
setPedAnimation ( ped, \"ped\", chaseanim, -1, true, true, true) --KEEP WALKING
setTimer ( Zomb_chase, checkspeed, 1, ped, x, y, z ) --CHECK AGAIN
end
end
end
end
--SET THE DIRECTION OF THE ZOMBIE
function setangle ()
for theKey,ped in ipairs(everyZombie) do
if isElement(ped) then
if ( getElementData ( ped, \"status\" ) == \"chasing\" ) then
local x
local y
local z
local px
local py
local pz
if ( getElementData ( ped, \"target\" ) ~= nil ) then
local ptarget = getElementData ( ped, \"target\" )
if isElement(ptarget) then
x, y, z = getElementPosition( ptarget )
px, py, pz = getElementPosition( ped )
else
setElementData ( ped, \"status\", \"idle\" )
x, y, z = getElementPosition( ped )
px, py, pz = getElementPosition( ped )
end
zombangle = ( 360 - math.deg ( math.atan2 ( ( x - px ), ( y - py ) ) ) ) % 360 --MAGIC SPELL TO MAKE PEDS LOOK AT YOU
setPedRotation( ped, zombangle )
elseif ( getElementData ( ped, \"target\" ) == nil ) and (getElementData ( ped, \"Tx\" ) ~= false) then --IF THE PED IS AFTER THE PLAYERS LAST KNOWN WHEREABOUTS
x = getElementData ( ped, \"Tx\" )
y = getElementData ( ped, \"Ty\" )
z = getElementData ( ped, \"Tz\" )
px, py, pz = getElementPosition( ped )
zombangle = ( 360 - math.deg ( math.atan2 ( ( x - px ), ( y - py ) ) ) ) % 360 --MAGIC SPELL TO MAKE PEDS LOOK AT YOU
setPedRotation( ped, zombangle )
end
end
end
end
end
--SETS THE ZOMBIE ACTIVITY WHEN STATUS CHANGES
addEventHandler ( \"onElementDataChange\", getRootElement(),
function ( dataName )
if getElementType ( source ) == \"ped\" and dataName == \"status\" then
if (getElementData (source, \"zombie\") == true) then
if ( isPedDead ( source ) == false ) then
if (getElementData ( source, \"status\" ) == \"chasing\" ) then
local Zx, Zy, Zz = getElementPosition( source )
setTimer ( Zomb_chase, 1000, 1, source, Zx, Zy, Zz )
local newtarget = (getElementData ( source, \"target\" ))
if isElement (newtarget) then
if getElementType ( newtarget ) == \"player\" then
setElementSyncer ( source, newtarget )
end
end
zmoan(source)
elseif (getElementData ( source, \"status\" ) == \"idle\" ) then
setTimer ( Zomb_Idle, 1000, 1, source)
elseif (getElementData ( source, \"status\" ) == \"throatslashing\" ) then
local tx,ty,tz = getElementPosition( source )
local ptarget = getElementData ( source, \"target\" )
if isElement(ptarget) then
local vx,vy,vz = getElementPosition( ptarget )
local zombdistance = (getDistanceBetweenPoints3D (tx, ty, tz, vx, vy, vz))
if (zombdistance < . then
zmoan(source)
setPedAnimation ( source, \"knife\", \"KILL_Knife_Player\", -1, false, false, true)
setPedAnimation ( ptarget, \"knife\", \"KILL_Knife_Ped_Damage\", -1, false, false, true)
setTimer ( Playerthroatbitten, 2300, 1, ptarget, source)
setTimer ( function (source) if ( isElement ( source ) ) then setElementData ( source, \"status\", \"idle\" ) end end, 5000, 1, source )
else
setElementData ( source, \"status\", \"idle\" )
end
else
setElementData ( source, \"status\", \"idle\" )
end
end
elseif (getElementData ( source, \"status\" ) == \"dead\" ) then
setTimer ( Zomb_delete, 10000, 1, source)
end
end
end
end)
--RESOURCE START/INITIAL SETUP
function outbreak(startedResource)
newZombieLimit = get(\"\" .. getResourceName(startedResource) .. \".Zlimit\")
if newZombieLimit ~= false then
if newZombieLimit > ZombieLimit then
newZombieLimit = ZombieLimit
end
else
newZombieLimit = ZombieLimit
end
WoodTimer = setTimer ( WoodSetup, 2000, 1) -- CHECKS FOR BARRIERS
if startedResource == getThisResource() then
-- call(getResourceFromName(\"scoreboard\"), \"scoreboardAddColumn\", \"Zombie kills\") --ADDS TO SCOREBOARD
local allplayers = getElementsByType ( \"player\" )
for pKey,thep in ipairs(allplayers) do
setElementData ( thep, \"dangercount\", 0 )
end
local alivePlayers = getAlivePlayers ()
for playerKey, playerValue in ipairs(alivePlayers) do
setElementData ( playerValue, \"alreadyspawned\", true )
end
if ZombieSpeed == 2 then
MainTimer1 = setTimer ( setangle, 200, 0) -- KEEPS ZOMBIES FACING THE RIGHT DIRECTION (fast)
else
MainTimer1 = setTimer ( setangle, 400, 0) -- KEEPS ZOMBIES FACING THE RIGHT DIRECTION
end
MainTimer3 = setTimer ( clearFarZombies, 3000, 0) --KEEPS ALL THE ZOMBIES CLOSE TO PLAYERS
if ZombieStreaming == 1 then
MainTimer2 = setTimer ( SpawnZombie, 2500, 0 ) --Spawns zombies in random locations
elseif ZombieStreaming == 2 then
MainTimer2 = setTimer ( SpawnpointZombie, 2500, 0 ) --spawns zombies in zombie spawnpoints
end
end
end
addEventHandler(\"onResourceStart\", getRootElement(), outbreak)
function player_Connect()
setElementData ( source, \"dangercount\", 0 )
end
addEventHandler ( \"onPlayerConnect\", getRootElement(), player_Connect )
function WoodSetup()
local allcols = getElementsByType ( \"colshape\" ) --clears off old wood cols
for colKey, colValue in ipairs(allcols) do
if ( getElementData ( colValue, \"purpose\" ) ==\"zombiewood\" ) then
destroyElement(colValue)
end
end
local allobjects = getElementsByType ( \"object\" ) --SETS UP ALL THE WOOD BARRIERS
for objectKey, objectValue in ipairs(allobjects) do
if ( getElementData ( objectValue, \"purpose\" ) ==\"zombiewood\" ) then
setElementDimension ( objectValue, 26 )
local x,y,z = getElementPosition( objectValue )
local thecol = createColSphere ( x, y, z, 1.6 )
setElementData ( thecol, \"purpose\", \"zombiewood\" )
setElementParent ( thecol, objectValue )
end
end
end
function ReduceMoancount()
moancount = moancount-1
end
function zmoan(zombie)
if moancount < moanlimit then
moancount = moancount+1
local randnum = math.random( 1, 10 )
triggerClientEvent ( \"Zomb_Moan\", getRootElement(), zombie, randnum )
setTimer ( ReduceMoancount, 800, 1 )
end
end
--CLEARS A DEAD ZOMBIE
function Zomb_delete (ped)
if isElement(ped) then
if (getElementData (ped, \"zombie\") == true) then
for theKey,thePed in ipairs(everyZombie) do
if ped == thePed then
table.remove( everyZombie, theKey )
break
end
end
destroyElement ( ped )
end
end
end
--HEADSHOTS
addEvent( \"headboom\", true )
function Zheadhit ( ped,attacker, weapon, bodypart)
if (getElementData (ped, \"zombie\") == true) then
killPed ( ped, attacker, weapon, bodypart )
setPedHeadless ( ped, true )
end
end
addEventHandler( \"headboom\", getRootElement(), Zheadhit )
--KILL FROM ZOMBIE ATTACK
addEvent( \"playereaten\", true )
function Playerinfected ( player, attacker, weapon, bodypart)
killPed ( player, attacker, weapon, bodypart )
end
addEventHandler( \"playereaten\", getRootElement(), Playerinfected )
--CHECKS FOR ZOMBIE GRABBING FROM BEHIND
function Playerthroatbitten ( player, attacker)
local Zx, Zy, Zz = getElementPosition( attacker )
local Px, Py, Pz = getElementPosition( player )
local distance = (getDistanceBetweenPoints3D( Px, Py, Pz, Zx, Zy, Zz ))
if (distance < 1) then
killPed ( player, attacker, weapon, bodypart )
else
setPedAnimation (player)
end
end
--ADJUSTS PLAYERS ZOMBIE KILL SCORE
function deanimated( ammo, attacker, weapon, bodypart )
if (attacker) then
if (getElementType ( attacker ) == \"player\") and (getElementType ( source ) == \"ped\") then
if (getElementData (source, \"zombie\") == true) then
local oldZcount = getElementData ( attacker, \"Zombie kills\" )
if oldZcount ~= false then
setElementData ( attacker, \"Zombie kills\", oldZcount+1 )
triggerEvent ( \"onZombieWasted\", source, attacker, weapon, bodypart )
else
setElementData ( attacker, \"Zombie kills\", 1 )
triggerEvent ( \"onZombieWasted\", source, attacker, weapon, bodypart )
end
end
end
end
end
addEventHandler(\"onPedWasted\", resourceRoot, deanimated)
--STUFF TO ALLOW PLAYERS TO PLACE BOARDS
function boarditup( player, key, keyState )
local rightspot = 0
local allcols = getElementsByType ( \"colshape\" )
for ColKey,theCol in ipairs(allcols) do
if (getElementData ( theCol, \"purpose\" ) == \"zombiewood\" ) then
if (isElementWithinColShape ( player, theCol )) then
local rightcol = theCol
local Cx, Cy, Cz = getElementPosition( rightcol )
local Bx, By, Bz = getElementPosition( player )
woodangle = ( 360 - math.deg ( math.atan2 ( ( Cx - Bx ), ( Cy - By ) ) ) ) % 360
setPedRotation( player, woodangle )
setPedAnimation(player, \"riot\", \"RIOT_PUNCHES\", 3000, true, true, true )
local wx, wy, wz = getElementPosition( player )
setTimer( doneboarding, 2000, 1, player, rightcol, wx, wy, wz )
end
end
end
end
addCommandHandler ( \"construct\", boarditup )
function doneboarding(player, rightcol, wx, wy, wz)
setPedAnimation(player)
local newx, newy, newz = getElementPosition( player )
local distance = (getDistanceBetweenPoints3D( wx, wy, wz, newx, newy, newz ))
if (distance < .7 ) then
newwood = getElementParent ( rightcol )
setElementDimension ( newwood, 25 )
setTimer( setElementDimension, 50, 1, newwood, 0)
end
end
--SPAWN ZOMBIE (now can be cancelled!)
addEvent( \"onZombieSpawn\", true )
function RanSpawn_Z ( gx, gy, gz, rot)
local safezone = 0
local allradars = getElementsByType(\"radararea\")
for theKey,theradar in ipairs(allradars) do
if getElementData(theradar, \"zombieProof\") == true then
if isInsideRadarArea ( theradar, gx, gy ) then
safezone = 1
end
end
end
if safezone == 0 then
if table.getn ( everyZombie ) < newZombieLimit then
if not rot then
rot = math.random (1,359)
end
randomZskin = math.random ( 1, table.getn ( ZombiePedSkins ) )
local zomb = createPed( tonumber( ZombiePedSkins[randomZskin] ), gx, gy, gz )
if zomb ~= false then
setElementData ( zomb, \"zombie\", true )
table.insert( everyZombie, zomb )
setTimer ( function (zomb, rot) if ( isElement ( zomb ) ) then setPedRotation ( zomb, rot ) end end, 500, 1, zomb, rot )
setTimer ( function (zomb) if ( isElement ( zomb ) ) then setPedAnimation ( zomb, \"ped\", chaseanim, -1, true, true, true ) end end, 1000, 1, zomb )
setTimer ( function (zomb) if ( isElement ( zomb ) ) then setElementData ( zomb, \"status\", \"idle\" ) end end, 2000, 1, zomb )
triggerClientEvent ( \"Zomb_STFU\", getRootElement(), zomb )
end
end
end
end
addEventHandler( \"onZombieSpawn\", getRootElement(), RanSpawn_Z )
--SPAWNS ZOMBIES RANDOMLY NEAR PLAYERS
function SpawnZombie ()
local pacecount = 0
while pacecount < 5 do --4 ZOMBIES AT A TIME TO PREVENT FPS DROP
if (table.getn( everyZombie )+pacecount < newZombieLimit ) and (ZombieStreaming == 1) then
local xcoord = 0
local ycoord = 0
local xdirection = math.random(1,2)
if xdirection == 1 then
xcoord = math.random(15,40)
else
xcoord = math.random(-40,-15)
end
local ydirection = math.random(1,2)
if ydirection == 1 then
ycoord = math.random(15,40)
else
ycoord = math.random(-40,-15)
end
local liveplayers = getAlivePlayers ()
if (table.getn( liveplayers ) > 0 ) then
local lowestcount = 99999
local lowestguy = nil
for PKey,thePlayer in ipairs(liveplayers) do
if isElement(thePlayer) then
if (getElementData (thePlayer, \"dangercount\")) and (getElementData(thePlayer, \"zombieProof\") ~= true) and (getElementData(thePlayer, \"alreadyspawned\" ) == true) then
if (getElementData (thePlayer, \"dangercount\") < lowestcount) then
local safezone = 0
local gx, gy, gz = getElementPosition( thePlayer )
local allradars = getElementsByType(\"radararea\")
for theKey,theradar in ipairs(allradars) do
if getElementData(theradar, \"zombieProof\") == true then
if isInsideRadarArea ( theradar, gx, gy ) then
safezone = 1
end
end
end
if safezone == 0 then
lowestguy = thePlayer
lowestcount = getElementData (thePlayer, \"dangercount\")
end
end
end
end
end
pacecount = pacecount+1
if isElement(lowestguy) then
triggerClientEvent ( \"Spawn_Placement\", lowestguy, ycoord, xcoord )
else
pacecount = pacecount+1
end
else
pacecount = pacecount+1
end
else
pacecount = pacecount+1
end
end
end
--SPAWNS ZOMBIES IN SPAWNPOINTS NEAR PLAYERS
function SpawnpointZombie ()
local pacecount = 0
while pacecount < 6 do --5 ZOMBIES AT A TIME TO PREVENT FPS DROP
if (table.getn( everyZombie )+pacecount < newZombieLimit ) and (ZombieStreaming == 2) then
local liveplayers = getAlivePlayers ()
if (table.getn( liveplayers ) > 0 ) then
local lowestcount = 99999
local lowestguy = nil
for PKey,thePlayer in ipairs(liveplayers) do --THIS PART GETS THE PLAYER WITH THE LEAST ZOMBIES ATTACKING
if (getElementData (thePlayer, \"dangercount\")) and (getElementData(thePlayer, \"zombieProof\") ~= true) then
if (getElementData (thePlayer, \"dangercount\") < lowestcount) then
lowestguy = thePlayer
lowestcount = getElementData (thePlayer, \"dangercount\")
end
end
end
if isElement(lowestguy) then
local zombiespawns = { }
local possiblezombies = getElementsByType ( \"Zombie_spawn\" )
local Px, Py, Pz = getElementPosition( lowestguy )
for ZombKey,theZomb in ipairs(possiblezombies) do
local Zx, Zy, Zz = getElementPosition( theZomb )
local distance = (getDistanceBetweenPoints3D( Px, Py, Pz, Zx, Zy, Zz ))
if (distance < then
table.remove( possiblezombies, ZombKey) --IF SPAWN IS TOO CLOSE TO ANY PLAYER
end
end
local Px, Py, Pz = getElementPosition( lowestguy )
for ZombKey2,theZomb2 in ipairs(possiblezombies) do
local Zx, Zy, Zz = getElementPosition( theZomb2 )
local distance = (getDistanceBetweenPoints3D( Px, Py, Pz, Zx, Zy, Zz ))
if (distance < 60) then --AS LONG AS THE SPAWN IS CLOSE ENOUGH TO A PLAYER
table.insert( zombiespawns, theZomb2 )
end
end
if (table.getn( zombiespawns ) >0 ) then--IF THE LOWEST PLAYER HAS ANY CLOSE SPAWNS,USE ONE
local random = math.random ( 1, table.getn ( zombiespawns ) )
local posX = getElementData(zombiespawns[random], \"posX\")
local posY = getElementData(zombiespawns[random], \"posY\")
local posZ = getElementData(zombiespawns[random], \"posZ\")
local rot = getElementData(zombiespawns[random], \"rotZ\")
pacecount = pacecount+1
triggerEvent ( \"onZombieSpawn\",zombiespawns[random], posX, posY, posZ, rot )
else--IF THE LOWEST PLAYERS DOESNT HAVE ANY SPAWNS, THEN SEE IF ANYONE HAS ANY
local zombiespawns = { }
local possiblezombies = getElementsByType ( \"Zombie_spawn\" )
local allplayers = getAlivePlayers ()
for theKey,thePlayer in ipairs(allplayers) do
local Px, Py, Pz = getElementPosition( thePlayer )
for ZombKey,theZomb in ipairs(possiblezombies) do
local Zx, Zy, Zz = getElementPosition( theZomb )
local distance = (getDistanceBetweenPoints3D( Px, Py, Pz, Zx, Zy, Zz ))
if (distance < then
table.remove( possiblezombies, ZombKey) --IF SPAWN IS TOO CLOSE TO ANY PLAYER
end
end
end
for theKey,thePlayer in ipairs(allplayers) do
local Px, Py, Pz = getElementPosition( thePlayer )
for ZombKey2,theZomb2 in ipairs(possiblezombies) do
local Zx, Zy, Zz = getElementPosition( theZomb2 )
local distance = (getDistanceBetweenPoints3D( Px, Py, Pz, Zx, Zy, Zz ))
if (distance < 60) then --AS LONG AS THE SPAWN IS CLOSE ENOUGH TO A PLAYER
table.insert( zombiespawns, theZomb2 )
end
end
end
if (table.getn( zombiespawns ) >1 ) then
local random = math.random ( 1, table.getn ( zombiespawns ) )
local posX = getElementData(zombiespawns[random], \"posX\")
local posY = getElementData(zombiespawns[random], \"posY\")
local posZ = getElementData(zombiespawns[random], \"posZ\")
local rot = getElementData(zombiespawns[random], \"rotZ\")
pacecount = pacecount+1
triggerEvent ( \"onZombieSpawn\",zombiespawns[random], posX, posY, posZ, rot )
else
pacecount = pacecount+1
end
end
else
pacecount = pacecount+1
end
else
pacecount = pacecount+1
end
else
pacecount = pacecount+1
end
end
end
--DELETES ZOMBIES THAT ARE TOO FAR FROM ANY PLAYERS TO KEEP THEM MORE CONCENTRATED WHILE STREAMING ZOMBIES
function clearFarZombies ()
if newZombieLimit ~= false then
local toofarzombies = { }
local allplayers = getElementsByType ( \"player\" )
for ZombKey,theZomb in ipairs(everyZombie) do
if isElement(theZomb) then
if (getElementData (theZomb, \"zombie\") == true) then
far = 1
local Zx, Zy, Zz = getElementPosition( theZomb )
for theKey,thePlayer in ipairs(allplayers) do
local Px, Py, Pz = getElementPosition( thePlayer )
local distance = (getDistanceBetweenPoints3D( Px, Py, Pz, Zx, Zy, Zz ))
if (distance < 75) then
far = 0
end
end
if far == 1 then
table.insert( toofarzombies, theZomb )
end
end
else
table.remove( everyZombie, ZombKey )
end
end
if (table.getn( toofarzombies ) >1 ) then
for ZombKey,theZomb in ipairs(toofarzombies) do
if (getElementData (theZomb, \"zombie\") == true) and ( getElementData ( theZomb, \"forcedtoexist\" ) ~= true) then
Zomb_delete (theZomb)
end
end
end
end
end
-- DESTROYS UP TO 13 ZOMBIES THAT ARE IDLE WHEN A PLAYER SPAWNS (TO FORCE NEW ZOMBIES TO SPAWN NEAR THE NEW GUY)
function player_Spawn ()
if ZombieStreaming == 1 or ZombieStreaming == 2 then
local relocatecount = 0
for ZombKey,theZomb in ipairs(everyZombie) do
if relocatecount < 14 then
if ( getElementData ( theZomb, \"forcedtoexist\" ) ~= true) then
if ( getElementData ( theZomb, \"status\" ) == \"idle\" ) and ( isPedDead ( theZomb ) == false ) and (getElementData (theZomb, \"zombie\") == true) then
relocatecount = relocatecount+1
Zomb_delete (theZomb)
end
end
end
end
end
if ( getElementData ( source, \"alreadyspawned\" ) ~= true) then
setElementData ( source, \"alreadyspawned\", true )
end
end
addEventHandler ( \"onPlayerSpawn\", getRootElement(), player_Spawn )
--EXPORTED FUNCTIONS!!!!!!!!!!!!!!
function createZombie ( x, y, z, rot, skin, interior, dimension )
if (table.getn( everyZombie ) < newZombieLimit ) then
--this part handles the args
if not x then return false end
if not y then return false end
if not z then return false end
if not rot then
rot = math.random (1,359)
end
if not skin then
randomZskin = math.random ( 1, table.getn ( ZombiePedSkins ) )
skin = ZombiePedSkins[randomZskin]
end
if not interior then interior = 0 end
if not dimension then dimension = 1 end
--this part spawns the ped
local zomb = createPed (tonumber(skin),tonumber(x),tonumber(y),tonumber(z))--spawns the ped
--if successful, this part applies the zombie settings/args
if (zomb ~= false) then
setTimer ( setElementInterior, 100, 1, zomb, tonumber(interior)) --sets interior
setTimer ( setElementDimension, 100, 1, zomb, tonumber(dimension)) --sets dimension
setElementData ( zomb, \"zombie\", true )
setElementData ( zomb, \"forcedtoexist\", true )
setTimer ( function (zomb, rot) if ( isElement ( zomb ) ) then setPedRotation ( zomb, rot ) end end, 500, 1, zomb, rot )
setTimer ( function (zomb) if ( isElement ( zomb ) ) then setElementData ( zomb, \"status\", \"idle\" ) end end, 2000, 1, zomb )
setTimer ( function (zomb) if ( isElement ( zomb ) ) then setElementData ( zomb, \"forcedtoexist\", true ) end end, 1000, 1, zomb )
setTimer ( function (zomb) if ( isElement ( zomb ) ) then table.insert( everyZombie, zomb ) end end, 1000, 1, zomb )
triggerClientEvent ( \"Zomb_STFU\", getRootElement(), zomb )
return zomb --returns the zombie element
else
return false --returns false if there was a problem
end
else
return false --returns false if there was a problem
end
end
--check if a ped is a zombie or not
function isPedZombie(ped)
if (isElement(ped)) then
if (getElementData (ped, \"zombie\") == true) then
return true
else
return false
end
else
return false
end
end
addEvent( \"onZombieLostPlayer\", true )
function ZombieTargetCoords ( x,y,z )
setElementData ( source, \"Tx\", x, false )
setElementData ( source, \"Ty\", y, false )
setElementData ( source, \"Tz\", z, false )
end
addEventHandler( \"onZombieLostPlayer\", getRootElement(), ZombieTargetCoords )