Нуб вернулся

Знаю-знаю, юзай гугл. Но все-таки спрошу: как правильно настроить proxy? Я имею ввиду, какие методы написать, в какие из них регистрировать блоки и рендереры. А то, что было в OB2 явно отличается низким качеством и грамотностью. Ну, а я пошел спатеньки(пол-первого на улице)
 
471
5
ахаха а почему статус тогда "Мега-про" ?
 
7,099
324
1,510
Сообщений за 700...
 

svk

1,185
2
Идиотская система с сообщениями, я тоже маго-про, и меня это немного бесит...
А вообще, меня тоже этот вопрос интересует, сам-то вызываю методы из базового класса, но не зря-же устанавливается строка с 2 путями к прокси. Может в прокси есть методы, которые "сами" запускаются?
 
124
1
Ну вообще то принцип прокси в разделении мода на клиентский (full) и сервер мод (частичный, который содержит лишь минимум, вырезаны рендер и прочее).
блоки регистрируются в common(proxy), так как он грузится как на клиенте, так и на сервере, это надо просто запомнить. В client(proxy) добавляется всё чего нет на сервере, но есть на клиенте.
типичная структура есть тут, там немного лишнего но общий принцип есть.
Общая идея всего этого такова:
ClientProxy является потомком (сыном) CommonProxy. А сын как известно наследуюет(в идеале, а в программирование и есть идеал) его гены. Проще говоря, его методы и перезаписывает их на свои, если принудительно не вызвать "папочкины" методы. Иногда это необходимо, иногда нет, это решает тот кто пишет код.

Прокси фактически тело мода, поэтому да, за счет ForgeEventHandler мы указываем Форджу, что это его методы и он их должен запустить. Очередность соответствующая, сверху вниз.
Метод может быть лишь один, если остальные вам не нужны.

Код:
@EventHandler
    public void preInit(FMLPreInitializationEvent e) { proxy.preInit(e); }

    @EventHandler
    public void init(FMLInitializationEvent e) { proxy.init(e); }

    @EventHandler
    public void postInit(FMLPostInitializationEvent e) { proxy.postInit(e); }
    
    @Mod.EventHandler
    public void serverstart(FMLServerStartingEvent event) {
        //event.registerServerCommand(new CommandSpawnEntityNPC());
    }


Как видно отсюда, прокси вызываем мы САМИ, а фордж помогает нам его инициализировать (создать объект из класса) и кроме того, загрузить именно тот, который нужен "стороне" (клиентский или серверный).

Всё это было придумано для того, чтобы не писать ДВА мода. Чтобы один и тот же мод работал сразу и на сервере и на клиенте. Но с точки зрения защиты, это никак не избавляет от того что мода придется всё равно писать ДВА. Чтобы тем кому он понравился не смог установить его на своём сервере, без серверной части мода.
Если вы пишете для всех, Proxy, это именно то что вам надо. Я до сих пор использую эту концепцию не смотря на то что пишу ДВА мода ) потому что привык ;)))

preInit - во время подключения мода к игре. Использую для загрузки опций, конфигурации мода из файлов, для инициализации и проверки Sql (MySQL, MSSql, SQLLite, PostgreSQL, FireBirdSQL и т.д.).
init - инициализация мода. Сюда я сую всё, регистрация: блоков, тайлов, рендеров, ентити. Естественно с разбитием на common и client. Так как клиенту тоже нужна регистрация всего, кроме рендера, я вызываю "папочкин" метод, внутри clientproxy. А затем, в нём(client) ниже, вызываю регистрацию рендера.
postInit - когда мод загружен, обычно пустой.
startserver - когда сервер запустился и готов ко входу игроков. Что-то его личное, только для сервера.
 

svk

1,185
2
А я делал 2 переменных с прокси, которые запускал из соотвецтвующих сторон ...
 
Я прокси для регистрации .obj модели юзаю. У меня есть образцы старых прокси из OB, и разных недопилов, но они какие-то обрезанные. Кстати, а где же олдфаги(Анти(раньше которого я пришел на mcmodding:D), Коняшка, Драгон, др.)?
[merge_posts_bbcode]Добавлено: 28.04.2015 16:12:36[/merge_posts_bbcode]

Да и потом, должен же быть какой-то общий для всех шаблон CommonProxy? А то получается, как хочешь, так и делай.

[merge_posts_bbcode]Добавлено: 28.04.2015 16:13:29[/merge_posts_bbcode]

Оу, тупанул

Впрочем, ничего нового
 
1,990
18
105
>Анти(раньше которого я пришел на mcmodding:D)
Da.

А нафиг я тут? У меня 2.3к сообщений на мксу, тут около косаря. Мне просто надоело всем разжевывать типичные проблемы, которые у каждого второго и уже давно решены на форуме. А некоторые сами ничего делать не хотят, по два месяца ждут ответа в топике, когда за это время можно было выучить не только центрирование системы координат для модели, но ещё дохрена всего, включая шейдеры (маленький такой намёк на тему, которая толкнула меня свалить).
 
