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