Advertisement
Tectoon

[TFM] Deathmatch com Flechas

May 5th, 2015
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.38 KB | None | 0 0
  1. local settings = {
  2.     map = "0",
  3.     ammo = 6,
  4.     force = 50,
  5.     recoil = 10,
  6.     maxObjects = 30,
  7.     ammoTicks = 2,
  8. }
  9.  
  10. local players = {}
  11. local objects = {}
  12.  
  13. function main()
  14.     objects = queue.new()
  15.     tfm.exec.disableAutoScore(false)
  16.     tfm.exec.disableAutoShaman(true)
  17.     tfm.exec.disableAutoNewGame(true)
  18.     tfm.exec.newGame(settings.map)
  19. end
  20. print("<rose>Bem-Vindo ao cafofo da tribo Humbers e Hub!Minigame Deathmatch com  flechas![TUTORIAL]Solte flechas com o mouse!")
  21.  
  22.  
  23. function eventNewGame()
  24.     tfm.exec.setGameTime(0, true)
  25.     players = {}
  26.     for name in pairs(tfm.get.room.playerList) do
  27.         initPlayer(name)
  28.     end
  29. end
  30.  
  31. function initPlayer(name)
  32.     players[name] = {ammo = 0}
  33.     ui.addTextArea(0, "", name, 10, 30, settings.ammo * 15, 20, 0x010101, 0x000000, 0.5)
  34.     system.bindMouse(name, true)
  35. end
  36.  
  37. function eventMouse(name, x, y)
  38.     local player = players[name]
  39.     if player and player.ammo > 0 then
  40.         -- remove one ammo
  41.         ui.removeTextArea(player.ammo * 2 - 1, name)
  42.         ui.removeTextArea(player.ammo * 2, name)
  43.         player.ammo = player.ammo - 1
  44.        
  45.         local roomPlayer = tfm.get.room.playerList[name]
  46.        
  47.         -- calculate angle between player and click
  48.         local dx = x - roomPlayer.x
  49.         local dy = y - roomPlayer.y
  50.         local angle = math.atan2(dy, dx)
  51.        
  52.         -- calculate speeds to direct arrow and always have the same total speed
  53.         local vx = math.cos(angle)
  54.         local vy = math.sin(angle)
  55.        
  56.         -- spawn arrow and add to queue
  57.         queue.insert(objects, tfm.exec.addShamanObject(35, roomPlayer.x + 20 * vx, roomPlayer.y + 20 * vy, angle*180/math.pi, settings.force * vx, settings.force * vy, false))
  58.        
  59.         local recoil = -vx * settings.recoil
  60.         -- workaround to avoid argument exception bug
  61.         if recoil <= -1 or recoil >= 1 then
  62.             tfm.exec.movePlayer(name, 0, 0, true, recoil, 0, true)
  63.         end
  64.        
  65.         -- remove first arrow when there are too many
  66.         if objects.size > settings.maxObjects then
  67.             tfm.exec.removeObject(queue.remove(objects))
  68.         end
  69.     end
  70. end
  71.  
  72. local loopCount = 0
  73. function eventLoop()
  74.     -- loopCount resets after a certain amount
  75.     if loopCount == 0 then
  76.         ammo()
  77.     end
  78.     loopCount = (loopCount + 1) % settings.ammoTicks
  79. end
  80.  
  81. function ammo()
  82.     for name, player in pairs(players) do
  83.         local ammo = player.ammo
  84.         if ammo < settings.ammo then
  85.             -- add one ammo
  86.             player.ammo = ammo + 1
  87.             ui.addTextArea(ammo * 2 + 1, "", name, 14 + ammo * 15, 39, 3, 3, 0x990000, 0x990000, 1)
  88.             ui.addTextArea(ammo * 2 + 2, "", name, 15 + ammo * 15, 40, 1, 1, 0xff0000, 0xcc0000, 1)
  89.         end
  90.     end
  91. end
  92.  
  93. function eventNewPlayer(name)
  94.     initPlayer(name)
  95.     tfm.exec.respawnPlayer(name)
  96. end
  97.  
  98. function eventPlayerDied(name)
  99.     tfm.exec.respawnPlayer(name)
  100. end
  101.  
  102. function eventPlayerWon(name)
  103.     tfm.exec.respawnPlayer(name)
  104. end
  105.  
  106. -- simple queue for performance, much faster than system table queues, can contain nils
  107. queue = {}
  108. function queue.new()
  109.     return {
  110.         tail = nil,
  111.         head = nil,
  112.         size = 0
  113.     }
  114. end
  115. function queue.insert(self, v)
  116.     local i = {
  117.         value = v,
  118.         next = nil
  119.     }
  120.     if self.tail and self.head then
  121.         self.tail.next = i
  122.     else
  123.         self.head = i
  124.     end
  125.     self.tail = i
  126.     self.size = self.size + 1
  127. end
  128. function queue.peek(self)
  129.     if self.head then
  130.         return self.head.value
  131.     else
  132.         error("queue is empty")
  133.     end
  134. end
  135. function queue.remove(self)
  136.     local r = queue.peek(self)
  137.     self.head = self.head.next
  138.     if not self.head then
  139.         tail = nil
  140.     end
  141.     self.size = self.size - 1
  142.     return r
  143. end
  144.  
  145. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement