Jump to content

Problema con AddEventHandler


Recommended Posts

Bueno muy buenas a todos, iré directo al grano, estoy haciendo un sistema de hits, para que cuando el admin coloque /hitme <cantidad> se cree un marker, luego, al ingresar cualquier jugador, se ofrecerá una recompensa de la cantidad dada, y obviamente, todo aquel jugador que lo mate obtendrá esa recompensa.

El problema que tengo es que, al momento de usar el eventHandler "onMarkerHit", me dice que está obteniendo un nil en el segundo argumento de este, pero lo extraño es que arriba tengo creado el marker con el cual se va a ejecutar la acción :$, si alguien podría ser tan amable de decirme en donde me he equivocado, se lo agradezco mucho. Aquí está mi código:

function ejecutar(thePlayer,commandName, ammount)
  local accName = getAccountName ( getPlayerAccount ( thePlayer ) )
     if (isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) )) or (isObjectInACLGroup ("user."..accName, aclGetGroup ( "L2" ) )) or (isObjectInACLGroup ("user."..accName, aclGetGroup ( "L3" ) )) or (isObjectInACLGroup ("user."..accName, aclGetGroup ( "L4" ) )) or (isObjectInACLGroup ("user."..accName, aclGetGroup ( "L5" ) )) or (isObjectInACLGroup ("user."..accName, aclGetGroup ( "L1337" ) )) then
		if (ammount >= tostring(100000)) then
		x,y,z = getElementPosition( thePlayer)
		theMarker = createMarker( x + 2, y + 2, z, "cylinder", 1.5, 255, 255, 0, 170 )
		else
		  outputChatBox( "Error: Cantidad máxima por hit es de $100.000",thePlayer, 255, 0, 0)
		end
	else
	outputChatBox( "Error: No tienes permiso para ejecutar este comando",thePlayer, 255, 0, 0)
	end
end
addCommandHandler("hitmarker", ejecutar)

function paraHit( hitPLayer, matchingDimension )
   if getElementType ( hitPLayer ) == "player" then 
    nameOfThePlayer = getPlayerName ( hitPLayer )
	setPlayerNametagColor ( hitPLayer, 0, 0, 0)
	 triggerClientEvent ( hitPLayer, "crearTexto", hitPLayer)
	outputChatBox ("Un nuevo hit se ha plantado sobre "..nameOfThePlayer.." de $"..ammount..", matalo para ganar el dinero!", getRootElement(), 255, 0, 0)
	end
end
addEventHandler("onMarkerHit",theMarker, paraHit)

function recompensaHit( ammo, killer, killerweapon, bodypart )
	--Si hay un asesino, y ese asesino es diferente a el mismo
	if ( killer ) and ( killer ~= source ) then 
		if ( killer ) and ( killer == hitPLayer ) then
		givePlayerMoney(killer, ammount) 
		nameOfTheKiller = getPlayerName(killer)
		outputChatBox(nameOfTheKiller.." ha completado el hit sobre "..nameOfThePlayer.." y ganado una recompensa de $"..ammount, getRootElement(), 243, 255, 28)
		setPlayerNametagColor(hitPLayer, 181, 32, 33)
		triggerClientEvent ( hitPLayer, "removerTexto", hitPLayer)
		end
	end
end
addEventHandler ( "onPlayerWasted", getRootElement(), recompensaHit )

 

Link to comment

Claro, pues si no has ejecutado la el comando "hitmarker" no se crea la variable global theMarker. Para solucionarlo, tienes que cortar la linea 24:

addEventHandler("onMarkerHit",theMarker, paraHit)

Justo debajo de la linea 6, donde creaste el marcador. Así solo se creará el evento si tienes el marcador creado.

Avisa como te fue ;)

Link to comment
3 hours ago, Bc# said:

Claro, pues si no has ejecutado la el comando "hitmarker" no se crea la variable global theMarker. Para solucionarlo, tienes que cortar la linea 24:


addEventHandler("onMarkerHit",theMarker, paraHit)

Justo debajo de la linea 6, donde creaste el marcador. Así solo se creará el evento si tienes el marcador creado.

