Advertisement
Guest User

Unofficial Module

a guest
Jan 21st, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. Hello this is a module by overjoy06 (Unofficial)
  2. Script _________________________________________________________________________________________________________________________________________
  3. local settings = {
  4. map = "@7367027",
  5. ammo = 50,
  6. force = 50,
  7. recoil = 10,
  8. maxObjects = 30,
  9. ammoTicks = -1,
  10. }
  11.  
  12. local players = {}
  13. local objects = {}
  14.  
  15. function main()
  16. objects = queue.new()
  17. tfm.exec.disableAutoScore(false)
  18. tfm.exec.disableAutoShaman(true)
  19. tfm.exec.disableAutoNewGame(true)
  20. tfm.exec.newGame(settings.map)
  21. end
  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.  
  73. local loopCount = 0
  74. function eventLoop()
  75. -- loopCount resets after a certain amount
  76. if loopCount == 0 then
  77. ammo()
  78. end
  79. loopCount = (loopCount + 1) % settings.ammoTicks
  80. end
  81.  
  82. function ammo()
  83. for name, player in pairs(players) do
  84. local ammo = player.ammo
  85. if ammo < settings.ammo then
  86. -- add one ammo
  87. player.ammo = ammo + 1
  88. ui.addTextArea(ammo * 2 + 1, "", name, 14 + ammo * 15, 39, 3, 3, 0x990000, 0x990000, 1)
  89. ui.addTextArea(ammo * 2 + 2, "", name, 15 + ammo * 15, 40, 1, 1, 0xff0000, 0xcc0000, 1)
  90. end
  91. end
  92. end
  93.  
  94. function eventNewPlayer(name)
  95. initPlayer(name)
  96. tfm.exec.respawnPlayer(name)
  97. end
  98.  
  99. function eventPlayerDied(name)
  100. tfm.exec.respawnPlayer(name)
  101. end
  102.  
  103. function eventPlayerWon(name)
  104. tfm.exec.respawnPlayer(name)
  105. end
  106.  
  107. -- simple queue for performance, much faster than system table queues, can contain nils
  108. queue = {}
  109. function queue.new()
  110. return {
  111. tail = nil,
  112. head = nil,
  113. size = 0
  114. }
  115. end
  116. function queue.insert(self, v)
  117. local i = {
  118. value = v,
  119. next = nil
  120. }
  121. if self.tail and self.head then
  122. self.tail.next = i
  123. else
  124. self.head = i
  125. end
  126. self.tail = i
  127. self.size = self.size + 1
  128. end
  129.  
  130. function queue.peek(self)
  131. if self.head then
  132. return self.head.value
  133. else
  134. error("queue is empty")
  135. end
  136. end
  137.  
  138.  
  139. function queue.remove(self)
  140. local r = queue.peek(self)
  141. self.head = self.head.next
  142. if not self.head then
  143. tail = nil
  144. end
  145. self.size = self.size - 1
  146. return r
  147. end
  148.  
  149. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement