diff --git a/src/main/java/vip/fubuki/playersync/PlayerSync.java b/src/main/java/vip/fubuki/playersync/PlayerSync.java index 62a88c4..5213884 100644 --- a/src/main/java/vip/fubuki/playersync/PlayerSync.java +++ b/src/main/java/vip/fubuki/playersync/PlayerSync.java @@ -1,12 +1,19 @@ package vip.fubuki.playersync; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import vip.fubuki.playersync.config.JdbcConfig; +import vip.fubuki.playersync.util.JDBCsetUp; + +import java.sql.ResultSet; +import java.sql.SQLException; @Mod(PlayerSync.MODID) public class PlayerSync @@ -19,4 +26,22 @@ public class PlayerSync MinecraftForge.EVENT_BUS.register(this); } + @SubscribeEvent + public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) throws SQLException { + if (event.getPlayer() instanceof ServerPlayerEntity) { + String player_uuid = event.getEntity().getUUID().toString(); + JDBCsetUp.QueryResult queryResult=JDBCsetUp.executeQuery("SELECT * FROM AstralSorcery WHERE player='" + player_uuid + "';"); + ResultSet resultSet=queryResult.getResultSet(); + if(!resultSet.next()){ + JDBCsetUp.executeUpdate("INSERT INTO AstralSorcery(player,tag) VALUES('"+player_uuid+"','{}');"); + } + + queryResult=JDBCsetUp.executeQuery("SELECT * FROM FTB WHERE player='" + player_uuid + "';"); + resultSet=queryResult.getResultSet(); + if(!resultSet.next()){ + JDBCsetUp.executeUpdate("INSERT INTO FTB(player,tag) VALUES('"+player_uuid+"','{}');"); + } + } + } + } diff --git a/src/main/java/vip/fubuki/playersync/mixin/MixinPlayerProgress.java b/src/main/java/vip/fubuki/playersync/mixin/MixinPlayerProgress.java index 073b505..7aa3316 100644 --- a/src/main/java/vip/fubuki/playersync/mixin/MixinPlayerProgress.java +++ b/src/main/java/vip/fubuki/playersync/mixin/MixinPlayerProgress.java @@ -1,61 +1,30 @@ package vip.fubuki.playersync.mixin; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import hellfirepvp.astralsorcery.common.data.research.PlayerProgress; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.JsonToNBT; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import vip.fubuki.playersync.util.JDBCsetUp; import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; @Mixin(PlayerProgress.class) -public abstract class MixinPlayerProgress { - @Shadow public abstract void load(CompoundNBT compound); +public class MixinPlayerProgress{ @ModifyArg(method = "store", at = @At(value = "INVOKE", target = "Lhellfirepvp/astralsorcery/common/data/research/PlayerPerkData;save(Lnet/minecraft/nbt/CompoundNBT;)V")) private CompoundNBT save(CompoundNBT tag) { - tag.putBoolean("PlayerSync",false); - String nbt = tag.toString().replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~"); + String nbt = tag.toString(); + nbt.replace(",","|").replace("\"","^").replace("{","<").replace("}",">").replace("'","~"); try { - PreparedStatement preparedStatement= JDBCsetUp.getConnection().prepareStatement("INSERT INTO AstralSorcery(player,tag) VALUES(?,?) ON DUPLICATE KEY UPDATE player=?"); - preparedStatement.setString(1,tag.getString("UUID")); - preparedStatement.setString(2,nbt); - preparedStatement.setString(3,tag.getString("UUID")); + PreparedStatement preparedStatement= JDBCsetUp.getConnection().prepareStatement("UPDATE AstralSorcery SET tag=? WHERE player=?"); + preparedStatement.setString(2,tag.getString("UUID")); + preparedStatement.setString(1,nbt); preparedStatement.executeUpdate(); } catch (SQLException throwable) { throwable.printStackTrace(); } return tag; } - - @Inject(method = "load",at=@At(value="HEAD"), cancellable = true) - private void load(CompoundNBT compound, CallbackInfo ci){ - if(compound.get("PlayerSync")==null || !compound.getBoolean("PlayerSync")){ - try { - ResultSet result= JDBCsetUp.executeQuery("SELECT * FROM AstralSorcery WHERE player='" + compound.getString("UUID") + "';").getResultSet(); - if(result.next()){ - String nbt = result.getString("tag").replace("|",",").replace("^","\"").replace("<","{").replace(">","}").replace("~", "'"); - compound=JsonToNBT.parseTag(nbt); - compound.putBoolean("PlayerSync",true); - load(compound); - } - - }catch (SQLException e){ - e.printStackTrace(); - } catch (CommandSyntaxException e) { - throw new RuntimeException(e); - } - - ci.cancel(); - } - - } } diff --git a/src/main/java/vip/fubuki/playersync/mixin/MixinServerQuestFile.java b/src/main/java/vip/fubuki/playersync/mixin/MixinServerQuestFile.java index a312e9f..5c8a325 100644 --- a/src/main/java/vip/fubuki/playersync/mixin/MixinServerQuestFile.java +++ b/src/main/java/vip/fubuki/playersync/mixin/MixinServerQuestFile.java @@ -1,7 +1,6 @@ package vip.fubuki.playersync.mixin; -import dev.ftb.mods.ftblibrary.snbt.SNBT; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import net.minecraft.server.MinecraftServer; import org.spongepowered.asm.mixin.Final; @@ -12,25 +11,85 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.nio.file.Path; -import java.util.Iterator; - -import static dev.ftb.mods.ftbquests.quest.ServerQuestFile.FTBQUESTS_DATA; @Mixin(ServerQuestFile.class) -public class MixinServerQuestFile { +public abstract class MixinServerQuestFile { @Shadow @Final public MinecraftServer server; - @Inject(method ="saveNow",at = @At("RETURN")) - private void saveNow(CallbackInfo ci){ - Path path = this.server.getWorldPath(FTBQUESTS_DATA); + @Shadow + private boolean shouldSave; + @Shadow private Path folder; + @Shadow private boolean isLoading; + + @Shadow public abstract Path getFolder(); + + @Inject(method ="saveNow",at = @At("RETURN"), cancellable = true) + private void saveNow(CallbackInfo ci){ +// if (shouldSave) { +// ((QuestFileAccessor) this).invokeWriteDataFull(this.getFolder()); +// shouldSave = false; +// } +// +// Path path = server.getWorldPath(FTBQUESTS_DATA); +// +// for (TeamData data : ((QuestFileAccessor) this).invokeGetAllData()) { +// if (data.shouldSave) { +// SNBT.write(path.resolve(data.uuid + ".snbt"), data.serializeNBT()); +// +// String nbt = data.serializeNBT().toString(); +// nbt.replace(",", "|").replace("\"", "^").replace("{", "<").replace("}", ">").replace("'", "~"); +// try { +// PreparedStatement preparedStatement = JDBCsetUp.getConnection().prepareStatement("UPDATE FTB SET tag=? WHERE player=?"); +// preparedStatement.setString(2, data.uuid.toString()); +// preparedStatement.setString(1, nbt); +// preparedStatement.executeUpdate(); +// } catch (SQLException throwable) { +// throwable.printStackTrace(); +// } +// +// data.shouldSave = false; +// } +// } +// +// ci.cancel(); } @Inject(method="load",at = @At("HEAD")) private void load(CallbackInfo ci){ - Path path = this.server.getWorldPath(FTBQUESTS_DATA); -// SNBT.write(path.resolve(data.uuid + ".snbt"), data.serializeNBT()); +// folder = Platform.getConfigFolder().resolve("ftbquests/quests"); +// +// if (Files.exists(folder)) { +// FTBQuests.LOGGER.info("Loading quests from " + folder); +// isLoading = true; +// ((QuestFileAccessor)this).invokeReadDataFull(folder); +// isLoading = false; +// } +// +// Path path = server.getWorldPath(FTBQUESTS_DATA); +// +// if (Files.exists(path)) { +// try { +// Files.list(path).filter(p -> p.getFileName().toString().contains("-")).forEach(path1 -> { +// SNBTCompoundTag nbt = SNBT.read(path1); +// +// if (nbt != null) { +// try { +// UUID uuid = UUIDTypeAdapter.fromString(nbt.getString("uuid")); +// TeamData data = new TeamData(uuid); +// data.file = (ServerQuestFile)((Object)this); +// this.addData(data, true); +// data.deserializeNBT(nbt); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// } +// }); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// } } } diff --git a/src/main/java/vip/fubuki/playersync/mixin/accessor/QuestFileAccessor.java b/src/main/java/vip/fubuki/playersync/mixin/accessor/QuestFileAccessor.java new file mode 100644 index 0000000..d91bf62 --- /dev/null +++ b/src/main/java/vip/fubuki/playersync/mixin/accessor/QuestFileAccessor.java @@ -0,0 +1,21 @@ +package vip.fubuki.playersync.mixin.accessor; + +import dev.ftb.mods.ftbquests.quest.QuestFile; +import dev.ftb.mods.ftbquests.quest.TeamData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.nio.file.Path; +import java.util.Collection; + +@Mixin(value = QuestFile.class,remap = false) +public interface QuestFileAccessor { + @Invoker + void invokeWriteDataFull(Path folder); + @Invoker + Collection invokeGetAllData(); + + @Invoker + void invokeReadDataFull(Path folder); + void invokeAddData(TeamData data, boolean override); +} diff --git a/src/main/resources/playersync.mixin.json b/src/main/resources/playersync.mixin.json index 5bcbc7e..727c479 100644 --- a/src/main/resources/playersync.mixin.json +++ b/src/main/resources/playersync.mixin.json @@ -5,7 +5,8 @@ "refmap": "thirst.refmap.json", "mixins": [ "MixinPlayerProgress", - "MixinServerQuestFile" + "MixinServerQuestFile", + "accessor.QuestFileAccessor" ], "client": [ ],