cluaupp 1.4.1 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +10 -5
  3. package/api/CHANGELOG.md +3 -0
  4. package/api/chat.js +74 -0
  5. package/api/fixtures/roblox/README.md +6 -0
  6. package/api/fixtures/roblox/aux/sample.d.luau +6 -0
  7. package/api/fixtures/roblox/mini/Mini-API-Dump.json +72 -0
  8. package/api/generated/bench-latest.json +39 -0
  9. package/api/generated/capability-profile.json +76 -0
  10. package/api/generated/lsp-index.json +1 -0
  11. package/api/generated/luau/classes.d.luau +11221 -0
  12. package/api/generated/luau/datatypes.d.luau +327 -0
  13. package/api/generated/luau/enums.d.luau +4918 -0
  14. package/api/generated/luau/globals.d.luau +12 -0
  15. package/api/manifests/roblox-target.manifest.json +22 -0
  16. package/api/normalized/roblox-target.profile.json +237461 -0
  17. package/api/overrides/classes.json +8 -0
  18. package/api/overrides/compatibility.json +9 -0
  19. package/api/overrides/datatypes.json +1579 -0
  20. package/api/overrides/enums.json +8 -0
  21. package/api/overrides/globals.json +8 -0
  22. package/api/overrides/type-mappings.json +9 -0
  23. package/api/roblox-api.lock.json +9 -0
  24. package/data/Mini-API-Dump.json +1 -0
  25. package/editors/vscode/README.md +19 -0
  26. package/editors/vscode/extension.js +222 -21
  27. package/editors/vscode/icons/axiom.svg +4 -0
  28. package/editors/vscode/icons/bloom.svg +5 -0
  29. package/editors/vscode/icons/flare.svg +5 -0
  30. package/editors/vscode/icons/helm.svg +4 -0
  31. package/editors/vscode/icons/hive.svg +5 -0
  32. package/editors/vscode/icons/mint.svg +4 -0
  33. package/editors/vscode/icons/shift.svg +6 -0
  34. package/editors/vscode/language-configuration-schema.json +24 -0
  35. package/editors/vscode/language-configuration.json +21 -0
  36. package/editors/vscode/package.json +220 -6
  37. package/editors/vscode/snippets/axiom.json +12 -0
  38. package/editors/vscode/snippets/bloom.json +12 -0
  39. package/editors/vscode/snippets/flare.json +27 -0
  40. package/editors/vscode/snippets/helm.json +12 -0
  41. package/editors/vscode/snippets/hive.json +12 -0
  42. package/editors/vscode/snippets/mint.json +12 -0
  43. package/editors/vscode/snippets/shift.json +17 -0
  44. package/editors/vscode/syntaxes/axiom.tmLanguage.json +5 -0
  45. package/editors/vscode/syntaxes/bloom.tmLanguage.json +5 -0
  46. package/editors/vscode/syntaxes/flare.tmLanguage.json +75 -0
  47. package/editors/vscode/syntaxes/helm.tmLanguage.json +5 -0
  48. package/editors/vscode/syntaxes/hive.tmLanguage.json +5 -0
  49. package/editors/vscode/syntaxes/mint.tmLanguage.json +5 -0
  50. package/editors/vscode/syntaxes/schema.tmLanguage.json +89 -0
  51. package/editors/vscode/syntaxes/shift.tmLanguage.json +5 -0
  52. package/examples/game/.cluaupp/compile-cache/ReplicatedStorage__Shared__Constants__Datas__TemplateData.clh.json +1 -0
  53. package/examples/game/.cluaupp/compile-cache/ServerScriptService__Boot__DataBoot.server.clpp.json +1 -0
  54. package/examples/game/.cluaupp/compile-cache/ServerScriptService__Configuration__ServerConfig.clp.json +1 -0
  55. package/examples/game/.cluaupp/compile-cache/ServerScriptService__Handlers__Guard.server.clpp.json +1 -0
  56. package/examples/game/.cluaupp/compile-cache/ServerScriptService__Handlers__PlayerHandler.server.clpp.json +1 -0
  57. package/examples/game/.cluaupp/compile-cache/StarterPlayer__StarterCharacterScripts__Character__CharacterReady.client.clpp.json +1 -0
  58. package/examples/game/.cluaupp/compile-cache/StarterPlayer__StarterPlayerScripts__Controllers__DataController.client.clpp.json +1 -0
  59. package/examples/game/.cluaupp/compile-cache/index.json +12 -0
  60. package/examples/game/.cluaupp/datamodel-profile.json +94 -0
  61. package/examples/game/.vscode/extensions.json +3 -1
  62. package/examples/game/.vscode/settings.json +13 -1
  63. package/examples/game/include/clpp/datatypes.clh +337 -373
  64. package/examples/game/include/clpp/generated/datamodel.clh +25 -0
  65. package/examples/game/include/clpp/generated/enums.clh +1 -1
  66. package/examples/game/include/clpp/generated/instances.clh +41135 -41064
  67. package/examples/game/include/clpp/libs/axiom.clh +1 -1
  68. package/examples/game/include/clpp/libs/math.clh +14 -0
  69. package/examples/game/include/clpp/libs/roster.clh +6 -0
  70. package/examples/game/include/clpp/libs/spring.clh +17 -0
  71. package/examples/game/include/clpp/libs/ward.clh +1 -0
  72. package/examples/game/include/clpp/roblox.clh +3 -4
  73. package/examples/game/libs/ArrayIndexer/init.luau +209 -0
  74. package/examples/game/libs/Axiom/init.luau +608 -0
  75. package/examples/game/libs/Bloom/init.luau +433 -0
  76. package/examples/game/libs/Coil/init.luau +215 -0
  77. package/examples/game/libs/Crest/init.luau +426 -0
  78. package/examples/game/libs/Echo/init.luau +417 -0
  79. package/examples/game/libs/Ember/init.luau +365 -0
  80. package/examples/game/libs/Flare/init.luau +717 -0
  81. package/examples/game/libs/Gleam/init.luau +729 -0
  82. package/examples/game/libs/Guide/init.luau +215 -0
  83. package/examples/game/libs/Helm/init.luau +377 -0
  84. package/examples/game/libs/Hive/init.luau +241 -0
  85. package/examples/game/libs/Keep/Client.luau +114 -0
  86. package/examples/game/libs/Keep/Data.luau +883 -0
  87. package/examples/game/libs/Keep/Engine.luau +211 -0
  88. package/examples/game/libs/Keep/Enum.luau +6 -0
  89. package/examples/game/libs/Keep/Enums.luau +10 -0
  90. package/examples/game/libs/Keep/Path.luau +236 -0
  91. package/examples/game/libs/Keep/Replicator.luau +298 -0
  92. package/examples/game/libs/Keep/Server.luau +251 -0
  93. package/examples/game/libs/Keep/Store.luau +652 -0
  94. package/examples/game/libs/Keep/Trade.luau +455 -0
  95. package/examples/game/libs/Keep/init.luau +205 -0
  96. package/examples/game/libs/Lens/init.luau +609 -0
  97. package/examples/game/libs/Mint/init.luau +279 -0
  98. package/examples/game/libs/Net/init.luau +156 -0
  99. package/examples/game/libs/Net/src/codec.luau +224 -0
  100. package/examples/game/libs/Occlude/init.luau +117 -0
  101. package/examples/game/libs/Pin/init.luau +309 -0
  102. package/examples/game/libs/Promise/LICENSE +21 -0
  103. package/examples/game/libs/Promise/_impl/LICENSE +21 -0
  104. package/examples/game/libs/Promise/_impl/init.lua +1991 -0
  105. package/examples/game/libs/Promise/init.lua +1990 -0
  106. package/examples/game/libs/Promise/init.luau +13 -0
  107. package/examples/game/libs/Promise/types.luau +46 -0
  108. package/examples/game/libs/Roster/init.luau +686 -0
  109. package/examples/game/libs/SOURCES.md +31 -0
  110. package/examples/game/libs/Shift/init.luau +238 -0
  111. package/examples/game/libs/Spark/init.luau +487 -0
  112. package/examples/game/libs/Stage/init.luau +178 -0
  113. package/examples/game/libs/Sweep/init.luau +259 -0
  114. package/examples/game/libs/Trace/init.luau +213 -0
  115. package/examples/game/libs/Ward/init.luau +211 -0
  116. package/examples/game/out/ReplicatedStorage/Shared/Constants/Datas/TemplateData.luau +29 -0
  117. package/examples/game/out/ReplicatedStorage/Shared/Constants/Datas/TemplateData.luau.map.json +13 -0
  118. package/examples/game/out/ReplicatedStorage/Shared/Net/Net.luau +83 -0
  119. package/examples/game/out/ReplicatedStorage/Shared/Net/Net.luau.map.json +13 -0
  120. package/examples/game/out/ServerScriptService/Boot/DataBoot.server.luau +18 -0
  121. package/examples/game/out/ServerScriptService/Boot/DataBoot.server.luau.map.json +13 -0
  122. package/examples/game/out/ServerScriptService/Configuration/ServerConfig.luau +14 -0
  123. package/examples/game/out/ServerScriptService/Configuration/ServerConfig.luau.map.json +13 -0
  124. package/examples/game/out/ServerScriptService/Handlers/Guard.server.luau +15 -0
  125. package/examples/game/out/ServerScriptService/Handlers/Guard.server.luau.map.json +13 -0
  126. package/examples/game/out/ServerScriptService/Handlers/PlayerHandler.server.luau +50 -0
  127. package/examples/game/out/ServerScriptService/Handlers/PlayerHandler.server.luau.map.json +13 -0
  128. package/examples/game/out/StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.luau +12 -0
  129. package/examples/game/out/StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.luau.map.json +13 -0
  130. package/examples/game/out/StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.luau +16 -0
  131. package/examples/game/out/StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.luau.map.json +13 -0
  132. package/examples/game/src/ReplicatedStorage/Shared/Net/Net.clh +26 -0
  133. package/examples/game/src/ReplicatedStorage/Shared/Net/Net.flare +5 -0
  134. package/examples/game/src/ServerScriptService/Boot/DataBoot.server.clpp +2 -2
  135. package/examples/game/src/ServerScriptService/Handlers/PlayerHandler.server.clpp +1 -1
  136. package/examples/game/stylua.toml +9 -0
  137. package/generated/api/build-profile.js +115 -0
  138. package/generated/api/cache.js +44 -0
  139. package/generated/api/coverage.js +32 -0
  140. package/generated/api/diff.js +125 -0
  141. package/generated/api/generators/clpp-headers.js +353 -0
  142. package/generated/api/generators/docs-reference.js +7 -0
  143. package/generated/api/generators/lsp-index.js +81 -0
  144. package/generated/api/generators/luau-defs.js +94 -0
  145. package/generated/api/ide.js +76 -0
  146. package/generated/api/identifier.js +47 -0
  147. package/generated/api/index.js +324 -0
  148. package/generated/api/loader.js +57 -0
  149. package/generated/api/merge.js +88 -0
  150. package/generated/api/model.js +5 -0
  151. package/generated/api/normalize.js +231 -0
  152. package/generated/api/overrides-validate.js +58 -0
  153. package/generated/api/perf.js +12 -0
  154. package/generated/api/registry.js +136 -0
  155. package/generated/api/release.js +44 -0
  156. package/generated/api/resolver.js +250 -0
  157. package/generated/api/sources/aux-types-diff.js +75 -0
  158. package/generated/api/sources/client-tracker.js +11 -0
  159. package/generated/api/sources/creator-docs.js +42 -0
  160. package/generated/api/sources/luau-types.js +34 -0
  161. package/generated/api/sources/mini-dump.js +17 -0
  162. package/generated/api/sources/studio-api.js +8 -0
  163. package/generated/api/sources/studio-apiv2.js +11 -0
  164. package/generated/api/sources/studio-full-api.js +8 -0
  165. package/generated/api/studio-smoke.js +80 -0
  166. package/generated/api/type-parse.js +49 -0
  167. package/generated/api/understander.js +51 -0
  168. package/generated/api/validate.js +135 -0
  169. package/generated/api-cli.js +421 -0
  170. package/generated/cli.js +17 -6
  171. package/generated/clpp/contract.js +3 -3
  172. package/generated/clpp/format-luau.js +236 -0
  173. package/generated/clpp/index.js +13 -1
  174. package/generated/clpp/modules.js +227 -0
  175. package/generated/clpp/postprocess.js +86 -5
  176. package/generated/clpp/rewrite-janitor.js +145 -0
  177. package/generated/clpp/runner.js +14 -2
  178. package/generated/compile.js +82 -0
  179. package/generated/flare/index.js +15 -3
  180. package/generated/flare/language.js +561 -0
  181. package/generated/flare/parse.js +19 -7
  182. package/generated/intellisense.js +76 -2
  183. package/generated/lsp.js +118 -7
  184. package/generated/native/index.js +217 -16
  185. package/generated/target/authority-check.js +136 -0
  186. package/generated/target/authority-graph.js +74 -0
  187. package/generated/target/build-cache.js +112 -0
  188. package/generated/target/capabilities.js +89 -0
  189. package/generated/target/capability-profile.js +30 -0
  190. package/generated/target/component-contracts.js +60 -0
  191. package/generated/target/context-check.js +160 -0
  192. package/generated/target/datamodel-check.js +170 -0
  193. package/generated/target/datamodel-generate.js +74 -0
  194. package/generated/target/datamodel.js +233 -0
  195. package/generated/target/diagnostics.js +63 -0
  196. package/generated/target/doctor.js +152 -0
  197. package/generated/target/flare-version.js +58 -0
  198. package/generated/target/get-service.js +69 -0
  199. package/generated/target/lifetime-check.js +47 -0
  200. package/generated/target/luau-stamp.js +39 -0
  201. package/generated/target/optimizer-advise.js +88 -0
  202. package/generated/target/optimizer-apply.js +44 -0
  203. package/generated/target/optimizer-soa.js +254 -0
  204. package/generated/target/parallel-check.js +136 -0
  205. package/generated/target/pgo.js +148 -0
  206. package/generated/target/project-docs.js +69 -0
  207. package/generated/target/project-graph.js +71 -0
  208. package/generated/target/roblox.js +63 -0
  209. package/generated/target/security-check.js +41 -0
  210. package/generated/target/source-map.js +25 -0
  211. package/generated/target/studio-bridge.js +112 -0
  212. package/generated/utils/project.js +178 -8
  213. package/generated/utils/rojo-mapper.js +11 -3
  214. package/include/clpp/datatypes.clh +337 -373
  215. package/include/clpp/generated/enums.clh +1 -1
  216. package/include/clpp/generated/instances.clh +41135 -41064
  217. package/include/clpp/libs/axiom.clh +1 -1
  218. package/include/clpp/libs/hive.clh +1 -0
  219. package/include/clpp/libs/keep.clh +2 -0
  220. package/include/clpp/libs/math.clh +14 -0
  221. package/include/clpp/libs/roster.clh +6 -0
  222. package/include/clpp/libs/spring.clh +17 -0
  223. package/include/clpp/libs/ward.clh +1 -0
  224. package/include/clpp/roblox.clh +3 -4
  225. package/package.json +10 -3
  226. package/plugins/CluauppNav/Plugin.luau +207 -0
  227. package/plugins/CluauppNav/ProfileLogger.luau +27 -0
  228. package/plugins/CluauppNav/README.md +24 -0
  229. package/runtime/Axiom/init.luau +10 -7
  230. package/runtime/Coil/init.luau +8 -2
  231. package/runtime/Crest/init.luau +1 -0
  232. package/runtime/Flare/init.luau +2 -1
  233. package/runtime/Gleam/init.luau +15 -4
  234. package/runtime/Hive/init.luau +36 -14
  235. package/runtime/Pin/init.luau +5 -2
  236. package/runtime/Roster/init.luau +8 -0
  237. package/runtime/Spark/init.luau +3 -0
  238. package/runtime/Sweep/init.luau +2 -0
  239. package/runtime/Trace/init.luau +3 -0
  240. package/runtime/Ward/init.luau +38 -5
  241. package/scripts/postinstall-editor.js +17 -0
  242. package/skills/README.md +13 -0
  243. package/skills/clpp-hive-flare/SKILL.md +79 -0
  244. package/skills/clpp-language/SKILL.md +123 -0
  245. package/skills/clpp-language/compiler.md +89 -0
  246. package/skills/clpp-style/SKILL.md +95 -0
  247. package/src/api/build-profile.ts +138 -0
  248. package/src/api/cache.ts +45 -0
  249. package/src/api/coverage.ts +46 -0
  250. package/src/api/diff.ts +143 -0
  251. package/src/api/generators/clpp-headers.ts +377 -0
  252. package/src/api/generators/docs-reference.ts +11 -0
  253. package/src/api/generators/lsp-index.ts +106 -0
  254. package/src/api/generators/luau-defs.ts +98 -0
  255. package/src/api/ide.ts +87 -0
  256. package/src/api/identifier.ts +47 -0
  257. package/src/api/index.ts +269 -0
  258. package/src/api/loader.ts +60 -0
  259. package/src/api/merge.ts +126 -0
  260. package/src/api/model.ts +283 -0
  261. package/src/api/normalize.ts +257 -0
  262. package/src/api/overrides-validate.ts +58 -0
  263. package/src/api/perf.ts +15 -0
  264. package/src/api/registry.ts +162 -0
  265. package/src/api/release.ts +47 -0
  266. package/src/api/resolver.ts +255 -0
  267. package/src/api/sources/aux-types-diff.ts +81 -0
  268. package/src/api/sources/client-tracker.ts +10 -0
  269. package/src/api/sources/creator-docs.ts +37 -0
  270. package/src/api/sources/luau-types.ts +30 -0
  271. package/src/api/sources/mini-dump.ts +50 -0
  272. package/src/api/sources/studio-api.ts +7 -0
  273. package/src/api/sources/studio-apiv2.ts +10 -0
  274. package/src/api/sources/studio-full-api.ts +7 -0
  275. package/src/api/studio-smoke.ts +82 -0
  276. package/src/api/type-parse.ts +48 -0
  277. package/src/api/understander.ts +72 -0
  278. package/src/api/validate.ts +160 -0
  279. package/src/api-cli.ts +493 -0
  280. package/src/api.generated.js +37 -22
  281. package/src/cli.ts +22 -7
  282. package/src/clpp/contract.ts +34 -3
  283. package/src/clpp/format-luau.ts +262 -0
  284. package/src/clpp/index.ts +13 -2
  285. package/src/clpp/modules.ts +252 -0
  286. package/src/clpp/postprocess.ts +100 -5
  287. package/src/clpp/rewrite-janitor.ts +156 -0
  288. package/src/clpp/runner.ts +14 -2
  289. package/src/compile.ts +87 -0
  290. package/src/flare/index.ts +20 -1
  291. package/src/flare/language.ts +708 -0
  292. package/src/flare/parse.ts +20 -7
  293. package/src/flare/types.ts +2 -0
  294. package/src/intellisense.ts +76 -2
  295. package/src/lsp.ts +151 -8
  296. package/src/native/index.ts +225 -16
  297. package/src/target/authority-check.ts +162 -0
  298. package/src/target/authority-graph.ts +80 -0
  299. package/src/target/build-cache.ts +129 -0
  300. package/src/target/capabilities.ts +115 -0
  301. package/src/target/capability-profile.ts +25 -0
  302. package/src/target/component-contracts.ts +64 -0
  303. package/src/target/context-check.ts +177 -0
  304. package/src/target/datamodel-check.ts +188 -0
  305. package/src/target/datamodel-generate.ts +78 -0
  306. package/src/target/datamodel.ts +261 -0
  307. package/src/target/diagnostics.ts +67 -0
  308. package/src/target/doctor.ts +171 -0
  309. package/src/target/flare-version.ts +61 -0
  310. package/src/target/get-service.ts +85 -0
  311. package/src/target/lifetime-check.ts +45 -0
  312. package/src/target/luau-stamp.ts +33 -0
  313. package/src/target/optimizer-advise.ts +93 -0
  314. package/src/target/optimizer-apply.ts +63 -0
  315. package/src/target/optimizer-soa.ts +270 -0
  316. package/src/target/parallel-check.ts +135 -0
  317. package/src/target/pgo.ts +157 -0
  318. package/src/target/project-docs.ts +68 -0
  319. package/src/target/project-graph.ts +75 -0
  320. package/src/target/roblox.ts +78 -0
  321. package/src/target/security-check.ts +40 -0
  322. package/src/target/source-map.ts +36 -0
  323. package/src/target/studio-bridge.ts +140 -0
  324. package/src/types.ts +14 -0
  325. package/src/utils/project.ts +183 -9
  326. package/src/utils/rojo-mapper.ts +12 -3
  327. package/stylua.toml +9 -0
  328. package/templates/game/.vscode/extensions.json +3 -1
  329. package/templates/game/.vscode/settings.json +8 -1
  330. package/templates/game/include/clpp/datatypes.clh +337 -373
  331. package/templates/game/include/clpp/generated/enums.clh +1 -1
  332. package/templates/game/include/clpp/generated/instances.clh +41135 -41064
  333. package/templates/game/include/clpp/libs/axiom.clh +1 -1
  334. package/templates/game/include/clpp/libs/roster.clh +6 -0
  335. package/templates/game/include/clpp/libs/ward.clh +1 -0
  336. package/templates/game/include/clpp/roblox.clh +3 -4
  337. package/templates/game/src/ReplicatedStorage/Shared/Net/Net.flare +5 -0
  338. package/templates/game/src/ServerScriptService/Boot/DataBoot.server.clpp +2 -2
  339. package/templates/game/src/ServerScriptService/Handlers/PlayerHandler.server.clpp +1 -1
  340. package/templates/game/stylua.toml +9 -0
@@ -0,0 +1,211 @@
1
+ --!native
2
+ --!optimize 2
3
+ --!strict
4
+ -- Ward — server anti-cheat primitives. Rate-limit remotes, cap packet size,
5
+ -- strike on speed/teleport. Does not write Keep; Keep stays server-only.
6
+ -- cluaupp: spawn grace / ignore falls / no Studio kick unless KickInStudio
7
+
8
+ local Players = game:GetService("Players")
9
+ local RunService = game:GetService("RunService")
10
+
11
+ local Spark = require(script.Parent.Spark)
12
+
13
+ local DEFAULT_KICK = 8
14
+ local DEFAULT_RATE = 40
15
+ local DEFAULT_BURST = 80
16
+ local MAX_PACKET = 24 * 1024
17
+ local MAX_SPEED = 220
18
+ local MAX_TELEPORT = 80
19
+ local SPAWN_GRACE = 3
20
+ local MIN_DT = 1 / 30
21
+ local FLOOD_AT = 80
22
+
23
+ local Ward = {}
24
+ Ward.OnStrike = Spark.new()
25
+ Ward.KickAt = DEFAULT_KICK
26
+ Ward.KickInStudio = false
27
+ Ward.FloodAt = FLOOD_AT
28
+ Ward.MaxPacketBytes = MAX_PACKET
29
+ Ward.MaxSpeed = MAX_SPEED
30
+ Ward.MaxTeleport = MAX_TELEPORT
31
+
32
+ type Bucket = {
33
+ tokens: number,
34
+ last: number,
35
+ maxPerSec: number,
36
+ burst: number,
37
+ }
38
+
39
+ type Record = {
40
+ strikes: number,
41
+ buckets: { [string]: Bucket },
42
+ lastPos: Vector3?,
43
+ graceUntil: number,
44
+ reasons: { [string]: number },
45
+ denied: { [string]: number },
46
+ }
47
+
48
+ local records: { [Player]: Record } = {}
49
+ local watching = false
50
+
51
+ local function rec(player: Player): Record
52
+ local row = records[player]
53
+ if not row then
54
+ row = {
55
+ strikes = 0,
56
+ buckets = {},
57
+ lastPos = nil,
58
+ graceUntil = 0,
59
+ reasons = {},
60
+ denied = {},
61
+ }
62
+ records[player] = row
63
+ end
64
+ return row
65
+ end
66
+
67
+ function Ward.Allow(player: Player, channel: string, maxPerSec: number?, burst: number?): boolean
68
+ if not RunService:IsServer() then
69
+ return true
70
+ end
71
+ if typeof(player) ~= "Instance" or not player:IsA("Player") or player.Parent == nil then
72
+ return false
73
+ end
74
+ if typeof(channel) ~= "string" or channel == "" then
75
+ return false
76
+ end
77
+ local rate = maxPerSec or DEFAULT_RATE
78
+ local cap = burst or math.max(rate * 2, DEFAULT_BURST)
79
+ local now = os.clock()
80
+ local row = rec(player)
81
+ local bucket = row.buckets[channel]
82
+ if not bucket then
83
+ bucket = {
84
+ tokens = cap,
85
+ last = now,
86
+ maxPerSec = rate,
87
+ burst = cap,
88
+ }
89
+ row.buckets[channel] = bucket
90
+ end
91
+ local elapsed = math.max(now - bucket.last, 0)
92
+ bucket.last = now
93
+ bucket.tokens = math.min(bucket.burst, bucket.tokens + elapsed * bucket.maxPerSec)
94
+ if bucket.tokens < 1 then
95
+ local denied = (row.denied[channel] or 0) + 1
96
+ row.denied[channel] = denied
97
+ if denied >= Ward.FloodAt then
98
+ row.denied[channel] = 0
99
+ Ward.Strike(player, "rate:" .. channel)
100
+ end
101
+ return false
102
+ end
103
+ row.denied[channel] = 0
104
+ bucket.tokens -= 1
105
+ return true
106
+ end
107
+
108
+ function Ward.Packet(player: Player, bytes: number, maxBytes: number?): boolean
109
+ if not RunService:IsServer() then
110
+ return true
111
+ end
112
+ local cap = maxBytes or Ward.MaxPacketBytes
113
+ if typeof(bytes) ~= "number" or bytes ~= bytes or bytes < 0 or bytes > cap then
114
+ Ward.Strike(player, "packet")
115
+ return false
116
+ end
117
+ return true
118
+ end
119
+
120
+ function Ward.Strike(player: Player, reason: string): number
121
+ if not RunService:IsServer() then
122
+ return 0
123
+ end
124
+ if typeof(player) ~= "Instance" or not player:IsA("Player") or player.Parent == nil then
125
+ return 0
126
+ end
127
+ local row = rec(player)
128
+ row.strikes += 1
129
+ local label = if typeof(reason) == "string" and reason ~= "" then reason else "unknown"
130
+ row.reasons[label] = (row.reasons[label] or 0) + 1
131
+ Ward.OnStrike:Fire(player, label, row.strikes)
132
+ local studio = RunService:IsStudio()
133
+ if row.strikes >= Ward.KickAt and (not studio or Ward.KickInStudio == true) then
134
+ player:Kick("Movement or traffic rejected")
135
+ end
136
+ return row.strikes
137
+ end
138
+
139
+ function Ward.Grace(player: Player, seconds: number)
140
+ if typeof(player) ~= "Instance" or not player:IsA("Player") then
141
+ return
142
+ end
143
+ local hold = if typeof(seconds) == "number" and seconds > 0 then seconds else 1.5
144
+ rec(player).graceUntil = os.clock() + hold
145
+ end
146
+
147
+ function Ward.Clear(player: Player)
148
+ records[player] = nil
149
+ end
150
+
151
+ function Ward.Strikes(player: Player): number
152
+ local row = records[player]
153
+ return if row then row.strikes else 0
154
+ end
155
+
156
+ local function bindSpawnGrace(player: Player)
157
+ Ward.Grace(player, SPAWN_GRACE)
158
+ player.CharacterAdded:Connect(function()
159
+ local row = rec(player)
160
+ row.lastPos = nil
161
+ Ward.Grace(player, SPAWN_GRACE)
162
+ end)
163
+ end
164
+
165
+ function Ward.WatchMovement()
166
+ if watching or not RunService:IsServer() then
167
+ return
168
+ end
169
+ watching = true
170
+ RunService.Heartbeat:Connect(function(dt: number)
171
+ if dt <= 0 then
172
+ return
173
+ end
174
+ local step = math.max(dt, MIN_DT)
175
+ local now = os.clock()
176
+ for _, player in Players:GetPlayers() do
177
+ local character = player.Character
178
+ local root = character and character:FindFirstChild("HumanoidRootPart")
179
+ if not (root and root:IsA("BasePart")) then
180
+ rec(player).lastPos = nil
181
+ continue
182
+ end
183
+ local row = rec(player)
184
+ local pos = root.Position
185
+ if row.lastPos and now >= row.graceUntil then
186
+ local delta = pos - row.lastPos
187
+ local dist = delta.Magnitude
188
+ local horizontal = Vector3.new(delta.X, 0, delta.Z).Magnitude
189
+ local falling = delta.Y < 0 and horizontal < Ward.MaxTeleport
190
+ local speed = dist / step
191
+ if not falling and dist > Ward.MaxTeleport and speed > Ward.MaxSpeed then
192
+ Ward.Strike(player, "speed")
193
+ root.CFrame = CFrame.new(row.lastPos)
194
+ pos = row.lastPos
195
+ end
196
+ end
197
+ row.lastPos = pos
198
+ end
199
+ end)
200
+ for _, player in Players:GetPlayers() do
201
+ bindSpawnGrace(player)
202
+ end
203
+ Players.PlayerAdded:Connect(bindSpawnGrace)
204
+ Players.PlayerRemoving:Connect(Ward.Clear)
205
+ end
206
+
207
+ function Ward.Start()
208
+ Ward.WatchMovement()
209
+ end
210
+
211
+ return Ward
@@ -0,0 +1,29 @@
1
+ --!nonstrict
2
+ -- cluaupp-source: ReplicatedStorage/Shared/Constants/Datas/TemplateData.clh
3
+ -- Compiled by CL++ — C++ × Luau
4
+
5
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
6
+
7
+ export type PlayerTemplate = {
8
+ Currencies: Currencies,
9
+ Rebirths: number,
10
+ Rank: number,
11
+ Inventory: PlayerInventory,
12
+ Trade: PlayerTrade,
13
+ Settings: PlayerSettings,
14
+ Codes: PlayerCodes,
15
+ }
16
+
17
+ const function PlayerTemplate()
18
+ return {
19
+ Currencies = { Coins = 0, Gems = 0 },
20
+ Rebirths = 0,
21
+ Rank = 0,
22
+ Inventory = { Slots = 20 },
23
+ Trade = { DayKey = nil, TradesToday = 0, LastTradeAt = 0, ActiveTradeId = nil },
24
+ Settings = { GameMusic = 100, Effects = 100 },
25
+ Codes = { RedeemedCount = 0 },
26
+ }
27
+ end
28
+
29
+ return PlayerTemplate
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "TemplateData.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "ReplicatedStorage/Shared/Constants/Datas/TemplateData.clh"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "ReplicatedStorage/Shared/Constants/Datas/TemplateData.clh",
11
+ "generated": "out/ReplicatedStorage/Shared/Constants/Datas/TemplateData.luau"
12
+ }
13
+ }
@@ -0,0 +1,83 @@
1
+ --!native
2
+ --!optimize 2
3
+ --!strict
4
+ -- cluaupp-source: ReplicatedStorage/Shared/Net/Net.flare
5
+ -- Generated by Cluaupp Flare from ReplicatedStorage/Shared/Net/Net.flare
6
+ -- Do not edit. Change the .flare schema and run cluaupp build.
7
+
8
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
9
+
10
+ local ReplicatedStorage = game:GetService("ReplicatedStorage")
11
+ local Flare = require(ReplicatedStorage.CluauppLibs.Flare)
12
+
13
+ local session = Flare.open(script)
14
+
15
+ -- packet Ready (#1)
16
+ local function writeReady(cursor)
17
+ return cursor
18
+ end
19
+
20
+ local function readReady(cursor)
21
+ return
22
+ end
23
+
24
+ local Ready = session.packet({
25
+ id = 1,
26
+ from = "client",
27
+ reliable = true,
28
+ write = writeReady,
29
+ read = readReady,
30
+ })
31
+
32
+ -- packet Welcome (#2)
33
+ local function writeWelcome(cursor, userId, clock)
34
+ Flare.writei32(cursor, userId)
35
+ Flare.writef64(cursor, clock)
36
+ return cursor
37
+ end
38
+
39
+ local function readWelcome(cursor)
40
+ local userId = Flare.readi32(cursor)
41
+ local clock = Flare.readf64(cursor)
42
+ return userId, clock
43
+ end
44
+
45
+ local Welcome = session.packet({
46
+ id = 2,
47
+ from = "server",
48
+ reliable = true,
49
+ write = writeWelcome,
50
+ read = readWelcome,
51
+ })
52
+
53
+ -- query Session (#1)
54
+ local function writeSessionReq(cursor)
55
+ return cursor
56
+ end
57
+
58
+ local function readSessionReq(cursor)
59
+ return
60
+ end
61
+
62
+ local function writeSessionRes(cursor, value)
63
+ Flare.writei32(cursor, value)
64
+ return cursor
65
+ end
66
+
67
+ local function readSessionRes(cursor)
68
+ return Flare.readi32(cursor)
69
+ end
70
+
71
+ local Session = session.query({
72
+ id = 1,
73
+ writeReq = writeSessionReq,
74
+ readReq = readSessionReq,
75
+ writeRes = writeSessionRes,
76
+ readRes = readSessionRes,
77
+ })
78
+
79
+ return {
80
+ Ready = Ready,
81
+ Welcome = Welcome,
82
+ Session = Session,
83
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "Net.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "ReplicatedStorage/Shared/Net/Net.flare"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "ReplicatedStorage/Shared/Net/Net.flare",
11
+ "generated": "out/ReplicatedStorage/Shared/Net/Net.luau"
12
+ }
13
+ }
@@ -0,0 +1,18 @@
1
+ --!nonstrict
2
+ -- cluaupp-source: ServerScriptService/Boot/DataBoot.server.clpp
3
+ -- Compiled by CL++ — C++ × Luau
4
+
5
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
6
+
7
+ const ReplicatedStorage = game:GetService("ReplicatedStorage")
8
+
9
+ const Keep = require(ReplicatedStorage.CluauppLibs.Keep)
10
+ const TemplateData = require(ReplicatedStorage.Shared.Constants.Datas.TemplateData)
11
+
12
+ -- DataBoot.server.clpp:6
13
+ const function init()
14
+ local playerData: PlayerTemplate = TemplateData()
15
+ Keep.Server:Init({ Template = playerData, StoreName = "PlayerData", UseMock = true })
16
+ end
17
+
18
+ init()
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "DataBoot.server.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "ServerScriptService/Boot/DataBoot.server.clpp"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "ServerScriptService/Boot/DataBoot.server.clpp",
11
+ "generated": "out/ServerScriptService/Boot/DataBoot.server.luau"
12
+ }
13
+ }
@@ -0,0 +1,14 @@
1
+ --!nonstrict
2
+ -- cluaupp-source: ServerScriptService/Configuration/ServerConfig.clp
3
+ -- Compiled by CL++ — C++ × Luau
4
+
5
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
6
+
7
+ const STORE_NAME: string = "PlayerData"
8
+
9
+ const USE_MOCK_IN_STUDIO: boolean = true
10
+
11
+ return {
12
+ STORE_NAME = STORE_NAME,
13
+ USE_MOCK_IN_STUDIO = USE_MOCK_IN_STUDIO,
14
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "ServerConfig.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "ServerScriptService/Configuration/ServerConfig.clp"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "ServerScriptService/Configuration/ServerConfig.clp",
11
+ "generated": "out/ServerScriptService/Configuration/ServerConfig.luau"
12
+ }
13
+ }
@@ -0,0 +1,15 @@
1
+ --!nonstrict
2
+ -- cluaupp-source: ServerScriptService/Handlers/Guard.server.clpp
3
+ -- Compiled by CL++ — C++ × Luau
4
+
5
+ const ReplicatedStorage = game:GetService("ReplicatedStorage")
6
+ const Ward = require(ReplicatedStorage.CluauppLibs.Ward)
7
+
8
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
9
+
10
+ -- Guard.server.clpp:5
11
+ const function init()
12
+ Ward.Start()
13
+ end
14
+
15
+ init()
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "Guard.server.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "ServerScriptService/Handlers/Guard.server.clpp"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "ServerScriptService/Handlers/Guard.server.clpp",
11
+ "generated": "out/ServerScriptService/Handlers/Guard.server.luau"
12
+ }
13
+ }
@@ -0,0 +1,50 @@
1
+ --!nonstrict
2
+ -- cluaupp-source: ServerScriptService/Handlers/PlayerHandler.server.clpp
3
+ -- Compiled by CL++ — C++ × Luau
4
+
5
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
6
+
7
+ const ReplicatedStorage = game:GetService("ReplicatedStorage")
8
+
9
+ const Janitor = require(ReplicatedStorage.CluauppLibs.Sweep)
10
+ local __cluauppSweep = nil
11
+ const Keep = require(ReplicatedStorage.CluauppLibs.Keep)
12
+
13
+ -- PlayerHandler.server.clpp:5
14
+ const function BindLeaderstats(player: Player)
15
+ local data = Keep.Server:WaitFor(player)
16
+
17
+ if player:FindFirstChild("leaderstats") ~= nil then
18
+ return
19
+ end
20
+
21
+ local leaderstats: Folder = Instance.new("Folder")
22
+ leaderstats.Parent = player
23
+ leaderstats.Name = "leaderstats"
24
+ local coins: IntValue = Instance.new("IntValue")
25
+ coins.Parent = leaderstats
26
+ coins.Name = "Coins"
27
+ coins.Value = data:Get(Keep.Server.Paths.Currencies.Coins) -- initial value; not a Changed event
28
+ end
29
+
30
+ -- PlayerHandler.server.clpp:17
31
+ const function init()
32
+ if not __cluauppSweep then
33
+ __cluauppSweep = Janitor.new()
34
+ end
35
+
36
+ local __janitor = __cluauppSweep
37
+ local players: Players = game:GetService("Players")
38
+
39
+ for _, player in players:GetPlayers() do
40
+ BindLeaderstats(player)
41
+ end
42
+
43
+ __janitor:Add(players.PlayerAdded:Connect(BindLeaderstats), "Disconnect")
44
+ game:BindToClose(function()
45
+ __janitor:Cleanup()
46
+ __janitor:Destroy()
47
+ end)
48
+ end
49
+
50
+ init()
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "PlayerHandler.server.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "ServerScriptService/Handlers/PlayerHandler.server.clpp"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "ServerScriptService/Handlers/PlayerHandler.server.clpp",
11
+ "generated": "out/ServerScriptService/Handlers/PlayerHandler.server.luau"
12
+ }
13
+ }
@@ -0,0 +1,12 @@
1
+ --!nonstrict
2
+ -- cluaupp-source: StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.clpp
3
+ -- Compiled by CL++ — C++ × Luau
4
+
5
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
6
+
7
+ -- CharacterReady.client.clpp:4
8
+ const function init()
9
+ print("character local ready")
10
+ end
11
+
12
+ init()
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "CharacterReady.client.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.clpp"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.clpp",
11
+ "generated": "out/StarterPlayer/StarterCharacterScripts/Character/CharacterReady.client.luau"
12
+ }
13
+ }
@@ -0,0 +1,16 @@
1
+ --!nonstrict
2
+ -- cluaupp-source: StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.clpp
3
+ -- Compiled by CL++ — C++ × Luau
4
+
5
+ -- cluaupp: Roster.new / GetService ReplicatedStorage / self.janitor
6
+
7
+ const ReplicatedStorage = game:GetService("ReplicatedStorage")
8
+
9
+ const Keep = require(ReplicatedStorage.CluauppLibs.Keep)
10
+
11
+ -- DataController.client.clpp:5
12
+ const function init()
13
+ Keep.Client:Init()
14
+ end
15
+
16
+ init()
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "file": "DataController.client.luau",
4
+ "sourceRoot": "C:/Users/gtofr/OneDrive/Documentos/GitHub/Cluaupp/examples/game",
5
+ "sources": [
6
+ "StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.clpp"
7
+ ],
8
+ "mappings": "AAAA",
9
+ "cluaupp": {
10
+ "source": "StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.clpp",
11
+ "generated": "out/StarterPlayer/StarterPlayerScripts/Controllers/DataController.client.luau"
12
+ }
13
+ }
@@ -0,0 +1,26 @@
1
+ #pragma once
2
+ // cluaupp generated — do not edit. Change the .flare schema and run cluaupp build.
3
+ // Generated by Cluaupp Flare from ReplicatedStorage/Shared/Net/Net.flare
4
+ // Tag + params in the .flare file. This header is IntelliSense; runtime is the generated .luau.
5
+
6
+ struct NetReady {
7
+ void FireServer();
8
+ RBXScriptConnection Connect(func fn);
9
+ };
10
+
11
+ struct NetWelcome {
12
+ void Fire(Player player, int userId, double clock);
13
+ void FireAll(int userId, double clock);
14
+ RBXScriptConnection Connect(func fn);
15
+ };
16
+
17
+ struct NetSession {
18
+ int Invoke();
19
+ void On(func fn);
20
+ };
21
+
22
+ struct Net {
23
+ NetReady Ready;
24
+ NetWelcome Welcome;
25
+ NetSession Session;
26
+ };
@@ -0,0 +1,5 @@
1
+ opt name = Net
2
+
3
+ packet Ready() from Client
4
+ packet Welcome(i32 userId, f64 clock) from Server
5
+ query Session() -> i32
@@ -1,10 +1,10 @@
1
1
  #pragma strict
