помогите деобусофицировать [1.2.5->1.7.10]

есть код:
это скопированный мод на таймер(с майна 1.2.5)
Код:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;

import javax.xml.crypto.Data;

import net.minecraft.client.Minecraft;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.world.MinecraftException;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.storage.IChunkLoader;
import net.minecraft.world.storage.IPlayerFileData;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraft.world.storage.WorldInfo;
import net.minecraftforge.client.MinecraftForgeClient;

public class mod_Timer implements ISaveHandler
{ 


long timerAdd = 0L;
  long baseTime = 0L;
  long lastSave = 0L;

  
  public boolean clientSideRequired()
  {
    return false;
  }
  
  public boolean serverSideRequired()
  {
    return false;
  }
  
  public String getVersion()
  {
    return "1.2.5v1";
  }
  
  public void load()
  {
      
    ModLoader.setInGameHook(this, true, false);
    net.minecraftforge.common.MinecraftForge.registerSaveHandler(this);
  }
  
  public boolean onTickInGame(float subTick, Minecraft mc)
  {
    mc.q.a(getDisplayString(calculateTime()), 10, 10, 16777215);
    return true;
  }
  
  public void onWorldLoad(World world)
  {
    if (!world.isRemote)
    {
         Minecraft mc = Minecraft.getMinecraft();
      this.baseTime = System.currentTimeMillis();
      this.timerAdd = loadTime(world.w.d(), mc.k.b);
    }
  }
  
  public void onWorldSave(World world)
  {
    Minecraft mc = Minecraft.getMinecraft();
    saveTime(world.w.d(), mc.k.b);
  }
  
  public String getDisplayString(long time)
  {
    int hour = (int)(time / 3600000L);
    time -= hour * 3600000;
    int min = (int)(time / 60000L);
    time -= min * 60000;
    int sec = (int)(time / 1000L);
    time -= sec * 1000;
    
    return String.format("%d:%02d:%02d.%03d", new Object[] { Integer.valueOf(hour), Integer.valueOf(min), Integer.valueOf(sec), Long.valueOf(time) });
  }
  
  private File getSaveFile(String worldName, String playerName)
  {
      Minecraft mc = Minecraft.getMinecraft();
    File dataFile = new File("saves");
    dataFile = new File(dataFile, worldName);
    dataFile = new File(dataFile, "timer_" + playerName + ".dat");
    return dataFile;
  }
  
  private long calculateTime()
  {
    return System.currentTimeMillis() - this.baseTime + this.timerAdd;
  }
  
  private void saveTime(String worldName, String username)
  {
      Minecraft mc = Minecraft.getMinecraft();
    File dataFile = getSaveFile(worldName, username);
    if (System.currentTimeMillis() - this.lastSave < 10000L) {
      return;
    }
    if (dataFile.exists()) {
      dataFile.delete();
    }
    try
    {
      dataFile.createNewFile();
      DataOutputStream fos = new DataOutputStream(new FileOutputStream(dataFile));
      fos.writeLong(calculateTime());
    }
    catch (Exception e)
    {
      System.out.println("Failed to save timer data: " + dataFile);
      e.printStackTrace();
    }
  }
  
  private long loadTime(String worldname, String username)
  {
      Minecraft mc = Minecraft.getMinecraft();
    File dataFile = getSaveFile(worldname, username);
    if (!dataFile.exists()) {
      return 0L;
    }
    try
    {
      DataInputStream fis = new DataInputStream(new FileInputStream(dataFile));
      return fis.readLong();
    }
    catch (Exception e)
    {
      System.out.println("Failed to load timer data: " + dataFile);
      e.printStackTrace();
    }
    return 0L;
  }
  
  public void onChunkLoad(World world,Chunk chunk) {}
  
  public void onChunkUnload(World world,Chunk chunk) {}
  
  public void onChunkSaveData(World world,Chunk chunk,Data data) {}
  
