Fake players trigger raids 1 gametick later than real players in 1 dimensional TNT or firework looting raid farm. As 1.18+ raid farm requires precise timing of triggering raid, this difference makes fake players unusable in these farms.
Here is the micro-timing analysis:
Real players:
Gametick 0:
Entity ticking phase:
ServerPlayer::tick() is called, but it doesn't call super.tick()
TNT (or firework) explodes, kills raiders, and applies the player(killer) with Bad Omen effect
Network update phase:
ServerPlayer::doTick() is called. And it calls super.tick(), where the Bad Omen efffect will be ticked. So the player triggers raid
Fake players:
Gametick 0:
Entity ticking phase:
EntityPlayerMPFake::tick() is called, as the fake player's entity id here is smaller than the TNTs' and fireworks'
TNT (or firework) explodes, kills raiders, and applies the player(killer) Bad Omen effect
Network update phase:
(nothing important happened)
Gametick 1:
Entity ticking phase:
EntityPlayerMPFake::tick() is called, which calls both ServerPlayer::tick() and ServerPlayer::doTick(), where the Bad Omen efffect will be ticked. So the player triggers raid
Note: if the players are in the overworld and TNTs in the Nether, then there is no difference, as the whole Nether dimension is ticked later than the Overworld.
Edit 1:
“there is no issue“ -> "there is no difference”
Edit 2:
"Entity update phase" -> "Entity ticking phase"
Delete "Note" as I'm not 100% sure about this
Added the names of functions being called(Mojang mapping) in micro-timing analysis
Fake players trigger raids 1 gametick later than real players in 1 dimensional TNT or firework looting raid farm. As 1.18+ raid farm requires precise timing of triggering raid, this difference makes fake players unusable in these farms.
Here is the micro-timing analysis: Real players:
ServerPlayer::tick()
is called, but it doesn't callsuper.tick()
ServerPlayer::doTick()
is called. And it callssuper.tick()
, where the Bad Omen efffect will be ticked. So the player triggers raidFake players:
EntityPlayerMPFake::tick()
is called, as the fake player's entity id here is smaller than the TNTs' and fireworks'EntityPlayerMPFake::tick()
is called, which calls bothServerPlayer::tick()
andServerPlayer::doTick()
, where the Bad Omen efffect will be ticked. So the player triggers raidNote: if the players are in the overworld and TNTs in the Nether, then there is no difference, as the whole Nether dimension is ticked later than the Overworld.Edit 1:
Edit 2: