Jump to content

[Tutorial] Crear sistema de niveles con elementData


Anzo

Recommended Posts

 

Introducción

Estoy seguro que lo primero que alguien "nuevo" quiere hacer para su servidor es un sistema de niveles, por eso voy a enseñar a como hacer uno en este tutorial (si no me explico bien en algo lo siento, pero no soy muy bueno que digamos explicando).

Contenido

  • 1. Introducción
  • 2. Contenido
  • 3. Creación del sistema de niveles
  • 4. Guardar datos (nivel, zombie kills)
  • 5. Comando para setear nivel y zombie kills
  • 6. Funciones usadas

Creación del sistema de niveles

Spoiler

Voy a enseñar a como hacer un sistema de niveles sencillo con elementData , las funciones que voy a usar son: getElementData y setElementData + los dx.

Los niveles van subiendo mientras mates una cantidad de zombies, tú puedes hacerlo para que suba por matar jugadores pero en este voy a enseñar con zombies ya que me gusta más.

Empecemos:

1. TABLA: Lo primero que vamos a hacer es crear una tabla con los zombies requeridos para subir de nivel (si queremos agregar más niveles solo pongamos un {numero}, < si no le ponemos una coma dará error y no servirá el script). 


local niveles = {
    {20},--Nivel 1
    {40},--Nivel 2
    {60},--Nivel 3
    {90},--Nivel 4
    {110},--Nivel 5
    {130},--Nivel 6
    {150},--Nivel 7
}

2. elementData: Ahora 'setearemos' el nivel a 0 y los zombie kills a 0 usando setElementData(esto es para que el valor inicial sea 0, si quieres empezar por 1, cambiale el 0 a 1).  de esta forma:


setElementData(localPlayer, "nivel",0)--Nivel 0, si quieres empezar desde el nivel 1 cambia el 0 a 1
setElementData(localPlayer, "zKills",0)--zombie kills 0, si quieres empezar desde  1 cambia el 0 a 1

3. dxDrawText: Hacemos un render para los dxText:


local screenW, screenH = guiGetScreenSize()

