toggle keybinding

sit data to Data.java
client events to Events.java
This commit is contained in:
Oth3r 2024-07-23 13:49:43 -05:00
commit ddf7703693
13 changed files with 294 additions and 124 deletions

View file

@ -0,0 +1,65 @@
package one.oth3r.sit.utl;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.command.CommandManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Data {
public static final String MOD_ID = "sit-oth3r";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
public static final String CONFIG_DIR = FabricLoader.getInstance().getConfigDir().toFile()+"/sit!/";
public static final String ENTITY_NAME = "-sit!-entity-";
// init on server load
private static MinecraftServer server;
public static MinecraftServer getServer() {
return server;
}
public static void setServer(MinecraftServer server) {
Data.server = server;
}
// client booleans
private static boolean client = false;
private static boolean inGame = false;
private static boolean singleplayer = false;
private static boolean supportedServer = false;
public static boolean isClient() {
return client;
}
public static void setClient(boolean client) {
Data.client = client;
}
public static boolean isInGame() {
return inGame;
}
public static void setInGame(boolean inGame) {
Data.inGame = inGame;
}
public static boolean isSingleplayer() {
return singleplayer;
}
public static void setSingleplayer(boolean singleplayer) {
Data.singleplayer = singleplayer;
}
public static boolean isSupportedServer() {
return supportedServer;
}
public static void setSupportedServer(boolean supportedServer) {
Data.supportedServer = supportedServer;
}
}

View file

