Update major API Version to add some new interfaces.

This commit is contained in:
Aria 2023-03-18 21:01:18 -07:00
parent 1378a6fb21
commit 5d024f425c
26 changed files with 496 additions and 111 deletions

1
.gitignore vendored
View file

@ -20,6 +20,7 @@ build
# other
eclipse
run
runServer
# Files from Forge MDK
forge*changelog.txt

21
README.md Normal file
View file

@ -0,0 +1,21 @@
LibZontreck
=======
This is a library mod for all of zontreck's mods. Also known as Aria.
The library can be used freely by other modders, but with the understanding that I may change something with little to no notice.
If the mod becomes widely used, I will begin using deprecation notices.
Compatibility
=====
1) LuckPerms
LuckPerms is highly outdated for 1.18.2, but i have compiled a working version for forge. You can obtain it manually from https://github.com/zontreck/LuckPerms. Just check the release page for the latest update. There should not be any updates however, as the entire goal here is to only make it compatible with the latest forge version.
2) TBA
There will be at least one other mod that is compatible. This is to be announced at a later time.

View file

@ -1,46 +0,0 @@
Source installation information for modders
-------------------------------------------
This code follows the Minecraft Forge installation methodology. It will apply
some small patches to the vanilla MCP source code, giving you and it access
to some of the data and functions you need to build a successful mod.
Note also that the patches are built against "un-renamed" MCP source code (aka
SRG Names) - this means that you will not be able to read them directly against
normal code.
Setup Process:
==============================
Step 1: Open your command-line and browse to the folder where you extracted the zip file.
Step 2: You're left with a choice.
If you prefer to use Eclipse:
1. Run the following command: `gradlew genEclipseRuns` (`./gradlew genEclipseRuns` if you are on Mac/Linux)
2. Open Eclipse, Import > Existing Gradle Project > Select Folder
or run `gradlew eclipse` to generate the project.
If you prefer to use IntelliJ:
1. Open IDEA, and import project.
2. Select your build.gradle file and have it import.
3. Run the following command: `gradlew genIntellijRuns` (`./gradlew genIntellijRuns` if you are on Mac/Linux)
4. Refresh the Gradle Project in IDEA if required.
If at any point you are missing libraries in your IDE, or you've run into problems you can
run `gradlew --refresh-dependencies` to refresh the local cache. `gradlew clean` to reset everything
{this does not affect your code} and then start the process again.
Mapping Names:
=============================
By default, the MDK is configured to use the official mapping names from Mojang for methods and fields
in the Minecraft codebase. These names are covered by a specific license. All modders should be aware of this
license, if you do not agree with it you can change your mapping names to other crowdsourced names in your
build.gradle. For the latest license text, refer to the mapping file itself, or the reference copy here:
https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md
Additional Resources:
=========================
Community Documentation: https://mcforge.readthedocs.io/en/latest/gettingstarted/
LexManos' Install Video: https://www.youtube.com/watch?v=8VEdtQLuLO0
Forge Forum: https://forums.minecraftforge.net/
Forge Discord: https://discord.gg/UvedJ9m

View file

