1.15.2 给物品添加使用cd


版本信息
你使用的系统:win10 64位
你是用的JDK: 1.8 64位
你使用的IDE:IntelliJ IDEA
你使用的IDE版本:2020.1.4
Forge版本: 1.15.2-31.2.0
Minecraft版本: 1.15.2

错误情况简述
目标:右击后向准心方向冲刺,通过读取游戏时间来达到设置CD的效果。
问题1::使用时如果持续按住右键或快速连续右击会进入CD但未成功冲刺。
问题2:如何在触发冲刺后的0.5秒将速度归零。

相关代码
<HitShield>

package com.AnECanSaiTin.MyTest.Item;

import com.AnECanSaiTin.MyTest.Loder.ModGroup;
import com.AnECanSaiTin.MyTest.Tool.XYZFloat;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.world.World;

import java.util.concurrent.TimeUnit;

import static java.lang.Math.cos;
import static java.lang.Math.sin;


public class HitShield extends Item {

    long CD = 1 * 20;
    long endTime ;
    float totalSpeed = 2.5f;

    public HitShield(){
        super(new Properties().group(ModGroup.itemGroup).maxStackSize(1));
    }

    @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
        ItemStack itemstack = playerIn.getHeldItem(handIn);
        playerIn.setActiveHand(handIn);
        long gameTime = worldIn.getGameTime();
        if (endTime < gameTime) {
            playerIn.addVelocity(EntityAim(playerIn).x , 0 , EntityAim(playerIn).z);
            endTime = gameTime + CD;
        }
        return ActionResult.resultPass(itemstack);
    }


//由和速度(total)计算x,z方向分速度
    private XYZFloat EntityAim(LivingEntity entity) {
        XYZFloat xyzFloat = new XYZFloat();

        float RotationX = entity.rotationYaw;
        xyzFloat.x = 0 - totalSpeed * sin(Math.toRadians(RotationX));
        xyzFloat.z = totalSpeed * cos(Math.toRadians(RotationX));
        return xyzFloat;

    }
}

<HitShield>

package com.AnECanSaiTin.MyTest.Tool;

public class XYZFloat {
    public double x;
    public double y;
    public double z;
}

FledgeXu


设置CD你试试setCoolDown这个方法,可以参考原版的末影珍珠和弓。
关于速度归零,你可以试试scheduleTick(另外,Minecraft的所有时间单位都是tick,请不要用秒来计数)。



问题1:使用时如果持续按住右键或快速连续右击会进入CD但未成功冲刺。

考虑重载 Item#onItemUseFinishItem#onPlayerStoppedUsing,而不是 Item#onRightClick。前者是原版食物的实现,后者是原版弓的实现。



没看懂scheduleTick如何使用,需要提供BlockPOS和Block。


FledgeXu


那应该不行了,玩家移动应该是一个纯客户端的行为。
瞬移可以,但是加速不行。
或许你可以考虑给玩家上一个短暂的速度buff。



加速已经通过addVelocity实现了,减速同理,但需要来个延迟。直接用wait这类造成阻塞的肯定是不行的,我在想能不能通过新建一个线程来单独处理减速。或者有什么方法提供了类似于until.Timer的方法但是是基于Tick来实现。


FledgeXu


别用开线程来延迟,这是最为愚蠢的方法
实在不行就写在类似WorldTick的事件里。


Snownee


整个思路就是有问题的。冲刺是个状态,应该写在Effect里面。冷却应该通过setCooldown实现。想想在多人服务器里,只有一个CD是可行的吗?


system


该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。