Page 1 of 1

Dudas varias (sobre la programacion y el API)

PostPosted: Sat Oct 01, 2016 14:59
by libahunt
Hola! hace unas semanas estoy haciendo un mod con un par de personas, e estado mirando la API de minetest pero no se como detectar un objeto tirado cerca de "X" bloque, también me gustaría saber como almacenar datos individuales en un bloque, por ejemplo si un bloque se pudiera cargar con "energía" donde se almacenaría y como?
también como se podría acceder desde otro bloque a la variable que almacena el valor.

Gracias de antemano por leerme :D

PD:Conforme surjan dudas o encuentre soluciones intentare ir actualizando el post para que finalmente quede por si alguien le surjan las mismas dudas :D

PD2: Si te interesa el proyecto y sabes algo de programacion (como minimo una base) enviame un MP y te cuento de que va el proyecto

Re: Dudas varias (sobre la programacion y el API)

PostPosted: Sat Oct 01, 2016 17:54
by kaeza
Hola.

Para saber si un objeto está cerca de alguna posición, debes usar `minetest.get_objects_inside_radius`:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
local objetos = minetest.get_objects_inside_radius(posicion, radio)
for _, objeto in ipairs(objetos) do
  -- Obtener referencia a una "entidad Lua" (o "Lua entity")
  local entidad = objeto.get_luaentity and objeto:get_luaentity()
  if entidad then
    -- El objeto es una entidad programada en Lua.
    if entidad.name == "__builtin:item" then
      -- El objeto es un objeto soltado por un jugador
      -- Hacer algo con él aquí.
      -- Podemos acceder a las variables del objeto:
      print(entidad.variable)
      -- O hacer algo con el objeto:
      objeto:remove()
    elseif entidad.name == "algunmod:algunnombre" then
      -- ...
    else
      -- No reconocemos el objeto.
    end
  elseif objeto:is_player() then
    -- El objeto es un jugador.
    -- Hacer algo con él aquí si es necesario
    print(objeto:get_player_name())
  end
end

Para almacenar datos en un bloque, usa `minetest.get_meta`:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
local meta = minetest.get_meta(posicion_del_bloque)

-- Trata de usar el nombre de tu mod como prefijo
-- para evitar choques con variables usadas por
-- otros mods.
meta:set_int("mimod:energia", 9001)
meta:set_string("mimod:mensaje", "Hola, mundo!")

-- Hay campos "especiales" que son usados por Minetest:

-- Si "formspec" está definido, se muestra un formulario
-- al hacer clic derecho:
meta:set_string("formspec", "size[4,3]button[1,1;2,1;Hola!]")

-- Si "infotext" está definido, el mensaje se muestra al
-- apuntar al objeto (de ésta manera se implementan los
-- mensajes para los cofres/cajones/hornos/etc.):
meta:set_string("infotext", "Hola, mundo!")


Espero sirva de ayuda. Cualquier duda, pregunta.

Re: Dudas varias (sobre la programacion y el API)

PostPosted: Tue Oct 04, 2016 14:15
by libahunt
Hola! gracias por responder !

ahora estoy probando con lo que me as comentado de minetest.get_objects_inside_radius, en un rato actualizare mi comentario (este) con el resultado o en su defecto el error o el problema que encuentre. en cuanto a esta parte:

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
if entidad.name == "__builtin:item" then
      -- El objeto es un objeto soltado por un jugador
      -- Hacer algo con él aquí.
      -- Podemos acceder a las variables del objeto:
      print(entidad.variable)
      -- O hacer algo con el objeto:
      objeto:remove()

te refieres a las variables que definen el objeto? aviso que aun no e llegado a hacer los objetos que quiero detectar así que no e entrado a programarlos aun xD (solo están "diseñados" en mi libreta de apuntes)

también en cuanto a almacenar variables como "energía" que puse en el ejemplo, podrías ponerme un pequeño ejemplo de como meter la variable y como acceder a ella? (si no es mucha molestia, no querría ser pesado xD)

y de nuevo gracias por leerme :D