Jump to content

how can i make these zombies spawn everywhere ?


zombienation

Recommended Posts

hello,

i have found a zombiemode with xp, but the zombies dont spawn everywhere on the map here.. and i dont know how to change it without losing the exp system.. here are client and server side ( + resource )

https://community.multitheftauto.com/index.php?p= ... ls&id=2405

client

--[[

Zombies script by Slothman

Editing: you can see in server file

If you got this file from ur client files directory, u r unlucky.

Thanks Slothman.

]]--

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, Bodyfence )

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, Bodyfence)

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, Bodyfence)

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, Bodyfence )

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, Bodyfence)

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

expLabel = guiCreateLabel(0.777,0.22,0.1708,0.0963,"EXP gained: ??\nTotal EXP: ??\nLevel: Unknown",true) -- Start EXP and level system

guiLabelSetColor(expLabel,0,255,0)

guiLabelSetVerticalAlign(expLabel,"top")

guiLabelSetHorizontalAlign(expLabel,"left",false)

guiSetFont(expLabel,"clear-normal")

end

end

local ttlgnd = 0

function expChange(expr,gained)

ttlgnd = ttlgnd+gained

guiSetText(expLabel,"")

local level,levelnum = "#0 - Newbie",0

if expr >= 10 then level = "#1 - Novice" levelnum = 1 end

if expr >= 20 then level = "#2 - Average" levelnum = 2 end

if expr >= 100 then level = "#3 - Good" levelnum = 3 end

if expr >= 200 then level = "#4 - Killer" levelnum = 4 end

if expr >= 500 then level = "#5 - Skilled" levelnum = 5 end

if expr >= 1000 then level = "#6 - Elite" levelnum = 6 end

if expr >= 2000 then level = "#7 - Senior" levelnum = 7 end

if expr >= 3000 then level = "#8 - Amazing" levelnum = 8 end

if expr >= 5000 then level = "#9 - Pro" levelnum = 9 end

if expr >= 10000 then level = "#10 - Godlike" levelnum = 10 end

if expr >= 20000 then level = "#11 - God" levelnum = 11 end

guiSetText(expLabel,"EXP gained: "..ttlgnd.." (+"..gained..")\nTotal EXP: "..expr.."\nLevel: "..level)

setElementData(getLocalPlayer(),"Level",level)

setElementData(getLocalPlayer(),"levelnum",levelnum)

end

addEvent( "expOnChange", true )

addEventHandler( "expOnChange", getRootElement(), expChange )

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 )

Bodyfence = getElementData (getLocalPlayer(), "blocker")-- this is to make it compatible with fps scripts, disregard

--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 )

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

elseif getElementType ( source ) == "player" and dataName == "blocker" then

Bodyfence = getElementData (getLocalPlayer(), "blocker")

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

local rand = math.random(1,5)

if rand==1 or rand==2 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, Bodyfence)

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

--[[

Zombies script by Slothman,

Edited it so:

Only textured zombies

Zombies giving random cash (lil bit editable in admin panel)

Zombies giving EXP

Zombie protection at spawnpoint

And more much which i cant remember

Thanks Slothman.

]]-- BTW idk why i put ]]--

ZombieLimit = get("zombiegamemode.MaxZombies")-- HOW MANY ZOMBIES SHOULD EXIST AT MAXIMUM?

