palworld-server-toolkit


Namepalworld-server-toolkit JSON
Version 0.8.5 PyPI version JSON
download
home_pagehttps://github.com/magicbear/palworld-server-toolkit
SummaryA toolset for PalWorld Server
upload_time2024-03-01 16:29:27
maintainer
docs_urlNone
authorMagicBear
requires_python>=3.9
licenseMIT License Copyright (c) 2024 Jun Siang Cheah Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords palworld
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Palworld Server Toolkit

### 幻兽帕鲁服务端工具包

<p align="center">
   <strong>简体中文</strong> | <a href="/README.en.md">English</a>
</p>

<p align='center'>
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/magicbear/palworld-server-toolkit?style=for-the-badge">&nbsp;&nbsp;
<img alt="Python" src="https://img.shields.io/badge/Python-FFD43B?style=for-the-badge&logo=python&logoColor=blue">&nbsp;&nbsp;
</p>

世界上最高速的帕鲁服务器存档编辑器, 1.9秒 打开对应转换时间 4分54秒 的约 5.1GB 的JSON。

- 这个工具包可用于在 Palworld 世界间转移角色,允许朋友们将他们的角色转移到彼此的服务器上,而不会失去任何进度。

- 亦可以用于编辑玩家所持有的帕鲁、参数、持有物品、金钱等等数据。

- 亦可以移动玩家的公会、删除营地、删除玩家


---

