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);
}
}