Skip to content

Commit

Permalink
Almost a rewrite
Browse files Browse the repository at this point in the history
  • Loading branch information
sammko committed Aug 14, 2020
1 parent 8b81a46 commit 6b99eef
Show file tree
Hide file tree
Showing 20 changed files with 182 additions and 156 deletions.
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ org.gradle.jvmargs=-Xmx1G

# Fabric Properties
minecraft_version=1.16.2
yarn_mappings=1.16.2+build.6
yarn_mappings=1.16.2+build.9
loader_version=0.9.1+build.205

# Mod Properties
mod_version = 1.0
mod_version = 1.1
maven_group = net.cavoj
archives_base_name = servertick

Expand Down
16 changes: 16 additions & 0 deletions src/main/java/net/cavoj/servertick/NetworkC2S.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.cavoj.servertick;

import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.Identifier;

public class NetworkC2S {
public static final Identifier PACKET_ENABLED = new Identifier("servertick", "enabled");

public static void sendToggle(boolean state) {
PacketByteBuf data = new PacketByteBuf(Unpooled.buffer());
data.writeBoolean(state);
ClientSidePacketRegistry.INSTANCE.sendToServer(PACKET_ENABLED, data);
}
}
25 changes: 25 additions & 0 deletions src/main/java/net/cavoj/servertick/NetworkS2C.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package net.cavoj.servertick;

import io.netty.buffer.Unpooled;
import net.cavoj.servertick.extensions.SerializableMetricsData;
import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.Identifier;

public class NetworkS2C {
public static final Identifier PACKET_FULL_METRICS = new Identifier("servertick", "metrics/full");
public static final Identifier PACKET_LAST_SAMPLE = new Identifier("servertick", "metrics/sample");

public static void sendFullMetrics(SerializableMetricsData metrics, PlayerEntity player) {
PacketByteBuf data = new PacketByteBuf(Unpooled.buffer());
metrics.serialize(data);
ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, PACKET_FULL_METRICS, data);
}

public static void sendLastSample(long sample, PlayerEntity player) {
PacketByteBuf data = new PacketByteBuf(Unpooled.buffer());
data.writeLong(sample);
ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, PACKET_LAST_SAMPLE, data);
}
}
9 changes: 0 additions & 9 deletions src/main/java/net/cavoj/servertick/Packets.java

This file was deleted.

80 changes: 0 additions & 80 deletions src/main/java/net/cavoj/servertick/STServer.java

This file was deleted.

39 changes: 39 additions & 0 deletions src/main/java/net/cavoj/servertick/ServerTick.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package net.cavoj.servertick;

import net.cavoj.servertick.extensions.MinecraftServerWithST;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.network.PacketContext;
import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf;

