update 1.2.0
This commit is contained in:
parent
76836f680f
commit
e3f4aa888c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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!");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<IItemHandlerModifiable> itemHandler = top.theillusivec4.curios.api.CuriosApi.getCuriosHelper().getEquippedCurios(player);
|
||||
Map<Integer, String> curios = new HashMap<>();
|
||||
itemHandler.ifPresent(handler -> {
|
||||
|
|
|
|||
|
|
@ -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<Integer, String> equipment = LocalJsonUtil.StringToEntryMap(armor_data);
|
||||
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
|
||||
Map<Integer,String> inventory = LocalJsonUtil.StringToEntryMap(resultSet.getString("inventory"));
|
||||
for (Map.Entry<Integer, String> entry : inventory.entrySet()) {
|
||||
serverPlayer.getInventory().setItem(entry.getKey(),Deserialize(entry));
|
||||
serverPlayer.inventory.setItem(entry.getKey(),Deserialize(entry));
|
||||
}
|
||||
//Ender chest
|
||||
Map<Integer,String> ender_chest = LocalJsonUtil.StringToEntryMap(resultSet.getString("enderchest"));
|
||||
|
|
@ -106,9 +106,8 @@ public class VanillaSync {
|
|||
serverPlayer.removeAllEffects();
|
||||
Map<Integer, String> effects = LocalJsonUtil.StringToEntryMap(effectData);
|
||||
for (Map.Entry<Integer, String> 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<Integer, String> 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<Integer,String> 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<Integer,String> 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<Integer, String> 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<MobEffect,MobEffectInstance> effects= player.getActiveEffectsMap();
|
||||
Map<Effect, EffectInstance> effects= player.getActiveEffectsMap();
|
||||
Map<Integer,String> effectMap=new HashMap<>();
|
||||
for (Map.Entry<MobEffect, MobEffectInstance> entry : effects.entrySet()) {
|
||||
CompoundTag effectTag= entry.getValue().save(new CompoundTag());
|
||||
effectMap.put(MobEffect.getId(entry.getKey()),effectTag.toString().replace(",","|"));
|
||||
for (Map.Entry<Effect, EffectInstance> 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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
Loading…
Reference in New Issue
Block a user