Сохранение кастомных настроек в клиенте

Версия Minecraft
1.7.10
215
1
20
Реализовал в своем моде включение некоторой функции горячей клавишей. При нажатии клавиши функция включается, еще раз нажал - выключается.
Как мне сохранять в клиенте состояние функции, чтобы при запуске клиента состояние функции оставалось таким же, как было в прошлый раз?
Безуспешно копал под файл settings.txt, потом под config/<mymod>.cfg.
 
Dahaka написал(а):
А почему в конфиг безуспешно. Это вполне рабочий вариант.

Не знаю, как-то не зашло. В данный момент я уже откопал кусок кода, пару лет назад мною сбацанный, когда я писал один плагин, переработал его и сделал, в общем, свой собственный конфигуратор. Как всегда, изобрел велосипед. Могу поделиться кодом, если интересно.

В любом случае, что касается стандартного конфига, из задач ниже я нашел только первую:
1) считать значение ключа.
2) перезаписать значение ключа.
3) добавить новый ключ.
 
Ну смотри. Раз ты знаешь, как считать значение, то знаком с категориями. Когда считываешь значение из какого-то поля, если такого поля в конфиге нет, то оно создается (это пункт №3, не знаю, где тут могли возникнуть проблемы). А чтобы перезаписать значение можно очистить полностью категорию, и считать поле с тем дефолтным значением, которое ты хочешь туда записать. Может способ хрень и есть какой-то другой, но пока я пользуюсь таким.
 
Хорошо, я тебя услышал. Видимо, мне проще написать новое, чем найти подходящее старое. Или я плохо ориентируюсь в чужом коде. В любом случае, я уже написал то, что работает.  В любом случае, каждое изобретение велосипеда - это созидание, опыт, короче - польза. Вот, покритикуй на здоровье, если не лень:

Код:
package ru.lao.rha;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import scala.Console;

public class RHAConfig {

 public static String configPath = "config/rha.config";
 public static File cfgFile = new File(configPath);
 public static boolean debug = true;
 
 public RHAConfig() {
 
 }

 /**
 * считывает из файла конфигурации ключ в цифровом виде
 * @param key - ключ
 * @return - значение ключа (если нет такого ключа или строка с ним неправильная - возвращает 0)
 */
 public static Integer getInt(String key) {
 int result = 0;
 if (!cfgFile.exists()) { createConfigFile(); }
 String line = getLineWithKeyFromFile(configPath, key);
 if(line.equalsIgnoreCase("[error]")){if(debug){logError(1);}; return result;}
 if(line.equalsIgnoreCase("[not_found]")){if(debug){logError(2);}; return result;}
 String[] values = line.split(": ");
 if(values.length != 2){if(debug){logError(3);}; return result;}
 try { result = Integer.parseInt(values[1]); } catch (Exception e){}
 return result;
 }

 /**
 * считывает из файла конфигурации ключ в булевом виде
 * @param key - ключ
 * @return - значение ключа (если нет такого ключа или строка с ним неправильная - возвращает false)
 */
 public static boolean getBoolean(String key) {
 if (!cfgFile.exists()) { createConfigFile(); }
 String line = getLineWithKeyFromFile(configPath, key);
 if(line.equalsIgnoreCase("[error]")){if(debug){logError(4);}; return false;}
 if(line.equalsIgnoreCase("[not_found]")){if(debug){logError(5);}; return false;}
 String[] values = line.split(": ");
 if(values.length != 2){if(debug){logError(6);}; return false;}
 if(values[1].equalsIgnoreCase("true")){return true;}
 return false;
 }

 /**
 * считывает из файла конфигурации ключ в текстовом виде
 * @param key - ключ
 * @return - значение ключа (если нет такого ключа или строка с ним неправильная - возвращает "")
 */
 public static String getString(String key) {
 if (!cfgFile.exists()) { createConfigFile(); }
 String line = getLineWithKeyFromFile(configPath, key);
 if(line.equalsIgnoreCase("[error]")){if(debug){logError(7);}; return "";}
 if(line.equalsIgnoreCase("[not_found]")){if(debug){logError(8);}; return "";}
 String[] values = line.split(": ");
 if(values.length != 2){if(debug){logError(9);}; return "";}
 return values[1];
 }
 
