update 1.2.0

This commit is contained in:
mlus-Asuka 2023-09-28 17:38:46 +08:00
parent 76836f680f
commit e3f4aa888c
8 changed files with 49 additions and 55 deletions

View File

@ -2,6 +2,7 @@
This is a Minecraft forge mod using Mysql backend to make player data synchronization between different servers. 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. Such as equipment,inventory,effects,experience,food level.Any other mods support is also possible.
Support version now: Support version now:
1.20.1
1.19-1.19.3 1.19-1.19.3
1.18.2 1.18.2
1.16.5 1.16.5

View File

@ -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'}" println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}"
minecraft { 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. //accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default.
@ -116,14 +116,14 @@ repositories {
} }
dependencies { 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("curse.maven:MySQL-561280:3685108") {
jarJar.ranged(it, '[3685108,)') jarJar.ranged(it, '[3685108,)')
} }
runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.18.2-5.0.7.1") runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.1.0.1")
compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.18.2-5.0.7.1:api") compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:1.16.5-4.1.0.1:api")
implementation fg.deobf("curse.maven:MySQL-561280:3685108") implementation fg.deobf("curse.maven:MySQL-561280:3685108")
} }

View File

@ -1,8 +1,6 @@
package vip.fubuki.playersync; package vip.fubuki.playersync;
import com.mojang.logging.LogUtils;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModList;
@ -10,8 +8,8 @@ import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.slf4j.Logger;
import vip.fubuki.playersync.config.JdbcConfig; import vip.fubuki.playersync.config.JdbcConfig;
import vip.fubuki.playersync.sync.ChatSync; import vip.fubuki.playersync.sync.ChatSync;
import vip.fubuki.playersync.sync.VanillaSync; import vip.fubuki.playersync.sync.VanillaSync;
@ -23,7 +21,6 @@ import java.sql.SQLException;
public class PlayerSync public class PlayerSync
{ {
public static final String MODID = "playersync"; public static final String MODID = "playersync";
public static final Logger LOGGER = LogUtils.getLogger();
public PlayerSync() public PlayerSync()
{ {
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
@ -40,7 +37,7 @@ public class PlayerSync
} }
@SubscribeEvent @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 DATABASE IF NOT EXISTS "+JdbcConfig.DATABASE_NAME.get());
JDBCsetUp.executeUpdate("CREATE TABLE IF NOT EXISTS player_data (uuid CHAR(36) NOT NULL," + 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")) { if(ModList.get().isLoaded("curios")) {
JDBCsetUp.executeUpdate("CREATE TABLE IF NOT EXISTS curios (uuid CHAR(36) NOT NULL,curios_item BLOB, PRIMARY KEY (uuid))"); JDBCsetUp.executeUpdate("CREATE TABLE IF NOT EXISTS curios (uuid CHAR(36) NOT NULL,curios_item BLOB, PRIMARY KEY (uuid))");
} }
LOGGER.info("PlayerSync is ready!");
} }
} }

View File

@ -1,8 +1,8 @@
package vip.fubuki.playersync.sync; package vip.fubuki.playersync.sync;
import net.minecraft.network.chat.ChatType; import net.minecraft.server.management.PlayerList;
import net.minecraft.network.chat.Component; import net.minecraft.util.text.ChatType;
import net.minecraft.server.players.PlayerList; import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@ -54,7 +54,7 @@ public class ChatSync {
while(resultSet.next()) { while(resultSet.next()) {
String player = resultSet.getString("player"); String player = resultSet.getString("player");
String message = resultSet.getString("message"); 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())); playerList.broadcastMessage(textComponents, ChatType.CHAT, UUID.nameUUIDFromBytes(player.getBytes()));
} }
resultSet.close(); resultSet.close();

View File

