- 1,159
- 38
- 544
Добрый день, возникла очень странная проблема.
Я делаю реализацию "модификаторов". Это, грубо говоря, плюшки, которые различные шмодки дают игроку. Например, как в WoW: +1 к выносливости, +3 к интеллекту и т.д. Модификатор я храню в классе RollModifier, который представляет собой POJO-класс с двумя полями: int value (+1) и String description ("к выносливости").
В игре модификаторы хранятся в виде NBT тега, который можно приложить к любому итему. Он более известен как "tag" и включается в себя такие вещи, как "Lore" и "Display". При входе в игру я извлекаю модификаторы из tag'а и сохраняю их внутри IEEP:
Вся магия начинает во время вызова this.addModifier(to, modifier). Как вы можете видеть на скрине ниже, до захода отладчиков внутрь метода поле modifier.description заполненно корректно:
Но как только я оказываюсь внутри addModifier(), все русские буквы куда-то деваются и остаются только пробелы
Первый раз сталкиваюсь с таким необычным поведением обычного String'а. У кого-нибудь есть мысли как-так может получаться?
Я делаю реализацию "модификаторов". Это, грубо говоря, плюшки, которые различные шмодки дают игроку. Например, как в WoW: +1 к выносливости, +3 к интеллекту и т.д. Модификатор я храню в классе RollModifier, который представляет собой POJO-класс с двумя полями: int value (+1) и String description ("к выносливости").
Java:
package rsstats.utils;
import net.minecraft.util.StatCollector;
import rsstats.common.RSStats;
/**
* Модификатора броска
* @author RareScrap
*/
public class RollModifier {
/** Значение модификатора */
private int value;
/** Описание модификатора */
private String description;
/**
* Конструктор инициализирующий свои поля
* @param value Значение модификатора
* @param description Описание модификатора
*/
public RollModifier(int value, String description) {
this.value = value;
this.description = description;
}
/**
* Вывод модификатора в формате: (+4: За наличие интрументов)
* @return Строкое представление модификатора
*/
@Override
public String toString() {
String formatCode;
if (value > 0) {
formatCode = RSStats.config.modifierColorPositive;
} else {
formatCode = RSStats.config.modifierColorNegative;
}
String[] words = description.split(" "); // Получаем слова из описания
// Присоединяем форматирование к каждому слову, если оно отсуствует
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
String word = words[i];
if (word.isEmpty()) break;
// TODO: Костыль. Стоит разобратся что за дичь творится с description, если убрать эту проверку
if (word.charAt(0) != '§')
stringBuilder.append("\u00A7" + formatCode) // Символ §
.append(word);
// Предотвращаем наличие пробела в конце последнего слова
if (i != words.length-1) {
stringBuilder.append(" ");
}
}
// Сохраняем форматированное описание
description = stringBuilder.toString();
// Форматируем выходную строку
return StatCollector.translateToLocalFormatted("modifier.string", value > 0 ? "+"+value : String.valueOf(value), description, formatCode);
/*formatCode + "(" +
formatCode + (value > 0 ? "+"+value : value) +
formatCode + ": " +
description +
formatCode + ")" +
"§" + RSStats.config.textColorNormal;*/
}
/**
* Геттер для {@link #value}
* @return Значение модификатора
*/
public int getValue() {
return value;
}
/**
* Геттер для {@link #description}
* @return Описание модификатора
*/
public String getDescription() {
return description;
}
}
В игре модификаторы хранятся в виде NBT тега, который можно приложить к любому итему. Он более известен как "tag" и включается в себя такие вещи, как "Lore" и "Display". При входе в игру я извлекаю модификаторы из tag'а и сохраняю их внутри IEEP:
Код:
// Полный код не приводится в целях экономии места
/**
* Вытаскивает модификаторы из стака и добавляет их пользователю
* @param itemStack предмет с модификаторами
*/
public void extractModifiersFromItemStack(ItemStack itemStack) {
if (itemStack != null && itemStack.getTagCompound() != null) { // извлекаем и сохраняем модификаторы
NBTTagList modifiersList = itemStack.getTagCompound().getTagList("modifiers", Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < modifiersList.tagCount(); i++) {
NBTTagCompound modifierTag = modifiersList.getCompoundTagAt(i);
int value = modifierTag.getInteger("value");
String description = modifierTag.getString("description");
String to = modifierTag.getString("to");
RollModifier modifier = new RollModifier(value, description);
this.addModifier(to, modifier);
}
}
}
Вся магия начинает во время вызова this.addModifier(to, modifier). Как вы можете видеть на скрине ниже, до захода отладчиков внутрь метода поле modifier.description заполненно корректно:
Но как только я оказываюсь внутри addModifier(), все русские буквы куда-то деваются и остаются только пробелы
Первый раз сталкиваюсь с таким необычным поведением обычного String'а. У кого-нибудь есть мысли как-так может получаться?