PezFenix2016 Posted April 2, 2017 Share Posted April 2, 2017 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
Bc# Posted April 3, 2017 Share Posted April 3, 2017 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
PezFenix2016 Posted April 3, 2017 Author Share Posted April 3, 2017 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
PezFenix2016 Posted April 3, 2017 Author Share Posted April 3, 2017 2 minutes ago, aka Blue said: Tablas Podrías darme un indicio de como empezar más o menos? así tengo la idea y lo termino yo solo, te lo agradecería Link to comment
PezFenix2016 Posted April 3, 2017 Author Share Posted April 3, 2017 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
Bc# Posted April 3, 2017 Share Posted April 3, 2017 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
Recommended Posts