1,990
18
105
Кто знает, тот поймет. А остальным знать необязательно.
 
Oldestkon написал(а):
А некоторые сами ничего делать не хотят, по два месяца ждут ответа в топике, когда за это время можно было выучить не только центрирование системы координат для модели, но ещё до хрена всего, включая шейдеры

Ну, я бы мог выучить, и сделать, и найти, только эти сраные экзамены мешают
 
329
13
Пример моего CommonProxy:
Код:
public class CommonProxy
{
    // Собственно, конструктор. В нем регистрирую класс обработчика событий
    public CommonProxy()
    {
        MinecraftForge.EVENT_BUS.register(new CommonEventHandler());
    }

    // Регистрация блоков
    public void registerBlock() {}
    
    // Регистрация предметов
    public void registerItem() {}
    
    // Регистрация Entity
    public void registerEntity() {}
    
    // Регистрация рендеров. Он всегда пустой и нужен только для ClientProxy.
    public void registerRenderer() {}
    
    // Регистрация сетевых пакетов
    public void registerPacket() {}
}

А в главном классе пишу следующее:
Код:
@EventHandler
public void init(FMLInitializationEvent event)
{
    proxy.registerBlock();
    proxy.registerItem();
    proxy.registerEntity();
    proxy.registerRenderer();
    proxy.registerPacket();
}

Всё правильно делаю? Или можно еще элегантнее? Может делать вызов register****(); в конструкторе CommonProxy?
 
1,990
18
105
Vova_master написал(а):
Ну, я бы мог выучить, и сделать, и найти, только эти сраные экзамены мешают
Не про тебя писал.

@TaoGunner,
Не вижу смысла так делать, метод registerRenderers лишний для CommonProxy. Просто сделай метод init() в прокси, а там вызывай уже все нужные методы, и они пусть будут либо протектед (используются во всех проксях), либо приватные (только для ClientProxy, к примеру, тот же рендер).
Хотя в таком случае получается небольшая дубликация кода. Во избежание этого можно вынести вызов общих методов в главный класс мода, но это уже чисто твой выбор. От этого мало что зависит, так что решение не несёт особых последствий.
---EDIT
А можно просто вызвать super.init(); из clientProxy.
 
Тимаха, я видел, ты тут, может скинешь прокси и их регистрацию для 1.7.10? А то тут умные разговоры пошли, а я даже некоторые базовые вещи забыл уже:(
 
329
13
Oldestkon написал(а):
@TaoGunner,
Не вижу смысла так делать, метод registerRenderers лишний для CommonProxy. Просто сделай метод init() в прокси, а там вызывай уже все нужные методы...
---EDIT
А можно просто вызвать super.init(); из clientProxy.
Спасибо, супер. Кажется, я понял твою идею.

Кусок основного класса
Код:
@SidedProxy(clientSide="whois.your.daddy.client.ClientProxy", serverSide="whois.your.daddy.common.CommonProxy")
public static CommonProxy proxy;

@EventHandler
public void init(FMLInitializationEvent event)
{
    proxy.init();
}

CommonProxy
Код:
public class CommonProxy
{
    public CommonProxy()
    {
        // Обработчик событий (сервера?)
        MinecraftForge.EVENT_BUS.register(new CommonEventHandler());
    }
    
    public void init()
    {
        registerBlock();
        registerItem();
        registerEntity();
        registerPacket();
    }

    protected void registerBlock() {}
    protected void registerItem() {}
    protected void registerEntity() {}
    protected void registerPacket() {}
}

ClientProxy
Код:
public class ClientProxy extends CommonProxy
{
    public ClientProxy()
    {
        // Обработчик событий клиента
        MinecraftForge.EVENT_BUS.register(new ClientEventHandler());
    }

    @Override
    public void init()
    {
        // Вызываем методы CommonProxy, ибо нужны
        super.init();
        // И добавляем вызов чисто клиентского метода для рендера
        registerRenderer();
    }
    
    protected void registerRenderer() {}
}
 
1,990
18
105
> // Обработчик событий (сервера?)
Обеих сторон.
В остальном всё правильно понял.
 
Спасибо тутору Тимахи с сорцами на гитхабе, разобрался за 5 минут(ладно, 20). Но все пашет! Осталось UV верстку текстуры сделать и почти готово!
[merge_posts_bbcode]Добавлено: 29.04.2015 00:52:06[/merge_posts_bbcode]

ПыСЫ никто не в курсе, как размер интерфейся в Cinema4D менять? А то уменьшил случайно, а назад никак. (Да, мне лень гуглить. Я пошел в Яндекс)
 
124
1
да
 
Сверху