@ -60,26 +60,7 @@ minecraft {
}
server {
workingDirectory project.file('run')
property 'forge.logging.markers', 'REGISTRIES'
property 'forge.logging.console.level', 'debug'
property 'forge.enabledGameTestNamespaces', 'libzontreck'
mods {
libzontreck {
source sourceSets.main
}
}
}
// This run config launches GameTestServer and runs all registered gametests, then exits.
// By default, the server will crash when no gametests are provided.
// The gametest system is also enabled by default for other run configs under the /test command.
gameTestServer {
workingDirectory project.file('run')
workingDirectory project.file('runServer')
property 'forge.logging.markers', 'REGISTRIES'
@ -95,7 +76,7 @@ minecraft {
}
data {
workingDirectory project.file('run')
workingDirectory project.file('runData')
property 'forge.logging.markers', 'REGISTRIES'
@ -117,13 +98,21 @@ minecraft {
sourceSets.main.resources { srcDir 'src/generated/resources' }
repositories {
mavenCentral()
// Put repositories for dependencies here
// ForgeGradle automatically adds the Forge maven and Maven Central for you
// If you have mod jar dependencies in ./libs, you can declare them as a repository like so:
// flatDir {
// dir 'libs'
// }
flatDir {
dir 'libs'
}
maven {
name = "CurseMaven"
url = "https://cursemaven.com"
}
}
dependencies {
@ -139,6 +128,9 @@ dependencies {
// Examples using mod jars from ./libs
// implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}")
//compileOnly ("net.luckperms:api:${luckperms_api_version}")
//runtimeOnly fg.deobf("curse.maven:luckperms-431733:3828099")
//implementation fg.deobf("blank:LuckPerms:Forge-5.4.12")
// For more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
@ -160,6 +152,7 @@ jar {
}
}
compileJava.finalizedBy('devJar')
// Example configuration to allow publishing using the maven-publish plugin
// This is the preferred method to reobfuscate your jar file
jar.finalizedBy('reobfJar')
@ -203,3 +196,7 @@ publishing {
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
}
artifacts {
archives devJar
}

View file

@ -5,5 +5,6 @@ org.gradle.daemon=false
mc_version=1.18.2
forge_version=40.2.1
myversion=1.0.5.0306230154
myversion=1.0.6.031820232016
parchment_version=2022.11.06
luckperms_api_version=5.4

Binary file not shown.

Binary file not shown.

View file

@ -5,36 +5,26 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import dev.zontreck.libzontreck.permissions.PermissionStorage;
import org.slf4j.Logger;
import com.mojang.logging.LogUtils;
import dev.zontreck.libzontreck.commands.Commands;
import dev.zontreck.libzontreck.events.ForgeEventHandlers;
import dev.zontreck.libzontreck.events.PlayerChangedPositionEvent;
import dev.zontreck.libzontreck.events.ProfileLoadedEvent;
import dev.zontreck.libzontreck.memory.PlayerContainer;
import dev.zontreck.libzontreck.memory.VolatilePlayerStorage;
import dev.zontreck.libzontreck.networking.ModMessages;
import dev.zontreck.libzontreck.profiles.Profile;
import dev.zontreck.libzontreck.types.ModMenuTypes;
import dev.zontreck.libzontreck.util.DelayedExecutorService;
import dev.zontreck.libzontreck.util.FileTreeDatastore;
import net.minecraft.client.gui.screens.MenuScreens;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.LivingEvent;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.server.ServerStartedEvent;
import net.minecraftforge.event.server.ServerStoppingEvent;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
@ -54,6 +44,9 @@ public class LibZontreck {
public static final String PLAYER_SKIN_URL = "https://sessionserver.mojang.com/session/minecraft/profile/";
public static LogicalSide CURRENT_SIDE;
static{
PROFILES = new HashMap<>();
@ -92,12 +85,18 @@ public class LibZontreck {
{
THE_SERVER = event.getServer();
ALIVE=true;
CURRENT_SIDE = LogicalSide.SERVER;
}
@SubscribeEvent
public void onServerStopping(final ServerStoppingEvent ev)
{
ALIVE=false;
try {
PermissionStorage.save();
} catch (IOException e) {
throw new RuntimeException(e);
}
Iterator<Profile> iProfile = PROFILES.values().iterator();
while(iProfile.hasNext())
@ -114,6 +113,9 @@ public class LibZontreck {
@SubscribeEvent
public static void onClientSetup(FMLClientSetupEvent ev)
{
LibZontreck.CURRENT_SIDE = LogicalSide.CLIENT;
LibZontreck.ALIVE=false; // Prevents loops on the client that are meant for server tick processing
//MenuScreens.register(ModMenuTypes.CHESTGUI.get(), ChestGuiScreen::new);
}
}

View file

@ -0,0 +1,23 @@
package dev.zontreck.libzontreck.events;
import dev.zontreck.libzontreck.profiles.Profile;
import net.minecraft.nbt.CompoundTag;
import net.minecraftforge.eventbus.api.Event;
/**
* This class is not cancelable.
* This event is fired while the profile is saving. It is used to acquire misc data.
*
* The only part of this that is modifiable at this stage of saving is the tag.
*/
public class ProfileSavingEvent extends Event
{
public final Profile profile;
public CompoundTag tag;
public ProfileSavingEvent(Profile profile, CompoundTag tag)
{
this.profile=profile;
this.tag=tag;
}
}

View file

@ -0,0 +1,17 @@
package dev.zontreck.libzontreck.events;
import java.util.ArrayList;
import java.util.List;
import dev.zontreck.libzontreck.networking.packets.IPacket;
import net.minecraftforge.eventbus.api.Event;
/**
* Used to register your packets with LibZontreck. Packets must extend IPacket and implement PacketSerializable. This is dispatched on both logical sides, and is considered a final event. It is not cancelable
* @see IPacket
* @see PacketSerializable
*/
public class RegisterPacketsEvent extends Event
{
public final List<IPacket> packets = new ArrayList<>();
}

View file

@ -1,9 +1,12 @@
package dev.zontreck.libzontreck.networking;
import dev.zontreck.libzontreck.LibZontreck;
import dev.zontreck.libzontreck.events.RegisterPacketsEvent;
import dev.zontreck.libzontreck.networking.packets.ChestGUIOpenC2S;
import dev.zontreck.libzontreck.networking.packets.IPacket;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.PacketDistributor;
@ -15,7 +18,11 @@ import net.minecraftforge.network.simple.SimpleChannel;
public class ModMessages {
private static SimpleChannel INSTANCE;
private static int PACKET_ID=0;
private static int id()
/**
* INTERNAL USE ONLY. DO NOT USE THIS, IF YOU ARE NOT LIBZONTRECK!!!!!!
* @return
*/
public static int id()
{
return PACKET_ID++;
}
@ -27,8 +34,16 @@ public class ModMessages {
.serverAcceptedVersions(s->true)
.simpleChannel();
RegisterPacketsEvent event = new RegisterPacketsEvent();
MinecraftForge.EVENT_BUS.post(event);
INSTANCE=net;
for(IPacket packet : event.packets)
{
packet.register(net);
}
net.messageBuilder(ChestGUIOpenC2S.class, id(), NetworkDirection.PLAY_TO_SERVER)
.decoder(ChestGUIOpenC2S::new)
.encoder(ChestGUIOpenC2S::toBytes)

View file

@ -0,0 +1,35 @@
package dev.zontreck.libzontreck.networking.packets;
import java.util.function.Supplier;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.simple.SimpleChannel;
public interface IPacket {
void deserialize(CompoundTag data);
void serialize(CompoundTag data);
void toBytes(FriendlyByteBuf buf);
boolean handle(Supplier<NetworkEvent.Context> supplier);
/**
* @return The network direction of the packet
*/
NetworkDirection getDirection();
/**
* EXAMPLE:
* chan.messageBuilder(S2CPlaySoundPacket.class, ModMessages.id(), getDirection())
* .encoder(S2CPlaySoundPacket::toBytes)
* .decoder(S2CPlaySoundPacket::new)
* .consumer(S2CPlaySoundPacket::handle)
* .add();
* @param chan
*/
void register(SimpleChannel chan);
}

View file

@ -0,0 +1,71 @@
package dev.zontreck.libzontreck.networking.packets;
import java.util.function.Supplier;
import dev.zontreck.libzontreck.networking.ModMessages;
import dev.zontreck.libzontreck.util.BinUtil;
import dev.zontreck.libzontreck.util.ServerUtilities;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent;
import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.NetworkEvent.Context;
import net.minecraftforge.network.simple.SimpleChannel;
public class S2CPlaySoundPacket implements IPacket
{
public ResourceLocation sound;
public S2CPlaySoundPacket(FriendlyByteBuf buf) {
sound = buf.readResourceLocation();
}
public S2CPlaySoundPacket(ResourceLocation loc) {
sound=loc;
}
@Override
public void deserialize(CompoundTag data) {
// Deserializes the play sound packet
throw new UnsupportedOperationException("This operation is not supported in the play sound packet!");
}
@Override
public void serialize(CompoundTag data) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'serialize'");
}
@Override
public void toBytes(FriendlyByteBuf buf) {
buf.writeResourceLocation(sound);
}
@Override
public boolean handle(Supplier<Context> supplier) {
NetworkEvent.Context ctx=supplier.get();
ctx.enqueueWork(()->{
// We are on the client now, enqueue the sound!
SoundEvent ev = new SoundEvent(sound);
// Play sound for player!
Minecraft.getInstance().player.playSound(ev, 1, BinUtil.getARandomInstance().nextFloat(0, 1));
});
return true;
}
@Override
public NetworkDirection getDirection() {
return NetworkDirection.PLAY_TO_CLIENT;
}
@Override
public void register(SimpleChannel chan) {
ServerUtilities.registerPacket(chan, S2CPlaySoundPacket.class, this, S2CPlaySoundPacket::new);
}
}

View file

@ -0,0 +1,28 @@
package dev.zontreck.libzontreck.permissions;
import net.minecraft.nbt.CompoundTag;
public class Permission {
public String permName;
boolean isGroup(){
return false;
}
public Permission(String name){
this.permName = name;
}
public CompoundTag save()
{
CompoundTag tag=new CompoundTag();
tag.putString("name", permName);
return tag;
}
public Permission(CompoundTag tag)
{
this(tag.getString("name"));
}
}

View file

@ -0,0 +1,72 @@
package dev.zontreck.libzontreck.permissions;
import com.google.common.collect.Lists;
import dev.zontreck.libzontreck.LibZontreck;
import dev.zontreck.libzontreck.util.FileTreeDatastore;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtIo;
import net.minecraft.nbt.Tag;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
public class PermissionStorage extends FileTreeDatastore
{
public static final Path BASE = LibZontreck.BASE_CONFIG.resolve(
"permissions.nbt");
private static final List<PermissionUser> permissionUsers;
public static List<PermissionUser> getListOfUsers()
{
return Lists.newArrayList(permissionUsers);
}
static{
// Load the permission storage!
List<PermissionUser> perms = new ArrayList<>();
try {
CompoundTag file = NbtIo.read(BASE.toFile());
ListTag lst = file.getList("perms", Tag.TAG_COMPOUND);
for (Tag tag :
lst) {
CompoundTag ct = (CompoundTag) tag;
perms.add(new PermissionUser(ct));
}
} catch (IOException e) {
}
permissionUsers=perms;
}
public PermissionUser getUser(UUID user)
{
try{
return permissionUsers.stream()
.filter(C->C.player.equals(user))
.collect(Collectors.toList()).get(0);
}catch(Exception e)
{
return new PermissionUser(user);
}
}
public static void save() throws IOException {
CompoundTag ct = new CompoundTag();
ListTag tag = new ListTag();
for (PermissionUser user :
permissionUsers) {
tag.add(user.save());
}
ct.put("perms", tag);
NbtIo.write(ct, BASE.toFile());
}
}

View file

@ -0,0 +1,61 @@
package dev.zontreck.libzontreck.permissions;
import com.google.common.collect.Lists;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.entity.player.Player;
import java.util.List;
import java.util.UUID;
public class PermissionUser {
public UUID player;
public List<Permission> permissions = Lists.newArrayList();
public PermissionUser(Player player)
{
this(player.getUUID());
}
public PermissionUser(UUID ID)
{
player=ID;
}
public CompoundTag save()
{
CompoundTag tag = new CompoundTag();
tag.putUUID("id", player);
ListTag perms = new ListTag();
for (Permission perm :
permissions) {
perms.add(perm.save());
}
tag.put("perms", perms);
return tag;
}
public PermissionUser(CompoundTag tag)
{
player = tag.getUUID("id");
ListTag lst = tag.getList("perms", Tag.TAG_COMPOUND);
for (Tag t :
lst) {
CompoundTag ct = (CompoundTag) t;
permissions.add(new Permission(ct));
}
}
public boolean hasPermission(String node)
{
return permissions.stream()
.filter(CPRED-> CPRED.permName.equals(node))
.count()>0;
}
}

View file

@ -4,14 +4,12 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileAttribute;
import dev.zontreck.libzontreck.LibZontreck;
import dev.zontreck.libzontreck.chat.ChatColor;
import dev.zontreck.libzontreck.events.ProfileCreatedEvent;
import dev.zontreck.libzontreck.events.ProfileSavingEvent;
import dev.zontreck.libzontreck.events.ProfileUnloadedEvent;
import dev.zontreck.libzontreck.events.ProfileUnloadingEvent;
import dev.zontreck.libzontreck.util.FileTreeDatastore;
import dev.zontreck.libzontreck.util.ServerUtilities;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo;
@ -30,8 +28,8 @@ public class Profile {
public int available_vaults;
public int deaths;
public ServerPlayer player;
private File accessor;
private CompoundTag miscData;
public static final Path BASE;
static{
@ -48,7 +46,7 @@ public class Profile {
}
}
public Profile(String username, String prefix, String nickname, String name_color, String ID, String prefix_color, String chat_color, Boolean isFlying, int vaults, File vaultFile, int deathCount, ServerPlayer player) {
public Profile(String username, String prefix, String nickname, String name_color, String ID, String prefix_color, String chat_color, Boolean isFlying, int vaults, File vaultFile, int deathCount, ServerPlayer player, CompoundTag misc) {
this.username = username;
this.prefix = prefix;
this.nickname = nickname;
@ -60,6 +58,7 @@ public class Profile {
this.available_vaults=vaults;
this.deaths=deathCount;
this.player=player;
miscData = misc;
this.accessor = vaultFile;
@ -102,7 +101,7 @@ public class Profile {
private static Profile load(CompoundTag tag, File accessor, ServerPlayer player)
{
return new Profile(tag.getString("user"), tag.getString("prefix"), tag.getString("nick"), tag.getString("nickc"), tag.getString("id"), tag.getString("prefixc"), tag.getString("chatc"), tag.getBoolean("flying"), tag.getInt("vaults"), accessor, tag.getInt("deaths"), player);
return new Profile(tag.getString("user"), tag.getString("prefix"), tag.getString("nick"), tag.getString("nickc"), tag.getString("id"), tag.getString("prefixc"), tag.getString("chatc"), tag.getBoolean("flying"), tag.getInt("vaults"), accessor, tag.getInt("deaths"), player, tag.getCompound("misc"));
}
private static void generateNewProfile(ServerPlayer player)
@ -113,7 +112,7 @@ public class Profile {
{
// Load profile data
File ace = userProfile.resolve("profile.nbt").toFile();
Profile template = new Profile(player.getName().getString(), "Member", player.getDisplayName().getString(), ChatColor.GREEN, player.getStringUUID(), ChatColor.AQUA, ChatColor.WHITE, false, 0, ace, 0, player);
Profile template = new Profile(player.getName().getString(), "Member", player.getDisplayName().getString(), ChatColor.GREEN, player.getStringUUID(), ChatColor.AQUA, ChatColor.WHITE, false, 0, ace, 0, player, new CompoundTag());
template.commit();
@ -173,6 +172,9 @@ public class Profile {
serial.putBoolean("flying", flying);
serial.putInt("vaults", available_vaults);
serial.putInt("deaths", deaths);
ProfileSavingEvent event = new ProfileSavingEvent(this, miscData);
MinecraftForge.EVENT_BUS.post(event);
serial.put("misc", event.tag);

View file

@ -1,14 +1,10 @@
package dev.zontreck.libzontreck.types;
import dev.zontreck.libzontreck.LibZontreck;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType;
import net.minecraftforge.common.extensions.IForgeMenuType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.network.IContainerFactory;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public class ModMenuTypes {
public static DeferredRegister<MenuType<?>> REGISTER = DeferredRegister.create(ForgeRegistries.CONTAINERS, LibZontreck.MOD_ID);

View file

@ -1,5 +1,8 @@
package dev.zontreck.libzontreck.util;
import java.time.Instant;
import java.util.Random;
public class BinUtil {
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
@ -17,4 +20,12 @@ public class BinUtil {
}
return new String(hexChars);
}
/**
* @return A random instance backed by the time including milliseconds as the seed.
*/
public static Random getARandomInstance()
{
return new Random(Instant.now().toEpochMilli());
}
}

View file

@ -1,17 +1,16 @@
package dev.zontreck.libzontreck.util;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;
import dev.zontreck.libzontreck.LibZontreck;
public class DelayedExecutorService {
private static int COUNT = 0;
private static AtomicInteger COUNT = new AtomicInteger(0);
private static final DelayedExecutorService inst;
private static final Timer repeater;
static{
@ -46,6 +45,7 @@ public class DelayedExecutorService {
public void schedule(final Runnable run, int seconds)
{
if(!LibZontreck.ALIVE)return;
//long unix = Instant.now().getEpochSecond()+ (seconds);
TimerTask task = new TimerTask() {
@Override
@ -88,7 +88,6 @@ public class DelayedExecutorService {
public static int getNext()
{
COUNT++;
return COUNT;
return COUNT.getAndIncrement();
}
}

View file

@ -0,0 +1,27 @@
package dev.zontreck.libzontreck.util;
import dev.zontreck.libzontreck.permissions.PermissionStorage;
import dev.zontreck.libzontreck.permissions.PermissionUser;
import java.io.IOException;
import java.util.List;
public class PermissionsWatchdog implements Runnable
{
public List<PermissionUser> perms;
@Override
public void run() {
if(!perms.equals(PermissionStorage.getListOfUsers()))
{
try {
PermissionStorage.save();
} catch (IOException e) {
throw new RuntimeException(e);
}
perms = PermissionStorage.getListOfUsers();
}
DelayedExecutorService.getInstance().schedule(this, 10);
}
}

View file

@ -1,14 +1,77 @@
package dev.zontreck.libzontreck.util;
import java.util.UUID;
import java.util.function.Function;
import java.util.function.Supplier;
import dev.zontreck.libzontreck.LibZontreck;
import dev.zontreck.libzontreck.networking.ModMessages;
import dev.zontreck.libzontreck.networking.packets.IPacket;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.network.simple.SimpleChannel;
public class ServerUtilities
{
/**
* This function only exists on the server
* @param id Player ID
* @return The server player associated with the ID
*/
public static ServerPlayer getPlayerByID(String id)
{
return LibZontreck.THE_SERVER.getPlayerList().getPlayer(UUID.fromString(id));
}
/**
* Handles the registration of packets
* @param <X>
* @param channel
* @param type
* @param inst
* @param decoder
*/
public static <X extends IPacket> void registerPacket(SimpleChannel channel, Class<X> type, X inst, Function<FriendlyByteBuf, X> decoder)
{
IPacket packet = (IPacket) inst;
channel.messageBuilder(type, ModMessages.id(), packet.getDirection())
.decoder(decoder)
.encoder(X::toBytes)
.consumer(X::handle)
.add();
}
/**
* Handles the tedious and repetitive actions in the handle packet segment of code
* @param context
* @param run
* @return
*/
public static boolean handlePacket(Supplier<NetworkEvent.Context> context, Runnable run)
{
NetworkEvent.Context ctx = context.get();
ctx.enqueueWork(run);
return true;
}
/**
* Checks if the mod is running on the server
* @return True if the mod is on the server
*/
public static boolean isServer()
{
return (LibZontreck.CURRENT_SIDE == LogicalSide.SERVER);
}
/**
* Checks if the mod is running on the client
* @return True if the mod is on the client
*/
public static boolean isClient()
{
return !isServer();
}
}

View file

@ -1,16 +1,11 @@
package dev.zontreck.libzontreck.util.heads;
import java.util.Properties;
import dev.zontreck.libzontreck.chat.ChatColor;
import dev.zontreck.libzontreck.items.lore.LoreContainer;
import dev.zontreck.libzontreck.items.lore.LoreEntry;
import dev.zontreck.libzontreck.util.heads.HeadCache.HeadCacheItem;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.world.item.BookItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.WrittenBookItem;
import net.minecraft.world.scores.Team;
public class CreditsEntry {
public HeadCacheItem player;

View file

@ -9,16 +9,13 @@ import java.util.UUID;
import dev.zontreck.libzontreck.LibZontreck;
import dev.zontreck.libzontreck.util.ChatHelpers;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.IntArrayTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtIo;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.Tag;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.PlayerHeadItem;
import net.minecraftforge.items.ItemStackHandler;
public class HeadCache
{

View file

@ -2,7 +2,6 @@ package dev.zontreck.libzontreck.util.heads;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
import java.util.UUID;
import com.google.gson.Gson;

View file

@ -1,7 +1,5 @@
package dev.zontreck.libzontreck.util.heads;
import java.util.UUID;
public class PlayerInfo {
public String name;
public String id;