--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