@ -1,9 +1,9 @@
package vip.fubuki.playersync.sync; package vip.fubuki.playersync.sync;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.nbt.NbtUtils; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.item.ItemStack;
import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.JsonToNBT;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModList;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
@ -18,7 +18,7 @@ import java.util.Map;
public class ModsSupport { public class ModsSupport {
public void onPlayerJoin(Player player) throws SQLException { public void onPlayerJoin(PlayerEntity player) throws SQLException {
if (ModList.get().isLoaded("curios")) { if (ModList.get().isLoaded("curios")) {
/* /*
Curios Support Curios Support
@ -34,7 +34,7 @@ public class ModsSupport {
for (int i = 0; i < handler.getSlots(); i++) { for (int i = 0; i < handler.getSlots(); i++) {
try { try {
if (curios.get(i) == null) continue; 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) { } catch (CommandSyntaxException e) {
throw new RuntimeException(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")) { if (ModList.get().isLoaded("curios")) {
StoreCurios(player, false); StoreCurios(player, false);
} }
} }
public void StoreCurios(Player player,boolean init) throws SQLException { public void StoreCurios(PlayerEntity player,boolean init) throws SQLException {
LazyOptional<IItemHandlerModifiable> itemHandler = top.theillusivec4.curios.api.CuriosApi.getCuriosHelper().getEquippedCurios(player); LazyOptional<IItemHandlerModifiable> itemHandler = top.theillusivec4.curios.api.CuriosApi.getCuriosHelper().getEquippedCurios(player);
Map<Integer, String> curios = new HashMap<>(); Map<Integer, String> curios = new HashMap<>();
itemHandler.ifPresent(handler -> { itemHandler.ifPresent(handler -> {

View File

@ -1,20 +1,20 @@
package vip.fubuki.playersync.sync; package vip.fubuki.playersync.sync;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.nbt.CompoundTag; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtUtils; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.item.ItemStack;
import net.minecraft.world.effect.MobEffect; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.nbt.JsonToNBT;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.potion.Effect;
import net.minecraft.world.entity.player.Player; import net.minecraft.potion.EffectInstance;
import net.minecraft.world.item.ItemStack; import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.server.ServerStoppedEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.server.FMLServerStoppedEvent;
import vip.fubuki.playersync.config.JdbcConfig; import vip.fubuki.playersync.config.JdbcConfig;
import vip.fubuki.playersync.util.JDBCsetUp; import vip.fubuki.playersync.util.JDBCsetUp;
import vip.fubuki.playersync.util.LocalJsonUtil; import vip.fubuki.playersync.util.LocalJsonUtil;
@ -43,7 +43,7 @@ public class VanillaSync {
String player_uuid = event.getEntity().getUUID().toString(); String player_uuid = event.getEntity().getUUID().toString();
JDBCsetUp.QueryResult queryResult=JDBCsetUp.executeQuery("SELECT online, last_server FROM player_data WHERE uuid='"+player_uuid+"'"); JDBCsetUp.QueryResult queryResult=JDBCsetUp.executeQuery("SELECT online, last_server FROM player_data WHERE uuid='"+player_uuid+"'");
ResultSet resultSet=queryResult.getResultSet(); ResultSet resultSet=queryResult.getResultSet();
ServerPlayer serverPlayer = (ServerPlayer) event.getEntity(); ServerPlayerEntity serverPlayer = (ServerPlayerEntity) event.getEntity();
if(!resultSet.next()){ if(!resultSet.next()){
Store(event.getPlayer(),true,Dist.CLIENT.isDedicatedServer()); Store(event.getPlayer(),true,Dist.CLIENT.isDedicatedServer());
return; return;
@ -61,7 +61,7 @@ public class VanillaSync {
boolean enable = getServerInfo.getBoolean("enable"); boolean enable = getServerInfo.getBoolean("enable");
if(enable && System.currentTimeMillis() < last_update + 300000.0){ if(enable && System.currentTimeMillis() < last_update + 300000.0){
event.getEntity().removeTag("player_synced"); event.getEntity().removeTag("player_synced");
serverPlayer.connection.disconnect(new TranslatableComponent("playersync.already_online")); serverPlayer.connection.disconnect(new StringTextComponent("playersync.already_online"));
return; return;
} }
JDBCsetUp.executeUpdate("UPDATE server_info SET enable=false WHERE id=" + lastServer); JDBCsetUp.executeUpdate("UPDATE server_info SET enable=false WHERE id=" + lastServer);
@ -87,13 +87,13 @@ public class VanillaSync {
if(armor_data.length()>2) { if(armor_data.length()>2) {
Map<Integer, String> equipment = LocalJsonUtil.StringToEntryMap(armor_data); Map<Integer, String> equipment = LocalJsonUtil.StringToEntryMap(armor_data);
for (Map.Entry<Integer, String> entry : equipment.entrySet()) { for (Map.Entry<Integer, String> entry : equipment.entrySet()) {
serverPlayer.getInventory().armor.set(entry.getKey(), Deserialize(entry)); serverPlayer.inventory.armor.set(entry.getKey(), Deserialize(entry));
} }
} }
//Inventory //Inventory
Map<Integer,String> inventory = LocalJsonUtil.StringToEntryMap(resultSet.getString("inventory")); Map<Integer,String> inventory = LocalJsonUtil.StringToEntryMap(resultSet.getString("inventory"));
for (Map.Entry<Integer, String> entry : inventory.entrySet()) { for (Map.Entry<Integer, String> entry : inventory.entrySet()) {
serverPlayer.getInventory().setItem(entry.getKey(),Deserialize(entry)); serverPlayer.inventory.setItem(entry.getKey(),Deserialize(entry));
} }
//Ender chest //Ender chest
Map<Integer,String> ender_chest = LocalJsonUtil.StringToEntryMap(resultSet.getString("enderchest")); Map<Integer,String> ender_chest = LocalJsonUtil.StringToEntryMap(resultSet.getString("enderchest"));
@ -106,9 +106,8 @@ public class VanillaSync {
serverPlayer.removeAllEffects(); serverPlayer.removeAllEffects();
Map<Integer, String> effects = LocalJsonUtil.StringToEntryMap(effectData); Map<Integer, String> effects = LocalJsonUtil.StringToEntryMap(effectData);
for (Map.Entry<Integer, String> entry : effects.entrySet()) { for (Map.Entry<Integer, String> entry : effects.entrySet()) {
CompoundTag effectTag = NbtUtils.snbtToStructure(entry.getValue().replace("|", ",")); CompoundNBT effectTag = JsonToNBT.parseTag(entry.getValue().replace("|", ","));
MobEffectInstance mobEffectInstance = MobEffectInstance.load(effectTag); EffectInstance mobEffectInstance = EffectInstance.load(effectTag);
assert mobEffectInstance != null;
serverPlayer.addEffect(mobEffectInstance); serverPlayer.addEffect(mobEffectInstance);
} }
} }
@ -152,7 +151,7 @@ public class VanillaSync {
private static ItemStack Deserialize(Map.Entry<Integer, String> entry) throws CommandSyntaxException { private static ItemStack Deserialize(Map.Entry<Integer, String> entry) throws CommandSyntaxException {
String nbt= entry.getValue().replace("|",",").replace("^","\"").replace("<","{").replace(">","}").replace("~", "'"); String nbt= entry.getValue().replace("|",",").replace("^","\"").replace("<","{").replace(">","}").replace("~", "'");
CompoundTag compoundTag = NbtUtils.snbtToStructure(nbt); CompoundNBT compoundTag = JsonToNBT.parseTag(nbt);
return ItemStack.of(compoundTag); return ItemStack.of(compoundTag);
} }
@ -177,7 +176,7 @@ public class VanillaSync {
} }
@SubscribeEvent @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()); 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(); String player_uuid = player.getUUID().toString();
//Easy part //Easy part
int XP = player.totalExperience; int XP = player.totalExperience;
@ -213,30 +212,30 @@ public class VanillaSync {
int health=(int) player.getHealth(); int health=(int) player.getHealth();
//Equipment //Equipment
Map<Integer,String> equipment =new HashMap<>() ; Map<Integer,String> equipment =new HashMap<>() ;
for (int i = 0; i < player.getInventory().armor.size(); i++) { for (int i = 0; i < player.inventory.armor.size(); i++) {
ItemStack itemStack = player.getInventory().armor.get(i); ItemStack itemStack = player.inventory.armor.get(i);
if(itemStack.isEmpty()) continue; if(itemStack.isEmpty()) continue;
equipment.put(i,itemStack.serializeNBT().toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~")); equipment.put(i,itemStack.serializeNBT().toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~"));
} }
//inventory //inventory
Inventory inventory = player.getInventory(); PlayerInventory inventory = player.inventory;
Map<Integer,String> inventoryMap=new HashMap<>(); Map<Integer,String> inventoryMap=new HashMap<>();
for (int i = 0; i < inventory.items.size(); i++) { 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("'","~")); inventoryMap.put(i,itemNBT.toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~"));
} }
//EnderChest //EnderChest
Map<Integer, String> ender_chest=new HashMap<>(); Map<Integer, String> ender_chest=new HashMap<>();
for (int i=0;i< player.getEnderChestInventory().getContainerSize();i++) { 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("'","~")); ender_chest.put(i,itemNBT.toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~"));
} }
//Effects //Effects
Map<MobEffect,MobEffectInstance> effects= player.getActiveEffectsMap(); Map<Effect, EffectInstance> effects= player.getActiveEffectsMap();
Map<Integer,String> effectMap=new HashMap<>(); Map<Integer,String> effectMap=new HashMap<>();
for (Map.Entry<MobEffect, MobEffectInstance> entry : effects.entrySet()) { for (Map.Entry<Effect, EffectInstance> entry : effects.entrySet()) {
CompoundTag effectTag= entry.getValue().save(new CompoundTag()); CompoundNBT effectTag= entry.getValue().save(new CompoundNBT());
effectMap.put(MobEffect.getId(entry.getKey()),effectTag.toString().replace(",","|")); effectMap.put(Effect.getId(entry.getKey()),effectTag.toString().replace(",","|"));
} }
//Advancements //Advancements
//File root = serverPlayer.getServer().getServerDirectory(); //File root = serverPlayer.getServer().getServerDirectory();

View File

@ -1,7 +1,5 @@
package vip.fubuki.playersync.util; package vip.fubuki.playersync.util;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -14,7 +12,7 @@ public class PSThreadPoolFactory implements ThreadFactory {
threadNamePrefix = Prefix; threadNamePrefix = Prefix;
} }
@Override @Override
public Thread newThread(@NotNull Runnable runnable) { public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable); Thread thread = new Thread(runnable);
thread.setName(threadNamePrefix + "-thread-" + threadIdx.getAndIncrement()); thread.setName(threadNamePrefix + "-thread-" + threadIdx.getAndIncrement());
return thread; return thread;

View File

@ -51,7 +51,7 @@ make multiserver players' data sync
# Does this dependency have to exist - if not, ordering below must be specified # Does this dependency have to exist - if not, ordering below must be specified
mandatory=true #mandatory mandatory=true #mandatory
# The version range of the dependency # 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 # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
ordering="NONE" ordering="NONE"
# Side this dependency is applied on - BOTH, CLIENT or SERVER # Side this dependency is applied on - BOTH, CLIENT or SERVER
@ -61,6 +61,6 @@ make multiserver players' data sync
modId="minecraft" modId="minecraft"
mandatory=true mandatory=true
# This version range declares a minimum of the current minecraft version up to but not including the next major version # 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" ordering="NONE"
side="BOTH" side="BOTH"