Jump to content

onPlayerTick happening more than one time


SrPatsu21

Recommended Posts

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.

Link to comment
Share on other sites

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);
        }
    }
  • Thanks 1
Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.