SemlerPDX icon

Minecraft ComputerCraft Mob Farm Control v1.2

SemlerPDX | PRO | 09/03/24 05:23:21 AM UTC (Edited) | 0 ⭐ | 507 👁️ | Never ⏰ | [minecraft]
Lua |

3 KB

|

Gaming

|

0 👍

/

0 👎

--Mob Farm Touch Screen Control w/Remote RS Timer PC
--v1.2 by SemlerPDX Sept2024
 
-- pastebin get GyWbhYEK startup
 
--Peripheral Sides
redstoneSide = "bottom"
monitorSide = "front"
detectorSide = "top"
modemSide = "back"
 
--rednet protocol and computer IDs
protocolCMD = "MobFarmCMD"
controlPC = 22 --id of (this) farm control PC
remotePC = 20 --id of remote redstone timer PC
 
--Remote Command Keywords
msgOpenComms = "opencomms"
msgConfirmed = "copycopy"
msgDenied = "samestate"
commandOn = "on"
commandOff = "off"
 
local messageOn = {" "," ","T","U","R","N"," ","O","N"," "," "," "}
local messageOff = {" "," ","T","U","R","N"," ","O","F","F"," "," "}
 
local messageString = messageOn
local commandString = commandOff
local isOnline = 1 -- initial toggle will invert this for "off" state before main loop
 
--Init
term.clear()
term.setCursorPos(1,1)
monitor = peripheral.wrap(monitorSide)
detector = peripheral.wrap(detectorSide)
modem = peripheral.wrap(modemSide)
rednet.open(modemSide)
 
 
--Rednet Receive Requested Message
local function NetReceive(msg)
  id,message = rednet.receive(protocolCMD,timeout)
  if message ~= nil then
    if msg == message then
      return true
    else
      return false
    end
  end  
end
 
--Rednet Send with Receipt Confirmation
local function NetSend(toID,msg,rcv,ccode)
  rednet.send(toID,msg,protocolCMD)
  if rcv then
    returnReceipt = NetReceive(ccode)
    if returnReceipt then
      return true
    else
      return false
    end
  end
end
 
--Toggle Remote RS Timer via Rednet with Return Confirmation
local function ToggleTimer(toID,msg)
  while true do
    commsOpen = NetSend(toID,msgOpenComms,true,msgConfirmed)
    if commsOpen then
      commsOut = NetSend(toID,msg,true,msgConfirmed)
      return commsOut
    end
    sleep(1)
  end
end
 
--Toggle Monitor Display and Mob Farm Online State
local function ToggleState(stateNew)
  
  if stateNew == 1 then
    stateNew = 0
    messageString = messageOn
    commandString = commandOff
    monitor.setBackgroundColor(colors.red)
  else
    stateNew = 1
    messageString = messageOff
    commandString = commandOn
    monitor.setBackgroundColor(colors.green)
  end
  
  rs.setAnalogOutput(redstoneSide,stateNew)
  monitor.clear()
  for y=1,12 do
    monitor.setCursorPos(4,y)
    monitor.write(messageString[y])
  end
  
  ToggleTimer(remotePC,commandString)
  
  return stateNew
end
 
local function DetectTouch()
  event,side,xPos,yPos = os.pullEvent("monitor_touch")
end
 
local function DetectPlayers()
  while true do
    sleep(1)
    playerPresent = detector.isPlayersInRange(8)
    if not playerPresent then
      return false
    end
  end
end
 
 
--MAIN
while true do
  isOnline = ToggleState(isOnline)
  
  if isOnline == 1 then
    controlFunction = parallel.waitForAny(DetectTouch,DetectPlayers)
    if controlFunction == 2 then
      term.write("No player is present - shutting down mob farm...")
    end
  else
    DetectTouch()
  end
end

Comments