跳到主要内容

17添加药水效果

添加效果:

public class ApplyEffect implements CommandExecutor {

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

if (sender instanceof Player) {
if (args.length >= 1) {
Player player = (Player) sender;

PotionEffect potionEffect = null;
switch (args[0].toLowerCase()) {
case "enum":
// /potion enum
// 枚举模板创建
potionEffect = getPotionEffectFromEnum();
break;
case "new":
// /potion new
// 直接new出
potionEffect = getPotionEffectFromNew();
break;
default:
sender.sendMessage("未知的命令");
return true;
}

// 给实体赋予药水效果
// potionEffect.apply(player); // 两个是同一个方法
player.addPotionEffect(potionEffect);
return true;
}

sender.sendMessage("请输入一个效果:[enum, new]");
return true;
}
sender.sendMessage("只有玩家才能使用当前指令!");
return true;

}

private PotionEffect getPotionEffectFromEnum() {

// 挑选一个枚举值,得到PotionEffectType
// 利用PotionEffectType默认的参数new出一个PotionEffect
return PotionEffectType.SPEED.createEffect(20 * 10, 5);

}

private PotionEffect getPotionEffectFromNew() {

/**
* 直接new出一个PotionEffect
* 第一个参数:PotionEffectType 药水效果
* 第二个参数:duration 20 * 10 ticks 持续时间
* 第三个参数:amplifier [0~XXX] 药水等级,0:一级,1:二级...
* 第四个参数:ambient [true|false] true时,生物周围的药水粒子更少,颜色更透明
* 第五个参数:particles [true|false] true时,生物周围会有粒子效果
* 第六个参数:showIcon [true|false] false时,玩家的主界面不会出现药水图标
*/
return new PotionEffect(PotionEffectType.SPEED, 20 * 10, 0, false, true, true);

}

}

获得药水:

public class GetPotion implements CommandExecutor {

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

if (sender instanceof Player) {
Player player = (Player) sender;

if (-1 != player.getInventory().firstEmpty()) {
PlayerInventory inventory = player.getInventory();

ItemStack potionStack = new ItemStack(Material.POTION); // 创建物品槽,用于存放药水

PotionMeta potionMeta = (PotionMeta) potionStack.getItemMeta(); // 得到药水的meta
addAllPotionEffects(potionMeta); // 添加所有药水效果
potionMeta.setColor(Color.fromRGB(178,176,170)); // 修改药水的颜色
// potionMeta.setColor(Color.GREEN); // 修改药水的颜色

potionStack.setItemMeta(potionMeta);
inventory.addItem(potionStack);
} else {
sender.sendMessage("背包已满!");
}

return true;
}
sender.sendMessage("只有玩家才能使用当前指令!");
return true;

}

private void addAllPotionEffects(PotionMeta potionMeta) {
Stream.of(PotionEffectType.values())
// 遍历Type
.forEach(potionEffectType -> {
// 给meta添加一个药水效果
potionMeta.addCustomEffect(
// 10秒、一级、粒子效果更明显,ui界面带有图标的药水效果
new PotionEffect(potionEffectType, 20 * 10, 0, false, true, true),
// 如果玩家存在该药水效果,则强制替换
true
);
});
}

}

效果:

image-20240910122244496