Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 1.17
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: 'adopt'
java-version: 17
java-version: 21
- name: Cache Gradle packages
uses: actions/cache@v4
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/minepkg-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 1.17
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: 'adopt'
java-version: 17
java-version: 21
- name: Publish package on minepkg.io
uses: minepkg/action-publish@main
with:
Expand Down
10 changes: 5 additions & 5 deletions .minepkg-lock.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
lockfileVersion = 1

[fabric]
minecraft = "1.20.4"
minecraft = "1.20.6"
fabricLoader = "0.16.10"
mapping = "1.20.4+build.3"
mapping = "1.20.6+build.3"

[dependencies]

[dependencies.fabric]
name = "fabric"
version = "0.97.2+1.20.4.mpkg.1"
version = "0.100.8+1.20.6.mpkg.1"
versionName = ""
type = "mod"
ipfsHash = ""
Sha256 = "3e820841b9f5d3d898bcb0f0abb9bfc15fb608bf07c74292ea3dd1b98d36460a"
url = "https://api.preview.minepkg.io/v1/releases/fabric/fabric@0.97.2+1.20.4.mpkg.1/download"
Sha256 = "aa0457cd765d62072c8ceeb75f4d8ea36698ae996e71c28a898da4d0a81752b2"
url = "https://api.preview.minepkg.io/v1/releases/fabric/fabric@0.100.8+1.20.6.mpkg.1/download"
provider = "minepkg"
dependent = ""

Expand Down
12 changes: 6 additions & 6 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G

# Fabric Properties
# check these on https://fabricmc.net/versions.html
minecraft_version=1.20.2
yarn_mappings=1.20.2+build.4
minecraft_version=1.20.6
yarn_mappings=1.20.6+build.3
loader_version=0.16.10

# Mod Properties
Expand All @@ -13,8 +13,8 @@ maven_group=io.minepkg
archives_base_name=test-utils

# Dependencies
fabric_version=0.91.6+1.20.2
libgui_version=9.2.2+1.20.2
fabric_version=0.100.8+1.20.6
libgui_version=10.0.0+1.20.6

minecraft_version_range= >=1.20.2 <=1.20.4
java_version=17
minecraft_version_range= 1.20.6
java_version=21
2 changes: 1 addition & 1 deletion minepkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ manifestVersion = 0

# These are global requirements
[requirements]
minecraft = ">=1.20.2 <=1.20.4"
minecraft = "1.20.6"
fabricLoader = "*"

