Platin Posted May 18, 2015 Share Posted May 18, 2015 Bueno, hice un script muy sencillo hace un tiempo, pero como no había terminado de entender el funcionamiento de las tablas no lo seguí. Al comprobar con un CMD que puedo crear autos que sean de una persona y quitarlos si pone más de uno correctamente, procedí a intentar terminar el script inicial, pero no pude. El script es sencillo, crea una c4 que luego de 15 segundos explotará. Cabe aclarar que es triggeada de client > server | por cuestiones de mi manera de scriptear. server-side function bombaPoner() if not bombas[source] then setPedAnimation (source, "BOMBER", "BOM_Plant", 4000, false, true, false) x, y, z = getElementPosition ( source ) rx, ry, rz = getElementRotation ( source ) bombas[source] = createObject( 1252, x, y, z, rx, ry, rz, false) cx, cy, cz = getElementPosition ( bombas[source] ) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", source, 255, 0, 0, true) plr = source setTimer(function() destroyElement(bombas[source]) createExplosion ( cx, cy, cz, 10, plr ) end, 15000, 1, bombas[source], plr) -- Esta linea es el problema, ya que no me lleva el objeto, por lo cual no se destruye, ¿cómo lo puedo arreglar? end --outputChatBox("Deshabilitado",source,255,0,0) end addEvent("bombaColocar", true) addEventHandler( "bombaColocar", root, bombaPoner ) PD: En el script dice el error. Espero una respuesta, gracias de antemano, ¡saludos! Link to comment
Enargy, Posted May 18, 2015 Share Posted May 18, 2015 Trata con esto bombas = {} function bombaPoner() setPedAnimation (source, "BOMBER", "BOM_Plant", 4000, false, true, false) x, y, z = getElementPosition ( source ) rx, ry, rz = getElementRotation ( source ) bombas[source] = createObject( 1252, x, y, z, rx, ry, rz, false) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", source, 255, 0, 0, true) detonarBomba(bombas[source]) --outputChatBox("Deshabilitado",source,255,0,0) 15000 end addEvent("bombaColocar", true) addEventHandler( "bombaColocar", root, bombaPoner ) function detonarBomba(element) setTimer(function() if isElement(element) then local cx, cy, cz = getElementPosition ( element ) createExplosion ( cx, cy, cz, 10, source ) destroyElement(element) end end, 15000, 1) end Link to comment
Platin Posted May 18, 2015 Author Share Posted May 18, 2015 Trata con esto bombas = {} function bombaPoner() setPedAnimation (source, "BOMBER", "BOM_Plant", 4000, false, true, false) x, y, z = getElementPosition ( source ) rx, ry, rz = getElementRotation ( source ) bombas[source] = createObject( 1252, x, y, z, rx, ry, rz, false) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", source, 255, 0, 0, true) detonarBomba(bombas[source]) --outputChatBox("Deshabilitado",source,255,0,0) 15000 end addEvent("bombaColocar", true) addEventHandler( "bombaColocar", root, bombaPoner ) function detonarBomba(element) setTimer(function() if isElement(element) then local cx, cy, cz = getElementPosition ( element ) createExplosion ( cx, cy, cz, 10, source ) destroyElement(element) end end, 15000, 1) end Me sirvió, muchas gracias. Link to comment
Platin Posted May 18, 2015 Author Share Posted May 18, 2015 No problema Bueno, ahora probando me di cuenta que solo funciona 1 vez, a la siguiente no ejecuta nada. ¿Tienes alguna idea del por qué? Link to comment
Bc# Posted May 18, 2015 Share Posted May 18, 2015 en el ultimo argumento del setTimer en vez de un 1 ponle un 0, este represeta infinitas repeticiones. Link to comment
Platin Posted May 18, 2015 Author Share Posted May 18, 2015 en el ultimo argumento del setTimer en vez de un 1 ponle un 0, este represeta infinitas repeticiones. ¿Eso no iría a ocasionar errores? Digo, no todo el tiempo hay una bomba, y si se coloca una luego de haberse iniciado el settimer habrán 2 setTimers. Link to comment
Calculador Posted May 19, 2015 Share Posted May 19, 2015 Bueno, ahora probando me di cuenta que solo funciona 1 vez, a la siguiente no ejecuta nada. ¿Tienes alguna idea del por qué? Es extraño, debería funcionar perfectamente, sin embargo intenta definir un argumento en vez de source. ¿Eso no iría a ocasionar errores? Digo, no todo el tiempo hay una bomba, y si se coloca una luego de haberse iniciado el settimer habrán 2 setTimers. Y no, no ocasionaría errores, no se repetirá la explosión. Link to comment
Enargy, Posted May 19, 2015 Share Posted May 19, 2015 No problema Bueno, ahora probando me di cuenta que solo funciona 1 vez, a la siguiente no ejecuta nada. ¿Tienes alguna idea del por qué? Lo probé y si funciona Link to comment
Tomas Posted May 19, 2015 Share Posted May 19, 2015 en el ultimo argumento del setTimer en vez de un 1 ponle un 0, este represeta infinitas repeticiones. Eso no sería nada eficiente, repetir una función infinitas veces para ver si algo existe... Link to comment
UserToDelete Posted May 19, 2015 Share Posted May 19, 2015 Coloca esto SOLO si es triggeado desde client y cuenta si ha funcionado, no estoy seguro de hacerlo correctamente bombas = {} function bombaPoner() setPedAnimation (client, "BOMBER", "BOM_Plant", 4000, false, true, false) x, y, z = getElementPosition ( client) rx, ry, rz = getElementRotation ( client) bombas[source] = createObject( 1252, x, y, z, rx, ry, rz, false) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", client, 255, 0, 0, true) detonarBomba(bombas[client]) --outputChatBox("Deshabilitado",client,255,0,0) 15000 end addEvent("bombaColocar", true) addEventHandler( "bombaColocar", root, bombaPoner ) function detonarBomba(element_bomba) setTimer(function() if isElement(element_bomba) then local cx, cy, cz = getElementPosition ( element_bomba) createExplosion ( cx, cy, cz, 10) destroyElement(element_bomba) end end, 15000, 1) end Link to comment
Enargy, Posted May 19, 2015 Share Posted May 19, 2015 Coloca esto SOLO si es triggeado desde client y cuenta si ha funcionado, no estoy seguro de hacerlo correctamente bombas = {} function bombaPoner() setPedAnimation (client, "BOMBER", "BOM_Plant", 4000, false, true, false) x, y, z = getElementPosition ( client) rx, ry, rz = getElementRotation ( client) bombas[source] = createObject( 1252, x, y, z, rx, ry, rz, false) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", client, 255, 0, 0, true) detonarBomba(bombas[client]) --outputChatBox("Deshabilitado",client,255,0,0) 15000 end addEvent("bombaColocar", true) addEventHandler( "bombaColocar", root, bombaPoner ) function detonarBomba(element_bomba) setTimer(function() if isElement(element_bomba) then local cx, cy, cz = getElementPosition ( element_bomba) createExplosion ( cx, cy, cz, 10) destroyElement(element_bomba) end end, 15000, 1) end Los argumentos como client, ped, element, vehicle, object y entre otros, tambien sirven para argumentos. Tecnicamente haces lo mismo. PD: HE PROBADO MI CODIGO Y FUNCIONA. Link to comment
Platin Posted May 20, 2015 Author Share Posted May 20, 2015 Coloca esto SOLO si es triggeado desde client y cuenta si ha funcionado, no estoy seguro de hacerlo correctamente bombas = {} function bombaPoner() setPedAnimation (client, "BOMBER", "BOM_Plant", 4000, false, true, false) x, y, z = getElementPosition ( client) rx, ry, rz = getElementRotation ( client) bombas[source] = createObject( 1252, x, y, z, rx, ry, rz, false) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", client, 255, 0, 0, true) detonarBomba(bombas[client]) --outputChatBox("Deshabilitado",client,255,0,0) 15000 end addEvent("bombaColocar", true) addEventHandler( "bombaColocar", root, bombaPoner ) function detonarBomba(element_bomba) setTimer(function() if isElement(element_bomba) then local cx, cy, cz = getElementPosition ( element_bomba) createExplosion ( cx, cy, cz, 10) destroyElement(element_bomba) end end, 15000, 1) end Los argumentos como client, ped, element, vehicle, object y entre otros, tambien sirven para argumentos. Tecnicamente haces lo mismo. PD: HE PROBADO MI CODIGO Y FUNCIONA. Funciona 1 vez, al segundo triggeo deja de funcionar, como que el elemento ya no puede ser creado / destruido. Ese es el error en concreto, paso clientside: function bombaC () if not bomba then bomba = true setTimer (function() bomba = false end, 30000, 1) triggerServerEvent("bombaColocar", localPlayer) else outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", 255, 255, 255, true) end end addCommandHandler ( "bomba", bombaC ) addCommandHandler ( "c4", bombaC ) Link to comment
Enargy, Posted May 20, 2015 Share Posted May 20, 2015 Prueba con esta versión que hice: bomb = {}; function createBomb(player, x, y, z, delay ) if not isBombExists(bomb[player]) then bomb[player] = createObject( 1252, x, y, z, 0,0,0, false); setPedAnimation (player, "BOMBER", "BOM_Plant", 4000, false, true, false); outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", player, 255, 0, 0, true); setTimer(function() local x, y, z = getElementPosition ( bomb[player] ); createExplosion ( x, y, z, 10 ); destroyElement( bomb[player] ); bomb[player] = nil end, delay, 1 ); else outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", player, 255, 255, 255, true); end end function isBombExists( element ) if element then return true end end function bomba( thePlayer ) local x, y, z = getElementPosition ( thePlayer ); createBomb(thePlayer, x, y, z, 15000); end addCommandHandler("bomba", bomba) addCommandHandler("c4", bomba) source createBomb( el_creador, x, y, z, tiempo_detonacion ) Link to comment
Platin Posted May 20, 2015 Author Share Posted May 20, 2015 Prueba con esta versión que hice: bomb = {}; function createBomb(player, x, y, z, delay ) if not isBombExists(bomb[player]) then bomb[player] = createObject( 1252, x, y, z, 0,0,0, false); setPedAnimation (player, "BOMBER", "BOM_Plant", 4000, false, true, false); outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", player, 255, 0, 0, true); setTimer(function() local x, y, z = getElementPosition ( bomb[player] ); createExplosion ( x, y, z, 10 ); destroyElement( bomb[player] ); bomb[player] = nil end, delay, 1 ); else outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", player, 255, 255, 255, true); end end function isBombExists( element ) if element then return true end end function bomba( thePlayer ) local x, y, z = getElementPosition ( thePlayer ); createBomb(thePlayer, x, y, z, 15000); end addCommandHandler("bomba", bomba) addCommandHandler("c4", bomba) source createBomb( el_creador, x, y, z, tiempo_detonacion ) Funciona, gracias. Lástima que no se pudo mantener lo de esperar el doble de tiempo Link to comment
Enargy, Posted May 20, 2015 Share Posted May 20, 2015 Prueba con esta versión que hice: bomb = {}; function createBomb(player, x, y, z, delay ) if not isBombExists(bomb[player]) then bomb[player] = createObject( 1252, x, y, z, 0,0,0, false); setPedAnimation (player, "BOMBER", "BOM_Plant", 4000, false, true, false); outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", player, 255, 0, 0, true); setTimer(function() local x, y, z = getElementPosition ( bomb[player] ); createExplosion ( x, y, z, 10 ); destroyElement( bomb[player] ); bomb[player] = nil end, delay, 1 ); else outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", player, 255, 255, 255, true); end end function isBombExists( element ) if element then return true end end function bomba( thePlayer ) local x, y, z = getElementPosition ( thePlayer ); createBomb(thePlayer, x, y, z, 15000); end addCommandHandler("bomba", bomba) addCommandHandler("c4", bomba) source createBomb( el_creador, x, y, z, tiempo_detonacion ) Funciona, gracias. Lástima que no se pudo mantener lo de esperar el doble de tiempo De nada, puedes editar la parte del comando para que hagas lo de tu "tiempo de espera". Link to comment
UserToDelete Posted May 20, 2015 Share Posted May 20, 2015 Algo como asi? [ CREDITOS A ENARGY ] tiempo = {} bomb = {} _delay = 15 --Segundos function createBomb(player, x, y, z, delay ) if not isBombExists(bomb[player]) then bomb[player] = createObject( 1252, x, y, z, 0,0,0, false) setPedAnimation (player, "BOMBER", "BOM_Plant", 4000, false, true, false) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", player, 255, 0, 0, true) tiempo[player] = tonumber(delay)*2 setTimer(function() local x, y, z = getElementPosition ( bomb[player] ) createExplosion ( x, y, z, 10 ) destroyElement( bomb[player] ) bomb[player] = nil end, delay*1000, 1 ) --else --outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", player, 255, 255, 255, true) end end function isBombExists( element ) if element then return true end end function bomba( thePlayer ) if tiempo[thePlayer] <= 0 then local x, y, z = getElementPosition ( thePlayer ) createBomb(thePlayer, x, y, z, _delay) else outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", player, 255, 255, 255, true) end end addCommandHandler("bomba", bomba) addCommandHandler("c4", bomba) function red () for k,v in ipairs(getElementsByType("player")) do if tiempo[v] ~= nil then tiempo[v] = tiempo[v] - 1 end end end setTimer(red, 1000, 0) Link to comment
Tomas Posted May 20, 2015 Share Posted May 20, 2015 Algo como asi?[ CREDITOS A ENARGY ] tiempo = {} bomb = {} _delay = 15 --Segundos function createBomb(player, x, y, z, delay ) if not isBombExists(bomb[player]) then bomb[player] = createObject( 1252, x, y, z, 0,0,0, false) setPedAnimation (player, "BOMBER", "BOM_Plant", 4000, false, true, false) outputChatBox("#FFFF99¡La bomba explotará en #00FF0015 segundos#FFFF99! ¡CORRE!", player, 255, 0, 0, true) tiempo[player] = tonumber(delay)*2 setTimer(function() local x, y, z = getElementPosition ( bomb[player] ) createExplosion ( x, y, z, 10 ) destroyElement( bomb[player] ) bomb[player] = nil end, delay*1000, 1 ) --else --outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", player, 255, 255, 255, true) end end function isBombExists( element ) if element then return true end end function bomba( thePlayer ) if tiempo[thePlayer] <= 0 then local x, y, z = getElementPosition ( thePlayer ) createBomb(thePlayer, x, y, z, _delay) else outputChatBox("#FFFF99¡Ya pusiste una bomba! ¡Espera un tiempo!", player, 255, 255, 255, true) end end addCommandHandler("bomba", bomba) addCommandHandler("c4", bomba) function red () for k,v in ipairs(getElementsByType("player")) do if tiempo[v] ~= nil then tiempo[v] = tiempo[v] - 1 end end end setTimer(red, 1000, 0) function red () for k,v in ipairs(getElementsByType("player")) do if tiempo[v] ~= nil then tiempo[v] = tiempo[v] - 1 end end end setTimer(red, 1000, 0) ¿?¿?¿?¿? Link to comment
Platin Posted May 21, 2015 Author Share Posted May 21, 2015 Dejenlo así, no hay drama Es que no quiero crear otro setTimer, este script era solo de prueba, tampoco necesito que sea "perfecto". Gracias a todos nuevamente. Link to comment
Kilfwan Posted May 21, 2015 Share Posted May 21, 2015 Una pregunta para que Sirve el if not Link to comment
Recommended Posts