Posted July 7, 20232 yr I have a bug, every 20 ticks the program add mana, but it is happening twice and must happen only once. The code: @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { if(event.side == LogicalSide.SERVER) { event.player.getCapability(PlayerManaProvider.PLAYER_MANA).ifPresent(mana -> { if(mana.getMana() < mana.getMaxMana() && (event.player.getCommandSenderWorld().getGameTime() % mana.getREGEN_TIME()) == 0) { //will be regen int add = (int) (mana.getMaxMana()*mana.getManaRegen()); mana.addMana(add); //xp to up mana.addMxp(add); //mana xp enough to up if(mana.getMxp() >= mana.getManaToUp()){ mana.manaUpProcess(); } //message event.player.sendSystemMessage(Component.literal("mana add "+mana.getMana()+ "/"+mana.getMaxMana()+ " mana xp:"+mana.getMxp()+" mana level:"+mana.getMl()+ " tick that happend:"+event.player.getCommandSenderWorld().getGameTime())); ModMessages.sendToPlayer(new ManaDataSyncS2CPacket(mana.getMana()), ((ServerPlayer) event.player)); } }); } } I put a message to be sent in the game. this is what I receive: [CHAT] mana add 4/400 mana xp:128 mana level:6 tick that happend:18080 [CHAT] mana add 8/400 mana xp:132 mana level:6 tick that happend:18080 [CHAT] mana add 12/400 mana xp:136 mana level:6 tick that happend:18120 [CHAT] mana add 16/400 mana xp:140 mana level:6 tick that happend:18120 Ass you see the last number is the tick and it is the same as the previous one. So it has a way to fix it without a var to verify if the tick is not the same? Observation: I already used "event.player.getRandom().nextFloat() < 0.005f" and and it won't work ass I want.
July 8, 20232 yr PlayerTickEvents fire twice per tick, once with a START phase and later with an END phase. As well as checking event.side, also check that event.phase matches the phase you want it to occur in. I have a ticking capability very similar to yours, this is how I do it: @SubscribeEvent public static void tick(TickEvent.PlayerTickEvent event) { if(event.side == LogicalSide.SERVER && event.phase == TickEvent.Phase.END) { event.player.getCapability(CombatTimeCapability.INSTANCE).ifPresent(CombatTimeCapabilityInterface::tickCombat); } }
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.