Advertisement
Amigodoshini

Untitled

Dec 3rd, 2017
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.35 KB | None | 0 0
  1. local bannedStrings = {"lumbertycoon", "lumber_tycoon", "lumbertyc00n", "lumber_tyc00n", "lumbertyco0n", "lumber_tyco0n", "lumbertyc0on", "lumber_tyc0on",
  2. "iumbertycoon", "iumber_tycoon", "iumbertyc00n", "iumber_tyc00n", "iumbertyco0n", "iumber_tyco0n", "iumbertyc0on", "iumber_tyc0on",
  3. "defaultio", "defauitio", "defaultlo", "defaultlo",
  4. "defualtio", "defuaitio", "defualtlo", "defualtlo",
  5. "defaulti0", "defauiti0", "defaultl0", "defaultl0",
  6. "defualti0", "defuaiti0", "defualtl0", "defualtl0"
  7. }
  8.  
  9. local password = "nohacks"
  10.  
  11. local playerStats = {}
  12. local joinTime = {}
  13. local loadedSlot = {}
  14.  
  15. ------------------------[[ Player stats setup ]]------------------------
  16. game.Players.PlayerAdded:connect(function(newPlayer)
  17.  
  18. if not (newPlayer.UserId == 78743445) then
  19. for _, s in pairs(bannedStrings) do
  20. if string.find(string.lower(newPlayer.Name), s) then
  21. print("K9"..debug.traceback())
  22. newPlayer:Kick()
  23. return
  24. end
  25. end
  26. end
  27.  
  28.  
  29. local stats = Instance.new("IntValue")
  30. stats.Name = "leaderstats"
  31.  
  32. local a = Instance.new("IntValue")
  33. a.Name = "Money"
  34. a.Value = 20
  35. a.Parent = stats
  36.  
  37. stats.Parent = newPlayer
  38.  
  39. local chattingValue = Instance.new("IntValue", newPlayer)
  40. chattingValue.Name = "IsChatting"
  41.  
  42. local toolDebounce = Instance.new("NumberValue", newPlayer)
  43. toolDebounce.Name = "ToolEnableTick"
  44.  
  45. local buyingLand = Instance.new("BoolValue", newPlayer)
  46. buyingLand.Name = "IsBuyingLand"
  47.  
  48. local propertyOwner = Instance.new("BoolValue", newPlayer)
  49. propertyOwner.Name = "OwnsProperty"
  50.  
  51.  
  52. local realMoney = a:clone()
  53. playerStats[newPlayer] = {Money = realMoney}--stats
  54. realMoney.Changed:connect(function()
  55. a.Value = realMoney.Value
  56. end)
  57.  
  58. a.Changed:connect(function()
  59. if not (a.Value == realMoney.Value) then
  60. addExploitLog("MoneyExploit", newPlayer.Name, newPlayer.Name.." changed leaderstat value from "..realMoney.Value.." to "..a.Value)
  61. end
  62. end)
  63.  
  64. joinTime[newPlayer] = tick()
  65. newPlayer.Chatted:connect(function(...)
  66. Chatted(newPlayer, ...)
  67. end)
  68.  
  69. script.WhitelistFolder:Clone().Parent = newPlayer
  70. script.BlacklistFolder:Clone().Parent = newPlayer
  71.  
  72. if not (newPlayer.userId == 78743445) and checkBan(newPlayer) then
  73. return
  74. end
  75.  
  76. rememberTools(newPlayer)
  77. end)
  78.  
  79.  
  80. game.Players.PlayerRemoving:connect(function(leavingPlayer)
  81. wait(10)
  82. playerStats[leavingPlayer] = nil
  83. joinTime[leavingPlayer] = nil
  84. loadedSlot[leavingPlayer] = nil
  85. end)
  86.  
  87.  
  88.  
  89. local function getStats(player)
  90. if playerStats[player] then
  91. return playerStats[player]
  92. end
  93. return nil
  94. end
  95.  
  96.  
  97.  
  98. local Transactions = game.ReplicatedStorage.Transactions
  99.  
  100. ------------------------[[Tool Memory ]]------------------------
  101.  
  102. function rememberTools(player)
  103. local toolFolder = script.ToolFolder:Clone()
  104. local toolV = toolFolder.Tool
  105. toolV.Parent = nil
  106. toolFolder.Parent = player
  107.  
  108.  
  109. local function updateFolder(tool)
  110. if not player.Parent or not player:FindFirstChild("Backpack") then
  111. return
  112. end
  113.  
  114. local currentTools = toolFolder:GetChildren()
  115.  
  116. local charTool = player.Character and player.Character:FindFirstChild("Tool") and player.Character.Tool:FindFirstChild("ToolName")
  117. if charTool then
  118. local newV = toolV:Clone()
  119. newV.Value = charTool.Value
  120. newV.Parent = toolFolder
  121. end
  122.  
  123. for _, tool in pairs(player.Backpack:GetChildren()) do
  124. if tool:FindFirstChild("ToolName") then
  125. local newV = toolV:Clone()
  126. newV.Value = tool.ToolName.Value
  127. newV.Parent = toolFolder
  128. end
  129. end
  130.  
  131. for _, v in pairs(currentTools) do
  132. v:Destroy()
  133. end
  134. end
  135.  
  136. local keepTools = false
  137. local hardReloading = player:WaitForChild("CurrentlySavingOrLoading") and player.CurrentlySavingOrLoading.HardReload
  138. hardReloading.Changed:connect(function()
  139. keepTools = false
  140. end)
  141.  
  142. local function connectCharacter(char)
  143.  
  144. --local --[[_,]] hardReloading = not player:FindFirstChild("CurrentlySavingOrLoading") or player.CurrentlySavingOrLoading.HardReload.Value
  145.  
  146. if keepTools and not hardReloading.Value then
  147. for _, v in pairs(toolFolder:GetChildren()) do
  148. local item = game.ReplicatedStorage.Purchasables.Tools.AllTools:FindFirstChild(v.Value)
  149.  
  150. if item then
  151. local newTool = item.Tool:clone()
  152.  
  153. local owner = Instance.new("ObjectValue", newTool)
  154. owner.Name = "Owner"
  155. owner.Value = player
  156.  
  157. local lastInteraction = Instance.new("IntValue", owner)
  158. lastInteraction.Name = "LastInteraction"
  159.  
  160. newTool.Parent = player.Backpack
  161. end
  162. end
  163. end
  164. updateFolder()
  165.  
  166. local c1 = char.ChildAdded:connect(updateFolder)
  167. local c2 = char.ChildRemoved:connect(updateFolder)
  168. local c3 = player.Backpack.ChildAdded:connect(updateFolder)
  169. local c4 = player.Backpack.ChildRemoved:connect(updateFolder)
  170.  
  171. char.Humanoid.Died:wait()
  172.  
  173. c1:disconnect()
  174. c2:disconnect()
  175. c3:disconnect()
  176. c4:disconnect()
  177.  
  178.  
  179. --currentlySavingOrLoadingBool[player].Value, currentlySavingOrLoadingBool[player].HardReload.Value
  180. --local --[[_,]] hardReloading = not player:FindFirstChild("CurrentlySavingOrLoading") or player.CurrentlySavingOrLoading.HardReload.Value
  181.  
  182. local pos = char:FindFirstChild("Head") and char.Head.Position
  183. if pos --[[and pos.Y > -9]] and pos.Y < 5000 then
  184. keepTools = false
  185.  
  186. for _, v in pairs(toolFolder:GetChildren()) do
  187. v:Destroy()
  188. end
  189.  
  190. if not hardReloading.Value then
  191. for _, tool in pairs(player.Backpack:GetChildren()) do
  192. if tool:FindFirstChild("ToolName") then
  193. wait(0.15)
  194. tool.Handle.CFrame = CFrame.new(pos + Vector3.new(math.random() * 4 - 2, math.random() * 2, math.random() * 4 - 2)) * CFrame.Angles(math.random() * math.pi * 2, math.random() * math.pi * 2, math.random() * math.pi * 2)
  195. tool.Handle.Velocity = ((tool.Handle.Position - pos).unit + Vector3.new(0, 3, 0)) * 5
  196. local b = Instance.new("BoolValue", tool)
  197. b.Name = "DeathDrop"
  198. tool.Parent = workspace
  199. end
  200. end
  201. else
  202. for _, tool in pairs(player.Backpack:GetChildren()) do
  203. if tool:FindFirstChild("ToolName") then
  204. tool:Destroy()
  205. end
  206. end
  207. end
  208.  
  209. for _, v in pairs(toolFolder:GetChildren()) do
  210. v:Destroy()
  211. end
  212.  
  213. local charTool = player.Character and player.Character:FindFirstChild("Tool")
  214. if charTool and charTool:FindFirstChild("ToolName") and not hardReloading.Value then
  215. local b = Instance.new("BoolValue", charTool)
  216. b.Name = "DeathDrop"
  217. charTool.Parent = workspace
  218. elseif charTool and hardReloading.Value then
  219. charTool:Destroy()
  220. end
  221. else
  222. keepTools = not hardReloading.Value
  223. end
  224. end
  225.  
  226. if player.Character then
  227. connectCharacter(player.Character)
  228. end
  229. player.CharacterAdded:connect(connectCharacter)
  230.  
  231.  
  232. end
  233.  
  234. ------------------------[[ Exploit Logging ]]------------------------
  235.  
  236. local exploterList = game:GetService("DataStoreService"):GetDataStore("Logs")
  237.  
  238. local slackHooks = {["MoneyExploit"] = "https://hooks.slack.com/services/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",
  239. ["Exploit"] = "https://hooks.slack.com/services/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",
  240. ["ExploitMinor"] = "https://hooks.slack.com/services/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",
  241. ["WhitelistBlacklistExploit"] = "https://hooks.slack.com/services/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",
  242. ["KickList"] = "https://hooks.slack.com/services/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",
  243. ["Notes"] = "https://hooks.slack.com/services/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"
  244.  
  245. }
  246.  
  247.  
  248.  
  249. function getDate(t)
  250. local thisDate = require(game.ReplicatedStorage.DateTableModule)(t)
  251. return thisDate.DayName.." - "..thisDate.Day.."/"..thisDate.Month.."/"..thisDate.Year.." - "..thisDate.Hour..":"..string.format("%02i", thisDate.Minute)..":"..string.format("%02i", math.floor(thisDate.Seconds)).." "..thisDate.AMOrPM
  252. end
  253. function getTime(t)
  254. local thisDate = require(game.ReplicatedStorage.DateTableModule)(t)
  255. return thisDate.Hour..":"..string.format("%02i", thisDate.Minute)..":"..string.format("%02i", math.floor(thisDate.Seconds)).." "..thisDate.AMOrPM
  256. end
  257.  
  258. local chatHistory = {}
  259. local historyLength = 40
  260.  
  261. function Chatted(player, message, recipient)
  262. for i = historyLength, 2, -1 do
  263. chatHistory[i] = chatHistory[i - 1]
  264. end
  265. chatHistory[1] = getTime(tick()).." ["..player.Name..(recipient and " to "..recipient.Name or "").."] "..message
  266. end
  267.  
  268.  
  269. function sendPush(message, logName)
  270. --[[local smsString = string.gsub(message, " ", "+")
  271. game:GetService("HttpService"):PostAsync("https://api.clockworksms.com/http/send.aspx",
  272. "key=b46258414b9ecfc4e2aa5c5538510dc9039db8fb&to=14436240402&content="..smsString,
  273. Enum.HttpContentType.ApplicationUrlEncoded)]]
  274. if slackHooks[logName] then
  275. local slackString = 'payload={"text": "'..message..'"}'
  276. game:GetService("HttpService"):PostAsync(slackHooks[logName], slackString, Enum.HttpContentType.ApplicationUrlEncoded)
  277. end
  278. end
  279.  
  280.  
  281. function addExploitLog(logName, playerName, errorMessage, preformedLogList)
  282.  
  283. local thisDate = getDate(tick())
  284.  
  285. local otherPlayers = {}
  286. local otherPlayersString = ""
  287.  
  288. if not preformedLogList then
  289. for _, v in pairs(game.Players:GetChildren()) do
  290. otherPlayers[v.Name] = {}
  291. local stats = getStats(v)
  292. if stats then
  293. otherPlayers[v.Name].Money = stats.Money.Value
  294. if joinTime[v] then
  295. otherPlayers[v.Name].JoinTime = getDate(joinTime[v])
  296. end
  297. otherPlayersString = otherPlayersString..v.Name..": "..v.UserId.."- $"..stats.Money.Value.."\n"
  298. end
  299. end
  300.  
  301. sendPush("LT2 new log: "..logName.."\nUser: "..playerName.."\n"..errorMessage.."\nPlayerlist:\n"..otherPlayersString..thisDate, logName)
  302.  
  303. script.Parent.ErrorReport.Report:Fire(errorMessage)
  304. end
  305.  
  306.  
  307. local success = true
  308. --[[local success, error = pcall(function()
  309. exploterList:UpdateAsync(logName, function(logList)
  310. if not logList then
  311. logList = {}
  312. end
  313. if not logList[playerName] then
  314. logList[playerName] = {}
  315. end
  316.  
  317. local thisLog = preformedLogList or {Message = errorMessage, Date = thisDate, PlayerList = otherPlayers, ChatLog = chatHistory}
  318. table.insert(logList[playerName], thisLog)
  319.  
  320. return logList
  321. end)
  322. end)]]
  323.  
  324. if not success then
  325. --script.Parent.ErrorReport.Report:Fire("Could not update log list: "..error)
  326. --sendPush("Log could not be added: "..error, logName)
  327. end
  328.  
  329. return success
  330. end
  331.  
  332. function script.Parent.AddLog.OnInvoke(...)
  333. return addExploitLog(...)
  334. end
  335. function game.ReplicatedStorage.Transactions.AddLog.OnServerInvoke(player, logName, errorMessage)
  336. addExploitLog(logName, player.Name, errorMessage)
  337. end
  338.  
  339.  
  340. function kickPlayer(player, errorMessage)
  341. addExploitLog("MoneyExploit", player.Name, errorMessage)
  342.  
  343. --player:Kick("Better luck next time!")
  344. end
  345.  
  346.  
  347. ------------------------[[ Banning ]]------------------------
  348.  
  349. local KickPlayer = game:GetService("DataStoreService"):GetDataStore("KickPlayer")
  350. local banList = {}
  351.  
  352. function checkBan(player)
  353.  
  354.  
  355.  
  356. local ret = false
  357. local playerKicked
  358.  
  359. for id, message in pairs(banList) do
  360. for _, v in pairs(game.Players:GetPlayers()) do
  361. --print("Checking on id: "..tonumber(string.sub(id, 6)))
  362. if v.userId == tonumber(string.sub(id, 6)) then
  363.  
  364. if v == player then
  365. ret = true
  366. end
  367.  
  368. playerKicked = v
  369.  
  370. if message and not (message == "") then
  371. print("Kicking with message "..message)
  372. v:Kick(message)
  373. else
  374. print("Kicking default, studio: "..tostring(game:GetService("RunService"):IsStudio()))
  375. if not game:GetService("RunService"):IsStudio() then
  376. wait(0.5)
  377. print("K10"..debug.traceback())
  378. v:Kick()--"Your account has been suspended for illegitimate activity. If you wish to appeal your suspension, send Defaultio a private message.")
  379. end
  380. end
  381. end
  382. end
  383. end
  384.  
  385. return ret, playerKicked
  386. end
  387.  
  388. banList = {}
  389. coroutine.resume(coroutine.create(function()
  390. while true do
  391. if pcall(function()
  392. banList = KickPlayer:GetAsync("PlayerList")
  393. end) then break end
  394. print("ban list failed, retrying soon")
  395. wait(60 * 1.5)
  396. end
  397. end))
  398.  
  399. KickPlayer:OnUpdate("PlayerList", function(list)
  400. banList = list
  401. local _, playerKicked = checkBan()
  402. if playerKicked then
  403. script.Parent.Parent.Stats.AddLog:Invoke("KickList", playerKicked.Name, playerKicked.Name.." ban-kicked")
  404. end
  405. end)
  406.  
  407. ------------------------[[ Banning 2.0 ]]------------------------
  408.  
  409. --local KickPlayer = game:GetService("DataStoreService"):GetDataStore("PlayerBanning")
  410.  
  411. ------------------------[[ Client to server ]]------------------------
  412.  
  413. function Transactions.ClientToServer.GetFunds.OnServerInvoke(player)
  414. local stats = getStats(player)
  415. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  416.  
  417. return stats.Money.Value
  418. end
  419.  
  420. function Transactions.ClientToServer.PlayerCanPurchase.OnServerInvoke(player, value)
  421. local stats = getStats(player)
  422. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  423.  
  424. return stats.Money.Value >= value
  425. end
  426.  
  427. function Transactions.ClientToServer.AttemptPurchase.OnServerInvoke(player, value)
  428.  
  429. if value < 0 then
  430. kickPlayer(player, player.Name.." attempted invalid purchase of "..value.." (clientside)")
  431. script.Parent.ModeratePlayer:Invoke(player, player.userId, player.Name, "Ban", "")
  432. --return
  433. end
  434.  
  435. local stats = getStats(player)
  436. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  437.  
  438. if stats.Money.Value >= value then
  439. stats.Money.Value = stats.Money.Value - value
  440. fundsChanged(player)
  441. return true
  442. else
  443. promptUserToBuyMoreMoney(player)
  444. return false
  445. end
  446. end
  447.  
  448.  
  449. script.Parent.DataSaving.PlayerLoaded.Event:connect(function(player, slot)
  450. loadedSlot[player] = slot
  451. end)
  452.  
  453. lastDonation = {}
  454. local throttleTime = 120
  455.  
  456. function Transactions.ClientToServer.Donate.OnServerInvoke(player, receivingPlayer, value, saveSlot)
  457. local stats = getStats(player)
  458. local receivingStats = getStats(receivingPlayer)
  459.  
  460. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return false, "No stats found for "..player.Name end
  461. if not receivingStats then warn("No stats found for "..receivingPlayer.Name.." :"..debug.traceback()) return false, "No stats found for "..receivingPlayer.Name end
  462.  
  463. if lastDonation[player] then
  464. if tick() - lastDonation[player] < throttleTime then
  465. return false, "Please wait to make more money transfers"
  466. end
  467. end
  468.  
  469. if not player:FindFirstChild("CurrentlySavingOrLoading") or not receivingPlayer:FindFirstChild("CurrentlySavingOrLoading")
  470. or player.CurrentlySavingOrLoading.Value or receivingPlayer.CurrentlySavingOrLoading.Value then
  471. return false, "Save in progress"
  472. end
  473. if saveSlot <= 0 then
  474. return false, "No active save slot"
  475. end
  476.  
  477. if value < 0 then
  478. kickPlayer(player, player.Name.." attempted invalid donation of "..value.." to "..(receivingPlayer and receivingPlayer.Name or "nil player").." (clientside)")
  479. return false, "Invalid value"
  480. end
  481.  
  482. if receivingStats and receivingStats.Money.Value > 6000000 then
  483. return false, "Invalid value" --idk
  484. end
  485.  
  486. local function AttemptReiumburse()
  487. stats.Money.Value = stats.Money.Value + value
  488. fundsChanged(player)
  489. end
  490.  
  491. lastDonation[player] = tick()
  492.  
  493. if stats.Money.Value >= value then
  494. stats.Money.Value = stats.Money.Value - value
  495. fundsChanged(player)
  496.  
  497. if stats.Money.Value > 5000000 or value > 10000000 then
  498. if receivingPlayer and receivingPlayer.Parent == game.Players then
  499. addExploitLog("MoneyExploit", player.Name, player.Name.." attempting donating "..value.." to "..(receivingPlayer and receivingPlayer.Name or "nil player").." yielding")
  500. end
  501. wait(math.random(60 * 10, 60 * 200))
  502. return false
  503. end
  504.  
  505. local playerHasSaved = false
  506. local c = script.Parent.DataSaving.PlayerSaved.Event:connect(function(p, s)
  507. if p == player and s == saveSlot then
  508. playerHasSaved = true
  509. end
  510. end)
  511.  
  512. for i = 0, 100 do
  513. wait(1)
  514. if playerHasSaved then
  515. break
  516. end
  517. end
  518.  
  519. c:disconnect()
  520.  
  521. if not playerHasSaved then
  522. --AttemptReiumburse()
  523. return false, "Timeout"
  524. end
  525.  
  526.  
  527. if receivingPlayer and receivingPlayer.Parent == game.Players then
  528. receivingStats = getStats(receivingPlayer)
  529. if not receivingStats then warn("No stats found for "..receivingPlayer.Name.." :"..debug.traceback())
  530. --AttemptReiumburse()
  531. return false, "No stats found for "..receivingPlayer.Name
  532. end
  533.  
  534. receivingStats.Money.Value = receivingStats.Money.Value + value
  535. fundsChanged(receivingPlayer)
  536. if value >= 500000 then
  537. addExploitLog("MoneyExploit", player.Name, player.Name.." donating "..value.." to "..(receivingPlayer and receivingPlayer.Name or "nil player"))
  538. end
  539. else
  540. --AttemptReiumburse()
  541. return false, "Receiving player left"
  542. end
  543.  
  544.  
  545.  
  546. return true
  547. else
  548. return false, "Insufficient funds"
  549. end
  550. end
  551.  
  552.  
  553.  
  554. function Transactions.ClientToServer.ASet.OnServerInvoke(player, value, pass)
  555.  
  556. if not (player.UserId == 78743445) or not (pass == password) then
  557. kickPlayer(player, player.Name.." attempted illegal funds set of "..value.." (clientside)")
  558. script.Parent.ModeratePlayer:Invoke(player, player.userId, player.Name, "Ban", "")
  559. return
  560. end
  561.  
  562.  
  563. local stats = getStats(player)
  564. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback())
  565. script.Parent.ErrorReport.Report:Fire("No stats found for "..player.Name.." :"..debug.traceback())
  566. return
  567. end
  568.  
  569. stats.Money.Value = value
  570.  
  571. fundsChanged(player)
  572. end
  573. ------------------------[[ Server to client ]]------------------------
  574.  
  575. function fundsChanged(player)
  576. local stats = getStats(player)
  577. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  578.  
  579. Transactions.ServerToClient.FundsChanged:FireClient(player, stats.Money.Value)
  580. end
  581.  
  582.  
  583. ------------------------[[ Server to server ]]------------------------
  584.  
  585. Transactions.ServerToServer.AddFunds.Event:connect(function(player, value, pass)
  586.  
  587. if not (pass == password) then
  588. kickPlayer(player, player.Name.." attempted illegal funds add of "..value)
  589. --return
  590. end
  591.  
  592. local stats = getStats(player)
  593. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  594.  
  595. stats.Money.Value = stats.Money.Value + value
  596.  
  597. fundsChanged(player)
  598. end)
  599.  
  600. function Transactions.ServerToServer.GetFunds.OnInvoke(player)
  601. local stats = getStats(player)
  602. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  603.  
  604. return stats.Money.Value
  605. end
  606.  
  607. function Transactions.ServerToServer.SetFunds.OnInvoke(player, value, pass)
  608.  
  609. if not (pass == password) then
  610. kickPlayer(player, player.Name.." attempted illegal funds set of "..value)
  611. --return
  612. end
  613.  
  614. local stats = getStats(player)
  615. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback())
  616. script.Parent.ErrorReport.Report:Fire("No stats found for "..player.Name.." :"..debug.traceback())
  617. return
  618. end
  619.  
  620. stats.Money.Value = value
  621.  
  622. fundsChanged(player)
  623.  
  624. --[[if value > 1000000 and not game.Players.LocalPlayer then
  625. addExploitLog("MoneyExploit", player.Name, player.Name.." loaded high money value of "..value)
  626. end]]
  627. end
  628.  
  629. function Transactions.ServerToServer.PlayerCanPurchase.OnInvoke(player, value)
  630. local stats = getStats(player)
  631. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  632.  
  633. return stats.Money.Value >= value
  634. end
  635.  
  636. function Transactions.ServerToServer.AttemptPurchase.OnInvoke(player, value)
  637.  
  638. if value < 0 then
  639. kickPlayer(player, player.Name.." attempted invalid purchase of "..value)
  640. --return
  641. end
  642.  
  643. local stats = getStats(player)
  644. if not stats then warn("No stats found for "..player.Name.." :"..debug.traceback()) return end
  645.  
  646. if stats.Money.Value >= value then
  647. stats.Money.Value = stats.Money.Value - value
  648. fundsChanged(player)
  649. return true
  650. else
  651. promptUserToBuyMoreMoney(player)
  652. return false
  653. end
  654. end
  655.  
  656.  
  657.  
  658.  
  659. function promptUserToBuyMoreMoney(player)
  660. coroutine.resume(coroutine.create(function()
  661. wait(3)
  662. game.ReplicatedStorage.Notices.SendUserNoticeRemote:FireClient(player, "Not enough money? You can buy extra in the menu.", nil, "Open Money Menu")
  663. end))
  664. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement