17 Commits
Author SHA1 Message Date
FulldroperandClaude Opus 5.5 f7793aea81 0.12.1: tutorial scene about aether and magic; rrls keeps the first loading screen (quick play joined before mods registered their channels)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 13:03:29 +03:00
FulldroperandClaude Opus 5.5 14eaad8309 0.12.0: team-proposed mods — Central Kitchen, Create Connected, Stuff 'N Additions (+Sable compat), GeckoLib, Ars Nouveau, CreateBetterFps; Sodium Dynamic Lights removed (clashes with Ars Nouveau)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 11:03:59 +03:00
FulldroperandClaude Opus 5.5 d2d5f77990 0.11.0: remove DAP ur Homies and Player Animation Library; tutorial: energy scene works in Rhino
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:53:05 +03:00
FulldroperandClaude Opus 5.5 a8d0f7de24 0.10.0: Easy NPC removed (NPCs run on Custom NPCs); tutorial scene about officials
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:23:09 +03:00
FulldroperandClaude Opus 5.5 836428ddda 0.9.0: CustomNPCs-Unofficial
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:10:44 +03:00
FulldroperandClaude Opus 5.5 4a0e2884b6 Reindex after x+-autofish removal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:54:56 +03:00
FulldroperandClaude Opus 5.5 71406c6df6 0.8.0: tutorial — miner and factory operator scenes, auctions, drills need a concession
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:54:54 +03:00
full_droper f5f8fcc367 Видалити mods/x+-autofish.pw.toml 2026-10-03 14:46:25 +01:00
FulldroperandClaude Opus 5.5 d1a9b9d1f6 0.7.0: tutorial — courier and road builder scenes, energy scene fixed (world is a property in KubeJS), credits.txt lowercase
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 07:15:28 +03:00
FulldroperandClaude Opus 5.5 42ee586e63 0.6.2: readable tutorial texts, clearer energy scene
- one short sentence per step like Create (no more paragraphs); literal _underscores_ removed —
  PonderJS shows them as is
- energy scene tells the substation story: state machines need power, meter at the input,
  your generator connects, coins every minute, no power — no pay

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 06:53:48 +03:00
FulldroperandClaude Opus 5.5 3baf5e8493 0.6.1: tutorial on real chain networks, energy scene
- selling and buying scenes use Create's own frogport schematic and move an addressed package along
  the chains with the same calls as Create's scenes (guarded: without the classes they still show the network)
- new scene: selling energy to the state through a metered stressometer (also on create:stressometer)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 06:44:46 +03:00
FulldroperandClaude Opus 5.5 eef8225cfd 0.6.0: in-game tutorial in Create's Ponder style
- Ponder for KubeJS 2.4.0 (client) + client_scripts/createrp_ponder.js: six scenes (terminal, selling,
  buying, money and bank, land and ore, jobs) on «Довідник громадянина», frogport and CC computers,
  plus a «Держава Create RP» tag in the Ponder index