2
2
  #include <clpp/roblox.clh>
3
3
  #include <clpp/libs/keep.clh>
4
- #include "../../ReplicatedStorage/Shared/Constants/Datas/TemplateData.clh"
4
+ import { PlayerTemplate } from "../../ReplicatedStorage/Shared/Constants/Datas/TemplateData.clh";
5
5
 
6
6
  void init() {
7
- PlayerTemplate playerData;
7
+ PlayerTemplate playerData = PlayerTemplate();
8
8
  Keep.Server.Init(DataServiceOptions {
9
9
  .Template = playerData,
10
10
  .StoreName = "PlayerData",
@@ -3,7 +3,7 @@
3
3
  #include <clpp/libs/keep.clh>
4
4
 
5
5
  void BindLeaderstats(Player player) {
6
- Data data = Keep.Server.WaitFor(player);
6
+ auto data = Keep.Server.WaitFor(player);
7
7
  if (player.FindFirstChild("leaderstats") != null) {
8
8
  return;
9
9
  }
@@ -0,0 +1,9 @@
1
+ # cluaupp roblox luau
2
+ syntax = "Luau"
3
+ column_width = 120
4
+ line_endings = "Unix"
5
+ indent_type = "Tabs"
6
+ indent_width = 4
7
+ quote_style = "AutoPreferDouble"
8
+ call_parentheses = "Always"
9
+ collapse_simple_statement = "Never"