本帖最后由 t1546542 于 2020-1-22 13:29 编辑
灵感源自于此帖子
感谢隐退与@Chelove_C60
的支持与帮助


复制代码#给玩家的指定装备
复制代码复制代码复制代码复制代码复制代码复制代码
复制代码复制代码复制代码
灵感源自于此帖子
感谢隐退与@Chelove_C60
的支持与帮助

制作目的及思路
在玩家攻击的时候,给玩家加血
在玩家攻击的时候,给玩家头盔的最大生命值属性修改为自身血量+attackhealth-20最大生命的装备
之后给玩家瞬间回复10效果
最后把头盔的最大生命值属性还原
缺点:占用一个装备栏,且除此装备以外的装备不能有最大生命值属性,加血量无法为浮点数。

事先准备
/scoreboard objectives add attackhealth dummy
/scoreboard objectives add attackhealth2 dummy
/scoreboard objectives add attackhealth3 dummy
/scoreboard objectives add attackhealtht dummy
/scoreboard objectives add health dummy
/scoreboard objectives add health2 dummy
/scoreboard objectives add health3 dummy
/scoreboard objectives add playerattack minecraft.custom:minecraft.damage_dealt
/scoreboard objectives add 血量 health
scoreboard players set #basishealth attackhealth 20
#以上命令需要在聊天栏输入
scoreboard players set @a health 0
scoreboard players set @a health2 20
#以上命令需要命令方块执行,且要设置为重复保持开启
- /replaceitem entity @a armor.head minecraft:iron_helmet{AttributeModifiers:[{Operation:0,UUIDLeast:1,UUIDMost:2,Amount:0,AttributeName:"generic.maxHealth",Name:"noName",Slot:head}],Unbreakable:1,Enchantments:[{id:binding_curse,lvl:1}]} 1

第一组CB
- execute as @a run scoreboard players operation @s attackhealth2 = @s attackhealth
#为了不让attackhealth改变,用一个attackhealth2计分项存分,同时也重置了attackhealth2
- execute as @a store result score @s attackhealth3 run scoreboard players operation @s attackhealth2 += @s 血量
#用attackhealth3存取attackhealth2 + 玩家现在血量的分数
- execute as @a run scoreboard players operation @s attackhealth3 -= #basishealth attackhealth
#attackhealth3与#basishealth的attackhealth相减(这里#basishealth设置的是20,因为要减去玩家基础血量),结果会存到attackhealth3上
- execute as @a[scores={playerattack=0..}] store result entity @s Inventory[{Slot:103b}].tag.AttributeModifiers[{AttributeName:"generic.maxHealth"}].Amount double 1 run scoreboard players get @s attackhealth3
#替换所有造成攻击的玩家的指定头盔的最大生命值数值为attackhealth3*1
- scoreboard players set @a[scores={playerattack=0..}] attackhealtht 3
#给所有造成攻击的玩家的attackhealtht计分项分数设置为3(这里是一个schedule就是可以指定延迟一段时间后执行函数)
- scoreboard players reset @a[scores={playerattack=0..}] playerattack
#重置所有造成攻击的玩家的playerattack计分项分数

第二组CB
- scoreboard players remove @a[scores={attackhealtht=1..}] attackhealtht 1
#给所有attackhealtht分数大于1的玩家减attackhealtht分数1分
- effect give @a[scores={attackhealtht=1}] minecraft:instant_health 1 10
#给所有attackhealtht=1的玩家瞬间回复10
- execute as @a[scores={attackhealtht=0}] store result entity @s Inventory[{Slot:103b}].tag.AttributeModifiers[{AttributeName:"generic.maxHealth"}].Amount double 1 run scoreboard players get @s health
#替换所有attackhealtht=0的玩家的头盔最大生命值属性为health分数

第三组CB
复制代码复制代码

这里说一个特性
玩家如果血条满了再加血的话
在玩家掉血的时候会免疫一次伤害
为了修复这个bug
在玩家的血量超过最大血量时
给玩家一个凋零效果
(如果你其他装备有最大生命值效果,那么这个就没用了
或者你还可以让所有装备栏的最大生命值属性相加并检测)
- execute as @a store result score @s health3 run scoreboard players operation @s health2 += @s health
#让所有人的health2分数与health分数相加,并储存到health3计分板上(前面set health2分数要循环,因为要重置)
- execute as @a if score @s 血量 > @s health3 run effect give @s minecraft:wither 1 1
#如果玩家血量超过最大血量,给玩家一个凋零效果(这里的时间和等级算好了)

使用方法
输入/scoreboard players set @s attackhealth [数值]
即可调整每次攻击的加血量

