Delamer
本帖最后由 Delamer 于 2019-11-2 01:12 编辑

版本:Spigot-1.13.2
想为玩家针对不同场景设置更长或更短的的攻击CD,但是不知道如何拦截玩家的攻击动作.
我试着使用监听器监听了伤害事件,并对伤害来源当前手中的道具设置CD,虽然道具栏对应位置出现了CD进度的提示,但是冷却结束之前玩家依然可以使用该武器进行攻击,而且这个方法在实体受到无主伤害(岩浆,摔落)时后台还会报错.
所以想请问一下大佬们,如何修改代码才能实现 "在武器CD结束前拦截玩家攻击动作,使其无法手持正在冷却的武器进行攻击" 的效果呢?


粘兽
  1. @EventHandler
  2. public void onDamage(EntityDamageByEntityEvent e){
  3.     // 判断攻击者是否为玩家
  4.     if(e.getDamager() != null && e.getDamager() instanceof Player){
  5.         Player player = (Player) e.getDamager();
  6.         ItemStack item = player.getInventory().getItemInMainHand();
  7.         // 判断主手物品是否为空
  8.         if(item == null || item.getType().equals(Material.AIR)){
  9.             return;
  10.         }
  11.         // 判断主手物品是否在冷却
  12.         if(player.hasCooldown(item.getType())){
  13.             e.setCancelled(true);
  14.             return;
  15.         }
  16.         // 给主手物品设置冷却
  17.         player.setCooldown(item.getType(),40);
  18.     }
  19. }
复制代码



mc能吃吗
嗯。。。首先,你需要判断getDamager()是不是一个HumanEntity
其实你可以直接用Player,除非你想僵尸这些生物也会有同样的效果

其次,SetCooldown并不能直接设置玩家的攻击冷却,或许你可以使用ItemMeta类下的 addAttributeModifier() 方法来增加一个负攻击时长的属性。这里说一下MC原版冷却设定:1÷攻击间隔 比如剑攻速1.6 1÷1.6=0.625 所以剑的攻击CD就是0.625秒

添加方法:
  1. new AttributeModifier("name", -1, AttributeModifier.Operation.ADD_NUMBER)
复制代码

构建一个新的属性修饰符。-1是要添加的量,枚举AttributeModifier.Operation.ADD_NUMBER则是表示添加数值(或许枚举前缀错误,需要修改)

然后,
  1. ItemMeta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, AttributeModifier modifier/*就是上面你new的*/)
复制代码

之后setItemMeta就行了。在这里第一个参数就是攻速属性的枚举

暗影修卡
六六六六六六六六

第一页 上一页 下一页 最后一页