フォーラムへの返信
- 投稿者投稿
コウクマ
参加者コウクマ
参加者編集したら消えたので再度
【構造】
behaviorとresourceの中身をそれぞれ「.mcpack」にする
その二つをまとめて「.mcaddon」にするTESTPack ← TESTPack.mcaddon |-TEST_BP ← TEST_BP.mcpack |-manifest.json |-scripts |-main.js |-TEST_RP ← TEST_RP.mcpack |-manifest.json |-ui |-hub_screen.json【マニフェストのコード】
・BP{ "format_version": 2, "header": { "name": "TEST 1", "description": "TEST-addon", "uuid": "97a08d8c-c22e-4fba-ac57-f6c6a00848c4", "version": [1, 0, 0] }, "modules": [ { "type": "data", "uuid": "headerとは別のUUID", "version": [1, 0, 0] }, { "type": "script", "language": "javascript", "uuid": "4d0c10ea-f88e-44a8-bf16-b5975f28d000", "version": [1,0,0], "entry": "scripts/main.js" } ], "metadata": { "authors": ["製作者名"], "product_type": "addon" }, "dependencies": [ { "uuid": "d8c69bd5-f645-4ece-b8b4-cb174dd6d401", ←ここでRPのheaderのUUIDと紐づけ "version": [1, 0, 0] }, { "module_name": "@minecraft/server-ui", ←ActionFormDataとかを使うなら必要 "version": "1.3.0" }, { "module_name": "@minecraft/server", "version": "1.10.0" } ] }・RP
{ "format_version": 2, "header": { "name": "TEST 1", "description": "TEST-addon", "uuid": "d8c69bd5-f645-4ece-b8b4-cb174dd6d401", "pack_scope": "world", "version": [1,0,0] }, "modules": [ { "type": "resources", "uuid": "878ab913-c67c-48f0-8ba6-22b91e9a9902", "version": [1,0,0] } ], "metadata": { "authors": ["製作者名"], "product_type": "addon" }, "dependencies": [ { "uuid": "97a08d8c-c22e-4fba-ac57-f6c6a00848c4", ←ここでBPのheaderのUUIDと紐づけ "version": [1,0,0] } ] }コウクマ
参加者例えばですが、
受付モブを用意して、受付モブにチケットを渡す(チケットを持って右クリック)するとスタンプカードを受け取れるようにする
※playerInteractWithEntityを発生させるためにはモブに「minecraft:interact」コンポーネントを持たせる必要がありますworld.afterEvents.playerInteractWithEntity.subscribe(event => { // クリックしたモブが受付モブだったら if (event.target.typeId === "namespace:reception") { // チケットを持っていたら if (event.itemStack !== undefined && event.itemStack.typeId === "namespace:ticket") { // プレイヤーの右手にスタンプカードを持たせる const equippable = event.player.getComponent(EntityComponentTypes.Equippable) as EntityEquippableComponent; equippable.setEquipment(EquipmentSlot.Mainhand, new ItemStack("namespace:stamp_card", 1)); } } });スタンプカードは3Dモデルで用意して、render_controllersでスタンプの表示を制御する
プレイヤーにスタンプ1~15分のon,offを制御する用のプロパティを持たせる、デフォルトはoff"properties": { "namespace:stamp_1": { "type": "bool", "default": false, "client_sync": true }, ・・・スタンプ台ブロック1~15を作って、カスタムコンポーネントを持たせ、スタンプ台を右クリックしたら対応する番号のスタンプ表示プロパティをonにする
export class stampTable implements BlockCustomComponent { onPlayerInteract(event:BlockComponentPlayerInteractEvent, arg: CustomComponentParameters) { const player = event.player as Player; const equ = player.getComponent(EntityComponentTypes.Equippable) as EntityEquippableComponent; const itemStack = equ.getEquipment(EquipmentSlot.Mainhand) as ItemStack; if (itemStack !== undefined) { if (itemStack.typeId === "namespace:stamp_card") { // カスタムコンポーネントの番号のパラメータを持たせておく const stamp = arg.params; player.setProperty("namespace:stamp_" + stamp.num, true); } }ブロック側に特定のプレイヤーが押し済みかどうかを持たせるのは難しいので、
ブロックを右クリックしたときにプレイヤーのスタンプ表示プロパティのon,offを見て、MessageFormとか、player.sendMessageでメッセージを出すのがいいかと思います。
すべてスタンプが集まったら、最初のと同じように受付モブを右クリックしたときのイベントで、
スタンダードを持っていて、プレイヤーのスタンプ表示プロパティがすべてonになっている場合に、報酬アイテムを渡すようにするといいと思います。コウクマ
参加者win11に表示されるファイルの種類がMinecraft Supportファイルなだけで、拡張子は.mcaddonなのでは?
コウクマ
参加者テスクチャーパックだけということは、バニラのブロックのテクスチャを変えるだけということですか?
それならバニラの状態毎のテクスチャを変えるだけだと思いますが。
たとえばニンジンならこれを置き換えればいいだけかと。
carrots_stage_0.png
carrots_stage_1.png
carrots_stage_2.png
carrots_stage_3.png
オリジナルのブロックならそもそもビヘイビアパックが必要です。コウクマ
参加者ブロックJSONファイルでステートの状態毎にテクスチャを変えられます
{ "format_version": "1.21.20", "minecraft:block": { "description": { "states": { "名前空間:ステート名": [0, 1] } }, "components": {~}, "permutations": [ { "condition": "query.block_state('名前空間:ステート名') == 0", "components": { "minecraft:material_instances": { "*": {"texture": "ステート0のテクスチャ名"} } } }, { "condition": "query.block_state('名前空間:ステート名') == 1", "components": { "minecraft:material_instances": { "*": {"texture": "ステート0のテクスチャ名"} } } } ] } }コウクマ
参加者EntityTameableComponentのtamedToPlayerIdのidが自分かどうかを見ればできると思います
const tameable = entity.getComponent(EntityComponentTypes.Tameable) as EntityTameableComponent; if (tameable.tamedToPlayerId === player.id) { }jsonでは無理かと思います。
world.afterEvents.dataDrivenEntityTriggerで「minecraft:convert_to_drowned」(ドラウンドの例)など返信時のeventを拾って
TameableやnameTagなどを返信後に付けなおせば出来ると思いますコウクマ
参加者https://learn.microsoft.com/ja-jp/minecraft/creator/documents/blockbench?view=minecraft-bedrock-stable
初めてならPCでBlockbenchを入れて、blockプラグインを入れるのがいいですね。
モデルだけでなく、ビヘイビアも自動生成してくれます。コウクマ
参加者スクリプトAPIを使えばできますね。
world.afterEvents.projectileHitBlockとworld.afterEvents.projectileHitEntityから
こんな感じで爆発を発生させつつ、別で自分以外にダメージを与える。async function explosion(projectile:Entity, source:Entity, dimension:Dimension, location:Vector3) { if (projectile.typeId === "minecraft:snowball") { // 爆発を発生させたいアイテムなら(json側では爆発させない) const option = { allowUnderwater: false, // 対中でも爆発するか breaksBlocks: true, // ブロックを破壊するか causesFire: false, // 爆発で火が付くか source: source // 爆発を発生させたのは誰か } as ExplosionOptions; // イベントが発生した場所で、範囲2ブロック分爆発を発生させる const bom = dimension.createExplosion(location, 2, option); if (bom) { // 爆発が発生した場合 source.addTag(source.id); // 爆発物を投げたモブを除外させるためにタグをセット // 条件を付けて爆発した範囲のモブを取る dimension.getEntities({ location: location, // 発生源の位置 excludeFamilies: ["player"], // すべてのプレイヤーを除外したいならこれを入れる excludeTypes: ["item"], // ドロップアイテムを除外 maxDistance: 2, // 発生源から2ブロックの範囲 excludeTags: [source.id] // 投げたモブ自身につけたタグを除外 // 範囲内にいる条件に一致したモブの数だけ実行 }).forEach(entity => { // モブが水中にいる場合は影響を無くす(判定はなくてもOK) if (!entity.isInWater) { // モブに爆発ダメージを与える entity.applyDamage(2, { cause: EntityDamageCause.entityExplosion, damagingEntity: source }); } }); source.removeTag(source.id); // タグを外す } } }- 投稿者投稿

