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

  Reveal hidden contents

Guardar datos (nivel, zombiekills)

  Reveal hidden contents

Comando para 'setear' nivel y zombie kills

  Reveal hidden contents

Funciones usadas:

  Reveal hidden contents

 

Edited by Anzo
Errores
Link to comment
  On 18/09/2016 at 19:02, 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). 

Expand  

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

 

  On 18/09/2016 at 19:11, 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

Expand  

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:

  Reveal hidden contents

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