  public void onChunkLoadData(World world,Chunk chunk,Data data) {}

@Override
public WorldInfo loadWorldInfo() {
    return null;
}

@Override
public void checkSessionLock() throws MinecraftException {
}

@Override
public IChunkLoader getChunkLoader(WorldProvider p_75763_1_) {
    return null;
}

@Override
public void saveWorldInfoWithPlayer(WorldInfo p_75755_1_,NBTTagCompound p_75755_2_) {
}

@Override
public void saveWorldInfo(WorldInfo p_75761_1_) {
}

@Override
public IPlayerFileData getSaveHandler() {
    return null;
}

@Override
public void flush() {
}

@Override
public File getWorldDirectory() {
    return null;
}

@Override
public File getMapFileFromName(String p_75758_1_) {
    return null;
}

@Override
public String getWorldDirectoryName() {
    return null;
}


}
часть уже сам исправил может кто нибудь помочь закончить ( я не знаю таких классов  :( )
к тому же наверняка за такое время метод загрузки "этого" одноклассного мода изменился
 
Напиши не код, а что ты хочешь сделать на 1.7.10
чтобы прочитать исходники, надо иметь jd-gui, ну и можно ещё mcp на 1.25
но надобность в этом отсутствует по причине того что, в 1.7.10 давно всё по другому и полученный тобой код бесполезен и работать кроме как на 1.25-1.32 просто не будет. (тем более с ModLoader)
 
мне нужен таймер в верхнем правом угле , который будет считать сколько времени игрок провел в игре . при выходе с карты таймер сохраняется в файл(в сейве) и загружается при заходе.
 
что касается вывода таймера на экран RenderGameOverlayEvent http://www.youtube.com/watch?v=oi41BAlRjtE (https://github.com/coolAlias/Tutorial-Demo)
ну а значение таймера хранить можно где угодно и как угодно, например в файле.
при подключении игрока на сервер, есть событие PlayerLoggedInEvent, в этот момент можно прочитать значение из файла и отправить пакетом на клиент (лучше конечно прочитать значение ещё во время загрузки мода, но... вдруг у тебя для каждой карты своё)
пакеты обсуждали недавно. поищи по форуму, на крайняк http://www.minecraftforge.net/wiki/Netty_Packet_Handling
для более подробной информации о каких либо событиях(events) можно использовать гугл, потому что очень много туторов в инете: http://lmgtfy.com/?q=minecraft+forge+1.7.10+RenderGameOverlayEvent
А также можно подождать ответа других участников форума.
 
TickEvent,внутри вложенные классы.Есть ещё вопросы,задавай сразу,а то много писать-лень :blush:
 
насколько понял код должен быть таким :
Код:
    @SubscribeEvent
    public void onTick(TickEvent event)
    {
         int W = 0;
         int D = 0;
          int H = 0;
            int M = 0;
          int S = 0;
          int tick = 0;
          boolean limit = false;
          
        if (!limit)
        {
        tick++;
        if (tick == 20)
        {
            tick-=20;
            S++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
            
        }
        if (S == 60)
        {
            S-=60;
            M++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
            
        }
        if (H == 60)
        {
            H-=60;
            D++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
        }
        if (D == 24)
        {
            H -=24;
            W++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
        }
        if (W == 30)
        {
            limit = true;
        }
        }
    }
однако о времени в консоль ничего не пишет
 
kremnev8 написал(а):
насколько понял код должен быть таким :
Код:
    @SubscribeEvent
    public void onTick(TickEvent event)
    {
         int W = 0;
         int D = 0;
          int H = 0;
            int M = 0;
          int S = 0;
          int tick = 0;
          boolean limit = false;
          
        if (!limit)
        {
        tick++;
        if (tick == 20)
        {
            tick-=20;
            S++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
            
        }
        if (S == 60)
        {
            S-=60;
            M++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
            
        }
        if (H == 60)
        {
            H-=60;
            D++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
        }
        if (D == 24)
        {
            H -=24;
            W++;
            System.out.println(W+":"+D+":"+H+":"+M+":"+S);
        }
        if (W == 30)
        {
            limit = true;
        }
        }
    }
однако о времени в консоль ничего не пишет
Ты же переменные внутри тела метода инициализируешь, у тебя с каждым тиком они каждый раз новые. они не инкрементятся
 
Лучше сделать 1 переменную и потом через математику из неё вытаскивать минуты/часы/дни/месяцы/века/тысячелетия/световые года
 
Dovakin написал(а):
Лучше сделать 1 переменную и потом через математику из неё вытаскивать минуты/часы/дни/месяцы/века/тысячелетия/световые года
Световой год это же расстояние, хехе
 
Может и во времени использоваться
Для ТС,если хочешь рисовать на экране,то не выйдет ,ибо эвент серверный(хотя можно вынуть клиент)+ты не сможешь рисовать.Нужен бубен и рендер эвент
 
Короче, поясняю как это нужно делать. Когда твой человечик заходит в игру, ты ловишь этот момент, сохраняешь значение System.currentTimeMillis() куда тебе угодно. Допустим в статическую переменную класса 
Foo. Теперь твоя переменная Foo.playerJoinMills это твоё время захода в игру в милисекундах. Дальше, когда человечик выходит, ты сохрняешь другое значение Foo.playerLeaveMills = System.currentTimeMillis();.
Теперь тебе просто посчитать РАЗНИЦУ значений и перевести их в таймюниты. 
TimeUnit.MILLISECONDS.toDays(Foo.playerLeaveMills - Foo.playerJoinMills); это то, сколько ты дней провёл в игре. Готово
 
А,в этом смысле.Для этого есть стандартные средства.Там в статистику записывается,собсно их можно получить
 
Назад
Сверху