欢迎各位大佬们指出bug
水经验................
本帖最后由 Jokey_钥匙 于 2020-1-22 17:31 编辑
可以说是又是一大技术突破
CBer们距离自由修改nbt又进了一步
所谓缺点是不存在的:因为在Minecraft中 同一个装备只要每个属性的uuid不同 即使装备的每个属性的增幅效果完全相同 这些属性仍然全部有效
@ruhuasiyu 什么东西可以更新了
可以说是又是一大技术突破
CBer们距离自由修改nbt又进了一步
所谓缺点是不存在的:因为在Minecraft中 同一个装备只要每个属性的uuid不同 即使装备的每个属性的增幅效果完全相同 这些属性仍然全部有效
@ruhuasiyu 什么东西可以更新了
本帖最后由 Chelove_C60 于 2020-1-22 17:39 编辑
我的天你居然建了9个计分板
其实使用function借助虚拟玩家可以大大减少计分板的数量,至少看起来不会那么让人崩溃
以下是基于execute run function及schedule思想,依照楼主的思路写的一个东西
使用的计分板
/scoreboard objectives add addHealth dummy
游戏内循环
function test:add_health
add_health.mcfunction复制代码get_health.mcfunction复制代码set_helmet.mcfunction复制代码1t.mcfunction复制代码remove_helmet.mcfunction复制代码
大致思路和楼主所述基本相同,不过只用了一个计分板(addHealth)和一个虚拟玩家(#health)
当需要给玩家加血时,设置玩家的addHealth计分板分数即可。
然后会首先执行add_health的第二行命令(因为这个时候玩家还没有add_health标签),获取玩家血量,加上需要增加的血量,再减去20。如果分数小于0,则需要给玩家一个头盔来限制玩家的最大血量(函数set_helmet)。
由于测试中玩家的属性下一刻才会生效,所以这一刻所做的事情到此为止,为玩家添加add_health标签做标记。
下一刻,游戏检测到有add_health标签的玩家,于是执行函数1t。给有标签的玩家瞬间治疗,然后如果有头盔,则剥夺头盔。
缺点是存在1刻的时间,玩家需要佩戴指定头盔(如果要恢复的血量超过了最大生命值上限,则不需要)。
另外,这样要求玩家不能头戴别的头盔。不过有解决方法,只是我懒得写了
↓没看到有不用function的要求啊
另外我只是单纯的觉得一堆计分板看着不舒服而已
我的天你居然建了9个计分板
其实使用function借助虚拟玩家可以大大减少计分板的数量,至少看起来不会那么让人崩溃
以下是基于execute run function及schedule思想,依照楼主的思路写的一个东西
使用的计分板
/scoreboard objectives add addHealth dummy
游戏内循环
function test:add_health
add_health.mcfunction
- execute as @a[tag=add_health] run function test:1t
- execute as @a[scores={addHealth=1..}] run function test:get_health
- tag @s add add_health
- execute store result score #health addHealth run data get entity @s Health
- scoreboard players operation #health addHealth += @s addHealth
- scoreboard players remove #health addHealth 20
- execute if score #health addHealth matches ..-1 run function test:set_helmet
- scoreboard players reset @s addHealth
- replaceitem entity @s armor.head minecraft:diamond_helmet{AttributeModifiers:[{AttributeName:"generic.maxHealth",Amount:0d,UUIDLeast:233L,UUIDMost:233L}]}
- execute store result entity @s Inventory[{Slot:103b}].tag.AttributeModifiers[0].Amount double 1 run scoreboard players get #health addHealth
- tag @s add helmet
- effect give @s instant_health 1 28 true
- execute if entity @s[tag=helmet] run function test:remove_helmet
- tag @s remove add_health
- replaceitem entity @s armor.head air
- tag @s remove helmet
大致思路和楼主所述基本相同,不过只用了一个计分板(addHealth)和一个虚拟玩家(#health)
当需要给玩家加血时,设置玩家的addHealth计分板分数即可。
然后会首先执行add_health的第二行命令(因为这个时候玩家还没有add_health标签),获取玩家血量,加上需要增加的血量,再减去20。如果分数小于0,则需要给玩家一个头盔来限制玩家的最大血量(函数set_helmet)。
由于测试中玩家的属性下一刻才会生效,所以这一刻所做的事情到此为止,为玩家添加add_health标签做标记。
下一刻,游戏检测到有add_health标签的玩家,于是执行函数1t。给有标签的玩家瞬间治疗,然后如果有头盔,则剥夺头盔。
缺点是存在1刻的时间,玩家需要佩戴指定头盔(如果要恢复的血量超过了最大生命值上限,则不需要)。
另外,这样要求玩家不能头戴别的头盔。不过有解决方法,只是我懒得写了
↓没看到有不用function的要求啊
另外我只是单纯的觉得一堆计分板看着不舒服而已
Chelove_C60 发表于 2020-1-22 17:15
我的天你居然建了9个计分板
其实使用function借助虚拟玩家可以大大减少计分板的数量,至少看起来不会那么让 ...
头盔可以先暂存在storage里,下一秒再处理
控制了感觉没意思啊
那这个电脑配置不好会不会崩掉
感谢分享,怼我的服务器很有用
作为一个小白完全看不懂