function render()
	dxDrawText("Nivel: "..getElementData(localPlayer, "nivel"), screenW * 0.7000, screenH * 0.1150, screenW * 0.7288, screenH * 0.1400, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
	dxDrawText("ZKills: "..getElementData(localPlayer, "zKills"),  screenW * 0.8388, screenH * 0.7683, screenW * 0.8812, screenH * 0.7933, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
end

function onStart()
  	addEventHandler("onClientRender",root, render)
end
addEventHandler("onClientResourceStart",resourceRoot, onStart)

-Creamos un dxDrawText común y corriente, solo que le agregamos un "..getElementData(localPlayer, "lev) para que obtenga la data "nivel" o sea, el texto aparecerá así en la pantalla: Nivel : 0. (si le cambiamos la data "nivel" a 1 aparecerá así: Nivel: 1)

4. Función para subir de nivel: Aquí viene la parte digamos que "complicada" porque no lo es, pero no es tan fácil como lo de arriba. Lo primero que haremos es crear una función con cualquier nombre, y le ponemos de argumento a la función ''attacker'', y de evento "onClientPedWasted", quedaria así:


function levelup(attacker)
end
addEventHandler("onClientPedWasted", root, levelup)

-Lo que haremos ahora es obtener la data de los zombies en una variable como: datZom = getElementData(localPlayer, "zKills") <--Lo de la variable no es necesario, pero para estar más ordenados. 
Estaría quedando así:


function levelup(attacker)
    local datZomb = getElementData(localPlayer, "zKills")
end
addEventHandler("onClientPedWasted", root, levelup)

-Después de esto lo que haremos es una condicional como 'if (getElementData(localPlayer, "zombies")==true and attacker == localPlayer then' para detectar que el atacado son los zombies y el atacante es el jugador local. Usaremos la data del recurso de zombies para obtener a los zombies y no a otro ped. Al poner "If (getElementData(localPlayer, "zombies") == true and attacker == localPlayer then" estamos especificando que solo debe subir la data + 1 si matamos a un zombie y no a un jugador o cualquier otro ped.
Quedaría así:


function levelup(attacker)
    local datZomb = getElementData(localPlayer, "zKills")
    if getElementData(localPlayer, "zombies") == true and attacker == localPlayer then --Si "los zombies existen" y el atacante es el jugador local...(los parametros de           onClientPedWasted son:  killer,  weapon,  bodypart,  loss, así que podemos cambiar attacker por cualquier otra cosa, siempre y cuando respetando el orden de los parametros)
end
addEventHandler("onClientPedWasted", root, levelup)

- Ahora colocaremos para que se sumen los zombies cada vez que los mates, usando un setElementData(localPlayer, "zKills", datZomb+1), aquí lo que estamos     haciendo es sumar la data zKills que su valor es '0' + 1, subiría a 1, y después a 2. Si queremos que suba más solo le agregamos +3 o +6. (Ojo, si ponemos algo como: setElementData(localPlayer, "zKills" + 1) no va a funcionar, porque no estamos obteniendo ni sumando nada, es como si quisieras sumar 1 con 4 pero el  4 no existe. Y después creamos otra vez el dx de la exp, pero este es para que sume. (se me había olvidado mencionar, también hay que agregar el dxDrawText en la función levelup, porque sino cada vez que mates a un zombie el texto aparecerá pero se borrará de una vez)


El código completo hasta el momento tiene que ser así:


local niveles = {
	{20},--Nivel 1
	{40},--Nivel 2
	{60},--Nivel 3
	{90},--Nivel 4
	{110},--Nivel 5
	{130},--Nivel 6
	{150},--Nivel 7
}

setElementData(localPlayer, "nivel",0)--Nivel 0, si quieres empezar desde el nivel 1 cambia el 0 a 1
setElementData(localPlayer, "zKills",0)--zombie kills 0, si quieres empezar desde  1 cambia el 0 a 1

local screenW, screenH = guiGetScreenSize()

--Creación de los DX
function render()
	dxDrawText("Nivel: "..getElementData(localPlayer, "nivel"), screenW * 0.7000, screenH * 0.1150, screenW * 0.7288, screenH * 0.1400, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
	dxDrawText("ZKills: "..getElementData(localPlayer, "zKills"),  screenW * 0.8388, screenH * 0.7683, screenW * 0.8812, screenH * 0.7933, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
end
function onStart()
  	addEventHandler("onClientRender",root, render)
end
addEventHandler("onClientResourceStart",resourceRoot, onStart)

function levelup(attacker)
	local datZomb = getElementData(localPlayer, "zKills")
	if getElementData(localPlayer, "zombies") == true and attacker == localPlayer then --Si "los zombies existen" y el atacante es el jugador local...
		setElementData(localPlayer, "zKills", datZomb+1)
		dxDrawText("ZKills: "..getElementData(localPlayer, "zKills"),  screenW * 0.8388, screenH * 0.7683, screenW * 0.8812, screenH * 0.7933, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
	end
end
addEventHandler("onClientPedWasted",root, levelup)

- Ahora viene lo más sencillo, tenemos que hacer un algoritmo para cada nivel, algo así: if datZomb == niveles[1] then. Luego, abajo del if, usar un setElementData de esta foma: setElementData(localPlayer, "nivel",1) y poner un end para cerrar el if. Esto hará que si el número de kill de zombies es igual al primer valor de la tabla (20), suba de nivel a 1, luego hacemos lo mismo con el nivel 2 pero agregamos un 'elseif' en vez de un if.

Así quedaría completo esta parte:


function levelup(attacker)
	local datZomb = getElementData(localPlayer, "zKills")
	if getElementData(localPlayer, "zombies") == true and attacker == localPlayer then --Si "los zombies existen" y el atacante es el jugador local...
		setElementData(localPlayer, "zKills", datZomb+1)
		dxDrawText("ZKills: "..getElementData(localPlayer, "zKills"),  screenW * 0.8388, screenH * 0.7683, screenW * 0.8812, screenH * 0.7933, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
	end
	--SI los zombie kills son iguales a 20 ...
	if datZomb == niveles[1] then
		setElementData(localPlayer, "nivel",1)
	--SI los zombie kills son iguales a 40 ...
	elseif datZomb == niveles[2] then
		setElementData(localPlayer, "nivel",2)
		--SI los zombie kills son iguales a 60 ...
	elseif datZomb == niveles[3] then
		setElementData(localPlayer, "nivel",3)
		--SI los zombie kills son iguales a 90 ...
	elseif datZomb == niveles[4] then
		setElementData(localPlayer, "nivel",4)
		--SI los zombie kills son iguales a 110 ...
	elseif datZomb == niveles[5] then
		setElementData(localPlayer, "nivel",5)
		--SI los zombie kills son iguales a 130 ...
	elseif datZomb == niveles[6] then
		setElementData(localPlayer, "nivel",6)
		--SI los zombie kills son iguales a 150...
	elseif datZomb == niveles[7] then
		setElementData(localPlayer, "nivel",7)
	end
end
addEventHandler("onClientPedWasted", root, levelup)

Ya con eso quedaría funcionando bien, cuando matas 20 zombies subes al nivel 1 y si matas 40 subes al 2.

Para guardar los datos de nivel/zombie kills ve el spoiler de abajo.

Guardar datos (nivel, zombiekills)

Spoiler

Para guardar los datos de nivel y zombie kills tenemos que poner esto en el mismo archivo que tenemos el sistema de nivel, y agregar esto debajo de la función levelup:


--Esta función la vamos a usar para pasar datos a server mediante un triggerClientEvent; se usa addEvent("evento",true) addEventHandler("evento",root, funcion) para crear un nuevo evento, si lo usamos en server se hace de la misma forma, pero en client se tiene que poner: triggerServerEvent("evento",localPlayer)
function saveLvlAndKills()
   dxDrawText("Nivel: "..getElementData(localPlayer, "nivel"), screenW * 0.7000, screenH * 0.1150, screenW * 0.7288, screenH * 0.1400, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
	dxDrawText("ZKills: "..getElementData(localPlayer, "zKills"),  screenW * 0.8388, screenH * 0.7683, screenW * 0.8812, screenH * 0.7933, tocolor(255, 255, 255, 255), 1.00, "default", "left", "top", false, false, false, true, false)	
end
addEvent("saveKills", true)
addEventHandler("saveKills", root, saveLvlAndKills)

--LUEGO DE PONER ESTO CREAMOS UN ARCHIVO QUE SE LLAME server.lua Y LO PONEMOS COMO SERVER-SIDE EN EL META.

--Cuando ya tengamoos el otro archivo hecho, le agregamos esto:
--SERVER--

function saves()
  	local account = getPlayerAccount(source)--Obtenemos la cuenta del jugador
 	if account then
    	setAccountData(account, "addZkills", getElementData(source, "zKills"))-- 'seteamos' a la cuenta del jugador el valor de 'zKills' que tenía antes de salirse del servidor (guardarlos)--Si el jugador se sale y tiene 100 zombies matados, se guardaran esas kills.
    	setAccountData(account, "addNivel", getElementData(source, "nivel"))-- 'seteamos' a la cuenta del jugador el valor de 'nivel' que tenía antes de salirse del servidor (guardarlos)--Si el jugador se sale y tiene nivel 1, se guardara ese nivel.
    end
end
addEventHandler("onPlayerLogout", root, saves)--Para que se guarde el valor de 'zKills' y 'nivel' al des-loguearse,
addEventHandler("onPlayerQuit",root, saves)--Para que se guarde el valor de 'zKills' y 'nivel' al salir del servidor,

function loadLvl()
  	local account = getPlayerAccount(source)--Obtenemos la cuenta del jugador
  	if account then
    local sZkills = getAccountData(account, "addZkills")--Obtenemos la data de zombie kills que tiene el jugador en su cuenta al salir del servidor
    local sNivel = getAccountData(account, "addNivel")--Obtenemos el nivel que tiene el jugador en su cuenta al salir del servidor
   		 if (sZkills and sNivel) then
      		setElementData(source, "zKills",sZkills)--Esto es para ponerle al jugador sus datos de nuevo, se pone sZkills porque esa variable define que estamos obteniendo los datos que tenía el jugador al salir del servidor, entonces, si le ponemos el sZkills de valor al setElementData, al loguearse en el servidor apareceran los datos que tenias TÚ al salir de l servidor.
      		setElementData(source, "nivel", sNivel)--Esto es para ponerle al jugador sus datos de nuevo, se pone sNivel porque esa variable define que estamos obteniendo los datos que tenía el jugador al salir del servidor, entonces, si le ponemos el sZkills de valor al setElementData, al loguearse en el servidor apareceran los datos que tenias TÚ al salir de l servidor.
      		triggerClientEvent(source, "saveKills",root)--Si entras al servidor y no estas logeado, los textos apareceran en 0, pero si te logeas, apareceran "nuevos" textos que se cambiaran al número de zombie kills/nivel que tengas. (este es el triggerClientEvent del que hable arriba)
      	end --Ponemos un end para cerrar
    end --Ponemos un end para cerrar
end --Ponemos un end para cerrar
addEventHandler("onPlayerLogin", root, loadLvl)--Al loguearse el jugador en el servidor se le cargaran todos sus datos.
    

 

Comando para 'setear' nivel y zombie kills

Spoiler

Lo que haremos ahora será crear un comando para poder ponernos el nivel que queramos o subirnos los zombies kills. Empezaremos primero con el de nivel, lo que tenemos que hacer es crear una función con cualquier nombre, ponerle de argumentos a la función ( los que están adentro de los paréntesis son los argumentos): function setNivel(player, cmd, value) y un addCommandHandler("level",funcion). Algo así:


function setNivel(player,cmd,value)
end
addCommandHandler("level",setNivel)

Ahora, agregaremos la función isObjectInACLGroup para que solo los ADMIN puedan usar el comando:


function setNivel(player,cmd,value)
	local accountname = getAccountName (getPlayerAccount(player))
    if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Admin" ) ) then
	end
end
addCommandHandler("level",setNivel)

Luego, agregamos otro argumento a la función el cual será: otherPlayer (lo pondremos antes de value). Después, crearemos una variable y le asignaremos de nombre 'ppl' y la usaremos de esta forma: local ppl = getPlayerFromName(otherPlayer), luego, crearemos otra variable y le asignaremos de nombre 'getLevel' y la usaremos para obtener la data "nivel", es decir, para obtener el nivel del jugador y luego después poder modificarlo:


function setNivel(player, cmd,otherPlayer,value)
	local accountname = getAccountName (getPlayerAccount(player))
    if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Admin" ) ) then
		local ppl = getPlayerFromName(otherPlayer)
			local getLevel = getElementData(pa2,"lev")
	end
end
addCommandHandler("lvl", setNivel)

Y por ultimo, crearemos una variable más, la cual será:  setPlayerLevel. La utilizaremos para ponerle un nuevo nivel al jugador, quedaría así:


function setNivel(player, cmd,otherPlayer,value)
	local accountname = getAccountName (getPlayerAccount(player))
    if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Admin" ) ) then
		local ppl = getPlayerFromName(otherPlayer)
		local getLevel = getElementData(ppl,"nivel")
		local setPlayerLevel = setElementData(ppl,"nivel",value)
	end
end
addCommandHandler("lvl", setNivel)

Con eso ya podemos ponerle el nivel que queramos al jugador. Recuerden que tienen que poner esto  en server-side porque isObjectInAclGroup es una función de server.

  • Poner nuevos zombie kills

Para añadirle zombie kills a un jugador haremos el mismo procedimiento que hicimos para poner nivel, solo que le cambiaremos el nombre de la función y el nombre del comando (y si quieres también el de las variables, aunque no es necesario). Así tiene que estar:


function setZombiesKills(player,cmd,target,amount)
	local accountname = getAccountName (getPlayerAccount(player))
    if isObjectInACLGroup ( "user." .. accountname, aclGetGroup ( "Admin" ) ) then
		local ppz = getPlayerFromName(target)
		local getKills = getElementData(ppz,"zKills")
		local setKills = setElementData(ppz,"zKills",getKills+amount)
	end
end
addCommandHandler("zomb",setZombiesKills)

Los comandos funcionan de esta manera: /lvl [jugador] [nivel] y /zomb [jugador] [kills]

Funciones usadas:

Spoiler

 getPlayerFromName --> La usamos para obtener el nombre de un jugador]


-- Como no explique mucho sobre esta parta la explicare aqui:

local ppz = getPlayerFromName(target)-- Al escribir el comando /zomb [nombre] se necesita obtener el nombre de un jugador, esta funcion nos devuelve el nombre de un jugador, en este caso el que escribiremos notrostros.
local getKills = getElementData(ppz, "zKills")-- el ppz es para obtener las zKills del jugador escrito y no el de otro, ejemplo: /zomb Jem --> ahí nos devolveria las zKills del jugador Jem y no de otro jugador
local setKills = setElementData(ppz, "zKills", getKills+amount)-- Y aqui lo mismo pero en vez de obtener las zKills le va a poner una nueva

• setElementData | getElementData |

• isObjectInACLGroup | aclGetGroup | getAccountName |

 

Edited by Anzo
Errores
Link to comment
26 minutes ago, aka Blue said:

ElementData no, macho. Te paso algo que me dejó Rex y que me sirvió, que es almacenar data pero con tablas y se utiliza setData y getData.

Un poco más abajo me dejó Rex el código con su respectivo lado (shared y server). 

Se pueden remplazar los setElementData, getElementData por setData y getData y funcionaría igual? no puedo probarlo ahora porque voy a salir...

 

18 minutes ago, EstrategiaGTA said:

Obviamente es mejor utilizar tablas que element data, pero esto está pensado para principiantes, así que mejor no liarlo mucho... @aka Blue

 

Buen aporte @Anzo

Yo suelo usar los elementData cuando no son muchos, como en este caso; aunque actualmente no los estoy usando mucho porque varios me han dicho que consume mucho ( y también lo he leído en varios post :S )

Gracias. :P

Link to comment

Hombre, obviamente por 1 o por 2 no te va a pasar nada, hasta creo que con 20 aun no se notaría tanto. Ya si son scripts como el de Zorro con tropecientos mil, que por cada cosa que se haga se usa elementData, pues sí, pero es que soy maniático ahora con el uso de tablas, me disculpáis si tal xD 

  • Like 1
Link to comment

Considero igualmente el uso de tablas, al menos a mi se me hace mucho mas cómodo para varias cosas.

En cuanto a lo demás, mejor ir a estafar por ahí, o utilizar la gran iluminación de la mente, la sabiduría intergalactica , la popularidad suprema, para el proyecto 3,000, que como los anteriores, no estará online.

Solo dejare esto por aquí: "¡ME BOY DE MTA! .. Jejeje nah es broma :V"

Link to comment
  • 0xCiBeR locked this topic
  • 0xCiBeR unlocked this topic
  • 1 month later...

@xRGamingx cambia el evento onClientPedWasted por addEventHandler("onClientPlayerWasted",root,function) y en vez de if getElementData(source, "zombie") and attacker == localPlayer then solo le dejas el attacker == localPlayer con el evento onClientPlayerWasted

 

Edited by Anzo
Link to comment
  • 2 weeks later...

Tengo una duda, soy nuevo acá y me gustaría saber como actualizar el dxDrawText, en el código que veo se crea otro sobre el que ya estaba (viendo el código a simple vista, puede que no sea así y lo esté mal interpretando) cómo actualizo el texto de un dxDrawText?

Link to comment

@Chainsaw Las funciones directX creo que se crean por cada frame, así que si usas onClientResourceStart o comando para hacer que aparezca el DX, desaparecerá inmediatamente. Para crearlo se usa onClientRender (este evento se activa cada vez que gta hace un nuevo frame, creo) y para actualizarlo igual porque estás actualizándolo 30-60 veces por segundo con el evento onClientRender.

No sé si me he hecho explicar pero te dejo un ejemplo con un guiSetText, esa función normalmente con un timer no se actualizaría como uno quiere, pero si por ejemplo quieres calcular (obtener) el ping o posición de un jugador, con onClientRender lo puedes hacer facilmente.

Un ejemplo: 

mylabel = guiCreateLabel(200,200,200,200, "Ping: ", false)

addEventHandler("onClientRender", root, function()
    local ping = getPlayerPing( getLocalPlayer() ) 
    guiSetText(mylabel, "Ping: "..ping)
end)

con eso se actualizaría, como dice la wiki, 30-60 veces por segundo; por lo que si va a poder calcular el ping, algo que con un timer no se puede hacer según lo que sé. Igual te recomiendo que no uses onClientRender en un label para obtener el ping o cosas que se actualizarían cada segundo o menos de un segundo porque puede causar lag, es mejor usar un dx simple y ya.

De todas formas si dije algo mal que me corrija alguien (?)

Edited by Anzo
Link to comment

Entiendo, eso me soluciona muchas dudas.. Y otra cosa, tengo esto:

 

addEvent("onZombieWasted",true) 
addEventHandler("onZombieWasted", root, function(killer, weapon)
	outputChatBox ("Skin del asesino: " .. getElementModel(killer), killer, 255, 255, 255, true) 
end)

Estoy haciendo algunas pruebas, aprendiendo como funcionan los parámetros de las funciones en los eventos y tengo duda en lo siguiente:

onZombieWasted tiene el trigger 

 

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

y por lo que veo tiene 4 parámetros, ahora cuando uso addEventHandler para agregar una función al evento (supongo que así se dice) agrego nada más en la función los parámetros killer y weapon.. cómo puedo obtener el userdata id (no sé qué tipo de datos sean pero espero que se entienda) para saber el skin del zombie al que maté desde ese Handler?

Link to comment

Para saber cuál es el skin del zombie al que mataste vas a tener que especificar que el zombie "existe" o que solo obtenga el skin del "zombie" y no el de cualquier ped, para hacerlo hay que utilizar un elementData del recurso de zombies, el cual es:

setElementData(zomb, "zombie", true)

Eso lo puedes encontrar en varias funciones exportadas del recurso, te dejo una función en donde se encuentra para que veas:

Spoiler

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

 

Y ahora para obtener el skin del zombie que mataste solo usa: 

function ZombiSkin(killer)
	if (getElementType(source) == "ped") then -- Especificamos que el elemento sea un ped
		if (getElementData(source, "zombie") == true) then -- Sin esta linea tomaria el skin de cualquier ped y no el de los zombies
			local model = getElementModel(source) -- Obtenemos el id del skin que tiene el zombie
			outputChatBox("Skin de zombie: #ff0000"..model, killer, 255,255,255,true)
		end
	end
end
addEvent("onZombieWasted", true)
addEventHandler("onZombieWasted", root, ZombiSkin)

OJO: No es necesario usar esta linea: if (getElementData(source) == true) then porque ya estamos usando el evento que detecta cuando un zombie muere, si usáramos onPedWasted ahí si seria necesario especificar esa linea, porque pues como su nombre lo dice el onPedWasted se activa cuando un ped muere. Al final no era necesario usar el elementData  para hacer lo que quieres, pero si en algún momento quieres hacer algo con los zombies en client-side esta linea te servirá (if (getElementData(source) == true) then) porque onZombieWasted es solo para server-side. Espero hayas entendido.

Edited by Anzo
Link to comment
  • Recently Browsing   0 members

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