- [Palworld Server Toolkit](#palworld-server-toolkit)
  - [如何安装](#直接运行)
  - [找到存档文件](#faq)
  - [操作示例](#操作示例)
  - [跨服务器迁移玩家数据](#跨服务器迁移玩家数据)
  - [服务器存档转本地](#服务器存档转本地)
  - [感谢](#感谢)
  - [基础视频教学  - 哔哩哔哩](https://www.bilibili.com/video/BV1Gx421f7Ns/)
  - [存档转移视频 - 哔哩哔哩](https://www.bilibili.com/video/BV1s2421A7jX/)
  - [有偿协助 / 请喝咖啡 - 闲鱼](https://m.tb.cn/h.5GkXWQ8?tk=t7zFWkLsfee)
  - [有偿协助 - 闲鱼](#payment)


## GUI

![](./docs/img/GUI.png)

## 直接运行

访问 [Release Pages](https://github.com/magicbear/palworld-server-toolkit/releases) 下载运行即可。

## 手动安装

1. Python 3.9或以上版本.
    - Windows用户: 可从 [Microsoft Store下载Python 3.12](https://apps.microsoft.com/detail/9NCVDN91XZQP) or [python.org](https://www.python.org/)

2. 安装 `pip` 包管理器
	- For Linux users: `python -m ensurepip --upgrade`
	- For Windows users: `py -m ensurepip --upgrade`

3. 安装包

	```
	pip3 install palworld-server-toolkit
	```

4. 运行

	```
	python3 -m palworld_server_toolkit.editor [options] <Level.sav>
	```

## 使用源码前置安装需求

1. Python 3.9或以上版本.
    - Windows用户: 可从 [Microsoft Store下载Python 3.12](https://apps.microsoft.com/detail/9NCVDN91XZQP) or [python.org](https://www.python.org/)

2. 通过 `git clone https://github.com/magicbear/palworld-server-toolkit.git` 下载源码

3. 执行 `git submodule update --init --recursive`

## 问题交流

QQ群 139107098

---
## palworld-save-editor

清理捕捉日志,改名,合并不同服务器玩家,删除玩家,迁移坏档等工具包

> [!CAUTION]
> 
> :warning: 此工具是实验性的。 小心数据丢失并 ***务必*** 进行备份。
> 
> 选择的 `Level.sav` 需要在游戏原存档目录下、或者连同 `Players` 一起复制的完整存档、程序会对 `Players` 下的存档文件同时进行操作,否则可能损坏存档。

> [!WARNING]
>
> 删除用户、删除营地、清理未引用的物品库均为测试功能,有导致服务端闪退可能性,请 ***务必*** 进行备份,如碰到问题请提交您的存档到Issues。

> [!NOTE]
> 
> 未加-o参数默认保存文件为`Level_fixed.sav`
>
> 使用源码版本 以下命令 ` -m palworld_server_toolkit.editor` 部份 修改为 `palworld_server_toolkit/editor.py` 运行即可


- 使用GUI修改 `Level.sav` 文件 - `python -i -m palworld_server_toolkit.editor -g -o Level.sav Level.sav`

- 修改 `Level.sav` 文件 - `python -m palworld_server_toolkit.editor -i -o Level.sav Level.sav`

	- `ShowPlayers()` - 列出玩家
	- `FixDuplicateUser()` - 删除多余用户数据
	- `ShowGuild()` - 列出公会及成员列表
	- `BindGuildInstanceId(uid,instance_id)` - 修改公会成员绑定ID
	- `RenamePlayer(uid,new_name)` - 修改玩家名字为 `new_name`
	- `DeletePlayer(uid,InstanceId=None, dry_run=False)` - 删除玩家数据 `InstanceId: 删除指定InstanceId`
	- `DeleteGuild(group_id)` - 删除公会
	- `DeleteBaseCamp(base_id)` - 删除基地
	- `EditPlayer(uid)` - 快速指定玩家数据至变量`player`
	- `MoveToGuild(uid,guild_id)` - 移动玩家至公会`guild_id`
	- `OpenBackup(filename)` - 打开备份`Level.sav`文件并指向变量`backup_wsd`
	- `MigratePlayer(old_uid,new_uid)` - 从`old_uid`向`new_uid`迁移玩家数据
	- `CopyPlayer(old_uid,new_uid, backup_wsd)` - 复制玩家数据 `backup_wsd` 为OpenBackup备份文件 `wsd`为当前主文件
	- `BatchDeleteUnreferencedItemContainers()` - 删除未引用的物品库
	- `FixBrokenDamageRefItemContainer()` - 删除损坏对象
	- `FindInactivePlayer(day)` - 找出<day>天未上线的玩家
	- `Save()` - 保存修改并退出

### 操作示例
> [!IMPORTANT]
> 
> 以下操作均需先退出服务端
> 
> 最后均为把 `Level_fixed.sav` 替换至 `Level.sav` 并启动服务端

#### 跨服务器迁移玩家数据

- 提前工作

	1. 复制旧服务器 `Level.sav` 至 `SaveGames/0/<Server ID>/Old-Level.sav`
	1. 复制旧服务器所有需迁移玩家 `Players/xxxxxxxx000000000000000000000000.sav` 至 `SaveGames/0/<Server ID>/Players/xxxxxxxx000000000000000000000000.sav`

- GUI模式操作

	1. `Source Player Data Source` 选择 `Backup File`
	2. 点击 `Open File` 选择旧服务器存档 `Old-Level.sav`
	3. `Source Player` 选择要迁移的旧玩家
	4. `Target Player` 选择要被替换的玩家(如果目标玩家ID不变,可从`Source Player`拷贝UUID)
	5. 点击 `Copy Player`
	6. 点击 `Save & Exit`
	7. 替换文件 `Level_fixed.sav` 到 `Level.sav`

- 命令模式操作
	1. 使用编辑模式运行 `python -i -m palworld_server_toolkit.editor Level.sav`
	1. 使用以下命令 并所有需迁移玩家执行`CopyPlayer`
		> :warning: UUID 可相同,数据自`backup_wsd`拷贝
		```
		OpenBackup("Old-Level.sav")
		CopyPlayer("xxxxxxxx-0000-0000-0000-000000000000", "xxxxxxxx-0000-0000-0000-000000000000", backup_wsd)
		Save()
		```
	5. \(Optional) 最后删除旧 `xxxxxxxx000000000000000000000001.sav`, 

### 服务器存档转本地

- GUI模式操作

	1. `Source Player` 选择要迁移的旧玩家
	2. `Target Player` 输入 `00000000-0000-0000-0000-000000000001`
	3. 点击 `Migrate Player`
	4. 点击 `Save & Exit`
	5. 替换文件 `Level_fixed.sav` 到 `Level.sav`

### 其他迁移示例

- 本地存档迁移至服务器示例

	1. 复制本地 `Level.sav` 至 `SaveGames/0/<Server ID>/Old-Level.sav`
	> 本地存档通常在
	`C:\Users\<username>\AppData\Local\Pal\Saved\SaveGames\<SteamID>\<World Folder>`

	2. 复制本地 `Players/00000000000000000000000000000001.sav` 至 `SaveGames/0/<Server ID>/Players/00000000000000000000000000000001.sav`
	3. 使用编辑模式运行 `python -i -m palworld_server_toolkit.editor Level.sav`
	4. 使用以下命令
		```
		OpenBackup("Old-Level.sav")
		CopyPlayer("00000000-0000-0000-0000-000000000001", "xxxxxxxx-0000-0000-0000-000000000000", backup_wsd)
		Save()
		```
	5. \(Optional) 最后删除旧 `00000000000000000000000000000001.sav` 和 `Old-Level.sav`

- 迁移用户示例

	1. 使用编辑模式运行 `python -i -m palworld_server_toolkit.editor Level.sav`
	2. 使用以下命令 
		```
		MigratePlayer("xxxxxxxx-0000-0000-0000-000000000000","yyyyyyyy-0000-0000-0000-000000000000")
		Save()
		```

- 清理7天未上线玩家

	1. 使用编辑模式运行 `python -i -m palworld_server_toolkit.editor Level.sav`
	2. 使用以下命令 
		```
		for player_uid in FindInactivePlayer(7): DeletePlayer(player_uid)
		Save()
		```


---
## palworld-player-list
```
usage: palworld-playey-list [-h] [--host HOST] [--port PORT] [--password PASSWORD] [filename]

用于列出服务器Players目录中的玩家名字,PlayerUId,Steam ID

positional arguments:
  filename              Filename of the player sav

options:
  -h, --help            show this help message and exit
  --host HOST, -H HOST  Host for PalWorld Server RCON
  --port PORT, -P PORT  PalWorld Server RCON Port
  --password PASSWORD, -p PASSWORD  RCON密码
```


- 列出玩家 - 在工作目录 `/PalSaved/SaveGames/0/<server id>/Players` 中运行 `python3 list.py`
- 玩家详细 - `python3 list.py <PLAYER HEX UID>`


---

## palworld-server-taskset

把服务端绑定至CPU性能核 (Linux only)

---

# FAQ

- 复制玩家为将角色及其所有队伍和终端中的伙伴、角色身上的物品以及进度转移,但不会转移任何地图对象、原世界中箱子里的物品以及基地中工作的伙伴。(如果你想将它们一起转移,请将它们移动到身上/终端中)
- 对于合作模式的存档,存档文件通常位于 `%LocalAppData%\Pal\Saved\SaveGames<SteamID><世界文件夹>`
- 对于Xbox Game Pass玩家的存档,存档文件通常位于 `C:\Users\<用户名>\AppData\Packages\ PocketpairInc.Palworld_ad4psfrxyesvt\SystemAppData\wgs`
- 对于服务器存档,请通过 Steam 进入服务器的文件位置。
- 你需要至少 3 个文件来完成转移:源玩家角色存档文件(在 Players/中),源世界的 level.sav 文件,以及目标世界的 Level.sav 文件
- 对于本地合作模式的存档,如果你是主机,角色文件始终是 `000000...001.sav`
- 对于其他玩家的存档,只需知道他们的 `ID` 在不同世界间不会改变,因此他们在你的合作世界和服务器世界的角色文件名是相同的。
- Windows 用户建议使用 `Windows Terminal` 取代 `cmd`,否则不显示色彩

- 存档结构如下
	- 源世界
	```
	SaveGames
	└── <steam-id>
	    └── <source-world-id>
	        ├── backup
	        ├── Level.sav  ----------  <- The source world save-file
	        ├── LevelMeta.sav
	        ├── Players
	        │   ├── 00000...0001.sav
	        │   └── 12345...6789.sav   <- character save-file we want to transfer
	        └── WorldOption.sav
	```
	- 目标世界
	```
	SaveGames
	└── <steam-id>
	    └── <destination-world-id>
	        ├── backup
	        ├── Level.sav  ----------  <- The target world save-file
	        ├── LevelMeta.sav
	        ├── Players
	        │   ├── 00000...0001.sav   <- the target player-placeholder save-file
	        │   └── 98765...4321.sav
	        └── WorldOption.sav
	```


---

## **TODO**
	
- [ ] Cleanup the data on `FoliageGridSaveDataMap`

---

## PAYMENT

![](./docs/img/payment.png)

---

# 感谢

- [palworld-save-tools](https://github.com/cheahjs/palworld-save-tools) 提供了存档解析工具实现
- [PalEdit](https://github.com/EternalWraith/PalEdit) - 提供了帕鲁编辑器
- [PalworldCharacterTransfer](https://github.com/jmkl009/PalworldCharacterTransfer) - 参考了其中的动态物品数据迁移引用概念
- [Palworld Host Save Fix](https://github.com/xNul/palworld-host-save-fix) - 提供了最早期迁移玩家数据的概念
- [palworld-steam-id-to-player-uid](https://github.com/cheahjs/palworld-steam-id-to-player-uid)
- [https://afdian.net/a/magicbear](https://afdian.net/a/magicbear?tab=home) - 赞助我

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/magicbear/palworld-server-toolkit",
    "name": "palworld-server-toolkit",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "",
    "keywords": "palworld",
    "author": "MagicBear",
    "author_email": "MagicBear <magicbearmo@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/37/73/8cae2cd1012943a6fe68f711aafdac4bf24042636ee870d3e6d5978142e8/palworld-server-toolkit-0.8.5.tar.gz",
    "platform": null,
    "description": "# Palworld Server Toolkit\n\n### \u5e7b\u517d\u5e15\u9c81\u670d\u52a1\u7aef\u5de5\u5177\u5305\n\n<p align=\"center\">\n   <strong>\u7b80\u4f53\u4e2d\u6587</strong> | <a href=\"/README.en.md\">English</a>\n</p>\n\n<p align='center'>\n<img alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/magicbear/palworld-server-toolkit?style=for-the-badge\">&nbsp;&nbsp;\n<img alt=\"Python\" src=\"https://img.shields.io/badge/Python-FFD43B?style=for-the-badge&logo=python&logoColor=blue\">&nbsp;&nbsp;\n</p>\n\n\u4e16\u754c\u4e0a\u6700\u9ad8\u901f\u7684\u5e15\u9c81\u670d\u52a1\u5668\u5b58\u6863\u7f16\u8f91\u5668, 1.9\u79d2 \u6253\u5f00\u5bf9\u5e94\u8f6c\u6362\u65f6\u95f4 4\u520654\u79d2 \u7684\u7ea6 5.1GB \u7684JSON\u3002\n\n- \u8fd9\u4e2a\u5de5\u5177\u5305\u53ef\u7528\u4e8e\u5728 Palworld \u4e16\u754c\u95f4\u8f6c\u79fb\u89d2\u8272\uff0c\u5141\u8bb8\u670b\u53cb\u4eec\u5c06\u4ed6\u4eec\u7684\u89d2\u8272\u8f6c\u79fb\u5230\u5f7c\u6b64\u7684\u670d\u52a1\u5668\u4e0a\uff0c\u800c\u4e0d\u4f1a\u5931\u53bb\u4efb\u4f55\u8fdb\u5ea6\u3002\n\n- \u4ea6\u53ef\u4ee5\u7528\u4e8e\u7f16\u8f91\u73a9\u5bb6\u6240\u6301\u6709\u7684\u5e15\u9c81\u3001\u53c2\u6570\u3001\u6301\u6709\u7269\u54c1\u3001\u91d1\u94b1\u7b49\u7b49\u6570\u636e\u3002\n\n- \u4ea6\u53ef\u4ee5\u79fb\u52a8\u73a9\u5bb6\u7684\u516c\u4f1a\u3001\u5220\u9664\u8425\u5730\u3001\u5220\u9664\u73a9\u5bb6\n\n\n---\n\n- [Palworld Server Toolkit](#palworld-server-toolkit)\n  - [\u5982\u4f55\u5b89\u88c5](#\u76f4\u63a5\u8fd0\u884c)\n  - [\u627e\u5230\u5b58\u6863\u6587\u4ef6](#faq)\n  - [\u64cd\u4f5c\u793a\u4f8b](#\u64cd\u4f5c\u793a\u4f8b)\n  - [\u8de8\u670d\u52a1\u5668\u8fc1\u79fb\u73a9\u5bb6\u6570\u636e](#\u8de8\u670d\u52a1\u5668\u8fc1\u79fb\u73a9\u5bb6\u6570\u636e)\n  - [\u670d\u52a1\u5668\u5b58\u6863\u8f6c\u672c\u5730](#\u670d\u52a1\u5668\u5b58\u6863\u8f6c\u672c\u5730)\n  - [\u611f\u8c22](#\u611f\u8c22)\n  - [\u57fa\u7840\u89c6\u9891\u6559\u5b66  - \u54d4\u54e9\u54d4\u54e9](https://www.bilibili.com/video/BV1Gx421f7Ns/)\n  - [\u5b58\u6863\u8f6c\u79fb\u89c6\u9891 - \u54d4\u54e9\u54d4\u54e9](https://www.bilibili.com/video/BV1s2421A7jX/)\n  - [\u6709\u507f\u534f\u52a9 / \u8bf7\u559d\u5496\u5561 - \u95f2\u9c7c](https://m.tb.cn/h.5GkXWQ8?tk=t7zFWkLsfee)\n  - [\u6709\u507f\u534f\u52a9 - \u95f2\u9c7c](#payment)\n\n\n## GUI\n\n![](./docs/img/GUI.png)\n\n## \u76f4\u63a5\u8fd0\u884c\n\n\u8bbf\u95ee [Release Pages](https://github.com/magicbear/palworld-server-toolkit/releases) \u4e0b\u8f7d\u8fd0\u884c\u5373\u53ef\u3002\n\n## \u624b\u52a8\u5b89\u88c5\n\n1. Python 3.9\u6216\u4ee5\u4e0a\u7248\u672c.\n    - Windows\u7528\u6237: \u53ef\u4ece [Microsoft Store\u4e0b\u8f7dPython 3.12](https://apps.microsoft.com/detail/9NCVDN91XZQP) or [python.org](https://www.python.org/)\n\n2. \u5b89\u88c5 `pip` \u5305\u7ba1\u7406\u5668\n\t- For Linux users: `python -m ensurepip --upgrade`\n\t- For Windows users: `py -m ensurepip --upgrade`\n\n3. \u5b89\u88c5\u5305\n\n\t```\n\tpip3 install palworld-server-toolkit\n\t```\n\n4. \u8fd0\u884c\n\n\t```\n\tpython3 -m palworld_server_toolkit.editor [options] <Level.sav>\n\t```\n\n## \u4f7f\u7528\u6e90\u7801\u524d\u7f6e\u5b89\u88c5\u9700\u6c42\n\n1. Python 3.9\u6216\u4ee5\u4e0a\u7248\u672c.\n    - Windows\u7528\u6237: \u53ef\u4ece [Microsoft Store\u4e0b\u8f7dPython 3.12](https://apps.microsoft.com/detail/9NCVDN91XZQP) or [python.org](https://www.python.org/)\n\n2. \u901a\u8fc7 `git clone https://github.com/magicbear/palworld-server-toolkit.git` \u4e0b\u8f7d\u6e90\u7801\n\n3. \u6267\u884c `git submodule update --init --recursive`\n\n## \u95ee\u9898\u4ea4\u6d41\n\nQQ\u7fa4 139107098\n\n---\n## palworld-save-editor\n\n\u6e05\u7406\u6355\u6349\u65e5\u5fd7\uff0c\u6539\u540d\uff0c\u5408\u5e76\u4e0d\u540c\u670d\u52a1\u5668\u73a9\u5bb6\uff0c\u5220\u9664\u73a9\u5bb6\uff0c\u8fc1\u79fb\u574f\u6863\u7b49\u5de5\u5177\u5305\n\n> [!CAUTION]\n> \n> :warning: \u6b64\u5de5\u5177\u662f\u5b9e\u9a8c\u6027\u7684\u3002 \u5c0f\u5fc3\u6570\u636e\u4e22\u5931\u5e76 ***\u52a1\u5fc5*** \u8fdb\u884c\u5907\u4efd\u3002\n> \n> \u9009\u62e9\u7684 `Level.sav` \u9700\u8981\u5728\u6e38\u620f\u539f\u5b58\u6863\u76ee\u5f55\u4e0b\u3001\u6216\u8005\u8fde\u540c `Players` \u4e00\u8d77\u590d\u5236\u7684\u5b8c\u6574\u5b58\u6863\u3001\u7a0b\u5e8f\u4f1a\u5bf9 `Players` \u4e0b\u7684\u5b58\u6863\u6587\u4ef6\u540c\u65f6\u8fdb\u884c\u64cd\u4f5c\uff0c\u5426\u5219\u53ef\u80fd\u635f\u574f\u5b58\u6863\u3002\n\n> [!WARNING]\n>\n> \u5220\u9664\u7528\u6237\u3001\u5220\u9664\u8425\u5730\u3001\u6e05\u7406\u672a\u5f15\u7528\u7684\u7269\u54c1\u5e93\u5747\u4e3a\u6d4b\u8bd5\u529f\u80fd\uff0c\u6709\u5bfc\u81f4\u670d\u52a1\u7aef\u95ea\u9000\u53ef\u80fd\u6027\uff0c\u8bf7 ***\u52a1\u5fc5*** \u8fdb\u884c\u5907\u4efd\uff0c\u5982\u78b0\u5230\u95ee\u9898\u8bf7\u63d0\u4ea4\u60a8\u7684\u5b58\u6863\u5230Issues\u3002\n\n> [!NOTE]\n> \n> \u672a\u52a0-o\u53c2\u6570\u9ed8\u8ba4\u4fdd\u5b58\u6587\u4ef6\u4e3a`Level_fixed.sav`\n>\n> \u4f7f\u7528\u6e90\u7801\u7248\u672c \u4ee5\u4e0b\u547d\u4ee4 ` -m palworld_server_toolkit.editor` \u90e8\u4efd \u4fee\u6539\u4e3a `palworld_server_toolkit/editor.py` \u8fd0\u884c\u5373\u53ef\n\n\n- \u4f7f\u7528GUI\u4fee\u6539 `Level.sav` \u6587\u4ef6 - `python -i -m palworld_server_toolkit.editor -g -o Level.sav Level.sav`\n\n- \u4fee\u6539 `Level.sav` \u6587\u4ef6 - `python -m palworld_server_toolkit.editor -i -o Level.sav Level.sav`\n\n\t- `ShowPlayers()` - \u5217\u51fa\u73a9\u5bb6\n\t- `FixDuplicateUser()` - \u5220\u9664\u591a\u4f59\u7528\u6237\u6570\u636e\n\t- `ShowGuild()` - \u5217\u51fa\u516c\u4f1a\u53ca\u6210\u5458\u5217\u8868\n\t- `BindGuildInstanceId(uid,instance_id)` - \u4fee\u6539\u516c\u4f1a\u6210\u5458\u7ed1\u5b9aID\n\t- `RenamePlayer(uid,new_name)` - \u4fee\u6539\u73a9\u5bb6\u540d\u5b57\u4e3a `new_name`\n\t- `DeletePlayer(uid,InstanceId=None, dry_run=False)` - \u5220\u9664\u73a9\u5bb6\u6570\u636e `InstanceId: \u5220\u9664\u6307\u5b9aInstanceId`\n\t- `DeleteGuild(group_id)` - \u5220\u9664\u516c\u4f1a\n\t- `DeleteBaseCamp(base_id)` - \u5220\u9664\u57fa\u5730\n\t- `EditPlayer(uid)` - \u5feb\u901f\u6307\u5b9a\u73a9\u5bb6\u6570\u636e\u81f3\u53d8\u91cf`player`\n\t- `MoveToGuild(uid,guild_id)` - \u79fb\u52a8\u73a9\u5bb6\u81f3\u516c\u4f1a`guild_id`\n\t- `OpenBackup(filename)` - \u6253\u5f00\u5907\u4efd`Level.sav`\u6587\u4ef6\u5e76\u6307\u5411\u53d8\u91cf`backup_wsd`\n\t- `MigratePlayer(old_uid,new_uid)` - \u4ece`old_uid`\u5411`new_uid`\u8fc1\u79fb\u73a9\u5bb6\u6570\u636e\n\t- `CopyPlayer(old_uid,new_uid, backup_wsd)` - \u590d\u5236\u73a9\u5bb6\u6570\u636e `backup_wsd` \u4e3aOpenBackup\u5907\u4efd\u6587\u4ef6 `wsd`\u4e3a\u5f53\u524d\u4e3b\u6587\u4ef6\n\t- `BatchDeleteUnreferencedItemContainers()` - \u5220\u9664\u672a\u5f15\u7528\u7684\u7269\u54c1\u5e93\n\t- `FixBrokenDamageRefItemContainer()` - \u5220\u9664\u635f\u574f\u5bf9\u8c61\n\t- `FindInactivePlayer(day)` - \u627e\u51fa<day>\u5929\u672a\u4e0a\u7ebf\u7684\u73a9\u5bb6\n\t- `Save()` - \u4fdd\u5b58\u4fee\u6539\u5e76\u9000\u51fa\n\n### \u64cd\u4f5c\u793a\u4f8b\n> [!IMPORTANT]\n> \n> \u4ee5\u4e0b\u64cd\u4f5c\u5747\u9700\u5148\u9000\u51fa\u670d\u52a1\u7aef\n> \n> \u6700\u540e\u5747\u4e3a\u628a `Level_fixed.sav` \u66ff\u6362\u81f3 `Level.sav` \u5e76\u542f\u52a8\u670d\u52a1\u7aef\n\n#### \u8de8\u670d\u52a1\u5668\u8fc1\u79fb\u73a9\u5bb6\u6570\u636e\n\n- \u63d0\u524d\u5de5\u4f5c\n\n\t1. \u590d\u5236\u65e7\u670d\u52a1\u5668 `Level.sav` \u81f3 `SaveGames/0/<Server ID>/Old-Level.sav`\n\t1. \u590d\u5236\u65e7\u670d\u52a1\u5668\u6240\u6709\u9700\u8fc1\u79fb\u73a9\u5bb6 `Players/xxxxxxxx000000000000000000000000.sav` \u81f3 `SaveGames/0/<Server ID>/Players/xxxxxxxx000000000000000000000000.sav`\n\n- GUI\u6a21\u5f0f\u64cd\u4f5c\n\n\t1. `Source Player Data Source` \u9009\u62e9 `Backup File`\n\t2. \u70b9\u51fb `Open File` \u9009\u62e9\u65e7\u670d\u52a1\u5668\u5b58\u6863 `Old-Level.sav`\n\t3. `Source Player` \u9009\u62e9\u8981\u8fc1\u79fb\u7684\u65e7\u73a9\u5bb6\n\t4. `Target Player` \u9009\u62e9\u8981\u88ab\u66ff\u6362\u7684\u73a9\u5bb6\uff08\u5982\u679c\u76ee\u6807\u73a9\u5bb6ID\u4e0d\u53d8\uff0c\u53ef\u4ece`Source Player`\u62f7\u8d1dUUID)\n\t5. \u70b9\u51fb `Copy Player`\n\t6. \u70b9\u51fb `Save & Exit`\n\t7. \u66ff\u6362\u6587\u4ef6 `Level_fixed.sav` \u5230 `Level.sav`\n\n- \u547d\u4ee4\u6a21\u5f0f\u64cd\u4f5c\n\t1. \u4f7f\u7528\u7f16\u8f91\u6a21\u5f0f\u8fd0\u884c `python -i -m palworld_server_toolkit.editor Level.sav`\n\t1. \u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4 \u5e76\u6240\u6709\u9700\u8fc1\u79fb\u73a9\u5bb6\u6267\u884c`CopyPlayer`\n\t\t> :warning: UUID \u53ef\u76f8\u540c\uff0c\u6570\u636e\u81ea`backup_wsd`\u62f7\u8d1d\n\t\t```\n\t\tOpenBackup(\"Old-Level.sav\")\n\t\tCopyPlayer(\"xxxxxxxx-0000-0000-0000-000000000000\", \"xxxxxxxx-0000-0000-0000-000000000000\", backup_wsd)\n\t\tSave()\n\t\t```\n\t5. \\(Optional) \u6700\u540e\u5220\u9664\u65e7 `xxxxxxxx000000000000000000000001.sav`, \n\n### \u670d\u52a1\u5668\u5b58\u6863\u8f6c\u672c\u5730\n\n- GUI\u6a21\u5f0f\u64cd\u4f5c\n\n\t1. `Source Player` \u9009\u62e9\u8981\u8fc1\u79fb\u7684\u65e7\u73a9\u5bb6\n\t2. `Target Player` \u8f93\u5165 `00000000-0000-0000-0000-000000000001`\n\t3. \u70b9\u51fb `Migrate Player`\n\t4. \u70b9\u51fb `Save & Exit`\n\t5. \u66ff\u6362\u6587\u4ef6 `Level_fixed.sav` \u5230 `Level.sav`\n\n### \u5176\u4ed6\u8fc1\u79fb\u793a\u4f8b\n\n- \u672c\u5730\u5b58\u6863\u8fc1\u79fb\u81f3\u670d\u52a1\u5668\u793a\u4f8b\n\n\t1. \u590d\u5236\u672c\u5730 `Level.sav` \u81f3 `SaveGames/0/<Server ID>/Old-Level.sav`\n\t> \u672c\u5730\u5b58\u6863\u901a\u5e38\u5728\n\t`C:\\Users\\<username>\\AppData\\Local\\Pal\\Saved\\SaveGames\\<SteamID>\\<World Folder>`\n\n\t2. \u590d\u5236\u672c\u5730 `Players/00000000000000000000000000000001.sav` \u81f3 `SaveGames/0/<Server ID>/Players/00000000000000000000000000000001.sav`\n\t3. \u4f7f\u7528\u7f16\u8f91\u6a21\u5f0f\u8fd0\u884c `python -i -m palworld_server_toolkit.editor Level.sav`\n\t4. \u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\n\t\t```\n\t\tOpenBackup(\"Old-Level.sav\")\n\t\tCopyPlayer(\"00000000-0000-0000-0000-000000000001\", \"xxxxxxxx-0000-0000-0000-000000000000\", backup_wsd)\n\t\tSave()\n\t\t```\n\t5. \\(Optional) \u6700\u540e\u5220\u9664\u65e7 `00000000000000000000000000000001.sav` \u548c `Old-Level.sav`\n\n- \u8fc1\u79fb\u7528\u6237\u793a\u4f8b\n\n\t1. \u4f7f\u7528\u7f16\u8f91\u6a21\u5f0f\u8fd0\u884c `python -i -m palworld_server_toolkit.editor Level.sav`\n\t2. \u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4 \n\t\t```\n\t\tMigratePlayer(\"xxxxxxxx-0000-0000-0000-000000000000\",\"yyyyyyyy-0000-0000-0000-000000000000\")\n\t\tSave()\n\t\t```\n\n- \u6e05\u74067\u5929\u672a\u4e0a\u7ebf\u73a9\u5bb6\n\n\t1. \u4f7f\u7528\u7f16\u8f91\u6a21\u5f0f\u8fd0\u884c `python -i -m palworld_server_toolkit.editor Level.sav`\n\t2. \u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4 \n\t\t```\n\t\tfor player_uid in FindInactivePlayer(7): DeletePlayer(player_uid)\n\t\tSave()\n\t\t```\n\n\n---\n## palworld-player-list\n```\nusage: palworld-playey-list [-h] [--host HOST] [--port PORT] [--password PASSWORD] [filename]\n\n\u7528\u4e8e\u5217\u51fa\u670d\u52a1\u5668Players\u76ee\u5f55\u4e2d\u7684\u73a9\u5bb6\u540d\u5b57\uff0cPlayerUId\uff0cSteam ID\n\npositional arguments:\n  filename              Filename of the player sav\n\noptions:\n  -h, --help            show this help message and exit\n  --host HOST, -H HOST  Host for PalWorld Server RCON\n  --port PORT, -P PORT  PalWorld Server RCON Port\n  --password PASSWORD, -p PASSWORD  RCON\u5bc6\u7801\n```\n\n\n- \u5217\u51fa\u73a9\u5bb6 - \u5728\u5de5\u4f5c\u76ee\u5f55 `/PalSaved/SaveGames/0/<server id>/Players` \u4e2d\u8fd0\u884c `python3 list.py`\n- \u73a9\u5bb6\u8be6\u7ec6 - `python3 list.py <PLAYER HEX UID>`\n\n\n---\n\n## palworld-server-taskset\n\n\u628a\u670d\u52a1\u7aef\u7ed1\u5b9a\u81f3CPU\u6027\u80fd\u6838 (Linux only)\n\n---\n\n# FAQ\n\n- \u590d\u5236\u73a9\u5bb6\u4e3a\u5c06\u89d2\u8272\u53ca\u5176\u6240\u6709\u961f\u4f0d\u548c\u7ec8\u7aef\u4e2d\u7684\u4f19\u4f34\u3001\u89d2\u8272\u8eab\u4e0a\u7684\u7269\u54c1\u4ee5\u53ca\u8fdb\u5ea6\u8f6c\u79fb\uff0c\u4f46\u4e0d\u4f1a\u8f6c\u79fb\u4efb\u4f55\u5730\u56fe\u5bf9\u8c61\u3001\u539f\u4e16\u754c\u4e2d\u7bb1\u5b50\u91cc\u7684\u7269\u54c1\u4ee5\u53ca\u57fa\u5730\u4e2d\u5de5\u4f5c\u7684\u4f19\u4f34\u3002\uff08\u5982\u679c\u4f60\u60f3\u5c06\u5b83\u4eec\u4e00\u8d77\u8f6c\u79fb\uff0c\u8bf7\u5c06\u5b83\u4eec\u79fb\u52a8\u5230\u8eab\u4e0a/\u7ec8\u7aef\u4e2d\uff09\n- \u5bf9\u4e8e\u5408\u4f5c\u6a21\u5f0f\u7684\u5b58\u6863\uff0c\u5b58\u6863\u6587\u4ef6\u901a\u5e38\u4f4d\u4e8e `%LocalAppData%\\Pal\\Saved\\SaveGames<SteamID><\u4e16\u754c\u6587\u4ef6\u5939>`\n- \u5bf9\u4e8eXbox Game Pass\u73a9\u5bb6\u7684\u5b58\u6863\uff0c\u5b58\u6863\u6587\u4ef6\u901a\u5e38\u4f4d\u4e8e `C:\\Users\\<\u7528\u6237\u540d>\\AppData\\Packages\\ PocketpairInc.Palworld_ad4psfrxyesvt\\SystemAppData\\wgs`\n- \u5bf9\u4e8e\u670d\u52a1\u5668\u5b58\u6863\uff0c\u8bf7\u901a\u8fc7 Steam \u8fdb\u5165\u670d\u52a1\u5668\u7684\u6587\u4ef6\u4f4d\u7f6e\u3002\n- \u4f60\u9700\u8981\u81f3\u5c11 3 \u4e2a\u6587\u4ef6\u6765\u5b8c\u6210\u8f6c\u79fb\uff1a\u6e90\u73a9\u5bb6\u89d2\u8272\u5b58\u6863\u6587\u4ef6\uff08\u5728 Players/\u4e2d\uff09\uff0c\u6e90\u4e16\u754c\u7684 level.sav \u6587\u4ef6\uff0c\u4ee5\u53ca\u76ee\u6807\u4e16\u754c\u7684 Level.sav \u6587\u4ef6\n- \u5bf9\u4e8e\u672c\u5730\u5408\u4f5c\u6a21\u5f0f\u7684\u5b58\u6863\uff0c\u5982\u679c\u4f60\u662f\u4e3b\u673a\uff0c\u89d2\u8272\u6587\u4ef6\u59cb\u7ec8\u662f `000000...001.sav`\n- \u5bf9\u4e8e\u5176\u4ed6\u73a9\u5bb6\u7684\u5b58\u6863\uff0c\u53ea\u9700\u77e5\u9053\u4ed6\u4eec\u7684 `ID` \u5728\u4e0d\u540c\u4e16\u754c\u95f4\u4e0d\u4f1a\u6539\u53d8\uff0c\u56e0\u6b64\u4ed6\u4eec\u5728\u4f60\u7684\u5408\u4f5c\u4e16\u754c\u548c\u670d\u52a1\u5668\u4e16\u754c\u7684\u89d2\u8272\u6587\u4ef6\u540d\u662f\u76f8\u540c\u7684\u3002\n- Windows \u7528\u6237\u5efa\u8bae\u4f7f\u7528 `Windows Terminal` \u53d6\u4ee3 `cmd`\uff0c\u5426\u5219\u4e0d\u663e\u793a\u8272\u5f69\n\n- \u5b58\u6863\u7ed3\u6784\u5982\u4e0b\n\t- \u6e90\u4e16\u754c\n\t```\n\tSaveGames\n\t\u2514\u2500\u2500 <steam-id>\n\t    \u2514\u2500\u2500 <source-world-id>\n\t        \u251c\u2500\u2500 backup\n\t        \u251c\u2500\u2500 Level.sav  ----------  <- The source world save-file\n\t        \u251c\u2500\u2500 LevelMeta.sav\n\t        \u251c\u2500\u2500 Players\n\t        \u2502   \u251c\u2500\u2500 00000...0001.sav\n\t        \u2502   \u2514\u2500\u2500 12345...6789.sav   <- character save-file we want to transfer\n\t        \u2514\u2500\u2500 WorldOption.sav\n\t```\n\t- \u76ee\u6807\u4e16\u754c\n\t```\n\tSaveGames\n\t\u2514\u2500\u2500 <steam-id>\n\t    \u2514\u2500\u2500 <destination-world-id>\n\t        \u251c\u2500\u2500 backup\n\t        \u251c\u2500\u2500 Level.sav  ----------  <- The target world save-file\n\t        \u251c\u2500\u2500 LevelMeta.sav\n\t        \u251c\u2500\u2500 Players\n\t        \u2502   \u251c\u2500\u2500 00000...0001.sav   <- the target player-placeholder save-file\n\t        \u2502   \u2514\u2500\u2500 98765...4321.sav\n\t        \u2514\u2500\u2500 WorldOption.sav\n\t```\n\n\n---\n\n## **TODO**\n\t\n- [ ] Cleanup the data on `FoliageGridSaveDataMap`\n\n---\n\n## PAYMENT\n\n![](./docs/img/payment.png)\n\n---\n\n# \u611f\u8c22\n\n- [palworld-save-tools](https://github.com/cheahjs/palworld-save-tools) \u63d0\u4f9b\u4e86\u5b58\u6863\u89e3\u6790\u5de5\u5177\u5b9e\u73b0\n- [PalEdit](https://github.com/EternalWraith/PalEdit) - \u63d0\u4f9b\u4e86\u5e15\u9c81\u7f16\u8f91\u5668\n- [PalworldCharacterTransfer](https://github.com/jmkl009/PalworldCharacterTransfer) - \u53c2\u8003\u4e86\u5176\u4e2d\u7684\u52a8\u6001\u7269\u54c1\u6570\u636e\u8fc1\u79fb\u5f15\u7528\u6982\u5ff5\n- [Palworld Host Save Fix](https://github.com/xNul/palworld-host-save-fix) - \u63d0\u4f9b\u4e86\u6700\u65e9\u671f\u8fc1\u79fb\u73a9\u5bb6\u6570\u636e\u7684\u6982\u5ff5\n- [palworld-steam-id-to-player-uid](https://github.com/cheahjs/palworld-steam-id-to-player-uid)\n- [https://afdian.net/a/magicbear](https://afdian.net/a/magicbear?tab=home) - \u8d5e\u52a9\u6211\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2024 Jun Siang Cheah  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
    "summary": "A toolset for PalWorld Server",
    "version": "0.8.5",
    "project_urls": {
        "Homepage": "https://github.com/magicbear/palworld-server-toolkit",
        "Issues": "https://github.com/magicbear/palworld-server-toolkit/issues"
    },
    "split_keywords": [
        "palworld"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3851c55d1c14aeef8060ed7581316e4ebf82edde41ebf1180380424f734840b4",
                "md5": "59f351efe3ae05f081c2a74efe9f1b3b",
                "sha256": "38d3ad20ef2bee633640196c42fbfefb8d68995c90e32c03ed6a6ceda31ec621"
            },
            "downloads": -1,
            "filename": "palworld_server_toolkit-0.8.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "59f351efe3ae05f081c2a74efe9f1b3b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 11042784,
            "upload_time": "2024-03-01T16:29:23",
            "upload_time_iso_8601": "2024-03-01T16:29:23.239891Z",
            "url": "https://files.pythonhosted.org/packages/38/51/c55d1c14aeef8060ed7581316e4ebf82edde41ebf1180380424f734840b4/palworld_server_toolkit-0.8.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "37738cae2cd1012943a6fe68f711aafdac4bf24042636ee870d3e6d5978142e8",
                "md5": "748a7173f9edbe7e7757a49865bdd841",
                "sha256": "e81dabff7f759c524a3cf2fc1c8d317001c3ae0e59ddfdbe9249dea3e672b4bb"
            },
            "downloads": -1,
            "filename": "palworld-server-toolkit-0.8.5.tar.gz",
            "has_sig": false,
            "md5_digest": "748a7173f9edbe7e7757a49865bdd841",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 10997131,
            "upload_time": "2024-03-01T16:29:27",
            "upload_time_iso_8601": "2024-03-01T16:29:27.666588Z",
            "url": "https://files.pythonhosted.org/packages/37/73/8cae2cd1012943a6fe68f711aafdac4bf24042636ee870d3e6d5978142e8/palworld-server-toolkit-0.8.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-01 16:29:27",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "magicbear",
    "github_project": "palworld-server-toolkit",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "palworld-server-toolkit"
}
        
Elapsed time: 8.18119s