HuaV 发表于 2026-1-18 01:02:19

如何实现伤害随机数

我在开发一个附加包,考虑实现一个功能:当使用武器攻击时,造成给定数字范围内随机伤害,或者给定数字范围内的附加伤害,有没有尽可能简单的实现方法

牢冥王 发表于 2026-1-18 01:02:20

本帖最后由 冥王大大 于 2026-1-18 17:02 编辑

脚本用自定义组件实现很容易,但前提是要会这个东西,比如:
import { world, system } from "@minecraft/server";
system.beforeEvents.startup.subscribe((ini) => {
    ini.itemComponentRegistry.registerCustomComponent("gm:damage_in_range", {onHitEntity: (h, p) => {
      const paras = p.params
      const inidam = paras.min+Math.random()*(paras.max-paras.min)
      const uplvl = (h.attackingEntity.getEffect("strength")?.amplifier??-1)+1
      const downlvl = (h.attackingEntity.getEffect("weakness")?.amplifier??-1)+1
      const sharplvl = h.itemStack.getComponent("minecraft:enchantable")?.getEnchantment("sharpness")?.level??0
      let moddam = (1.3**uplvl)*inidam*(0.8**downlvl)+Math.floor(1.25*sharplvl)
      if (h.hitEntity.getComponent("minecraft:type_family").hasTypeFamily("arthropod")) {
            moddam = moddam+Math.floor(2.5*(h.itemStack.getComponent("minecraft:enchantable")?.getEnchantment("bane_of_arthropods")?.level??0))
      }
      if (h.hitEntity.getComponent("minecraft:type_family").hasTypeFamily("undead")) {
            moddam = moddam+Math.floor(2.5*(h.itemStack.getComponent("minecraft:enchantable")?.getEnchantment("smite")?.level??0))
      }
      if (h.hitEntity.isInWater) {
            moddam = moddam+Math.floor(2.5*(h.itemStack.getComponent("minecraft:enchantable")?.getEnchantment("impaling")?.level??0))
      }
      h.hitEntity.applyDamage(moddam, {cause: "entityAttack", damaingEntity: h.attackingEntity})

    }});

});
武器(剑)的JSON:
{
"format_version": "1.21.90",
"minecraft:item": {
    "description": {
      "identifier": "namespace:test_sword",
      "menu_category": {
      "group": "minecraft:itemGroup.name.sword",
      "category": "equipment"
      }
    },
    "components": {
      "minecraft:icon": {
      "textures": {
          "default":"stick"
      }
      },
      "minecraft:durability": {
      "max_durability": 372,
      "damage_chance": {
          "min": 20,
          "max": 60
      }
      },
      "minecraft:hand_equipped": true,
      "minecraft:can_destroy_in_creative": false,
      "minecraft:max_stack_size": 1,
      "minecraft:mining_speed": 1,
      "minecraft:digger": {
      "use_efficiency": true,
      "destroy_speeds": [
          {
            "block": "minecraft:web",
            "speed": 15
          },
          {
            "block": "minecraft:bamboo",
            "speed": 100
          }
      ]
      },
      "gm:damage_in_range": {
      "min": 1,
      "max": 10
      }
    }
}
}
需要注意,玩家是有基础伤害的,这个只是在玩家的基础伤害上加额外伤害,模拟伤害可能跟游戏逻辑有出入

HuaV 发表于 2026-1-18 19:58:11

为什么苦力怕论坛变了?

冥王大大 发表于 2026-1-18 17:00
脚本用自定义组件实现很容易,但前提是要会这个东西,比如:
import { world, system } from "@minecraft/s ...

了解!这大概是用javaScript写了一个自定义组件,来使得具有该组件的物品在左键攻击实体之后发生造成伤害事件....如果前提是我不会(事实上确实如此)我还想学,我该从哪里开始。

牢冥王 发表于 2026-1-18 23:49:14

HuaV 发表于 2026-1-18 19:58
了解!这大概是用javaScript写了一个自定义组件,来使得具有该组件的物品在左键攻击实体之后发生造成伤害 ...

这个帖子里面有官方文档和Javascript的文档,建议从官方文档的内容出发,再逐步学里面涉及到的JS语句。教程板块还有很多针对SAPI的教程,你可以参考一下
页: [1]
查看完整版本: 如何实现伤害随机数