- 13
- 1
- 2
Приветствую. Будет очень многабукав, но старался излагать как можно короче
Редактирую под себя мод MC Heli. Автор сделал довольно продвинутую систему конфигов, практически собственный скриптовый язык для них. В конфигах есть набор переменных, которые можно использовать для рисования худа. В качестве примера: переменная throttle в конфигах обозначает обороты двигателя. Можно нарисовать на худе прямоугольник, указать его ширину или высоту как throttle*n, и тогда на худе появится наглядный индикатор оборотов двигателя, который будет удлиняться при увеличении оборотов и укорачиваться при уменьшении. Таких переменных там несколько десятков, и я даже добавил одну свою – всё отлично работает. Задаются они вот такой конструкцией:
updateVarMapItem это метод, который создаёт карты, то есть пары "ключ-значение":
Снова посмотрим на throttle.
Теперь собственно вопрос. В список переменных для конфигов я добавил "rem_ammo", она в самом первом моём отрывке кода идёт последней и отлично работает. Но когда я пытаюсь сделать пару "ключ + значение в формате String", работать всё перестаёт. Естественно, я не пихаю String в метод, рассчитанный на double, а создаю отдельный:
Насколько я понимаю, просто создать метод, принимающий String, недостаточно, нужно ещё править метод drawVarMap (или создавать аналогичный для строк). Буду рад, если кто-то подскажет, что именно нужно сделать или хотя бы в каком направлении копать. Выложить тут задействованные классы целиком не могу, потому что правила, но готов при необходимости кинуть их в личку.
Редактирую под себя мод 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());
}
Последнее редактирование: