Advertisement
Kryrus

Isle

Jun 15th, 2022
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.60 KB | None | 0 0
  1. local PlayersService = game:GetService("Players")
  2. --
  3. local LocalPlayer = PlayersService.LocalPlayer
  4.  
  5. local Services = workspace:WaitForChild("Services")
  6. --
  7. local ALLOW_FREEZE = true -- If true makes generating extremely fast but might freeze on hard ones
  8. --
  9. local CharacterPresent, GetNumber, ParseExpression; do -- src: https://gist.githubusercontent.com/Noble-Mushtak/a2eb302003891c85b562/raw/652cbe49d72211309d6c688ced4027959afeffc1/Calculator.lua
  10. function CharacterPresent(str, character)
  11. for i=1, #str do
  12. if string.sub(str, i, i) == character then
  13. return true
  14. end
  15. end
  16. return false
  17. end
  18. function GetNumber(expression)
  19. local validCharacters = "0123456789.-"
  20. local foundDigit = false
  21. local i = 1
  22. local currentCharacter = string.sub(expression, i, i)
  23. while CharacterPresent(validCharacters, currentCharacter) do
  24. if i == 1 then
  25. validCharacters = "0123456789."
  26. end
  27. if currentCharacter == "." then
  28. validCharacters = "0123456789"
  29. end
  30. if CharacterPresent("0123456789", currentCharacter) then
  31. foundDigit = true
  32. end
  33. i += 1
  34. if i > #expression then
  35. break
  36. end
  37. currentCharacter = string.sub(expression, i, i)
  38. end
  39. if not foundDigit then
  40. i = 1
  41. end
  42. return tonumber(string.sub(expression, 1, i-1)), string.sub(expression, i, #expression)
  43. end
  44. function ParseExpression(expression, expectEndParentheses)
  45. if type(expression) ~= "string" then
  46. return nil, "Expected string as argument #1"
  47. end
  48. expression = string.gsub(expression, "%s+", "")
  49. local expectingExpression = true
  50. local lastExpressionWasParenthetical = false
  51. local operators = "+-/*^%"
  52. local parts = {}
  53. local foundEndParentheses = false
  54. expectEndParentheses = expectEndParentheses or false
  55. while expression ~= "" do
  56. local nextNumber, expressionAfterNumber = GetNumber(expression)
  57. local nextCharacter = string.sub(expression, 1, 1)
  58. local nextPiece = string.sub(expression, 1, 5)
  59. if #expression <= 5 then
  60. nextPiece ..= " [end]"
  61. end
  62. if expectingExpression then
  63. if nextCharacter == "(" then
  64. local nestedExpressionValue, expressionAfterParentheses = ParseExpression(string.sub(expression, 2, #expression), true)
  65. if nestedExpressionValue == nil then
  66. return nestedExpressionValue, expressionAfterParentheses
  67. end
  68. table.insert(parts, nestedExpressionValue)
  69. expression = expressionAfterParentheses
  70. lastExpressionWasParenthetical = true
  71. else
  72. if nextNumber == nil then
  73. return nil, "Expected number or '(', but found '"..nextPiece.."'"
  74. end
  75. table.insert(parts, nextNumber)
  76. expression = expressionAfterNumber
  77. lastExpressionWasParenthetical = false
  78. end
  79. elseif CharacterPresent(operators, nextCharacter) then
  80. table.insert(parts, nextCharacter)
  81. expression = string.sub(expression, 2, #expression)
  82. elseif nextCharacter == "(" or (lastExpressionWasParenthetical and nextNumber ~= nil) then
  83. table.insert(parts, "*")
  84. elseif nextCharacter == ")" then
  85. if expectEndParentheses then
  86. expression = string.sub(expression, 2, #expression)
  87. foundEndParentheses = true
  88. break
  89. else
  90. return nil, "')' present without matching '(' at '"..nextPiece.."'"
  91. end
  92. else
  93. return nil, "Expected expression, but found '"..nextPiece.."'"
  94. end
  95. expectingExpression = not expectingExpression
  96. end
  97. if expectEndParentheses and not foundEndParentheses then
  98. return nil, "Expression unexpectedly ended ('(' present without matching ')')"
  99. end
  100. if expectingExpression then
  101. return nil, "Expression unexpectedly ended"
  102. end
  103. local i = #parts
  104. while i >= 1 do
  105. if parts[i] == "^" then
  106. parts[i-1] ^= parts[i+1]
  107. table.remove(parts, i+1)
  108. table.remove(parts, i)
  109. end
  110. i -= 1
  111. end
  112. i = 1
  113. while i <= #parts do
  114. if parts[i] == "*" then
  115. parts[i-1] *= parts[i+1]
  116. table.remove(parts, i+1)
  117. table.remove(parts, i)
  118. elseif parts[i] == "/" then
  119. parts[i-1] /= parts[i+1]
  120. table.remove(parts, i+1)
  121. table.remove(parts, i)
  122. elseif parts[i] == "%" then
  123. parts[i-1] %= parts[i+1]
  124. table.remove(parts, i+1)
  125. table.remove(parts, i)
  126. else
  127. i += 1
  128. end
  129. end
  130. i = 1
  131. while i <= #parts do
  132. if parts[i] == "+" then
  133. parts[i-1] += parts[i+1]
  134. table.remove(parts, i+1)
  135. table.remove(parts, i)
  136. elseif parts[i] == "-" then
  137. parts[i-1] -= parts[i+1]
  138. table.remove(parts, i+1)
  139. table.remove(parts, i)
  140. else
  141. i += 1
  142. end
  143. end
  144.  
  145. return parts[1], expression
  146. end
  147. end
  148.  
  149. local GetDictionaryLength; do
  150. function GetDictionaryLength(dictionary)
  151. local length = 0
  152. for key, value in pairs(dictionary) do
  153. length += 1
  154. end
  155. return length
  156. end
  157. end
  158.  
  159. local OnHack; do
  160. local SubmitSolution = Services:WaitForChild("SubmitSolution")
  161. function OnHack(expressions, letters, answers, objectId)
  162. local results = {}
  163. local generatedNumbers = {}
  164. local lastGeneratedNumbers
  165. local allowSubmit = true
  166. for index, expression in ipairs(expressions) do
  167. local correctAnswer = tonumber(answers[index])
  168. local result, errorMessage
  169. repeat
  170. local expression = expression
  171. if lastGeneratedNumbers then
  172. generatedNumbers = lastGeneratedNumbers
  173. elseif GetDictionaryLength(generatedNumbers) == 0 then
  174. for index, letter in ipairs(letters) do
  175. generatedNumbers[letter] = math.random(0, 9)
  176. end
  177. end
  178. for letter, value in pairs(generatedNumbers) do
  179. expression = string.gsub(expression, letter, value)
  180. end
  181. result, errorMessage = ParseExpression(expression)
  182. if tonumber(result) ~= correctAnswer then
  183. if lastGeneratedNumbers == generatedNumbers then
  184. allowSubmit = false
  185. task.spawn(OnHack, expressions, letters, answers, objectId)
  186. break
  187. end
  188. table.clear(generatedNumbers)
  189. end
  190. if not ALLOW_FREEZE then
  191. task.wait()
  192. end
  193. until tonumber(result) == correctAnswer
  194. lastGeneratedNumbers = generatedNumbers
  195. end
  196. if allowSubmit then
  197. SubmitSolution:FireServer(objectId, generatedNumbers)
  198. end
  199. end
  200. end
  201.  
  202. local HackReceiver = LocalPlayer.Character:WaitForChild("@H")
  203. HackReceiver.OnClientEvent:Connect(OnHack)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement