MegavexNetwork / scoreboard-library

Powerful packet-level scoreboard library for Paper/Spigot servers
https://megavex.net
MIT License
150 stars 13 forks source link

Legacy Packet Adapter #59

Closed Nixuge closed 3 weeks ago

Nixuge commented 2 months ago

Very rough edges but had free time so why not

Confirmed to work on 1.7.10 -> 1.12.2 instead of just 1.8.8

TODOs:

Maybe TODO:

vytskalt commented 2 months ago

I think we remove the 1.8 adapter and rename this one to just legacy since I don't see a reason for 1.8 to exist anymore (performance diff should be minimal and it doesn't matter anyway since it's all done async). For backwards compat the v1_8_R3 module could stay and would just do something like implementation(project(":legacy")) in the build.gradle.

Nixuge commented 2 months ago

Update: Tested 3 versions:

Out of those three:

Removing those and trying to build unfortunately doesn't seem to make it work either.

Would guess this works fine for all versions from 1.8 to 1.12.2. Unfortunately not 1.7, may make another PR for those versions. Still begs the question as to if this should be called "legacy" or "1.8-1.12", since if 1.7 requires another adapter that one would need to be named legacy-legacier or smth (depends on if you even want a 1.7- adapter at all in this project)

Also completely forgot on the initial comment, but another urgent thing is to get the "v1_8_R3" , "v1_12_R1" from the server version as of rn it's just hardcoded in RandomUtils

vytskalt commented 2 months ago

FastBoard supports 1.7.10, we can use it as a reference as to what needs changing. https://github.com/MrMicky-FR/FastBoard/blob/master/src/main/java/fr/mrmicky/fastboard/FastBoardBase.java

Nixuge commented 2 months ago

From a quick glance, most likely place that's failing in 1.7 with nothing changed is in sendScore:

  @Override
  public void sendScore(
...
  ) {
    Object packet = packetPlayOutScoreboardScoreConstructor.invoke(entry);
    PacketAccessors.SCORE_OBJECTIVE_NAME_FIELD.set(packet, objectiveName);
    PacketAccessors.SCORE_VALUE_FIELD.set(packet, value);
//    Removed - not in 1.7
//    PacketAccessors.SCORE_ACTION_FIELD.set(packet, enumScoreboardActionChange);
    sender.sendPacket(players, packet);
  }

In FastBoard, they still do something for the action field even in 1.7:

        if (VersionType.V1_8.isHigherOrEqual()) {
            Object enumAction = action == ScoreboardAction.REMOVE
                    ? ENUM_SB_ACTION_REMOVE : ENUM_SB_ACTION_CHANGE;
            setField(packet, ENUM_SB_ACTION, enumAction);
        } else {
            setField(packet, int.class, action.ordinal(), 1); // Action
        }
Nixuge commented 2 months ago

image And indeed that was the fix

Added this in PacketAccessors:

  public static final FieldAccessor<Object, Integer> SCORE_ACTION_FIELD_1_7 =
    ReflectUtil.findField(packetPlayOutScoreboardScoreClass, 1, int.class);

Then in ObjectivePacketAdapterImpl replaced:

PacketAccessors.SCORE_ACTION_FIELD.set(packet, enumScoreboardActionChange);

with

PacketAccessors.SCORE_ACTION_FIELD_1_7.set(packet, 0); // 0 = CHANGE, int value yoinked from FastBoard

Pretty sure the other lib's functionalities that i had to remove for 1.7 support were added in 1.8 tho so can't support them

Nixuge commented 2 months ago

Unfortunately, as excepted, 1.6 doesn't work either with that last change.

Nixuge commented 2 months ago

Not sure why the test is failing btw, iirc it worked correctly when I tried it