- startup_scripts/createrp_items.js registers kubejs:citizen_guide (identical in the server pack)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 06:32:31 +03:00
FulldroperandClaude Opus 5.5 80693085e1 0.5.0: Cyrillic CC terminal font (CCCyrillic, MIT) via kubejs/assets
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 02:59:49 +03:00
FulldroperandClaude Opus 5.5 7e109471a2 0.4.0: Easy NPC
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 01:13:26 +03:00
Full_droperandClaude Opus 5.5 c1fea71237 Easy NPC
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 00:51:19 +03:00
Full_droperandClaude Opus 5.5 adea640a78 0.3.0: Open Parties and Claims
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 22:57:57 +03:00
Full_droperandClaude Opus 5.5 0db88ac9fe 0.2.0: KubeJS (+Rhino, Better Advanced Tooltips); tools/add-mod.mjs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 21:06:03 +03:00
29 changed files with 906 additions and 76 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# Create RP — клієнт
Клієнтська збірка для сервера **Create RP** (`create.fulldroper.ks.ua`): Minecraft **1.21.1**, NeoForge **21.1.228**, 105 модів.
Клієнтська збірка для сервера **Create RP** (`create.fulldroper.ks.ua`): Minecraft **1.21.1**, NeoForge **21.1.228**, 115 модів.
## Встановлення
+1 -1
View File
@@ -73,7 +73,7 @@
#Blocks that cannot be picked up
forbiddenTiles = ["#forge:immovable", "#forge:relocation_not_supported", "#neoforge:immovable", "#neoforge:relocation_not_supported", "minecraft:end_portal", "minecraft:piston_head", "#c:relocation_not_supported", "minecraft:end_gateway", "minecraft:tall_grass", "minecraft:large_fern", "minecraft:peony", "minecraft:rose_bush", "minecraft:lilac", "minecraft:sunflower", "minecraft:*_bed", "minecraft:*_door", "minecraft:big_dripleaf_stem", "minecraft:waterlily", "minecraft:cake", "minecraft:nether_portal", "minecraft:tall_seagrass", "animania:block_trough", "animania:block_invisiblock", "colossalchests:*", "ic2:*", "bigreactors:*", "forestry:*", "tconstruct:*", "rustic:*", "botania:*", "astralsorcery:*", "quark:colored_bed_*", "immersiveengineering:*", "embers:block_furnace", "embers:ember_bore", "embers:ember_activator", "embers:mixer", "embers:heat_coil", "embers:large_tank", "embers:crystal_cell", "embers:alchemy_pedestal", "embers:boiler", "embers:combustor", "embers:catalzyer", "embers:field_chart", "embers:inferno_forge", "storagedrawers:framingtable", "skyresources:*", "lootbags:*", "exsartagine:*", "aquamunda:tank", "opencomputers:*", "malisisdoors:*", "industrialforegoing:*", "minecolonies:*", "thaumcraft:pillar*", "thaumcraft:infernal_furnace", "thaumcraft:placeholder*", "thaumcraft:infusion_matrix", "thaumcraft:golem_builder", "thaumcraft:thaumatorium*", "magneticraft:oil_heater", "magneticraft:solar_panel", "magneticraft:steam_engine", "magneticraft:shelving_unit", "magneticraft:grinder", "magneticraft:sieve", "magneticraft:solar_tower", "magneticraft:solar_mirror", "magneticraft:container", "magneticraft:pumpjack", "magneticraft:solar_panel", "magneticraft:refinery", "magneticraft:oil_heater", "magneticraft:hydraulic_press", "magneticraft:multiblock_gap", "refinedstorage:*", "mcmultipart:*", "enderstorage:*", "betterstorage:*", "practicallogistics2:*", "wearablebackpacks:*", "rftools:screen", "rftools:creative_screen", "create:*", "magic_doorknob:*", "iceandfire:*", "ftbquests:*", "waystones:*", "contact:*", "framedblocks:*", "securitycraft:*", "forgemultipartcbe:*", "integrateddynamics:cable", "mekanismgenerators:wind_generator", "cookingforblockheads:cabinet", "cookingforblockheads:corner", "cookingforblockheads:counter", "cookingforblockheads:oven", "cookingforblockheads:toaster", "cookingforblockheads:milk_jar", "cookingforblockheads:cow_jar", "cookingforblockheads:fruit_basket", "cookingforblockheads:cooking_table", "cookingforblockheads:fridge", "cookingforblockheads:sink", "chipped:*", "irons_spellbooks:*", "create*:*", "simple_pipes:*", "libmultipart:*", "quark:tiny_potato", "ait:*", "vampirism:*", "extrastorage:*", "relics:researching_table", "sophisticatedstorage:*chest", "powah:*", "advancementtrophies:trophy", "mekanismgenerators:heat_generator", "mna:filler_block", "create_enchantment_industry:*", "graveyard:*", "immersivepetroleum:*", "tardis:interior_door", "cuffed:*", "littletiles:*", "butchersdelight:*", "irons_spellbooks:*", "extended_drawers:*", "functionalstorage:*", "sophisticatedstorage:*", "farmersdelight:*", "modern_industrialization:*_cable", "modern_industrialization:item_pipe", "modern_industrialization:*_item_pipe", "modern_industrialization:fluid_pipe", "modern_industrialization:*_fluid_pipe", "snowrealmagic:*"]
#Entities that cannot be picked up
forbiddenEntities = ["#c:capturing_not_supported", "#c:teleporting_not_supported", "minecraft:end_crystal", "minecraft:ender_dragon", "minecraft:ghast", "minecraft:fireball", "minecraft:small_fireball", "minecraft:whither_skull", "minecraft:shulker", "minecraft:leash_knot", "minecraft:armor_stand", "minecraft:whither_skull_dangerous", "minecraft:dragon_fireball", "minecraft:item_frame", "minecraft:painting", "minecraft:shulker_bullet", "minecraft:evoker_fangs", "minecraft:glow_item_frame", "minecraft:tnt", "minecraft:trident", "minecraft:arrow", "minecraft:spectral_arrow", "minecraft:interaction", "minecraft:marker", "minecraft:block_display", "minecraft:item_display", "minecraft:text_display", "animania:hamster", "animania:ferret*", "animania:hedgehog*", "animania:cart", "animania:wagon", "mynko:*", "pixelmon:*", "mocreatures:*", "quark:totem", "vehicle:*", "securitycraft:*", "taterzens:npc", "easy_npc:*", "bodiesbodies:dead_body", "littletiles:*"]
forbiddenEntities = ["#c:capturing_not_supported", "#c:teleporting_not_supported", "minecraft:end_crystal", "minecraft:ender_dragon", "minecraft:ghast", "minecraft:fireball", "minecraft:small_fireball", "minecraft:whither_skull", "minecraft:shulker", "minecraft:leash_knot", "minecraft:armor_stand", "minecraft:whither_skull_dangerous", "minecraft:dragon_fireball", "minecraft:item_frame", "minecraft:painting", "minecraft:shulker_bullet", "minecraft:evoker_fangs", "minecraft:glow_item_frame", "minecraft:tnt", "minecraft:trident", "minecraft:arrow", "minecraft:spectral_arrow", "minecraft:interaction", "minecraft:marker", "minecraft:block_display", "minecraft:item_display", "minecraft:text_display", "animania:hamster", "animania:ferret*", "animania:hedgehog*", "animania:cart", "animania:wagon", "mynko:*", "pixelmon:*", "mocreatures:*", "quark:totem", "vehicle:*", "securitycraft:*", "taterzens:npc", "easy_npc:*", "customnpcs:*", "bodiesbodies:dead_body", "littletiles:*"]
#Entities that cannot have other entities stacked on top of them
forbiddenStacking = ["minecraft:horse"]
+1 -1
View File
@@ -1,5 +1,5 @@
#Allowed Values: ALL, LOADING, RELOADING, NONE
hideOverlays = "ALL"
hideOverlays = "RELOADING"
#text.autoconfig.rrls.option.rgbProgress.@Tooltip
rgbProgress = false
#text.autoconfig.rrls.option.blockOverlay.@Tooltip
+84 -18
View File
@@ -50,7 +50,7 @@ hash = "c3cbcb17ade590daf230373d51457732bc8d9dd1039f7947b6bf564e38df1d9c"
[[files]]
file = "config/carryon-common.toml"
hash = "64b3a9808f98d547bfc461f41e159cab6ef3c7525a98479e06adcbf65b027997"
hash = "43f0555ad4d336822ffa04b1b77f240d327867ade9710741b23b48d236fd3885"
[[files]]
file = "config/chat_heads.json5"
@@ -566,7 +566,7 @@ hash = "57fe579bf4cdbcab6c6702dc0dad2727b899f07f28fea686bca1e4b25b20bbfb"
[[files]]
file = "config/rrls.toml"
hash = "88d9f88c8e370f113122770512c67e704a16c4ceed4f70755495c9ce5072cc92"
hash = "f097471ad7fd4d3adccdc4d6f935b0cdcac68c0cbdec6ea3d752d307ec66d867"
[[files]]
file = "config/sable-client.toml"
@@ -804,6 +804,22 @@ hash = "d438aea41ca41e93697e059f523686935c0add482f6abe96b532bbf10c6ed80a"
file = "config/yacl.json5"
hash = "121b93764159be6fb7dab523b29a844e2bb78400ce8c48f52135a097e9b0006e"
[[files]]
file = "kubejs/assets/computercraft/textures/gui/credits.txt"
hash = "19b844245d03fcdd488a7a791e287447191a74acd0f14995209339d768c5e6ce"
[[files]]
file = "kubejs/assets/computercraft/textures/gui/term_font.png"
hash = "db4c4a8ab49265f6e8e456f495800ea148b133b18a3242aabca30b98ab7f784f"
[[files]]
file = "kubejs/client_scripts/createrp_ponder.js"
hash = "3c713cfff54f79e962646c408749649aaaddae23cd7648298ea9b7c383f9d4ae"
[[files]]
file = "kubejs/startup_scripts/createrp_items.js"
hash = "58100f02cf749b138c2a91567df37afce4b2ef494738268963e8443a3e603036"
[[files]]
file = "mods/3dskinlayers.pw.toml"
hash = "82becc6910845ae1a68884e6f7a3dcdc861d79a087ae81b1d7e120e82884372d"
@@ -834,6 +850,11 @@ file = "mods/architectury-api.pw.toml"
hash = "ea336d25c3e21ef168aec20e1ea470c96949ad29632646ee8e8ab0d74b4bbfc9"
metafile = true
[[files]]
file = "mods/ars-nouveau.pw.toml"
hash = "9645a2d42361e38b0747c43f5e82a7f74cd4f06940cad02d6591e7c81835f733"
metafile = true
[[files]]
file = "mods/autoreconnectrf.pw.toml"
hash = "627eab28e2c7985ac1484eb597d84492103eeeb0f481fd3f480078e4923ab9c9"
@@ -849,6 +870,11 @@ file = "mods/balm.pw.toml"
hash = "392901b7f79963442553456af846d06f48b4057a054a928adb8a76eea13c6383"
metafile = true
[[files]]
file = "mods/better-advanced-tooltips.pw.toml"
hash = "03084ff4f74cedc1b8ac6c85a98842f75956fb4fa811d285d8ca7caa8d54da5d"
metafile = true
[[files]]
file = "mods/better-ping-display.pw.toml"
hash = "cc2e6dda94a7a6f5487843cafe569d8044bf9482cbf03f062cf4595f1fb05281"
@@ -924,6 +950,11 @@ file = "mods/coroutil.pw.toml"
hash = "d901f874a1e09747b8d0d072c38c426eceead1f29c8ba36680f8f0082996b152"
metafile = true
[[files]]
file = "mods/create-aeronautics-and-connected-fluid-vessel-compatability.pw.toml"
hash = "1b8faf01f728f9057496f0dbec4222b8d174854caaf67a5c03ce5e75f8964e20"
metafile = true
[[files]]
file = "mods/create-aeronautics.pw.toml"
hash = "6ea6284b569b13f45bfe44f9790389de4a2f7cda92c8b3bb94511b600d64c486"
@@ -934,6 +965,16 @@ file = "mods/create-avionics.pw.toml"
hash = "8cccda3a227b1a929d391f33fa33ec15582db2b6164a3e36bf89ce756f5c08fd"
metafile = true
[[files]]
file = "mods/create-central-kitchen.pw.toml"
hash = "c8b2e60b789885854508c674ba0630cdc8dc2a880302d8475cdc5ae06c44f64a"
metafile = true
[[files]]
file = "mods/create-connected.pw.toml"
hash = "6ac362d60bc8b13e03a5b6b9cdf9c7676f65d3e89e87c66f18514e7ee164cdb0"
metafile = true
[[files]]
file = "mods/create-dragons-plus.pw.toml"
hash = "2ba3112a833d6e23aae1e0a38a7a324f89efb8a532ea101f355dc38490840b3b"
@@ -949,11 +990,26 @@ file = "mods/create-power-loader.pw.toml"
hash = "703c2d475167e08d77254c8944e2971899603cce61e4c87f870095386c725c74"
metafile = true
[[files]]
file = "mods/create-stuff-additions.pw.toml"
hash = "2244c6c580c41f432e02bc82a6f78af0b1777de42400d1e5b702208376c56c6f"
metafile = true
[[files]]
file = "mods/create-stuff-n-additions-x-sable-aeronautics-compat.pw.toml"
hash = "3124ff7b0beddb44ec981a35a149ced3e6a29f84b72a01a1d088932d61bdbdbb"
metafile = true
[[files]]
file = "mods/create.pw.toml"
hash = "dcaf5f2e28db0b9a127d0167456832341045ddc9aec058c3d9fcf53f618d2404"
metafile = true
[[files]]
file = "mods/createbetterfps.pw.toml"
hash = "b6a535a801939a78f255203f7b28319773becca20cc88348f8764f4078816300"
metafile = true
[[files]]
file = "mods/cubes-without-borders.pw.toml"
hash = "8e5f6550359e71ecbea95705ec61fb03313550e6f481cabf48043929909aabae"
@@ -965,8 +1021,8 @@ hash = "36debf7653e95a855b4fedacc19027cf2e01960fc0b6d55ef2ffbffbcb455690"
metafile = true
[[files]]
file = "mods/dap-ur-homies.pw.toml"
hash = "c82096b443ddc691eda44822604791653771b7c7da12eaac14fd9ba6bf96d647"
file = "mods/customnpcs-unofficial.pw.toml"
hash = "ea6b6845387f8d990e607eaa98d027734f7d1a8823434ef901f81a5736d60aa9"
metafile = true
[[files]]
@@ -1054,6 +1110,11 @@ file = "mods/fzzy-config.pw.toml"
hash = "f9c118b7a66238a7f9e052705e82402e57c7a5b753d62d679b94701ede479752"
metafile = true
[[files]]
file = "mods/geckolib.pw.toml"
hash = "35779b39ddc06059ec483b33de2ecfdc3adb95c0a49e69b6701fb0024827e2f5"
metafile = true
[[files]]
file = "mods/gravestone-mod.pw.toml"
hash = "e88253c3633274c212b2c4628a26ba03ceba6afff561eb6f9488689fad4cad06"
@@ -1114,6 +1175,11 @@ file = "mods/kotlin-for-forge.pw.toml"
hash = "27302b0087cf53570cd7a3b4eb550a208cbb6f6ba07210c604176155f39e0078"
metafile = true
[[files]]
file = "mods/kubejs.pw.toml"
hash = "7e0eca275f27b6543f06c36dec433851a956960cbedd2be57d19e159d636bfc1"
metafile = true
[[files]]
file = "mods/longer-chat-history.pw.toml"
hash = "12e4601519ca5fb940e9658b71f2218f2a06c41847b714978e1568435688858d"
@@ -1174,6 +1240,11 @@ file = "mods/oceans-delight.pw.toml"
hash = "7bf7c8369bd28212a1e294c60310ccb72f1eb773630970e6ab106ae666766cd3"
metafile = true
[[files]]
file = "mods/open-parties-and-claims.pw.toml"
hash = "97660396e7f075f4c9ca8447878ec3da58ebea9ed464cdb494d4db1d62989936"
metafile = true
[[files]]
file = "mods/particle-rain.pw.toml"
hash = "6f24e7f5ecef862b1bdb61031637e27b093f185c3219023bea94d2d954ec4180"
@@ -1195,13 +1266,13 @@ hash = "650330109d21831664d2ff597c7a90200eda69a1efaca4e9b0b6b6297ac3c364"
metafile = true
[[files]]
file = "mods/player-animation-library.pw.toml"
hash = "252547b364471df931005a57234082388e74eed949387ef39d17ce5fc56e190d"
file = "mods/polytone.pw.toml"
hash = "636f08c84e9a1e1793850aa4f2390e5ece8fc25abee1d5d83679f3813e113802"
metafile = true
[[files]]
file = "mods/polytone.pw.toml"
hash = "636f08c84e9a1e1793850aa4f2390e5ece8fc25abee1d5d83679f3813e113802"
file = "mods/ponder.pw.toml"
hash = "5ead8d8bc26cdbe1a17dc055f7f0fe762a08254d0199d6ea8fcc58839ab274f2"
metafile = true
[[files]]
@@ -1214,6 +1285,11 @@ file = "mods/reeses-sodium-options.pw.toml"
hash = "09306b955060349986ccf6a6d2a67f1e019fa172a7dc690dd6007f81c966309a"
metafile = true
[[files]]
file = "mods/rhino.pw.toml"
hash = "673de9cae75d2ad02796368939384de0d7238cf5c782975d71848a2187f753e7"
metafile = true
[[files]]
file = "mods/rrls.pw.toml"
hash = "b78044fd79ce21750d05dc61b6aede33c4b87cdc16a26f5aff472d4f73ab623c"
@@ -1239,11 +1315,6 @@ file = "mods/slice-and-dice.pw.toml"
hash = "18ca1d438084a8578f4b75f12233db58ca1deec55f117fb875afa21f2c021559"
metafile = true
[[files]]
file = "mods/sodium-dynamic-lights.pw.toml"
hash = "c1e526d3d17cb3563e596d45c7567ed1fe60c31bdc3457f7a747ef8150bd3c1b"
metafile = true
[[files]]
file = "mods/sodium-extra.pw.toml"
hash = "a1fb713df668ed21dda0602e99cb23b991c8faff841e130d7aae46258c3d6a45"
@@ -1314,11 +1385,6 @@ file = "mods/what-are-they-up-to.pw.toml"
hash = "9ce52d07c0c3d146a2a44f8bc187138ce7a5558a4e3ab540c86234702b6de274"
metafile = true
[[files]]
file = "mods/x+-autofish.pw.toml"
hash = "29d142218e15fbd26a4e17e1a65dab7a5a0dd81e6806130a474c1d27fa1be53d"
metafile = true
[[files]]
file = "mods/yacl.pw.toml"
hash = "539f362e9e192cf3b2813e0dfdfc51a5e6814129c6e82a9733842529beea6242"
@@ -0,0 +1,2 @@
term_font.png — "CCCyrillic" by sashafiesta (MIT), https://modrinth.com/resourcepack/cccyrillic
Windows-1251 Cyrillic glyphs for the CC:Tweaked terminal font. The server's terminal programs write text in 1251.
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

