Нужна помощь с условием и c сохранением/загрузкой текущего значения выносливости

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.14.4
15
2
Помогите написать условие, что бы при удержании Ctr или при двойном нажатии ww игрок не ускорялся, когда стамина = 0.
Так же не сохраняется текущее значение стамины, при новом входе в игру стамина полная.

StaminaHandler:
@Mod.EventBusSubscriber(modid = LegacyMod.MOD_ID)
public class StaminaHandler {
  
    //Возвращает макс. значение стамины.
    public static float getStaminaMax(PlayerEntity player) {

        return (float) player.getAttribute(LegacyAttributes.MAX_STAMINA).getValue(); 
    }
  
    //Возвращает текущее значение стамины.
    public static float getStamina(PlayerEntity player) {
          
        return player.getDataManager().get(LegacyAttributes.STAMINA);
    }
  
   //Устанавливает текущее значение стамины.
    public static void setStamina(PlayerEntity player, float value) {
  
        player.getDataManager().set(LegacyAttributes.STAMINA, MathHelper.clamp(value, 0.0F, getStaminaMax(player)));
    }

    //Сбрасывает значение стамины.
    public static void refillStamina(PlayerEntity player) {
  
        player.getDataManager().set(LegacyAttributes.STAMINA, getStaminaMax(player));
    }
  
    //востонавление стамины на указанную величину.
    public static void regenStamina(PlayerEntity player, float value) {
  
        player.getDataManager().set(LegacyAttributes.STAMINA, MathHelper.clamp(getStamina(player) + value, 0.0F, getStaminaMax(player)));
    }
  
    //Уменьшает стамины на указанную величину.
    public static void decreaseStamina(PlayerEntity player, float value) {

        player.getDataManager().set(LegacyAttributes.STAMINA, MathHelper.clamp(getStamina(player) - value, 0.0F, getStaminaMax(player)));
    }
  
    //Сохранение значения стамины в NBT игрока
    private static void saveStaminaToNBT(PlayerEntity player) {
        
        player.getPersistentData().putFloat(LegacyMod.MOD_ID + ":stamina", getStamina(player));
    }
  
    //Загрузка стамины из NBT.
    private static float loadStaminaFromNBT(PlayerEntity player) {

        return player.getPersistentData().hasUniqueId(LegacyMod.MOD_ID + ":stamina") ? player.getPersistentData().getFloat(LegacyMod.MOD_ID + ":stamina") : getStaminaMax(player);
    }
  
    //Загрузка значения стамины из NBT при входе на сервер
    @SubscribeEvent
    public static void onPlayerLogIn(PlayerLoggedInEvent event) {
                    
        setStamina(event.getPlayer(), loadStaminaFromNBT(event.getPlayer()));
    }
  
    //Сохранение значения стамины в NBT игрока при выходе.
    @SubscribeEvent
    public static void onPlayerLogOut(PlayerLoggedOutEvent event) {
                        
        saveStaminaToNBT(event.getPlayer());
    }
  
    @SubscribeEvent
    public static void onPlayerUpdate(LivingUpdateEvent event) {

        if (event.getEntityLiving() instanceof PlayerEntity) {
    
            PlayerEntity player = (PlayerEntity) event.getEntityLiving();

            if (!player.world.isRemote) {
                //Условие
                if(player.isSprinting()) {
                  
                    decreaseStamina(player, 1.0F);
                }
                else if (getStamina(player) == 0.0F) {
                    player.setSprinting(false);
                }
            }
        }
    }

}
 
Последнее редактирование:
Решение
Нормально? А теперь представь, он отменил спринт до обновления игрока, игрок обновился и он снова спринтует, и так каждый тик. И вобще, если на то пошло, почему в LivingTickEvent, а не в TickEvent.PlayerTickEvent?
292
14
160
Java:
            if (!player.world.isRemote) {
                //Условие
                if(player.isSprinting()) {
           
                    decreaseStamina(player, 1.0F);
                }
                else if (getStamina(player) == 0.0F) {
                    player.setSprinting(false);
                }
            }
Тут проверка на то, что это на сервере выполняется не нужна, убери. Тебе нужно и на клиенте и на сервере стамину срезать + стопать спринт тоже на клиенте надо. Попробуй заменить этот кусок кода на
Java:
if (getStamina(player) <= 0.0f) {
    player.setSprinting(false);
}

if(player.isSprinting()) {           
    decreaseStamina(player, 1.0F);
}
 
Последнее редактирование:
15
2
Java:
package ru.galior.legacy.util;

import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import ru.galior.legacy.LegacyMod;
import ru.galior.legacy.entity.LegacyAttributes;

@Mod.EventBusSubscriber(modid = LegacyMod.MOD_ID)
public class StaminaHandler {
   
    //Возвращает макс. значение стамины.
    public static float getStaminaMax(PlayerEntity player) {
 
        return (float) player.getAttribute(LegacyAttributes.MAX_STAMINA).getValue();  
    }
   