ZombieStreaming = get("zombiegamemode.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, } --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,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 = { }

-- ZOMBIE PROTECTION ADDED BY STRYP

setElementData (createRadarArea(2418.4255371094, -1735,121.6306152344,100,0,150,0,153),"zombieProof",true)

addEventHandler("onColShapeHit", createColRectangle (2418.4255371094, -1735,121.6306152344,100), function(h)if not isElement(h) then return end if getElementData(h,"zombie") then killPed(h) end end)

-- CJ GARAGE ADDED BY STRYP

local cjGarage = createColRectangle(2502.7883300781, -1698.60546875,5.8679199219,16.1025390625)

addEventHandler("onColShapeHit",cjGarage,function(h) if getElementType(h) == "player" then setGarageOpen(9,true) local tpi = getElementData(cjGarage,"tpi") or 0 setElementData(cjGarage,"tpi",tpi+1,false) end end)

addEventHandler("onColShapeLeave",cjGarage,function(h) if getElementType(h) == "player" then local tpi = getElementData(cjGarage,"tpi") or 0 if not tpi or tpi <= 1 then setGarageOpen(9,false)end setElementData(cjGarage,"tpi",tpi-1,false) end end)

--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

exports.scoreboard:scoreboardAddColumn("Zombie kills")

exports.scoreboard:scoreboardAddColumn("Level",getRootElement(),80)

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 == 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 isExp = getAccountData(getPlayerAccount(attacker),"zombies.kills")

local expr = false

if isExp then

expr = tonumber(isExp) + 1

else

expr = 1

end

triggerClientEvent ( attacker, "expOnChange", getRootElement(), expr, 1)

givePlayerMoney(attacker,tonumber(get("zombiegamemode.Reward"))+math.random(-100,100))

setPedOnFire(source,false)

setPedHeadless(source,false)

local attacker2 = getPlayerAccount(attacker)

local oldZcount = getAccountData(attacker2,"zombies.kills")

if oldZcount ~= false then

setAccountData ( attacker2, "zombies.kills", oldZcount+1 )

setElementData( attacker, "Zombie kills", oldZcount+1 )

setPlayerAnnounceValue(attacker,"score",tostring(oldZcount+1))

triggerEvent ( "onZombieWasted", source, attacker, weapon, bodypart )

else

setAccountData ( attacker2, "zombies.kills", 1 )

setPlayerAnnounceValue(attacker,"score","1")

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 < 8) 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 < 8) 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 )

Link to comment
It's easy to change the streaming method:

Open up "meta.xml" and search for the setting "StreamMethod", change it to one of these options:

1 - constantly stream zombies, 0 - only spawning via createZombie, 2 - only spawning via spawnpoints

friendlyname="Zombie streaming method"

accept="0-2"

desc="1 - constantly stream zombies, 0 - only spawning via createZombie, 2 - only spawning via spawnpoints"

/>

i changed accept="0-2" to accept="1"

but no result

i tried to copy the original slothboth's zombie settings

but also no result :(

Link to comment

    <settings> 
        <!-- Zombies settings --> 
        <setting name="*MaxZombies" value="[30]" /> <!--maximum allowed zombies --> 
        <setting name="*StreamMethod" value="[2]" /> <!-- 1 to constantly stream zombies, 0 to only allow zombies to spawn via createZombie function, 2 to only allow spawning at set spawnpoints --> 
        <setting name="*Speed" value="[1]" /> <!-- 0 is slowest, 1 is normal, 2 faster --> 
        <setting name="*Reward" value="100" 
                    friendlyname="Cash reward" 
                    accept="100-1000" 
                    desc="How many should every zombie give to players? (this is random, +- 100 cash from this value)" 
        /> 
    </settings> 

Replace your meta.xml settings with these.

Link to comment
    <settings> 
        <!-- Zombies settings --> 
        <setting name="*MaxZombies" value="[30]" /> <!--maximum allowed zombies --> 
        <setting name="*StreamMethod" value="[2]" /> <!-- 1 to constantly stream zombies, 0 to only allow zombies to spawn via createZombie function, 2 to only allow spawning at set spawnpoints --> 
        <setting name="*Speed" value="[1]" /> <!-- 0 is slowest, 1 is normal, 2 faster --> 
        <setting name="*Reward" value="100" 
                    friendlyname="Cash reward" 
                    accept="100-1000" 
                    desc="How many should every zombie give to players? (this is random, +- 100 cash from this value)" 
        /> 
    </settings> 

Replace your meta.xml settings with these.

i think its not only meta, when i replace zombie_server.lua from sloth's original to this mode, the zombies are running around, but the exp dont work, and the zombies dont attack..

zombies_client probaly to then i guess :S

i cant get it to work, i tried to search in the script on stream and see what i could do to make the streaming options good but still no zombies :( i tried to add the zombie script of sloth to the mode, zombies spawned, but wasn't working together with the exp system of the gamemode :S

Link to comment

hey thanks man, now the zombies spawn hen i use it in the gamemode, and the exp works when i use it in normal zombie script, but still something minor going on, whenever i kill a zombie i get this in console, bt in both scripts its the same error

012-01-26 00:08:20] ERROR: zombies\zombie_server.lua:343: attempt to perform arithmetic on a nil value

[2012-01-26 00:08:21] ERROR: zombies\zombie_server.lua:343: attempt to perform arithmetic on a nil value

[2012-01-26 00:08:26] ERROR: zombies\zombie_server.lua:343: attempt to perform arithmetic on a nil value

012-01-26 00:06:39] ERROR: zmode\zombie_server.lua:343: attempt to perform arithmetic on a nil value

