sapdon 2.0.2 → 2.1.0
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.
- package/LICENSE +1 -1
- package/doc/BlockAPI.md +145 -0
- package/doc/api.md +1 -1
- package/doc/hello_sapdon/a9aad643f5609da73404d1f7f35fd5d0.png +0 -0
- package/doc/hello_sapdon/sapdon/344/275/277/347/224/250/346/225/231/347/250/213.md +159 -0
- package/examples/guidebook/build.config +33 -0
- package/examples/guidebook/dev/guidebook_BP/items/sapdon_test_guidebook.json +19 -0
- package/examples/{masterball/dev/masterball_BP/masterball_BP_1_20_20 → guidebook/dev/guidebook_BP}/manifest.json +63 -59
- package/examples/guidebook/dev/guidebook_BP/scripts/custom_components/cropComponent.js +50 -0
- package/examples/guidebook/dev/guidebook_BP/scripts/custom_components/items/gui_book.js +37 -0
- package/examples/guidebook/dev/guidebook_BP/scripts/custom_components/registry.js +20 -0
- package/examples/guidebook/dev/guidebook_BP/scripts/index.js +3 -0
- package/examples/guidebook/dev/guidebook_RP/blocks.json +3 -0
- package/examples/guidebook/dev/guidebook_RP/manifest.json +44 -0
- package/examples/guidebook/dev/guidebook_RP/models/blocks/crop.geo.json +48 -0
- package/examples/{masterball/dev/masterball_RP/masterball_RP_1_20_20.zip → guidebook/dev/guidebook_RP/pack_icon.png} +0 -0
- package/examples/guidebook/dev/guidebook_RP/textures/blocks/test_log_oak.png +0 -0
- package/examples/guidebook/dev/guidebook_RP/textures/blocks/test_log_top.png +0 -0
- package/examples/guidebook/dev/guidebook_RP/textures/flipbook_textures.json +1 -0
- package/examples/guidebook/dev/guidebook_RP/textures/item_texture.json +9 -0
- package/examples/guidebook/dev/guidebook_RP/textures/items/masterball.png +0 -0
- package/examples/guidebook/dev/guidebook_RP/textures/terrain_texture.json +14 -0
- package/examples/guidebook/dev/guidebook_RP/ui/_ui_defs.json +6 -0
- package/examples/guidebook/dev/guidebook_RP/ui/guidebook.json +581 -0
- package/examples/guidebook/dev/guidebook_RP/ui/server_form.json +91 -0
- package/examples/guidebook/main.mjs +66 -0
- package/examples/guidebook/mod.info +7 -0
- package/examples/{masterball/dev/masterball_BP/masterball_BP_1_20_20.zip → guidebook/pack_icon.png} +0 -0
- package/examples/guidebook/res/models/blocks/crop.geo.json +48 -0
- package/examples/guidebook/res/textures/blocks/test_log_oak.png +0 -0
- package/examples/guidebook/res/textures/blocks/test_log_top.png +0 -0
- package/examples/guidebook/res/textures/items/masterball.png +0 -0
- package/examples/guidebook/scripts/custom_components/cropComponent.js +50 -0
- package/examples/guidebook/scripts/custom_components/items/gui_book.js +37 -0
- package/examples/guidebook/scripts/custom_components/registry.js +20 -0
- package/examples/guidebook/scripts/index.js +3 -0
- package/examples/hello_sapdon/build.config +29 -0
- package/examples/hello_sapdon/main.mjs +3 -0
- package/examples/hello_sapdon/mod.info +7 -0
- package/examples/hello_sapdon/pack_icon.png +0 -0
- package/examples/hello_sapdon/res/models/blocks/crop.geo.json +48 -0
- package/examples/hello_sapdon/res/textures/blocks/test_log_oak.png +0 -0
- package/examples/hello_sapdon/res/textures/blocks/test_log_top.png +0 -0
- package/examples/hello_sapdon/res/textures/items/masterball.png +0 -0
- package/examples/hello_sapdon/scripts/custom_components/cropComponent.js +50 -0
- package/examples/hello_sapdon/scripts/custom_components/items/gui_book.js +37 -0
- package/examples/hello_sapdon/scripts/custom_components/registry.js +25 -0
- package/examples/hello_sapdon/scripts/index.js +0 -0
- package/examples/masterball/build.config +1 -0
- package/examples/masterball/dev/masterball_1_20_30.mcaddon +0 -0
- package/examples/masterball/dev/masterball_BP/entities/sapdon_projectile_masterball.json +56 -55
- package/examples/masterball/dev/masterball_BP/manifest.json +59 -59
- package/examples/masterball/dev/masterball_BP/pack_icon.png +0 -0
- package/examples/masterball/dev/masterball_BP/recipes/masterball.json +25 -0
- package/examples/masterball/dev/masterball_BP_1_20_30.mcpack +0 -0
- package/examples/masterball/dev/masterball_RP/attachables/sapdon_caught_masterball.json +19 -0
- package/examples/masterball/dev/masterball_RP/manifest.json +43 -43
- package/examples/masterball/dev/masterball_RP/pack_icon.png +0 -0
- package/examples/masterball/dev/masterball_RP/textures/flipbook_textures.json +1 -0
- package/examples/masterball/dev/masterball_RP/ui/_ui_defs.json +3 -0
- package/examples/masterball/dev/masterball_RP_1_20_30.mcpack +0 -0
- package/examples/masterball/main.mjs +18 -1
- package/examples/masterball/pack_icon.png +0 -0
- package/examples/mob_chest/build.config +29 -0
- package/examples/mob_chest/dev/mob_chest_BP/blocks/mob_chest_chest.json +56 -0
- package/examples/mob_chest/dev/mob_chest_BP/entities/mob_chest_chest_entity.json +79 -0
- package/examples/mob_chest/dev/mob_chest_BP/manifest.json +64 -0
- package/examples/mob_chest/dev/mob_chest_BP/pack_icon.png +0 -0
- package/examples/mob_chest/dev/mob_chest_BP/scripts/custom_components/block/block_with_entity.js +46 -0
- package/examples/mob_chest/dev/mob_chest_BP/scripts/custom_components/block/cropComponent.js +50 -0
- package/examples/mob_chest/dev/mob_chest_BP/scripts/custom_components/items/gui_book.js +37 -0
- package/examples/mob_chest/dev/mob_chest_BP/scripts/custom_components/registry.js +25 -0
- package/examples/mob_chest/dev/mob_chest_BP/scripts/index.js +4 -0
- package/examples/mob_chest/dev/mob_chest_RP/animation_controllers/mob_chest.animation_controllers.json +30 -0
- package/examples/mob_chest/dev/mob_chest_RP/animations/animation_item.animation.json +34 -0
- package/examples/mob_chest/dev/mob_chest_RP/animations/large_item.animation.json +27 -0
- package/examples/mob_chest/dev/mob_chest_RP/animations/mob_chest.animation.json +64 -0
- package/examples/mob_chest/dev/mob_chest_RP/blocks.json +13 -0
- package/examples/mob_chest/dev/mob_chest_RP/entity/mob_chest_chest_entity.json +32 -0
- package/examples/mob_chest/dev/mob_chest_RP/manifest.json +44 -0
- package/examples/mob_chest/dev/mob_chest_RP/models/blocks/crop.geo.json +48 -0
- package/examples/mob_chest/dev/mob_chest_RP/models/blocks/cube.geo.json +35 -0
- package/examples/mob_chest/dev/mob_chest_RP/models/blocks/empty.geo.json +35 -0
- package/examples/mob_chest/dev/mob_chest_RP/models/entity/mob_chest.geo.json +98 -0
- package/examples/mob_chest/dev/mob_chest_RP/pack_icon.png +0 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/blocks/entity/double_normal.png +0 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/blocks/entity/none.png +0 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/blocks/entity/normal.png +0 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/blocks/test_log_oak.png +0 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/blocks/test_log_top.png +0 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/flipbook_textures.json +1 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/item_texture.json +9 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/items/masterball.png +0 -0
- package/examples/mob_chest/dev/mob_chest_RP/textures/terrain_texture.json +23 -0
- package/examples/mob_chest/dev/mob_chest_RP/ui/_ui_defs.json +3 -0
- package/examples/mob_chest/main.mjs +31 -0
- package/examples/mob_chest/mod.info +7 -0
- package/examples/mob_chest/pack_icon.png +0 -0
- package/examples/mob_chest/res/animation_controllers/mob_chest.animation_controllers.json +30 -0
- package/examples/mob_chest/res/animations/animation_item.animation.json +34 -0
- package/examples/mob_chest/res/animations/large_item.animation.json +27 -0
- package/examples/mob_chest/res/animations/mob_chest.animation.json +64 -0
- package/examples/mob_chest/res/models/blocks/crop.geo.json +48 -0
- package/examples/mob_chest/res/models/blocks/cube.geo.json +35 -0
- package/examples/mob_chest/res/models/blocks/empty.geo.json +35 -0
- package/examples/mob_chest/res/models/entity/mob_chest.geo.json +98 -0
- package/examples/mob_chest/res/textures/blocks/entity/double_normal.png +0 -0
- package/examples/mob_chest/res/textures/blocks/entity/none.png +0 -0
- package/examples/mob_chest/res/textures/blocks/entity/normal.png +0 -0
- package/examples/mob_chest/res/textures/blocks/test_log_oak.png +0 -0
- package/examples/mob_chest/res/textures/blocks/test_log_top.png +0 -0
- package/examples/mob_chest/res/textures/items/masterball.png +0 -0
- package/examples/mob_chest/resource/cube.bbmodel +1 -0
- package/examples/mob_chest/resource/flipbook_item.bbmodel +1 -0
- package/examples/mob_chest/resource/flipbook_item.geo.bbmodel +1 -0
- package/examples/mob_chest/resource/flipbook_item.geo.json +3124 -0
- package/examples/mob_chest/resource/mob_chest.bbmodel +1 -0
- package/examples/mob_chest/scripts/custom_components/block/block_with_entity.js +46 -0
- package/examples/mob_chest/scripts/custom_components/block/cropComponent.js +50 -0
- package/examples/mob_chest/scripts/custom_components/items/gui_book.js +37 -0
- package/examples/mob_chest/scripts/custom_components/registry.js +25 -0
- package/examples/mob_chest/scripts/index.js +4 -0
- package/examples/test/build.config +29 -0
- package/examples/test/dev/test_BP/blocks/sapdon_ore_cinnabar.json +15 -15
- package/examples/test/dev/test_BP/blocks/sapdon_test_block.json +15 -15
- package/examples/test/dev/test_BP/blocks/sapdon_test_crop.json +191 -191
- package/examples/test/dev/test_BP/blocks/sapdon_wire.json +102 -102
- package/examples/test/dev/test_BP/entities/sapdon_test_projectile.json +56 -55
- package/examples/test/dev/test_BP/feature_rules/ore_cinnabar_orefeatre_rule.json +52 -52
- package/examples/test/dev/test_BP/feature_rules/overworld_underground_titanite_ore_feature.json +52 -52
- package/examples/test/dev/test_BP/features/ore_cinnabar_ore_feature.json +16 -16
- package/examples/test/dev/test_BP/features/titanite_ore_feature.json +22 -22
- package/examples/test/dev/test_BP/items/sapdon_chest.json +22 -22
- package/examples/test/dev/test_BP/items/sapdon_test_book.json +19 -0
- package/examples/test/dev/test_BP/items/sapdon_test_food.json +25 -25
- package/examples/test/dev/test_BP/items/sapdon_test_item.json +30 -30
- package/examples/test/dev/test_BP/manifest.json +63 -59
- package/examples/test/dev/test_BP/recipes/sapdon_test_furnace.json +12 -12
- package/examples/test/dev/test_BP/scripts/custom_components/cropComponent.js +1 -10
- package/examples/test/dev/test_BP/scripts/custom_components/items/gui_book.js +37 -0
- package/examples/test/dev/test_BP/scripts/custom_components/registry.js +20 -0
- package/examples/test/dev/test_BP/scripts/index.js +4 -3
- package/examples/test/dev/test_RP/attachables/sapdon_chest.json +24 -24
- package/examples/test/dev/test_RP/blocks.json +42 -42
- package/examples/test/dev/test_RP/entity/sapdon_test_projectile.json +27 -27
- package/examples/test/dev/test_RP/manifest.json +43 -43
- package/examples/test/dev/test_RP/models/blocks/arcane_workbench.geo.json +105 -105
- package/examples/test/dev/test_RP/models/blocks/jar_normal.geo.json +46 -46
- package/examples/test/dev/test_RP/models/blocks/jar_normal_0.geo.json +58 -58
- package/examples/test/dev/test_RP/models/blocks/jar_normal_1.geo.json +58 -58
- package/examples/test/dev/test_RP/models/blocks/jar_normal_2.geo.json +58 -58
- package/examples/test/dev/test_RP/models/blocks/jar_normal_3.geo.json +58 -58
- package/examples/test/dev/test_RP/models/blocks/wire.geo.json +153 -153
- package/examples/test/dev/test_RP/textures/item_texture.json +788 -788
- package/examples/test/dev/test_RP/textures/items/seals/seal_breaker.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_butcher.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_empty.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_empty_advanced.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_fill.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_fill_advanced.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_guard.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_guard_advanced.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_harvest.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_lumber.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_pickup.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_pickup_advanced.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_provider.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/seals/seal_use.png.mcmeta +5 -5
- package/examples/test/dev/test_RP/textures/items/wand/cap_thaumium.png.mcmeta +11 -11
- package/examples/test/dev/test_RP/textures/items/wand/cap_void.png.mcmeta +11 -11
- package/examples/test/dev/test_RP/textures/items/wand/focus_pech.png.mcmeta +2 -2
- package/examples/test/dev/test_RP/textures/items/wand/focus_portablehole.png.mcmeta +2 -2
- package/examples/test/dev/test_RP/textures/items/wand/focus_primal.png.mcmeta +2 -2
- package/examples/test/dev/test_RP/textures/items/wand/focus_shard.png.mcmeta +2 -2
- package/examples/test/dev/test_RP/textures/items/wand/focus_warding.png.mcmeta +2 -2
- package/examples/test/dev/test_RP/textures/items/wand/rod_primal_mat.png.mcmeta +44 -44
- package/examples/test/dev/test_RP/textures/terrain_texture.json +136 -136
- package/examples/test/dev/test_RP/ui/_ui_defs.json +6 -0
- package/examples/test/dev/test_RP/ui/guidebook.json +446 -0
- package/examples/test/dev/test_RP/ui/server_form.json +91 -0
- package/examples/test/main.mjs +46 -1
- package/examples/test/res/models/blocks/arcane_workbench.geo.json +105 -105
- package/examples/test/res/models/blocks/jar_normal.geo.json +46 -46
- package/examples/test/res/models/blocks/jar_normal_0.geo.json +58 -58
- package/examples/test/res/models/blocks/jar_normal_1.geo.json +58 -58
- package/examples/test/res/models/blocks/jar_normal_2.geo.json +58 -58
- package/examples/test/res/models/blocks/jar_normal_3.geo.json +58 -58
- package/examples/test/res/models/blocks/wire.geo.json +153 -153
- package/examples/test/res/textures/items/seals/seal_breaker.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_butcher.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_empty.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_empty_advanced.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_fill.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_fill_advanced.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_guard.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_guard_advanced.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_harvest.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_lumber.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_pickup.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_pickup_advanced.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_provider.png.mcmeta +5 -5
- package/examples/test/res/textures/items/seals/seal_use.png.mcmeta +5 -5
- package/examples/test/res/textures/items/wand/cap_thaumium.png.mcmeta +11 -11
- package/examples/test/res/textures/items/wand/cap_void.png.mcmeta +11 -11
- package/examples/test/res/textures/items/wand/focus_pech.png.mcmeta +2 -2
- package/examples/test/res/textures/items/wand/focus_portablehole.png.mcmeta +2 -2
- package/examples/test/res/textures/items/wand/focus_primal.png.mcmeta +2 -2
- package/examples/test/res/textures/items/wand/focus_shard.png.mcmeta +2 -2
- package/examples/test/res/textures/items/wand/focus_warding.png.mcmeta +2 -2
- package/examples/test/res/textures/items/wand/rod_primal_mat.png.mcmeta +44 -44
- package/examples/test/scripts/custom_components/cropComponent.js +1 -10
- package/examples/test/scripts/custom_components/items/gui_book.js +37 -0
- package/examples/test/scripts/custom_components/registry.js +20 -0
- package/examples/test/scripts/index.js +4 -3
- package/log.md +8 -0
- package/package.json +4 -1
- package/src/cli/build.js +210 -210
- package/src/cli/load.js +116 -112
- package/src/cli/tools/textureSet.js +114 -114
- package/src/cli/utils.js +82 -82
- package/src/core/addon/controllers/animation_controller.js +80 -0
- package/src/core/addon/entity/entity.js +52 -51
- package/src/core/block/GeometryBlock.js +8 -0
- package/src/core/block/OreBlock.js +1 -0
- package/src/core/block/TileBlock.js +117 -0
- package/src/core/block/block.js +106 -106
- package/src/core/block/blockComponent.js +557 -557
- package/src/core/block/cropBlock.js +1 -1
- package/src/core/entity/BasicEntity.js +195 -166
- package/src/core/entity/bundles/BasicBundle.js +51 -0
- package/src/core/factory/BlockFactory.js +166 -158
- package/src/core/factory/EntityFactory.js +82 -82
- package/src/core/factory/ItemFactory.js +120 -95
- package/src/core/factory/RecipeFactory.js +46 -46
- package/src/core/index.js +2 -1
- package/src/core/item/Item.js +96 -96
- package/src/core/item/ItemComponents.js +251 -235
- package/src/core/item/armor.js +117 -89
- package/src/core/item/attachable.js +33 -33
- package/src/core/item/food.js +61 -61
- package/src/core/registry.js +16 -16
- package/src/core/ui/Properties/{Grid.js → GridProp.js} +2 -2
- package/src/core/ui/Properties/Sound.js +72 -0
- package/src/core/ui/elements/Button.js +111 -0
- package/src/core/ui/elements/CollectionPanel.js +61 -0
- package/src/core/ui/elements/Grid.js +24 -0
- package/src/core/ui/elements/Image.js +4 -0
- package/src/core/ui/elements/Label.js +10 -2
- package/src/core/ui/elements/Panel.js +7 -0
- package/src/core/ui/elements/ScrollingPanel.js +68 -0
- package/src/core/ui/elements/StackPanel.js +40 -0
- package/src/core/ui/elements/UIElement.js +43 -2
- package/src/core/ui/registry/UISystemRegistry.js +35 -0
- package/src/core/ui/systems/UISystem.js +9 -5
- package/src/core/ui/systems/guidebook.js +299 -0
- package/src/core/ui/systems/server_form.js +94 -83
- package/src/templates/test_sapdon/build.config +28 -28
- package/src/templates/test_sapdon/res/animations/animation_item.animation.json +34 -0
- package/src/templates/test_sapdon/res/animations/large_item.animation.json +27 -0
- package/src/templates/test_sapdon/res/models/entity/animation/animation_item.geo.json +26 -0
- package/src/templates/test_sapdon/res/models/entity/animation/large_item.geo.json +28 -0
- package/src/templates/test_sapdon/res/textures/blocks/none.png +0 -0
- package/src/templates/test_sapdon/scripts/custom_components/cropComponent.js +50 -0
- package/src/templates/test_sapdon/scripts/custom_components/items/gui_book.js +37 -0
- package/src/templates/test_sapdon/scripts/custom_components/registry.js +25 -0
- package/examples/masterball/dev/masterball[1.20.20+].mcaddon.zip +0 -0
- package/examples/masterball/dev/masterball_BP/masterball_BP_1_20_20/entities/sapdon_projectile_masterball.json +0 -56
- package/examples/masterball/dev/masterball_BP/masterball_BP_1_20_20/items/sapdon_caught_masterball.json +0 -32
- package/examples/masterball/dev/masterball_BP/masterball_BP_1_20_20/items/sapdon_uncaught_masterball.json +0 -31
- package/examples/masterball/dev/masterball_BP/masterball_BP_1_20_20/scripts/index.js +0 -159
- package/examples/test/dev/test_BP/biomes/test_biome.json +0 -48
- package/examples/test/dev/test_BP/blocks/sapdon_block.json +0 -111
- package/examples/test/dev/test_BP/entities/sapdon_body.json +0 -118
- package/examples/test/dev/test_BP/entities/sapdon_test_entity_ctrl1.json +0 -55
- package/examples/test/dev/test_BP/entities/sapdon_test_entity_ctrl2.json +0 -61
- package/examples/test/dev/test_BP/entities/sapdon_test_entity_header.json +0 -408
- package/examples/test/dev/test_RP/entity/sapdon_body.json +0 -44
- package/examples/test/dev/test_RP/entity/sapdon_test_entity_ctrl1.json +0 -38
- package/examples/test/dev/test_RP/entity/sapdon_test_entity_ctrl2.json +0 -38
- package/examples/test/dev/test_RP/entity/sapdon_test_entity_header.json +0 -44
- package/src/cli/build.config +0 -4
- package/src/core/ui/registry/ServerUISystem.js +0 -19
- /package/examples/{masterball/dev/masterball_BP/masterball_BP_1_20_20 → guidebook/dev/guidebook_BP}/pack_icon.png +0 -0
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
import fs from "fs/promises";
|
|
2
|
-
import path from "path";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* 递归遍历目录,收集所有 PNG 文件的路径
|
|
7
|
-
* @param {string} directory - 要遍历的目录
|
|
8
|
-
* @param {string} basePath - 基础路径(用于计算相对路径)
|
|
9
|
-
* @param {string} prefix - 路径前缀(如 "textures/items/")
|
|
10
|
-
* @returns {Promise<Object>} - 返回一个对象,键为文件名,值为相对路径(不带 .png 后缀)
|
|
11
|
-
*/
|
|
12
|
-
const traverseDirectory = async (directory, basePath, prefix = "") => {
|
|
13
|
-
const texturesSet = {};
|
|
14
|
-
|
|
15
|
-
const files = await fs.readdir(directory);
|
|
16
|
-
|
|
17
|
-
for (const file of files) {
|
|
18
|
-
const filePath = path.join(directory, file);
|
|
19
|
-
const fileStats = await fs.stat(filePath);
|
|
20
|
-
|
|
21
|
-
if (fileStats.isDirectory()) {
|
|
22
|
-
// 如果是目录,递归遍历
|
|
23
|
-
const subDirectoryTextures = await traverseDirectory(filePath, basePath, prefix);
|
|
24
|
-
Object.assign(texturesSet, subDirectoryTextures);
|
|
25
|
-
} else if (file.endsWith(".png")) {
|
|
26
|
-
// 如果是 PNG 文件,提取文件名并生成 texture_data
|
|
27
|
-
const fileName = path.basename(file, ".png"); // 去掉 .png 后缀
|
|
28
|
-
const relativePath = path.relative(basePath, filePath).replace(/\.png$/, ""); // 去掉 .png 后缀
|
|
29
|
-
const normalizedPath = `${prefix}${relativePath.replace(/\\/g, "/")}`; // 确保路径使用正斜杠
|
|
30
|
-
|
|
31
|
-
texturesSet[fileName] = {
|
|
32
|
-
textures: normalizedPath,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return texturesSet;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* 生成 JSON 文件
|
|
42
|
-
* @param {string} outputPath - 输出的 JSON 文件路径
|
|
43
|
-
* @param {Object} jsonData - 要写入的 JSON 数据
|
|
44
|
-
* @param {string} successMessage - 成功时的日志消息
|
|
45
|
-
*/
|
|
46
|
-
const generateJsonFile = async (outputPath, jsonData, successMessage) => {
|
|
47
|
-
try {
|
|
48
|
-
const jsonString = JSON.stringify(jsonData, null, 2);
|
|
49
|
-
await fs.writeFile(outputPath, jsonString);
|
|
50
|
-
console.log(successMessage);
|
|
51
|
-
} catch (err) {
|
|
52
|
-
console.error("Error writing JSON file:", err);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 生成 block_texture.json 文件
|
|
58
|
-
* @param {string} itemTexturesPath - 包含 PNG 文件的根目录
|
|
59
|
-
* @param {string} outputPath - 输出的 JSON 文件路径
|
|
60
|
-
* @param {string} projectName - 项目名称
|
|
61
|
-
*/
|
|
62
|
-
export async function generateBlockTextureJson(itemTexturesPath, outputPath, projectName, userTerrainTextures) {
|
|
63
|
-
try {
|
|
64
|
-
// 递归遍历目录,获取所有 PNG 文件的路径
|
|
65
|
-
const itemTexturesSet = await traverseDirectory(itemTexturesPath, itemTexturesPath,"textures/blocks/");
|
|
66
|
-
|
|
67
|
-
// 合并用户自定义的texture_data
|
|
68
|
-
if(userTerrainTextures){
|
|
69
|
-
Object.assign(itemTexturesSet,userTerrainTextures);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// 生成 JSON 数据
|
|
73
|
-
const jsonData = {
|
|
74
|
-
texture_name: "atlas.terrain",
|
|
75
|
-
resource_pack_name: projectName,
|
|
76
|
-
padding: 8,
|
|
77
|
-
num_mip_levels: 4,
|
|
78
|
-
texture_data: itemTexturesSet,
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
// 写入文件
|
|
82
|
-
await generateJsonFile(outputPath, jsonData, "Block texture JSON file generated successfully.");
|
|
83
|
-
} catch (err) {
|
|
84
|
-
console.error("Error generating block texture JSON:", err);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* 生成 item_texture.json 文件
|
|
90
|
-
* @param {string} itemTexturesPath - 包含 PNG 文件的根目录
|
|
91
|
-
* @param {string} outputPath - 输出的 JSON 文件路径
|
|
92
|
-
*/
|
|
93
|
-
export async function generateItemTextureJson(itemTexturesPath, outputPath,projectName,userItemTextures) {
|
|
94
|
-
try {
|
|
95
|
-
// 递归遍历目录,获取所有 PNG 文件的路径
|
|
96
|
-
const itemTexturesSet = await traverseDirectory(itemTexturesPath, itemTexturesPath, "textures/items/");
|
|
97
|
-
|
|
98
|
-
// 合并用户自定义的texture_data
|
|
99
|
-
if(userItemTextures){
|
|
100
|
-
Object.assign(itemTexturesSet,userItemTextures);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// 生成 JSON 数据
|
|
104
|
-
const jsonData = {
|
|
105
|
-
resource_pack_name: projectName,
|
|
106
|
-
texture_name: "atlas.items",
|
|
107
|
-
texture_data: itemTexturesSet,
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
// 写入文件
|
|
111
|
-
await generateJsonFile(outputPath, jsonData, "Item texture JSON file generated successfully.");
|
|
112
|
-
} catch (err) {
|
|
113
|
-
console.error("Error generating item texture JSON:", err);
|
|
114
|
-
}
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 递归遍历目录,收集所有 PNG 文件的路径
|
|
7
|
+
* @param {string} directory - 要遍历的目录
|
|
8
|
+
* @param {string} basePath - 基础路径(用于计算相对路径)
|
|
9
|
+
* @param {string} prefix - 路径前缀(如 "textures/items/")
|
|
10
|
+
* @returns {Promise<Object>} - 返回一个对象,键为文件名,值为相对路径(不带 .png 后缀)
|
|
11
|
+
*/
|
|
12
|
+
const traverseDirectory = async (directory, basePath, prefix = "") => {
|
|
13
|
+
const texturesSet = {};
|
|
14
|
+
|
|
15
|
+
const files = await fs.readdir(directory);
|
|
16
|
+
|
|
17
|
+
for (const file of files) {
|
|
18
|
+
const filePath = path.join(directory, file);
|
|
19
|
+
const fileStats = await fs.stat(filePath);
|
|
20
|
+
|
|
21
|
+
if (fileStats.isDirectory()) {
|
|
22
|
+
// 如果是目录,递归遍历
|
|
23
|
+
const subDirectoryTextures = await traverseDirectory(filePath, basePath, prefix);
|
|
24
|
+
Object.assign(texturesSet, subDirectoryTextures);
|
|
25
|
+
} else if (file.endsWith(".png")) {
|
|
26
|
+
// 如果是 PNG 文件,提取文件名并生成 texture_data
|
|
27
|
+
const fileName = path.basename(file, ".png"); // 去掉 .png 后缀
|
|
28
|
+
const relativePath = path.relative(basePath, filePath).replace(/\.png$/, ""); // 去掉 .png 后缀
|
|
29
|
+
const normalizedPath = `${prefix}${relativePath.replace(/\\/g, "/")}`; // 确保路径使用正斜杠
|
|
30
|
+
|
|
31
|
+
texturesSet[fileName] = {
|
|
32
|
+
textures: normalizedPath,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return texturesSet;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 生成 JSON 文件
|
|
42
|
+
* @param {string} outputPath - 输出的 JSON 文件路径
|
|
43
|
+
* @param {Object} jsonData - 要写入的 JSON 数据
|
|
44
|
+
* @param {string} successMessage - 成功时的日志消息
|
|
45
|
+
*/
|
|
46
|
+
const generateJsonFile = async (outputPath, jsonData, successMessage) => {
|
|
47
|
+
try {
|
|
48
|
+
const jsonString = JSON.stringify(jsonData, null, 2);
|
|
49
|
+
await fs.writeFile(outputPath, jsonString);
|
|
50
|
+
console.log(successMessage);
|
|
51
|
+
} catch (err) {
|
|
52
|
+
console.error("Error writing JSON file:", err);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 生成 block_texture.json 文件
|
|
58
|
+
* @param {string} itemTexturesPath - 包含 PNG 文件的根目录
|
|
59
|
+
* @param {string} outputPath - 输出的 JSON 文件路径
|
|
60
|
+
* @param {string} projectName - 项目名称
|
|
61
|
+
*/
|
|
62
|
+
export async function generateBlockTextureJson(itemTexturesPath, outputPath, projectName, userTerrainTextures) {
|
|
63
|
+
try {
|
|
64
|
+
// 递归遍历目录,获取所有 PNG 文件的路径
|
|
65
|
+
const itemTexturesSet = await traverseDirectory(itemTexturesPath, itemTexturesPath,"textures/blocks/");
|
|
66
|
+
|
|
67
|
+
// 合并用户自定义的texture_data
|
|
68
|
+
if(userTerrainTextures){
|
|
69
|
+
Object.assign(itemTexturesSet,userTerrainTextures);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 生成 JSON 数据
|
|
73
|
+
const jsonData = {
|
|
74
|
+
texture_name: "atlas.terrain",
|
|
75
|
+
resource_pack_name: projectName,
|
|
76
|
+
padding: 8,
|
|
77
|
+
num_mip_levels: 4,
|
|
78
|
+
texture_data: itemTexturesSet,
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// 写入文件
|
|
82
|
+
await generateJsonFile(outputPath, jsonData, "Block texture JSON file generated successfully.");
|
|
83
|
+
} catch (err) {
|
|
84
|
+
console.error("Error generating block texture JSON:", err);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 生成 item_texture.json 文件
|
|
90
|
+
* @param {string} itemTexturesPath - 包含 PNG 文件的根目录
|
|
91
|
+
* @param {string} outputPath - 输出的 JSON 文件路径
|
|
92
|
+
*/
|
|
93
|
+
export async function generateItemTextureJson(itemTexturesPath, outputPath,projectName,userItemTextures) {
|
|
94
|
+
try {
|
|
95
|
+
// 递归遍历目录,获取所有 PNG 文件的路径
|
|
96
|
+
const itemTexturesSet = await traverseDirectory(itemTexturesPath, itemTexturesPath, "textures/items/");
|
|
97
|
+
|
|
98
|
+
// 合并用户自定义的texture_data
|
|
99
|
+
if(userItemTextures){
|
|
100
|
+
Object.assign(itemTexturesSet,userItemTextures);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 生成 JSON 数据
|
|
104
|
+
const jsonData = {
|
|
105
|
+
resource_pack_name: projectName,
|
|
106
|
+
texture_name: "atlas.items",
|
|
107
|
+
texture_data: itemTexturesSet,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// 写入文件
|
|
111
|
+
await generateJsonFile(outputPath, jsonData, "Item texture JSON file generated successfully.");
|
|
112
|
+
} catch (err) {
|
|
113
|
+
console.error("Error generating item texture JSON:", err);
|
|
114
|
+
}
|
|
115
115
|
}
|
package/src/cli/utils.js
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import path from "path";
|
|
3
|
-
import downlaod from "download";
|
|
4
|
-
import { randomUUID } from "crypto";
|
|
5
|
-
|
|
6
|
-
export const generateUUID = () => {
|
|
7
|
-
return randomUUID();
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 同步复制文件
|
|
12
|
-
* @param {string} src 源文件路径
|
|
13
|
-
* @param {string} dest 目标文件路径
|
|
14
|
-
*/
|
|
15
|
-
export function copyFileSync(src, dest) {
|
|
16
|
-
try {
|
|
17
|
-
fs.copyFileSync(src, dest);
|
|
18
|
-
} catch (err) {
|
|
19
|
-
console.error("文件复制失败:", err);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
//检查路径
|
|
24
|
-
export const checkPath = filePath => {
|
|
25
|
-
return !fs.existsSync(filePath);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
//读取文件
|
|
29
|
-
export const readFile = filePath => {
|
|
30
|
-
try {
|
|
31
|
-
return fs.readFileSync(filePath, "utf8");
|
|
32
|
-
} catch (error) {
|
|
33
|
-
console.log(error);
|
|
34
|
-
}
|
|
35
|
-
return null;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* 保存文件
|
|
40
|
-
* @param {string} filePath 绝对路径
|
|
41
|
-
* @param {string} data 数据
|
|
42
|
-
*/
|
|
43
|
-
export const saveFile = (filePath, data) => {
|
|
44
|
-
// 确保目录存在
|
|
45
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
46
|
-
|
|
47
|
-
// 创建文件并写入内容
|
|
48
|
-
fs.writeFile(filePath, data, err => {
|
|
49
|
-
if (err) {
|
|
50
|
-
return console.error(err);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export const copyFolder = (sourcePath, destinationPath) => {
|
|
56
|
-
// 确保目录存在
|
|
57
|
-
fs.mkdirSync(path.dirname(destinationPath), { recursive: true });
|
|
58
|
-
// 检查源路径是否存在
|
|
59
|
-
if (!fs.existsSync(sourcePath)) {
|
|
60
|
-
console.log(`Source path ${sourcePath} does not exist.`);
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
// 检查目标路径是否存在,如果不存在则创建它
|
|
64
|
-
if (!fs.existsSync(destinationPath)) {
|
|
65
|
-
fs.mkdirSync(destinationPath);
|
|
66
|
-
}
|
|
67
|
-
// 获取源路径下的所有文件和文件夹
|
|
68
|
-
const files = fs.readdirSync(sourcePath);
|
|
69
|
-
// 遍历文件和文件夹
|
|
70
|
-
files.forEach(file => {
|
|
71
|
-
const sourceFile = path.join(sourcePath, file);
|
|
72
|
-
const destinationFile = path.join(destinationPath, file);
|
|
73
|
-
// 判断是文件还是文件夹
|
|
74
|
-
if (fs.lstatSync(sourceFile).isDirectory()) {
|
|
75
|
-
// 如果是文件夹,则递归调用copyFolder函数
|
|
76
|
-
copyFolder(sourceFile, destinationFile);
|
|
77
|
-
} else {
|
|
78
|
-
// 如果是文件,则直接复制到目标路径
|
|
79
|
-
fs.copyFileSync(sourceFile, destinationFile);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
};
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import downlaod from "download";
|
|
4
|
+
import { randomUUID } from "crypto";
|
|
5
|
+
|
|
6
|
+
export const generateUUID = () => {
|
|
7
|
+
return randomUUID();
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 同步复制文件
|
|
12
|
+
* @param {string} src 源文件路径
|
|
13
|
+
* @param {string} dest 目标文件路径
|
|
14
|
+
*/
|
|
15
|
+
export function copyFileSync(src, dest) {
|
|
16
|
+
try {
|
|
17
|
+
fs.copyFileSync(src, dest);
|
|
18
|
+
} catch (err) {
|
|
19
|
+
console.error("文件复制失败:", err);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//检查路径
|
|
24
|
+
export const checkPath = filePath => {
|
|
25
|
+
return !fs.existsSync(filePath);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
//读取文件
|
|
29
|
+
export const readFile = filePath => {
|
|
30
|
+
try {
|
|
31
|
+
return fs.readFileSync(filePath, "utf8");
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.log(error);
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 保存文件
|
|
40
|
+
* @param {string} filePath 绝对路径
|
|
41
|
+
* @param {string} data 数据
|
|
42
|
+
*/
|
|
43
|
+
export const saveFile = (filePath, data) => {
|
|
44
|
+
// 确保目录存在
|
|
45
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
46
|
+
|
|
47
|
+
// 创建文件并写入内容
|
|
48
|
+
fs.writeFile(filePath, data, err => {
|
|
49
|
+
if (err) {
|
|
50
|
+
return console.error(err);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const copyFolder = (sourcePath, destinationPath) => {
|
|
56
|
+
// 确保目录存在
|
|
57
|
+
fs.mkdirSync(path.dirname(destinationPath), { recursive: true });
|
|
58
|
+
// 检查源路径是否存在
|
|
59
|
+
if (!fs.existsSync(sourcePath)) {
|
|
60
|
+
console.log(`Source path ${sourcePath} does not exist.`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// 检查目标路径是否存在,如果不存在则创建它
|
|
64
|
+
if (!fs.existsSync(destinationPath)) {
|
|
65
|
+
fs.mkdirSync(destinationPath);
|
|
66
|
+
}
|
|
67
|
+
// 获取源路径下的所有文件和文件夹
|
|
68
|
+
const files = fs.readdirSync(sourcePath);
|
|
69
|
+
// 遍历文件和文件夹
|
|
70
|
+
files.forEach(file => {
|
|
71
|
+
const sourceFile = path.join(sourcePath, file);
|
|
72
|
+
const destinationFile = path.join(destinationPath, file);
|
|
73
|
+
// 判断是文件还是文件夹
|
|
74
|
+
if (fs.lstatSync(sourceFile).isDirectory()) {
|
|
75
|
+
// 如果是文件夹,则递归调用copyFolder函数
|
|
76
|
+
copyFolder(sourceFile, destinationFile);
|
|
77
|
+
} else {
|
|
78
|
+
// 如果是文件,则直接复制到目标路径
|
|
79
|
+
fs.copyFileSync(sourceFile, destinationFile);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
|
|
2
|
+
export class AddonAnimationController {
|
|
3
|
+
constructor(format_version,definition){
|
|
4
|
+
this.format_version = format_version;
|
|
5
|
+
this.definition = definition;
|
|
6
|
+
}
|
|
7
|
+
toJson(){
|
|
8
|
+
return {
|
|
9
|
+
format_version: this.format_version,
|
|
10
|
+
["animation_controllers"]: this.definition
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class AddonAnimationStateMachine {
|
|
16
|
+
constructor(identifier) {
|
|
17
|
+
this.identifier = identifier; // 状态机的唯一标识符(例如 "helicopter.blade")
|
|
18
|
+
this.namespace = identifier.split(":")[0]; // 标识符的命名空间部分(冒号前的部分)
|
|
19
|
+
this.name = identifier.split(":")[1]; // 标识符的名称部分(冒号后的部分)
|
|
20
|
+
|
|
21
|
+
// 状态机属性
|
|
22
|
+
this.initialState = null; // 状态机的初始状态
|
|
23
|
+
this.states = new Map(); // 使用 Map 存储所有状态,键为状态名,值为状态数据
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 设置状态机的初始状态。
|
|
28
|
+
* @param {string} stateName - 初始状态的名称。
|
|
29
|
+
* @returns {AddonAnimationStateMachine} - 返回实例以支持链式调用。
|
|
30
|
+
*/
|
|
31
|
+
setInitialState(stateName) {
|
|
32
|
+
this.initialState = stateName;
|
|
33
|
+
return this; // 支持链式调用
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 添加一个新状态到状态机。
|
|
38
|
+
* @param {string} stateName - 状态的名称。
|
|
39
|
+
* @param {string[]} animations - 该状态播放的动画列表。
|
|
40
|
+
* @returns {AddonAnimationStateMachine} - 返回实例以支持链式调用。
|
|
41
|
+
*/
|
|
42
|
+
addState(stateName, animations = []) {
|
|
43
|
+
this.states.set(stateName, {
|
|
44
|
+
animations: animations, // 该状态的动画列表
|
|
45
|
+
transitions: [] // 该状态的过渡条件列表
|
|
46
|
+
});
|
|
47
|
+
return this; // 支持链式调用
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 添加一个状态之间的过渡条件。
|
|
52
|
+
* @param {string} fromState - 过渡的起始状态名称。
|
|
53
|
+
* @param {string} toState - 过渡的目标状态名称。
|
|
54
|
+
* @param {string} condition - 触发过渡的条件(例如 "q.is_on_ground")。
|
|
55
|
+
* @returns {AddonAnimationStateMachine} - 返回实例以支持链式调用。
|
|
56
|
+
*/
|
|
57
|
+
addTransition(fromState, toState, condition) {
|
|
58
|
+
if (!this.states.has(fromState)) {
|
|
59
|
+
throw new Error(`状态 "${fromState}" 不存在。`);
|
|
60
|
+
}
|
|
61
|
+
const state = this.states.get(fromState);
|
|
62
|
+
state.transitions.push({
|
|
63
|
+
[toState]: condition // 添加过渡条件
|
|
64
|
+
});
|
|
65
|
+
return this; // 支持链式调用
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 将整个状态机转换为 JSON 兼容的对象。
|
|
70
|
+
* @returns {object} - 包含格式版本的完整动画控制器定义。
|
|
71
|
+
*/
|
|
72
|
+
toJson() {
|
|
73
|
+
return {
|
|
74
|
+
[`controller.animation.${this.namespace}.${this.name}`]:{
|
|
75
|
+
initial_state: this.initialState,
|
|
76
|
+
states: Object.fromEntries(this.states)
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -1,52 +1,53 @@
|
|
|
1
|
-
export class AddonEntity {
|
|
2
|
-
/**
|
|
3
|
-
* 实体类
|
|
4
|
-
* @param {string} format_version 格式版本
|
|
5
|
-
* @param {AddonEntityDefinition} definitions 实体定义
|
|
6
|
-
*/
|
|
7
|
-
constructor(format_version, definitions) {
|
|
8
|
-
this.format_version = format_version;
|
|
9
|
-
this.definitions = definitions;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* 将对象转换为 JSON 格式
|
|
14
|
-
* @returns {Object} JSON 对象
|
|
15
|
-
*/
|
|
16
|
-
toJson() {
|
|
17
|
-
return {
|
|
18
|
-
format_version: this.format_version,
|
|
19
|
-
["minecraft:entity"]: this.definitions
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export class AddonEntityDefinition {
|
|
25
|
-
/**
|
|
26
|
-
* 实体定义类
|
|
27
|
-
* @param {AddonEntityDescription} description 实体描述
|
|
28
|
-
* @param {Object} components 实体组件
|
|
29
|
-
*/
|
|
30
|
-
constructor(description, components = {}, component_groups = {}, events = {}) {
|
|
31
|
-
this.description = description;
|
|
32
|
-
this.components = components; // 修正拼写错误
|
|
33
|
-
this.component_groups = component_groups;
|
|
34
|
-
this.events = events;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export class AddonEntityDescription {
|
|
39
|
-
/**
|
|
40
|
-
* 实体描述类
|
|
41
|
-
* @param {string} identifier 实体标识符
|
|
42
|
-
* @param {boolean} is_spawnable 是否可生成
|
|
43
|
-
* @param {boolean} is_summonable 是否可召唤
|
|
44
|
-
* @param {string} runtime_identifier 复刻标识符
|
|
45
|
-
*/
|
|
46
|
-
constructor(identifier, is_spawnable = false, is_summonable = false, runtime_identifier) {
|
|
47
|
-
this.identifier = identifier;
|
|
48
|
-
this.is_spawnable = is_spawnable;
|
|
49
|
-
this.is_summonable = is_summonable;
|
|
50
|
-
this.
|
|
51
|
-
|
|
1
|
+
export class AddonEntity {
|
|
2
|
+
/**
|
|
3
|
+
* 实体类
|
|
4
|
+
* @param {string} format_version 格式版本
|
|
5
|
+
* @param {AddonEntityDefinition} definitions 实体定义
|
|
6
|
+
*/
|
|
7
|
+
constructor(format_version, definitions) {
|
|
8
|
+
this.format_version = format_version;
|
|
9
|
+
this.definitions = definitions;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 将对象转换为 JSON 格式
|
|
14
|
+
* @returns {Object} JSON 对象
|
|
15
|
+
*/
|
|
16
|
+
toJson() {
|
|
17
|
+
return {
|
|
18
|
+
format_version: this.format_version,
|
|
19
|
+
["minecraft:entity"]: this.definitions
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class AddonEntityDefinition {
|
|
25
|
+
/**
|
|
26
|
+
* 实体定义类
|
|
27
|
+
* @param {AddonEntityDescription} description 实体描述
|
|
28
|
+
* @param {Object} components 实体组件
|
|
29
|
+
*/
|
|
30
|
+
constructor(description, components = {}, component_groups = {}, events = {}) {
|
|
31
|
+
this.description = description;
|
|
32
|
+
this.components = components; // 修正拼写错误
|
|
33
|
+
this.component_groups = component_groups;
|
|
34
|
+
this.events = events;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class AddonEntityDescription {
|
|
39
|
+
/**
|
|
40
|
+
* 实体描述类
|
|
41
|
+
* @param {string} identifier 实体标识符
|
|
42
|
+
* @param {boolean} is_spawnable 是否可生成
|
|
43
|
+
* @param {boolean} is_summonable 是否可召唤
|
|
44
|
+
* @param {string} runtime_identifier 复刻标识符
|
|
45
|
+
*/
|
|
46
|
+
constructor(identifier, is_spawnable = false, is_summonable = false, properties = {}, runtime_identifier) {
|
|
47
|
+
this.identifier = identifier;
|
|
48
|
+
this.is_spawnable = is_spawnable;
|
|
49
|
+
this.is_summonable = is_summonable;
|
|
50
|
+
this.properties = properties;
|
|
51
|
+
this.runtime_identifier = runtime_identifier;
|
|
52
|
+
}
|
|
52
53
|
}
|
|
@@ -2,6 +2,14 @@ import { BasicBlock } from "./BasicBlock.js";
|
|
|
2
2
|
import { BlockComponent } from "./blockComponent.js";
|
|
3
3
|
|
|
4
4
|
export class GeometryBlock extends BasicBlock{
|
|
5
|
+
/**
|
|
6
|
+
* 带模型方块类
|
|
7
|
+
* @param {string} identifier 方块标识符 由命名空间和方块名组成 例如 "my_mod:stone"
|
|
8
|
+
* @param {string} category 方块的分类 "construction", "nature", "equipment", "items", and "none"
|
|
9
|
+
* @param {string} geometry 模型标识符
|
|
10
|
+
* @param {Object} material_instances 材质实例对象
|
|
11
|
+
* @param {Object} options 可选参数
|
|
12
|
+
*/
|
|
5
13
|
constructor(identifier, category, geometry, material_instances, options = {}) {
|
|
6
14
|
super(identifier, category, [material_instances["*"]["texture"]], options);
|
|
7
15
|
this.addComponent(
|
|
@@ -5,6 +5,7 @@ import { FeatureRule } from "../feature_rule/FeatureRule.js";
|
|
|
5
5
|
import { BasicBlock } from "./BasicBlock.js";
|
|
6
6
|
|
|
7
7
|
export class OreBlock{
|
|
8
|
+
|
|
8
9
|
constructor(identifier, category, textures_arr, options = {}){
|
|
9
10
|
this.block = new BasicBlock(identifier, category, textures_arr, options);
|
|
10
11
|
this.feature = new OreFeature(`${identifier}_ore_feature`,6,[
|