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

Dovakin написал(а):
Для ТС,если хочешь рисовать на экране,то не выйдет ,ибо эвент серверный(хотя можно вынуть клиент)+ты не сможешь рисовать.Нужен бубен и рендер эвент
рендер у меня в отдельном ивенте , ему только надо переменную обновлять.
 
с таймером разобрался. взял код из старого мода.
осталось разобратся с сохранением чтобы к каждому миру отдельно.
 
к каждому миру и к каждому игроку свой? или только у каждого мира свой?
пример для второго случая

Код:
LogSystem log = new LogSystem( "Minecraft" );
FileConfigTree file_config = new FileConfigTree( log );
String mod_config_file = "my_mod_config.cfg";

file_config.addKeyValue( "worldName", "0", "desc" ); //запись в переменные
file_config.writeToFile( "", mod_config_file ); //сохранение в файл

//чтение из файла и получение значения из переменной
file_config.readFromFile( "", mod_config_file );
int timerWorldName = file_config.getNumber( "worldName" );
читать конфиг надо при загрузке мода лишь 1 раз
сохранять соответственно при остановке сервера.
Доступ к переменным в любое время
public static FileConfigTree file_config;

а это мои утилиты https://dl.dropboxusercontent.com/u/67349580/ru.salamandr.dev.utils.7z (распространяются AS IS)
скачаешь и распакуешь в src/main/java/ (если версия 1.72-1.7.10)
версия значения не имеет, хоть 1.25, просто путь для распаковки будет другим. Утилиты не привязаны ни к Minecraft, ни к фордже (допустимо использование в любых приложениях на Java 7 и Java 8).
там есть: класс для работы с конфигом, класс для работы с БД: SQLLite и MySQL, класс для работы с логом, класс для работы с языковой поддержкой (Options.java, бывший Language который читает не из файловой структуры, а из JAR мода).

А можешь просто на примере их посмотреть как сохранять в файл и читать из него.
 
то же самое, только теперь для каждого игрока переменную всех миров.
player1_world1 = 10
player1_world2 = 10
player1_world3 = 10
player1_world4 = 10
player2_world1 = 10
player2_world2 = 10
player2_world3 = 10
player2_world4 = 10
....
player151_world2 = 10
player151_world3 = 10
player151_world4 = 10
 
а вот и проблеммы , ивент захода и выхода из игры не обрабатываются
делаю так:
Код:
@SubscribeEvent
    public void onlogin(PlayerLoggedInEvent event)
    {
        System.out.println("login");
        this.baseTime = System.currentTimeMillis();
        World w = event.player.worldObj;
        
         this.baseTime = System.currentTimeMillis();
         this.timerAdd = loadTime(w.getWorldInfo().getWorldName(), mc.thePlayer.getDisplayName());

    }
    
    @SubscribeEvent
    public void onexit(PlayerLoggedOutEvent event)
    {
        System.out.println("exit");
        World w = event.player.worldObj;
        saveTime(w.getWorldInfo().getWorldName(), mc.thePlayer.getDisplayName());
    }
наверно опять что то сделал не так...
 
для клиентской стороны их надо регистрировать как FML, для серверной как MinecraftForge


Код:
public void init(FMLInitializationEvent event)
{
   if( event.getSide().isClient() )
     FMLCommonHandler.instance().bus().register( new ServerEvents() );
   else
     MinecraftForge.EVENT_BUS.register( new ServerEvents() );
}
 
расскажи или покажи где ты регистрируешь Overlay и как
код CommonProxy, ClientProxy. чтобы 10 раз не спрашивать обо всём
 
ну покажи их регистрацию
 
Salamandr написал(а):
для клиентской стороны их надо регистрировать как FML, для серверной как MinecraftForge


Код:
public void init(FMLInitializationEvent event)
{
   if( event.getSide().isClient() )
     FMLCommonHandler.instance().bus().register( new ServerEvents() );
   else
     MinecraftForge.EVENT_BUS.register( new ServerEvents() );
}
Не совсем так.
Те ивенты, что лежат в пакете net.minecraftforge.event - регать в MinecraftForge.EVENT_BUS.
А те, что лежат в fml... - в FMLCommonHandler.instance().bus().
 
вот:
Код:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;















import org.lwjgl.opengl.GL11;






public class OVRL extends Gui
{
    
    long timerAdd = 0L;
    long baseTime = 0L;
    

    
    
    long lastSave = 0L;
    public boolean limit = false;
    private Minecraft mc;
    private static final ResourceLocation texture = new ResourceLocation("qi", "textures/gui/mana_bar.png");

    public OVRL(Minecraft mc) {
        super();
        this.mc = mc;
    }
    
    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;
      }
    
    @SuppressWarnings("resource")
    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();
        }
      }
      
      @SuppressWarnings("resource")
    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;
      }

    private long calculateTime()
      {
        return System.currentTimeMillis() - this.baseTime + this.timerAdd;
      }
    
    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) });
      }
    
    @SubscribeEvent
    public void onlogin(PlayerLoggedInEvent event)
    {
        System.out.println("login");
        this.baseTime = System.currentTimeMillis();
        World w = event.player.worldObj;
        
         this.baseTime = System.currentTimeMillis();
         this.timerAdd = loadTime(w.getWorldInfo().getWorldName(), mc.thePlayer.getDisplayName());

    }
    
    @SubscribeEvent
    public void onexit(PlayerLoggedOutEvent event)
    {
        System.out.println("exit");
        World w = event.player.worldObj;
        saveTime(w.getWorldInfo().getWorldName(), mc.thePlayer.getDisplayName());
    }
    
//    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void onRenderExperienceBar(RenderGameOverlayEvent.Post event) {
        int xPos = 2;
        int yPos = 6;
        this.mc.getTextureManager().bindTexture(texture);
        this.mc.fontRenderer.drawString(getDisplayString(calculateTime()), xPos, yPos, 16777215);
    }
}

или ты про это:
Код:
if( event.getSide().isClient() )
             FMLCommonHandler.instance().bus().register( new OVRL(Minecraft.getMinecraft()) );
           else
             MinecraftForge.EVENT_BUS.register( new OVRL(Minecraft.getMinecraft()) );
 
Боже мой, хранить таймер для каждого игрока в отдельном файле.
Ну удачи тебе с таким подходом.
Зато сможешь хвастать тем, что кладёшь сервера направо и налево.
 
файл один
значений много.

>>или ты про это
я про это
это не надо регистрировать на серверной стороне, только на клиентской.
и на клиентской, это будет
if( event.getSide().isClient() )
{
MinecraftForge.EVENT_BUS.register( new OVRL(Minecraft.getMinecraft()) );
}
//и всё
вспомни почему оно перестала работать, потому что ты изменил регистрацию события на неправильную

>>Не совсем так.
>>Те ивенты, что лежат в пакете net.minecraftforge.event - регать в MinecraftForge.EVENT_BUS.
>>А те, что лежат в fml... - в FMLCommonHandler.instance().bus().
для тестирования Серверных событий на клиентской стороне во время разработки - других способов просто нема.
 
Назад
Сверху