Avisa como te fue ;)

Muchas gracias! funcionó perfectamente, sos un crack.

Tengo otra pregunta, como hago para garantizar que el jugador no vaya a pasar por el marker una segunda vez? osea, que solo toque el marker una vez y listo :$

Link to comment

Perdón por el double post, esto es lo que tengo actualmente, se supone que lo que quiero que haga es que, me llene una tabla con los nombres de los jugadores en el team "hit", luego, me recorra esa tabla, y cuando el jugador vuelva a pasar por el marker, me cancele ese evento, pero no me está funcionando, al contrario, me está tirando error el debugscript:

s.lua:12: Bad argument @ 'AddEventHandler' [Expected function at argument 3, got number '1999']

Me podrían decir en donde me estoy equivocando? porque hasta donde veo, el argumento 3 debería regresarme el nombre del jugador, no un número :/

aquí les dejo mi código:

Jugadore:~s = getPlayersInTeam (teamHits)
Jugadores ={}
teamHits= createTeam( "Hits", 0, 0, 0 )


cantidad = 0
function hit(player, commandName, hitMoney)
  if ((tonumber(hitMoney)> 0) and (tonumber(hitMoney) <= 100000)) then
	cantidad = tonumber(hitMoney)
	x,y,z = getElementPosition( player)
	marcador = createMarker ( x+2,y,z-1, "cylinder", 2.0, 0, 255, 0 )
	addEventHandler("onMarkerHit",marcador, paraHit)
	addEventHandler("onMarkerHit",marcador, cantidad)
	else 
	outputChatBox( "Error: Cantidad máxima por hit es de $100.000",player, 255, 0, 0)
	end
end
addCommandHandler("hitmarker", hit)

function paraHit( hitElement, matchingDimension)
	if (getElementType( hitElement )== "player") then
	  setPlayerTeam ( hitElement, teamHits )
	blip = createBlipAttachedTo(hitElement, 26)
	setPlayerNametagColor ( hitElement, 0, 0, 0)
	triggerClientEvent (hitElement, "crearTexto", hitElement)
	outputChatBox ("Un nuevo hit se ha plantado sobre "..getPlayerName(hitElement).." de $"..cantidad..", matalo para ganar el dinero!", getRootElement(), 243, 255, 28)
	end
end


function getMoney(ammo, killer,killerweapon, bodypart)
		if ( killer ) and ( killer ~= source ) then 
			givePlayerMoney(killer, cantidad)
			destroyElement(blip)
			setPlayerNametagColor(source, 243, 255, 28)
			triggerClientEvent ( source, "removerTexto", source)
		outputChatBox(getPlayerName(killer).." ha completado el hit sobre "..getPlayerName(source).." y ganado una recompensa de $"..cantidad,getRootElement(), 243, 255, 28)
		end
	destroyElement(blip)
end
addEventHandler("onPlayerWasted", root, getMoney)

function destruirMarker()
	if isElement(marcador) then destroyElement(marcador) 
end 
end
addCommandHandler("removerhitmarker", destruirMarker)

function cantidad()
for i=1,#Jugadore:~s do 
		local playerName = getPlayerName(Jugadore:~s[i])   . 
        table.insert( Jugadores, playerName ) 
end
table.sort( Jugadores )

for i=1,#Jugadores do 
	if (getPlayerTeam(Jugadores[i]) == "Hits" ) then
	removeEventHandler("onMarkerHit",marcador, paraHit) 
	end
end
end


 

Link to comment

Punto 1, el error que tienes es por que al último argumento de addeventhandler le estás pasando un número cuando deberías pasarle una función. 

Punto 2, por que quieres poner los jugadores que pasen por el marqués en tu team? Para que la tabla te funcione como verificador solo tienes que asignarle un argumento a cada elemento. Ejemplo: 

PlayerHit = {}

--en tu función paraHit al 
if PlayerHit(source) then 
  return
else 
  PlayerHit = true
end

Con eso si el jugador ya entro en el marker se sale de la funcion y no la ejecuta.

Link to comment
  • Recently Browsing   0 members

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