MattiasBuelens

NetherPVP devices/cell

Aug 12th, 2012
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.74 KB | None | 0 0
  1. --[[
  2.  
  3.     Nether PVP Arena
  4.     Cell device
  5.  
  6. --]]
  7.  
  8. game = game or {}
  9.  
  10. local Cell = common.newClass(mcnet.device.Servant, {
  11.     -- Device
  12.     deviceType = "netherpvp:cell",
  13.     -- Servant
  14.     registerServerMessage = "netherpvp:registerCell",
  15.     registeredServerMessage = "netherpvp:registeredCell",
  16.     serverType = "netherpvp:master",
  17.     -- Game configuration
  18.     winTimeout = 0,
  19.     -- Redstone
  20.     getColorSide = nil,
  21.     setColorSide = nil,
  22.     setColorBit = 0,
  23.     setColorTimeout = 0.5,
  24.     openSide = nil,
  25.     openBit = 0,
  26.     leverSide = nil,
  27.     leverBit = 0,
  28.     resetLeverSide = nil,
  29.     resetLeverBit = 0
  30. })
  31. game.Cell = Cell
  32.  
  33. -- Constructor
  34. function Cell:init()
  35.     mcnet.device.Servant.init(self)
  36.  
  37.     -- Address
  38.     self.address = mcnet.address.new{
  39.         localPart = self.name,
  40.         domainPart = self.domain
  41.     }
  42.    
  43.     -- Reset
  44.     self:resetGame()
  45.  
  46.     self:on("redstone", self.handleLever, self)
  47.     self:on("timer", self.handleTimer, self)
  48.  
  49.     self:addMessageHandler{
  50.         [game.msg.getColor] = self.handleGetColor,
  51.         [game.msg.newRound] = self.handleNewRound,
  52.         [game.msg.startRound] = self.startRound,
  53.         [game.msg.stopRound] = self.stopRound
  54.     }
  55. end
  56.  
  57. function Cell:checkServer(deviceType, deviceAddress)
  58.     return deviceType == self.serverType and deviceAddress.domainPart == self.domain
  59. end
  60.  
  61. function Cell:stop()
  62.     -- Reset game
  63.     self:resetGame()
  64.     -- Stop device
  65.     mcnet.device.Servant.stop(self)
  66. end
  67.  
  68. --[[
  69.  
  70.     Utilities
  71.  
  72. --]]
  73.  
  74. -- Post message to master
  75. function Cell:post(msg)
  76.     if not self:isConnected() then
  77.         self:trigger("error", "cellDisconnected", "Cell not connected to master")
  78.         return false
  79.     end
  80.  
  81.     -- Sender address
  82.     msg.from = self.address
  83.  
  84.     -- Send message
  85.     local result = self:send(self.serverId, msg)
  86.     if not result then
  87.         self:trigger("error", "postMessageFailed", "Could not post message")
  88.     end
  89.     return result
  90. end
  91.  
  92. --[[
  93.  
  94.     Color
  95.  
  96. --]]
  97.  
  98. function Cell:getColor()
  99.     return rs.getBundledInput(self.getColorSide)
  100. end
  101.  
  102. function Cell:rsCombine(side, color)
  103.     return rs.setBundledOutput(side, colors.combine(rs.getBundledOutput(side), color))
  104. end
  105.  
  106. function Cell:rsSubtract(side, color)
  107.     return rs.setBundledOutput(side, colors.subtract(rs.getBundledOutput(side), color))
  108. end
  109.  
  110. function Cell:rsPulse(side, color, duration)
  111.     self:rsCombine(side, color)
  112.     os.sleep(duration)
  113.     self:rsSubtract(side, color)
  114.     os.sleep(duration)
  115. end
  116.  
  117. function Cell:setColor(color)
  118.     print("setColor to ", color)
  119.     local oldColor = self:getColor()
  120.  
  121.     while self:getColor() ~= color do
  122.         print("  current: ", self:getColor())
  123.  
  124.         -- Cycle color
  125.         self:rsPulse(self.setColorSide, self.setColorBit, self.setColorTimeout)
  126.  
  127.         -- Prevent infinite loops on bad color input
  128.         if rs.testBundledInput(self.getColorSide, oldColor) then
  129.             return false
  130.         end
  131.     end
  132.     print("setColor end")
  133.  
  134.     return true
  135. end
  136.  
  137. -- Report color
  138. function Cell:handleGetColor(senderId, msg)
  139.     local color = self:getColor()
  140.     self:trigger("getColor", color)
  141.  
  142.     -- Reply color to master
  143.     return self:post(mcnet.message.new{
  144.         type = game.msg.notifyColor,
  145.         data = color
  146.     })
  147. end
  148.  
  149. --[[
  150.  
  151.     Cell opening
  152.  
  153. --]]
  154.  
  155. function Cell:openCell()
  156.     self:rsSubtract(self.openSide, self.openBit)
  157. end
  158.  
  159. function Cell:closeCell()
  160.     self:rsCombine(self.openSide, self.openBit)
  161. end
  162.  
  163. --[[
  164.  
  165.     Game
  166.  
  167. ]]--
  168.  
  169. function Cell:resetGame()
  170.     -- Stop round
  171.     self:stopRound()
  172.     -- Clear lever reset
  173.     self:rsSubtract(self.resetLeverSide, self.resetLeverBit)
  174. end
  175.  
  176. --[[
  177.  
  178.     Rounds
  179.  
  180. ]]--
  181.  
  182. -- Round started
  183. function Cell:startRound()
  184.     self:trigger("startRound")
  185.     -- Clear lever reset
  186.     self:rsSubtract(self.resetLeverSide, self.resetLeverBit)
  187.     -- Open cell
  188.     self:openCell()
  189. end
  190.  
  191. -- Round stopped
  192. function Cell:stopRound()
  193.     self:trigger("stopRound")
  194.     -- Stop win timer
  195.     self:stopWinTimer()
  196.     -- Close cell
  197.     self:closeCell()
  198. end
  199.  
  200. -- Player wins round
  201. function Cell:winRound()
  202.     self:trigger("winRound")
  203.  
  204.     -- Stop round and reset lever
  205.     self:stopRound()
  206.     self:rsCombine(self.resetLeverSide, self.resetLeverBit)
  207.  
  208.     -- Report win to master
  209.     self:post(mcnet.message.new{
  210.         type = game.msg.notifyWin,
  211.         data = self:getColor()
  212.     })
  213. end
  214.  
  215. -- New round starting
  216. function Cell:handleNewRound(senderId, msg)
  217.     self:trigger("newRound")
  218.  
  219.     -- Stop round and reset lever
  220.     self:stopRound()
  221.     self:rsCombine(self.resetLeverSide, self.resetLeverBit)
  222.  
  223.     -- Set color
  224.     self:setColor(tonumber(msg.data))
  225.  
  226.     -- Report as ready to master
  227.     self:post(mcnet.message.new{
  228.         type = game.msg.notifyReady,
  229.         data = self:getColor()
  230.     })
  231. end
  232.  
  233. --[[
  234.  
  235.     Winning round
  236.  
  237. --]]
  238.  
  239. function Cell:startWinTimer()
  240.     self:trigger("startWinning")
  241.  
  242.     -- Start win timer
  243.     self.winTimer = os.startTimer(self.winTimeout)
  244. end
  245.  
  246. function Cell:stopWinTimer()
  247.     self:trigger("stopWinning")
  248.  
  249.     -- Remove reference to win timer
  250.     self.winTimer = nil
  251. end
  252.  
  253. function Cell:isWinTimerRunning()
  254.     return self.winTimer ~= nil
  255. end
  256.  
  257. function Cell:handleLever()
  258.     -- Check if lever is activated
  259.     if rs.testBundledInput(self.leverSide, self.leverBit) then
  260.         -- Start win timer if not already running
  261.         if not self:isWinTimerRunning() then
  262.             self:startWinTimer()
  263.         end
  264.     else
  265.         -- Stop win timer
  266.         self:stopWinTimer()
  267.     end
  268. end
  269.  
  270. function Cell:handleTimer(timer)
  271.     if timer == self.winTimer then
  272.         -- Win timer ran out, player wins round
  273.         self:winRound()
  274.     end
  275. end
Advertisement
Add Comment
Please, Sign In to add comment