Safwanrockz

Arrow Shooting Example - By Makinit

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