Ну вообще то принцип прокси в разделении мода на клиентский (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 - когда сервер запустился и готов ко входу игроков. Что-то его личное, только для сервера.