Jump to content

[Solucionado][Re-Aporte] Interacción con Peds en una tabla


aka Blue

Recommended Posts

Bueno, estaba creando un pequeño script con interacción con peds y querría vuestra ayuda para ver si está bien para publicarlo en la sección de aportes y ahorrarme comentarios estúpidos por parte de algunos.

PD: No es gran cosa, simplemente, al encontrar la palabra 'Hola' en el chat y al estar el jugador cerca de un ped (a una distancia concreta) le responde un mensaje. Lo hice para jugar un poco con el string.find.

-- Tabla de los peds 
-- Se usa [skin] [x] [y] [z] [rotacion x] [rotacion y] [rotacion z] 
  
local peds =  
{ 
  
    {201, x, y, z, 0, 0, 0}, 
    {} 
    {} 
} 
  
function creacionPeds ( ) 
    for k, v in ipairs ( peds ) do 
        local skin = v[1] 
        local x, y, z = v[2], v[3], v[4] 
        local rx, ry, rz = v[5], v[6], v[7] 
        if ( skin and x, y, z and rx, ry, rz ) then 
            createPed ( skin, x, y, z, rx, ry, rz ) 
            outputDebugString ( "[interaccion] Peds creados satisfactoriamente." ) 
        else 
            outputDebugString ( "[interaccion] No has colocado los datos de creación de PEDS bien." ) 
        end 
    end 
end 
addEventHandler ( "onResourceStart", getRootElement(), creacionPeds ) 
  
function sendMessageToNearbyPlayers( message, messageType ) 
    if messageType == 0 then 
        local peds = getElementsByType ( "peds" ) 
        local x, y, z = getElementPosition ( source ) 
        local x1, y1, z1 = getElementPosition ( peds ) 
        local distance = getDistanceBetweenPoints3D ( x, y, z, x1, y1, z1 ) 
        if peds then 
            if distance < 3 then 
                if string.find ( message, "Hola" ) then 
                    outputChatBox ( "Ped dice: Hola buenas tardes, ¿En qué le puedo ayudar?", source, 255, 255, 255 ) 
                end 
            end 
        end 
    end 
end 
-- attach our new chat handler to onPlayerChat 
addEventHandler( "onPlayerChat", getRootElement(), sendMessageToNearbyPlayers ) 

Edited by Guest
Link to comment
  • MTA Team

El de la Wiki creo que se explica por si solo.

local newcolshape = createColSphere ( 1, 2, 3, 4 ) 
local players = getElementsWithinColShape ( newcolshape, "player" )  -- get all the players inside the sphere 
for theKey,thePlayer in ipairs(players) do                           -- use a generic for loop to step through each player 
    outputChatBox ( getPlayerName ( thePlayer ) .. " is in our new sphere" )  -- print their name to the chat 
end 

Yo recomendaría hacerlo de este modo ya que así también podes lograr que el ped interactue con otras cosas tales como vehículos, etc.

Link to comment

¿Algo parecido a esto?

Tengo poco tiempo en el PC así que perdonad mis fallos, es lo que hay :|

-- Tabla de los peds 
-- Se usa [skin] [x] [y] [z] [rotacion x] [rotacion y] [rotacion z] [colshape x] [colshape y] [colshape z] 
  
local peds =  
{ 
  
    {201, x, y, z, 0, 0, 0, xz, yz, zz}, 
    {} 
    {} 
} 
  
function creacionPeds ( ) 
    for k, v in ipairs ( peds ) do 
        local skin = v[1] 
        local x, y, z = v[2], v[3], v[4] 
        local rx, ry, rz = v[5], v[6], v[7] 
        -- X, Y, Z del radio 
        local xz, yz, zz = v[8], v[9], v[10] 
        if ( skin and x, y, z and rx, ry, rz ) then 
            createPed ( skin, x, y, z, rx, ry, rz ) 
            radio = createColSphere ( xz, yz, zz, 4 ) 
            outputDebugString ( "[interaccion] Peds creados satisfactoriamente." ) 
        else 
            outputDebugString ( "[interaccion] No has colocado los datos de creación de PEDS bien." ) 
        end 
    end 
end 
addEventHandler ( "onResourceStart", getRootElement(), creacionPeds ) 
  
function interaccion ( message, messageType ) 
    if messageType == 0 then 
        if string.find ( message, "Hola" ) then 
            local playersOnRadio = getElementsWithinColShape ( radio, "player" ) 
            for k, player in ipairs ( playersOnRadio ) do 
                outputChatBox ( "Ped dice: Hola buenas tardes, ¿qué necesitas?", player, 255, 255, 255 ) 
            end 
        end 
    end 
end 
addEventHandler( "onPlayerChat", getRootElement(), interaccion ) 

Link to comment
Comproba si player == source ya que sino, al un jugador poner hola, le va a aparecer a todos. A menos claro que eso es lo que queres que pase xD

Quiero que sea como interactuar con alguien y los que estén dentro del col, les salga el mensaje. Creo que lo he hecho bien ya que al estar a x distancia del ped (osea, dentro del col del ped), me responde y al estar lejos, no.

Link to comment

Me acaba de venir otra duda que mejoraría un poco más el script. ¿Cómo podría hacer que el string.find encuentre valores dentro de una tabla? Me explico:

Por ejemplo, en una tabla tenemos éstos mensajes:

local mensajes = { "Hola", "Buenas tardes", "Buenas", "Oli", "EQUISDE" } 

Para hacer que el string.find los encuentre, ¿qué debo usar? Usé lo siguiente pero no funciona:

