Не обновляется переменная в GUI

Версия Minecraft
1.16.5
API
Forge
76
3
5
Сделал полоску с уровнем и опытом, уровень и полученный опыт обновляются, а нужное количство опыта для лвл апа, нет, что я сдлел не так?
Вывожу все эти переменные в чат или консоль, там всё работает, а в гуи не хочет :(

В чём может быть проблема?
 
76
3
5
Вот она и она работает, левел и экспа сохоаняются, а экспа до след уровня нет
Java:
protected int levelChange = 200;
Java:
@Override
    public void setLevelChange(int levelChange, PlayerEntity pe) {
        this.levelChange = (levelChange + 100) * currentLevel;
        if (!pe.level.isClientSide)
            sendExperienceChangesToClient((ServerPlayerEntity) pe);
        else
            sendExperienceChangesToServer();
    }

Java:
public class PlayerExperienceClientServerHandler {
    private final CompoundNBT levelCompound;

    public PlayerExperienceClientServerHandler(CompoundNBT manaCompound) {
        this.levelCompound = manaCompound;
    }

    public CompoundNBT getExperienceCompound() {
        return levelCompound;
    }

    public static void encode(final PlayerExperienceClientServerHandler msg, final PacketBuffer packetBuffer) {
        packetBuffer.writeNbt(msg.getExperienceCompound());
    }

    public static PlayerExperienceClientServerHandler decode(final PacketBuffer packetBuffer) {
        return new PlayerExperienceClientServerHandler(packetBuffer.readNbt());
    }

    public static void onMessage(final PlayerExperienceClientServerHandler msg,
                                 final Supplier<NetworkEvent.Context> contextSupplier) {
        if (contextSupplier.get().getDirection().equals(NetworkDirection.PLAY_TO_SERVER)) {
            contextSupplier.get().enqueueWork(() -> {
                ServerPlayerEntity serverPlayer = contextSupplier.get().getSender();
                if (serverPlayer != null) {
                    serverPlayer.getCapability(PlayerExperienceCapabilityProvider.LEVEL_CAP)
                            .ifPresent(x -> x.setNBTData(msg.getExperienceCompound()));
                }
            });
            contextSupplier.get().setPacketHandled(true);
        }

        if (contextSupplier.get().getDirection().equals(NetworkDirection.PLAY_TO_CLIENT)) {
            contextSupplier.get().enqueueWork(() -> {
                Minecraft m = Minecraft.getInstance();
                PlayerEntity clientPlayer = m.player;
                if (clientPlayer != null) {
                    clientPlayer.getCapability(PlayerExperienceCapabilityProvider.LEVEL_CAP)
                            .ifPresent(x -> x.setNBTData(msg.getExperienceCompound()));
                }

            });
            contextSupplier.get().setPacketHandled(true);
        }
    }
}

И я нашёл ещё 1 ошибку, что после перезахода в мир, levelChange сбрасывается до стандартной(200)
 
Последнее редактирование:
1,526
138
280
Получается, опыт игроку мне нужно давать через ивенты со стороны сервера?
Да.
Нельзя так делать, клиент никогда не должен посылать пакет об изменении серверу,
Здесь ты не совсем прав. Например, если на клиенте происходит выбор между рецептами кнопочкой, пакет нужен. Но если хочешь передавать позицию игрока, опять таки например, уже возможен пакет хак.
 
76
3
5
Ну, видимо я делаю, что-то не то
Java:
@Mod.EventBusSubscriber(modid = StalinRpg.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.DEDICATED_SERVER)
public class ExperienceCapabilityAddExpEventServer {

    @SubscribeEvent
    public static void addExpForKillMob(LivingDeathEvent event) {
        if (event.getEntity() instanceof MobEntity) {
            MobEntity mobEntity = (MobEntity) event.getEntity();
            DamageSource damageSour = mobEntity.getLastDamageSource();
            if (damageSour != null) {
                if (damageSour.getEntity() instanceof ServerPlayerEntity) {
                    ServerPlayerEntity player = (ServerPlayerEntity) damageSour.getEntity();

                    IBaseExperienceCapability expCap = IGenericCapability.getUnwrappedCapability(player,
                            PlayerExperienceCapabilityProvider.LEVEL_CAP);

                    int currentLevel = expCap.getCurrentLevel();
                    int currentExp = expCap.getExperience();
                    int levelChange = expCap.getLevelChange();

                    StalinRpg.LOGGER.info("------------->Exp total:" + currentExp);
                    StalinRpg.LOGGER.info("------------->levelChange:" + levelChange);


                    if (currentExp > levelChange) {
                        expCap.setLevelChange(levelChange, player);
                        player.sendMessage(new StringTextComponent("Level up!"), player.getUUID());
                        player.sendMessage(new StringTextComponent("You level is:" + currentLevel), player.getUUID());
                    }
                }
            }
        }
    }
}
 
76
3
5
Нашёл проблему, забыл добавить levelchange в CompoundNBT
Java:
@Override
    public CompoundNBT getNBTData() {
        CompoundNBT nbt = new CompoundNBT();
        nbt.putInt("currentLevel", currentLevel);
        nbt.putInt("experience", experience);
        nbt.putInt("levelchange", levelchange);
        return nbt;
    }

    @Override
    public void setNBTData(CompoundNBT compound) {
        currentLevel = compound.getInt("currentLevel");
        experience = compound.getInt("experience");
        levelchange = compound.getInt("levelchange");
    }
 
Последнее редактирование:
76
3
5
Такс, где я здесь накосячил?
Java:
public class LevelBarRender extends AbstractGui {
    private final static ResourceLocation overlayBar = new ResourceLocation(
            StalinRpg.MOD_ID + ":textures/gui/level_textures(28x28).png");

    private final static int BAR_WIDTH = 28;
    private final static int BAR_HEIGHT = 28;

    private Minecraft mc;

    public LevelBarRender(Minecraft mc) {
        super();
        this.mc = mc;
    }

    public LevelBarRender() {
        super();
        mc = Minecraft.getInstance();
    }

    public void LevelRenderBar(MatrixStack matrixStack, int screenWidth, int screenHeight) {

        World world = mc.level;
        PlayerEntity player = mc.player;

        IBaseExperienceCapability expCap = IGenericCapability.getUnwrappedCapability(player,
                PlayerExperienceCapabilityProvider.LEVEL_CAP);

        FontRenderer fr = mc.font;

        GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
        GL11.glPushMatrix();

        mc.getTextureManager().bind(overlayBar);

        blit(matrixStack, 0, 0, 0, 0, BAR_WIDTH, BAR_HEIGHT);
        GL11.glPushMatrix();

        GL11.glTranslatef(1, 1, 0);

        float level = expCap.getCurrentLevel();

        GL11.glPushMatrix();
        GL11.glScalef(0.8f, 0.8f, 1);

        /* Это генерирует строку, которую я хочу нарисовать. */
        String s = "Level:" + (int) level;

        /* тень */
        fr.draw(matrixStack, s, -fr.width(s) + 1, 2, 0x5A2B00);
        /* Сами цыфры */
        fr.draw(matrixStack, s, -fr.width(s), 1, 0xFFFFFF);

        GL11.glPopMatrix();
        GL11.glPopAttrib();
    }
}
 

Вложения

  • Screenshot_1.png
    Screenshot_1.png
    14.5 KB · Просмотры: 15
76
3
5
Как я могу уменьшить размер шрифта?
GL11.glScalef(0.5f, 0.5f, 1); не работает, он уменьшает все объекты.
Java:
public void GuiHealthBarRender(MatrixStack matrixStack, int screenWidth, int screenHeight) {
        World world = mc.level;
        PlayerEntity player = mc.player;
        FontRenderer fr = mc.font;
        mc.getTextureManager().bind(overlayBar);
        float oneUnit = (float) TEX_WIDTH / player.getMaxHealth();
        int currentWidth = (int) (oneUnit * player.getHealth());
        blit(matrixStack, 0, 0, 0, 0, TEX_WIDTH, TEX_HEIGHT);
        blit(matrixStack, 1, 0, 1, TEX_HEIGHT, currentWidth, TEX_HEIGHT);


        float maxHp = player.getMaxHealth();
        float effectiveHp = player.getHealth();
//        GL11.glScalef(0.5f, 0.5f, 1);
        String s = (int) effectiveHp + "/" + (int) maxHp;
        /* Тень */
        fr.draw(matrixStack, s, 1, 2, 0x5A2B00);
        /* Основной текст */
        fr.draw(matrixStack, s, 1, 1, 0xFFFFFF);
    }
 
Сверху