+572
View File
@@ -0,0 +1,572 @@
// Create RP — туторіал у стилі Create (Ponder): наведи на предмет і затисни W.
// Потрібні PonderJS (мод «Ponder for KubeJS») і startup_scripts/createrp_items.js (предмет kubejs:citizen_guide).
// Більшість сцен — на стандартній плиті 5x5 (y=0 — плита, блоки з y=1); продаж і покупки — на схематиці Create з ланцюгами.
// Підписи — як у Create: одне коротке речення на крок.
const PACKAGE = 'create:cardboard_package_10x12'
// Справжні посилки на ланцюгах — тими ж викликами, що й у сценах самого Create (FrogAndConveyorScenes).
// Якщо KubeJS не дасть доступу до класів — сцени все одно покажуть мережу й текст, лише без руху посилок.
let CreateScene = null, Frogport = null, ChainConveyor = null, PackageItem = null, PackageStyles = null
try {
CreateScene = Java.loadClass('com.simibubi.create.foundation.ponder.CreateSceneBuilder')
Frogport = Java.loadClass('com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlockEntity')
ChainConveyor = Java.loadClass('com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity')
PackageItem = Java.loadClass('com.simibubi.create.content.logistics.box.PackageItem')
PackageStyles = Java.loadClass('com.simibubi.create.content.logistics.box.PackageStyles')
} catch (e) {
console.warn('[createrp] Create classes unavailable for Ponder animations: ' + e)
}
// один крок: підпис біля точки й пауза, поки його читають
function say(scene, ticks, text, pos, colour, keyframe) {
const t = scene.text(ticks, text, pos).placeNearTarget()
if (colour) t.colored(colour)
if (keyframe) t.attachKeyFrame()
scene.idle(ticks + 10)
}
// Create's own kinetic helper. In KubeJS `world` is a property, not a method; and Rhino rejects a
// const/let declared inside try on a second call, so there are no declarations in the try at all.
function kineticWorld(scene) {
var builder = new CreateScene(scene)
return typeof builder.world === 'function' ? builder.world() : builder.world
}
function setSpeed(scene, sel, speed) {
if (!CreateScene) return
try {
kineticWorld(scene).setKineticSpeed(sel, speed)
} catch (e) {
console.warn('[createrp] setKineticSpeed: ' + e)
}
}
// ---- мережа ланцюгів (схематика Create «Transporting packages between Frogports», 9x9) --------
const FROG_STRUCTURE = 'create:high_logistics/package_frogport'
const CONV1 = [1, 4, 7], CONV2 = [7, 4, 7]
const FROM_FROG = [5, 2, 2], TO_FROG = [2, 2, 5]
function addressedBox(address) {
const box = PackageStyles.getDefaultBox().copy()
PackageItem.addAddress(box, address)
return box
}
// посилки, що крутяться на одному вузлі ланцюга, їдуть до іншого (Create: boxTransfer)
function chainTransfer(scene, util, to, from) {
scene.world.modifyBlockEntity(util.grid.at(from[0], from[1], from[2]), ChainConveyor, be => {
var it = be.getLoopingPackages().iterator()
while (it.hasNext()) {
var p = it.next()
p.chainPosition = 0
be.addTravellingPackage(p, util.grid.at(to[0] - from[0], to[1] - from[1], to[2] - from[2]))
it.remove()
}
})
}
// посилка з адресою їде ланцюгами від пакужаби (5,2,2) до пакужаби (2,2,5)
function shipOnChains(scene, util, address) {
if (!Frogport) {
scene.overlay.showBigLine(PonderPalette.OUTPUT, [5.5, 3, 2.5], [2.5, 3, 5.5], 140)
scene.idle(150)
return
}
const box = addressedBox(address)
scene.world.modifyBlockEntity(util.grid.at(FROM_FROG[0], FROM_FROG[1], FROM_FROG[2]), Frogport, be => be.startAnimation(box, true))
scene.idle(95)
chainTransfer(scene, util, CONV1, CONV2)
scene.idle(45)
scene.world.modifyBlockEntity(util.grid.at(CONV1[0], CONV1[1], CONV1[2]), ChainConveyor, be => be.getLoopingPackages().clear())
scene.world.modifyBlockEntity(util.grid.at(TO_FROG[0], TO_FROG[1], TO_FROG[2]), Frogport, be => be.startAnimation(box, false))
scene.idle(15)
}
// мережа з'являється так само, як у Create
function showChainNetwork(scene, util) {
scene.configureBasePlate(0, 0, 9)
scene.scaleSceneView(0.75)
scene.setSceneOffsetY(-1)
scene.world.showSection(util.select.layer(0).substract(util.select.position(9, 0, 1)), Direction.UP)
scene.idle(10)
scene.world.showSection(util.select.position(2, 1, 8), Direction.SOUTH)
scene.idle(2)
scene.world.showSection(util.select.fromTo(1, 1, 7, 1, 3, 7), Direction.DOWN)
scene.idle(2)
scene.world.showSection(util.select.fromTo(7, 1, 7, 7, 3, 7), Direction.DOWN)
scene.idle(2)
scene.world.showSection(util.select.fromTo(7, 1, 1, 7, 3, 1), Direction.DOWN)
scene.idle(5)
scene.world.showSection(util.select.position(1, 4, 7), Direction.DOWN)
scene.world.showSection(util.select.position(7, 4, 7), Direction.DOWN)
scene.world.showSection(util.select.position(7, 4, 1), Direction.DOWN)
scene.idle(20)
}
function showRightSide(scene, util) { // пакувальник, сховище й пакужаба праворуч (5..7, z=2)
scene.world.showSection(util.select.fromTo(7, 1, 2, 5, 1, 2), Direction.DOWN)
scene.world.showSection(util.select.position(5, 1, 3), Direction.DOWN)
scene.idle(5)
scene.world.showSection(util.select.position(5, 2, 2), Direction.DOWN)
scene.idle(15)
}
function showLeftSide(scene, util) { // пакужаба з пакувальником ліворуч (2, z=5)
scene.world.showSection(util.select.position(2, 1, 5), Direction.SOUTH)
scene.world.showSection(util.select.fromTo(2, 1, 4, 0, 1, 4), Direction.DOWN)
scene.world.showSection(util.select.position(3, 1, 5), Direction.DOWN)
scene.idle(5)
scene.world.showSection(util.select.position(2, 2, 5), Direction.DOWN)
scene.idle(15)
}
// ---------------------------------------------------------------------------------------------
// 1. Термінал держави
function terminalScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([2, 1, 2], 'computercraft:computer_advanced')
scene.world.setBlocks([1, 1, 3, 3, 2, 3], 'computercraft:monitor_advanced')
scene.idle(10)
scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(15)
scene.showControls(60, [2.5, 2, 2.5], 'down').rightClick()
say(scene, 70, 'Будь-який комп\'ютер — термінал держави', [2.5, 1.5, 2.5], null, true)
say(scene, 60, 'Набери rp і натисни Enter', [2.5, 1.5, 2.5])
say(scene, 70, 'Увійди: свій нік і пароль', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Першого разу термінал попросить створити пароль', [2.5, 1.5, 2.5])
say(scene, 60, 'Стій поруч — здалеку не пустить', [2.5, 1.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Тут усе: рахунок, бізнес, ціни, магазин, земля, робота, банк', [2.5, 1.5, 2.5], null, true)
scene.world.showSection([1, 1, 3, 3, 2, 3], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Додай монітор — і набери prices metal', [2, 2.5, 3], PonderPalette.BLUE, true)
say(scene, 60, 'Вийде табло цін держави', [2, 2.5, 3])
}
// ---------------------------------------------------------------------------------------------
// 2. Продаж державі
function sellScene(scene, util) {
showChainNetwork(scene, util)
say(scene, 70, 'Держава купує все, що ти добуваєш і виробляєш', [4, 4.5, 4], null, true)
say(scene, 70, 'Товар їде до неї посилками по ланцюгах', [4, 4.5, 7])
showRightSide(scene, util)
scene.world.showSection(util.select.position(4, 1, 2), Direction.EAST)
scene.idle(10)
say(scene, 70, 'Твій бізнес: сховище, пакувальник і пакужаба', [5.5, 2.5, 2.5], null, true)
say(scene, 80, 'На пакувальник — табличка з адресою gov-…', [4.5, 1.5, 2.5], PonderPalette.BLUE)
say(scene, 70, 'Адресу дає термінал: Бізнес → Адреса продажу', [4.5, 1.5, 2.5])
showLeftSide(scene, util)
say(scene, 80, 'Це державна пакужаба — вона приймає всі адреси gov-…', [2.5, 2.5, 5.5], PonderPalette.BLUE, true)
scene.text(60, 'Посилка їде ланцюгами…', [6.78, 4.37, 3.5]).placeNearTarget()
shipOnChains(scene, util, 'gov-a1b2c3')
say(scene, 70, '…і гроші приходять на рахунок бізнесу', [2.5, 2.5, 5.5], PonderPalette.GREEN, true)
say(scene, 70, 'Багато однакового товару — ціна падає', [4, 4.5, 4], PonderPalette.RED)
say(scene, 60, 'Дефіцит — ціна росте', [4, 4.5, 4], PonderPalette.GREEN)
say(scene, 60, 'Ціни дивись на табло або в терміналі', [4, 4.5, 4])
}
// ---------------------------------------------------------------------------------------------
// 3. Покупки в держави
function buyScene(scene, util) {
showChainNetwork(scene, util)
showRightSide(scene, util)
say(scene, 70, 'Це державний склад', [5.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 80, 'Держава продає імпорт: алмази, незерит, елітри, ліцензії', [5.5, 2.5, 2.5])
say(scene, 60, 'Купуй у терміналі: Магазин держави', [4, 4.5, 4])
showLeftSide(scene, util)
say(scene, 70, 'Це твоя пакужаба, напр. «Склад Олі»', [2.5, 2.5, 5.5], null, true)
say(scene, 70, 'Цю назву впиши як адресу доставки', [2.5, 2.5, 5.5], PonderPalette.BLUE)
shipOnChains(scene, util, 'Склад Олі')
say(scene, 70, 'Посилка приїжджає сама', [2.5, 2.5, 5.5], PonderPalette.GREEN, true)
say(scene, 70, 'Пакувальник розпакує її у скриню', [3.5, 1.5, 5.5])
say(scene, 70, 'Не доїхала — гроші повернуться самі', [4, 4.5, 4], PonderPalette.RED)
}
// ---------------------------------------------------------------------------------------------
// 4. Гроші й банк
function moneyScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([2, 1, 2], 'computercraft:computer_advanced')
scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Твої гроші лежать на рахунку в банку', [2.5, 1.5, 2.5], null, true)
say(scene, 60, 'Баланс і перекази — у терміналі', [2.5, 1.5, 2.5])
const coins = ['numismatics:spur', 'numismatics:bevel', 'numismatics:sprocket', 'numismatics:cog']
for (let i = 0; i < coins.length; i++) {
scene.world.createItemEntity([1 + i, 3, 1], [0, 0.1, 0], coins[i])
scene.idle(5)
}
scene.idle(10)
say(scene, 70, 'Монети — це готівка', [2.5, 2, 1.5], PonderPalette.GREEN, true)
say(scene, 70, 'Зняти: /cash withdraw <сума>', [2.5, 2, 1.5])
say(scene, 70, 'Покласти: монети в руку і /cash deposit', [2.5, 2, 1.5])
say(scene, 70, 'Банк дає кредити бізнесу', [2.5, 1.5, 2.5], PonderPalette.BLUE, true)
say(scene, 60, 'А вклад щодня приносить відсоток', [2.5, 1.5, 2.5])
say(scene, 80, 'Пропустив 3 платежі по кредиту — рахунок заморожено', [2.5, 1.5, 2.5], PonderPalette.RED)
}
// ---------------------------------------------------------------------------------------------
// 5. Земля й надра
function landScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([1, 1, 1], 'minecraft:oak_fence')
scene.world.setBlocks([3, 1, 1], 'minecraft:oak_fence')
scene.world.setBlocks([1, 1, 3], 'minecraft:oak_fence')
scene.world.setBlocks([3, 1, 3], 'minecraft:oak_fence')
scene.world.setBlocks([2, 1, 2], 'minecraft:iron_ore')
scene.idle(10)
say(scene, 70, 'Нічия земля належить державі', [2.5, 1, 2.5], null, true)
scene.overlay.showOutline(PonderPalette.GREEN, 'plot', util.select.fromTo(0, 0, 0, 4, 0, 4), 150)
scene.world.showSection([1, 1, 1, 3, 1, 3], Direction.DOWN)
say(scene, 70, 'Будуй на своїй ділянці', [2.5, 1.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Орендуй або купи її в терміналі: Земля', [2.5, 1.5, 2.5])
say(scene, 70, 'На ділянці над хотбаром видно її назву', [2.5, 1.5, 2.5])
say(scene, 70, 'Чужі тут не ламають, а твої працівники — можуть', [2.5, 1.5, 2.5])
scene.overlay.showOutline(PonderPalette.RED, 'ore', util.select.position(2, 1, 2), 150)
say(scene, 70, 'Руду копають лише з концесією', [2.5, 1.5, 2.5], PonderPalette.RED, true)
say(scene, 70, 'Купи її в терміналі: Земля → Купити концесію', [2.5, 1.5, 2.5])
say(scene, 70, 'Бури Create теж копають лише за концесією', [2.5, 1.5, 2.5])
say(scene, 70, 'Найкращі ділянки держава продає на аукціоні', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Ставки — в терміналі: Земля → Аукціони', [2.5, 2.5, 2.5])
say(scene, 80, 'За землю платиш щодня. Не платив 3 дні — ділянку забирають', [2.5, 2.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 6. Робота: ринок праці й пошта
function jobsScene(scene, util) {
scene.showBasePlate()
scene.idle(10)
scene.world.createEntity('minecraft:villager', [1, 1, 2.5])
scene.idle(10)
say(scene, 70, 'Немає роботи? Стань на ринок праці', [2.5, 2.5, 2.5], null, true)
say(scene, 70, 'Держава щодня платить допомогу, якщо ти грав', [2.5, 2.5, 2.5])
scene.showControls(60, [1, 2.3, 2.5], 'down').rightClick()
say(scene, 70, 'Хочеш більше — працюй поштарем', [1, 2.5, 2.5], PonderPalette.BLUE, true)
scene.world.createItemEntity([1.5, 2, 2.5], [0.05, 0.25, 0], PACKAGE)
scene.world.createItemEntity([1.5, 2, 2.5], [0.03, 0.3, 0.03], 'minecraft:compass')
scene.idle(20)
say(scene, 70, 'NPC пошти дасть посилку й компас', [2, 1.5, 2.5], null, true)
say(scene, 70, 'Компас веде до адресата', [2, 1.5, 2.5])
say(scene, 70, 'ПКМ компасом — мітка на місці', [2, 1.5, 2.5], PonderPalette.BLUE)
scene.world.createEntity('minecraft:villager', [4, 1, 2.5])
scene.overlay.showBigLine(PonderPalette.OUTPUT, [1.5, 1.2, 2.5], [4, 1.2, 2.5], 100)
say(scene, 70, 'Віддай посилку адресату — і отримаєш гроші', [4, 2.5, 2.5], PonderPalette.GREEN, true)
say(scene, 60, 'Що далі везти — то більше платять', [4, 2.5, 2.5])
say(scene, 60, 'На доставку — 2 ігрові дні', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Або наймися в бізнес: термінал → Бізнес', [2.5, 2.5, 2.5], null, true)
}
// ---------------------------------------------------------------------------------------------
// 8. Вантажник
function cargoScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([0, 1, 3, 4, 1, 3], 'minecraft:rail[shape=east_west]')
scene.idle(10)
scene.world.createEntity('minecraft:villager', [1, 1, 1])
scene.idle(10)
say(scene, 70, 'Вантажник возить будматеріали на будови', [1, 2.5, 1], null, true)
scene.showControls(50, [1, 2.3, 1], 'down').rightClick()
scene.idle(20)
for (let i = 0; i < 5; i++) {
scene.world.createItemEntity([1.5, 2, 1.5], [0.04 * (i - 2), 0.25, 0.06], PACKAGE)
scene.idle(4)
}
scene.idle(10)
say(scene, 70, 'Диспетчер вантажів дасть від 4 до 8 ящиків', [1.5, 1.5, 1.5], PonderPalette.BLUE, true)
say(scene, 70, 'Ящики важкі: з ними ти ледве йдеш', [1.5, 1.5, 1.5], PonderPalette.RED)
scene.world.showSection([0, 1, 3, 4, 1, 3], Direction.DOWN)
scene.world.createEntity('minecraft:minecart', [1.5, 1, 3.5])
scene.idle(15)
say(scene, 70, 'Візьми візок, поїзд чи інший транспорт', [1.5, 1.5, 3.5], null, true)
scene.world.createEntity('minecraft:villager', [4, 1, 1])
scene.overlay.showBigLine(PonderPalette.OUTPUT, [1.5, 1.2, 3.5], [4, 1.2, 1.5], 100)
say(scene, 70, 'Компас веде до прораба на будові', [4, 2.5, 1], null, true)
say(scene, 70, 'Віддай йому всі ящики — і отримаєш гроші', [4, 2.5, 1], PonderPalette.GREEN)
say(scene, 70, 'Платять більше, ніж на пошті: за відстань і кожен ящик', [2.5, 2.5, 2.5], PonderPalette.GREEN)
say(scene, 60, 'На доставку — 3 ігрові дні', [2.5, 2.5, 2.5], PonderPalette.RED)
}
// ---------------------------------------------------------------------------------------------
// 9. Дорожник
function roadsScene(scene, util) {
const CORRIDOR = util.select.fromTo(0, 0, 1, 4, 0, 3)
scene.showBasePlate()
scene.idle(10)
scene.overlay.showOutline(PonderPalette.BLUE, 'corridor', CORRIDOR, 200)
say(scene, 70, 'Це транспортний коридор держави', [2.5, 1, 2], PonderPalette.BLUE, true)
say(scene, 70, 'Будувати й ламати тут може лише дорожник', [2.5, 1, 2], PonderPalette.RED)
scene.world.createEntity('minecraft:villager', [0.5, 1, 0.5])
scene.idle(10)
scene.showControls(50, [0.5, 2.3, 0.5], 'down').rightClick()
say(scene, 70, 'Стань дорожником: дорожній майстер або термінал → Робота', [0.5, 2.5, 0.5], null, true)
for (let x = 0; x < 5; x++) {
scene.world.setBlocks([x, 1, 2], 'minecraft:stone_bricks')
scene.world.showSection([x, 1, 2], Direction.DOWN)
if (x === 0) scene.showControls(40, [0.5, 1.5, 2.5], 'down').rightClick().withItem('minecraft:stone_bricks')
scene.idle(8)
}
scene.idle(10)
say(scene, 70, 'Кожен новий блок дороги — 0,3 ¤', [2.5, 1.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Гроші — в кінці ігрового дня, до 300 блоків на день', [2.5, 1.5, 2.5])
say(scene, 70, 'Перекласти той самий блок вдруге — не оплачується', [2.5, 1.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Покриття: кам\'яна цегла, гладкий камінь, андезит, плитка Create', [2.5, 1.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 10. Шахтар
function minerScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([1, 1, 1, 3, 2, 3], 'minecraft:stone')
scene.world.setBlocks([2, 1, 1], 'minecraft:iron_ore')
scene.world.setBlocks([1, 2, 1], 'minecraft:coal_ore')
scene.world.setBlocks([3, 1, 1], 'minecraft:copper_ore')
scene.world.setBlocks([2, 2, 1], 'minecraft:stone')
scene.idle(10)
scene.world.showSection([1, 1, 1, 3, 2, 3], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Це державна шахта', [2.5, 2.5, 1], PonderPalette.BLUE, true)
say(scene, 70, 'Копати тут можуть лише шахтарі', [2.5, 2.5, 1], PonderPalette.RED)
say(scene, 70, 'Найнятися: бригадир шахти або термінал → Робота', [2.5, 2.5, 1])
scene.showControls(40, [2.5, 1.5, 1], 'right').leftClick().withItem('minecraft:iron_pickaxe')
scene.idle(30)
scene.world.destroyBlock([2, 1, 1])
scene.idle(15)
say(scene, 70, 'Руда одразу йде державі — без дропу', [2.5, 1.5, 1], null, true)
scene.world.createItemEntity([2.5, 2, 0.8], [0, 0.2, 0], 'numismatics:spur')
say(scene, 70, 'Тобі — оплата за кожен блок', [2.5, 1.5, 1], PonderPalette.GREEN)
say(scene, 70, 'Алмази й золото дорожчі за вугілля', [2.5, 1.5, 1])
say(scene, 70, 'Гроші — в кінці ігрового дня, до 200 блоків на день', [2.5, 2.5, 2])
scene.world.setBlocks([2, 1, 1], 'minecraft:iron_ore')
scene.idle(10)
say(scene, 70, 'Викопана руда згодом виростає знову', [2.5, 1.5, 1], PonderPalette.BLUE, true)
}
// ---------------------------------------------------------------------------------------------
// 11. Оператор заводу
function operatorScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([1, 1, 2], 'minecraft:blast_furnace')
scene.world.setBlocks([2, 1, 2], 'create:andesite_casing')
scene.world.setBlocks([3, 1, 2], 'create:mechanical_press')
scene.idle(10)
scene.world.showSection([1, 1, 2, 3, 1, 2], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'Це державний завод', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Оператор стежить, щоб він не зупинявся', [2.5, 2.5, 2.5])
say(scene, 70, 'Найнятися: майстер заводу або термінал → Робота', [2.5, 2.5, 2.5])
scene.overlay.showOutline(PonderPalette.RED, 'broken', util.select.position(1, 1, 2), 220)
say(scene, 70, 'Точка задиміла — щось зламалось', [1.5, 2, 2.5], PonderPalette.RED, true)
scene.showControls(50, [1.5, 2, 2.5], 'down').rightClick().withItem('minecraft:coal')
say(scene, 70, 'Немає палива — клацни з вугіллям у руці', [1.5, 2, 2.5])
scene.showControls(50, [1.5, 2, 2.5], 'down').rightClick()
say(scene, 70, 'Затор — прочисть порожньою рукою', [1.5, 2, 2.5])
scene.showControls(50, [1.5, 2, 2.5], 'down').rightClick().withItem('create:wrench')
say(scene, 70, 'Розхиталась деталь — підтягни ключем', [1.5, 2, 2.5])
scene.world.createItemEntity([1.5, 2.2, 2.5], [0, 0.2, 0], 'numismatics:spur')
say(scene, 70, 'Кожен ремонт — 2 ¤ у кінці ігрового дня', [2.5, 2.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Поломки стаються, лише поки ти на зміні поруч', [2.5, 2.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 12. Державні службовці
function officialsScene(scene, util) {
scene.showBasePlate()
scene.idle(10)
scene.world.createEntity('minecraft:villager', [2.5, 1, 2.5])
scene.idle(10)
scene.showControls(50, [2.5, 2.3, 2.5], 'down').rightClick()
say(scene, 70, 'Державні службовці відповідають на запитання', [2.5, 2.5, 2.5], null, true)
say(scene, 70, 'Клацни по службовцю й обери репліку', [2.5, 2.5, 2.5])
say(scene, 70, 'Провідник на спавні пояснить, з чого почати', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Він же дасть перше завдання з підйомними', [2.5, 2.5, 2.5], PonderPalette.GREEN)
scene.world.createEntity('minecraft:villager', [0.5, 1, 0.5])
scene.world.createEntity('minecraft:villager', [4.5, 1, 0.5])
scene.world.createEntity('minecraft:villager', [0.5, 1, 4.5])
scene.world.createEntity('minecraft:villager', [4.5, 1, 4.5])
scene.idle(15)
say(scene, 70, 'Ратуша: бізнес, ділянки, аукціони', [0.5, 2.5, 0.5], null, true)
say(scene, 70, 'Міністерство: тендери й частки ринку', [4.5, 2.5, 0.5])
say(scene, 70, 'Банк: рахунок, кредити, вклад', [0.5, 2.5, 4.5])
say(scene, 70, 'Центр зайнятості: робота й допомога', [4.5, 2.5, 4.5])
say(scene, 80, 'Відповідь службовця приходить у чат', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 80, 'Щоб щось оформити — іди до термінала', [2.5, 2.5, 2.5])
}
// ---------------------------------------------------------------------------------------------
// 7. Продаж енергії державі: державна підстанція
function energyScene(scene, util) {
const STATE = util.select.fromTo(3, 1, 0, 4, 1, 4)
const BUSINESS = util.select.fromTo(0, 1, 2, 1, 1, 2)
const ALL = util.select.fromTo(0, 1, 0, 4, 1, 4)
scene.showBasePlate()
// генератор бізнесу → вал → лічильник → коробка передач підстанції → три вентилятори держави
scene.world.setBlocks([0, 1, 2], 'create:water_wheel[facing=east]')
scene.world.setBlocks([1, 1, 2], 'create:shaft[axis=x]')
scene.world.setBlocks([2, 1, 2], 'create:stressometer[facing=south,axis_along_first=true]')
scene.world.setBlocks([3, 1, 2], 'create:gearbox')
scene.world.setBlocks([4, 1, 2], 'create:encased_fan[facing=east]')
scene.world.setBlocks([3, 1, 1], 'create:shaft[axis=z]')
scene.world.setBlocks([3, 1, 3], 'create:shaft[axis=z]')
scene.world.setBlocks([3, 1, 0], 'create:encased_fan[facing=north]')
scene.world.setBlocks([3, 1, 4], 'create:encased_fan[facing=south]')
scene.idle(10)
scene.world.showSection(STATE, Direction.DOWN)
scene.idle(15)
scene.overlay.showOutline(PonderPalette.BLUE, 'state', STATE, 90)
say(scene, 80, 'Це державна підстанція: її машинам потрібна сила', [3.5, 2.5, 2.5], PonderPalette.BLUE, true)
scene.world.showSection([2, 1, 2], Direction.DOWN)
scene.idle(10)
say(scene, 70, 'На вході стоїть лічильник — стресометр', [2.5, 1.8, 2.5], null, true)
say(scene, 70, 'Держава закріплює його за твоїм бізнесом', [2.5, 1.8, 2.5])
scene.world.showSection(BUSINESS, Direction.EAST)
scene.idle(15)
scene.overlay.showOutline(PonderPalette.GREEN, 'biz', BUSINESS, 90)
say(scene, 70, 'Підведи вал від свого генератора', [0.5, 1.5, 2.5], PonderPalette.GREEN, true)
setSpeed(scene, ALL, 32)
scene.idle(10)
say(scene, 70, 'Машини держави закрутились', [3.5, 2.5, 2.5])
for (let i = 0; i < 3; i++) {
scene.world.createItemEntity([2.5, 2.2, 2.5], [0, 0.2, 0], 'numismatics:spur')
scene.idle(12)
}
say(scene, 70, 'Щохвилини держава платить твоєму бізнесу', [2.5, 2.5, 2.5], PonderPalette.GREEN, true)
say(scene, 70, 'Платить лише за силу, яку забирають її машини', [2.5, 2.5, 2.5])
say(scene, 70, 'Приклад: 2048 SU — приблизно 1 ¤ за хвилину', [2.5, 2.5, 2.5], PonderPalette.BLUE)
setSpeed(scene, ALL, 0)
scene.idle(10)
say(scene, 70, 'Сили не вистачає — машини стоять, грошей немає', [1.5, 1.5, 2.5], PonderPalette.RED, true)
setSpeed(scene, ALL, 32)
say(scene, 80, 'Хочеш продавати енергію — знайди підстанцію й підключись', [2.5, 2.5, 2.5], null, true)
}
// ---------------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------
// 13. Ефір: дві школи магії в державі
function arcaneScene(scene, util) {
scene.showBasePlate()
scene.world.setBlocks([2, 1, 2], 'minecraft:budding_amethyst')
scene.world.setBlocks([2, 2, 2], 'minecraft:amethyst_cluster')
scene.world.setBlocks([0, 1, 3], 'ars_nouveau:source_jar')
scene.world.setBlocks([4, 1, 3], 'hexcasting:slate')
scene.idle(10)
scene.world.showSection([2, 1, 2, 2, 2, 2], Direction.DOWN)
scene.idle(15)
say(scene, 70, 'В аметистових жилах накопичується ефір', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Держава вважає ефір ресурсом надр', [2.5, 2.5, 2.5])
say(scene, 70, 'Його вивчає Ефірна палата', [2.5, 2.5, 2.5])
scene.world.showSection([0, 1, 3, 0, 1, 3], Direction.DOWN)
scene.idle(15)
scene.showControls(50, [0.5, 2, 3.5], 'down').withItem('ars_nouveau:novice_spell_book')
say(scene, 70, 'Плетільники збирають ефір у джерело', [0.5, 2, 3.5], PonderPalette.GREEN, true)
say(scene, 70, 'Заклинання складають у книзі', [0.5, 2, 3.5])
scene.world.showSection([4, 1, 3, 4, 1, 3], Direction.DOWN)
scene.idle(15)
scene.showControls(50, [4.5, 1.5, 3.5], 'down').withItem('hexcasting:staff/oak')
say(scene, 70, 'Гексографи креслять візерунки посохом', [4.5, 1.5, 3.5], PonderPalette.GREEN, true)
say(scene, 70, 'Їхнє паливо — аметистовий пил', [4.5, 1.5, 3.5])
scene.world.createItemEntity([2.5, 3.5, 2.5], [0, 0.1, 0], 'ars_nouveau:source_gem')
scene.idle(10)
say(scene, 70, 'Держава купує джерело, пил і аметист', [2.5, 2.5, 2.5], PonderPalette.BLUE, true)
say(scene, 70, 'Ціни — на табло, категорія «Ефір»', [2.5, 2.5, 2.5])
say(scene, 80, 'Торгуєш ефірним — купи ліцензію в магазині', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 70, 'Закон той самий, що й для машин', [2.5, 2.5, 2.5], null, true)
say(scene, 70, 'Руду без концесії заклинання не візьме', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 70, 'Посилки й вантажі не телепортують', [2.5, 2.5, 2.5], PonderPalette.RED)
say(scene, 80, 'Решту розкаже магістр Ефірної палати', [2.5, 2.5, 2.5], PonderPalette.BLUE)
}
Ponder.tags(event => {
event.createTag('kubejs:createrp', 'kubejs:citizen_guide', 'Держава Create RP',
'Як жити й заробляти в державній економіці',
['kubejs:citizen_guide', 'create:package_frogport', 'computercraft:computer_advanced', 'computercraft:computer_normal', 'computercraft:monitor_advanced', 'create:stressometer', 'ars_nouveau:source_gem', 'hexcasting:amethyst_dust'])
})
Ponder.registry(event => {
event.create('kubejs:citizen_guide')
.scene('guide_officials', 'Державні службовці', officialsScene)
.scene('guide_terminal', 'Термінал держави', terminalScene)
.scene('guide_sell', 'Продаж державі', FROG_STRUCTURE, sellScene)
.scene('guide_buy', 'Покупки в держави', FROG_STRUCTURE, buyScene)
.scene('guide_energy', 'Продаж енергії державі', energyScene)
.scene('guide_money', 'Гроші й банк', moneyScene)
.scene('guide_land', 'Земля й надра', landScene)
.scene('guide_jobs', 'Робота: ринок праці й пошта', jobsScene)
.scene('guide_cargo', 'Робота: вантажник', cargoScene)
.scene('guide_roads', 'Робота: дорожник', roadsScene)
.scene('guide_miner', 'Робота: шахтар', minerScene)
.scene('guide_operator', 'Робота: оператор заводу', operatorScene)
.scene('guide_arcane', 'Ефір і магія', arcaneScene)
event.create('create:package_frogport')
.scene('frogport_sell', 'Create RP: продаж державі', FROG_STRUCTURE, sellScene)
.scene('frogport_buy', 'Create RP: покупки в держави', FROG_STRUCTURE, buyScene)
event.create(['ars_nouveau:source_gem', 'ars_nouveau:novice_spell_book', 'hexcasting:amethyst_dust', 'minecraft:amethyst_shard'])
.scene('arcane_law', 'Create RP: ефір і магія', arcaneScene)
event.create('create:stressometer')
.scene('stressometer_energy', 'Create RP: продаж енергії державі', energyScene)
event.create(['computercraft:computer_advanced', 'computercraft:computer_normal'])
.scene('computer_terminal', 'Create RP: термінал держави', terminalScene)
event.create('computercraft:monitor_advanced')
.scene('monitor_terminal', 'Create RP: термінал і табло цін', terminalScene)
})
+12
View File
@@ -0,0 +1,12 @@
// Create RP — предмети збірки. Цей файл має бути ОДНАКОВИМ у серверній і клієнтській збірках:
// реєстр предметів сервера й клієнта мусить збігатися.
StartupEvents.registry('item', event => {
// «Довідник громадянина»: навести в інвентарі й затиснути W — туторіал Ponder (клієнтський client_scripts/createrp_ponder.js)
event.create('citizen_guide')
.displayName('Довідник громадянина')
.texture('minecraft:item/knowledge_book')
.maxStackSize(1)
.glow(true)
.tooltip('§7Наведи в інвентарі й затисни §fW§7 — як у Create')
})
+13
View File
@@ -0,0 +1,13 @@
name = "Ars Nouveau"
filename = "ars_nouveau-1.21.1-5.13.3.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/TKB6INcv/versions/yWDnir1o/ars_nouveau-1.21.1-5.13.3.jar"
hash-format = "sha512"
hash = "30f188cfc932bd58c95740488732df7e92d98e7345e271b1a223e41a43fc3dd52284d0ff07fc3e8a95e914082f899394eff3a0f37c174d317e6e37fb68b083df"
[update]
[update.modrinth]
mod-id = "TKB6INcv"
version = "yWDnir1o"
+13
View File
@@ -0,0 +1,13 @@
name = "Better Advanced Tooltips"
filename = "better-advanced-tooltips-2101.1.0-build.5.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/iHLDc0eo/versions/uPFbnD32/better-advanced-tooltips-2101.1.0-build.5.jar"
hash-format = "sha512"
hash = "05b5cdad948d1735eab7a67a16aaf32814678c392014ec2ada61b8341c0ed1c1ac181cab1de9da3f2c4632592f4a1a5db254bd0543e6778897c8ccd260894142"
[update]
[update.modrinth]
mod-id = "iHLDc0eo"
version = "uPFbnD32"
@@ -0,0 +1,13 @@
name = "Create Aeronautics and Connected Fluid Vessel Compatability"
filename = "aeroconnectedfluidvessel-1.0.0.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/59EBKVqI/versions/IAyRzWB7/aeroconnectedfluidvessel-1.0.0.jar"
hash-format = "sha512"
hash = "c3e509644350e7028d5c6be057925f793cea5a16086d8896d21fc2fabe20a851286ee40dbf02503466fc5c8a17fb01b445e28f7dea006a22f6e8b1dd495b9ae7"
[update]
[update.modrinth]
mod-id = "59EBKVqI"
version = "IAyRzWB7"
+13
View File
@@ -0,0 +1,13 @@
name = "Create: Central Kitchen"
filename = "create-central-kitchen-2.4.0.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/btq68HMO/versions/TUJIHmUh/create-central-kitchen-2.4.0.jar"
hash-format = "sha512"
hash = "adcdb5a85b2dd727fa2b0563aa9e73d26b58ee3ae57192e049f0c2a1e4a878dc9d07fe20589f6e52e6f4be2ba1bb5ab3a64f5fcf5f1f9a42b9518e7c2380fd23"
[update]
[update.modrinth]
mod-id = "btq68HMO"
version = "TUJIHmUh"
+13
View File
@@ -0,0 +1,13 @@
name = "Create: Connected"
filename = "create_connected-1.3.3-mc1.21.1.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/Vg5TIO6d/versions/Xe7EqzfQ/create_connected-1.3.3-mc1.21.1.jar"
hash-format = "sha512"
hash = "485675693980a266611669857fa9cd348e2a29140b87bf0a8ab3e13c3591422cceaa36b7a2eb90084d35ec1868c8eec9f924383bb4dada2dddcb72e9f09361b0"
[update]
[update.modrinth]
mod-id = "Vg5TIO6d"
version = "Xe7EqzfQ"
+13
View File
@@ -0,0 +1,13 @@
name = "Create Stuff 'N Additions"
filename = "create-stuff-additions1.21.1_v2.1.4b.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/aq9qUUQG/versions/gMWQ1LX9/create-stuff-additions1.21.1_v2.1.4b.jar"
hash-format = "sha512"
hash = "75cd8a0a2f898b3599cb267c26c02691e53f8ca8f6c6c4f16d1a82db8fea4494988f163559cc3a8b471683d5b52353ba065def8846a7ff2073bddf42e68b5e7d"
[update]
[update.modrinth]
mod-id = "aq9qUUQG"
version = "gMWQ1LX9"
@@ -0,0 +1,13 @@
name = "Create Stuff 'N Additions x Sable & Aeronautics Compat"
filename = "SableStuffAdditionsCompat v1.0.3-1.21.1.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/gsAqDfOu/versions/oOYLBz7M/SableStuffAdditionsCompat%20v1.0.3-1.21.1.jar"
hash-format = "sha512"
hash = "f3ab35c1dc840bb42f05ba7d4170169e8db141f67e6e5a5e0b33b0e692c5b86c96ba0593443436bd254598596a27c1643fad39e476329bcc676e768a9ca9ce18"
[update]
[update.modrinth]
mod-id = "gsAqDfOu"
version = "oOYLBz7M"
+13
View File
@@ -0,0 +1,13 @@
name = "CreateBetterFps"
filename = "createbetterfps-1.21.1-1.1.5.jar"
side = "client"
[download]
url = "https://cdn.modrinth.com/data/lMYIHZNH/versions/dxmPYimo/createbetterfps-1.21.1-1.1.5.jar"
hash-format = "sha512"
hash = "d98deec79eefb8e0c8ddda7def8a46f4c66402a213da5242f8ff029f43b844e68914fa31af3c8aed646d131ee9bfac3a63032df399b1f76cc99b5c312f32df24"
[update]
[update.modrinth]
mod-id = "lMYIHZNH"
version = "dxmPYimo"
+13
View File
@@ -0,0 +1,13 @@
name = "CustomNPCs-Unofficial"
filename = "CustomNPCs-Unofficial-NeoForge-1.21.1.20241226.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/vFAmwl6B/versions/5gdSEvLv/CustomNPCs-Unofficial-NeoForge-1.21.1.20241226.jar"
hash-format = "sha512"
hash = "b310a567d938480ed82b285da26e8b5e6925b2450fbcb4fb2ce4bc654465b4f2bee953bfcb32ac0a8e5a0b626bbe2ac13d89c10e59d3d04b8ef996465c78a8bf"
[update]
[update.modrinth]
mod-id = "vFAmwl6B"
version = "5gdSEvLv"
-13
View File
@@ -1,13 +0,0 @@
name = "DAP ur Homies!"
filename = "DAP ur HOMIE (Bully ur Homie).jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/V3QHTHDA/versions/W02uSI93/DAP%20ur%20HOMIE%20%28Bully%20ur%20Homie%29.jar"
hash-format = "sha512"
hash = "e4e519e7d8f67e7e5e3ac506224e2e51258e788fdd374d508132bf867dd11025e756d548ceb103ed90caaac6f668886174fff84314fb3e8c011821c3978d86e5"
[update]
[update.modrinth]
mod-id = "V3QHTHDA"
version = "W02uSI93"
+13
View File
@@ -0,0 +1,13 @@
name = "Geckolib"
filename = "geckolib-neoforge-1.21.1-4.9.3.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/8BmcQJ2H/versions/Grwn5rUB/geckolib-neoforge-1.21.1-4.9.3.jar"
hash-format = "sha512"
hash = "8dfa5f8c57224a5e34e5098367ea9819ca6dc9c11357cd3062c16da3455c8bd1a483098af7383debc4b9ce8e4d7ab3fdc799b415644eb829da83eb72a7335dfd"
[update]
[update.modrinth]
mod-id = "8BmcQJ2H"
version = "Grwn5rUB"
+13
View File
@@ -0,0 +1,13 @@
name = "KubeJS"
filename = "kubejs-neoforge-2101.7.2-build.377.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/umyGl7zF/versions/THIGFPwf/kubejs-neoforge-2101.7.2-build.377.jar"
hash-format = "sha512"
hash = "fcdbee8790f8f39c106ab4bf606808c9c5bf0f13a41e216207a6fe4d15bf4a5722ce57078781e3a1823e7fdd2928e8e042d104d8ae255a36db8f12a9f46d8089"
[update]
[update.modrinth]
mod-id = "umyGl7zF"
version = "THIGFPwf"
+13
View File
@@ -0,0 +1,13 @@
name = "Open Parties and Claims"
filename = "open-parties-and-claims-neoforge-1.21.1-0.31.6.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/gF3BGWvG/versions/3i48dTzz/open-parties-and-claims-neoforge-1.21.1-0.31.6.jar"
hash-format = "sha512"
hash = "6f8f2d570b6f674a9180576524b3ba507a3ad046ff319353cee50738644bf46c03ca460fb7c6880eed76f07eb2a26a983166d2510951202af86b3e120b743181"
[update]
[update.modrinth]
mod-id = "gF3BGWvG"
version = "3i48dTzz"
-13
View File
@@ -1,13 +0,0 @@
name = "Player Animation Library"
filename = "PlayerAnimationLibNeoforge-1.1.4+mc.1.21.1.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/ha1mEyJS/versions/X11AqKQb/PlayerAnimationLibNeoforge-1.1.4%2Bmc.1.21.1.jar"
hash-format = "sha512"
hash = "d3a07aef209ee113a1df14ef74a9f9adecd4f98d506f7ef801e68ff3557864847bf8e2f46e329e54c2223b4160e4976a5e10f39d2aec4087b9110788b6ff3be8"
[update]
[update.modrinth]
mod-id = "ha1mEyJS"
version = "X11AqKQb"
+13
View File
@@ -0,0 +1,13 @@
name = "Ponder for KubeJS"
filename = "ponderjs-neoforge-1.21.1-2.4.0.jar"
side = "client"
[download]
url = "https://cdn.modrinth.com/data/5A34Stj8/versions/BqhDf7W8/ponderjs-neoforge-1.21.1-2.4.0.jar"
hash-format = "sha512"
hash = "6390c4bf631561c29a76b8b29a496d4b984bf847572940b28e551f2c2e3da4a8fb04b6a82cf98a7935792a7d3485cdc45c76f2bdf7f93799210262ba5f184955"
[update]
[update.modrinth]
mod-id = "5A34Stj8"
version = "BqhDf7W8"
+13
View File
@@ -0,0 +1,13 @@
name = "Rhino"
filename = "rhino-2101.2.8-build.91.jar"
side = "both"
[download]
url = "https://cdn.modrinth.com/data/sk9knFPE/versions/SqkDvOLG/rhino-2101.2.8-build.91.jar"
hash-format = "sha512"
hash = "e3d92f663bc07872a83b0a6474b30a75230e9f92a2844fd98da1842ec9a79712bcb7d8e76574cc11ae3aeceb47f2933c60ddd6cf41f3ad7027bd573623730945"
[update]
[update.modrinth]
mod-id = "sk9knFPE"
version = "SqkDvOLG"
-13
View File
@@ -1,13 +0,0 @@
name = "Sodium Dynamic Lights"
filename = "sodiumdynamiclights-neoforge-1.0.10-1.21.1.jar"
side = "client"
[download]
url = "https://cdn.modrinth.com/data/PxQSWIcD/versions/XI0WLXdn/sodiumdynamiclights-neoforge-1.0.10-1.21.1.jar"
hash-format = "sha512"
hash = "ec19a81cf2dfde255990a457d8f6d7375df53cb94190dce71c4bfe5d5263f4862027ce4aa0af20cb11d56c7c031d5e149b3bdf95bec6343e5bd4552450b14c0a"
[update]
[update.modrinth]
mod-id = "PxQSWIcD"
version = "XI0WLXdn"
-13
View File
@@ -1,13 +0,0 @@
name = "XPlus Autofish (Fabric / Forge / NeoForge)"
filename = "xplus-autofish-1.3.3-neoforged-mc1.21.1.jar"
side = "client"
[download]
url = "https://cdn.modrinth.com/data/2H1rLgy4/versions/nC2iqgow/xplus-autofish-1.3.3-neoforged-mc1.21.1.jar"
hash-format = "sha512"
hash = "e1680e37749e0229972be0feede3d88141c59e04f6bdc66a61238aad950134e132b366f70361a0cf703e132a8bb2b15dc5befa5989caded852e67a2b829ae6f0"
[update]
[update.modrinth]
mod-id = "2H1rLgy4"
version = "nC2iqgow"
+2 -2
View File
@@ -1,12 +1,12 @@
name = "Create RP"
author = "Pinecraft-CreateRP"
version = "0.1.0"
version = "0.12.1"
pack-format = "packwiz:1.1.0"
[index]
file = "index.toml"
hash-format = "sha256"
hash = "82d2822700967bcd03c3e01038401304546e4a1c690ad35d680e38a55742001d"
hash = "10002bb1c03dbdb44e29505dbd8fd94c96071e90ecdc7369873025f33d1cecdd"
[versions]
minecraft = "1.21.1"
+46
View File
@@ -0,0 +1,46 @@
// Adds a Modrinth mod (and its required dependencies, recursively) to this packwiz pack.
// node tools/add-mod.mjs <slug-or-id> [...] → latest NeoForge 1.21.1 version
// node tools/add-mod.mjs <slug>@<version_number> → that exact version
// Writes mods/<slug>.pw.toml, then run: node tools/reindex.mjs
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
const UA = { 'User-Agent': 'Pinecraft-CreateRP/add-mod' };
const api = p => fetch('https://api.modrinth.com/v2' + p, { headers: UA }).then(r => {
if (!r.ok) throw new Error(`${p}: HTTP ${r.status}`);
return r.json();
});
const q = s => JSON.stringify(s);
const existing = new Set(fs.readdirSync(path.join(root, 'mods')).filter(f => f.endsWith('.pw.toml')).map(f => {
const t = fs.readFileSync(path.join(root, 'mods', f), 'utf8');
return (t.match(/^mod-id = "([^"]+)"/m) || [])[1];
}).filter(Boolean));
const sideOf = p => p.server_side === 'unsupported' ? 'client' : p.client_side === 'unsupported' ? 'server' : 'both';
async function add(spec, depth = 0) {
const [ref, wanted] = spec.split('@');
const project = await api(`/project/${ref}`);
const pad = ' '.repeat(depth);
if (existing.has(project.id)) { console.log(`${pad}= ${project.title} — already in the pack`); return; }
const versions = await api(`/project/${project.id}/version?loaders=${encodeURIComponent('["neoforge"]')}&game_versions=${encodeURIComponent('["1.21.1"]')}`);
const v = wanted ? versions.find(x => x.version_number === wanted) : versions[0];
if (!v) throw new Error(`${project.title}: no NeoForge 1.21.1 version${wanted ? ' ' + wanted : ''}`);
const f = v.files.find(x => x.primary) || v.files[0];
const toml = [
`name = ${q(project.title)}`, `filename = ${q(f.filename)}`, `side = ${q(sideOf(project))}`, '',
'[download]', `url = ${q(f.url)}`, 'hash-format = "sha512"', `hash = ${q(f.hashes.sha512)}`, '',
'[update]', '[update.modrinth]', `mod-id = ${q(project.id)}`, `version = ${q(v.id)}`, ''
].join('\n');
fs.writeFileSync(path.join(root, 'mods', `${project.slug}.pw.toml`), toml);
existing.add(project.id);
console.log(`${pad}+ ${project.title} ${v.version_number} (${sideOf(project)})`);
for (const d of v.dependencies.filter(d => d.dependency_type === 'required' && d.project_id)) {
await add(d.project_id, depth + 1);
}
}
for (const spec of process.argv.slice(2)) await add(spec);
+3 -1
View File
@@ -1,7 +1,7 @@
// Exports this packwiz pack as a Modrinth modpack (.mrpack) for Modrinth App / Prism "Import".
// node tools/export-mrpack.mjs → dist/CreateRP-<version>.mrpack
// Mods are referenced by their Modrinth CDN URL (sha1/sha512/size from the Modrinth API);
// config/ goes into overrides/. Zipping uses Windows' bsdtar (tar -a) or `zip` on Linux.
// config/ and kubejs/ go into overrides/. Zipping uses Windows' bsdtar (tar -a) or `zip` on Linux.
import fs from 'fs';
import path from 'path';
import { execFileSync } from 'child_process';
@@ -60,6 +60,8 @@ fs.rmSync(stage, { recursive: true, force: true });
fs.mkdirSync(path.join(stage, 'overrides'), { recursive: true });
fs.writeFileSync(path.join(stage, 'modrinth.index.json'), JSON.stringify(index, null, 2));
fs.cpSync(path.join(root, 'config'), path.join(stage, 'overrides', 'config'), { recursive: true });
// kubejs/assets: always-on client resources (CC terminal font with Cyrillic)
if (fs.existsSync(path.join(root, 'kubejs'))) fs.cpSync(path.join(root, 'kubejs'), path.join(stage, 'overrides', 'kubejs'), { recursive: true });
const out = path.join(root, 'dist', `CreateRP-${packVersion}.mrpack`);
fs.rmSync(out, { force: true });