السلام عليكم .
ابي مبرمج ذو خبره
يحول الزومبي إلى عالم ثاني " Dimens "
الكود :
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,108,126,127,128,152,162,167,188,195,206,209,212,229,230,258,264,277,280} --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 < .8) 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 = 0 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 )
ذا الكلنت ، واللي فوق هو السيرفر
myZombies = { }
helmetzombies = { }
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/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 )
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)