![[TaCZ] Timeless and Classics Zero](https://media.forgecdn.net/avatars/thumbnails/1005/666/256/256/638527114344804635.png)
[Bug]: 从末地传送门回到主世界后枪械不能射出子弹
sevsn opened this issue · 10 comments
我已确认 ...
- 我正在使用最新版的tacz
- 无法在不安装tacz时复现
Minecraft和模组加载器版本
1.20.1 forge47.3.12
tacz的版本
1.1.4
Related Mods
我卸载了除了tacz以外的所有mod仍然会出现这个bug
Description
我手动建造了一个末地门,并且杀死末影龙后返回主世界,但是在通过末地传送门返回主世界时保持快捷栏在第一个栏位并且第一个栏位里有一把枪,当回到主世界后这个栏位的武器会处于不消耗弹药并且不需要拉栓的射击状态,但是他并不会真的发射子弹并造成伤害,也没有近战伤害,并且换弹会播放动画但是不会真的补充子弹。如果返回主世界时枪里没有子弹,那么枪械不能射击但是仍然有以上的bug。生存模式也会遇到一样的问题
切换快捷栏到其他栏位并且返回第一个栏位之后会恢复正常
通过指令返回主世界不会出现这个问题
返回主世界时快捷栏没选择第一个也不会有这个问题
复现步骤
1.进入末地
2.在第一个快捷栏放一把枪
3.在保持快捷栏在第一个栏位时通过传送门返回主世界
4.在不切换快捷栏的情况下出现这个bug
日志和崩溃报告
我不会说中文,但我在游戏中也遇到了这个问题。Minecraft版本是1.19.2,使用Forge。我发现,进入任何维度都会出现这种情况。
(原来的 | Original text)
I may not speak chinese but i also am seeing this behavior in my game. Minecraft version 1.19.2 on Forge. But, I find that going to any dimension does this.
可以复现。一个临时的 workaround 是切换到其他槽位再切换回来即可解决。
A possible workaround is switching to another hotbar and switch back then it could be solved.
初步的分析结果:从主世界到末地发生了一次 TravelToDimension 事件,返回的过程中是两次,并且返回过程中 ShootDataHolder.currentGunItem 被更改为 null (这不应该修改,因为玩家在此期间没有更改选择的快捷栏槽位)
相同问题,游戏版本1.18.2-Forge40.3.0,模组版本1.1.4
枪械不需要不消耗子弹拉拴就可以射击,但是并未造成伤害。可以理解为枪械射击只有动画。
解决办法也无法解决该问题
希望尽快解决该问题,因为这对于需要快速切换维度的大型整合包来说有很大的影响
相同问题,游戏版本1.18.2-Forge40.3.0,模组版本1.1.4 枪械不需要不消耗子弹拉拴就可以射击,但是并未造成伤害。可以理解为枪械射击只有动画。 解决办法也无法解决该问题 希望尽快解决该问题,因为这对于需要快速切换维度的大型整合包来说有很大的影响
上述workaround在1.20.1有效,不确定是否由于不同的MC代码导致的逻辑不同。
#356 应该解决此问题。
更深层的解析:MC对于玩家移动维度的处理是复制玩家对象并加入新的维度,因此旧的 data 没有继承。
相同问题,游戏版本1.18.2-Forge40.3.0,模组版本1.1.4 枪械不需要不消耗子弹拉拴就可以射击,但是并未造成伤害。可以理解为枪械射击只有动画。 解决办法也无法解决该问题 希望尽快解决该问题,因为这对于需要快速切换维度的大型整合包来说有很大的影响
上述workaround在1.20.1有效,不确定是否由于不同的MC代码导致的逻辑不同。 #356 应该解决此问题。
更深层的解析:MC对于玩家移动维度的处理是复制玩家对象并加入新的维度,因此旧的 data 没有继承。
我调查了一下,是因为之前重生的处理是由客户端处理通知服务器的,但是杀完龙回主世界那下有个鬼畜的特判,也就是客户端不知道自己被重生了一回,然后就爆炸了
@Nullable
public Entity changeDimension(ServerLevel pServer, net.minecraftforge.common.util.ITeleporter teleporter) {
if (!net.minecraftforge.common.ForgeHooks.onTravelToDimension(this, pServer.dimension())) return null;
this.isChangingDimension = true;
ServerLevel serverlevel = this.serverLevel();
ResourceKey<Level> resourcekey = serverlevel.dimension();
if (resourcekey == Level.END && pServer.dimension() == Level.OVERWORLD && teleporter.isVanilla()) { //Forge: Fix non-vanilla teleporters triggering end credits
this.unRide();
this.serverLevel().removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION);
if (!this.wonGame) {
this.wonGame = true;
this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.WIN_GAME, this.seenCredits ? 0.0F : 1.0F));
this.seenCredits = true;
}
return this;
} else {
// ...
}
}
没太理解特判指的是什么,代码没看到标注 :/
edit: 指的是 teleporter.isVanilla() ?
问题能解决即可,虽然说我比较有兴趣了解其原理