Использование Map для редактора конфигов

Версия Minecraft
1.7.10
API
Forge
13
1
2
Приветствую. Будет очень многабукав, но старался излагать как можно короче
Редактирую под себя мод MC Heli. Автор сделал довольно продвинутую систему конфигов, практически собственный скриптовый язык для них. В конфигах есть набор переменных, которые можно использовать для рисования худа. В качестве примера: переменная throttle в конфигах обозначает обороты двигателя. Можно нарисовать на худе прямоугольник, указать его ширину или высоту как throttle*n, и тогда на худе появится наглядный индикатор оборотов двигателя, который будет удлиняться при увеличении оборотов и укорачиваться при уменьшении. Таких переменных там несколько десятков, и я даже добавил одну свою – всё отлично работает. Задаются они вот такой конструкцией:
Привязка к переменным из конфига переменных из кода:
public static void updateVarMap(MCH_EntityAircraft ac, MCH_WeaponSet ws) {
      if(varMap == null) {
         varMap = new LinkedHashMap();
      }

      updateVarMapItem("color", getColor());
      updateVarMapItem("center_x", centerX);
      updateVarMapItem("center_y", centerY);
      updateVarMapItem("width", width);
      updateVarMapItem("height", height);
      updateVarMapItem("time", (double)(player.worldObj.getWorldTime() % 24000L));
      MCH_Config var10001 = MCH_MOD.config;
      updateVarMapItem("test_mode", MCH_Config.TestMode.prmBool?1.0D:0.0D);
      updateVarMapItem("plyr_yaw", (double)MathHelper.wrapAngleTo180_float(player.rotationYaw));
      updateVarMapItem("plyr_pitch", (double)player.rotationPitch);
      updateVarMapItem("yaw", (double)MathHelper.wrapAngleTo180_float(ac.getRotYaw()));
      updateVarMapItem("pitch", (double)ac.getRotPitch());
      updateVarMapItem("roll", (double)MathHelper.wrapAngleTo180_float(ac.getRotRoll()));
      updateVarMapItem("altitude", (double)Altitude);
      updateVarMapItem("sea_alt", getSeaAltitude(ac));
      updateVarMapItem("have_radar", ac.isEntityRadarMounted()?1.0D:0.0D);
      updateVarMapItem("radar_rot", (double)getRadarRot(ac));
      updateVarMapItem("hp", (double)ac.getHP());
      updateVarMapItem("max_hp", (double)ac.getMaxHP());
      updateVarMapItem("hp_rto", ac.getMaxHP() > 0?(double)ac.getHP() / (double)ac.getMaxHP():0.0D);
      updateVarMapItem("throttle", ac.getCurrentThrottle());
      updateVarMapItem("pos_x", ac.posX);
      updateVarMapItem("pos_y", ac.posY);
      updateVarMapItem("pos_z", ac.posZ);
      updateVarMapItem("motion_x", ac.motionX);
      updateVarMapItem("motion_y", ac.motionY);
      updateVarMapItem("motion_z", ac.motionZ);
      updateVarMapItem("speed", Math.sqrt(ac.motionX * ac.motionX + ac.motionY * ac.motionY + ac.motionZ * ac.motionZ));
      updateVarMapItem("fuel", (double)ac.getFuelP());
      updateVarMapItem("low_fuel", (double)isLowFuel(ac));
      updateVarMapItem("stick_x", StickX);
      updateVarMapItem("stick_y", StickY);
      updateVarMap_Weapon(ws);
      updateVarMapItem("vtol_stat", (double)getVtolStat(ac));
      updateVarMapItem("free_look", (double)getFreeLook(ac, player));
      updateVarMapItem("gunner_mode", ac.getIsGunnerMode(player)?1.0D:0.0D);
      updateVarMapItem("cam_mode", (double)ac.getCameraMode(player));
      updateVarMapItem("cam_zoom", (double)ac.camera.getCameraZoom());
      updateVarMapItem("auto_pilot", (double)getAutoPilot(ac, player));
      updateVarMapItem("have_flare", ac.haveFlare()?1.0D:0.0D);
      updateVarMapItem("can_flare", ac.canUseFlare()?1.0D:0.0D);
      updateVarMapItem("inventory", (double)ac.getSizeInventory());
      updateVarMapItem("hovering", ac instanceof MCH_EntityHeli && ac.isHoveringMode()?1.0D:0.0D);
      updateVarMapItem("is_uav", ac.isUAV()?1.0D:0.0D);
      updateVarMapItem("uav_fs", getUAV_Fs(ac));
      updateVarMapItem("rem_ammo", ws.getAmmoNum());
   }

updateVarMapItem это метод, который создаёт карты, то есть пары "ключ-значение":
Создание пар "ключ-значение":
public static void updateVarMapItem(String key, double value) {
      varMap.put(key, Double.valueOf(value));
   }

Снова посмотрим на throttle. updateVarMapItem("throttle", ac.getCurrentThrottle()); – в метод передаются ключ (строка "throttle", которую программа считает в конфиге) и значение (его из транспортного средства (ас) забирает метод getCurrentThrottle). Дальше я уже разобрался чуть меньше, но если правильно понял, то какие-либо действия со значениями ключей позволяет выполнять вот этот метод:
Java:
public static void drawVarMap() {
      MCH_Config var10000 = MCH_MOD.config;
      if(MCH_Config.TestMode.prmBool) {
         int i = 0;
         int x = (int)(-300.0D + centerX);
         int y = (int)(-100.0D + centerY);
         Iterator i$ = varMap.keySet().iterator();

         while(i$.hasNext()) {
            String key = (String)i$.next();
            dummy.drawString(key, x, y, -12544);
            Double d = (Double)varMap.get(key);
            String fmt = key.equalsIgnoreCase("color")?String.format(": 0x%08X", new Object[]{Integer.valueOf(d.intValue())}):String.format(": %.2f", new Object[]{d});
            dummy.drawString(fmt, x + 50, y, -12544);
            ++i;
            y += 8;
            if(i == varMap.size() / 2) {
               x = (int)(200.0D + centerX);
               y = (int)(-100.0D + centerY);
            }
         }
      }

   }

Теперь собственно вопрос. В список переменных для конфигов я добавил "rem_ammo", она в самом первом моём отрывке кода идёт последней и отлично работает. Но когда я пытаюсь сделать пару "ключ + значение в формате String", работать всё перестаёт. Естественно, я не пихаю String в метод, рассчитанный на double, а создаю отдельный:
Java:
//метод для присвоения ключу значения
   public static void updateVarMapItemStr(String key1, String value1) {
      varMapStr.put(key1, value1);
   }

//метод для создания пар ключ-значение
   public static void updateVarMapStr(MCH_EntityAircraft ac, MCH_WeaponSet ws) {
      if(varMapStr == null) {
         varMapStr= new LinkedHashMap();
      }

      updateVarMapItemStr("wp_name", ws.getName());
   }
Насколько я понимаю, просто создать метод, принимающий String, недостаточно, нужно ещё править метод drawVarMap (или создавать аналогичный для строк). Буду рад, если кто-то подскажет, что именно нужно сделать или хотя бы в каком направлении копать. Выложить тут задействованные классы целиком не могу, потому что правила, но готов при необходимости кинуть их в личку.
 
Последнее редактирование:
Сверху