diff --git a/README.md b/README.md index b21c659..5054305 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ This is a Minecraft forge mod using Mysql backend to make player data synchronization between different servers. Such as equipment,inventory,effects,experience,food level.Any other mods support is also possible. Support version now: +1.20.1 1.19-1.19.3 1.18.2 1.16.5 diff --git a/build.gradle b/build.gradle index ae17004..6396664 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ java.toolchain.languageVersion = JavaLanguageVersion.of(17) println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { - mappings channel: 'official', version: '1.18.2' + mappings channel: 'official', version: '1.16.5' //accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default. @@ -116,14 +116,14 @@ repositories { } dependencies { - minecraft 'net.minecraftforge:forge:1.18.2-40.1.0' + minecraft 'net.minecraftforge:forge:1.16.5-36.2.0' jarJar("curse.maven:MySQL-561280:3685108") { jarJar.ranged(it, '[3685108,)') } - runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.18.2-5.0.7.1") - compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.18.2-5.0.7.1:api") + runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.1.0.1") + compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.1.0.1:api") implementation fg.deobf("curse.maven:MySQL-561280:3685108") } diff --git a/src/main/java/vip/fubuki/playersync/PlayerSync.java b/src/main/java/vip/fubuki/playersync/PlayerSync.java index 5fc7769..df43262 100644 --- a/src/main/java/vip/fubuki/playersync/PlayerSync.java +++ b/src/main/java/vip/fubuki/playersync/PlayerSync.java @@ -1,8 +1,6 @@ package vip.fubuki.playersync; -import com.mojang.logging.LogUtils; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModList; @@ -10,8 +8,8 @@ import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.slf4j.Logger; import vip.fubuki.playersync.config.JdbcConfig; import vip.fubuki.playersync.sync.ChatSync; import vip.fubuki.playersync.sync.VanillaSync; @@ -23,7 +21,6 @@ import java.sql.SQLException; public class PlayerSync { public static final String MODID = "playersync"; - public static final Logger LOGGER = LogUtils.getLogger(); public PlayerSync() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); @@ -40,7 +37,7 @@ public class PlayerSync } @SubscribeEvent - public void onServerStarting(ServerStartingEvent event) throws SQLException { + public void onServerStarting(FMLServerStartingEvent event) throws SQLException { JDBCsetUp.executeUpdate("CREATE DATABASE IF NOT EXISTS "+JdbcConfig.DATABASE_NAME.get()); JDBCsetUp.executeUpdate("CREATE TABLE IF NOT EXISTS player_data (uuid CHAR(36) NOT NULL," + @@ -63,7 +60,6 @@ public class PlayerSync if(ModList.get().isLoaded("curios")) { JDBCsetUp.executeUpdate("CREATE TABLE IF NOT EXISTS curios (uuid CHAR(36) NOT NULL,curios_item BLOB, PRIMARY KEY (uuid))"); } - LOGGER.info("PlayerSync is ready!"); } } diff --git a/src/main/java/vip/fubuki/playersync/sync/ChatSync.java b/src/main/java/vip/fubuki/playersync/sync/ChatSync.java index 1dfdd09..e08bf4a 100644 --- a/src/main/java/vip/fubuki/playersync/sync/ChatSync.java +++ b/src/main/java/vip/fubuki/playersync/sync/ChatSync.java @@ -1,8 +1,8 @@ package vip.fubuki.playersync.sync; -import net.minecraft.network.chat.ChatType; -import net.minecraft.network.chat.Component; -import net.minecraft.server.players.PlayerList; +import net.minecraft.server.management.PlayerList; +import net.minecraft.util.text.ChatType; +import net.minecraft.util.text.ITextComponent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -54,7 +54,7 @@ public class ChatSync { while(resultSet.next()) { String player = resultSet.getString("player"); String message = resultSet.getString("message"); - Component textComponents = Component.nullToEmpty(player+": "+message); + ITextComponent textComponents = ITextComponent.nullToEmpty(player+": "+message); playerList.broadcastMessage(textComponents, ChatType.CHAT, UUID.nameUUIDFromBytes(player.getBytes())); } resultSet.close(); diff --git a/src/main/java/vip/fubuki/playersync/sync/ModsSupport.java b/src/main/java/vip/fubuki/playersync/sync/ModsSupport.java index 4b0f3ed..1577599 100644 --- a/src/main/java/vip/fubuki/playersync/sync/ModsSupport.java +++ b/src/main/java/vip/fubuki/playersync/sync/ModsSupport.java @@ -1,9 +1,9 @@ package vip.fubuki.playersync.sync; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.JsonToNBT; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fml.ModList; import net.minecraftforge.items.IItemHandlerModifiable; @@ -18,7 +18,7 @@ import java.util.Map; public class ModsSupport { - public void onPlayerJoin(Player player) throws SQLException { + public void onPlayerJoin(PlayerEntity player) throws SQLException { if (ModList.get().isLoaded("curios")) { /* Curios Support @@ -34,7 +34,7 @@ public class ModsSupport { for (int i = 0; i < handler.getSlots(); i++) { try { if (curios.get(i) == null) continue; - handler.setStackInSlot(i, ItemStack.of(NbtUtils.snbtToStructure(curios.get(i).replace("|", ",")))); + handler.setStackInSlot(i, ItemStack.of(JsonToNBT.parseTag(curios.get(i).replace("|", ",")))); } catch (CommandSyntaxException e) { throw new RuntimeException(e); } @@ -49,13 +49,13 @@ public class ModsSupport { } } - public void onPlayerLeave(Player player) throws SQLException { + public void onPlayerLeave(PlayerEntity player) throws SQLException { if (ModList.get().isLoaded("curios")) { StoreCurios(player, false); } } - public void StoreCurios(Player player,boolean init) throws SQLException { + public void StoreCurios(PlayerEntity player,boolean init) throws SQLException { LazyOptional itemHandler = top.theillusivec4.curios.api.CuriosApi.getCuriosHelper().getEquippedCurios(player); Map curios = new HashMap<>(); itemHandler.ifPresent(handler -> { diff --git a/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java b/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java index 97bfdc1..4504bef 100644 --- a/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java +++ b/src/main/java/vip/fubuki/playersync/sync/VanillaSync.java @@ -1,20 +1,20 @@ package vip.fubuki.playersync.sync; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.JsonToNBT; +import net.minecraft.potion.Effect; +import net.minecraft.potion.EffectInstance; +import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.server.ServerStoppedEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.server.FMLServerStoppedEvent; import vip.fubuki.playersync.config.JdbcConfig; import vip.fubuki.playersync.util.JDBCsetUp; import vip.fubuki.playersync.util.LocalJsonUtil; @@ -43,7 +43,7 @@ public class VanillaSync { String player_uuid = event.getEntity().getUUID().toString(); JDBCsetUp.QueryResult queryResult=JDBCsetUp.executeQuery("SELECT online, last_server FROM player_data WHERE uuid='"+player_uuid+"'"); ResultSet resultSet=queryResult.getResultSet(); - ServerPlayer serverPlayer = (ServerPlayer) event.getEntity(); + ServerPlayerEntity serverPlayer = (ServerPlayerEntity) event.getEntity(); if(!resultSet.next()){ Store(event.getPlayer(),true,Dist.CLIENT.isDedicatedServer()); return; @@ -61,7 +61,7 @@ public class VanillaSync { boolean enable = getServerInfo.getBoolean("enable"); if(enable && System.currentTimeMillis() < last_update + 300000.0){ event.getEntity().removeTag("player_synced"); - serverPlayer.connection.disconnect(new TranslatableComponent("playersync.already_online")); + serverPlayer.connection.disconnect(new StringTextComponent("playersync.already_online")); return; } JDBCsetUp.executeUpdate("UPDATE server_info SET enable=false WHERE id=" + lastServer); @@ -87,13 +87,13 @@ public class VanillaSync { if(armor_data.length()>2) { Map equipment = LocalJsonUtil.StringToEntryMap(armor_data); for (Map.Entry entry : equipment.entrySet()) { - serverPlayer.getInventory().armor.set(entry.getKey(), Deserialize(entry)); + serverPlayer.inventory.armor.set(entry.getKey(), Deserialize(entry)); } } //Inventory Map inventory = LocalJsonUtil.StringToEntryMap(resultSet.getString("inventory")); for (Map.Entry entry : inventory.entrySet()) { - serverPlayer.getInventory().setItem(entry.getKey(),Deserialize(entry)); + serverPlayer.inventory.setItem(entry.getKey(),Deserialize(entry)); } //Ender chest Map ender_chest = LocalJsonUtil.StringToEntryMap(resultSet.getString("enderchest")); @@ -106,9 +106,8 @@ public class VanillaSync { serverPlayer.removeAllEffects(); Map effects = LocalJsonUtil.StringToEntryMap(effectData); for (Map.Entry entry : effects.entrySet()) { - CompoundTag effectTag = NbtUtils.snbtToStructure(entry.getValue().replace("|", ",")); - MobEffectInstance mobEffectInstance = MobEffectInstance.load(effectTag); - assert mobEffectInstance != null; + CompoundNBT effectTag = JsonToNBT.parseTag(entry.getValue().replace("|", ",")); + EffectInstance mobEffectInstance = EffectInstance.load(effectTag); serverPlayer.addEffect(mobEffectInstance); } } @@ -152,7 +151,7 @@ public class VanillaSync { private static ItemStack Deserialize(Map.Entry entry) throws CommandSyntaxException { String nbt= entry.getValue().replace("|",",").replace("^","\"").replace("<","{").replace(">","}").replace("~", "'"); - CompoundTag compoundTag = NbtUtils.snbtToStructure(nbt); + CompoundNBT compoundTag = JsonToNBT.parseTag(nbt); return ItemStack.of(compoundTag); } @@ -177,7 +176,7 @@ public class VanillaSync { } @SubscribeEvent - public static void onServerShutdown(ServerStoppedEvent event) throws SQLException { + public static void onServerShutdown(FMLServerStoppedEvent event) throws SQLException { JDBCsetUp.executeUpdate("UPDATE server_info SET enable=false WHERE id=" + JdbcConfig.SERVER_ID.get()); } @@ -204,7 +203,7 @@ public class VanillaSync { } - public static void Store(Player player, boolean init,boolean isServer) throws SQLException, IOException { + public static void Store(PlayerEntity player, boolean init, boolean isServer) throws SQLException, IOException { String player_uuid = player.getUUID().toString(); //Easy part int XP = player.totalExperience; @@ -213,30 +212,30 @@ public class VanillaSync { int health=(int) player.getHealth(); //Equipment Map equipment =new HashMap<>() ; - for (int i = 0; i < player.getInventory().armor.size(); i++) { - ItemStack itemStack = player.getInventory().armor.get(i); + for (int i = 0; i < player.inventory.armor.size(); i++) { + ItemStack itemStack = player.inventory.armor.get(i); if(itemStack.isEmpty()) continue; equipment.put(i,itemStack.serializeNBT().toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~")); } //inventory - Inventory inventory = player.getInventory(); + PlayerInventory inventory = player.inventory; Map inventoryMap=new HashMap<>(); for (int i = 0; i < inventory.items.size(); i++) { - CompoundTag itemNBT = inventory.items.get(i).serializeNBT(); + CompoundNBT itemNBT = inventory.items.get(i).serializeNBT(); inventoryMap.put(i,itemNBT.toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~")); } //EnderChest Map ender_chest=new HashMap<>(); for (int i=0;i< player.getEnderChestInventory().getContainerSize();i++) { - CompoundTag itemNBT = player.getEnderChestInventory().getItem(i).serializeNBT(); + CompoundNBT itemNBT = player.getEnderChestInventory().getItem(i).serializeNBT(); ender_chest.put(i,itemNBT.toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~")); } //Effects - Map effects= player.getActiveEffectsMap(); + Map effects= player.getActiveEffectsMap(); Map effectMap=new HashMap<>(); - for (Map.Entry entry : effects.entrySet()) { - CompoundTag effectTag= entry.getValue().save(new CompoundTag()); - effectMap.put(MobEffect.getId(entry.getKey()),effectTag.toString().replace(",","|")); + for (Map.Entry entry : effects.entrySet()) { + CompoundNBT effectTag= entry.getValue().save(new CompoundNBT()); + effectMap.put(Effect.getId(entry.getKey()),effectTag.toString().replace(",","|")); } //Advancements //File root = serverPlayer.getServer().getServerDirectory(); diff --git a/src/main/java/vip/fubuki/playersync/util/PSThreadPoolFactory.java b/src/main/java/vip/fubuki/playersync/util/PSThreadPoolFactory.java index 5d00713..5464b05 100644 --- a/src/main/java/vip/fubuki/playersync/util/PSThreadPoolFactory.java +++ b/src/main/java/vip/fubuki/playersync/util/PSThreadPoolFactory.java @@ -1,7 +1,5 @@ package vip.fubuki.playersync.util; -import org.jetbrains.annotations.NotNull; - import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; @@ -14,7 +12,7 @@ public class PSThreadPoolFactory implements ThreadFactory { threadNamePrefix = Prefix; } @Override - public Thread newThread(@NotNull Runnable runnable) { + public Thread newThread(Runnable runnable) { Thread thread = new Thread(runnable); thread.setName(threadNamePrefix + "-thread-" + threadIdx.getAndIncrement()); return thread; diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 5da1d8a..6286258 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -51,7 +51,7 @@ make multiserver players' data sync # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency - versionRange="[40,)" #mandatory + versionRange="[36,37)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering="NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER @@ -61,6 +61,6 @@ make multiserver players' data sync modId="minecraft" mandatory=true # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="[1.18.2,)" + versionRange="[1.16.5,1.17)" ordering="NONE" side="BOTH" \ No newline at end of file