[2012-01-26 00:06:40] ERROR: zmode\zombie_server.lua:343: attempt to perform arithmetic on a nil value

[2012-01-26 00:06:41] ERROR: zmode\zombie_server.lua:343: attempt to perform arithmetic on a nil value

[2012-01-26 00:06:43] ERROR: zmode\zombie_server.lua:343: attempt to perform arithmetic on a nil value

[2012-01-26 00:06:51] ERROR: zmode\zombie_server.lua:343: attempt to perform arithmetic on a nil value

Link to comment
Do you have the setting "zombiegamemode.Reward" in meta.xml? line #343 uses it.

not in meta, but its in zombie_server yes

i have deleted the line and now i dont get the error, but is it normal that the exp is not 100% now?

zombiekills and level was in the scoreboard, now it isn't, at the right upper corner in the creen u can see exp stats,

also there only 1 of the 3 bars work :( but thanks anyway to make the zombies spawn

Link to comment

i have fix it by merging the original with the mode ( with the client and server u gave off cource ) everything works, the zombies, exp, levels, scoreboard, it saves, but i have one more error in the console, it pops up in 10 errors a second lol

2-01-26 00:52:27] ERROR: airp\zombie_server.lua:434: attempt to compare number with boolean

[2012-01-26 00:52:27] ERROR: airp\zombie_server.lua:434: attempt to compare number with boolean

[2012-01-26 00:52:27] ERROR: airp\zombie_server.lua:434: attempt to compare number with boolean

[2012-01-26 00:52:27] ERROR: airp\zombie_server.lua:434: attempt to compare number with boolean

[2012-01-26 00:52:27] ERROR: airp\zombie_server.lua:434: attempt to compare number with boolean

deleting the line does not fix it

Link to comment
It's something to do with the zombie limit, do you have the setting "airp.Zlimit" in your game mode?

idk, i just took some lua's out of the airp and did it into the zombiemode script, i took a map file with bases and the teams + jobs thats all i took, i just restarted the server, and apperantly the error is still there, are you sure sure it had to do with the airp script? cuz its off now..

Link to comment

Hey,

I have found a small bug in this mode, so the zombies spawn everywhere, but after some time they stop spawning :S

First i tought it was the loginscreen cuz the login in that mode have an option to spawn some zombies when logging in,

I changed the login and i also replaced the login script out of the mode in a different folder.

But still the zombies stop spawning after a while.

I have bin seqrching in the script for something like it could stop the zombiespawn after the ammount thats set as zombielimit but nothing i find..

There is a script in the mode also that zombies dont attack humans. I did it out of the mode, but also the zombies stop spawning after a while.

Edit: Just want to add the info that i have fixed it by deleting zombiespawns in the spawn script of the mode, thx for the help with this script

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...