 /**
 * записывает в конфиг новый булевый ключ, если его нет, либо перезаписывает старый
 * (при этом тип старого ключа поменяется, если типы нового и старого не совпадают!)
 * @param key - ключ
 * @param valueToWrite - значение
 */
 public static void setBoolean(String key, boolean valueToWrite) {
 String value = "true";
 if(!valueToWrite)value = "false";
 setString(key, value);
 }
 
 /**
 * записывает в конфиг новый цифровой ключ, если его нет, либо перезаписывает старый
 * (при этом тип старого ключа поменяется, если типы нового и старого не совпадают!)
 * @param key - ключ
 * @param valueToWrite - значение
 */
 public static void setInteger(String key, int valueToWrite) {
 String value = String.valueOf(valueToWrite);
 setString(key, value);
 }
 
 /**
 * записывает в конфиг новый текстовый ключ, если его нет, либо перезаписывает старый
 * (при этом тип старого ключа поменяется, если типы нового и старого не совпадают!)
 * @param key - ключ
 * @param valueToWrite - значение
 */
 public static void setString(String key, String valueToWrite) {
 if (!cfgFile.exists()) { createConfigFile(); }
 boolean found = false;
 List<String> contents = new ArrayList<String>();
 String line = "";
 try { // считываем конфиг файл в лист, если находим ключевую строку, то подставляем новое значение
 BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(configPath), "UTF-8"));
 do {
 try { line = file.readLine();} catch (Exception EndOfFile){break;}
 if(line != null && line.startsWith(key)){
 String lineparts[] = line.split(": ");
 line = lineparts[0] + ": " + valueToWrite;
 found = true;
 }
 if(line != null && line.length() > 0){contents.add(line);}
 } while (line != null);
 if(!found){contents.add(key + ": " + valueToWrite);} // если не находим ключ - в конец листа дописываем новую строку
 file.close();
 cfgFile.delete(); // удаляем старый файл
 cfgFile.createNewFile(); // записываем новый файл
 BufferedOutputStream quoteOut = new BufferedOutputStream(new FileOutputStream(configPath, true)); 
 for(int i = 0; i < contents.size(); i++){
 quoteOut.write((contents.get(i) + "\n").getBytes("UTF-8"));
 }
 quoteOut.flush();
 quoteOut.close();
 } catch (Exception e){ if(debug){logError(10);};}
 }

 /**
 * ищет строку с ключом в файле конфигурации
 * @param filePath - путь к файлу
 * @param key - ключ
 * @return - строка
 */
 private static String getLineWithKeyFromFile(String path, String key) {
 try {
 BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
 String line = "";
 do {
 try { line = file.readLine(); } catch (Exception EndOfFile){break;}
 if(line.startsWith(key)){file.close(); return line;}
 } while (line != null);
 file.close();
 return "[not_found]";
 } catch (Exception e) { return "[error]"; }
 }


 /**
 * создает файл конфигурации
 * @param filename - имя файла
 */
 private static void createConfigFile() {
 try {
 cfgFile.createNewFile();
 BufferedOutputStream file = new BufferedOutputStream(new FileOutputStream(configPath, true));
 file.write("Russian Hostility Configuration File\n".getBytes("UTF-8"));
 file.write("enabledHelmets: true\n".getBytes("UTF-8"));
 file.flush();
 file.close();
 } catch (Exception e){ if(debug){logError(11);}}
 }
 
 /**
 * этот блок срабатывает, если debug = true, облегчает поиск ошибки, все места пронумерованы
 * @param labelError - номер ошибки
 */
 private static void logError(int labelError) {
 Console.out().println("Config error #" + labelError + ". Check your code." );
 
 }

}

Может, чего-то не хватает... По месту добавлю другие функции, если понадобится. В данный момент я использую только getBoolean(key) и setBoolean(key, value);
 
Назад
Сверху