This commit is contained in:
mlus 2024-01-17 14:20:27 +08:00
parent 079ccb4c09
commit 1cb3998755
5 changed files with 123 additions and 48 deletions

View File

@ -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+"','{}');");
}
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
// }
// }
}
}

View File

@ -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<TeamData> invokeGetAllData();
@Invoker
void invokeReadDataFull(Path folder);
void invokeAddData(TeamData data, boolean override);
}

View File

@ -5,7 +5,8 @@
"refmap": "thirst.refmap.json",
"mixins": [
"MixinPlayerProgress",
"MixinServerQuestFile"
"MixinServerQuestFile",
"accessor.QuestFileAccessor"
],
"client": [
],