Разделение Клиент-Сервер и пакетная система ElegantNetworking

Разделение Клиент-Сервер и пакетная система ElegantNetworking

154
17
96
GlassSpirit добавил(а) новый ресурс:

[Познавательный МайнкрафтЪ] Разделение Клиент-Сервер и коммуникация - Базовая теоретическая информация по разделению Клиента и Сервера и их коммуникации.

Дисклеймер:
Данный цикл статей содержит преимущественно теоретическую информацию про майнкрафт и моддинг, и является в основном переводом иностранных источников с авторскими дополнениями.
Ресурс может содержать устаревшую или неточную информацию.

Оглавление:
  1. Разделение Клиент-Сервер
  2. Коммуникация ванильный Клиент <--> Сервер
  3. Коммуникация Клиент <--> Сервер с помощью своих пакетов
  4. Потокобезопасность при работе с...

Узнать больше об этом ресурсе...
 
154
17
96
Мой первый опыт в написании и переводе чего-то вообще)
Желание выбрать именно теоретический формат пришло из того, что существует очень мало русскоязычных ресурсов получения теоретических знаний о майнкрафте. Большинство людей (в том числе и я) самостоятельно изучали, как он работает изнутри, путем прочесывания исходного кода. Возможно такой формат поможет начинающим кодерам лучше понять систему изнутри, а не просто "пиши это и будет вот это", как во многих гайдах.
Прошу оценить и сказать, продолжать ли мне собирать такую теоретическую информацию про наш любимый майнкрафт?)
 
1,111
47
420
Вроде сервер и клиент в сингле в одном потоке работают)
 

Eifel

Модератор
1,623
78
608
Очень круто и полезно, но, к сожалению, в конкурсе "Супер-гайд 2018" этот, преимущественно перевод, принимать участия не может.
 
Последнее редактирование:
154
17
96
GlassSpirit обновил(а) ресурс Разделение Клиент-Сервер и пакетная система ElegantNetworking новой записью:

Добавление ElegantNetworking и актуализация информации

Актуализирована информация, поправлены ошибки в оформлении.
Добавлена информация про библиотеку ElegantNetworking.

Особая благодарность @hohserg за доработку статьи и создание прекрасной библиотеки!

Узнать больше об этом обновлении...
 
173
6
23
new MyPacket(1).sendToServer();
требует создать конструктор в классе пакета(в гайде пример пакета не имеет конструктора)
что делать?
 

GoogleTan

Картошка :3
1,354
43
310
ломбок не работает значит
 
7,099
324
1,510
173
6
23
Получаю краш при входе в одиночный мир.
Отправляю пакет с кол-вом секунд каждую секунду(хых)

myFMLHandler:
public class myFMLHandler {
    int ticker=0;
    int sec=0;
    @SubscribeEvent
    public void event1(TickEvent.PlayerTickEvent e){
        System.out.println("ClientTicked");
        ticker++;
        if(ticker>=20){
            ticker=0;
            sec++;
                new MyPacket(sec).sendToServer();

        }
    }
}

MyPacket:
@Value
@ElegantPacket
public class MyPacket implements ClientToServerPacket {
    final int someInt;

    @Override
    public void onReceive(EntityPlayerMP p){
        p.setGameType(WorldSettings.GameType.SURVIVAL);
    }
}
 
7,099
324
1,510
Краш скинь
~~~
Это событие также вызывается на сервере. Т.е. пакет отправляется с сервера на сервер, что бессмысленно и свидетельствует об ошибке в логике мода. Поэтому игра крашится с соответствующим исключением
 
173
6
23
Краш при отправке пакета с клиента на сервер.
Краш:
java.lang.IllegalArgumentException: Packet is not registered: com.example.examplemod.MyPacket. Need to add @ElegantPacket annotation to packet class
    at hohserg.elegant.networking.impl.Registry.getPacketId(Registry.java:29)
    at hohserg.elegant.networking.impl.ForgeNetworkImpl.preparePacket(ForgeNetworkImpl.java:76)
    at hohserg.elegant.networking.impl.ForgeNetworkImpl.sendToServer(ForgeNetworkImpl.java:62)
    at hohserg.elegant.networking.api.ClientToServerPacket.sendToServer(ClientToServerPacket.java:21)
    at com.example.examplemod.KeyHandler.onKeyInput(KeyHandler.java:23)
    at cpw.mods.fml.common.eventhandler.ASMEventHandler_6_KeyHandler_onKeyInput_KeyInputEvent.invoke(.dynamic)
    at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:54)
    at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:140)
    at cpw.mods.fml.common.FMLCommonHandler.fireKeyInput(FMLCommonHandler.java:540)
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1964)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039)
    at net.minecraft.client.Minecraft.run(Minecraft.java:962)
    at net.minecraft.client.main.Main.main(Main.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
    at GradleStart.main(Unknown Source)

Аннотации @ElegantPacket и @Value в классе пакета есть.
 
173
6
23
MyPacket.:
package com.example.examplemod;

import hohserg.elegant.networking.api.ClientToServerPacket;
import hohserg.elegant.networking.api.ElegantPacket;
import lombok.Value;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.WorldSettings;

@Value
@ElegantPacket
public class MyPacket implements ClientToServerPacket {
    final int someInt;

    @Override
    public void onReceive(EntityPlayerMP p){
            System.out.println("ABCD");
            p.setGameType(WorldSettings.GameType.SURVIVAL);
    }
}
 
7,099
324
1,510
Да ладно тебе, вот в теме хуклибы наспамили 10+ страниц и ничо

Краш при отправке пакета с клиента на сервер.
Покажи лог запуска. Там должны быть строчки о регистрации пакетов.
Еще покажи билд-скрипт. Подозреваю, что ты неправильно подключил процессор аннотаций. Если используешь idea, то проверь это: При сборке внутри Idea может понадобится включить процессоры аннотаций, если они не включены
 
7,099
324
1,510
Если подключаешь через либы, используй Gradle 4.4.1 (поменяй в ./gradle/wrapper/gradle-wrapper.properties) и добавь папку с либами через flatDir:
Gradle (Groovy):
buildscript {
    repositories {
        mavenCentral()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
        maven {
            name = "sonatype"
            url = "https://oss.sonatype.org/content/repositories/snapshots/"
        }
        maven { url 'https://plugins.gradle.org/m2/' }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
        classpath 'net.ltgt.gradle:gradle-apt-plugin:0.9'
    }
}

apply plugin: 'forge'

version = "1.0"
group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "modid"

minecraft {
    version = "1.7.10-10.13.4.1614-1.7.10"
    runDir = "eclipse"
}

repositories {
    flatDir {
        dirs 'libs1'
    }
}

dependencies {
    deobfCompile "io.gitlab.hohserg.elegant.networking:elegant-networking-1.12:3.10"
    compileOnly "io.gitlab.hohserg.elegant.networking:annotation-processor:3.10" //для idea
    apt 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:3.10"
}

processResources
{
    // this will ensure that this task is redone when the versions change.
    inputs.property "version", project.version
    inputs.property "mcversion", project.minecraft.version

    // replace stuff in mcmod.info, nothing else
    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod.info'
                
        // replace version and mcversion
        expand 'version':project.version, 'mcversion':project.minecraft.version
    }
        
    // copy everything else, thats not the mcmod.info
    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}
Папку с либами лучше назвать libs1, чтобы не колизилось с libs, из которой просто все добавляется.
В старых FG используется deobfCompile вместо compile fg.deobf.
 
Сверху