首页 > 解决方案 > Minecraft Forge - Loop 不断覆盖自己

问题描述

如果这是一个过于简单的问题,我深表歉意。

我正在制作一个包含 26 种技能的 rpg 模组,所有技能的 id 都从 0 到 25。我正在尝试使用 for 循环从这些技能中保存数据,但它会不断覆盖自己,我不确定为什么或如何。

@Override
public CompoundNBT serializeNBT() {
    CompoundNBT data = new CompoundNBT();
    
    for(int i = 0; i < 26; i++) {
        data.putInt("xp", (int) (xp[i] * 10));
        data.putInt("dynamic", dynamicLevels[i]);
        data.putInt("static", staticLevels[i]);
    }
    return data;
}

标签: javaminecraftminecraft-forge

解决方案


正如评论中已经提到的,您应该为放入数据结构中的 int 值使用唯一键。

键值数据结构(在您的情况下很可能CompoundNBT就是那个)通常只将一个值引用到一个键。因此,您应该为 xp 存储 26 个密钥,为动态存储 26 个,为静态存储 26 个。

您可以像这样重写代码:

@Override
public CompoundNBT serializeNBT() {
    CompoundNBT data = new CompoundNBT();

    for(int i = 0; i < 26; i++) {
        data.putInt("xp_"+i, (int) (xp[i] * 10));
        data.putInt("dynamic_"+i, dynamicLevels[i]);
        data.putInt("static_"+i, staticLevels[i]);
    }
    return data;
}

但是,我认为您应该使用类似的东西

// Remember to fix base method too
@Override
public ArrayList<CompoundNBT> serializeNBT() {
    
    ArrayList<CompoundNBT> out = new ArrayList<>();    

    for(int i = 0; i < 26; i++) {
        CompoundNBT data = new CompoundNBT();
        data.putInt("xp", (int) (xp[i] * 10));
        data.putInt("dynamic", dynamicLevels[i]);
        data.putInt("static", staticLevels[i]);
        out.add(data);
    }
    return out;
}

这将给出“技能”列表,每个都有其价值


推荐阅读