aka Blue Posted October 29, 2015 Share Posted October 29, 2015 (edited) 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 November 1, 2015 by Guest Link to comment
Tomas Posted October 29, 2015 Share Posted October 29, 2015 Debes loopear 'peds', ya que getElementsByType devuelve una tabla. Link to comment
MTA Team 0xCiBeR Posted October 30, 2015 MTA Team Share Posted October 30, 2015 O podes crear un colShape y revisar que hay dentro del col. Link to comment
aka Blue Posted October 30, 2015 Author Share Posted October 30, 2015 O podes crear un colShape y revisar que hay dentro del col. ¿Me podrías dar un ejemplo? Link to comment
MTA Team 0xCiBeR Posted October 30, 2015 MTA Team Share Posted October 30, 2015 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
aka Blue Posted October 30, 2015 Author Share Posted October 30, 2015 ¿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
MTA Team 0xCiBeR Posted October 30, 2015 MTA Team Share Posted October 30, 2015 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 Link to comment
aka Blue Posted October 30, 2015 Author Share Posted October 30, 2015 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 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
MTA Team 0xCiBeR Posted October 30, 2015 MTA Team Share Posted October 30, 2015 Ya por eso mismo no sabia si lo que querías es que interactue con "el mundo" o solamente con el jugador que lo saludo. En el caso de que sea el primero, si esta bien. Link to comment
aka Blue Posted October 30, 2015 Author Share Posted October 30, 2015 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
Tomas Posted October 30, 2015 Share Posted October 30, 2015 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
Enargy, Posted October 30, 2015 Share Posted October 30, 2015 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 . Link to comment
Tomas Posted October 30, 2015 Share Posted October 30, 2015 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 . En MTA envía un mensaje a la consola, en Lua 'imprime' un string. Link to comment
aka Blue Posted October 31, 2015 Author Share Posted October 31, 2015 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
Enargy, Posted October 31, 2015 Share Posted October 31, 2015 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 explicoEl 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
aka Blue Posted October 31, 2015 Author Share Posted October 31, 2015 attempt to index global 'ped' (a nil value) Link to comment
starksZ Posted October 31, 2015 Share Posted October 31, 2015 Todo lo que se cree junto con el ped debe ir en una tabla para que no se sobreescriban. Ponle igual que el ped. Ejemplo: tabla.ped tabla.col Link to comment
aka Blue Posted October 31, 2015 Author Share Posted October 31, 2015 Todo lo que se cree junto con el ped debe ir en una tabla para que no se sobreescriban.Ponle igual que el ped. Tabla.cosa ... Creo que no lo has entendido Link to comment
starksZ Posted October 31, 2015 Share Posted October 31, 2015 Cada vez que creo cosas con una tabla lo hago asi, mira el Edit. Link to comment
aka Blue Posted October 31, 2015 Author Share Posted October 31, 2015 Creo que mi problema no tiene que ver con eso. Link to comment
starksZ Posted October 31, 2015 Share Posted October 31, 2015 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
aka Blue Posted November 1, 2015 Author Share Posted November 1, 2015 Nada, haga lo que haga interactua solo con el último ped introducido en la tabla, los otros los ignora. Link to comment
starksZ Posted November 1, 2015 Share Posted November 1, 2015 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
aka Blue Posted November 1, 2015 Author Share Posted November 1, 2015 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
DBY Posted November 1, 2015 Share Posted November 1, 2015 ¿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
Recommended Posts