本帖最后由 白门 于 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 就是要放在客户端与服务端同时进行
来源: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)
嗯...好像确实服务端无法正常获取。