@ -1,43 +1,157 @@
package one.oth3r.sit.utl;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
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.client.network.ClientPlayerEntity;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.ActionResult;
import one.oth3r.sit.Sit;
import net.minecraft.util.Formatting;
import one.oth3r.sit.command.SitCommand;
import one.oth3r.sit.file.Data;
import one.oth3r.sit.file.FileData;
import one.oth3r.sit.file.SittingConfig;
import one.oth3r.sit.packet.SitPayloads;
import org.lwjgl.glfw.GLFW;
public class Events {
public static void playerConnections() {
private static class Keybindings {
private static KeyBinding toggle_key;
private static void register() {
toggle_key = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"key.toggle",
GLFW.GLFW_KEY_UNKNOWN,
"category.sit"
));
}
private static void loopLogic(ClientPlayerEntity player) {
while (toggle_key.isPressed()) {
toggle_key.setPressed(false);
if (Data.isInGame()) {
if (Data.isSupportedServer()) {
// get the sitting config
SittingConfig config = FileData.getSittingConfig();
// toggle the setting
config.setEnabled(!config.getEnabled());
// set the sitting config to the new value
FileData.setSittingConfig(config);
// save the changes to the file
SittingConfig.save();
// send the changes to the server
Utl.sendSettingsPackets();
// get the message settings
String messageKey = "msg.sit_toggle."+(config.getEnabled()?"on":"off");
Formatting messageColor = config.getEnabled()?Formatting.GREEN:Formatting.RED;
// send the player the actionbar message
player.sendMessage(Utl.lang("msg.sit_toggle",
Utl.lang(messageKey).formatted(messageColor)), true);
} else {
player.sendMessage(Utl.lang("msg.sit_toggle.unsupported")
.formatted(Formatting.RED), true);
}
}
}
}
}
private static class Packet {
private static void common() {
// register the data
PayloadTypeRegistry.playC2S().register(SitPayloads.SettingsPayload.ID, SitPayloads.SettingsPayload.CODEC);
PayloadTypeRegistry.playS2C().register(SitPayloads.ResponsePayload.ID, SitPayloads.ResponsePayload.CODEC);
// server receiver is common
ServerPlayNetworking.registerGlobalReceiver(SitPayloads.SettingsPayload.ID,((payload, context) -> Data.getServer().execute(() -> {
FileData.setPlayerSetting(context.player(),Utl.getGson().fromJson(payload.value(), SittingConfig.class));
// send the player back a packet for conformation
ServerPlayNetworking.send(context.player(),new SitPayloads.ResponsePayload(SitPayloads.ResponsePayload.VERSION));
})));
}
private static void client() {
ClientPlayNetworking.registerGlobalReceiver(SitPayloads.ResponsePayload.ID, ((payload, context) -> {
// only update when needed
if (!Data.isSupportedServer()) {
Data.setSupportedServer(true);
Data.LOGGER.info("Connected to Sit! server! packet: {}", payload.value());
}
}));
}
}
private static void clientMisc() {
// client tick loop
ClientTickEvents.END_CLIENT_TICK.register(client -> {
assert client.player != null;
Keybindings.loopLogic(client.player);
});
}
/**
* registers all client connection code
*/
private static void clientConnections() {
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
Data.setInGame(true);
if (client.isInSingleplayer()) Data.setSingleplayer(true);
// send a data packet whenever joining a server
Utl.sendSettingsPackets();
});
// reset cashed things on disconnect
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> {
Data.setInGame(false);
Data.setSingleplayer(false);
Data.setSupportedServer(false);
});
}
/**
* registers all common server player connection code
*/
private static void playerConnections() {
// PLAYER JOIN
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
Data.setPlayerSetting(handler.player,Data.getHandConfig());
Data.setCheckPlayer(handler.player, 5);
FileData.setPlayerSetting(handler.player, FileData.getSittingConfig());
FileData.setCheckPlayer(handler.player, 5);
});
ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> {
// if keep is off, remove the entity
if (!Data.getServerConfig().isKeepActive()) {
if (!FileData.getServerConfig().isKeepActive()) {
Logic.removeEntity(handler.player);
}
Data.removePlayerSetting(handler.player);
FileData.removePlayerSetting(handler.player);
});
}
public static void server() {
/**
* registers all server lifecycle events
*/
private static void serverLifecycle() {
ServerLifecycleEvents.SERVER_STARTED.register(s -> {
Sit.server = s;
Sit.commandManager = s.getCommandManager();
Data.setServer(s);
// right click on block event
UseBlockCallback.EVENT.register((pl, world, hand, hitResult) -> {
// get the server player
ServerPlayerEntity player = Sit.server.getPlayerManager().getPlayer(pl.getUuid());
ServerPlayerEntity player = Data.getServer().getPlayerManager().getPlayer(pl.getUuid());
// make sure the player isn't null, and make sure they aren't in spectator
if (player == null || player.isSpectator()) return ActionResult.PASS;
@ -49,22 +163,31 @@ public class Events {
});
ServerLifecycleEvents.SERVER_STOPPED.register(s -> {
// clear the server
Data.setServer(null);
// clear all player settings (singleplayer and such)
Data.clearPlayerSettings();
FileData.clearPlayerSettings();
});
}
public static void misc() {
// loop setup
// server loop setup
ServerTickEvents.END_SERVER_TICK.register(minecraftServer -> minecraftServer.execute(LoopManager::tick));
// command setup
// server command setup
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> SitCommand.register(dispatcher));
}
// a one call method for the common and client
public static void registerCommon() {
playerConnections();
server();
misc();
serverLifecycle();
Packet.common();
}
public static void registerClient() {
Keybindings.register();
clientConnections();
clientMisc();
Packet.client();
}
}

View file

@ -3,7 +3,6 @@ package one.oth3r.sit.utl;
import net.minecraft.entity.Entity;
import net.minecraft.entity.decoration.DisplayEntity;
import net.minecraft.server.network.ServerPlayerEntity;
import one.oth3r.sit.Sit;
import one.oth3r.sit.file.FileData;
import java.util.HashMap;
@ -41,7 +40,7 @@ public class LoopManager {
if (player.getVehicle() != null) {
Entity entity = player.getVehicle();
if (entity instanceof DisplayEntity.TextDisplayEntity tde && entity.getName().getString().equals(Sit.ENTITY_NAME)) {
if (entity instanceof DisplayEntity.TextDisplayEntity tde && entity.getName().getString().equals(Data.ENTITY_NAME)) {
// bind the entity to the player
FileData.addSitEntity(player, tde);
// check if the player is still allowed to sit

View file

@ -5,6 +5,7 @@ import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.google.gson.stream.MalformedJsonException;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.minecraft.block.*;
import net.minecraft.block.enums.BlockHalf;
import net.minecraft.block.enums.SlabType;
@ -23,8 +24,8 @@ import net.minecraft.util.UseAction;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import one.oth3r.sit.Sit;
import one.oth3r.sit.file.*;
import one.oth3r.sit.packet.SitPayloads;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -227,7 +228,7 @@ public class Utl {
public static DisplayEntity.TextDisplayEntity create(World world, BlockPos blockPos, double sitHeight) {
DisplayEntity.TextDisplayEntity entity = new DisplayEntity.TextDisplayEntity(EntityType.TEXT_DISPLAY,world);
entity.setCustomName(Text.of(Sit.ENTITY_NAME));
entity.setCustomName(Text.of(Data.ENTITY_NAME));
entity.setCustomNameVisible(false);
entity.setInvulnerable(true);
entity.setInvisible(true);
@ -275,7 +276,7 @@ public class Utl {
// get a list of sit entities
List<? extends DisplayEntity.TextDisplayEntity> list = player.getServerWorld()
.getEntitiesByType(TypeFilter.instanceOf(DisplayEntity.TextDisplayEntity.class),
entity -> entity.getName().getString().equals(Sit.ENTITY_NAME));
entity -> entity.getName().getString().equals(Data.ENTITY_NAME));
// remove each one
for (DisplayEntity.TextDisplayEntity entity : list) {
@ -290,20 +291,14 @@ public class Utl {
}
}
/**
* gets a MutableText using the language key, if on server, using the custom lang reader
*/
public static MutableText lang(String key, Object... args) {
if (Sit.client) return Text.translatable(key, args);
if (Data.isClient()) return Text.translatable(key, args);
else return LangReader.of(key, args).getTxT();
}
// public static class ConfigExamples {
// public static final String CUSTOM_BLOCKS = "\"minecraft:campfire|0.255|1|lit=false\"";
// public static final String REQUIREMENT_OPTIONS = String.format("%s, %s, %s",
// configFile.HandRequirement.empty,configFile.HandRequirement.restrictive,configFile.HandRequirement.none);
// public static final String LIST = "\"minecraft:torch\"";
// }
public static class Enum {
public static <T extends java.lang.Enum<T>> T get(Object enumString, Class<T> enumType) {
@ -327,6 +322,16 @@ public class Utl {
}
}
// todo call when editing a config on the client
/**
* sends the settings packets to the server, if client & in game
*/
public static void sendSettingsPackets() {
if (Data.isClient() && Data.isInGame()) {
ClientPlayNetworking.send(new SitPayloads.SettingsPayload(Utl.getGson().toJson(FileData.getSittingConfig())));
}
}
/**
* gets a Gson with the LenientTypeAdapter
*/