[dependencies]
Expand Down
26 changes: 11 additions & 15 deletions src/main/java/io/minepkg/testutils/RuleBookGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@
import io.github.cottonmc.cotton.gui.widget.data.Color.RGB;
import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment;
import io.github.cottonmc.cotton.gui.widget.data.Insets;
import io.minepkg.testutils.gui.*;
import io.netty.buffer.Unpooled;
import io.minepkg.testutils.gui.WClickableLabel;
import io.minepkg.testutils.gui.WGradient;
import io.minepkg.testutils.gui.WSpriteButton;
import io.minepkg.testutils.gui.WUsableClippedPanel;
import io.minepkg.testutils.network.c2s.SetRulePayload;
import io.minepkg.testutils.network.c2s.SetTimePayload;
import io.minepkg.testutils.network.c2s.SetWeatherPayload;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
Expand Down Expand Up @@ -221,10 +225,8 @@ public void tick() {

private void setTime(long timeOfDay) {
preventTickUpdates = 1000;
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeLong(timeOfDay);
// Send packet to server to change the time
ClientPlayNetworking.send(TestUtils.SET_TIME_C2S, passedData);
ClientPlayNetworking.send(new SetTimePayload(timeOfDay));
timeSlider.setValue((int)timeOfDay, false);
envBox.setTimeOfDay(timeOfDay);
// TODO: wait for response instead
Expand All @@ -233,20 +235,14 @@ private void setTime(long timeOfDay) {

private void setRule(short id, boolean value) {
preventTickUpdates += 1;
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
// eg. 0 is day cycle
passedData.writeShort(id);
// enabling the button locks the weather
passedData.writeBoolean(value);
ClientPlayNetworking.send(TestUtils.SET_RULE_C2S, passedData);
// e.g. id 0 is day cycle, enabling the button locks the weather
ClientPlayNetworking.send(new SetRulePayload(id, value));
preventTickUpdates = 20;
}

private void setWeather(short weather) {
preventTickUpdates += 1;
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeShort(weather);
ClientPlayNetworking.send(TestUtils.SET_WEATHER_C2S, passedData);
ClientPlayNetworking.send(new SetWeatherPayload(weather));
preventTickUpdates = 30;
}
}
70 changes: 31 additions & 39 deletions src/main/java/io/minepkg/testutils/TestUtils.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package io.minepkg.testutils;

import io.netty.buffer.Unpooled;
import io.minepkg.testutils.network.c2s.SetRulePayload;
import io.minepkg.testutils.network.c2s.SetTimePayload;
import io.minepkg.testutils.network.c2s.SetWeatherPayload;
import io.minepkg.testutils.network.s2c.OpenBookPayload;
import io.minepkg.testutils.network.s2c.WeatherGameruleSyncPayload;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;

import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
Expand All @@ -24,13 +27,6 @@ public class TestUtils implements ModInitializer {
public static final String MOD_ID = "testutils"; // Note: currently different from fabric.mod.json id
public static final Logger LOGGER = LogManager.getLogger(MOD_ID);

public static final Identifier OPEN_BOOK_S2C = TestUtils.id("open_book");
public static final Identifier WEATHER_GAMERULE_SYNC_S2C = TestUtils.id("weather_sync");

public static final Identifier SET_TIME_C2S = TestUtils.id("set_time");
public static final Identifier SET_RULE_C2S = TestUtils.id("set_rule");
public static final Identifier SET_WEATHER_C2S = TestUtils.id("set_weather");

public static final short DO_DAYLIGHT_CYCLE_RULE = 1;
public static final short DO_WEATHER_CYCLE_RULE = 2;

Expand Down Expand Up @@ -62,86 +58,82 @@ public void onInitialize() {
});

// client wants to set the time
ServerPlayNetworking.registerGlobalReceiver(SET_TIME_C2S, (server, player, handler, buf, responseSender) -> {
// make sure its not over 24000
long wantedTime = buf.getLong(0) % 24000;

PayloadTypeRegistry.playC2S().register(SetTimePayload.ID, SetTimePayload.CODEC);
ServerPlayNetworking.registerGlobalReceiver(SetTimePayload.ID, (payload, context) -> {
// Execute on the main thread
server.execute(() -> {
ServerWorld world = player.getServerWorld();
context.player().server.execute(() -> {
ServerWorld world = context.player().getServerWorld();
// set the time
world.setTimeOfDay(wantedTime);
world.setTimeOfDay(payload.time());
});
});

// client wants to set the weather
ServerPlayNetworking.registerGlobalReceiver(SET_WEATHER_C2S, (server, player, handler, buf, responseSender) -> {
short weather = buf.getShort(0);
ServerWorld world = player.getServerWorld();
PayloadTypeRegistry.playC2S().register(SetWeatherPayload.ID, SetWeatherPayload.CODEC);
ServerPlayNetworking.registerGlobalReceiver(SetWeatherPayload.ID, (payload, context) -> {
ServerWorld world = context.player().getServerWorld();

// Execute on the main thread
server.execute(() -> {
switch (weather) {
context.player().server.execute(() -> {
switch (payload.weather()) {
case WEATHER_CLEAR -> world.setWeather(120000, 0, false, false);
case WEATHER_RAIN -> world.setWeather(0, 24000, true, false);
case WEATHER_THUNDER -> world.setWeather(0, 24000, true, true);
}
});
});

// client wants to set a rule (eg. freeze the time)
ServerPlayNetworking.registerGlobalReceiver(SET_RULE_C2S, (server, player, handler, buf, sender) -> {
short ruleID = buf.getShort(0);
boolean value = buf.getBoolean(2);
// client wants to set a rule (e.g. freeze the time)
PayloadTypeRegistry.playC2S().register(SetRulePayload.ID, SetRulePayload.CODEC);
ServerPlayNetworking.registerGlobalReceiver(SetRulePayload.ID, (payload, context) -> {
ServerPlayerEntity player = context.player();
MinecraftServer server = player.server;
ServerWorld world = player.getServerWorld();

// Execute on the main thread
server.execute(() -> {

GameRules rules = world.getGameRules();

switch(ruleID) {
switch(payload.ruleID()) {
// daylight cycle
case DO_DAYLIGHT_CYCLE_RULE -> {
BooleanRule rule = rules.get(GameRules.DO_DAYLIGHT_CYCLE);
rule.set(value, world.getServer());
rule.set(payload.value(), server);
}
case DO_WEATHER_CYCLE_RULE -> {
BooleanRule rule = rules.get(GameRules.DO_WEATHER_CYCLE);
rule.set(value, world.getServer());
broadcastWeatherRuleChange(server, value);
rule.set(payload.value(), server);
broadcastWeatherRuleChange(server, payload.value());
}
default ->
LOGGER.error(
"Player {} requested to change an unsupported rule id ({}). (client might be outdated)",
player.getName().getString(),
ruleID
payload.ruleID()
);
}
});
});
}

public static void sendOpenBookPacket(ServerPlayerEntity player) {
PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer());
ServerPlayNetworking.send(player, OPEN_BOOK_S2C, packet);
ServerPlayNetworking.send(player, new OpenBookPayload());
}

public static void broadcastWeatherRuleChange(MinecraftServer server, boolean value) {
PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer());
packet.writeBoolean(value);
var payload = new WeatherGameruleSyncPayload(value);

// Notify each player on the server about the weather gamerule update.
server.getPlayerManager().getPlayerList().forEach(player -> {
ServerPlayNetworking.send(player, WEATHER_GAMERULE_SYNC_S2C, packet);
ServerPlayNetworking.send(player, payload);
});
}

public static void sendWeatherRule(ServerPlayerEntity player) {
ServerWorld world = player.getServerWorld();
boolean doWeatherCycle = world.getGameRules().getBoolean(GameRules.DO_WEATHER_CYCLE);
PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer());
packet.writeBoolean(doWeatherCycle);
ServerPlayNetworking.send(player, WEATHER_GAMERULE_SYNC_S2C, packet);
var payload = new WeatherGameruleSyncPayload(doWeatherCycle);
ServerPlayNetworking.send(player, payload);
}
}
18 changes: 12 additions & 6 deletions src/main/java/io/minepkg/testutils/TestUtilsClient.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package io.minepkg.testutils;

import io.minepkg.testutils.network.s2c.OpenBookPayload;
import io.minepkg.testutils.network.s2c.WeatherGameruleSyncPayload;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.minecraft.client.MinecraftClient;

public class TestUtilsClient implements ClientModInitializer {

Expand All @@ -10,17 +14,19 @@ public class TestUtilsClient implements ClientModInitializer {

@Override
public void onInitializeClient() {
ClientPlayNetworking.registerGlobalReceiver(TestUtils.OPEN_BOOK_S2C, (client, clientPlayNetworkHandler, packet, packetSender) -> {
PayloadTypeRegistry.playS2C().register(OpenBookPayload.ID, OpenBookPayload.CODEC);
ClientPlayNetworking.registerGlobalReceiver(OpenBookPayload.ID, (payload, context) -> {
MinecraftClient client = context.client();

client.execute(() -> {
client.setScreen(new RuleBookScreen(new RuleBookGUI(client.world, client.player)));
});
});

ClientPlayNetworking.registerGlobalReceiver(TestUtils.WEATHER_GAMERULE_SYNC_S2C, (client, clientPlayNetworkHandler, packet, packetSender) -> {
boolean doWeatherCycle = packet.readBoolean();

client.execute(() -> {
TestUtilsClient.doWeatherCycle = doWeatherCycle;
PayloadTypeRegistry.playS2C().register(WeatherGameruleSyncPayload.ID, WeatherGameruleSyncPayload.CODEC);
ClientPlayNetworking.registerGlobalReceiver(WeatherGameruleSyncPayload.ID, (payload, context) -> {
context.client().execute(() -> {
TestUtilsClient.doWeatherCycle = payload.doWeatherCycle();
// Does not work because .. minecraft
// ((GameRules.BooleanRule)client.world.getGameRules().get(GameRules.DO_WEATHER_CYCLE)).set(doWeatherCycle, (MinecraftServer)null);
});
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/io/minepkg/testutils/gui/WGradient.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import io.github.cottonmc.cotton.gui.widget.data.Color.RGB;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.DrawContext; // Import DrawContext!
import net.minecraft.client.gui.DrawContext;

public class WGradient extends WWidget {

Expand Down Expand Up @@ -38,4 +38,4 @@ public static RGB interpolateColors(RGB color1, RGB color2, double percent){
double b = (color2.getB() - color1.getB()) * percent + color1.getB();
return new RGB((int)a, (int)r, (int)g, (int)b);
}
}
}
27 changes: 27 additions & 0 deletions src/main/java/io/minepkg/testutils/network/c2s/SetRulePayload.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.minepkg.testutils.network.c2s;

import io.minepkg.testutils.TestUtils;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.packet.CustomPayload;

public record SetRulePayload(short ruleID, boolean value) implements CustomPayload {
public static final Id<SetRulePayload> ID = new Id<>(TestUtils.id("set_rule"));

public static final PacketCodec<PacketByteBuf, SetRulePayload> CODEC = PacketCodec.of(
(payload, buf) -> {
buf.writeShort(payload.ruleID);
buf.writeBoolean(payload.value);
},
buf -> {
short ruleID = buf.readShort();
boolean value = buf.readBoolean();
return new SetRulePayload(ruleID, value);
}
);

@Override
public Id<? extends CustomPayload> getId() {
return ID;
}
}
Loading