1 Star 0 Fork 0

泓源/pal-tool

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
PalFixUtils.java 10.09 KB
一键复制 编辑 原始数据 按行查看 历史
gavin 提交于 2024-08-02 20:13 . update
package com.td.util;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 说明:
* 本脚本用于处理 https://github.com/jmkl009/PalworldCharacterTransfer 角色转换后,pal消失问题。原因在于pal还留在旧终端上面。需要操作 CharacterSaveParameterMap 、CharacterContainerSaveData
*
* 1.先将存档用 https://github.com/cheahjs/palworld-save-tools 解释为json文件
* 2.使用前可以用select获得targetContainer、originContainer、targetContainerIndex、originContainerIndex (Container对应 PalEdit的 StorageID 信息)
*
*/
public class PalFixUtils {
private final static String targetContainer = "29807756-a295-4bc3-862f-9901576dafb1"; // 目标终端
private final static String originContainer = "a4b82e4d-57f3-4c55-837a-09fbe976aaec"; // 原来终端
private final static Integer targetContainerIndex = 15; // 目标终端角标 - 用于添加修改后的pal
private final static Integer originContainerIndex = 0; // 原来终端角标 - 用于转移后,清除原终端
private final static boolean cleanOrigin = true; // 是否清除原终端
public static void main(String[] args) {
try {
main002("E:/DownLoad/A/Saved-pal2.2/SaveGames/0/0922CA5E6C4146A090C3EC930A0E803F/"); //执行修复文件
} catch (Exception e) {
e.printStackTrace();
}
}
private static void main002(String dir) {
// 文件路径
String filePath = dir + "Level.sav.json"; // 源文件
String outputFilePath = dir + "Level.sav-edit01.json"; // 修改后文件
// 使用 Jackson 流式 API 处理和写入 JSON 文件
try {
JsonFactory jsonFactory = new JsonFactory();
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
// 读取 JSON 文件并处理
try (JsonParser jsonParser = jsonFactory.createParser(new File(filePath));
FileWriter fileWriter = new FileWriter(new File(outputFilePath));
JsonGenerator jsonGenerator = jsonFactory.createGenerator(fileWriter)) {
JsonNode rootNode = objectMapper.readTree(jsonParser);
JsonNode updatedRootNode = updateCharacterSaveParameterMapPlan(rootNode);
// 写入更新后的 JSON
objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonGenerator, updatedRootNode);
System.out.println("JSON对象已成功写入到文件:" + outputFilePath);
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 说明:
* 1、将 CharacterSaveParameterMap.slotID.value 改为 目标容器targetContainer
* 2、将 CharacterContainerSaveData 原来的终端容器 instanceID对象 迁移到 新的终端容器 (原的删除,新的添加)
*/
private static JsonNode updateCharacterSaveParameterMapPlan(JsonNode rootNode) {
JsonNode characterSaveParameterMapJsonArray = rootNode.path("properties")
.path("worldSaveData").path("value")
.path("CharacterSaveParameterMap").path("value");
JsonNode characterContainerSaveDataArray = rootNode.path("properties")
.path("worldSaveData").path("value")
.path("CharacterContainerSaveData").path("value");
JsonNode targetCharacterContainer = characterContainerSaveDataArray.get(targetContainerIndex);
ArrayNode targetArr = (ArrayNode) targetCharacterContainer.path("value")
.path("Slots").path("value").path("values");
//清空目标终端重写
targetArr.removeAll();
for (JsonNode containerNode : characterContainerSaveDataArray) {
String str = containerNode.path("key").path("ID").path("value").asText();
int slotCount = containerNode.path("value").path("Slots").path("value").path("values").size();
System.out.println(str + " " + slotCount);
JsonNode slotsArray = containerNode.path("value").path("Slots").path("value").path("values");
if (str.equals(originContainer)) {
for (JsonNode slotNode : slotsArray) {
String instanceId = slotNode.path("RawData").path("value").path("instance_id").asText();
// 循环查找 CharacterSaveParameterMap 数据
System.out.println("instanceId: " + instanceId);
for (JsonNode cspmNode : characterSaveParameterMapJsonArray) {
String sinstanceId = cspmNode.path("key").path("InstanceId").path("value").asText();
if (instanceId.equals(sinstanceId)) {
JsonNode saveParameter = cspmNode.path("value").path("RawData")
.path("value").path("object")
.path("SaveParameter").path("value");
int level = saveParameter.path("Level").asInt();
String gender = saveParameter.path("Gender").path("value").asText();
String ownerPlayerUId = saveParameter.has("OwnerPlayerUId")
? saveParameter.path("OwnerPlayerUId").path("value").asText()
: "无";
String name = saveParameter.path("CharacterID").asText();
System.out.println(String.format("Name: %s Level: %s Gender: %s OwnerPlayerUId: %s ", name, level, gender, ownerPlayerUId));
// 修改 slotID
((ObjectNode) saveParameter.path("SlotID").path("value")
.path("ContainerId").path("value")
.path("ID")).put("value", targetContainer);
}
}
// 将修改后的 slotNode 添加到目标数组
((ObjectNode) slotNode.path("SlotIndex"))
.put("value", targetArr.size());
targetArr.add(slotNode);
}
if(cleanOrigin){
// 添加完成之后,清除原有终端容器的数据
JsonNode cleanCharacterContainer = characterContainerSaveDataArray.get(originContainerIndex);
((ArrayNode) cleanCharacterContainer.path("value")
.path("Slots").path("value")
.path("values")).removeAll();
}
}
}
// 返回修改后的 rootNode
return rootNode;
}
/**
* @param filePath 查询json的文件路径
*/
private static void select(String filePath) {
// 读取文件内容并解析为JSONObject
JSONObject jsonObject = JSONUtil.readJSONObject(new File(filePath), StandardCharsets.UTF_8);
JSONArray CharacterSaveParameterMapJsonArray = jsonObject.getJSONObject("properties").getJSONObject("worldSaveData").getJSONObject("value").getJSONObject("CharacterSaveParameterMap").getJSONArray("value");
JSONArray jsonArray = jsonObject.getJSONObject("properties").getJSONObject("worldSaveData").getJSONObject("value").getJSONObject("CharacterContainerSaveData").getJSONArray("value");
for (Object a : jsonArray){
JSONObject a1 = (JSONObject) a;
String str = a1.getJSONObject("key").getJSONObject("ID").getStr("value");
Integer str1 = a1.getJSONObject("value").getJSONObject("Slots").getJSONObject("value").getJSONArray("values").size();
System.out.println(str+" "+str1);
JSONArray arr = a1.getJSONObject("value").getJSONObject("Slots").getJSONObject("value").getJSONArray("values");
//只查指定 CharacterContainer
if(str.equals("29807756-a295-4bc3-862f-9901576dafb1") || str.equals("d705516b-b0b4-424c-abe9-3bdcd559af02")){
for (Object ar : arr){
JSONObject ar1 = (JSONObject) ar;
String instanceId = ar1.getJSONObject("RawData").getJSONObject("value").getStr("instance_id");
System.out.println("instanceId: "+instanceId);
for(Object cspmjarr : CharacterSaveParameterMapJsonArray){
JSONObject cspm = (JSONObject) cspmjarr;
//先拿 instanceId 判断,是则打印信息
String sinstanceId = cspm.getJSONObject("key").getJSONObject("InstanceId").getStr("value");
if(instanceId.equals(sinstanceId)){
JSONObject SaveParameter = cspm.getJSONObject("value").getJSONObject("RawData").getJSONObject("value").getJSONObject("object").getJSONObject("SaveParameter").getJSONObject("value");
Integer Level = SaveParameter.getJSONObject("Level").getInt("value");
String Gender = SaveParameter.getJSONObject("Gender") == null ? "无" : SaveParameter.getJSONObject("Gender").getJSONObject("value").getStr("value");
String OwnerPlayerUId = SaveParameter.getJSONObject("OwnerPlayerUId") == null ? "无" : SaveParameter.getJSONObject("OwnerPlayerUId").getStr("value");
String Name = SaveParameter.getJSONObject("CharacterID").getStr("value");
System.out.println(String.format("Name: %s Level: %s Gender: %s OwnerPlayerUId: %s ",Name,Level,Gender,OwnerPlayerUId));
}
}
}
}
}
System.out.println(jsonObject);
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/gavin12c_admin/pal-tool.git
git@gitee.com:gavin12c_admin/pal-tool.git
gavin12c_admin
pal-tool
pal-tool
master

搜索帮助