if string.find ( message, #mensajes ) then 

Link to comment
Me acaba de venir otra duda que mejoraría un poco más el script. ¿Cómo podría hacer que el string.find encuentre valores dentro de una tabla? Me explico:

Por ejemplo, en una tabla tenemos éstos mensajes:

local mensajes = { "Hola", "Buenas tardes", "Buenas", "Oli", "EQUISDE" } 

Para hacer que el string.find los encuentre, ¿qué debo usar? Usé lo siguiente pero no funciona:

if string.find ( message, #mensajes ) then 

  
    for _, messages in ipairs (mensajes) do 
        if messages:find(message) then 
            print("hola") 
        end 
    end 
  

Link to comment
Me acaba de venir otra duda que mejoraría un poco más el script. ¿Cómo podría hacer que el string.find encuentre valores dentro de una tabla? Me explico:

Por ejemplo, en una tabla tenemos éstos mensajes:

local mensajes = { "Hola", "Buenas tardes", "Buenas", "Oli", "EQUISDE" } 

Para hacer que el string.find los encuentre, ¿qué debo usar? Usé lo siguiente pero no funciona:

if string.find ( message, #mensajes ) then 

  
    for _, messages in ipairs (mensajes) do 
        if messages:find(message) then 
            print("hola") 
        end 
    end 
  

Que necesidad tiene usar print? Nunca supe para que funciona xD.

Link to comment
Me acaba de venir otra duda que mejoraría un poco más el script. ¿Cómo podría hacer que el string.find encuentre valores dentro de una tabla? Me explico:

Por ejemplo, en una tabla tenemos éstos mensajes:

local mensajes = { "Hola", "Buenas tardes", "Buenas", "Oli", "EQUISDE" } 

Para hacer que el string.find los encuentre, ¿qué debo usar? Usé lo siguiente pero no funciona:

if string.find ( message, #mensajes ) then 

  
    for _, messages in ipairs (mensajes) do 
        if messages:find(message) then 
            print("hola") 
        end 
    end 
  

Que necesidad tiene usar print? Nunca supe para que funciona xD.

En MTA envía un mensaje a la consola, en Lua 'imprime' un string.

Link to comment

Estuve testeando ésta mañana y encontré un error pero no logro solucionarlo. Bien, pasa que al crear otro ped en la tabla, lo crea, blablablá pero solo interactua con él y no con los demás. Me explico

El script está hecho para repartir bots por el mapa y que al decir x cosa en el chat, el mismo me responda, el problema que tengo es que debe haber 1 solo ped en la tabla para interactuar y si meto otro más, interactua solo con él y no con el otro.

-- Tabla de los peds 
-- Se usa [skin] [x] [y] [z] [rotacion] 
  
local peds =  
{ 
  
    {299, 2038.013671875, 1532.7841796875, 10.671875, 0 }, 
     
} 
  
function creacionPeds ( ) 
    for k, v in ipairs ( peds ) do 
        local skin = v[1] 
        local x, y, z = v[2], v[3], v[4] 
        local rot = v[5] 
        if skin and x and y and z and rot then 
            ped = createPed ( skin, x, y, z, rot ) 
            setElementFrozen ( ped, true ) 
            -- Crea un radio alrededor del ped que al estar el jugador dentro, es decir, cerca de él, te responde. 
            radio = createColSphere ( x, y, z, 1 ) 
            outputDebugString ( "[interaccion] Peds creados satisfactoriamente." ) 
        else 
            outputDebugString ( "[interaccion] No has colocado los datos de creación de PEDS bien." ) 
        end 
    end 
end 
addEventHandler ( "onResourceStart", getRootElement(), creacionPeds ) 
  
function interaccion ( message, messageType ) 
    if messageType == 0 then 
        if string.find ( message, "Hola" ) then 
            local playersOnRadio = getElementsWithinColShape ( radio, "player" ) 
            for k, player in ipairs ( playersOnRadio ) do 
                setTimer ( function( ) 
                outputChatBox ( "Ped dice: Hola buenas tardes, ¿qué necesitas?", player, 255, 255, 255 ) 
                end, 50, 1) 
            end 
        end 
    end 
end 
addEventHandler( "onPlayerChat", getRootElement(), interaccion ) 

Link to comment
Estuve testeando ésta mañana y encontré un error pero no logro solucionarlo. Bien, pasa que al crear otro ped en la tabla, lo crea, blablablá pero solo interactua con él y no con los demás. Me explico

El script está hecho para repartir bots por el mapa y que al decir x cosa en el chat, el mismo me responda, el problema que tengo es que debe haber 1 solo ped en la tabla para interactuar y si meto otro más, interactua solo con él y no con el otro.

-- Tabla de los peds 
-- Se usa [skin] [x] [y] [z] [rotacion] 
  
local peds =  
{ 
  
    {299, 2038.013671875, 1532.7841796875, 10.671875, 0 }, 
     
} 
  
function creacionPeds ( ) 
    for k, v in ipairs ( peds ) do 
        local skin = v[1] 
        local x, y, z = v[2], v[3], v[4] 
        local rot = v[5] 
        if skin and x and y and z and rot then 
            ped = createPed ( skin, x, y, z, rot ) 
            setElementFrozen ( ped, true ) 
            -- Crea un radio alrededor del ped que al estar el jugador dentro, es decir, cerca de él, te responde. 
            radio = createColSphere ( x, y, z, 1 ) 
            outputDebugString ( "[interaccion] Peds creados satisfactoriamente." ) 
        else 
            outputDebugString ( "[interaccion] No has colocado los datos de creación de PEDS bien." ) 
        end 
    end 
end 
addEventHandler ( "onResourceStart", getRootElement(), creacionPeds ) 
  
function interaccion ( message, messageType ) 
    if messageType == 0 then 
        if string.find ( message, "Hola" ) then 
            local playersOnRadio = getElementsWithinColShape ( radio, "player" ) 
            for k, player in ipairs ( playersOnRadio ) do 
                setTimer ( function( ) 
                outputChatBox ( "Ped dice: Hola buenas tardes, ¿qué necesitas?", player, 255, 255, 255 ) 
                end, 50, 1) 
            end 
        end 
    end 
end 
addEventHandler( "onPlayerChat", getRootElement(), interaccion ) 

ped = createPed ( skin, x, y, z, rot ) 

El ped se esta creando con la misma variable, intenta poder diferenciarla con otra. Puedes usar el indice de la tabla que te ofrece el loop para diferenciar la variable.

ped = {} 
function creacionPeds ( ) 
    for k, v in ipairs ( peds ) do 
        local skin = v[1] 
        local x, y, z = v[2], v[3], v[4] 
        local rot = v[5] 
        if skin and x and y and z and rot then 
            ped[k] = createPed ( skin, x, y, z, rot ) 
            setElementFrozen ( ped[k], true ) 
            -- Crea un radio alrededor del ped que al estar el jugador dentro, es decir, cerca de él, te responde. 
            radio = createColSphere ( x, y, z, 1 ) 
            outputDebugString ( "[interaccion] Peds creados satisfactoriamente." ) 
        else 
            outputDebugString ( "[interaccion] No has colocado los datos de creación de PEDS bien." ) 
        end 
    end 
end 
addEventHandler ( "onResourceStart", getRootElement(), creacionPeds ) 

Link to comment
ped = {} 
function creacionPeds ( ) 
    for k, v in ipairs ( peds ) do 
        local skin = v[1] 
        local x, y, z = v[2], v[3], v[4] 
        local rot = v[5] 
        if skin and x and y and z and rot then 
            radio = createColSphere ( v[2], v[3], v[4], 3 ) 
            ped.lel = createPed ( skin, x, y, z, rot ) 
            setElementFrozen ( ped.lel, true ) 
            outputDebugString ( "[interaccion] Peds creados satisfactoriamente." ) 
        else 
            outputDebugString ( "[interaccion] No has colocado los datos de creación de PEDS bien." ) 
           end 
       end 
   end 
   addEventHandler ( "onResourceStart", getResourceRootElement(getThisResource()), creacionPeds ) 

Link to comment
Nada, haga lo que haga interactua solo con el último ped introducido en la tabla, los otros los ignora.

Si me di cuenta cuando lo probé, Pero me puse a ver si era que no se habían creado los cols pero si se crearon( onColShapeHit y un output), el problema esta en tu función.

Link to comment
Nada, haga lo que haga interactua solo con el último ped introducido en la tabla, los otros los ignora.

Si me di cuenta cuando lo probé, Pero me puse a ver si era que no se habían creado los cols pero si se crearon( onColShapeHit y un output), el problema esta en tu función.

La función esta bien, lo que hay que hacer es averiguar como hacer que esa variable sirva para todos los peds (o hasta ahí tengo entendido).

Link to comment

¿Por qué no lo haces así?

local pedTable = { 
    {skin = 23, x = -709.85712, y = 957.96680, z = 12.42488, r = 0, name = "Aurelio"}, 
    {skin = 299, x = -688.45404, y = 952.44220, z = 12.15743, r = 0, name = "Manolico"} 
} 
  
local peds = {} 
  
for index = 1, #pedTable do 
    local d = pedTable[index] 
    local ped = createPed(d.skin, d.x, d.y, d.z, d.r) 
    if ped then 
        setElementFrozen(ped, true) 
        peds[ped] = d.name 
        outputDebugString("[interacción] El ped '" .. d.name .. "' ha sido creado de forma satisfactoria.") 
    else 
        outputDebugString("[interacción] No ha sido posible crear el ped '" .. d.name .. "'.") 
    end 
end 
  
addEventHandler("onPlayerChat", root, 
    function(m, p) 
        if p == 0 then 
            for _, ped in ipairs(getElementsByType("ped")) do 
                local x, y, z = getElementPosition(source) 
                if peds[ped] and (getDistanceBetweenPoints3D(x, y, z, getElementPosition(ped)) < 3) then 
                    if string.find(m, "Hola") then 
                        outputChatBox(peds[ped] .. ": Hola, ¿en qué puedo ayudarte?", source, 255, 255, 255 ) 
                    elseif string.find(m, "Adiós") then 
                        outputChatBox(peds[ped] .. ": taluego compare.", source, 255, 255, 255 ) 
                    end 
                end 
            end 
        end 
    end 
) 

Link to comment
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

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