    //Возвращает текущее значение стамины.
    public static float getStamina(PlayerEntity player) {
           
        return player.getDataManager().get(LegacyAttributes.STAMINA);
    }
   
   //Устанавливает текущее значение стамины.
    public static void setStamina(PlayerEntity player, float value) {
   
        player.getDataManager().set(LegacyAttributes.STAMINA, MathHelper.clamp(value, 0.0F, getStaminaMax(player)));
    }

    //Сбрасывает значение стамины.
    public static void refillStamina(PlayerEntity player) {
   
        player.getDataManager().set(LegacyAttributes.STAMINA, getStaminaMax(player));
    }
   
    //востонавление стамины на указанную величину.
    public static void regenStamina(PlayerEntity player, float value) {
   
        player.getDataManager().set(LegacyAttributes.STAMINA, MathHelper.clamp(getStamina(player) + value, 0.0F, getStaminaMax(player)));
    }
   
    //Уменьшает стамины на указанную величину.
    public static void decreaseStamina(PlayerEntity player, float value) {

        player.getDataManager().set(LegacyAttributes.STAMINA, MathHelper.clamp(getStamina(player) - value, 0.0F, getStaminaMax(player)));
    }
   
    //Сохранение значения стамины в NBT игрока
    private static void saveStaminaToNBT(PlayerEntity player) {
         
        player.getPersistentData().putFloat(LegacyMod.MOD_ID + ":stamina", getStamina(player));
    }
   
    //Загрузка стамины из NBT.
    private static float loadStaminaFromNBT(PlayerEntity player) {
 
        return player.getPersistentData().hasUniqueId(LegacyMod.MOD_ID + ":stamina") ? player.getPersistentData().getFloat(LegacyMod.MOD_ID + ":stamina") : getStaminaMax(player);
    }
   
    //Загрузка значения стамины из NBT при входе на сервер
    @SubscribeEvent
    public static void onPlayerLogIn(PlayerLoggedInEvent event) {
                     
        setStamina(event.getPlayer(), loadStaminaFromNBT(event.getPlayer()));
    }
   
    //Сохранение значения стамины в NBT игрока при выходе.
    @SubscribeEvent
    public static void onPlayerLogOut(PlayerLoggedOutEvent event) {
                         
        saveStaminaToNBT(event.getPlayer());
    }
   
    @SubscribeEvent
    public static void onPlayerUpdate(LivingUpdateEvent event) {
 
        if (event.getEntityLiving() instanceof PlayerEntity) {
     
            PlayerEntity player = (PlayerEntity) event.getEntityLiving();

            if (getStamina(player) <= 0.0F) {
                player.setSprinting(false);
                LegacyMod.LOGGER.info(player.isSprinting());
            }

            if(player.isSprinting()) {              
                decreaseStamina(player, 1.0F);
                LegacyMod.LOGGER.info(player.isSprinting());
            }
           
        }
    }

}

Если надо, то вот регистрация атрибута
Java:
package ru.galior.legacy.entity;

import net.minecraft.entity.ai.attributes.IAttribute;
import net.minecraft.entity.ai.attributes.RangedAttribute;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraftforge.event.entity.EntityEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import ru.galior.legacy.LegacyMod;

@Mod.EventBusSubscriber(modid = LegacyMod.MOD_ID)
public class LegacyAttributes {
    
    public static final IAttribute MAX_STAMINA = new RangedAttribute(null, LegacyMod.MOD_ID + ".staminaMax", 100.0D, 0.0D, 100.0D).setShouldWatch(true);
    public static final DataParameter<Float> STAMINA = EntityDataManager.<Float>createKey(PlayerEntity.class, DataSerializers.FLOAT);

    @SubscribeEvent
    public static void onPlayerConstructing(EntityEvent.EntityConstructing event) {
  
        if (event.getEntity() instanceof PlayerEntity) {
      
            PlayerEntity player = (PlayerEntity) event.getEntity(); 
              
            player.getAttributes().registerAttribute(MAX_STAMINA);
            player.getDataManager().register(STAMINA, (float) MAX_STAMINA.getDefaultValue()); 
        } 
    }
}
 
145
7
31
Нормально? А теперь представь, он отменил спринт до обновления игрока, игрок обновился и он снова спринтует, и так каждый тик. И вобще, если на то пошло, почему в LivingTickEvent, а не в TickEvent.PlayerTickEvent?
 
292
14
160
15
2
Исправил евент, все работает, спасибо всем :D
А можете по подробней про хуки рассказать ? :3 Просто я новичок и еще многого не знаю :D
Java:
   @SubscribeEvent
    public static void onPlayerUpdate(TickEvent.PlayerTickEvent event) {
      
            PlayerEntity player = (PlayerEntity) event.player;
            boolean b = true;

            if (getStamina(player) <= 0.0F) {
                player.setSprinting(false);
                b = false;
                if (player.ticksExisted % 120 == 0)
                {
                    b = true;
                }
            }

            if(player.isSprinting()) {               
                decreaseStamina(player, 0.25F);
            }
            else if (!player.isSprinting() && b) regenStamina(player, 0.25F);
            
    }
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху