как синхронизировать capability с клиентом?

Версия Minecraft
1.16.5
56
4
3
кхм, создал я кэп, который должен работать, и он работает, предмет не используется если полностью потратить кэп, но с помощью дебажинга я понял, что значения на клиенте и значения на сервере абсолютно разные (если на стороне сервера я потрачу всю свою ману, то она будет все равно на максимальном значении, и если я на клиенте выставлю значение меньше, то начнется регенерация, из этого выясняем, что код работает, надо лишь как-то синхронизировать с сервером). как мне их синхронизировать? мне нужно чтобы значение с сервера передавалось на клиент, но честно, я почти никогда не работал с пакетами и с нетворкингом и не понимаю, как это должно работать, поэтому очень желательно с примерами, если не сложно, но можно и просто на словах

mcp
 
7,099
324
1,510
Когда нужно - отправляй с сервера на клиент пакет с акутальными данными. Например, при входе игрока и при изменении данных
 
56
4
3
Когда нужно - отправляй с сервера на клиент пакет с акутальными данными. Например, при входе игрока и при изменении данных
поставил я твою библиотеку, начал пробовать и понял, что я не могу реализовать ServerToClientPacket. где его взять?
 
Последнее редактирование:
7,099
324
1,510
Покажи билд-скрипт(build.gradle)
~~~
Т.е. аннотация видна, а интерфейс нет?
 
Последнее редактирование:
56
4
3
Покажи билд-скрипт(build.gradle)
~~~
Т.е. аннотация видна, а интерфейс нет?
да, а билд скрипт, ща


я хз как его скинуть поэтому так:
buildscript {
    repositories {
        maven { url = 'https://maven.minecraftforge.net' }
        mavenCentral()
    }
    dependencies {
        classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true
    }
}
apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'eclipse'
apply plugin: 'maven-publish'

version = '1.16.5-a1.1.1'
group = 'com.auriny.cospg' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = 'cosrpg'

java.toolchain.languageVersion = JavaLanguageVersion.of(8) // Mojang ships Java 8 to end users, so your mod should target Java 8.

repositories {
    maven {
        url = "https://maven.theillusivec4.top/"
    }
}

println('jdk: ' + System.getProperty('java.version') + ' jvm: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') arch: ' + System.getProperty('os.arch'))
minecraft {
    mappings channel: 'snapshot', version: '20210309-1.16.5'

    runs {
        client {
            workingDirectory project.file('run')

            property 'forge.logging.markers', 'REGISTRIES'
            
            property 'forge.logging.console.level', 'debug'

            mods {
                cosrpg {
                    source sourceSets.main
                }
            }
        }

        server {
            workingDirectory project.file('run')

            // Recommended logging data for a userdev environment
            // The markers can be changed as needed.
            // "SCAN": For mods scan.
            // "REGISTRIES": For firing of registry events.
            // "REGISTRYDUMP": For getting the contents of all registries.
            property 'forge.logging.markers', 'REGISTRIES'

            // Recommended logging level for the console
            // You can set various levels here.
            // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
            property 'forge.logging.console.level', 'debug'

            mods {
                cosrpg {
                    source sourceSets.main
                }
            }
        }

        data {
            workingDirectory project.file('run')
            
            property 'forge.logging.markers', 'REGISTRIES'

            property 'forge.logging.console.level', 'debug'

            args '--mod', 'cosrpg', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')

            mods {
                cosrpg {
                    source sourceSets.main
                }
            }
        }
    }
}

// Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' }

dependencies {
    implementation 'org.jetbrains:annotations:20.1.0'


    minecraft 'net.minecraftforge:forge:1.16.5-36.2.34'

    compileOnly "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14" //для idea
    annotationProcessor "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14"

    runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.3")
    compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.3:api")

}

jar {
    manifest {
        attributes([
            "Specification-Title": "cosrpg",
            "Specification-Vendor": "cosrpgareus",
            "Specification-Version": "1", // We are version 1 of ourselves
            "Implementation-Title": project.name,
            "Implementation-Version": "${version}",
            "Implementation-Vendor" :"cosrpgmodsareus",
            "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
        ])
    }
}

jar.finalizedBy('reobfJar')

compileJava.options.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifact jar
        }
    }
    repositories {
        maven {
            url "file:///${project.projectDir}/mcmodsrepo"
        }
    }
}
 
7,099
324
1,510
dependencies { implementation 'org.jetbrains:annotations:20.1.0' minecraft 'net.minecraftforge:forge:1.16.5-36.2.34' compileOnly "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14" //для idea annotationProcessor "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14" runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.3") compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.3:api") }
Ты добавил процессор аннотаций, но не добавил либу 🤦‍♂️
Gradle (Groovy):
dependencies {
    implementation 'org.jetbrains:annotations:20.1.0'


    minecraft 'net.minecraftforge:forge:1.16.5-36.2.34'
    
    implementation fg.deobf("io.gitlab.hohserg.elegant.networking:elegant-networking-1.16:3.14") //забыл про это

    compileOnly "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14" //для idea
    annotationProcessor "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14"

    runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.3")
    compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.0.5.3:api")

}
 
627
72
178
все, которые добавляет твоя капа?
как вариант в пакет передавай CompoundTag из YourCapability#serializeNBT со стороны сервера и на клиенте вызывай YourCapability#deserializeNBT с этими данными в качестве параметра
 
Последнее редактирование:
7,099
324
1,510
и еще вопрос, какие данные нужно вообще отправлять для синхронизации капы?
Например, в твоей капе содержится коллекция Set<Some>. Тогда при входе игрока нужно отправлять пакет с целой коллекций, а когда в коллекцию добавляется/удаляется один элемент, то стоит отправлять другой пакет с этим одним элементом

Кстати, реализацию сериализации капы тоже можно сделать через ElegantNetworking:
Java:
public class SomeValueProvider implements ICapabilitySerializable {

    SomeValue value;
    
    ...

    @Override
    public NBTTagCompound serializeNBT() {
        return ElegantNetworking.getNbtSerializerFor(SomeValue.class).serialize(value);
    }

    @Override
    public void deserializeNBT(NBTTagCompound nbt) {
        value = legantNetworking.getNbtSerializerFor(SomeValue.class).unserialize(nbt);
    }
}

@ElegantSerializable
public class SomeValue implements IByteBufSerializable {
    ...
}
 
Последнее редактирование:
Сверху