[1.7.10] Конфиг - рассинхронизация.

317
10
Всем привет, что то я зачастил с вопросами на форуме :C
Пытался сам, но не выходило. 
В общем, записываю в файлик по пути: "./config/list.txt" инфу. Получаю ее тоже. Всё успешно. Если игрок в одиночном мире - всё прекрасно. Если игрок заходит на сервер и добавляет через команду инфу в файлик - то те игроки которые на сервере - получают инфу(реализовал отправкой пакетов каждому в онлайне).  Но вопрос в другом. 
Вопрос A:
Игрок не на сервере. Я записал инфу, те кто в онлайне и на самом сервере - она записалась. Если игрок зайдет после того как она записана - то у него она будет старая или вообще не будет. Как сравнить инфу на клиенте у игрока которая в файле и которая на сервере в файле? Т.е как прочитать файлы? Ибо когда игрок заходит на сервере - автоматом читает с файлика сервака. 
В каком эвенте вход на сервер можно получить? 
Либо же, просто как получить инфу с сервака и записать на клиент?

Вопрос B:
Как записать инфу в файл в UTF-8 кодировке? гугл не дал помощи:
[код]:
Код:
//Запись на файл
public static void addToFile(String par1FileName, String str) {
  BaseUtils.log("Writing in " + par1FileName + ".txt");
     String filePath = "./config/xModBlocker/" + par1FileName + ".txt";
     
     PrintStream out = null;
     
     try {

//Как записать в ютф - хз, пока что так.  
      out = new PrintStream(
        new BufferedOutputStream(
          new FileOutputStream(filePath, true)));

      String s;
         String allStr = "";
//ЧИТАЕТ НОРМАЛЬНО. Т.Е если я в ручную запишу инфу на русском языке - норм.
         br = new BufferedReader(
                    new InputStreamReader(
                            new FileInputStream(filePath), "UTF8"));
         while ((s = br.readLine()) != null) {
               allStr = s;
            }

      if(allStr.contains(":") && !allStr.contains("@") || allStr.contains(":") && allStr.contains("@")) {
       out.print("@" + str);
      } else out.print(str);
      
     } catch(IOException e) {
      e.printStackTrace();
     } finally {
      if (out != null) {
       out.close();
      }
     }
     
     ConfigUtils.readFromFile("list");

 }
 
329
13
329
13
Yarik написал(а):
А как мне получить инфу из файла НА СЕРВЕРЕ? Не на клиенте?
Получить её можно ЧТЕНИЕМ, ЧТЕНИЕМ файла НА СЕРВЕРЕ.

А теперь по НОРМАЛЬНЫМ вопросам : делюсь методами записи и чтения.

Запись :
Код:
// Запись в файл с именем par1FileName текста par2String
public static void writeToFile(String par1FileName, String par2String)
{
    File configFolder = new File("./config/" + YobaMod.MODID + "/");
    // Создадим папку, если таковой нет
    configFolder.mkdir();
    try
    {
        // И, собственно, производим запись
        FileWriter writer = new FileWriter("./config/" + YobaMod.MODID + "/" + par1FileName, false);
        writer.write(par2String);
        writer.close();
    }
    catch (IOException e) { e.printStackTrace(); }
}

Чтение :
Код:
// Чтение файла с именем par1FileName
public static String readFromFile(String par1FileName)
{
    // Отпределяем путь к файлу. Он будет лежать в папке ./config/имя_мода/имя_файла
    String filePath = "./config/" + YobaMod.MODID + "/" + par1FileName;
    StringBuilder jsonfull = new StringBuilder();
    BufferedReader bufReader = null;

    // Если такой путь(!) отсутствует - создадим этот путь
    if (new File(filePath).exists())
    {
        try
        {
            // А если такой путь есть - то производим построчное чтение и пихаем все в jsonfull
            bufReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), Charset.forName("UTF-8")));
            jsonfull = new StringBuilder();
            String tempstring;
            while ((tempstring = bufReader.readLine()) != null) { jsonfull.append(tempstring + "\n"); }
            bufReader.close();
        }
        catch (FileNotFoundException e) { e.printStackTrace(); }
        catch (IOException e) { e.printStackTrace(); }
    }
    else
    {
        try { new File(filePath).createNewFile(); }
        catch (IOException e) { e.printStackTrace(); }
    }
    
    // Возвращаем результат
    return jsonfull.toString();
}

И пихай их хоть на клиент, хоть на сервер.

  • Запустил сервер, он изначально производит чтение своего файла, все ОК.
  • Заходит игрок, за ним другой, третий, Каждому по событию, описанному выше сервер рассылает файл.
  • Если какой-то игрок у себя меняет содержимое, то пакетом высылаешь это содержимое на сервер.
  • Сервер, получив файл, пробегается по списку игроков и рассылает всем содержимое (если надо).
  • Если новый игрок зашел на сервер - то опять же, по событию, получает этот файл на свой клиент.

Чую какой-то огромный такой костылище... Лучше опиши, что и зачем ты хочешь реализовать.
 
317
10
С этим разобрался.
Остались только вопросы:
Как проверить ли игрок в одиночной игре?
Как читать в файл именно в UTF8 кодировке?
 
643
6
14
BufferedReader buffer = new BufferedReader(new InputStreamReader(YourCoreClass.class.getResourceAsStream(путь к файлу""), "UTF-8"));
 
Сверху