白门
本帖最后由 白门 于 2021-4-28 20:43 编辑

已经自行解决:
motions and velocity 就是要放在客户端与服务端同时进行
来源:Forge官方论坛:https://forums.minecraftforge.ne ... le-to-set-y-motion/

问题描述:当我尝试从!world.isRemote 服务端操作某个实体的Motion V3d变量,在客户端上该项操作恒定失败。
情景1:当玩家在奔跑时和某个无碰撞方块产生碰撞,就给玩家一个向上的动量,实现“跑起来就不会从方块上掉下去”的效果。
@Mod.EventBusSubscriber()
public class BlockEventHandler {
    @SubscribeEvent
    public static void onXXXXXBlockSprintingEvent(TickEvent.PlayerTickEvent event){
        if(event.player.isSprinting()){
            if(BlockUtil.isLivingOnXXXXXBlock(event.player.world,event.player)){
                Vector3d vector3d = event.player.getMotion();
                vector3d = new Vector3d(vector3d.x, 0.2f, vector3d.z);
                event.player.setMotion(vector3d);
            }
        }
    }
}
当将这段代码完全放在服务端时,在游戏里无论如何奔跑都会从方块表面摔落。但是去掉if(!world.isRemote)后,这段代码运行的结果看上去就无比正常。

情景2:获取玩家的V3d作为参数来确认玩家跑步朝向,以实现往玩家奔跑奔跑方向自动搭桥。
@SubscribeEvent
public static void ThatDamnPossibllyBuggyEvent_GenerateBridge(TickEvent.PlayerTickEvent event){
    if (SomeNormalCondition)) {
        if (event.player.isSprinting()) {
            ANormallyFunctionalClass.turningNearbyAirIntoBridgeBlock(event.player, event.player.world, event.player.getPosition(), event.player.getMotion());
        }
    }
}
当将这段代码或其调用的方法的代码完全放在服务端侧时,搭建出来的桥梁永远只有一个朝向(也就是v3d中x和z分量完全为0)。是去掉if(!world.isRemote)后,这段代码运行的结果看上去仍旧无比正常。请问这个现象是否正常?是否LivingEntity的V3d操作必须要客户端与服务端同时进行?
如果LivingEntity的V3d操作只需要放在服务端,那么我的代码哪里出现了错误?漏掉了什么?
有什么解决方案吗?非常感谢!



补充:我试了一下print V3d。
[18:49:07] [Server thread/INFO] [STDOUT/]: [xxxHandler:test:27]: is it Client?false Motion:(0.0, -0.0784000015258789, 0.0)
[18:49:07] [Render thread/INFO] [STDOUT/]: [xxxHandler:test:27]: is it Client?true Motion:(-0.054178253739439027, -0.0784000015258789, 0.11859446795296712)

嗯...好像确实服务端无法正常获取。

白门
已经自行解决:
结论是:motions and velocity 就是要放在客户端与服务端同时进行,来源
而且看到3TUSK最近在研究Entity移动的问题,服务器端Entity移动式离散的