GalacticForge — Consolas de manejo (ComputerCraft)
admin@galacticforge ~ % edit

Guía técnica · ComputerCraft + Advanced Peripherals

CONSOLAS DE MANEJO

Computadoras Lua dentro del juego que monitorean y controlan tu base y tu server. Dos consolas listas para armar: un terminal de almacén conectado a tu red AE2/Refined Storage, y un puente que manda los eventos del server a Discord. Bloques, cableado y código completo.

Antes de empezar

# Lo que necesitas saber

Todo esto ya está en el pack (ComputerCraft: Tweaked + Advanced Peripherals). No hay que instalar nada.

Cablear un periférico a la computadora

Un periférico (ME Bridge, Chat Box, etc.) se conecta a la computadora de dos formas:

Cargar un programa

  1. Copia el código de esta página (seleccionar → copiar).
  2. En la computadora escribe edit almacen (o el nombre que quieras).
  3. Pega con Ctrl+V (o clic derecho), guarda con Ctrl+S y sal con Ctrl+Q.
  4. Ejecutalo escribiendo su nombre: almacen.

En este server ya está habilitado el acceso HTTP de ComputerCraft, por eso el puente a Discord funciona sin tocar nada. En cambio, las consolas que ejecutan comandos del server (kick, dar rango) necesitan una Command Computer y estar en creative — por eso acá van solo consolas de monitoreo, que cualquiera puede usar.

Consola 1 · AE2 / Refined Storage

# Terminal de almacén

Un monitor que lista los ítems de tu red de almacenamiento ordenados por cantidad, muestra la energía del sistema, y te deja buscar y lanzar autocrafteos desde la computadora.

Bloques

  • 1× Advanced Computer
  • 1× ME Bridge (Advanced Peripherals) — conectado a tu red AE2 con cable ME
  • 1× Advanced Monitor (para color) — un panel de 3×2 va bien
  • + Wired Modems + Networking Cable para unir todo
almacen.luaME Bridge + Monitor
-- Terminal de almacen AE2 para GalacticForge
-- Requiere: Advanced Computer + ME Bridge + Advanced Monitor

local bridge = peripheral.find("meBridge")   -- para Refined Storage: "rsBridge"
local mon = peripheral.find("monitor")
if not bridge then error("No encuentro un ME Bridge conectado") end
if not mon then error("No encuentro un Monitor conectado") end

mon.setTextScale(0.5)
local currentFilter = nil

local function fmt(n)
  if n >= 1e9 then return string.format("%.1fB", n/1e9) end
  if n >= 1e6 then return string.format("%.1fM", n/1e6) end
  if n >= 1e3 then return string.format("%.1fK", n/1e3) end
  return tostring(n)
end

local function draw(filter)
  local items = bridge.listItems() or {}
  local list = {}
  for _, it in ipairs(items) do
    local label = string.lower(it.displayName or it.name)
    if not filter or string.find(label, filter, 1, true) then
      list[#list+1] = it
    end
  end
  table.sort(list, function(a,b) return (a.amount or 0) > (b.amount or 0) end)

  mon.clear()
  local w, h = mon.getSize()
  mon.setCursorPos(1,1); mon.setTextColor(colors.orange)
  mon.write("GALACTIC FORGE // ALMACEN")
  mon.setCursorPos(1,2); mon.setTextColor(colors.gray)
  mon.write(("Tipos: %d   Energia: %s AE"):format(#list, fmt(bridge.getEnergyStorage() or 0)))

  local row = 4
  for i = 1, math.min(#list, h-4) do
    local it = list[i]
    local name = it.displayName or it.name
    if #name > w-10 then name = name:sub(1, w-11).."." end
    mon.setCursorPos(1, row); mon.setTextColor(colors.white); mon.write(name)
    local amt = fmt(it.amount or 0)
    mon.setCursorPos(w-#amt+1, row)
    mon.setTextColor(it.isCraftable and colors.lime or colors.white)
    mon.write(amt)
    row = row + 1
  end
end

local function refresher()
  while true do pcall(draw, currentFilter); sleep(5) end
end

local function consola()
  while true do
    term.setTextColor(colors.orange); write("\nbuscar> "); term.setTextColor(colors.white)
    local input = read()
    if input == "" then
      currentFilter = nil
    elseif input:sub(1,6) == "craft " then
      local q = input:sub(7)   -- usar el registry name, ej: minecraft:iron_ingot
      local ok, err = bridge.craftItem({name = q, count = 1})
      print(ok and ("Crafteo iniciado: "..q) or ("No se pudo: "..tostring(err)))
    else
      currentFilter = string.lower(input)
    end
  end
end

print("Terminal lista. Escribi para buscar, 'craft <registryname>' para craftear, Enter vacio limpia.")
parallel.waitForAny(refresher, consola)

¿Usas Refined Storage en vez de AE2? Cambia solo la primera línea: peripheral.find("rsBridge"). Los métodos (listItems, craftItem, getEnergyStorage) son los mismos. Para craftear, el registry name exacto lo ves buscando el ítem en JEI (esquina, se copia con el nombre técnico).

Consola 2 · Discord

# Puente a Discord

Manda al canal de Discord lo que pasa en el server: mensajes del chat, y quién entra y sale. Todo con un webhook, sin bot ni mod de Java.

Bloques

  • 1× Advanced Computer
  • 1× Chat Box (Advanced Peripherals) — lee el chat del server
  • 1× Player Detector (Advanced Peripherals) — detecta conexiones
  • + Wired Modems + Networking Cable

Crear el webhook en Discord

  1. En tu servidor de Discord: Ajustes del canal → Integraciones → Webhooks → Nuevo webhook.
  2. Ponele nombre (ej. GalacticForge) y copia la URL del webhook.
  3. Pegala en la variable WEBHOOK del código, entre comillas.
discord.luaChat Box + Player Detector + HTTP
-- Puente Minecraft -> Discord para GalacticForge
-- Requiere: Advanced Computer + Chat Box + Player Detector

local WEBHOOK = "https://discord.com/api/webhooks/PEGA_TU_WEBHOOK_ACA"
local SERVER  = "GalacticForge"

local chat = peripheral.find("chatBox")
local det  = peripheral.find("playerDetector")
if not chat then error("No encuentro un Chat Box") end
if not det then error("No encuentro un Player Detector") end

local function post(text)
  local body = textutils.serializeJSON({ username = SERVER, content = text })
  local res, err = http.post(WEBHOOK, body, { ["Content-Type"] = "application/json" })
  if res then res.close() else print("Webhook fallo: "..tostring(err)) end
end

post(":satellite: Puente conectado")
print("Puente a Discord activo. Ctrl+T para cortar.")

while true do
  local event, a, b = os.pullEvent()
  if event == "chat" then
    post(("**%s**: %s"):format(a, b))          -- a=usuario, b=mensaje
  elseif event == "playerJoin" then
    post((":green_circle: **%s** se conecto"):format(a))
  elseif event == "playerLeave" then
    post((":red_circle: **%s** se desconecto"):format(a))
  end
end

Que arranque solo con la computadora: guarda el programa como startup (sin extensión) en vez de discord, o crea un archivo startup.lua con shell.run("discord"). Así se reinicia solo tras un reboot del server.

Límites y alcance. El Chat Box captura mensajes de jugadores, no mensajes del sistema — así que las muertes no se detectan por acá (se podrían agregar con lógica extra sobre el Player Detector). Discord limita los webhooks a ~30 mensajes por minuto: si el chat es muy activo, conviene agregar una cola. Este puente es de una vía (Minecraft → Discord); el camino inverso necesitaría un bot con token.

Para seguir

# Otros periféricos que tienes

Advanced Peripherals trae más piezas para futuras consolas. Estas son las más útiles con los mods del pack.

PeriféricoSirve para
energyDetectorMedir energía que pasa (FE/RF) — monitor de generación/consumo de la base.
redstoneIntegratorEmitir redstone por programa: prender/apagar granjas y máquinas por horario o condición.
inventoryManagerLeer y mover ítems del inventario de un jugador (con brazalete).
environmentDetectorHora, clima, dimensión, luna — para automatizaciones ambientales.
geoScannerEscanear bloques alrededor: buscar menas para minería automatizada.

Documentación completa de la API: docs.advanced-peripherals.de · ComputerCraft: tweaked.cc