public class ServerTick implements ModInitializer {
@Override
public void onInitialize() {
ServerSidePacketRegistry.INSTANCE.register(NetworkC2S.PACKET_ENABLED, this::processTogglePacket);
ServerTickEvents.END_SERVER_TICK.register((minecraftServer -> {
((MinecraftServerWithST)minecraftServer).tickST();
}));
}

private boolean checkPlayerPrivilege(PlayerEntity player) {
return player.hasPermissionLevel(4) || !player.getServer().isDedicated();
}

private void processTogglePacket(PacketContext ctx, PacketByteBuf data) {
boolean state = data.readBoolean();
ctx.getTaskQueue().execute(() -> {
PlayerEntity player = ctx.getPlayer();
MinecraftServerWithST server = (MinecraftServerWithST)ctx.getPlayer().getServer();
assert server != null;
if (state) {
if (checkPlayerPrivilege(player)) {
server.registerSTListener(player);
}
} else {
server.removeSTListener(player);
}
});
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
package net.cavoj.servertick;

import io.netty.buffer.Unpooled;
import net.cavoj.servertick.extensions.SerializableMetricsData;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
import net.fabricmc.fabric.api.network.PacketContext;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.MetricsData;

public class STClient implements ClientModInitializer {
private static STClient _instance;
public class ServerTickClient implements ClientModInitializer {
private static ServerTickClient _instance;

public STClient() {
public ServerTickClient() {
if (_instance != null) {
throw new RuntimeException("Cannot have multiple instances");
}
_instance = this;
}

public static STClient getInstance() {
public static ServerTickClient getInstance() {
return _instance;
}

@Override
public void onInitializeClient() {
ClientSidePacketRegistry.INSTANCE.register(Packets.PACKET_FULL_METRICS, this::processMetricsFullPacket);
ClientSidePacketRegistry.INSTANCE.register(Packets.PACKET_SAMPLE_METRICS, this::processMetricsSamplePacket);
ClientSidePacketRegistry.INSTANCE.register(NetworkS2C.PACKET_FULL_METRICS, this::processMetricsFullPacket);
ClientSidePacketRegistry.INSTANCE.register(NetworkS2C.PACKET_LAST_SAMPLE, this::processMetricsSamplePacket);
}

private void processMetricsFullPacket(PacketContext ctx, PacketByteBuf data) {
Expand All @@ -47,17 +47,15 @@ private void processMetricsSamplePacket(PacketContext ctx, PacketByteBuf data) {

public void setTpsEnabled(boolean enabled) {
if (this.debugTpsEnabled != enabled) {
if (enabled) {
// To prevent displaying stale data
setMetricsData(null);
}
this.debugTpsEnabled = enabled;
updateTpsEnabled();
NetworkC2S.sendToggle(enabled);
}
}

private void updateTpsEnabled() {
PacketByteBuf data = new PacketByteBuf(Unpooled.buffer());
data.writeBoolean(this.debugTpsEnabled);
ClientSidePacketRegistry.INSTANCE.sendToServer(Packets.PACKET_TOGGLE_DEBUG_SCREEN, data);
}

public void setMetricsData(MetricsData data) {
this.metrics = data;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.cavoj.servertick.extensions;

public interface LastSampleMetricsData {
long getLastSample();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package net.cavoj.servertick.extensions;

import net.minecraft.entity.player.PlayerEntity;

public interface MinecraftServerWithST {
void registerSTListener(PlayerEntity player);
void removeSTListener(PlayerEntity player);
void tickST();
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.cavoj.servertick;
package net.cavoj.servertick.extensions;

import net.minecraft.network.PacketByteBuf;

Expand Down
17 changes: 14 additions & 3 deletions src/main/java/net/cavoj/servertick/mixin/MetricsDataMixin.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.cavoj.servertick.mixin;

import net.cavoj.servertick.STServer;
import net.cavoj.servertick.SerializableMetricsData;
import net.cavoj.servertick.extensions.LastSampleMetricsData;
import net.cavoj.servertick.extensions.SerializableMetricsData;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.MetricsData;
import org.spongepowered.asm.mixin.Final;
Expand All @@ -12,7 +12,9 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(MetricsData.class)
public abstract class MetricsDataMixin implements SerializableMetricsData {
public abstract class MetricsDataMixin implements SerializableMetricsData, LastSampleMetricsData {

private long lastSample;

@Shadow @Final private long[] samples;

Expand Down Expand Up @@ -40,4 +42,13 @@ public void serialize(PacketByteBuf data) {
data.writeLong(this.samples[i]);
}

@Inject(method = "pushSample", at = @At("HEAD"))
public void pushSample(long sample, CallbackInfo ci) {
this.lastSample = sample;
}

@Override
public long getLastSample() {
return this.lastSample;
}
}
39 changes: 39 additions & 0 deletions src/main/java/net/cavoj/servertick/mixin/MinecraftServerMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package net.cavoj.servertick.mixin;

import net.cavoj.servertick.NetworkS2C;
import net.cavoj.servertick.extensions.LastSampleMetricsData;
import net.cavoj.servertick.extensions.MinecraftServerWithST;
import net.cavoj.servertick.extensions.SerializableMetricsData;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.MetricsData;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;

import java.util.HashSet;

@Mixin(MinecraftServer.class)
public abstract class MinecraftServerMixin implements MinecraftServerWithST {
@Shadow @Final private MetricsData metricsData;
private final HashSet<PlayerEntity> listeners = new HashSet<>();

@Override
public void registerSTListener(PlayerEntity player) {
this.listeners.add(player);
NetworkS2C.sendFullMetrics((SerializableMetricsData) this.metricsData, player);
}

@Override
public void removeSTListener(PlayerEntity player) {
this.listeners.remove(player);
}

@Override
public void tickST() {
long sample = ((LastSampleMetricsData)this.metricsData).getLastSample();
for (PlayerEntity player : this.listeners) {
NetworkS2C.sendLastSample(sample, player);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package net.cavoj.servertick.mixin.server;
package net.cavoj.servertick.mixin;

import net.cavoj.servertick.STServer;
import net.cavoj.servertick.extensions.MinecraftServerWithST;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
Expand All @@ -13,8 +15,10 @@
public abstract class ServerPlayNetworkHandlerMixin {
@Shadow public ServerPlayerEntity player;

@Shadow @Final private MinecraftServer server;

@Inject(method = "onDisconnected", at = @At("HEAD"))
public void onDisconnected(CallbackInfo ci) {
STServer.getInstance().onPlayerDisconnected(this.player);
((MinecraftServerWithST)this.server).removeSTListener(this.player);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.cavoj.servertick.mixin.client;

import net.cavoj.servertick.STClient;
import net.cavoj.servertick.ServerTickClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
Expand All @@ -11,6 +11,6 @@
public abstract class ClientPlayNetworkHandlerMixin {
@Inject(method = "onGameJoin", at = @At("HEAD"))
public void onGameJoin(CallbackInfo ci) {
STClient.getInstance().joined();
ServerTickClient.getInstance().joined();
}
}
Loading

0 comments on commit 6b99eef

Please sign in to comment.