Подмена Gui. [1.7.10]

1,057
50
234
Добрый день.
Использую API Galacticraft'a.
Появилась необходимость заменить стандартный GuiCelestialSelection на свой.
Попробовал сделать замену через тики.

(...mc.currentScreen instanceof GuiCelestialSelection)
{
KeyHandlerClient.mc.thePlayer.openGui(Mymod.instance, GuiIdsMymod.GALAXY_MAP, KeyHandlerClient.mc.theWorld, (int) KeyHandlerClient.mc.thePlayer.posX, (int) KeyHandlerClient.mc.thePlayer.posY, (int) KeyHandlerClient.mc.thePlayer.posZ);            
}

Но фишка в том, что при попытки открыть этот гуи, открывается и стандартное, и мое. То-есть идет наложение.

Такое чувство, что открытие стандартного гуи тоже происходит в тиках...

Как в такой ситуации быть?
 
Ловишь GuiOpenEvent, в нём объект гуи подменяешь на свой.

Код:
@SubscribeEvent
public void swapGalacticraftGui(GuiOpenEvent event) {
    if (event.gui instanceof GuiCelestialAutism)
        event.gui = new GuiMyDearYoba();
}
Можешь ещё попробовать поставить LOWEST (или наоборот HIGHEST, не имею понятия как работают приоритеты) PRIORITY в аргументах аннотации перехвата события, таким образом твой код сработает последним и всё будет норм, даже если гэлэктикрафт зачем-то открывает свой гуи таким же способом.
 
Аргументах аннотации...
В смысле вот так: @SubscribeEvent(EventPriority.HIGHHEST)?

Понял, спасибо

Однако все равно идет наложение...
 
Можешь показать скрином, а заодно закинуть весь относящийся к гуи код?
Странно это.
 
Порылся в исходах галактика, нашел вот это:

Код:
case C_UPDATE_DIMENSION_LIST:
            if (String.valueOf(this.data.get(0)).equals(FMLClientHandler.instance().getClient().thePlayer.getGameProfile().getName()))
            {
                String dimensionList = (String) this.data.get(1);
                if (ConfigManagerCore.enableDebug)
                {
                    if (!dimensionList.equals(PacketSimple.spamCheckString))
                    {
                        GCLog.info("DEBUG info: " + dimensionList);
                        PacketSimple.spamCheckString = new String(dimensionList);
                    }
                }
                final String[] destinations = dimensionList.split("\\?");
                List<CelestialBody> possibleCelestialBodies = Lists.newArrayList();
                Map<String, String> spaceStationNames = Maps.newHashMap();
                Map<String, Integer> spaceStationIDs = Maps.newHashMap();

                for (String str : destinations)
                {
                    CelestialBody celestialBody = WorldUtil.getReachableCelestialBodiesForName(str);

                    if (celestialBody == null && str.contains("$"))
                    {
                        celestialBody = GalacticraftCore.satelliteSpaceStation;

                        String[] values = str.split("\\$");

                        spaceStationNames.put(values[1], values[2]);
                        spaceStationIDs.put(values[1], Integer.parseInt(values[3]));
                    }

                    if (celestialBody != null)
                    {
                        possibleCelestialBodies.add(celestialBody);
                    }
                }

                if (FMLClientHandler.instance().getClient().theWorld != null)
                {
                    if (!(FMLClientHandler.instance().getClient().currentScreen instanceof GuiCelestialSelection))
                    {
                        GuiCelestialSelection gui = new GuiCelestialSelection(false, possibleCelestialBodies);
                        gui.spaceStationNames = spaceStationNames;
                        gui.spaceStationIDs = spaceStationIDs;
                        FMLClientHandler.instance().getClient().displayGuiScreen(gui);
                    }
                    else
                    {
                        ((GuiCelestialSelection) FMLClientHandler.instance().getClient().currentScreen).possibleBodies = possibleCelestialBodies;
                        ((GuiCelestialSelection) FMLClientHandler.instance().getClient().currentScreen).spaceStationNames = spaceStationNames;
                        ((GuiCelestialSelection) FMLClientHandler.instance().getClient().currentScreen).spaceStationIDs = spaceStationIDs;
                    }
                }
            }
            break;
Может ли этот кейс вызывать эту проблему?
И если может, как отловить и изменить его?
[merge_posts_bbcode]Добавлено: 08.10.2015 14:52:25[/merge_posts_bbcode]

Код:
package blessentumble.core.handler;

import java.util.List;
import java.util.Map;
import java.util.Random;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import micdoodle8.mods.galacticraft.core.client.gui.screen.GuiCelestialSelection;
import net.minecraft.client.Minecraft;
import net.minecraft.world.World;
import net.minecraftforge.client.event.GuiOpenEvent;
import blessentumble.core.gui.GuiCelestialSelectionGS;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class GSClientHandler {

 public Minecraft mc = Minecraft.getMinecraft();

@SideOnly(Side.CLIENT)
    @SubscribeEvent(priority = EventPriority.HIGHEST)
    public void swapGalacticraftGui(GuiOpenEvent event) {
     
        if (event.gui instanceof GuiCelestialSelection)
            event.gui = new GuiCelestialSelectionGS(false, null);
    }


Код:
    @EventHandler
    public void init(FMLInitializationEvent event)

    {  
     proxy.load();;

        GSClientHandler ClientHandlerGS = new GSClientHandler();
        FMLCommonHandler.instance().bus().register(ClientHandlerGS);
        MinecraftForge.EVENT_BUS.register(ClientHandlerGS);
}
 
Эх, ссаными палками бы бить за такое их. Делать такое в паблик модах, которые включаются в сборки.
Можешь показать чуть больше кода, из их исходников? Хотя бы заголовок метода, где ты это нарыл, мне просто интересно при каких обстоятельствах тот код вызывается.
 
Да нет, всё норм, зря я писал про них плохие вещи :)
Реакцией на пакет так норм делать.
Не знаю что у тебя там может быть, оно не должно меняться обратно с твоей менюшки.
Да и вообще, двух активных guiScreen быть не может (вроде, лол), ты уверен, что у тебя там именно гуи рисуется? Если бы оно меняло гуи - твой бы вообще не рисовался. Если рисуются вместе, то возможно мод рисует не гуи, а вообще что-то другое, например - свой костыльный аналог гуи.
 
Вот: Это оригинальный GuiCelestialSelection
nme7sxzkpxes.png


А это мой, который я пытаюсь заменить:
r3ck5jnhgbys.png


Если присмотреться, то по орбите земли можно понять, что гуи накладываются друг на друга.
Красное кольцо наложено на зеленое.

Должно быть просто красное.
 
Назад
Сверху