Compare commits

..

22 commits

Author SHA1 Message Date
1609636e90 Queue up Arg packets instead of sending instantly
Change send_rpc_arg to push_rpc_arg. Queue up and Send all Arg packets after handler finish
2024-06-02 23:32:00 +03:00
07560e605a Use parking_lot::RwLock instead of tokio::sync::RwLock
See https://docs.rs/tokio/latest/tokio/sync/struct.Mutex.html\#which-kind-of-mutex-should-you-use (same applies for RwLock). We don't need an asynchronous Mutex/RwLock for data.
2024-06-02 22:27:43 +03:00
a7f7102266 Proper spawn of SceneUnits (no more hardcoded entities, finally) 2024-05-31 21:57:15 +03:00
c59fe85e67 chore: impl methods for PlayerUID 2024-05-31 20:41:19 +03:00
7ef2b76a32 Proper AccountUID/PlayerUID implementation, RpcCreatePlayer 2024-05-31 20:31:22 +03:00
f97bc25688 Kick on RpcReenterWorld to avoid stuck 2024-05-31 19:44:41 +03:00
1a41d4b07b Better interact handling (fixes Nicole dialogue) (still temporary impl) 2024-05-30 22:26:18 +03:00
27ca664829 wait for user input before crash after init_assets() error 2024-05-30 21:38:05 +03:00
e84cad1f79 Actual parsing of EventGraphCollection 2024-05-30 19:07:16 +03:00
f0fe7622b2 Use recently stabilized std::sync::LazyLock and remove lazy_static 2024-05-27 23:19:03 +03:00
eead7e1573 SDKServer: config & entry structures 2024-05-26 22:08:56 +03:00
650dab7606 Remove AtomicRefCell 2024-05-26 19:00:45 +03:00
7434dabceb TemplateCollections are now in TSV format 2024-05-26 12:04:04 +03:00
cf855ef4b6 Rework message handler system, fix scene time 2024-05-25 17:04:04 +03:00
0e0a78abaa Proper character HP in battle, fix some ordering issues 2024-05-25 13:07:56 +03:00
eb641d67fb Server configuration rework 2024-05-24 19:45:45 +03:00
934ad89fdf AvatarConfig, UnlockConfig collections 2024-05-24 19:17:45 +03:00
560daa08ac Rework asset system (TemplateCollections) 2024-05-24 18:35:51 +03:00
d76277add3
tidying 2024-03-20 08:05:35 -04:00
7bc1ad2240 Hollow end screen and LeaveCurDungeon 2024-03-19 20:54:05 +03:00
921f9f932a Implement NPC interactions 2024-03-19 18:52:36 +03:00
88cd9fa673
docs: update instructions 2024-03-19 01:43:29 -04:00
69 changed files with 3071 additions and 1109 deletions

11
.gitignore vendored
View file

@ -1,18 +1,9 @@
# ---> Rust
# Generated by Cargo
# will have compiled files and executables
debug/ debug/
target/ target/
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries /*.json
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock Cargo.lock
# These are backup files generated by rustfmt
**/*.rs.bk **/*.rs.bk
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb *.pdb
# Visual Studio crap
.vs/ .vs/

View file

@ -1,5 +1,5 @@
[workspace] [workspace]
members = ["gameserver", "protocol", "qwer", "qwer/qwer-derive", "sdkserver"] members = [ "common","gameserver", "protocol", "qwer", "qwer/qwer-derive", "sdkserver"]
resolver = "2" resolver = "2"
[workspace.package] [workspace.package]
@ -8,22 +8,22 @@ version = "0.1.0"
[workspace.dependencies] [workspace.dependencies]
ansi_term = "0.12.1" ansi_term = "0.12.1"
anyhow = "1.0.81" anyhow = "1.0.81"
atomic_refcell = "0.1.13"
axum = "0.7.4" axum = "0.7.4"
axum-server = "0.6.0" axum-server = "0.6.0"
byteorder = "1.5.0" byteorder = "1.5.0"
dirs = "5.0.1" dirs = "5.0.1"
dotenv = "0.15.0"
encoding = "0.2.33" encoding = "0.2.33"
env_logger = "0.11.3" env_logger = "0.11.3"
heck = "0.5.0" heck = "0.5.0"
hex = "0.4.3" hex = "0.4.3"
lazy_static = "1.4.0"
leb128 = "0.2.5" leb128 = "0.2.5"
paste = "1.0.14" paste = "1.0.14"
sysinfo = "0.30.7" sysinfo = "0.30.7"
rand = "0.8.5"
parking_lot = "0.12.3"
serde = "1.0.197" csv = "1.3.0"
serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.114" serde_json = "1.0.114"
tokio = { version = "1.36.0", features = ["full"] } tokio = { version = "1.36.0", features = ["full"] }
@ -41,6 +41,9 @@ tracing-subscriber = { version = "0.3.18", features = [
] } ] }
tracing-bunyan-formatter = "0.3.9" tracing-bunyan-formatter = "0.3.9"
itertools = "0.13.0"
common = { version = "0.1.0", path = "common" }
protocol = { version = "0.1.0", path = "protocol" } protocol = { version = "0.1.0", path = "protocol" }
qwer = { version = "0.1.0", path = "qwer", features = ["full"] } qwer = { version = "0.1.0", path = "qwer", features = ["full"] }
qwer-derive = { version = "0.1.0", path = "qwer/qwer-derive" } qwer-derive = { version = "0.1.0", path = "qwer/qwer-derive" }

View file

@ -10,7 +10,8 @@ A Server emulator for the game [`Zenless Zone Zero`](https://zenless.hoyoverse.c
- [Rust](https://www.rust-lang.org/tools/install) - [Rust](https://www.rust-lang.org/tools/install)
**NOTE**: Nightly Rust is required to build the project. To install it, first install Rust itself, then run the following command: **NOTE**: Nightly Rust is required to build the project. To install it, first install
Rust itself, then run the following command:
```sh ```sh
rustup toolchain install nightly rustup toolchain install nightly
@ -26,7 +27,7 @@ cargo install --path gameserver
cargo install --path sdkserver cargo install --path sdkserver
``` ```
### From Prebuilt Binaries ### From Pre-built Binaries
Navigate to the [Releases](https://git.xeondev.com/reversedrooms/HollowPS/releases) Navigate to the [Releases](https://git.xeondev.com/reversedrooms/HollowPS/releases)
page and download the latest release for your platform. page and download the latest release for your platform.
@ -43,8 +44,9 @@ nap-gameserver
nap-sdkserver nap-sdkserver
``` ```
If you installed from prebuilt binaries, navigate to the directory where you downloaded If you installed from pre-built binaries, navigate to the directory where you downloaded
the binaries and run the following: the binaries and either a) double-click on the following executable names or b)
run the following in a terminal:
```sh ```sh
./nap-gameserver ./nap-gameserver
@ -53,14 +55,9 @@ the binaries and run the following:
## Configuration ## Configuration
The game server can be configured using a `.env` file. The file contains one configurable The game server can be configured using a `gameserver.json` file.
option, `SKIP_TUTORIAL`, which is set to 0 by default. Configuration file with default settings will be created in
the working directory upon first startup.
If you have a `.env` file in the **same** directory as your executable, then this
is the file that will be loaded. Otherwise, upon _first_ running the `gameserver`
executable, it will create `{FOLDERID_RoamingAppData}\nap-gameserver\.env`
(`C:\Users\{user}\AppData\Roaming\nap-gameserver\.env`) for you, and will source
from this config instead.
## Contributing ## Contributing

View file

@ -0,0 +1,15 @@
{
"InfoGroups": {
"StandaloneWindows64": {
"VersionInfoGroups": {
"0.1.0": {
"MinVersion": "0.1.0",
"LatestVersion": "0.1.18",
"GameResUrl": "http://127.0.0.1:21000/game_res/NAP_Publish/output_147608_1361f678bc/client/",
"DesignDataUrl": "http://127.0.0.1:21000/",
"ServerListUrl": "http://127.0.0.1:21000/design_data/NAP_Publish_AppStore_0.1.0/oversea/serverlist.bin"
}
}
}
}
}

View file

@ -0,0 +1,11 @@
[
{
"sid": 142,
"serverName": "HollowPS",
"ip": "127.0.0.1",
"port": "21000",
"noticeRegion": "nap_glb_cbus01",
"protocol": "http",
"$Type": "MoleMole.ServerListInfo"
}
]

View file

@ -0,0 +1,15 @@
ID CodeName Name AudioEventReplaceParam AudioBank HudIconPath HollowIconPath IconPath RectIconPath AvatarPath ScriptConfigPath UIScriptConfigPath PrefabPath UIPrefabPath MainPageShow NeedShow HitTypes ElementTypes Tags Gender Camp CampName GroupIconPath WeaponType StarInitial AvatarPieceID AvatarDecompose AvatarCompose HP HPGrowth Armor ArmorGrowth Shield ShieldGrowth Endurance Attack AttackGrowth Defence DefenceGrowth Crit CritDamage CritRes CritDmgRes PenRate PenDelta Luck Stun BreakStun SPBarPoint SpRecover RBL RBLCorrectionFactor RBLProbability BuffResistBurnPossibilityRatio BuffResistBurnPossibilityDelta BuffResistFrozenPossibilityRatio BuffResistFrozenPossibilityDelta BuffResistElectricPossibilityRatio BuffResistElectricPossibilityDelta Weapon RBP RBPFadeOutRate RBPFadeOutTime RBPCorrectionFactor RBPProbability
1011 Avatar_Female_Size02_Anbi_En Avatar_Female_Size02_Anbi anbi BK_Anbi|BK_CHR_Common|BK_Anbi_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle01.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect01.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar01 Data/ScriptConfig/Character/Avatar_Female_Size02_Anbi Data/ScriptConfig/Character/Avatar_Female_Size02_Anbi_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Anbi/Avatar_Female_Size02_Anbi Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Anbi/Avatar_Female_Size02_Anbi_UI true true 101 203 Anbi,Cut,Electric,Female 2 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 5011 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1021 Avatar_Female_Size01_Tsubaki_En Avatar_Female_Size01_Tsubaki tsubaki BK_Tsubaki|BK_CHR_Common|BK_Tsubaki_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral11.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral11.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle11.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect11.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar02 Data/ScriptConfig/Character/Avatar_Female_Size01_Tsubaki Data/ScriptConfig/Character/Avatar_Female_Size01_Tsubaki_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Tsubaki/Avatar_Female_Size01_Tsubaki Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Tsubaki/Avatar_Female_Size01_Tsubaki_UI true true 101 200 Tsubaki,Cut,Female 2 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 2 1 5021 10 20 440 364300 0 0 0 0 0 95 78400 48 39000 500 5000 0 0 0 0 10 0 100 120 200 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1031 Avatar_Female_Size02_Nostradamus_En Avatar_Female_Size02_Nostradamus nicole BK_Nicole|BK_CHR_Common|BK_Nicole_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral12.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral12.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle12.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect12.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar03 Data/ScriptConfig/Character/Avatar_Female_Size02_Nostradamus Data/ScriptConfig/Character/Avatar_Female_Size02_Nostradamus_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Nostradamus/Avatar_Female_Size02_Nostradamus Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Nostradamus/Avatar_Female_Size02_Nostradamus_UI true true 102 200 Nostradamus,Punch,Female 2 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 5031 10 20 440 364300 0 0 0 0 0 116 95900 43 35100 500 5000 0 0 0 0 10 0 100 120 200 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1041 Avatar_Female_Size02_Longinus_En Avatar_Female_Size02_Longinus longinus BK_Longinus|BK_CHR_Common|BK_Longinus_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral05.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral05.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle05.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect05.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size02_Longinus Data/ScriptConfig/Character/Avatar_Female_Size02_Longinus_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Longinus/Avatar_Female_Size02_Longinus Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Longinus/Avatar_Female_Size02_Longinus_UI false true 101 201 Longinus,Cut,Fire,Female 2 5 CampObols UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampObols.png 1 1 5041 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1061 Avatar_Female_Size01_Corin_En Avatar_Female_Size01_Corin corin BK_Corin|BK_CHR_Common|BK_Corin_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral09.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral09.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle09.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect09.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size01_Corin Data/ScriptConfig/Character/Avatar_Female_Size01_Corin_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Corin/Avatar_Female_Size01_Corin Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Corin/Avatar_Female_Size01_Corin_UI false true 101 200 Corin,Cut,Female 2 2 CampVictoriaHousekeepingCo. UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampVictoriaHousekeepingCo..png 1 1 5061 10 20 484 400800 0 0 0 0 0 105 87200 48 39000 500 5000 0 0 0 0 10 0 120 120 160 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1081 Avatar_Male_Size03_Billy_En Avatar_Male_Size03_Billy billy BK_Billy|BK_CHR_Common|BK_Billy_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral10.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral10.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle10.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect10.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Billy Data/ScriptConfig/Character/Avatar_Male_Size03_Billy_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Billy/Avatar_Male_Size03_Billy Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Billy/Avatar_Male_Size03_Billy_UI true true 103 200 Billy,Pierce,Male 1 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 5081 10 20 396 327900 0 0 0 0 0 105 87200 43 35100 500 5000 0 0 0 0 10 0 80 120 240 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1091 Avatar_Female_Size02_Unagi_En Avatar_Female_Size02_Unagi unagi BK_Unagi|BK_CHR_Common|BK_Unagi_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral13.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral13.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle13.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect13.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size02_Unagi Data/ScriptConfig/Character/Avatar_Female_Size02_Unagi_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Unagi/Avatar_Female_Size02_Unagi Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Unagi/Avatar_Female_Size02_Unagi_UI false true 101 202 Unagi,Cut,Ice,Female 2 6 CampH.S.O-S6 UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampH.S.O-S6.png 1 1 5091 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1101 Avatar_Female_Size01_OokumaMari_En Avatar_Female_Size01_OokumaMari koleda BK_Koleda|BK_CHR_Common|BK_Koleda_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral14.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral14.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle14.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect14.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size01_OokumaMari Data/ScriptConfig/Character/Avatar_Female_Size01_OokumaMari_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_OokumaMari/Avatar_Female_Size01_OokumaMari Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_OokumaMari/Avatar_Female_Size01_OokumaMari_UI false true 102 201 OokumaMari,Punch,Fire,Female 2 3 CampBelobogIndustries UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampBelobogIndustries.png 1 1 5101 10 20 431 356900 0 0 0 0 0 99 82200 45 36900 500 5000 0 0 0 0 10 0 100 120 200 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1111 Avatar_Male_Size03_Anton_En Avatar_Male_Size03_Anton anton BK_Anton|BK_CHR_Common|BK_Anton_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral15.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral15.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle15.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect15.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Anton Data/ScriptConfig/Character/Avatar_Male_Size03_Anton_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Anton/Avatar_Male_Size03_Anton Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Anton/Avatar_Male_Size03_Anton_UI false true 103 203 Anton,Pierce,Electric,Male 1 3 CampBelobogIndustries UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampBelobogIndustries.png 1 1 5111 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1121 Avatar_Male_Size03_Ben_En Avatar_Male_Size03_Ben ben BK_Ben|BK_CHR_Common|BK_Ben_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral16.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral16.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle16.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect16.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Ben Data/ScriptConfig/Character/Avatar_Male_Size03_Ben_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Ben/Avatar_Male_Size03_Ben Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Ben/Avatar_Male_Size03_Ben_UI false true 102 200 Ben,Punch,Male 1 3 CampBelobogIndustries UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampBelobogIndustries.png 1 1 5121 10 20 550 455900 0 0 0 0 0 90 74700 55 45100 500 5000 0 0 0 0 10 0 120 120 160 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1131 Avatar_Female_Size01_Aokaku_En Avatar_Female_Size01_Aokaku aokaku BK_Aokaku|BK_CHR_Common|BK_Aokaku_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral17.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral17.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle17.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect17.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size01_Aokaku Data/ScriptConfig/Character/Avatar_Female_Size01_Aokaku_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Aokaku/Avatar_Female_Size01_Aokaku Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Aokaku/Avatar_Female_Size01_Aokaku_UI false true 101,102 204 Aokaku,Cut,Punch,Wind,Female 2 6 CampH.S.O-S6 UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampH.S.O-S6.png 1 1 5131 10 20 484 400800 0 0 0 0 0 105 87200 48 39000 500 5000 0 0 0 0 10 0 120 120 160 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
1141 Avatar_Male_Size03_Lycaon_En Avatar_Male_Size03_Lycaon lycaon BK_Lycaon|BK_CHR_Common|BK_Lycaon_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral18.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral18.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle18.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect18.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Lycaon Data/ScriptConfig/Character/Avatar_Male_Size03_Lycaon_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Lycaon/Avatar_Male_Size03_Lycaon Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Lycaon/Avatar_Male_Size03_Lycaon_UI false true 102 202 Lycaon,Punch,Ice,Male 1 2 CampVictoriaHousekeepingCo. UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampVictoriaHousekeepingCo..png 1 1 5141 10 20 473 391700 0 0 0 0 0 95 78900 50 41000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
2011 Avatar_Male_Size01_Wise_En Avatar_Male_Size01_Wise wise BK_Wise UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle01.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect01.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar01 Data/ScriptConfig/Character/Avatar_Male_Size01_Wise_MainCity Data/ScriptConfig/Character/Avatar_Male_Size01_Wise_MainCity Char/Avatar/Male/Male_Size01/Avatar_Male_Size01_Wise/Avatar_Male_Size01_Wise_MainCity Char/Avatar/Male/Male_Size01/Avatar_Male_Size01_Wise/Avatar_Male_Size01_Wise_UI false false 0 0 1 0 None UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 6011 5 10 449 372100 0 0 0 0 0 90 74900 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 0 0 0 0 0 0
2021 Avatar_Female_Size02_Belle_En Avatar_Female_Size02_Belle belle BK_Belle UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle01.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect01.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar01 Data/ScriptConfig/Character/Avatar_Female_Size02_Belle_MainCity Data/ScriptConfig/Character/Avatar_Female_Size02_Belle_MainCity Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Belle/Avatar_Female_Size02_Belle_MainCity Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Belle/Avatar_Female_Size02_Belle_UI false false 0 0 2 0 None UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 6011 5 10 438 363500 0 0 0 0 0 95 78700 45 37000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 0 0 0 0 0 0
1 ID CodeName Name AudioEventReplaceParam AudioBank HudIconPath HollowIconPath IconPath RectIconPath AvatarPath ScriptConfigPath UIScriptConfigPath PrefabPath UIPrefabPath MainPageShow NeedShow HitTypes ElementTypes Tags Gender Camp CampName GroupIconPath WeaponType StarInitial AvatarPieceID AvatarDecompose AvatarCompose HP HPGrowth Armor ArmorGrowth Shield ShieldGrowth Endurance Attack AttackGrowth Defence DefenceGrowth Crit CritDamage CritRes CritDmgRes PenRate PenDelta Luck Stun BreakStun SPBarPoint SpRecover RBL RBLCorrectionFactor RBLProbability BuffResistBurnPossibilityRatio BuffResistBurnPossibilityDelta BuffResistFrozenPossibilityRatio BuffResistFrozenPossibilityDelta BuffResistElectricPossibilityRatio BuffResistElectricPossibilityDelta Weapon RBP RBPFadeOutRate RBPFadeOutTime RBPCorrectionFactor RBPProbability
2 1011 Avatar_Female_Size02_Anbi_En Avatar_Female_Size02_Anbi anbi BK_Anbi|BK_CHR_Common|BK_Anbi_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle01.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect01.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar01 Data/ScriptConfig/Character/Avatar_Female_Size02_Anbi Data/ScriptConfig/Character/Avatar_Female_Size02_Anbi_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Anbi/Avatar_Female_Size02_Anbi Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Anbi/Avatar_Female_Size02_Anbi_UI true true 101 203 Anbi,Cut,Electric,Female 2 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 5011 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
3 1021 Avatar_Female_Size01_Tsubaki_En Avatar_Female_Size01_Tsubaki tsubaki BK_Tsubaki|BK_CHR_Common|BK_Tsubaki_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral11.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral11.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle11.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect11.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar02 Data/ScriptConfig/Character/Avatar_Female_Size01_Tsubaki Data/ScriptConfig/Character/Avatar_Female_Size01_Tsubaki_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Tsubaki/Avatar_Female_Size01_Tsubaki Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Tsubaki/Avatar_Female_Size01_Tsubaki_UI true true 101 200 Tsubaki,Cut,Female 2 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 2 1 5021 10 20 440 364300 0 0 0 0 0 95 78400 48 39000 500 5000 0 0 0 0 10 0 100 120 200 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
4 1031 Avatar_Female_Size02_Nostradamus_En Avatar_Female_Size02_Nostradamus nicole BK_Nicole|BK_CHR_Common|BK_Nicole_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral12.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral12.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle12.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect12.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar03 Data/ScriptConfig/Character/Avatar_Female_Size02_Nostradamus Data/ScriptConfig/Character/Avatar_Female_Size02_Nostradamus_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Nostradamus/Avatar_Female_Size02_Nostradamus Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Nostradamus/Avatar_Female_Size02_Nostradamus_UI true true 102 200 Nostradamus,Punch,Female 2 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 5031 10 20 440 364300 0 0 0 0 0 116 95900 43 35100 500 5000 0 0 0 0 10 0 100 120 200 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
5 1041 Avatar_Female_Size02_Longinus_En Avatar_Female_Size02_Longinus longinus BK_Longinus|BK_CHR_Common|BK_Longinus_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral05.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral05.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle05.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect05.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size02_Longinus Data/ScriptConfig/Character/Avatar_Female_Size02_Longinus_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Longinus/Avatar_Female_Size02_Longinus Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Longinus/Avatar_Female_Size02_Longinus_UI false true 101 201 Longinus,Cut,Fire,Female 2 5 CampObols UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampObols.png 1 1 5041 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
6 1061 Avatar_Female_Size01_Corin_En Avatar_Female_Size01_Corin corin BK_Corin|BK_CHR_Common|BK_Corin_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral09.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral09.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle09.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect09.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size01_Corin Data/ScriptConfig/Character/Avatar_Female_Size01_Corin_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Corin/Avatar_Female_Size01_Corin Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Corin/Avatar_Female_Size01_Corin_UI false true 101 200 Corin,Cut,Female 2 2 CampVictoriaHousekeepingCo. UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampVictoriaHousekeepingCo..png 1 1 5061 10 20 484 400800 0 0 0 0 0 105 87200 48 39000 500 5000 0 0 0 0 10 0 120 120 160 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
7 1081 Avatar_Male_Size03_Billy_En Avatar_Male_Size03_Billy billy BK_Billy|BK_CHR_Common|BK_Billy_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral10.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral10.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle10.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect10.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Billy Data/ScriptConfig/Character/Avatar_Male_Size03_Billy_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Billy/Avatar_Male_Size03_Billy Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Billy/Avatar_Male_Size03_Billy_UI true true 103 200 Billy,Pierce,Male 1 1 CampGentleHouse UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 5081 10 20 396 327900 0 0 0 0 0 105 87200 43 35100 500 5000 0 0 0 0 10 0 80 120 240 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
8 1091 Avatar_Female_Size02_Unagi_En Avatar_Female_Size02_Unagi unagi BK_Unagi|BK_CHR_Common|BK_Unagi_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral13.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral13.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle13.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect13.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size02_Unagi Data/ScriptConfig/Character/Avatar_Female_Size02_Unagi_UI Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Unagi/Avatar_Female_Size02_Unagi Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Unagi/Avatar_Female_Size02_Unagi_UI false true 101 202 Unagi,Cut,Ice,Female 2 6 CampH.S.O-S6 UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampH.S.O-S6.png 1 1 5091 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
9 1101 Avatar_Female_Size01_OokumaMari_En Avatar_Female_Size01_OokumaMari koleda BK_Koleda|BK_CHR_Common|BK_Koleda_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral14.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral14.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle14.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect14.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size01_OokumaMari Data/ScriptConfig/Character/Avatar_Female_Size01_OokumaMari_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_OokumaMari/Avatar_Female_Size01_OokumaMari Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_OokumaMari/Avatar_Female_Size01_OokumaMari_UI false true 102 201 OokumaMari,Punch,Fire,Female 2 3 CampBelobogIndustries UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampBelobogIndustries.png 1 1 5101 10 20 431 356900 0 0 0 0 0 99 82200 45 36900 500 5000 0 0 0 0 10 0 100 120 200 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
10 1111 Avatar_Male_Size03_Anton_En Avatar_Male_Size03_Anton anton BK_Anton|BK_CHR_Common|BK_Anton_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral15.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral15.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle15.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect15.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Anton Data/ScriptConfig/Character/Avatar_Male_Size03_Anton_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Anton/Avatar_Male_Size03_Anton Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Anton/Avatar_Male_Size03_Anton_UI false true 103 203 Anton,Pierce,Electric,Male 1 3 CampBelobogIndustries UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampBelobogIndustries.png 1 1 5111 10 20 462 382500 0 0 0 0 0 100 82800 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
11 1121 Avatar_Male_Size03_Ben_En Avatar_Male_Size03_Ben ben BK_Ben|BK_CHR_Common|BK_Ben_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral16.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral16.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle16.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect16.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Ben Data/ScriptConfig/Character/Avatar_Male_Size03_Ben_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Ben/Avatar_Male_Size03_Ben Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Ben/Avatar_Male_Size03_Ben_UI false true 102 200 Ben,Punch,Male 1 3 CampBelobogIndustries UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampBelobogIndustries.png 1 1 5121 10 20 550 455900 0 0 0 0 0 90 74700 55 45100 500 5000 0 0 0 0 10 0 120 120 160 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
12 1131 Avatar_Female_Size01_Aokaku_En Avatar_Female_Size01_Aokaku aokaku BK_Aokaku|BK_CHR_Common|BK_Aokaku_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral17.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral17.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle17.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect17.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Female_Size01_Aokaku Data/ScriptConfig/Character/Avatar_Female_Size01_Aokaku_UI Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Aokaku/Avatar_Female_Size01_Aokaku Char/Avatar/Female/Female_Size01/Avatar_Female_Size01_Aokaku/Avatar_Female_Size01_Aokaku_UI false true 101,102 204 Aokaku,Cut,Punch,Wind,Female 2 6 CampH.S.O-S6 UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampH.S.O-S6.png 1 1 5131 10 20 484 400800 0 0 0 0 0 105 87200 48 39000 500 5000 0 0 0 0 10 0 120 120 160 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
13 1141 Avatar_Male_Size03_Lycaon_En Avatar_Male_Size03_Lycaon lycaon BK_Lycaon|BK_CHR_Common|BK_Lycaon_VO UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral18.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral18.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle18.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect18.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar04 Data/ScriptConfig/Character/Avatar_Male_Size03_Lycaon Data/ScriptConfig/Character/Avatar_Male_Size03_Lycaon_UI Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Lycaon/Avatar_Male_Size03_Lycaon Char/Avatar/Male/Male_Size03/Avatar_Male_Size03_Lycaon/Avatar_Male_Size03_Lycaon_UI false true 102 202 Lycaon,Punch,Ice,Male 1 2 CampVictoriaHousekeepingCo. UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampVictoriaHousekeepingCo..png 1 1 5141 10 20 473 391700 0 0 0 0 0 95 78900 50 41000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 10012 0 0 0 0 0
14 2011 Avatar_Male_Size01_Wise_En Avatar_Male_Size01_Wise wise BK_Wise UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle01.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect01.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar01 Data/ScriptConfig/Character/Avatar_Male_Size01_Wise_MainCity Data/ScriptConfig/Character/Avatar_Male_Size01_Wise_MainCity Char/Avatar/Male/Male_Size01/Avatar_Male_Size01_Wise/Avatar_Male_Size01_Wise_MainCity Char/Avatar/Male/Male_Size01/Avatar_Male_Size01_Wise/Avatar_Male_Size01_Wise_UI false false 0 0 1 0 None UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 6011 5 10 449 372100 0 0 0 0 0 90 74900 48 39000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 0 0 0 0 0 0
15 2021 Avatar_Female_Size02_Belle_En Avatar_Female_Size02_Belle belle BK_Belle UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleGeneral/UnPacker/IconRoleGeneral01.png UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconRoleCircle01.png UI/Sprite/A1DynamicLoad/IconRoleSelect/UnPacker/IconRoleSelect01.png UI/Sprite/RoleHollowSystemPage/TeamEditAvatar01 Data/ScriptConfig/Character/Avatar_Female_Size02_Belle_MainCity Data/ScriptConfig/Character/Avatar_Female_Size02_Belle_MainCity Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Belle/Avatar_Female_Size02_Belle_MainCity Char/Avatar/Female/Female_Size02/Avatar_Female_Size02_Belle/Avatar_Female_Size02_Belle_UI false false 0 0 2 0 None UI/Sprite/A1DynamicLoad/IconRoleCamp/UnPacker/IconCampGentleHouse.png 1 1 6011 5 10 438 363500 0 0 0 0 0 95 78700 45 37000 500 5000 0 0 0 0 10 0 110 120 180 1 10000 0 0 0 0 0 0 0 0 0 0 0 0 0

View file

@ -0,0 +1,498 @@
TagID NPCID CreatePosition CreateType DefaultInteractIDs InteractName InteractShape InteractScale FanInteractParam FocusInteractScale IgnoreCollider LookIK NPCLookIK SceneSoundID PlayerRotate NPCRotate SceneObjectName CameraStoryKey ActionState ColliderState ItemState ObjectIDs CreateInterval CreateDelay NPCIcon ActionSwitch
1 100171011 Street_NPCPos_ToWorkshop 0 10000001 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
2 100171011 Street_NPCPos_ToGarage 0 10000002 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
3 100171011 Workshop_NPCPos_ToStreet 0 10000003 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
4 100171011 Workshop_NPCPos_ToGarage 0 10000004 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
5 100171011 Garage_NPCPos_ToStreet 0 10000005 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
6 100171011 Garage_NPCPos_ToWorkshop 0 10000006 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
7 100171011 Street_NPCPos_ToGarage2 0 10000016 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
8 100171011 Garage_NPCPos_ToStreet2 0 10000017 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
1001 100171011 Workshop_NPCPos_VHS 0 10000010 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
1002 100171011 Workshop_NPCPos_Hollow 0 10000009 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
1003 100171011 Street_NPCPos_Smithy 0 10000007 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
1004 100171011 Workshop_NPCPos_Gacha 0 A 1 0.75,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
1005 100171011 Workshop_NPCPos_WorkTable 0 10000014 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
1006 100171011 Street_NPCPos_Grocery 0 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
1007 100171011 Workshop_NPCPos_TimeMachine 0 10000020 A 2 0,1.5,2,150,10 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
2000 100172011 WorkShop_NPCPos_Noca_Quest10020001 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 3 AvatarCollider:true None 0 0 None None
2001 100172011 Garage_NPCPos_Nocha_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
2002 100172031 Garage_NPCPos_Billy_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
2003 100172041 Garage_NPCPos_Anbi_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2004 100172151 Street_NPCPos_Temp_Quest10020005 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2005 100172031 Street_NPCPos_Billy_Quest10020006 1 19900013,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2006 100172011 Garage_NPCPos_Nocha_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2007 100172031 Garage_NPCPos_Billy_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2008 100172041 Garage_NPCPos_Anbi_Quest10020003 1 19900022,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2009 100172052 Street_NPCPos_Temp_Quest10020015 1 19900022,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2010 100172011 Street_NPCPos_Nocha_Quest10020008 1 19900014,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2011 100172041 Street_NPCPos_Anbi_Quest10020006 1 19900026,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2012 100172054 Street_NPCPos_Bangboo_Quest10020018 1 19900026,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
2013 100172055 Street_NPCPos_Temp_Quest10020020 1 19900028,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2014 100172056 Street_NPCPos_Temp_Quest10020021 1 19900029,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2015 100172091 Workshop_NPCPos_SisterLing 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
2016 100172058 Street_NPCPos_BangbooA_Quest10020006 0 10000015,20000001 A 2 0,1.8,2,120,10 None 3.0 true true false 0 true false None Small 300101 AvatarCollider:true None 0 0 None None
2017 100172059 Street_NPCPos_BangbooB_Quest10020006 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
2018 100172060 Street_NPCPos_BangbooC_Quest10020006 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
2019 100172061 Street_NPCPos_RamenStore 0 10000013,20000001 A 2 0,2.4,2,150,10 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true noodle:true 0 0 None None
2020 100172062 Street_NPCPos_TestS 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
2021 100172063 Street_NPCPos_TestL 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2022 100172021 WorkShop_NPCPos_Tsubaki_Quest10020106 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2023 100172064 WorkShop_NPCPos_Salesman_Quest10020103 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2024 100171011 Workshop_NPCPos_Telephone 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2025 100172082 Workshop_NPCPos_HollowPause 0 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2026 100172092 Workshop_NPCPos_HollowPause 0 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2027 100172081 Workshop_NPCPos_SisterLing 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
2028 100173001 Workshop_NPCPos_VHSBangboo 0 19900052 A 2 9,2,2,90,10 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2029 100172101 Street_NPCPos_TestBear 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
2031 100180131 Street_NPCPos_Quest10020151 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2032 100180714 Street_NPCPos_Quest10020152 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2033 100180812 Workshop_NPCPos_Bangboo05_VHS 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2034 100180161 Street_NPCPos_Quest10020154 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1006 0 0 None None
2035 100180714 Street_NPCPos_Quest10020155 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:false None 0 0 None None
2036 100180171 Street_NPCPos_Quest10020156 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2037 100180912 Workshop_NPCPos_Bangboo01_VHS 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2038 100180712 Street_NPCPos_Quest10020157 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
2039 100180713 Street_NPCPos_Quest10020158 1 100701 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400109 AvatarCollider:true None 0 0 None None
2040 100172021 Street_NPCPos_Quest10020118 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2041 100172091 Workshop_NPCPos_ARole4 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2042 100172081 Workshop_NPCPos_ARole4 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
2043 100172091 Workshop_NPCPos_ARole5 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2044 100172081 Workshop_NPCPos_ARole5 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2045 100172021 WorkShop_NPCPos_Tsubaki_Quest10020115 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2046 100172091 Workshop_NPCPos_ARole6 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200201 AvatarCollider:true None 0 0 None None
2047 100172081 Workshop_NPCPos_ARole6 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
2051 100172091 Workshop_NPCPos_ARole1 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2052 100172081 Workshop_NPCPos_ARole1 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2053 100172091 Workshop_NPCPos_ARole2 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2054 100172081 Workshop_NPCPos_ARole2 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2055 100172091 Workshop_NPCPos_ARole3 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
2056 100172081 Workshop_NPCPos_ARole3 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
2057 100172091 Workshop_NPCPos_ARole7 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
2058 100172081 Workshop_NPCPos_ARole7 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
2059 100172091 Workshop_NPCPos_ARole8F 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200202 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone:true 1003 0 0 None None
2060 100172081 Workshop_NPCPos_ARole8 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200102 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone:true 1004 0 0 None None
2061 100172091 Workshop_NPCPos_ARole9 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200201 AvatarCollider:true None 0 0 None None
2062 100172081 Workshop_NPCPos_ARole9 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
2063 100180719 Street_NPCPos_Gate 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
2064 100180712 Street_NPCPos_Quest10020151 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400417 SitDownCollider:true|WallCollider:false|AvatarCollider:false mask:true|computer:true 0,1026 0 0 None None
2065 100180812 Workshop_NpcPos_Quest10020151 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
2066 100180912 Workshop_NpcPos_Quest10020181 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
2067 100172091 Workshop_NPCPos_ARole11 1 20000002 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2068 100172081 Workshop_NPCPos_ARole11 1 20000002 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2069 100172021 WorkShop_NPCPos_Tsubaki_Quest10020119 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2070 100172061 Street_NPCPos_RamenStore 1 20000002 A 2 0,2.4,2,150,10 None 3.0 true true true 0 true false None Middle 200303 AvatarCollider:true noodle:false 0 0 None None
2071 100172031 Street_NPCPos_Billy_Quest10020005 1 19900047 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
2072 100172041 Street_NPCPos_Anbi_Quest10020005 1 19900048 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2073 100172031 Garage_NPCPos_Billy_Quest10020012 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
2074 100172041 Garage_NPCPos_Anbi_Quest10020012 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2075 100172011 Garage_NPCPos_Nocha_Quest10020012 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
2077 100172091 Workshop_NPCPos_ARole10 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
2078 100172081 Workshop_NPCPos_ARole10 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200104 AvatarCollider:true None 0 0 None None
2081 100172091 Workshop_NPCPos_ARole12 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2082 100172081 Workshop_NPCPos_ARole12 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2083 100180812 Street_NPCPos_Joe 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
2084 100172042 Street_NPCPos_No11_01 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2085 100180912 Street_NPCPos_Xiute 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
2086 100180718 Street_NPCPos_Keli_01 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
2087 100172042 Workshop_NPCPos_No11_03 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2088 100180714 Workshop_NPCPos_DrawingRoom 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2089 100180715 Street_NPCPos_Bangboo_Quest10020188 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200702 AvatarCollider:true None 0 0 None None
2090 100172042 Street_NPCPos_No11_01End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2091 100172042 Street_NPCPos_No11_02 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2092 100180718 Street_NPCPos_Keli_02 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
2093 100180718 Street_NPCPos_Keli_02End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
2094 100180717 Street_NPCPos_Quest10020155_02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200701 AvatarCollider:false None 0 0 None 30:200703
2095 100172042 Street_NPCPos_No11_03End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2096 100180718 Street_NPCPos_Keli_03End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
2097 100172181 Street_NPCPos_Woof 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200501 AvatarCollider:true None 0 0 None None
2098 100172161 WorkShop_NPCPos_Bangboo_Quest10020106 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 200703 AvatarCollider:true None 0 0 None 30:200703
2099 100172181 Street_NPCPos_Woof2 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200501 AvatarCollider:true None 0 0 None 45:200502
2100 100172181 Street_NPCPos_Woof3 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200503 AvatarCollider:true None 0 0 None None
2101 100172091 Garage_NPCPos_Quest10020024 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2102 100172081 Garage_NPCPos_Quest10020024 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2103 100172191 Street_NPCPos_Susie 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2104 100172201 Street_NPCPos_TinMaster01 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200602 AvatarCollider:true None 0 0 None None
2105 100172201 Street_NPCPos_TinMaster02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200601 AvatarCollider:true None 0 0 None None
2106 100180715 Street_NPCPos_Bangboo_Quest10020140 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
2107 100180715 Workshop_NpcPos_Bangboo_Quest10020195 1 20000002 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
2108 100180715 Street_NPCPos_Bangboo_Quest10020196 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
2109 100180112 Street_NPCPos_PAFUMEI 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400204 AvatarCollider:true None 0 0 None None
2110 100180412 Street_NPCPos_MEIKE 1 20000002 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
2111 100172101 Street_NPCPos_Ben 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
2112 100172071 Street_NPCPos_Anton 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2113 100172211 Street_NPCPos_OokumaMari 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2114 100172231 Street_NPCPos_Enzo 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2115 100172041 Street_NPCPos_Anbi02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2116 100172211 Street_NPCPos_OokumaMari02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2117 100172031 Street_NPCPos_Billy02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2118 100172021 Street_NPCPos_Tsubaki 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2119 100172071 Street_NPCPos_Anton02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2120 100172011 Street_NPCPos_Nocha02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2121 100172021 Street_NPCPos_Tsubaki02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2122 100172211 Street_NPCPos_OokumaMari04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2123 100172101 Street_NPCPos_Ben02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
2124 100172211 Street_NPCPos_OokumaMari03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2125 100172101 Street_NPCPos_Ben03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
2126 100172031 Street_NPCPos_Billy03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2127 100172011 Street_NPCPos_Nocha03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2128 100172021 Street_NPCPos_Tsubaki03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2129 100172041 Street_NPCPos_Anbi03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2130 100172101 Street_NPCPos_Ben04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
2131 100172211 Street_NPCPos_OokumaMari05 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2132 100172071 Street_NPCPos_Anton03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2133 100172011 Street_NPCPos_Nocha04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2134 100172031 Street_NPCPos_Billy04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2135 100172041 Street_NPCPos_Anbi04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2136 100180715 Workshop_NpcPos_Bangboo_Quest10020141 1 20000002 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
2140 100173012 Street_NPCPos_Schroeder02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400418 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false|phone01:true 0,1017 0 0 None None
2141 100173012 Street_NPCPos_Schroeder03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false|phone02:true 0,1017 0 0 None None
2142 100172042 Garage_NPCPos_No11 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 200405 AvatarCollider:true None 0 0 None None
2143 100172042 Garage_NPCPos_No11_02 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 200403 AvatarCollider:true None 0 0 None None
2144 100172042 Garage_NPCPos_No11_03 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 200405 AvatarCollider:true None 0 0 None None
2145 100180712 Street_NPCPos_Shepherd02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400417 SitDownCollider:true|WallCollider:false|AvatarCollider:false mask:true|computer:true 0,1025 0 0 None None
2146 100172091 Workshop_NPCPos_ARole13 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200201 AvatarCollider:true None 0 0 None None
2147 100172081 Workshop_NPCPos_ARole13 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
2148 100172091 Workshop_NPCPos_ARole14 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200202 AvatarCollider:true None 0 0 None None
2149 100172081 Workshop_NPCPos_ARole14 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200102 AvatarCollider:true None 0 0 None None
2150 100172091 Workshop_NPCPos_ARole15 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
2151 100172081 Workshop_NPCPos_ARole15 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
2152 100172091 Workshop_NPCPos_ARole16 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200204 SitDownCollider:true|WallCollider:false|AvatarCollider:false computer:true 1027 0 0 None None
2153 100172081 Workshop_NPCPos_ARole16F 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200104 AvatarCollider:true None 0 0 None None
2154 100172091 Workshop_NPCPos_ARole17F 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200205 AvatarCollider:true gameboy:true 1022 0 0 None None
2155 100172081 Workshop_NPCPos_ARole17 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200105 AvatarCollider:true gameboy:true 1022 0 0 None None
2156 100172042 Garage_NPCPos_No11_04 1 20000002 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200403 AvatarCollider:true None 0 0 None None
2157 100172091 Workshop_NPCPos_ARole18 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2158 100172081 Workshop_NPCPos_ARole18 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
2159 100172091 Garage_NPCPos_Quest10020120 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
2160 100172081 Garage_NPCPos_Quest10020120 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
3005 100173005 Workshop_NPCPos_Bangboo01_VHS 1 100701 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
3006 100173006 Workshop_NPCPos_Bangboo02_VHS 1 100702 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
3007 100173007 Workshop_NPCPos_Bangboo03_VHS 1 100703 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
3008 100173008 Workshop_NPCPos_Bangboo04_VHS 1 100707 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
3009 100173009 Workshop_NPCPos_Bangboo05_VHS 1 100708 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
3011 100180711 Workshop_NPCPos_guest01_VHS 1 10200001 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
3012 100181411 Workshop_NPCPos_guest02_VHS 1 10200002 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400414 AvatarCollider:true None 0 0 None None
3013 100180511 Workshop_NPCPos_guest03_VHS 1 10200003 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
3014 100180511 Workshop_NPCPos_guest04_VHS 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400109 AvatarCollider:true None 0 0 None None
3015 100180111 Workshop_NPCPos_guest05_VHS 1 10200005 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:true None 0 0 None None
3016 100180211 Workshop_NPCPos_guest06_VHS 1 10200006 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400310 AvatarCollider:true None 0 0 None None
3017 100180311 Workshop_NPCPos_guest01_VHS 1 10200007 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
3018 100180411 Workshop_NPCPos_guest03_VHS 1 10200008 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400311 AvatarCollider:true None 0 0 None None
3019 100181111 Workshop_NPCPos_guest02_VHS 1 10200009 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400510 AvatarCollider:true None 0 0 None 30:200703
3020 100181011 Workshop_NPCPos_guest04_VHS 1 10200010 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None 30:200703
3021 100180713 Workshop_NpcPos_VHS31020001 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400113 AvatarCollider:true bag:false 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2090.png None
3022 100180714 Workshop_NpcPos_VHS31020002 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400310 AvatarCollider:true None 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2035.png 30:200703
3023 100180715 Workshop_NpcPos_VHS31010001 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None None
3024 100180716 Workshop_NpcPos_VHS31010002 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
3025 100180713 Workshop_NpcPos_VHS31020001End 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2090.png None
3026 100180717 Workshop_NpcPos_VHS31020002_02 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None None
3027 100180714 Workshop_NpcPos_VHS31020002End 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400310 AvatarCollider:true None 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2035.png None
3028 100180717 Workshop_NpcPos_VHS31020002_02End 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None None
4001 100180711 Street_Passerby_A1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
4002 100181111 Street_Passerby_A2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1022 0 0 None None
4003 100180311 Street_Passerby_B1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400204 AvatarCollider:true None 0 0 None None
4004 100181111 Street_Passerby_B2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4005 100181311 Street_Passerby_C1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400502 AvatarCollider:true phone:true 1029 0 0 None None
4006 100181011 Street_Passerby_C2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400506 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false|phone02:true 0,1003 0 0 None None
4007 100181511 Street_Passerby_D1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
4008 100180811 Street_Passerby_D2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400421 AvatarCollider:true phone:true 1016 0 0 None None
4009 100180711 Street_Passerby_09 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true|bag:false 1014,0 0 0 None None
4010 100180811 Street_Passerby_10 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400419 AvatarCollider:true None 0 0 None None
4011 100180911 Street_Passerby_11 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4012 100181111 Street_Passerby_12 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4013 100181311 Street_Passerby_13 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400510 AvatarCollider:true None 0 0 None None
4014 100180111 Street_Passerby_14 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400203 AvatarCollider:true None 0 0 None None
4015 100181311 Street_Passerby_15 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400510 AvatarCollider:true None 0 0 None None
4016 100180311 Street_Passerby_16 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4017 100180111 Street_Passerby_17 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
4018 100180411 Street_Passerby_18 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400312 AvatarCollider:true None 0 0 None None
4019 100180711 Street_Passerby_19 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
4020 100181511 Street_Passerby_20 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
4021 100180911 Street_Passerby_21 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4022 100180111 Street_Passerby_22 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
4023 100180511 Street_Passerby_23 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
4024 100181011 Street_Passerby_24 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true bag:false 0 0 None None
4025 100180811 Street_Passerby_25 1 C 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
4026 100180111 Street_Passerby_26 1 D 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
4027 100180211 Street_Passerby_27 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400308 AvatarCollider:true None 0 0 None None
4028 100180311 Street_Passerby_28 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1010 0 0 None None
4029 100181111 Street_Passerby_29 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4030 100180411 Street_Passerby_30 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400312 AvatarCollider:false None 0 0 None None
4031 100180111 Street_Passerby_31 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400214 AvatarCollider:true None 0 0 None None
4032 100180411 Street_Passerby_32 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
4033 100181411 Street_Passerby_33 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400419 AvatarCollider:true None 0 0 None None
4034 100180611 Street_Passerby_34 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
4035 100181511 Street_Passerby_35 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
4036 100180711 Street_Passerby_36 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1016 0 0 None None
4037 100181111 Street_Passerby_37 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4038 100180611 Street_Passerby_38 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true bag:false 0 0 None None
4039 100181311 Street_Passerby_39 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
4040 100180711 Street_Passerby_40 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1021 0 0 None None
4041 100180211 Street_Passerby_41 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:true None 0 0 None None
4042 100181411 Street_Passerby_42 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true mask:false 0 0 None None
4043 100180311 Street_Passerby_43 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400214 AvatarCollider:true None 0 0 None None
4044 100180611 Street_Passerby_44 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1012 0 0 None None
4045 100180511 Street_Passerby_45 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1008 0 0 None None
4046 100181511 Street_Passerby_46 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400114 AvatarCollider:true bag:false 0 0 None None
4047 100180111 Street_Passerby_47 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400211 AvatarCollider:true None 0 0 None None
4048 100181511 Street_Passerby_48 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
4049 100180411 Street_Passerby_49 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1011 0 0 None None
4050 100181011 Street_Passerby_50 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4051 100180911 Street_Passerby_51 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4052 100180411 Street_Passerby_52 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
4053 100180111 Street_Passerby_53 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400216 AvatarCollider:true mask:true 0 0 None None
4054 100181111 Street_Passerby_54 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400513 AvatarCollider:true gameboy02:true|bag:false 1023 0 0 None None
4055 100181411 Street_Passerby_55 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1017 0 0 None None
4056 100180511 Street_Passerby_56 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true mask:false 0 0 None None
4057 100180711 Street_Passerby_57 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
4058 100180811 Street_Passerby_58 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
4059 100180611 Street_Passerby_59 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
4060 100181511 Street_Passerby_60 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true None 0 0 None None
4061 100180711 Street_Passerby_61 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400410 SitDownCollider:true|WallCollider:false|AvatarCollider:false computer:true|bag:false 1025,0 0 0 None None
4062 100180511 Street_Passerby_62 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400108 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe:true|bag:false 1011,0 0 0 None None
4063 100180211 Street_Passerby_63 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1006 0 0 None None
4064 100180311 Street_Passerby_64 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
4065 100181411 Street_Passerby_65 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1017 0 0 None None
4066 100180511 Street_Passerby_66 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
4067 100181311 Street_Passerby_67 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4068 100181311 Street_Passerby_68 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4069 100181011 Street_Passerby_69 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
4070 100180511 Street_Passerby_70 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1011 0 0 None None
4071 100180311 Street_Passerby_71 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
4072 100180311 Street_Passerby_72 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1007 0 0 None None
4073 100180211 Street_Passerby_73 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
4074 100181011 Street_Passerby_74 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
4075 100180711 Street_Passerby_75 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400408 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
4076 100180811 Street_Passerby_76 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400414 AvatarCollider:true None 0 0 None None
4077 100180611 Street_Passerby_77 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1013 0 0 None None
4078 100180411 Street_Passerby_78 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1007 0 0 None None
4079 100181511 Street_Passerby_79 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
4080 100180611 Street_Passerby_80 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
4081 100180711 Street_Passerby_81 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400405 AvatarCollider:true None 0 0 None None
4082 100180111 Street_Passerby_82 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400211 AvatarCollider:true None 0 0 None None
4083 100180411 Street_Passerby_83 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1003 0 0 None None
4084 100180311 Street_Passerby_84 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400204 AvatarCollider:true mask:false 0 0 None None
4085 100180411 Street_Passerby_85 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400308 AvatarCollider:true None 0 0 None None
4086 100180111 Street_Passerby_86 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4087 100180211 Street_Passerby_87 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4088 100180311 Street_Passerby_88 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4089 100180311 Street_Passerby_89 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1004 0 0 None None
4090 100180111 Street_Passerby_90 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400207 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone:true 1010 0 0 None None
4091 100180411 Street_Passerby_91 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
4092 100180511 Street_Passerby_92 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1010,0 0 0 None None
4093 100180411 Street_Passerby_93 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4094 100180811 Street_Passerby_94 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400421 AvatarCollider:true phone:true 1015 0 0 None None
4095 100181411 Street_Passerby_95 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1021 0 0 None None
4096 100180711 Street_Passerby_96 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1019 0 0 None None
4097 100181411 Street_Passerby_97 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true bag:false 0 0 None None
4098 100181411 Street_Passerby_98 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
4099 100180811 Street_Passerby_99 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400408 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
4100 100180811 Street_Passerby_100 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true None 0 0 None None
4101 100180811 Street_Passerby_101 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400404 AvatarCollider:true phone02:true 0 0 None None
4102 100180711 Street_Passerby_102 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400408 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
4103 100181111 Street_Passerby_103 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4104 100181111 Street_Passerby_104 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4105 100181111 Street_Passerby_105 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400502 AvatarCollider:true phone:true 1028 0 0 None None
4106 100181011 Street_Passerby_106 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4107 100180911 Street_Passerby_107 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
4108 100181111 Street_Passerby_108 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4109 100181511 Street_Passerby_109 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400106 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_bench:true|bag:false 1004,0 0 0 None None
4110 100181511 Street_Passerby_110 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4111 100180611 Street_Passerby_111 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
4112 100181511 Street_Passerby_112 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400115 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe02:true 1006 0 0 None None
4113 100180611 Street_Passerby_113 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
4114 100181511 Street_Passerby_114 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
4115 100181311 Street_Passerby_115 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
4116 100181311 Street_Passerby_116 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1022 0 0 None None
4117 100180611 Street_Passerby_117 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400108 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe:true 1008 0 0 None None
4118 100181011 Street_Passerby_118 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
4119 100180211 Street_Passerby_119 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1009 0 0 None None
4120 100180811 Street_Passerby_120 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400410 SitDownCollider:true|WallCollider:false|AvatarCollider:false computer:true|bag:false 1026,0 0 0 None None
4123 100180811 Street_Passerby_123 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
4124 100180611 Street_Passerby_124 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1013,0 0 0 None None
4125 100180711 Street_Passerby_125 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
4126 100181511 Street_Passerby_126 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1011,0 0 0 None None
4127 100180911 Street_Passerby_127 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
4128 100181511 Street_Passerby_128 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1005,0 0 0 None None
4129 100180811 Street_Passerby_129 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
4130 100180711 Street_Passerby_130 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400420 AvatarCollider:true bag:false 0 0 None None
4131 100180711 Street_Passerby_131 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
4132 100180511 Street_Passerby_132 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1006 0 0 None None
4133 100180611 Workshop_Passerby_133 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
4134 100181511 Workshop_Passerby_134 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
4135 100180611 Workshop_Passerby_135 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true None 0 0 None None
4136 100180311 Workshop_Passerby_136 1 10200006 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 5000 5000 None None
4137 100180411 Workshop_Passerby_137 1 10200006 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:true None 5000 5000 None None
4138 100180811 Workshop_Passerby_138 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true None 0 0 None None
4139 100173241 Street_Passerby_139 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
4140 100173242 Street_Passerby_140 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
4141 100173243 Street_Passerby_141 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1006 0 0 None None
4142 100173244 Street_Passerby_142 3 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
4143 100173245 Street_Passerby_143 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
4144 100173246 Street_Passerby_144 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
4145 100173247 Street_Passerby_145 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
4146 100173248 Street_Passerby_146 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
4147 100173249 Street_Passerby_147 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
4148 100173250 Street_Passerby_148 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
4149 100173251 Street_Passerby_149 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400216 AvatarCollider:true None 0 0 None None
4150 100173252 Street_Passerby_150 3 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
4151 100180811 Street_Passerby_151 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400416 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
4152 100180711 Street_Passerby_152 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400418 AvatarCollider:true None 0 0 None 30:200703
4153 100181111 Street_Passerby_153 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400508 AvatarCollider:true None 0 0 None None
4501 100173501 Street_Passerby_501 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
4502 100173502 Street_Passerby_502 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
4503 100173503 Street_Passerby_503 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 200703 AvatarCollider:true None 0 0 None None
4504 100173010 Street_Passerby_121 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
4505 100173011 Street_Passerby_122 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400213 AvatarCollider:true None 0 0 None None
4506 100173012 Street_NPCPos_Schroeder 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400418 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
4507 100173504 Street_Passerby_507 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
4508 100173505 Street_Passerby_508 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
4509 100173506 Street_Passerby_509 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
4510 100173507 Street_Passerby_510 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400108 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe:true|bag:false 1007,0 0 0 None None
4511 100173508 Street_Passerby_511 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true None 0 0 None None
4512 100173509 Street_Passerby_512 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400115 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe02:true 1012,0 0 0 None None
4513 100173510 Street_Passerby_513 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4514 100173511 Street_Passerby_514 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400213 AvatarCollider:true None 0 0 None None
4515 100173512 Street_Passerby_515 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400313 AvatarCollider:true bag:false|phone02:true 0,1006 0 0 None None
4516 100173513 Street_Passerby_516 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1003 0 0 None None
4517 100173514 Street_Passerby_517 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
4518 100173515 Street_Passerby_518 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4519 100173516 Street_Passerby_519 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1013 0 0 None None
4520 100173517 Street_Passerby_520 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
4521 100173518 Street_Passerby_521 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400418 AvatarCollider:true bag:false|mask:false 0 0 None None
4522 100173519 Street_Passerby_522 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400403 AvatarCollider:true bag:false 0 0 None None
4523 100173520 Street_Passerby_523 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400401 AvatarCollider:true None 0 0 None None
4524 100173521 Street_Passerby_524 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400106 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_bench:true|mask:false|bag:false 1013,0,0 0 0 None None
4525 100173522 Street_Passerby_525 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400211 AvatarCollider:true None 0 0 None None
4526 100173523 Street_Passerby_526 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4527 100173524 Street_Passerby_527 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
4528 100173525 Street_Passerby_528 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
4529 100173526 Street_Passerby_529 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
4530 100173527 Street_Passerby_530 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true None 0 0 None None
4531 100173528 Street_Passerby_531 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
4532 100173529 Street_Passerby_532 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
4533 100173530 Street_Passerby_533 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
4534 100173531 Street_Passerby_534 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
4535 100173532 Street_Passerby_535 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
4536 100173249 Street_Passerby_536 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true mask:false 0 0 None None
5001 100180191 Garage_Object_Car_01 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None
5002 100180191 Street_NPCPos_Car_Quest10020005 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None
5003 100171011 Street_ObjectPos_Newsstand 0 70000001 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
5004 100171011 Street_ObjectPos_02 0 70000002 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
5005 100171011 Street_ObjectPos_03 0 70000003 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
5006 100171011 Street_ObjectPos_04 0 70000004 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
5007 100171011 Street_ObjectPos_05 0 70000005 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
5008 100171011 Street_ObjectPos_06 0 70000006 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
5009 100171011 Street_ObjectPos_07 0 70000007 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
5010 100171011 Street_ObjectPos_08 0 70000008 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
5011 100171011 Street_ObjectPos_09 0 70000009 A 1 1.5,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
5012 100171011 Street_ObjectPos_10 0 70000010 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
5013 100171011 Street_ObjectPos_11 0 70000011 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
5014 100171011 Street_ObjectPos_12 0 70000012 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
5015 100171011 Street_ObjectPos_13 0 70000013 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
5016 100171011 Garage_ObjectPos_14 0 70000014 A 1 3,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
5017 100171011 Garage_ObjectPos_15 0 70000015 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
5018 100171011 Garage_ObjectPos_16 0 70000016 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
5019 100171011 Garage_ObjectPos_17 0 70000017 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
5020 100171011 Garage_ObjectPos_18 0 70000018 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
6001 100185001 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400217 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 5000 None None
6002 100185014 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 4000 27000 None None
6003 100185004 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400314 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 3000 45000 None None
6004 100185015 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7600 70000 None None
6005 100185008 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 2540 86000 None None
6006 100185005 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7600 100000 None None
6007 100185002 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 10000 0 None None
6008 100185007 Way14 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400423 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1014 21100 0 None None
6009 100185013 Way14 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400505 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1008 0 36000 None None
6010 100185006 Way14 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400105 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1015 20400 72000 None None
6011 100185011 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 11600 0 None None
6012 100185003 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 6700 32000 None None
6013 100185001 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400206 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1004 0 64000 None None
6014 100185010 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 11600 96000 None None
6015 100185003 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 0 None None
6016 100185001 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 0 None None
6017 100185005 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 2960 0 None None
6018 100185014 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 36000 None None
6019 100185015 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 2960 72000 None None
6020 100185003 Way19 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400206 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1006 0 0 None None
6021 100185009 Way19 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 13000 36000 None None
6022 100185001 Way19 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7500 72000 None None
6023 100185008 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 10000 None None
6024 100185006 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 3000 46000 None None
6025 100185007 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 82000 None None
6026 100185015 Way10 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400105 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1017 2700 0 None None
6027 100185007 Way10 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400423 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1016 8700 36000 None None
6028 100185004 Way10 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400305 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1010 0 72000 None None
6029 100185006 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 2960 0 None None
6030 100185008 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 48000 None None
6031 100185005 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 12000 0 None None
6032 100185002 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 8000 20000 None None
6033 100185008 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 530 38000 None None
6034 100185004 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400314 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 56000 None None
6035 100185006 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 12000 84000 None None
6036 100185007 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 530 96000 None None
6037 100185005 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 5000 96000 None None
6038 100185014 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 0 None None
6039 100185007 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 36000 None None
6040 100185015 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 2960 72000 None None
6041 100185001 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400206 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1010 0 5000 None None
6042 100185003 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7500 37000 None None
6043 100185011 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 13000 69000 None None
6044 100185010 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 13000 101000 None None
6045 100185003 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 76000 None None
6046 100185001 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 4000 95000 None None
6047 100185009 Way11 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 5500 0 None None
6048 100185003 Way11 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 36000 None None
6049 100185011 Way11 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 5500 72000 None None
6050 100185010 Way9 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400514 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true gameboy_walk:true 1023 0 0 None None
6051 100185013 Way9 2 A 1 2,0,0,0,0 None 3.0 true true false 50001 true false None Middle 400505 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1011 0 36000 None None
6052 100185008 Way9 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400422 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 72000 None None
6053 100185006 Way18 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 6300 0 None None
6054 100185015 Way18 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 18000 36000 None None
6055 100185002 Way18 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400314 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 72000 None None
7001 100184011 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
7002 100184021 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
7003 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
7004 100184211 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
7005 100184011 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
7006 100184021 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
7007 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
7008 100184221 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
7009 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
7010 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
7011 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
7012 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
7013 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
7014 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
7015 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
7016 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
7017 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
7018 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
7101 100184011 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
7102 100184021 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
7103 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
7104 100184211 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
7105 100184011 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
7106 100184021 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
7107 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
7108 100184221 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
7109 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
7110 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
7111 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
7112 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
7113 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
7114 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
7115 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
7116 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
7117 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
7118 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
9001 100171011 Street_NPCPos_Test 0 10000008 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 None None 0 0 None None
9002 100170111 Street_NPCPos_Test 0 19900001 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Small 0 None None 0 0 None None
9003 100170111 Street_NPCPos_Test 0 19900000 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Small 0 None None 0 0 None None
9004 100170111 Street_NPCPos_Test 0 19900000 B 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
9005 100172011 Street_NPCPos_Test 0 19900002 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
9006 100172021 Street_NPCPos_Test 0 19900003 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Small 0 None None 0 0 None None
9007 10086 Workshop_NPCPos_Test 0 100860 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None
9008 100172011 Workshop_NPCPos_Test 1 10000003 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
9009 100172053 Street_NPCPos_Quest 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
9010 100172091 Workshop_NPCPos_ARoleTest 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None
1 TagID NPCID CreatePosition CreateType DefaultInteractIDs InteractName InteractShape InteractScale FanInteractParam FocusInteractScale IgnoreCollider LookIK NPCLookIK SceneSoundID PlayerRotate NPCRotate SceneObjectName CameraStoryKey ActionState ColliderState ItemState ObjectIDs CreateInterval CreateDelay NPCIcon ActionSwitch
2 1 100171011 Street_NPCPos_ToWorkshop 0 10000001 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
3 2 100171011 Street_NPCPos_ToGarage 0 10000002 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
4 3 100171011 Workshop_NPCPos_ToStreet 0 10000003 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
5 4 100171011 Workshop_NPCPos_ToGarage 0 10000004 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
6 5 100171011 Garage_NPCPos_ToStreet 0 10000005 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
7 6 100171011 Garage_NPCPos_ToWorkshop 0 10000006 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
8 7 100171011 Street_NPCPos_ToGarage2 0 10000016 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
9 8 100171011 Garage_NPCPos_ToStreet2 0 10000017 None 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
10 1001 100171011 Workshop_NPCPos_VHS 0 10000010 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
11 1002 100171011 Workshop_NPCPos_Hollow 0 10000009 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
12 1003 100171011 Street_NPCPos_Smithy 0 10000007 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
13 1004 100171011 Workshop_NPCPos_Gacha 0 A 1 0.75,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
14 1005 100171011 Workshop_NPCPos_WorkTable 0 10000014 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
15 1006 100171011 Street_NPCPos_Grocery 0 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
16 1007 100171011 Workshop_NPCPos_TimeMachine 0 10000020 A 2 0,1.5,2,150,10 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
17 2000 100172011 WorkShop_NPCPos_Noca_Quest10020001 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 3 AvatarCollider:true None 0 0 None None
18 2001 100172011 Garage_NPCPos_Nocha_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
19 2002 100172031 Garage_NPCPos_Billy_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
20 2003 100172041 Garage_NPCPos_Anbi_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
21 2004 100172151 Street_NPCPos_Temp_Quest10020005 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
22 2005 100172031 Street_NPCPos_Billy_Quest10020006 1 19900013,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
23 2006 100172011 Garage_NPCPos_Nocha_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
24 2007 100172031 Garage_NPCPos_Billy_Quest10020003 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
25 2008 100172041 Garage_NPCPos_Anbi_Quest10020003 1 19900022,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
26 2009 100172052 Street_NPCPos_Temp_Quest10020015 1 19900022,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
27 2010 100172011 Street_NPCPos_Nocha_Quest10020008 1 19900014,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
28 2011 100172041 Street_NPCPos_Anbi_Quest10020006 1 19900026,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
29 2012 100172054 Street_NPCPos_Bangboo_Quest10020018 1 19900026,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
30 2013 100172055 Street_NPCPos_Temp_Quest10020020 1 19900028,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
31 2014 100172056 Street_NPCPos_Temp_Quest10020021 1 19900029,20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
32 2015 100172091 Workshop_NPCPos_SisterLing 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
33 2016 100172058 Street_NPCPos_BangbooA_Quest10020006 0 10000015,20000001 A 2 0,1.8,2,120,10 None 3.0 true true false 0 true false None Small 300101 AvatarCollider:true None 0 0 None None
34 2017 100172059 Street_NPCPos_BangbooB_Quest10020006 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
35 2018 100172060 Street_NPCPos_BangbooC_Quest10020006 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
36 2019 100172061 Street_NPCPos_RamenStore 0 10000013,20000001 A 2 0,2.4,2,150,10 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true noodle:true 0 0 None None
37 2020 100172062 Street_NPCPos_TestS 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
38 2021 100172063 Street_NPCPos_TestL 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
39 2022 100172021 WorkShop_NPCPos_Tsubaki_Quest10020106 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
40 2023 100172064 WorkShop_NPCPos_Salesman_Quest10020103 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
41 2024 100171011 Workshop_NPCPos_Telephone 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
42 2025 100172082 Workshop_NPCPos_HollowPause 0 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
43 2026 100172092 Workshop_NPCPos_HollowPause 0 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
44 2027 100172081 Workshop_NPCPos_SisterLing 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
45 2028 100173001 Workshop_NPCPos_VHSBangboo 0 19900052 A 2 9,2,2,90,10 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
46 2029 100172101 Street_NPCPos_TestBear 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
47 2031 100180131 Street_NPCPos_Quest10020151 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
48 2032 100180714 Street_NPCPos_Quest10020152 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
49 2033 100180812 Workshop_NPCPos_Bangboo05_VHS 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
50 2034 100180161 Street_NPCPos_Quest10020154 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1006 0 0 None None
51 2035 100180714 Street_NPCPos_Quest10020155 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:false None 0 0 None None
52 2036 100180171 Street_NPCPos_Quest10020156 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
53 2037 100180912 Workshop_NPCPos_Bangboo01_VHS 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
54 2038 100180712 Street_NPCPos_Quest10020157 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
55 2039 100180713 Street_NPCPos_Quest10020158 1 100701 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400109 AvatarCollider:true None 0 0 None None
56 2040 100172021 Street_NPCPos_Quest10020118 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
57 2041 100172091 Workshop_NPCPos_ARole4 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
58 2042 100172081 Workshop_NPCPos_ARole4 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
59 2043 100172091 Workshop_NPCPos_ARole5 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
60 2044 100172081 Workshop_NPCPos_ARole5 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
61 2045 100172021 WorkShop_NPCPos_Tsubaki_Quest10020115 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
62 2046 100172091 Workshop_NPCPos_ARole6 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200201 AvatarCollider:true None 0 0 None None
63 2047 100172081 Workshop_NPCPos_ARole6 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
64 2051 100172091 Workshop_NPCPos_ARole1 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
65 2052 100172081 Workshop_NPCPos_ARole1 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
66 2053 100172091 Workshop_NPCPos_ARole2 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
67 2054 100172081 Workshop_NPCPos_ARole2 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
68 2055 100172091 Workshop_NPCPos_ARole3 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
69 2056 100172081 Workshop_NPCPos_ARole3 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
70 2057 100172091 Workshop_NPCPos_ARole7 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
71 2058 100172081 Workshop_NPCPos_ARole7 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
72 2059 100172091 Workshop_NPCPos_ARole8F 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200202 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone:true 1003 0 0 None None
73 2060 100172081 Workshop_NPCPos_ARole8 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200102 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone:true 1004 0 0 None None
74 2061 100172091 Workshop_NPCPos_ARole9 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200201 AvatarCollider:true None 0 0 None None
75 2062 100172081 Workshop_NPCPos_ARole9 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
76 2063 100180719 Street_NPCPos_Gate 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
77 2064 100180712 Street_NPCPos_Quest10020151 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400417 SitDownCollider:true|WallCollider:false|AvatarCollider:false mask:true|computer:true 0,1026 0 0 None None
78 2065 100180812 Workshop_NpcPos_Quest10020151 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
79 2066 100180912 Workshop_NpcPos_Quest10020181 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
80 2067 100172091 Workshop_NPCPos_ARole11 1 20000002 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
81 2068 100172081 Workshop_NPCPos_ARole11 1 20000002 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
82 2069 100172021 WorkShop_NPCPos_Tsubaki_Quest10020119 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
83 2070 100172061 Street_NPCPos_RamenStore 1 20000002 A 2 0,2.4,2,150,10 None 3.0 true true true 0 true false None Middle 200303 AvatarCollider:true noodle:false 0 0 None None
84 2071 100172031 Street_NPCPos_Billy_Quest10020005 1 19900047 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
85 2072 100172041 Street_NPCPos_Anbi_Quest10020005 1 19900048 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
86 2073 100172031 Garage_NPCPos_Billy_Quest10020012 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
87 2074 100172041 Garage_NPCPos_Anbi_Quest10020012 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
88 2075 100172011 Garage_NPCPos_Nocha_Quest10020012 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 false false None Middle 0 AvatarCollider:true None 0 0 None None
89 2077 100172091 Workshop_NPCPos_ARole10 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
90 2078 100172081 Workshop_NPCPos_ARole10 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200104 AvatarCollider:true None 0 0 None None
91 2081 100172091 Workshop_NPCPos_ARole12 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
92 2082 100172081 Workshop_NPCPos_ARole12 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
93 2083 100180812 Street_NPCPos_Joe 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
94 2084 100172042 Street_NPCPos_No11_01 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
95 2085 100180912 Street_NPCPos_Xiute 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
96 2086 100180718 Street_NPCPos_Keli_01 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
97 2087 100172042 Workshop_NPCPos_No11_03 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
98 2088 100180714 Workshop_NPCPos_DrawingRoom 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
99 2089 100180715 Street_NPCPos_Bangboo_Quest10020188 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200702 AvatarCollider:true None 0 0 None None
100 2090 100172042 Street_NPCPos_No11_01End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
101 2091 100172042 Street_NPCPos_No11_02 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
102 2092 100180718 Street_NPCPos_Keli_02 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
103 2093 100180718 Street_NPCPos_Keli_02End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
104 2094 100180717 Street_NPCPos_Quest10020155_02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200701 AvatarCollider:false None 0 0 None 30:200703
105 2095 100172042 Street_NPCPos_No11_03End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
106 2096 100180718 Street_NPCPos_Keli_03End 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
107 2097 100172181 Street_NPCPos_Woof 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200501 AvatarCollider:true None 0 0 None None
108 2098 100172161 WorkShop_NPCPos_Bangboo_Quest10020106 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 200703 AvatarCollider:true None 0 0 None 30:200703
109 2099 100172181 Street_NPCPos_Woof2 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200501 AvatarCollider:true None 0 0 None 45:200502
110 2100 100172181 Street_NPCPos_Woof3 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200503 AvatarCollider:true None 0 0 None None
111 2101 100172091 Garage_NPCPos_Quest10020024 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
112 2102 100172081 Garage_NPCPos_Quest10020024 1 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
113 2103 100172191 Street_NPCPos_Susie 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
114 2104 100172201 Street_NPCPos_TinMaster01 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200602 AvatarCollider:true None 0 0 None None
115 2105 100172201 Street_NPCPos_TinMaster02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 200601 AvatarCollider:true None 0 0 None None
116 2106 100180715 Street_NPCPos_Bangboo_Quest10020140 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
117 2107 100180715 Workshop_NpcPos_Bangboo_Quest10020195 1 20000002 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
118 2108 100180715 Street_NPCPos_Bangboo_Quest10020196 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
119 2109 100180112 Street_NPCPos_PAFUMEI 1 20000002 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400204 AvatarCollider:true None 0 0 None None
120 2110 100180412 Street_NPCPos_MEIKE 1 20000002 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
121 2111 100172101 Street_NPCPos_Ben 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
122 2112 100172071 Street_NPCPos_Anton 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
123 2113 100172211 Street_NPCPos_OokumaMari 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
124 2114 100172231 Street_NPCPos_Enzo 0 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
125 2115 100172041 Street_NPCPos_Anbi02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
126 2116 100172211 Street_NPCPos_OokumaMari02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
127 2117 100172031 Street_NPCPos_Billy02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
128 2118 100172021 Street_NPCPos_Tsubaki 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
129 2119 100172071 Street_NPCPos_Anton02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
130 2120 100172011 Street_NPCPos_Nocha02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
131 2121 100172021 Street_NPCPos_Tsubaki02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
132 2122 100172211 Street_NPCPos_OokumaMari04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
133 2123 100172101 Street_NPCPos_Ben02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
134 2124 100172211 Street_NPCPos_OokumaMari03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
135 2125 100172101 Street_NPCPos_Ben03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
136 2126 100172031 Street_NPCPos_Billy03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
137 2127 100172011 Street_NPCPos_Nocha03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
138 2128 100172021 Street_NPCPos_Tsubaki03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
139 2129 100172041 Street_NPCPos_Anbi03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
140 2130 100172101 Street_NPCPos_Ben04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Large 0 AvatarCollider:true None 0 0 None None
141 2131 100172211 Street_NPCPos_OokumaMari05 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
142 2132 100172071 Street_NPCPos_Anton03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
143 2133 100172011 Street_NPCPos_Nocha04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
144 2134 100172031 Street_NPCPos_Billy04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
145 2135 100172041 Street_NPCPos_Anbi04 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
146 2136 100180715 Workshop_NpcPos_Bangboo_Quest10020141 1 20000002 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
147 2140 100173012 Street_NPCPos_Schroeder02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400418 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false|phone01:true 0,1017 0 0 None None
148 2141 100173012 Street_NPCPos_Schroeder03 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false|phone02:true 0,1017 0 0 None None
149 2142 100172042 Garage_NPCPos_No11 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 200405 AvatarCollider:true None 0 0 None None
150 2143 100172042 Garage_NPCPos_No11_02 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 200403 AvatarCollider:true None 0 0 None None
151 2144 100172042 Garage_NPCPos_No11_03 1 20000002 A 1 2,0,0,0,0 None 3.0 true true true 0 true false None Middle 200405 AvatarCollider:true None 0 0 None None
152 2145 100180712 Street_NPCPos_Shepherd02 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400417 SitDownCollider:true|WallCollider:false|AvatarCollider:false mask:true|computer:true 0,1025 0 0 None None
153 2146 100172091 Workshop_NPCPos_ARole13 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200201 AvatarCollider:true None 0 0 None None
154 2147 100172081 Workshop_NPCPos_ARole13 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200101 AvatarCollider:true None 0 0 None None
155 2148 100172091 Workshop_NPCPos_ARole14 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200202 AvatarCollider:true None 0 0 None None
156 2149 100172081 Workshop_NPCPos_ARole14 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200102 AvatarCollider:true None 0 0 None None
157 2150 100172091 Workshop_NPCPos_ARole15 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
158 2151 100172081 Workshop_NPCPos_ARole15 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
159 2152 100172091 Workshop_NPCPos_ARole16 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200204 SitDownCollider:true|WallCollider:false|AvatarCollider:false computer:true 1027 0 0 None None
160 2153 100172081 Workshop_NPCPos_ARole16F 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200104 AvatarCollider:true None 0 0 None None
161 2154 100172091 Workshop_NPCPos_ARole17F 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200205 AvatarCollider:true gameboy:true 1022 0 0 None None
162 2155 100172081 Workshop_NPCPos_ARole17 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Small 200105 AvatarCollider:true gameboy:true 1022 0 0 None None
163 2156 100172042 Garage_NPCPos_No11_04 1 20000002 A 1 3,0,0,0,0 None 3.0 true true true 0 true false None Middle 200403 AvatarCollider:true None 0 0 None None
164 2157 100172091 Workshop_NPCPos_ARole18 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
165 2158 100172081 Workshop_NPCPos_ARole18 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
166 2159 100172091 Garage_NPCPos_Quest10020120 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200203 AvatarCollider:true None 0 0 None None
167 2160 100172081 Garage_NPCPos_Quest10020120 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 200103 AvatarCollider:true None 0 0 None None
168 3005 100173005 Workshop_NPCPos_Bangboo01_VHS 1 100701 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
169 3006 100173006 Workshop_NPCPos_Bangboo02_VHS 1 100702 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
170 3007 100173007 Workshop_NPCPos_Bangboo03_VHS 1 100703 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
171 3008 100173008 Workshop_NPCPos_Bangboo04_VHS 1 100707 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
172 3009 100173009 Workshop_NPCPos_Bangboo05_VHS 1 100708 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 AvatarCollider:true None 0 0 None None
173 3011 100180711 Workshop_NPCPos_guest01_VHS 1 10200001 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
174 3012 100181411 Workshop_NPCPos_guest02_VHS 1 10200002 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400414 AvatarCollider:true None 0 0 None None
175 3013 100180511 Workshop_NPCPos_guest03_VHS 1 10200003 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
176 3014 100180511 Workshop_NPCPos_guest04_VHS 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400109 AvatarCollider:true None 0 0 None None
177 3015 100180111 Workshop_NPCPos_guest05_VHS 1 10200005 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:true None 0 0 None None
178 3016 100180211 Workshop_NPCPos_guest06_VHS 1 10200006 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400310 AvatarCollider:true None 0 0 None None
179 3017 100180311 Workshop_NPCPos_guest01_VHS 1 10200007 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
180 3018 100180411 Workshop_NPCPos_guest03_VHS 1 10200008 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400311 AvatarCollider:true None 0 0 None None
181 3019 100181111 Workshop_NPCPos_guest02_VHS 1 10200009 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400510 AvatarCollider:true None 0 0 None 30:200703
182 3020 100181011 Workshop_NPCPos_guest04_VHS 1 10200010 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None 30:200703
183 3021 100180713 Workshop_NpcPos_VHS31020001 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400113 AvatarCollider:true bag:false 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2090.png None
184 3022 100180714 Workshop_NpcPos_VHS31020002 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400310 AvatarCollider:true None 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2035.png 30:200703
185 3023 100180715 Workshop_NpcPos_VHS31010001 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None None
186 3024 100180716 Workshop_NpcPos_VHS31010002 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None 30:200703
187 3025 100180713 Workshop_NpcPos_VHS31020001End 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2090.png None
188 3026 100180717 Workshop_NpcPos_VHS31020002_02 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None None
189 3027 100180714 Workshop_NpcPos_VHS31020002End 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400310 AvatarCollider:true None 0 0 UI/Sprite/A1DynamicLoad/IconRoleCircle/UnPacker/IconNPCCircle2035.png None
190 3028 100180717 Workshop_NpcPos_VHS31020002_02End 1 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Small 200701 AvatarCollider:true None 0 0 None None
191 4001 100180711 Street_Passerby_A1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
192 4002 100181111 Street_Passerby_A2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1022 0 0 None None
193 4003 100180311 Street_Passerby_B1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400204 AvatarCollider:true None 0 0 None None
194 4004 100181111 Street_Passerby_B2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
195 4005 100181311 Street_Passerby_C1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400502 AvatarCollider:true phone:true 1029 0 0 None None
196 4006 100181011 Street_Passerby_C2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400506 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false|phone02:true 0,1003 0 0 None None
197 4007 100181511 Street_Passerby_D1 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
198 4008 100180811 Street_Passerby_D2 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400421 AvatarCollider:true phone:true 1016 0 0 None None
199 4009 100180711 Street_Passerby_09 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true|bag:false 1014,0 0 0 None None
200 4010 100180811 Street_Passerby_10 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400419 AvatarCollider:true None 0 0 None None
201 4011 100180911 Street_Passerby_11 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
202 4012 100181111 Street_Passerby_12 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
203 4013 100181311 Street_Passerby_13 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400510 AvatarCollider:true None 0 0 None None
204 4014 100180111 Street_Passerby_14 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400203 AvatarCollider:true None 0 0 None None
205 4015 100181311 Street_Passerby_15 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400510 AvatarCollider:true None 0 0 None None
206 4016 100180311 Street_Passerby_16 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
207 4017 100180111 Street_Passerby_17 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
208 4018 100180411 Street_Passerby_18 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400312 AvatarCollider:true None 0 0 None None
209 4019 100180711 Street_Passerby_19 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
210 4020 100181511 Street_Passerby_20 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
211 4021 100180911 Street_Passerby_21 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
212 4022 100180111 Street_Passerby_22 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
213 4023 100180511 Street_Passerby_23 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
214 4024 100181011 Street_Passerby_24 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true bag:false 0 0 None None
215 4025 100180811 Street_Passerby_25 1 C 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
216 4026 100180111 Street_Passerby_26 1 D 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
217 4027 100180211 Street_Passerby_27 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400308 AvatarCollider:true None 0 0 None None
218 4028 100180311 Street_Passerby_28 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1010 0 0 None None
219 4029 100181111 Street_Passerby_29 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
220 4030 100180411 Street_Passerby_30 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400312 AvatarCollider:false None 0 0 None None
221 4031 100180111 Street_Passerby_31 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400214 AvatarCollider:true None 0 0 None None
222 4032 100180411 Street_Passerby_32 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
223 4033 100181411 Street_Passerby_33 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400419 AvatarCollider:true None 0 0 None None
224 4034 100180611 Street_Passerby_34 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
225 4035 100181511 Street_Passerby_35 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
226 4036 100180711 Street_Passerby_36 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1016 0 0 None None
227 4037 100181111 Street_Passerby_37 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
228 4038 100180611 Street_Passerby_38 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true bag:false 0 0 None None
229 4039 100181311 Street_Passerby_39 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
230 4040 100180711 Street_Passerby_40 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1021 0 0 None None
231 4041 100180211 Street_Passerby_41 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:true None 0 0 None None
232 4042 100181411 Street_Passerby_42 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true mask:false 0 0 None None
233 4043 100180311 Street_Passerby_43 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400214 AvatarCollider:true None 0 0 None None
234 4044 100180611 Street_Passerby_44 1 B 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1012 0 0 None None
235 4045 100180511 Street_Passerby_45 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1008 0 0 None None
236 4046 100181511 Street_Passerby_46 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400114 AvatarCollider:true bag:false 0 0 None None
237 4047 100180111 Street_Passerby_47 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400211 AvatarCollider:true None 0 0 None None
238 4048 100181511 Street_Passerby_48 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
239 4049 100180411 Street_Passerby_49 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1011 0 0 None None
240 4050 100181011 Street_Passerby_50 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
241 4051 100180911 Street_Passerby_51 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
242 4052 100180411 Street_Passerby_52 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
243 4053 100180111 Street_Passerby_53 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400216 AvatarCollider:true mask:true 0 0 None None
244 4054 100181111 Street_Passerby_54 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400513 AvatarCollider:true gameboy02:true|bag:false 1023 0 0 None None
245 4055 100181411 Street_Passerby_55 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1017 0 0 None None
246 4056 100180511 Street_Passerby_56 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true mask:false 0 0 None None
247 4057 100180711 Street_Passerby_57 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
248 4058 100180811 Street_Passerby_58 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400103 AvatarCollider:true None 0 0 None None
249 4059 100180611 Street_Passerby_59 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
250 4060 100181511 Street_Passerby_60 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true None 0 0 None None
251 4061 100180711 Street_Passerby_61 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400410 SitDownCollider:true|WallCollider:false|AvatarCollider:false computer:true|bag:false 1025,0 0 0 None None
252 4062 100180511 Street_Passerby_62 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400108 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe:true|bag:false 1011,0 0 0 None None
253 4063 100180211 Street_Passerby_63 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1006 0 0 None None
254 4064 100180311 Street_Passerby_64 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400215 AvatarCollider:true None 0 0 None None
255 4065 100181411 Street_Passerby_65 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1017 0 0 None None
256 4066 100180511 Street_Passerby_66 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
257 4067 100181311 Street_Passerby_67 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
258 4068 100181311 Street_Passerby_68 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
259 4069 100181011 Street_Passerby_69 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
260 4070 100180511 Street_Passerby_70 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1011 0 0 None None
261 4071 100180311 Street_Passerby_71 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
262 4072 100180311 Street_Passerby_72 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1007 0 0 None None
263 4073 100180211 Street_Passerby_73 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
264 4074 100181011 Street_Passerby_74 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
265 4075 100180711 Street_Passerby_75 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400408 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
266 4076 100180811 Street_Passerby_76 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400414 AvatarCollider:true None 0 0 None None
267 4077 100180611 Street_Passerby_77 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1013 0 0 None None
268 4078 100180411 Street_Passerby_78 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1007 0 0 None None
269 4079 100181511 Street_Passerby_79 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
270 4080 100180611 Street_Passerby_80 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
271 4081 100180711 Street_Passerby_81 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400405 AvatarCollider:true None 0 0 None None
272 4082 100180111 Street_Passerby_82 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400211 AvatarCollider:true None 0 0 None None
273 4083 100180411 Street_Passerby_83 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1003 0 0 None None
274 4084 100180311 Street_Passerby_84 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400204 AvatarCollider:true mask:false 0 0 None None
275 4085 100180411 Street_Passerby_85 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400308 AvatarCollider:true None 0 0 None None
276 4086 100180111 Street_Passerby_86 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
277 4087 100180211 Street_Passerby_87 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
278 4088 100180311 Street_Passerby_88 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
279 4089 100180311 Street_Passerby_89 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1004 0 0 None None
280 4090 100180111 Street_Passerby_90 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400207 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone:true 1010 0 0 None None
281 4091 100180411 Street_Passerby_91 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
282 4092 100180511 Street_Passerby_92 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1010,0 0 0 None None
283 4093 100180411 Street_Passerby_93 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
284 4094 100180811 Street_Passerby_94 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400421 AvatarCollider:true phone:true 1015 0 0 None None
285 4095 100181411 Street_Passerby_95 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1021 0 0 None None
286 4096 100180711 Street_Passerby_96 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400402 AvatarCollider:true phone:true 1019 0 0 None None
287 4097 100181411 Street_Passerby_97 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true bag:false 0 0 None None
288 4098 100181411 Street_Passerby_98 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
289 4099 100180811 Street_Passerby_99 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400408 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
290 4100 100180811 Street_Passerby_100 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true None 0 0 None None
291 4101 100180811 Street_Passerby_101 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400404 AvatarCollider:true phone02:true 0 0 None None
292 4102 100180711 Street_Passerby_102 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400408 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
293 4103 100181111 Street_Passerby_103 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
294 4104 100181111 Street_Passerby_104 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
295 4105 100181111 Street_Passerby_105 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400502 AvatarCollider:true phone:true 1028 0 0 None None
296 4106 100181011 Street_Passerby_106 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
297 4107 100180911 Street_Passerby_107 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
298 4108 100181111 Street_Passerby_108 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
299 4109 100181511 Street_Passerby_109 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400106 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_bench:true|bag:false 1004,0 0 0 None None
300 4110 100181511 Street_Passerby_110 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
301 4111 100180611 Street_Passerby_111 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
302 4112 100181511 Street_Passerby_112 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400115 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe02:true 1006 0 0 None None
303 4113 100180611 Street_Passerby_113 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
304 4114 100181511 Street_Passerby_114 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:true None 0 0 None None
305 4115 100181311 Street_Passerby_115 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
306 4116 100181311 Street_Passerby_116 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1022 0 0 None None
307 4117 100180611 Street_Passerby_117 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400108 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe:true 1008 0 0 None None
308 4118 100181011 Street_Passerby_118 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
309 4119 100180211 Street_Passerby_119 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1009 0 0 None None
310 4120 100180811 Street_Passerby_120 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400410 SitDownCollider:true|WallCollider:false|AvatarCollider:false computer:true|bag:false 1026,0 0 0 None None
311 4123 100180811 Street_Passerby_123 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
312 4124 100180611 Street_Passerby_124 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1013,0 0 0 None None
313 4125 100180711 Street_Passerby_125 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
314 4126 100181511 Street_Passerby_126 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1011,0 0 0 None None
315 4127 100180911 Street_Passerby_127 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400507 SitDownCollider:true|WallCollider:false|AvatarCollider:false gameboy:true 1023 0 0 None None
316 4128 100181511 Street_Passerby_128 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400107 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_ramen:true|bag:false 1005,0 0 0 None None
317 4129 100180811 Street_Passerby_129 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
318 4130 100180711 Street_Passerby_130 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400420 AvatarCollider:true bag:false 0 0 None None
319 4131 100180711 Street_Passerby_131 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400409 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
320 4132 100180511 Street_Passerby_132 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1006 0 0 None None
321 4133 100180611 Workshop_Passerby_133 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
322 4134 100181511 Workshop_Passerby_134 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
323 4135 100180611 Workshop_Passerby_135 1 10200004 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true None 0 0 None None
324 4136 100180311 Workshop_Passerby_136 1 10200006 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 5000 5000 None None
325 4137 100180411 Workshop_Passerby_137 1 10200006 A 1 1,0,0,0,0 None 3.0 true true false 0 true false None Middle 400309 AvatarCollider:true None 5000 5000 None None
326 4138 100180811 Workshop_Passerby_138 1 20000002 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true None 0 0 None None
327 4139 100173241 Street_Passerby_139 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
328 4140 100173242 Street_Passerby_140 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
329 4141 100173243 Street_Passerby_141 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400302 AvatarCollider:true phone:true 1006 0 0 None None
330 4142 100173244 Street_Passerby_142 3 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400118 AvatarCollider:true None 0 0 None None
331 4143 100173245 Street_Passerby_143 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
332 4144 100173246 Street_Passerby_144 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
333 4145 100173247 Street_Passerby_145 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
334 4146 100173248 Street_Passerby_146 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400116 AvatarCollider:true bag:false 0 0 None None
335 4147 100173249 Street_Passerby_147 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
336 4148 100173250 Street_Passerby_148 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
337 4149 100173251 Street_Passerby_149 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400216 AvatarCollider:true None 0 0 None None
338 4150 100173252 Street_Passerby_150 3 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 400111 AvatarCollider:true None 0 0 None None
339 4151 100180811 Street_Passerby_151 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400416 SitDownCollider:true|WallCollider:false|AvatarCollider:false None 0 0 None None
340 4152 100180711 Street_Passerby_152 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400418 AvatarCollider:true None 0 0 None 30:200703
341 4153 100181111 Street_Passerby_153 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400508 AvatarCollider:true None 0 0 None None
342 4501 100173501 Street_Passerby_501 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400512 AvatarCollider:true None 0 0 None None
343 4502 100173502 Street_Passerby_502 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400117 AvatarCollider:true bag:false 0 0 None None
344 4503 100173503 Street_Passerby_503 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 200703 AvatarCollider:true None 0 0 None None
345 4504 100173010 Street_Passerby_121 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400303 AvatarCollider:true None 0 0 None None
346 4505 100173011 Street_Passerby_122 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400213 AvatarCollider:true None 0 0 None None
347 4506 100173012 Street_NPCPos_Schroeder 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 400418 SitDownCollider:true|WallCollider:false|AvatarCollider:false bag:false 0 0 None None
348 4507 100173504 Street_Passerby_507 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400412 AvatarCollider:true None 0 0 None None
349 4508 100173505 Street_Passerby_508 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
350 4509 100173506 Street_Passerby_509 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
351 4510 100173507 Street_Passerby_510 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400108 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe:true|bag:false 1007,0 0 0 None None
352 4511 100173508 Street_Passerby_511 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400411 AvatarCollider:true None 0 0 None None
353 4512 100173509 Street_Passerby_512 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400115 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_cafe02:true 1012,0 0 0 None None
354 4513 100173510 Street_Passerby_513 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
355 4514 100173511 Street_Passerby_514 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400213 AvatarCollider:true None 0 0 None None
356 4515 100173512 Street_Passerby_515 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400313 AvatarCollider:true bag:false|phone02:true 0,1006 0 0 None None
357 4516 100173513 Street_Passerby_516 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400202 AvatarCollider:true phone:true 1003 0 0 None None
358 4517 100173514 Street_Passerby_517 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400210 AvatarCollider:true None 0 0 None None
359 4518 100173515 Street_Passerby_518 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
360 4519 100173516 Street_Passerby_519 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400102 AvatarCollider:true phone_idle:true 1013 0 0 None None
361 4520 100173517 Street_Passerby_520 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
362 4521 100173518 Street_Passerby_521 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400418 AvatarCollider:true bag:false|mask:false 0 0 None None
363 4522 100173519 Street_Passerby_522 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400403 AvatarCollider:true bag:false 0 0 None None
364 4523 100173520 Street_Passerby_523 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400401 AvatarCollider:true None 0 0 None None
365 4524 100173521 Street_Passerby_524 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400106 SitDownCollider:true|WallCollider:false|AvatarCollider:false phone_bench:true|mask:false|bag:false 1013,0,0 0 0 None None
366 4525 100173522 Street_Passerby_525 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400211 AvatarCollider:true None 0 0 None None
367 4526 100173523 Street_Passerby_526 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
368 4527 100173524 Street_Passerby_527 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400413 AvatarCollider:true None 0 0 None None
369 4528 100173525 Street_Passerby_528 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true None 0 0 None None
370 4529 100173526 Street_Passerby_529 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
371 4530 100173527 Street_Passerby_530 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400110 AvatarCollider:true None 0 0 None None
372 4531 100173528 Street_Passerby_531 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400511 AvatarCollider:true None 0 0 None None
373 4532 100173529 Street_Passerby_532 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400509 AvatarCollider:true None 0 0 None None
374 4533 100173530 Street_Passerby_533 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
375 4534 100173531 Street_Passerby_534 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400415 AvatarCollider:true None 0 0 None None
376 4535 100173532 Street_Passerby_535 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400112 AvatarCollider:true bag:false 0 0 None None
377 4536 100173249 Street_Passerby_536 3 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400503 AvatarCollider:true mask:false 0 0 None None
378 5001 100180191 Garage_Object_Car_01 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None
379 5002 100180191 Street_NPCPos_Car_Quest10020005 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None
380 5003 100171011 Street_ObjectPos_Newsstand 0 70000001 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
381 5004 100171011 Street_ObjectPos_02 0 70000002 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
382 5005 100171011 Street_ObjectPos_03 0 70000003 A 1 2,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
383 5006 100171011 Street_ObjectPos_04 0 70000004 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
384 5007 100171011 Street_ObjectPos_05 0 70000005 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
385 5008 100171011 Street_ObjectPos_06 0 70000006 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
386 5009 100171011 Street_ObjectPos_07 0 70000007 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
387 5010 100171011 Street_ObjectPos_08 0 70000008 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
388 5011 100171011 Street_ObjectPos_09 0 70000009 A 1 1.5,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
389 5012 100171011 Street_ObjectPos_10 0 70000010 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
390 5013 100171011 Street_ObjectPos_11 0 70000011 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Large 0 None None 0 0 None None
391 5014 100171011 Street_ObjectPos_12 0 70000012 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
392 5015 100171011 Street_ObjectPos_13 0 70000013 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
393 5016 100171011 Garage_ObjectPos_14 0 70000014 A 1 3,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
394 5017 100171011 Garage_ObjectPos_15 0 70000015 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
395 5018 100171011 Garage_ObjectPos_16 0 70000016 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
396 5019 100171011 Garage_ObjectPos_17 0 70000017 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Middle 0 None None 0 0 None None
397 5020 100171011 Garage_ObjectPos_18 0 70000018 A 1 1,0,0,0,0 None 3.0 true true false 0 false false None Small 0 None None 0 0 None None
398 6001 100185001 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400217 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 5000 None None
399 6002 100185014 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 4000 27000 None None
400 6003 100185004 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400314 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 3000 45000 None None
401 6004 100185015 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7600 70000 None None
402 6005 100185008 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 2540 86000 None None
403 6006 100185005 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7600 100000 None None
404 6007 100185002 Way8 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 10000 0 None None
405 6008 100185007 Way14 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400423 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1014 21100 0 None None
406 6009 100185013 Way14 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400505 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1008 0 36000 None None
407 6010 100185006 Way14 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400105 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1015 20400 72000 None None
408 6011 100185011 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 11600 0 None None
409 6012 100185003 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 6700 32000 None None
410 6013 100185001 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400206 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1004 0 64000 None None
411 6014 100185010 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 11600 96000 None None
412 6015 100185003 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 0 None None
413 6016 100185001 Way13 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 0 None None
414 6017 100185005 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 2960 0 None None
415 6018 100185014 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 36000 None None
416 6019 100185015 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 2960 72000 None None
417 6020 100185003 Way19 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400206 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1006 0 0 None None
418 6021 100185009 Way19 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 13000 36000 None None
419 6022 100185001 Way19 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7500 72000 None None
420 6023 100185008 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 10000 None None
421 6024 100185006 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 3000 46000 None None
422 6025 100185007 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 82000 None None
423 6026 100185015 Way10 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400105 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1017 2700 0 None None
424 6027 100185007 Way10 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400423 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1016 8700 36000 None None
425 6028 100185004 Way10 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400305 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1010 0 72000 None None
426 6029 100185006 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 2960 0 None None
427 6030 100185008 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 48000 None None
428 6031 100185005 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 12000 0 None None
429 6032 100185002 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 8000 20000 None None
430 6033 100185008 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 530 38000 None None
431 6034 100185004 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400314 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 56000 None None
432 6035 100185006 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 12000 84000 None None
433 6036 100185007 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400407 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 530 96000 None None
434 6037 100185005 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 5000 96000 None None
435 6038 100185014 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 0 None None
436 6039 100185007 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 36000 None None
437 6040 100185015 Way17 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 2960 72000 None None
438 6041 100185001 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400206 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone:true 1010 0 5000 None None
439 6042 100185003 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 7500 37000 None None
440 6043 100185011 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 13000 69000 None None
441 6044 100185010 Way12 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 13000 101000 None None
442 6045 100185003 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400304 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 76000 None None
443 6046 100185001 Way6 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400406 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 4000 95000 None None
444 6047 100185009 Way11 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 5500 0 None None
445 6048 100185003 Way11 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400205 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 36000 None None
446 6049 100185011 Way11 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400504 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 5500 72000 None None
447 6050 100185010 Way9 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400514 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true gameboy_walk:true 1023 0 0 None None
448 6051 100185013 Way9 2 A 1 2,0,0,0,0 None 3.0 true true false 50001 true false None Middle 400505 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true phone_walk:true 1011 0 36000 None None
449 6052 100185008 Way9 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400422 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 72000 None None
450 6053 100185006 Way18 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400120 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 6300 0 None None
451 6054 100185015 Way18 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400119 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true bag:false 18000 36000 None None
452 6055 100185002 Way18 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 400314 SitDownCollider:false|AvatarCollider:false|WalkCollider:false|WallCollider:true None 0 72000 None None
453 7001 100184011 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
454 7002 100184021 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
455 7003 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
456 7004 100184211 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
457 7005 100184011 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
458 7006 100184021 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
459 7007 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
460 7008 100184221 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
461 7009 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
462 7010 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
463 7011 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
464 7012 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
465 7013 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
466 7014 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
467 7015 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
468 7016 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
469 7017 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
470 7018 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
471 7101 100184011 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
472 7102 100184021 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
473 7103 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
474 7104 100184211 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
475 7105 100184011 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 10000 None None
476 7106 100184021 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 0 None None
477 7107 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
478 7108 100184221 Way103 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 600000 60000 None None
479 7109 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
480 7110 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 30000 None None
481 7111 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
482 7112 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 49000 None None
483 7113 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 39000 None None
484 7114 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 60000 55000 None None
485 7115 100184111 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
486 7116 100184111 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
487 7117 100184121 Way101 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 5000 None None
488 7118 100184121 Way102 2 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 AvatarCollider:false|WalkCollider:false|WallCollider:true None 30000 0 None None
489 9001 100171011 Street_NPCPos_Test 0 10000008 A 1 2,0,0,0,0 None 3.0 true true false 0 true false None Small 0 None None 0 0 None None
490 9002 100170111 Street_NPCPos_Test 0 19900001 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Small 0 None None 0 0 None None
491 9003 100170111 Street_NPCPos_Test 0 19900000 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Small 0 None None 0 0 None None
492 9004 100170111 Street_NPCPos_Test 0 19900000 B 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
493 9005 100172011 Street_NPCPos_Test 0 19900002 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
494 9006 100172021 Street_NPCPos_Test 0 19900003 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Small 0 None None 0 0 None None
495 9007 10086 Workshop_NPCPos_Test 0 100860 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None
496 9008 100172011 Workshop_NPCPos_Test 1 10000003 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
497 9009 100172053 Street_NPCPos_Quest 1 A 1 2,0,0,0,0 None 3.0 true true false 0 true true None Middle 0 None None 0 0 None None
498 9010 100172091 Workshop_NPCPos_ARoleTest 1 A 1 3,0,0,0,0 None 3.0 true true false 0 true false None Middle 0 None None 0 0 None None

View file

@ -0,0 +1,443 @@
ID PositionX PositionY PositionZ RotationX RotationY RotationZ Section
Street_Teleport_ToGrocery -16.73 0.3 -5.624 0.0 180.0 0.0 1
Street_Teleport_ToRamenStore 5.41 0.32 -1.36 0.0 0.0 0.0 1
Street_Teleport_ToAudioVideoStore 18.23 0.36 -9.16 0.0 180.0 0.0 1
Street_PlayerPos_Default 29.125 0.0 -4.375 0.0 270.0 0.0 1
Street_PlayerPos_FromWorkshop 17.541 0.34003 5.481 0.0 193.27106 0.0 1
Street_PlayerPos_FromGarage 12.89 0.34 10.71725 0.0 179.08109 0.0 1
Street_PlayerPos_FromGrocery -17.177 0.0 0.0 0.0 0.0 0.0 1
Street_NPCPos_ToWorkshop 18.243 0.557 8.079 0.0 209.99998 0.0 1
Street_NPCPos_Smithy 18.208 0.95 -12.138 0.0 180.0 0.0 1
Street_NPCPos_ToGarage 12.83 0.39287 14.673 0.0 180.0 0.0 1
Street_NPCPos_Test 0.75 0.31757 -4.5 0.0 90.0 0.0 1
Street_NPCPos_Quest 7.875 0.5 -2.125 0.0 185.0 0.0 1
Street_NPCPos_RamenStore 5.678 0.9 1.753 0.0 185.0 0.0 1
Street_NPCPos_TestS 6.761 0.3 -2.028 0.0 185.0 0.0 1
Street_NPCPos_TestL 9.04 0.5 -2.227 0.0 185.0 0.0 1
Street_NPCPos_Billy_Quest10020005 37.245 0.35 -1.786 0.0 0.0 0.0 1
Street_NPCPos_Anbi_Quest10020005 -22.37 0.36 -7.05 0.0 180.0 0.0 1
Street_NPCPos_Car_Quest10020005 37.43 0.75 3.26 0.0 270.0 0.0 1
Street_NPCPos_Temp_Quest10020005 20.275 0.35 -10.2 0.0 326.98425 0.0 1
Street_NPCPos_Billy_Quest10020006 -28.05087 0.5 -4.7 0.0 52.99999 0.0 1
Street_NPCPos_Anbi_Quest10020006 -26.5 0.5 -5.98 0.0 0.0 0.0 1
Street_NPCPos_Nocha_Quest10020008 -1.042 0.393 -3.014 0.0 90.0 0.0 1
Street_NPCPos_Temp_Quest10020015 19.36 0.393 1.37 0.0 29.52794 0.0 1
Street_NPCPos_Bangboo_Quest10020018 11.3 0.393 -0.25 0.0 180.0 0.0 1
Street_NPCPos_Temp_Quest10020020 -9.17 0.393 -10.86 0.0 0.0 0.0 1
Street_NPCPos_Temp_Quest10020021 6.67203 0.393 -8.174 0.0 84.99999 0.0 1
Street_NPCPos_BangbooA_Quest10020006 -16.869 0.729 -8.124 0.0 0.0 0.0 1
Street_NPCPos_BangbooB_Quest10020006 -17.556 0.729 -8.124 0.0 0.0 0.0 1
Street_NPCPos_BangbooC_Quest10020006 -16.186 0.729 -8.097 0.0 0.0 0.0 1
Street_CameraPos_Grocery -16.866 0.98 -1.508 0.0 180.0 0.0 1
Street_CameraPos_RamenStore 2.48 2.45 -2.52 10.60003 45.5 0.0 1
Street_CameraPos_RamenStore_PC 2.67 2.4 -2.29 10.8 44.0 0.0 1
Street_CameraPos_Workshop 18.71 0.91 -9.14 10.60001 180.0 0.0 1
TriggerPos_1 35.5 0.31757 -4.5 0.0 270.0 0.0 1
Street_NPCPos_Grocery -18.928 0.95 -9.358 0.0 324.60001 0.0 1
Street_NPCPos_TestBear 10.929 0.5 -2.392 0.0 185.0 0.0 1
Street_PlayerPos_FromGarage2 4.15 0.0 19.17 0.0 270.0 0.0 1
Street_NPCPos_ToGarage2 8.618 0.39287 19.235 0.0 270.0 0.0 1
Street_Passerby_A1 6.168 0.35 0.017 0.0 0.0 0.0 1
Street_Passerby_A2 7.0 0.48 -0.027 0.0 0.0 0.0 1
Street_Passerby_B1 14.832 0.35 1.667 0.0 169.99998 0.0 1
Street_Passerby_B2 15.41 0.35 1.09 0.0 240.0 0.0 1
Street_Passerby_C1 -27.068 0.35 5.609 0.0 230.92207 0.0 1
Street_Passerby_C2 -26.701 0.35 6.222 0.0 298.08884 0.0 1
Street_Passerby_D1 -12.857 0.35 -11.668 0.0 32.81414 0.0 1
Street_Passerby_D2 -12.635 0.35 -10.965 0.0 189.98178 0.0 1
Street_ObjectPos_08 -14.573 -0.013 -12.512 0.0 0.0 0.0 1
Street_ObjectPos_10 -14.303 1.375 -11.119 0.0 0.0 0.0 1
Street_ObjectPos_09 -13.948 0.092 -18.786 0.0 0.0 0.0 1
Street_Passerby_09 -5.95 0.35 11.106 0.0 32.66373 0.0 1
Street_Passerby_10 -5.734 0.35 12.094 0.0 176.94084 0.0 1
Street_Passerby_11 2.162 0.4 -9.208 0.0 86.23466 0.0 1
Street_Passerby_12 2.898 0.4 -9.705 0.0 344.81543 0.0 1
Street_Passerby_13 16.917 0.35 -10.73 0.0 196.76297 0.0 1
Street_Passerby_14 16.337 0.35 -10.233 0.0 150.0 0.0 1
Street_Passerby_15 21.459 0.36 -8.39 0.0 231.98558 0.0 1
Street_Passerby_16 20.742 0.35 -8.932 0.0 48.55833 0.0 1
Street_Passerby_17 15.15 0.35 7.51 0.0 212.18704 0.0 1
Street_Passerby_18 14.808 0.35 6.799 0.0 29.95915 0.0 1
Street_Passerby_19 -9.383 0.35 -0.624 0.0 261.22681 0.0 1
Street_Passerby_20 -10.141 0.35 -1.371 0.0 64.0559 0.0 1
Street_Passerby_21 -17.508 0.35 -0.558 0.0 339.64786 0.0 1
Street_Passerby_22 -17.19 0.35 0.057 0.0 286.36243 0.0 1
Street_Passerby_23 -11.63 0.35 -18.32 0.0 291.77817 0.0 1
Street_Passerby_24 -12.63 0.35 -18.43 0.0 27.8 0.0 1
Street_Passerby_25 -11.539 0.35 -17.535 0.0 234.79996 0.0 1
Street_Passerby_26 -13.04 0.35 -18.03 0.0 66.79999 0.0 1
Street_Passerby_27 -26.85 0.569 12.797 0.0 20.89114 0.0 1
Street_Passerby_28 -27.431 0.38 13.319 0.0 223.54056 0.0 1
Street_Passerby_29 22.296 0.35 -8.766 0.0 151.64432 0.0 1
Street_Passerby_30 22.839 0.528 -9.841 0.0 332.39041 0.0 1
Street_Passerby_31 -34.693 0.373 12.751 0.0 324.8782 0.0 1
Street_Passerby_32 -35.538 0.3793 13.14 0.0 116.70426 0.0 1
Street_NPCPos_Quest10020151 -4.574 0.3346 1.6568 0.0 10.32042 0.0 1
Street_NPCPos_Quest10020152 14.23 0.35 -9.95 0.0 0.0 0.0 1
Street_NPCPos_Quest10020153 11.12 0.4 -8.17 0.0 0.0 0.0 1
Street_NPCPos_Quest10020154 24.721 0.348 4.248 0.0 289.53577 0.0 1
Street_NPCPos_Quest10020155 -1.79 0.395 -21.504 0.0 321.61935 0.0 1
Street_NPCPos_Quest10020156 27.16 0.35 -1.49 0.0 190.0 0.0 1
Street_NPCPos_Quest10020157 3.28 0.35 1.465 0.0 90.0 0.0 1
Street_NPCPos_Quest10020158 1.35 0.4 -1.38 0.0 180.0 0.0 1
Street_Passerby_33 -26.297 0.35 -8.271 0.0 123.11625 0.0 1
Street_Passerby_34 -25.442 0.35 -8.919 0.0 318.86185 0.0 1
Street_Passerby_35 10.662 0.37 1.331 0.0 233.42654 0.0 1
Street_Passerby_36 10.038 0.36 1.146 0.0 193.91667 0.0 1
Street_Passerby_37 1.222 0.35 17.124 0.0 73.19746 0.0 1
Street_Passerby_38 2.177 0.35 17.239 0.0 295.93552 0.0 1
Street_Passerby_39 -7.65 0.35 -11.34 0.0 317.07599 0.0 1
Street_Passerby_40 -8.56 0.35 -10.89 0.0 62.40825 0.0 1
Street_Passerby_41 -21.485 0.35 -7.556 0.0 231.75189 0.0 1
Street_Passerby_42 -22.217 0.36 -7.046 0.0 135.27699 0.0 1
Street_Passerby_43 -26.552 0.355 0.922 0.0 329.71353 0.0 1
Street_Passerby_44 -26.563 0.36 1.809 0.0 203.36967 0.0 1
Street_Passerby_45 -29.2 0.39 -5.888 0.0 61.42846 0.0 1
Street_Passerby_46 -14.932 0.35 -29.664 0.0 79.99999 0.0 1
Street_Passerby_47 11.51 0.35 -13.93 0.0 209.63834 0.0 1
Street_Passerby_48 -22.751 0.36 -7.545 0.0 109.76276 0.0 1
Street_Passerby_49 2.386 0.4 -9.954 0.0 19.77401 0.0 1
Street_Passerby_50 3.13 0.4 -9.31 0.0 245.81375 0.0 1
Street_Passerby_51 -2.53 0.35 -29.03 0.0 20.00001 0.0 1
Street_ObjectPos_11 -6.0202 1.62 -36.027 0.0 0.0 0.0 1
Street_Passerby_52 -1.89 0.35 -29.04 0.0 330.0 0.0 1
Street_Passerby_53 -5.976 0.35 -1.683 0.0 295.77307 0.0 1
Street_Passerby_54 -6.768 0.35 -1.331 0.0 119.76264 0.0 1
Street_Passerby_55 2.566 0.35 -1.384 0.0 65.57031 0.0 1
Street_Passerby_56 3.203 0.35 -1.407 0.0 340.54376 0.0 1
Street_Passerby_57 -19.31 0.35 -7.24 0.0 50.0 0.0 1
Street_Passerby_58 -18.45 0.35 -6.99 0.0 270.0 0.0 1
Street_Passerby_59 -2.315 0.35 -25.478 0.0 240.0 0.0 1
Street_Passerby_60 -2.538 0.35 -26.063 0.0 20.00001 0.0 1
Street_Passerby_61 -4.613 0.3373 0.009 0.0 171.87192 0.0 1
Street_Passerby_62 -4.637 0.357 1.647 0.0 184.25121 0.0 1
Street_Passerby_63 16.305 0.35 -10.866 0.0 69.14664 0.0 1
Street_Passerby_64 17.0 0.35 -10.3 0.0 212.32573 0.0 1
Street_Passerby_65 9.307 0.38 -28.054 0.0 205.75116 0.0 1
Street_Passerby_66 9.613 0.38 -29.102 0.0 332.5571 0.0 1
Street_Passerby_67 -7.099 0.4991 11.649 0.0 63.06116 0.0 1
Street_Passerby_68 -6.042 0.35 12.561 0.0 227.34982 0.0 1
Street_Passerby_69 22.433 0.35 6.054 0.0 317.61322 0.0 1
Street_Passerby_70 -19.002 0.35 -1.416 0.0 154.39163 0.0 1
Street_Passerby_71 -25.812 0.71 15.861 0.0 317.13211 0.0 1
Street_ObjectPos_06 -26.43 1.8 16.614 0.0 0.0 0.0 1
Street_ObjectPos_07 -24.915 0.996 12.736 0.0 0.0 0.0 1
Street_Passerby_72 32.834 0.35 -7.017 0.0 325.03073 0.0 1
Street_Passerby_73 -7.586 0.4 -0.346 0.0 136.72357 0.0 1
Street_Passerby_74 -26.168 0.5651 12.814 0.0 205.99687 0.0 1
Street_ObjectPos_05 -26.783 1.263 10.008 0.0 110.0 0.0 1
Street_Passerby_75 -26.378 0.35 6.141 0.0 288.5228 0.0 1
Street_Passerby_76 -6.893 0.64 15.257 0.0 50.22827 0.0 1
Street_Passerby_77 -11.306 0.35 -9.496 0.0 119.16231 0.0 1
Street_Passerby_78 -32.834 0.35 -2.719 0.0 50.0 0.0 1
Street_ObjectPos_02 -35.7 1.556 -6.62 0.0 0.0 0.0 1
Street_Passerby_79 -35.854 0.38 4.449 0.0 330.0 0.0 1
Street_Passerby_80 -0.168 0.388 21.145 0.0 247.54602 0.0 1
Street_ObjectPos_13 1.141 0.836 15.84 0.0 0.0 0.0 1
Street_Passerby_81 9.372 0.36 -8.746 0.0 319.89386 0.0 1
Street_NPCPos_Quest10020118 0.46 0.4 16.07 0.0 132.127 0.0 1
Street_NPCPos_Joe 14.487 0.344 7.658 0.0 117.47181 0.0 1
Street_Passerby_82 1.345 0.35 -29.269 0.0 318.21954 0.0 1
Street_Passerby_83 -29.28 0.36 -6.019 0.0 92.8725 0.0 1
Street_Passerby_84 -20.485 0.35 -8.332 0.0 218.35194 0.0 1
Street_Passerby_85 11.059 0.35 5.281 0.0 120.00001 0.0 1
Street_Passerby_86 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_Passerby_87 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_Passerby_88 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_Passerby_89 12.743 0.35 -10.13 0.0 52.06183 0.0 1
Street_Passerby_90 -26.65 0.36 6.866 0.0 260.0 0.0 1
Street_Passerby_91 -13.317 0.35 -1.324 0.0 154.53731 0.0 1
Street_Passerby_92 7.02 0.33 0.0589 0.0 0.0 0.0 1
Street_Passerby_93 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_Passerby_94 24.156 0.36 -0.589 0.0 258.23029 0.0 1
Street_Passerby_95 -8.074 0.35 -11.114 0.0 321.74228 0.0 1
Street_Passerby_96 32.996 0.35 -7.036 0.0 298.86584 0.0 1
Street_Passerby_97 -2.633 0.35 -25.815 0.0 294.18304 0.0 1
Street_Passerby_98 -14.06 0.36 -7.276 0.0 289.05328 0.0 1
Street_Passerby_99 -26.389 0.356 7.356 0.0 257.54462 0.0 1
Street_Passerby_100 28.999 0.36 -7.249 0.0 36.28022 0.0 1
Street_Passerby_101 4.87 0.36 -29.65 0.0 180.0 0.0 1
Street_Passerby_102 -26.387 0.35 7.338 0.0 249.63678 0.0 1
Street_Passerby_103 12.09 0.31 -5.24 0.0 320.0 0.0 1
Street_Passerby_104 14.6 0.36 8.1 0.0 210.0 0.0 1
Street_Passerby_105 2.127 0.4 -9.184 0.0 33.36407 0.0 1
Street_Passerby_106 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_Passerby_107 3.32 0.48 1.472 0.0 90.0 0.0 1
Street_Passerby_108 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_Passerby_109 -26.7 0.36 7.295 0.0 260.0 0.0 1
Street_Passerby_110 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_Passerby_111 -14.558 0.35 -8.069 0.0 288.58353 0.0 1
Street_Passerby_112 -4.577 0.353 1.663 0.0 194.16655 0.0 1
Street_Passerby_113 11.049 0.35 5.16 0.0 115.38074 0.0 1
Street_Passerby_114 12.09 0.36 -5.24 0.0 320.0 0.0 1
Street_NPCPos_Xiute 15.328 0.347 7.214 0.0 298.45078 0.0 1
Street_NPCPos_No11_01 5.784 0.35 -35.839 0.0 240.0 0.0 1
Street_NPCPos_Keli_01 5.12 0.36 -36.21 0.0 50.0 0.0 1
Street_NPCPos_No11_01End 6.64 0.35 -35.06 0.0 10.0 0.0 1
Street_Passerby_501 -26.61 0.69 16.044 0.0 28.75916 0.0 1
Street_Passerby_502 -22.804 0.36 -7.391 0.0 60.44901 0.0 1
Street_Passerby_503 -22.058 0.36 -7.339 0.0 324.42499 0.0 1
Street_Passerby_115 3.28 0.4537 1.464 0.0 90.0 0.0 1
Street_Passerby_116 8.16 0.48 2.362 0.0 270.0 0.0 1
Street_Passerby_117 -4.593 0.351 0.1033 0.0 343.36163 0.0 1
Street_Passerby_118 -4.43 0.49 1.48 0.0 180.0 0.0 1
Street_Passerby_119 -25.591 0.35 -6.895 0.0 315.20914 0.0 1
Street_Passerby_120 -4.667 0.337 1.677 0.0 345.07632 0.0 1
Street_NPCPos_Bangboo_Quest10020188 2.652 0.344 -0.622 0.0 74.99999 0.0 1
Street_NPCPos_Bangboo_Quest10020196 -3.648 0.353 -17.817 0.0 220.05724 0.0 1
Street_NPCPos_Bangboo_Quest10020140 21.47 0.344 5.908 0.0 0.0 0.0 1
Street_Passerby_121 -35.256 0.41 13.372 0.0 150.83507 0.0 1
Street_Passerby_122 -34.693 0.373 12.751 0.0 324.8782 0.0 1
Street_NPCPos_No11_02 -1.8 0.345 -29.986 0.0 310.0 0.0 1
Street_NPCPos_Keli_02 -2.26 0.36 -29.6 0.0 150.0 0.0 1
Street_NPCPos_Keli_02End 0.11 0.315 -29.62 0.0 79.99999 0.0 1
Street_NPCPos_Quest10020155_02 -1.763 0.8425 -21.017 0.0 237.17775 0.0 1
Street_NPCPos_No11_03End 14.81 0.349 0.54 0.0 120.00001 0.0 1
Street_NPCPos_Keli_03End 15.38 0.359 -0.28 0.0 20.00001 0.0 1
Street_NPCPos_Woof 11.26 1.15 -10.188 0.0 0.0 0.0 1
Street_ObjectPos_Newsstand 11.08 1.15 -9.372 0.0 0.0 0.0 1
Street_Passerby_123 4.504 0.329 -0.0001 0.0 0.0 0.0 1
Street_Passerby_124 8.166 0.329 1.463 0.0 270.0 0.0 1
Street_Passerby_125 5.36 0.35 -0.01 0.0 0.0 0.0 1
Street_Passerby_126 3.358 0.333 1.456 0.0 90.0 0.0 1
Street_Passerby_127 8.212 0.452 1.48 0.0 270.0 0.0 1
Street_NPCPos_Schroeder 1.752 0.342 -1.479 0.0 55.99999 0.0 1
Street_Passerby_128 5.38 0.334 0.064 0.0 0.0 0.0 1
Street_Passerby_129 3.287 0.35 1.452 0.0 90.0 0.0 1
Street_Passerby_130 -22.633 0.35 -7.275 0.0 53.62085 0.0 1
Street_Passerby_131 8.232 0.35 2.374 0.0 270.0 0.0 1
Street_Passerby_132 10.17 0.35 2.07 0.0 163.21513 0.0 1
Street_Passerby_139 -26.414 0.71 15.934 0.0 336.39316 0.0 1
Street_Passerby_140 -27.703 0.593 15.938 0.0 55.93431 0.0 1
Street_Passerby_141 10.968 0.4 6.067 0.0 120.00001 0.0 1
Street_Passerby_142 11.058 0.35 4.379 0.0 117.98868 0.0 1
Street_Passerby_143 10.678 0.36 -13.711 0.0 216.67374 0.0 1
Street_Passerby_144 -13.401 0.35 -12.446 0.0 333.78751 0.0 1
Street_Passerby_145 40.108 0.353 -0.147 0.0 154.59579 0.0 1
Street_ObjectPos_12 43.325 -0.015 -4.342 0.0 90.0 0.0 1
Street_Passerby_146 40.73 0.3506 -0.68 0.0 314.69949 0.0 1
Street_Passerby_147 2.594 0.35 -7.269 0.0 88.00859 0.0 1
Street_Passerby_148 3.52 0.4 -7.453 0.0 303.92548 0.0 1
Street_Passerby_149 4.667 0.4 -10.8 0.0 221.15468 0.0 1
Street_ObjectPos_04 0.763 1.038 -9.181 0.0 0.0 0.0 1
Street_Passerby_150 12.273 0.359 -8.928 0.0 238.31017 0.0 1
Street_NPCPos_Woof2 11.26 1.15 -10.188 0.0 0.0 0.0 1
Street_NPCPos_Woof3 11.26 1.15 -10.188 0.0 0.0 0.0 1
Street_Passerby_507 -26.592 0.36 -9.141 0.0 331.79459 0.0 1
Street_Passerby_508 -27.964 0.35 9.704 0.0 276.12378 0.0 1
Street_Passerby_509 5.012 0.35 -7.226 0.0 36.47496 0.0 1
Street_Passerby_510 -7.145 0.363 4.026 0.0 270.0 0.0 1
Street_Passerby_511 4.493 0.36 -35.899 0.0 20.00001 0.0 1
Street_Passerby_512 -4.592 0.355 0.073 0.0 343.46274 0.0 1
Street_Passerby_513 2.122 0.4 -10.398 0.0 32.57107 0.0 1
Street_Passerby_514 2.891 0.4 -10.705 0.0 0.0 0.0 1
Street_Passerby_515 14.095 0.36 -14.156 0.0 22.06978 0.0 1
Street_Passerby_516 15.321 0.35 7.58 0.0 123.66821 0.0 1
Street_Passerby_517 -4.305 0.4 -7.595 0.0 125.55424 0.0 1
Street_Passerby_518 -1.701 0.4 -23.751 0.0 310.0 0.0 1
Street_Passerby_519 -19.162 0.36 -8.18 0.0 37.20817 0.0 1
Street_ObjectPos_03 -21.194 0.171 -9.311 0.0 0.0 0.0 1
Street_Passerby_520 -3.812 0.347 -17.462 0.0 247.24823 0.0 1
Street_NPCPos_Susie -25.671 0.6214 14.104 0.0 268.89499 0.0 1
Street_NPCPos_TinMaster01 -10.191 0.36 -1.46 0.0 345.65805 0.0 1
Street_NPCPos_TinMaster02 -6.288 0.3505 -7.195 0.0 321.44672 0.0 1
Street_NPCPos_Gate 7.03 0.35 0.017 0.0 0.0 0.0 1
Street_NPCPos_Ben 2.233 0.36 2.478 0.0 133.82996 0.0 1
Street_PlayerPos_FromRamen 6.074 0.0 -0.758 0.0 0.0 0.0 1
Street_NPCPos_Anton -34.865 0.396 13.443 0.0 142.69867 0.0 1
Street_NPCPos_OokumaMari 11.921 0.347 -8.374 0.0 219.14148 0.0 1
Street_Passerby_151 -4.573 0.34 0.044 0.0 168.11601 1.0 1
Street_Passerby_152 9.423 0.352 -32.084 0.0 339.92599 0.0 1
Street_Passerby_153 -26.66462 0.3402 7.56905 359.60715 269.99854 0.65592 1
Street_NPCPos_Anbi02 -22.5 0.36 0.573 0.0 163.69124 0.0 1
Street_NPCPos_Enzo 27.243 0.35 -1.528 0.0 229.92622 0.0 1
Street_NPCPos_OokumaMari02 3.281 0.3965 -10.212 0.0 31.35417 0.0 1
Street_NPCPos_Billy02 -13.986 0.36 -7.091 0.0 113.60025 0.0 1
Street_NPCPos_Tsubaki 10.39 0.35 -8.91 0.0 137.00946 0.0 1
Street_NPCPos_Anton02 26.712 0.35 -6.986 0.0 305.87402 0.0 1
Street_NPCPos_Nocha02 9.577 0.348 -7.368 0.0 151.92999 0.0 1
Street_NPCPos_Tsubaki02 -18.173 0.35 -6.936 0.0 133.66385 0.0 1
Street_NPCPos_OokumaMari04 -25.138 0.7161 16.08 0.0 326.39648 0.0 1
Street_NPCPos_Ben02 20.665 0.35 -10.565 0.0 251.54306 0.0 1
Street_NPCPos_OokumaMari03 -22.553 0.36 -0.064 0.0 159.34224 0.0 1
Street_NPCPos_Ben03 -21.869 0.35 0.596 0.0 192.34038 0.0 1
Street_NPCPos_Billy03 22.297 0.36 5.854 0.0 340.17264 0.0 1
Street_NPCPos_Nocha03 6.929 0.395 -1.278 0.0 342.26456 0.0 1
Street_NPCPos_Tsubaki03 7.076 0.35 -0.706 0.0 312.97723 0.0 1
Street_NPCPos_Anbi03 10.312 0.35 2.109 0.0 240.46249 0.0 1
Street_NPCPos_Ben04 -32.609 0.342 -8.256 0.0 67.92832 0.0 1
Street_NPCPos_OokumaMari05 -1.27 0.3492 -29.178 0.0 305.29065 0.0 1
Street_NPCPos_Anton03 -2.058 0.35 -28.686 0.0 125.14816 0.0 1
Street_NPCPos_Nocha04 -22.595 0.395 -7.348 0.0 125.5207 0.0 1
Street_NPCPos_Billy04 -3.506 0.36 -17.778 0.0 251.33165 0.0 1
Street_NPCPos_Anbi04 -4.261 0.35 -17.505 0.0 264.7402 0.0 1
Street_NPCPos_Schroeder02 -5.053 0.342 4.863 0.0 70.83122 0.0 1
Street_NPCPos_Schroeder03 3.253 0.323 1.458 0.0 92.53754 0.0 1
Street_Passerby_521 -32.515 2.3 30.558 0.0 75.47579 0.0 1
Street_Passerby_522 -29.71 2.3 29.43 0.0 209.83707 0.0 1
Street_Passerby_523 -30.529 2.3 28.95 0.0 55.32315 0.0 1
Street_Passerby_524 -26.636 0.368 7.484 0.0 250.28363 0.0 1
Street_Passerby_525 21.991 0.35 -1.218 0.0 245.47432 0.0 1
Street_Passerby_526 -27.72 0.35 12.558 0.0 70.0 0.0 1
Street_Passerby_527 -2.147 0.35 -23.641 0.0 290.0 0.0 1
Street_Passerby_528 -3.553 0.395 -18.033 0.0 155.24419 0.0 1
Street_Passerby_529 -2.866 0.395 -19.195 0.0 327.30453 0.0 1
Street_Passerby_530 2.248 0.35 17.375 0.0 240.0 0.0 1
Street_Passerby_531 -30.195 2.3 29.303 0.0 316.19141 0.0 1
Street_Passerby_532 -15.625 0.35 -6.819 0.0 195.36263 0.0 1
Street_Passerby_533 -2.562 0.35 -23.881 0.0 312.95004 0.0 1
Street_Passerby_534 -12.646 0.35 -18.012 0.0 255.57466 0.0 1
Street_Passerby_535 -13.387 0.35 -16.812 0.0 152.59938 0.0 1
Street_NPCPos_Shepherd02 -4.574 0.3346 1.6568 0.0 10.32042 0.0 1
Street_NPCPos_No11_04 10.123 0.356 1.745 0.0 142.0 0.0 1
Street_NPCPos_PAFUMEI 15.973 0.35 7.416 0.0 334.46896 0.0 1
Street_NPCPos_MEIKE 15.483 0.35 7.766 0.0 120.00001 0.0 1
Street_Passerby_536 3.952 0.4 -11.297 0.0 48.38462 0.0 1
Garage_PlayerPos_Default 19.05 0.42063 21.43 0.0 0.0 0.0 3
Garage_PlayerPos_FromWorkshop 19.05 0.42063 22.744 0.0 0.0 0.0 3
Garage_PlayerPos_FromStreet 12.79 0.42063 18.82 0.0 0.0 0.0 3
Garage_PlayerPos_Quest10020003 20.701 0.42063 29.794 0.0 220.0 0.0 3
Garage_NPCPos_ToWorkshop 19.13 0.25 19.663 0.0 0.0 0.0 3
Garage_NPCPos_ToStreet 12.836 0.476 15.002 0.0 0.0 0.0 3
Garage_NPCPos_Nocha_Quest10020003 17.614 0.35 30.44 0.0 136.39999 0.0 3
Garage_NPCPos_Billy_Quest10020003 15.226 0.32 27.58 0.0 82.8 0.0 3
Garage_NPCPos_Anbi_Quest10020003 15.319 0.32 28.817 0.0 94.7 0.0 3
Garage_NPCPos_Nocha_Quest10020012 17.39999 0.34 27.69 0.0 158.30615 0.0 3
Garage_NPCPos_Billy_Quest10020012 18.56 0.31 32.58 0.0 250.0 0.0 3
Garage_NPCPos_Anbi_Quest10020012 18.58 0.31 31.46 0.0 320.0 0.0 3
ItemPos_1 17.0 0.42063 24.5 0.0 0.0 0.0 3
ItemPos_2 18.0 0.42063 24.5 0.0 0.0 0.0 3
ItemPos_3 19.0 0.42063 24.5 0.0 0.0 0.0 3
ItemPos_4 20.0 0.42063 24.5 0.0 0.0 0.0 3
ItemPos_5 21.0 0.42063 24.5 0.0 0.0 0.0 3
Garage_PlayerPos_FromStreet2 11.254 0.42063 19.31 0.0 90.0 0.0 3
Garage_NPCPos_ToStreet2 8.785 0.42063 19.238 0.0 270.0 0.0 3
Garage_PlayerPos_Quest10020010 19.81 0.42063 27.32 0.0 0.0 0.0 3
Garage_Object_Car_01 16.19 0.29 31.46 0.0 135.89999 0.0 3
Garage_ObjectPos_14 23.874 0.86 31.988 0.0 0.0 0.0 3
Garage_ObjectPos_15 22.254 0.82 22.982 0.0 0.0 0.0 3
Garage_ObjectPos_16 31.804 0.42063 28.509 0.0 0.0 0.0 3
Garage_ObjectPos_17 29.128 0.25 22.05 0.0 0.0 0.0 3
Garage_ObjectPos_18 29.941 0.0 32.857 0.0 0.0 0.0 3
Garage_NPCPos_Quest10020024 18.54 0.34 27.46 0.0 210.79999 0.0 3
Garage_PlayerPos_Quest10020120 17.75 0.42063 26.39 0.0 30.00001 0.0 3
Garage_NPCPos_No11 13.818 0.301 26.28 0.0 70.26791 0.0 3
Garage_NPCPos_No11_02 29.598 0.345 23.527 0.0 308.61368 0.0 3
Garage_NPCPos_No11_03 15.599 0.345 20.68 0.0 335.6268 0.0 3
Garage_NPCPos_No11_04 13.97 0.3 25.64 0.74837 128.50786 359.98956 3
Garage_NPCPos_Quest10020120 21.467 0.3 30.233 0.0 206.48201 0.0 3
Garage_PlayerPos_Chat01 20.545 0.42063 29.194 0.0 43.57 0.0 3
Workshop_PlayerPos_Default 23.75 0.58003 12.5 0.0 202.0 0.0 2
Workshop_PlayerPos_FromStreet 22.598 0.58003 7.611 0.0 30.00001 0.0 2
Workshop_PlayerPos_FromGarage 22.112 0.58002 14.386 0.0 180.0 0.0 2
Workshop_PlayerPos_Quest10020003 23.375 0.58002 11.406 0.0 0.0 0.0 2
Workshop_PlayerPos_Quest10020013 29.982 0.58002 15.418 0.0 120.00001 0.0 2
Workshop_PlayerPos_Quest10020011 29.867 0.58002 11.406 0.0 30.0 0.0 2
Workshop_PlayerPos_Quest10020012 29.587 0.58002 11.979 0.0 92.99999 0.0 2
Workshop_PlayerPos_Quest10020001 30.31 0.58002 11.18 0.0 40.0 0.0 2
Workshop_PlayerPos_Quest10020028 30.38 0.58002 12.826 0.0 80.0 0.0 2
Workshop_PlayerPos_Pos1 29.44 0.605 15.48 0.0 0.0 0.0 2
Workshop_PlayerPos_Pos2 30.729 0.584 15.3 0.0 0.0 0.0 2
Workshop_NPCPos_ToGarage 22.093 0.749 16.512 0.0 180.0 0.0 2
Workshop_NPCPos_ToStreet 21.529 0.666 5.786 0.0 28.1 0.0 2
Workshop_NPCPos_Hollow 33.19 0.86 11.482 0.0 270.0 0.0 2
Workshop_NPCPos_VHS 28.02 0.87 16.887 0.0 0.0 0.0 2
Workshop_NPCPos_Gacha 19.368 1.41 6.382 0.0 270.0 0.0 2
Workshop_NPCPos_TimeMachine 30.08 0.4 14.386 0.0 0.0 0.0 2
Workshop_NPCPos_Test 28.875 0.58384 9.625 0.0 312.68036 0.0 2
Workshop_NPCPos_SisterLing 24.476 0.5998 10.557 0.0 313.60257 0.0 2
Workshop_NPCPos_WorkTable 28.336 0.75 8.292 0.0 44.79997 0.0 2
Workshop_NPCPos_Noca 22.0 0.58003 8.5 0.0 50.0 0.0 2
WorkShop_NPCPos_Noca_Quest10020001 33.372 0.626 14.29 0.0 270.0 0.0 2
WorkShop_NPCPos_Billy_Quest10020003 22.0 0.58003 9.5 0.0 125.0 0.0 2
WorkShop_NPCPos_Anbi_Quest10020003 23.0 0.58003 9.0 0.0 295.0 0.0 2
WorkShop_NPCPos_Noca_Quest10020009 24.14684 0.58003 12.46807 0.0 207.99998 0.0 2
WorkShop_NPCPos_Billy_Quest10020009 24.211 0.58003 10.839 0.0 318.87799 0.0 2
WorkShop_NPCPos_Anbi_Quest10020009 22.779 0.58384 11.511 0.0 103.268 0.0 2
WorkShop_NPCPos_Salesman_Quest10020103 23.46 0.58003 12.533 0.0 206.96613 0.0 2
WorkShop_NPCPos_Tsubaki_Quest10020106 31.594 0.597 15.71 0.0 237.34885 0.0 2
Workshop_NpcPos_Quest10020151 19.5 0.58003 10.89 0.0 240.0 0.0 2
Workshop_NpcPos_Quest10020181 19.674 0.58003 12.272 0.0 4.53792 0.0 2
Workshop_NPCPos_BangbooA_VHS 25.03 0.58003 6.0 0.0 280.0 0.0 2
Workshop_NPCPos_guest01_VHS 19.845 0.58003 8.695 0.0 312.21448 0.0 2
Workshop_NPCPos_guest02_VHS 19.777 0.58003 10.577 0.0 169.99998 0.0 2
Workshop_NPCPos_guest03_VHS 19.84 0.58003 15.49 0.0 270.0 0.0 2
Workshop_NPCPos_guest04_VHS 19.152 0.58003 7.176 0.0 250.0 0.0 2
Workshop_NPCPos_guest05_VHS 19.256 0.58003 11.563 0.0 300.0 0.0 2
Workshop_NPCPos_guest06_VHS 19.27 0.58003 14.28 0.0 240.0 0.0 2
Workshop_NPCPos_Bangboo01_VHS 21.29 0.58003 13.62 0.0 199.99998 0.0 2
Workshop_NPCPos_Bangboo02_VHS 21.93 0.58003 11.36 0.0 150.0 0.0 2
Workshop_NPCPos_Bangboo03_VHS 21.13 0.58003 9.31 0.0 99.99999 0.0 2
Workshop_NPCPos_Bangboo04_VHS 20.5 0.58003 10.36 0.0 180.0 0.0 2
Workshop_NPCPos_Bangboo05_VHS 22.1 0.58003 9.9 0.0 120.00001 0.0 2
Workshop_CameraPos_Pos1 30.85 1.93 13.0 8.0 335.0 0.0 2
Workshop_CameraPos_Pos2 29.39 1.93 13.2 8.0 30.0 0.0 2
Workshop_NPCPos_Telephone 26.807 1.008 8.432 0.0 270.0 0.0 2
Workshop_NPCPos_HollowPause 32.61 0.59 11.58 0.0 90.0 0.0 2
Workshop_NPCPos_VHSBangboo 26.098 1.337 9.692 0.0 260.0 0.0 2
Workshop_PlayerPos_HollowQuest 32.37027 0.58384 11.5826 0.0 86.69299 0.0 2
WorkShop_CameraPos_VHSStore 22.53 1.855 10.8 0.0 115.38 0.0 2
Workshop_PlayerPos_FromHollow 32.37027 0.58384 11.5826 0.0 86.69299 0.0 2
Workshop_PlayerPos_FromVHS 28.0 0.58384 15.6 0.0 0.0 0.0 2
Workshop_PlayerPos_VHSStore 22.758 0.58384 9.921 0.0 86.69299 0.0 2
Workshop_NPCPos_ARole1 32.5 0.594 15.027 0.0 150.0 0.0 2
Workshop_NPCPos_ARole2 31.15 0.594 12.748 0.0 270.0 0.0 2
Workshop_NPCPos_ARole3 32.1 0.594 12.55 0.0 120.00001 0.0 2
Workshop_NPCPos_ARole4 25.555 0.594 6.693 0.0 306.96448 0.0 2
Workshop_NPCPos_ARole5 28.429 0.594 15.22 0.0 186.60002 0.0 2
Workshop_NPCPos_ARole6 28.74 0.594 13.821 0.0 131.39603 0.0 2
WorkShop_NPCPos_Tsubaki_Quest10020115 28.903 0.58003 16.034 0.0 154.11002 0.0 2
Workshop_PlayerPos_Quest10020106 31.701 0.594 13.423 0.0 255.0 0.0 2
Workshop_PlayerPos_Quest10020115 30.447 0.594 12.817 0.0 296.12622 0.0 2
Workshop_Teleport_ToWorkshop 23.69 0.6 9.698 0.0 60.0 0.0 2
Workshop_NPCPos_ARole7 27.35 0.59 16.0 0.0 45.0 0.0 2
Workshop_NPCPos_ARole8 29.952 0.594 14.702 0.0 0.0 0.0 2
Workshop_NPCPos_ARole8F 30.263 0.594 14.64 0.0 0.0 0.0 2
Workshop_NPCPos_ARole9 31.6 0.594 10.85 0.0 307.60001 0.0 2
Workshop_NPCPos_ARole10 33.19 0.594 15.438 0.0 260.0 0.0 2
Workshop_NPCPos_ARoleTest 30.05 0.594 14.858 0.0 0.0 0.0 2
Workshop_PlayerPos_Quest10020109 30.628 0.594 11.88 0.0 280.0 0.0 2
Workshop_PlayerPos_Quest10020113 30.628 0.594 11.88 0.0 280.0 0.0 2
Workshop_PlayerPos_Quest10020116 30.506 0.594 11.88 0.0 90.0 0.0 2
Workshop_PlayerPos_Quest10020010 30.208 0.594 12.092 0.0 348.5 0.0 2
Workshop_NPCPos_DrawingRoom 24.38 0.594 6.223 0.0 353.79999 0.0 2
Workshop_PlayerPos_Quest10020119 30.892 0.594 10.112 0.0 125.60002 0.0 2
Workshop_NPCPos_ARole11 31.605 0.594 9.471 0.0 300.0 0.0 2
Workshop_NPCPos_ARole12 30.402 0.6 9.8 0.0 44.15999 0.0 2
Workshop_NPCPos_ARole17 30.645 0.58 15.042 0.0 0.0 0.0 2
Workshop_NPCPos_ARole16 28.292 0.593 8.216 3.08252 316.2569 0.0 2
Workshop_NPCPos_ARole16F 25.559 0.578 7.945 0.0 204.72104 0.0 2
Workshop_NPCPos_ARole15 33.043 0.6 13.442 0.0 0.0 0.0 2
Workshop_NPCPos_ARole14 33.043 0.6 13.442 0.0 0.0 0.0 2
Workshop_NPCPos_ARole13 33.043 0.6 13.442 0.0 0.0 0.0 2
WorkShop_NPCPos_Tsubaki_Quest10020119 31.19 0.59 10.23 0.0 289.17999 0.0 2
Workshop_PlayerPos_Quest10020151 20.396 0.58003 11.186 0.0 270.0 0.0 2
Workshop_PlayerPos_Quest10020111 28.9 0.588 13.1 0.0 129.89999 0.0 2
Workshop_NpcPos_VHS31020002 25.688 0.58003 7.624 0.0 251.93011 0.0 2
Workshop_NpcPos_VHS31020001 23.12 0.58003 6.209 0.0 29.26875 0.0 2
Workshop_NpcPos_VHS31010001 21.59 0.58003 15.2 0.0 240.0 0.0 2
Workshop_NpcPos_Bangboo_Quest10020141 25.28177 0.588 6.47026 0.0 320.26306 0.0 2
Workshop_NpcPos_Bangboo_Quest10020195 19.567 0.588 15.244 0.0 120.5 0.0 2
Workshop_NpcPos_VHS31010002 21.9 0.58003 14.84 0.0 240.0 0.0 2
Workshop_PlayerPos_VHS31020002 21.924 0.58003 12.388 0.0 315.51761 0.0 2
Workshop_PlayerPos_VHS31020001 24.0 0.58003 9.36 0.0 150.0 0.0 2
Workshop_PlayerPos_VHS31010001 21.59 0.58003 14.46 0.0 0.0 0.0 2
Workshop_PlayerPos_VHS31010002 21.9 0.58003 14.46 0.0 0.0 0.0 2
Workshop_NPCPos_No11_03 25.3 0.587 13.56 0.0 240.0 0.0 2
Workshop_PlayerPos_Quest10020123 30.724 0.594 11.259 0.0 125.60002 0.0 2
WorkShop_NPCPos_Bangboo_Quest10020106 32.19 0.595 15.605 0.0 337.73215 0.0 2
Workshop_Passerby_133 19.237 0.58003 8.191 0.0 290.0 0.0 2
Workshop_Passerby_134 19.838 0.58003 10.448 0.0 199.99998 0.0 2
Workshop_Passerby_135 19.435 0.58003 15.141 0.0 270.0 0.0 2
Workshop_Passerby_136 19.403 0.58003 7.347 0.0 260.0 0.0 2
Workshop_Passerby_137 19.292 0.58003 11.969 0.0 270.0 0.0 2
Workshop_Passerby_138 20.347 0.58003 15.573 0.0 340.0 0.0 2
Workshop_PlayerPos_HollowPause 31.23 0.584 13.08 0.0 118.0 0.0 2
Workshop_NPCPos_ARole17F 31.0 0.58 15.15 0.0 311.0 0.0 2
Workshop_NpcPos_VHS31020001End 24.626 0.58003 8.681 0.0 311.76859 0.0 2
Workshop_NpcPos_VHS31020002_02 25.503 0.58003 7.032 0.0 306.8797 0.0 2
Workshop_NpcPos_VHS31020002End 21.218 0.58003 12.853 0.0 126.61777 0.0 2
Workshop_NpcPos_VHS31020002_02End 21.66 0.58003 13.136 0.0 152.39877 0.0 2
Workshop_NPCPos_ARole18 31.802 0.594 14.909 0.0 283.90863 0.0 2
Workshop_PlayerPos_ARole18 28.258 0.594 15.121 0.0 81.46976 0.0 2
Borderlands 0.0 0.0 0.0 0.0 0.0 0.0 0
1 ID PositionX PositionY PositionZ RotationX RotationY RotationZ Section
2 Street_Teleport_ToGrocery -16.73 0.3 -5.624 0.0 180.0 0.0 1
3 Street_Teleport_ToRamenStore 5.41 0.32 -1.36 0.0 0.0 0.0 1
4 Street_Teleport_ToAudioVideoStore 18.23 0.36 -9.16 0.0 180.0 0.0 1
5 Street_PlayerPos_Default 29.125 0.0 -4.375 0.0 270.0 0.0 1
6 Street_PlayerPos_FromWorkshop 17.541 0.34003 5.481 0.0 193.27106 0.0 1
7 Street_PlayerPos_FromGarage 12.89 0.34 10.71725 0.0 179.08109 0.0 1
8 Street_PlayerPos_FromGrocery -17.177 0.0 0.0 0.0 0.0 0.0 1
9 Street_NPCPos_ToWorkshop 18.243 0.557 8.079 0.0 209.99998 0.0 1
10 Street_NPCPos_Smithy 18.208 0.95 -12.138 0.0 180.0 0.0 1
11 Street_NPCPos_ToGarage 12.83 0.39287 14.673 0.0 180.0 0.0 1
12 Street_NPCPos_Test 0.75 0.31757 -4.5 0.0 90.0 0.0 1
13 Street_NPCPos_Quest 7.875 0.5 -2.125 0.0 185.0 0.0 1
14 Street_NPCPos_RamenStore 5.678 0.9 1.753 0.0 185.0 0.0 1
15 Street_NPCPos_TestS 6.761 0.3 -2.028 0.0 185.0 0.0 1
16 Street_NPCPos_TestL 9.04 0.5 -2.227 0.0 185.0 0.0 1
17 Street_NPCPos_Billy_Quest10020005 37.245 0.35 -1.786 0.0 0.0 0.0 1
18 Street_NPCPos_Anbi_Quest10020005 -22.37 0.36 -7.05 0.0 180.0 0.0 1
19 Street_NPCPos_Car_Quest10020005 37.43 0.75 3.26 0.0 270.0 0.0 1
20 Street_NPCPos_Temp_Quest10020005 20.275 0.35 -10.2 0.0 326.98425 0.0 1
21 Street_NPCPos_Billy_Quest10020006 -28.05087 0.5 -4.7 0.0 52.99999 0.0 1
22 Street_NPCPos_Anbi_Quest10020006 -26.5 0.5 -5.98 0.0 0.0 0.0 1
23 Street_NPCPos_Nocha_Quest10020008 -1.042 0.393 -3.014 0.0 90.0 0.0 1
24 Street_NPCPos_Temp_Quest10020015 19.36 0.393 1.37 0.0 29.52794 0.0 1
25 Street_NPCPos_Bangboo_Quest10020018 11.3 0.393 -0.25 0.0 180.0 0.0 1
26 Street_NPCPos_Temp_Quest10020020 -9.17 0.393 -10.86 0.0 0.0 0.0 1
27 Street_NPCPos_Temp_Quest10020021 6.67203 0.393 -8.174 0.0 84.99999 0.0 1
28 Street_NPCPos_BangbooA_Quest10020006 -16.869 0.729 -8.124 0.0 0.0 0.0 1
29 Street_NPCPos_BangbooB_Quest10020006 -17.556 0.729 -8.124 0.0 0.0 0.0 1
30 Street_NPCPos_BangbooC_Quest10020006 -16.186 0.729 -8.097 0.0 0.0 0.0 1
31 Street_CameraPos_Grocery -16.866 0.98 -1.508 0.0 180.0 0.0 1
32 Street_CameraPos_RamenStore 2.48 2.45 -2.52 10.60003 45.5 0.0 1
33 Street_CameraPos_RamenStore_PC 2.67 2.4 -2.29 10.8 44.0 0.0 1
34 Street_CameraPos_Workshop 18.71 0.91 -9.14 10.60001 180.0 0.0 1
35 TriggerPos_1 35.5 0.31757 -4.5 0.0 270.0 0.0 1
36 Street_NPCPos_Grocery -18.928 0.95 -9.358 0.0 324.60001 0.0 1
37 Street_NPCPos_TestBear 10.929 0.5 -2.392 0.0 185.0 0.0 1
38 Street_PlayerPos_FromGarage2 4.15 0.0 19.17 0.0 270.0 0.0 1
39 Street_NPCPos_ToGarage2 8.618 0.39287 19.235 0.0 270.0 0.0 1
40 Street_Passerby_A1 6.168 0.35 0.017 0.0 0.0 0.0 1
41 Street_Passerby_A2 7.0 0.48 -0.027 0.0 0.0 0.0 1
42 Street_Passerby_B1 14.832 0.35 1.667 0.0 169.99998 0.0 1
43 Street_Passerby_B2 15.41 0.35 1.09 0.0 240.0 0.0 1
44 Street_Passerby_C1 -27.068 0.35 5.609 0.0 230.92207 0.0 1
45 Street_Passerby_C2 -26.701 0.35 6.222 0.0 298.08884 0.0 1
46 Street_Passerby_D1 -12.857 0.35 -11.668 0.0 32.81414 0.0 1
47 Street_Passerby_D2 -12.635 0.35 -10.965 0.0 189.98178 0.0 1
48 Street_ObjectPos_08 -14.573 -0.013 -12.512 0.0 0.0 0.0 1
49 Street_ObjectPos_10 -14.303 1.375 -11.119 0.0 0.0 0.0 1
50 Street_ObjectPos_09 -13.948 0.092 -18.786 0.0 0.0 0.0 1
51 Street_Passerby_09 -5.95 0.35 11.106 0.0 32.66373 0.0 1
52 Street_Passerby_10 -5.734 0.35 12.094 0.0 176.94084 0.0 1
53 Street_Passerby_11 2.162 0.4 -9.208 0.0 86.23466 0.0 1
54 Street_Passerby_12 2.898 0.4 -9.705 0.0 344.81543 0.0 1
55 Street_Passerby_13 16.917 0.35 -10.73 0.0 196.76297 0.0 1
56 Street_Passerby_14 16.337 0.35 -10.233 0.0 150.0 0.0 1
57 Street_Passerby_15 21.459 0.36 -8.39 0.0 231.98558 0.0 1
58 Street_Passerby_16 20.742 0.35 -8.932 0.0 48.55833 0.0 1
59 Street_Passerby_17 15.15 0.35 7.51 0.0 212.18704 0.0 1
60 Street_Passerby_18 14.808 0.35 6.799 0.0 29.95915 0.0 1
61 Street_Passerby_19 -9.383 0.35 -0.624 0.0 261.22681 0.0 1
62 Street_Passerby_20 -10.141 0.35 -1.371 0.0 64.0559 0.0 1
63 Street_Passerby_21 -17.508 0.35 -0.558 0.0 339.64786 0.0 1
64 Street_Passerby_22 -17.19 0.35 0.057 0.0 286.36243 0.0 1
65 Street_Passerby_23 -11.63 0.35 -18.32 0.0 291.77817 0.0 1
66 Street_Passerby_24 -12.63 0.35 -18.43 0.0 27.8 0.0 1
67 Street_Passerby_25 -11.539 0.35 -17.535 0.0 234.79996 0.0 1
68 Street_Passerby_26 -13.04 0.35 -18.03 0.0 66.79999 0.0 1
69 Street_Passerby_27 -26.85 0.569 12.797 0.0 20.89114 0.0 1
70 Street_Passerby_28 -27.431 0.38 13.319 0.0 223.54056 0.0 1
71 Street_Passerby_29 22.296 0.35 -8.766 0.0 151.64432 0.0 1
72 Street_Passerby_30 22.839 0.528 -9.841 0.0 332.39041 0.0 1
73 Street_Passerby_31 -34.693 0.373 12.751 0.0 324.8782 0.0 1
74 Street_Passerby_32 -35.538 0.3793 13.14 0.0 116.70426 0.0 1
75 Street_NPCPos_Quest10020151 -4.574 0.3346 1.6568 0.0 10.32042 0.0 1
76 Street_NPCPos_Quest10020152 14.23 0.35 -9.95 0.0 0.0 0.0 1
77 Street_NPCPos_Quest10020153 11.12 0.4 -8.17 0.0 0.0 0.0 1
78 Street_NPCPos_Quest10020154 24.721 0.348 4.248 0.0 289.53577 0.0 1
79 Street_NPCPos_Quest10020155 -1.79 0.395 -21.504 0.0 321.61935 0.0 1
80 Street_NPCPos_Quest10020156 27.16 0.35 -1.49 0.0 190.0 0.0 1
81 Street_NPCPos_Quest10020157 3.28 0.35 1.465 0.0 90.0 0.0 1
82 Street_NPCPos_Quest10020158 1.35 0.4 -1.38 0.0 180.0 0.0 1
83 Street_Passerby_33 -26.297 0.35 -8.271 0.0 123.11625 0.0 1
84 Street_Passerby_34 -25.442 0.35 -8.919 0.0 318.86185 0.0 1
85 Street_Passerby_35 10.662 0.37 1.331 0.0 233.42654 0.0 1
86 Street_Passerby_36 10.038 0.36 1.146 0.0 193.91667 0.0 1
87 Street_Passerby_37 1.222 0.35 17.124 0.0 73.19746 0.0 1
88 Street_Passerby_38 2.177 0.35 17.239 0.0 295.93552 0.0 1
89 Street_Passerby_39 -7.65 0.35 -11.34 0.0 317.07599 0.0 1
90 Street_Passerby_40 -8.56 0.35 -10.89 0.0 62.40825 0.0 1
91 Street_Passerby_41 -21.485 0.35 -7.556 0.0 231.75189 0.0 1
92 Street_Passerby_42 -22.217 0.36 -7.046 0.0 135.27699 0.0 1
93 Street_Passerby_43 -26.552 0.355 0.922 0.0 329.71353 0.0 1
94 Street_Passerby_44 -26.563 0.36 1.809 0.0 203.36967 0.0 1
95 Street_Passerby_45 -29.2 0.39 -5.888 0.0 61.42846 0.0 1
96 Street_Passerby_46 -14.932 0.35 -29.664 0.0 79.99999 0.0 1
97 Street_Passerby_47 11.51 0.35 -13.93 0.0 209.63834 0.0 1
98 Street_Passerby_48 -22.751 0.36 -7.545 0.0 109.76276 0.0 1
99 Street_Passerby_49 2.386 0.4 -9.954 0.0 19.77401 0.0 1
100 Street_Passerby_50 3.13 0.4 -9.31 0.0 245.81375 0.0 1
101 Street_Passerby_51 -2.53 0.35 -29.03 0.0 20.00001 0.0 1
102 Street_ObjectPos_11 -6.0202 1.62 -36.027 0.0 0.0 0.0 1
103 Street_Passerby_52 -1.89 0.35 -29.04 0.0 330.0 0.0 1
104 Street_Passerby_53 -5.976 0.35 -1.683 0.0 295.77307 0.0 1
105 Street_Passerby_54 -6.768 0.35 -1.331 0.0 119.76264 0.0 1
106 Street_Passerby_55 2.566 0.35 -1.384 0.0 65.57031 0.0 1
107 Street_Passerby_56 3.203 0.35 -1.407 0.0 340.54376 0.0 1
108 Street_Passerby_57 -19.31 0.35 -7.24 0.0 50.0 0.0 1
109 Street_Passerby_58 -18.45 0.35 -6.99 0.0 270.0 0.0 1
110 Street_Passerby_59 -2.315 0.35 -25.478 0.0 240.0 0.0 1
111 Street_Passerby_60 -2.538 0.35 -26.063 0.0 20.00001 0.0 1
112 Street_Passerby_61 -4.613 0.3373 0.009 0.0 171.87192 0.0 1
113 Street_Passerby_62 -4.637 0.357 1.647 0.0 184.25121 0.0 1
114 Street_Passerby_63 16.305 0.35 -10.866 0.0 69.14664 0.0 1
115 Street_Passerby_64 17.0 0.35 -10.3 0.0 212.32573 0.0 1
116 Street_Passerby_65 9.307 0.38 -28.054 0.0 205.75116 0.0 1
117 Street_Passerby_66 9.613 0.38 -29.102 0.0 332.5571 0.0 1
118 Street_Passerby_67 -7.099 0.4991 11.649 0.0 63.06116 0.0 1
119 Street_Passerby_68 -6.042 0.35 12.561 0.0 227.34982 0.0 1
120 Street_Passerby_69 22.433 0.35 6.054 0.0 317.61322 0.0 1
121 Street_Passerby_70 -19.002 0.35 -1.416 0.0 154.39163 0.0 1
122 Street_Passerby_71 -25.812 0.71 15.861 0.0 317.13211 0.0 1
123 Street_ObjectPos_06 -26.43 1.8 16.614 0.0 0.0 0.0 1
124 Street_ObjectPos_07 -24.915 0.996 12.736 0.0 0.0 0.0 1
125 Street_Passerby_72 32.834 0.35 -7.017 0.0 325.03073 0.0 1
126 Street_Passerby_73 -7.586 0.4 -0.346 0.0 136.72357 0.0 1
127 Street_Passerby_74 -26.168 0.5651 12.814 0.0 205.99687 0.0 1
128 Street_ObjectPos_05 -26.783 1.263 10.008 0.0 110.0 0.0 1
129 Street_Passerby_75 -26.378 0.35 6.141 0.0 288.5228 0.0 1
130 Street_Passerby_76 -6.893 0.64 15.257 0.0 50.22827 0.0 1
131 Street_Passerby_77 -11.306 0.35 -9.496 0.0 119.16231 0.0 1
132 Street_Passerby_78 -32.834 0.35 -2.719 0.0 50.0 0.0 1
133 Street_ObjectPos_02 -35.7 1.556 -6.62 0.0 0.0 0.0 1
134 Street_Passerby_79 -35.854 0.38 4.449 0.0 330.0 0.0 1
135 Street_Passerby_80 -0.168 0.388 21.145 0.0 247.54602 0.0 1
136 Street_ObjectPos_13 1.141 0.836 15.84 0.0 0.0 0.0 1
137 Street_Passerby_81 9.372 0.36 -8.746 0.0 319.89386 0.0 1
138 Street_NPCPos_Quest10020118 0.46 0.4 16.07 0.0 132.127 0.0 1
139 Street_NPCPos_Joe 14.487 0.344 7.658 0.0 117.47181 0.0 1
140 Street_Passerby_82 1.345 0.35 -29.269 0.0 318.21954 0.0 1
141 Street_Passerby_83 -29.28 0.36 -6.019 0.0 92.8725 0.0 1
142 Street_Passerby_84 -20.485 0.35 -8.332 0.0 218.35194 0.0 1
143 Street_Passerby_85 11.059 0.35 5.281 0.0 120.00001 0.0 1
144 Street_Passerby_86 12.09 0.36 -5.24 0.0 320.0 0.0 1
145 Street_Passerby_87 12.09 0.36 -5.24 0.0 320.0 0.0 1
146 Street_Passerby_88 12.09 0.36 -5.24 0.0 320.0 0.0 1
147 Street_Passerby_89 12.743 0.35 -10.13 0.0 52.06183 0.0 1
148 Street_Passerby_90 -26.65 0.36 6.866 0.0 260.0 0.0 1
149 Street_Passerby_91 -13.317 0.35 -1.324 0.0 154.53731 0.0 1
150 Street_Passerby_92 7.02 0.33 0.0589 0.0 0.0 0.0 1
151 Street_Passerby_93 12.09 0.36 -5.24 0.0 320.0 0.0 1
152 Street_Passerby_94 24.156 0.36 -0.589 0.0 258.23029 0.0 1
153 Street_Passerby_95 -8.074 0.35 -11.114 0.0 321.74228 0.0 1
154 Street_Passerby_96 32.996 0.35 -7.036 0.0 298.86584 0.0 1
155 Street_Passerby_97 -2.633 0.35 -25.815 0.0 294.18304 0.0 1
156 Street_Passerby_98 -14.06 0.36 -7.276 0.0 289.05328 0.0 1
157 Street_Passerby_99 -26.389 0.356 7.356 0.0 257.54462 0.0 1
158 Street_Passerby_100 28.999 0.36 -7.249 0.0 36.28022 0.0 1
159 Street_Passerby_101 4.87 0.36 -29.65 0.0 180.0 0.0 1
160 Street_Passerby_102 -26.387 0.35 7.338 0.0 249.63678 0.0 1
161 Street_Passerby_103 12.09 0.31 -5.24 0.0 320.0 0.0 1
162 Street_Passerby_104 14.6 0.36 8.1 0.0 210.0 0.0 1
163 Street_Passerby_105 2.127 0.4 -9.184 0.0 33.36407 0.0 1
164 Street_Passerby_106 12.09 0.36 -5.24 0.0 320.0 0.0 1
165 Street_Passerby_107 3.32 0.48 1.472 0.0 90.0 0.0 1
166 Street_Passerby_108 12.09 0.36 -5.24 0.0 320.0 0.0 1
167 Street_Passerby_109 -26.7 0.36 7.295 0.0 260.0 0.0 1
168 Street_Passerby_110 12.09 0.36 -5.24 0.0 320.0 0.0 1
169 Street_Passerby_111 -14.558 0.35 -8.069 0.0 288.58353 0.0 1
170 Street_Passerby_112 -4.577 0.353 1.663 0.0 194.16655 0.0 1
171 Street_Passerby_113 11.049 0.35 5.16 0.0 115.38074 0.0 1
172 Street_Passerby_114 12.09 0.36 -5.24 0.0 320.0 0.0 1
173 Street_NPCPos_Xiute 15.328 0.347 7.214 0.0 298.45078 0.0 1
174 Street_NPCPos_No11_01 5.784 0.35 -35.839 0.0 240.0 0.0 1
175 Street_NPCPos_Keli_01 5.12 0.36 -36.21 0.0 50.0 0.0 1
176 Street_NPCPos_No11_01End 6.64 0.35 -35.06 0.0 10.0 0.0 1
177 Street_Passerby_501 -26.61 0.69 16.044 0.0 28.75916 0.0 1
178 Street_Passerby_502 -22.804 0.36 -7.391 0.0 60.44901 0.0 1
179 Street_Passerby_503 -22.058 0.36 -7.339 0.0 324.42499 0.0 1
180 Street_Passerby_115 3.28 0.4537 1.464 0.0 90.0 0.0 1
181 Street_Passerby_116 8.16 0.48 2.362 0.0 270.0 0.0 1
182 Street_Passerby_117 -4.593 0.351 0.1033 0.0 343.36163 0.0 1
183 Street_Passerby_118 -4.43 0.49 1.48 0.0 180.0 0.0 1
184 Street_Passerby_119 -25.591 0.35 -6.895 0.0 315.20914 0.0 1
185 Street_Passerby_120 -4.667 0.337 1.677 0.0 345.07632 0.0 1
186 Street_NPCPos_Bangboo_Quest10020188 2.652 0.344 -0.622 0.0 74.99999 0.0 1
187 Street_NPCPos_Bangboo_Quest10020196 -3.648 0.353 -17.817 0.0 220.05724 0.0 1
188 Street_NPCPos_Bangboo_Quest10020140 21.47 0.344 5.908 0.0 0.0 0.0 1
189 Street_Passerby_121 -35.256 0.41 13.372 0.0 150.83507 0.0 1
190 Street_Passerby_122 -34.693 0.373 12.751 0.0 324.8782 0.0 1
191 Street_NPCPos_No11_02 -1.8 0.345 -29.986 0.0 310.0 0.0 1
192 Street_NPCPos_Keli_02 -2.26 0.36 -29.6 0.0 150.0 0.0 1
193 Street_NPCPos_Keli_02End 0.11 0.315 -29.62 0.0 79.99999 0.0 1
194 Street_NPCPos_Quest10020155_02 -1.763 0.8425 -21.017 0.0 237.17775 0.0 1
195 Street_NPCPos_No11_03End 14.81 0.349 0.54 0.0 120.00001 0.0 1
196 Street_NPCPos_Keli_03End 15.38 0.359 -0.28 0.0 20.00001 0.0 1
197 Street_NPCPos_Woof 11.26 1.15 -10.188 0.0 0.0 0.0 1
198 Street_ObjectPos_Newsstand 11.08 1.15 -9.372 0.0 0.0 0.0 1
199 Street_Passerby_123 4.504 0.329 -0.0001 0.0 0.0 0.0 1
200 Street_Passerby_124 8.166 0.329 1.463 0.0 270.0 0.0 1
201 Street_Passerby_125 5.36 0.35 -0.01 0.0 0.0 0.0 1
202 Street_Passerby_126 3.358 0.333 1.456 0.0 90.0 0.0 1
203 Street_Passerby_127 8.212 0.452 1.48 0.0 270.0 0.0 1
204 Street_NPCPos_Schroeder 1.752 0.342 -1.479 0.0 55.99999 0.0 1
205 Street_Passerby_128 5.38 0.334 0.064 0.0 0.0 0.0 1
206 Street_Passerby_129 3.287 0.35 1.452 0.0 90.0 0.0 1
207 Street_Passerby_130 -22.633 0.35 -7.275 0.0 53.62085 0.0 1
208 Street_Passerby_131 8.232 0.35 2.374 0.0 270.0 0.0 1
209 Street_Passerby_132 10.17 0.35 2.07 0.0 163.21513 0.0 1
210 Street_Passerby_139 -26.414 0.71 15.934 0.0 336.39316 0.0 1
211 Street_Passerby_140 -27.703 0.593 15.938 0.0 55.93431 0.0 1
212 Street_Passerby_141 10.968 0.4 6.067 0.0 120.00001 0.0 1
213 Street_Passerby_142 11.058 0.35 4.379 0.0 117.98868 0.0 1
214 Street_Passerby_143 10.678 0.36 -13.711 0.0 216.67374 0.0 1
215 Street_Passerby_144 -13.401 0.35 -12.446 0.0 333.78751 0.0 1
216 Street_Passerby_145 40.108 0.353 -0.147 0.0 154.59579 0.0 1
217 Street_ObjectPos_12 43.325 -0.015 -4.342 0.0 90.0 0.0 1
218 Street_Passerby_146 40.73 0.3506 -0.68 0.0 314.69949 0.0 1
219 Street_Passerby_147 2.594 0.35 -7.269 0.0 88.00859 0.0 1
220 Street_Passerby_148 3.52 0.4 -7.453 0.0 303.92548 0.0 1
221 Street_Passerby_149 4.667 0.4 -10.8 0.0 221.15468 0.0 1
222 Street_ObjectPos_04 0.763 1.038 -9.181 0.0 0.0 0.0 1
223 Street_Passerby_150 12.273 0.359 -8.928 0.0 238.31017 0.0 1
224 Street_NPCPos_Woof2 11.26 1.15 -10.188 0.0 0.0 0.0 1
225 Street_NPCPos_Woof3 11.26 1.15 -10.188 0.0 0.0 0.0 1
226 Street_Passerby_507 -26.592 0.36 -9.141 0.0 331.79459 0.0 1
227 Street_Passerby_508 -27.964 0.35 9.704 0.0 276.12378 0.0 1
228 Street_Passerby_509 5.012 0.35 -7.226 0.0 36.47496 0.0 1
229 Street_Passerby_510 -7.145 0.363 4.026 0.0 270.0 0.0 1
230 Street_Passerby_511 4.493 0.36 -35.899 0.0 20.00001 0.0 1
231 Street_Passerby_512 -4.592 0.355 0.073 0.0 343.46274 0.0 1
232 Street_Passerby_513 2.122 0.4 -10.398 0.0 32.57107 0.0 1
233 Street_Passerby_514 2.891 0.4 -10.705 0.0 0.0 0.0 1
234 Street_Passerby_515 14.095 0.36 -14.156 0.0 22.06978 0.0 1
235 Street_Passerby_516 15.321 0.35 7.58 0.0 123.66821 0.0 1
236 Street_Passerby_517 -4.305 0.4 -7.595 0.0 125.55424 0.0 1
237 Street_Passerby_518 -1.701 0.4 -23.751 0.0 310.0 0.0 1
238 Street_Passerby_519 -19.162 0.36 -8.18 0.0 37.20817 0.0 1
239 Street_ObjectPos_03 -21.194 0.171 -9.311 0.0 0.0 0.0 1
240 Street_Passerby_520 -3.812 0.347 -17.462 0.0 247.24823 0.0 1
241 Street_NPCPos_Susie -25.671 0.6214 14.104 0.0 268.89499 0.0 1
242 Street_NPCPos_TinMaster01 -10.191 0.36 -1.46 0.0 345.65805 0.0 1
243 Street_NPCPos_TinMaster02 -6.288 0.3505 -7.195 0.0 321.44672 0.0 1
244 Street_NPCPos_Gate 7.03 0.35 0.017 0.0 0.0 0.0 1
245 Street_NPCPos_Ben 2.233 0.36 2.478 0.0 133.82996 0.0 1
246 Street_PlayerPos_FromRamen 6.074 0.0 -0.758 0.0 0.0 0.0 1
247 Street_NPCPos_Anton -34.865 0.396 13.443 0.0 142.69867 0.0 1
248 Street_NPCPos_OokumaMari 11.921 0.347 -8.374 0.0 219.14148 0.0 1
249 Street_Passerby_151 -4.573 0.34 0.044 0.0 168.11601 1.0 1
250 Street_Passerby_152 9.423 0.352 -32.084 0.0 339.92599 0.0 1
251 Street_Passerby_153 -26.66462 0.3402 7.56905 359.60715 269.99854 0.65592 1
252 Street_NPCPos_Anbi02 -22.5 0.36 0.573 0.0 163.69124 0.0 1
253 Street_NPCPos_Enzo 27.243 0.35 -1.528 0.0 229.92622 0.0 1
254 Street_NPCPos_OokumaMari02 3.281 0.3965 -10.212 0.0 31.35417 0.0 1
255 Street_NPCPos_Billy02 -13.986 0.36 -7.091 0.0 113.60025 0.0 1
256 Street_NPCPos_Tsubaki 10.39 0.35 -8.91 0.0 137.00946 0.0 1
257 Street_NPCPos_Anton02 26.712 0.35 -6.986 0.0 305.87402 0.0 1
258 Street_NPCPos_Nocha02 9.577 0.348 -7.368 0.0 151.92999 0.0 1
259 Street_NPCPos_Tsubaki02 -18.173 0.35 -6.936 0.0 133.66385 0.0 1
260 Street_NPCPos_OokumaMari04 -25.138 0.7161 16.08 0.0 326.39648 0.0 1
261 Street_NPCPos_Ben02 20.665 0.35 -10.565 0.0 251.54306 0.0 1
262 Street_NPCPos_OokumaMari03 -22.553 0.36 -0.064 0.0 159.34224 0.0 1
263 Street_NPCPos_Ben03 -21.869 0.35 0.596 0.0 192.34038 0.0 1
264 Street_NPCPos_Billy03 22.297 0.36 5.854 0.0 340.17264 0.0 1
265 Street_NPCPos_Nocha03 6.929 0.395 -1.278 0.0 342.26456 0.0 1
266 Street_NPCPos_Tsubaki03 7.076 0.35 -0.706 0.0 312.97723 0.0 1
267 Street_NPCPos_Anbi03 10.312 0.35 2.109 0.0 240.46249 0.0 1
268 Street_NPCPos_Ben04 -32.609 0.342 -8.256 0.0 67.92832 0.0 1
269 Street_NPCPos_OokumaMari05 -1.27 0.3492 -29.178 0.0 305.29065 0.0 1
270 Street_NPCPos_Anton03 -2.058 0.35 -28.686 0.0 125.14816 0.0 1
271 Street_NPCPos_Nocha04 -22.595 0.395 -7.348 0.0 125.5207 0.0 1
272 Street_NPCPos_Billy04 -3.506 0.36 -17.778 0.0 251.33165 0.0 1
273 Street_NPCPos_Anbi04 -4.261 0.35 -17.505 0.0 264.7402 0.0 1
274 Street_NPCPos_Schroeder02 -5.053 0.342 4.863 0.0 70.83122 0.0 1
275 Street_NPCPos_Schroeder03 3.253 0.323 1.458 0.0 92.53754 0.0 1
276 Street_Passerby_521 -32.515 2.3 30.558 0.0 75.47579 0.0 1
277 Street_Passerby_522 -29.71 2.3 29.43 0.0 209.83707 0.0 1
278 Street_Passerby_523 -30.529 2.3 28.95 0.0 55.32315 0.0 1
279 Street_Passerby_524 -26.636 0.368 7.484 0.0 250.28363 0.0 1
280 Street_Passerby_525 21.991 0.35 -1.218 0.0 245.47432 0.0 1
281 Street_Passerby_526 -27.72 0.35 12.558 0.0 70.0 0.0 1
282 Street_Passerby_527 -2.147 0.35 -23.641 0.0 290.0 0.0 1
283 Street_Passerby_528 -3.553 0.395 -18.033 0.0 155.24419 0.0 1
284 Street_Passerby_529 -2.866 0.395 -19.195 0.0 327.30453 0.0 1
285 Street_Passerby_530 2.248 0.35 17.375 0.0 240.0 0.0 1
286 Street_Passerby_531 -30.195 2.3 29.303 0.0 316.19141 0.0 1
287 Street_Passerby_532 -15.625 0.35 -6.819 0.0 195.36263 0.0 1
288 Street_Passerby_533 -2.562 0.35 -23.881 0.0 312.95004 0.0 1
289 Street_Passerby_534 -12.646 0.35 -18.012 0.0 255.57466 0.0 1
290 Street_Passerby_535 -13.387 0.35 -16.812 0.0 152.59938 0.0 1
291 Street_NPCPos_Shepherd02 -4.574 0.3346 1.6568 0.0 10.32042 0.0 1
292 Street_NPCPos_No11_04 10.123 0.356 1.745 0.0 142.0 0.0 1
293 Street_NPCPos_PAFUMEI 15.973 0.35 7.416 0.0 334.46896 0.0 1
294 Street_NPCPos_MEIKE 15.483 0.35 7.766 0.0 120.00001 0.0 1
295 Street_Passerby_536 3.952 0.4 -11.297 0.0 48.38462 0.0 1
296 Garage_PlayerPos_Default 19.05 0.42063 21.43 0.0 0.0 0.0 3
297 Garage_PlayerPos_FromWorkshop 19.05 0.42063 22.744 0.0 0.0 0.0 3
298 Garage_PlayerPos_FromStreet 12.79 0.42063 18.82 0.0 0.0 0.0 3
299 Garage_PlayerPos_Quest10020003 20.701 0.42063 29.794 0.0 220.0 0.0 3
300 Garage_NPCPos_ToWorkshop 19.13 0.25 19.663 0.0 0.0 0.0 3
301 Garage_NPCPos_ToStreet 12.836 0.476 15.002 0.0 0.0 0.0 3
302 Garage_NPCPos_Nocha_Quest10020003 17.614 0.35 30.44 0.0 136.39999 0.0 3
303 Garage_NPCPos_Billy_Quest10020003 15.226 0.32 27.58 0.0 82.8 0.0 3
304 Garage_NPCPos_Anbi_Quest10020003 15.319 0.32 28.817 0.0 94.7 0.0 3
305 Garage_NPCPos_Nocha_Quest10020012 17.39999 0.34 27.69 0.0 158.30615 0.0 3
306 Garage_NPCPos_Billy_Quest10020012 18.56 0.31 32.58 0.0 250.0 0.0 3
307 Garage_NPCPos_Anbi_Quest10020012 18.58 0.31 31.46 0.0 320.0 0.0 3
308 ItemPos_1 17.0 0.42063 24.5 0.0 0.0 0.0 3
309 ItemPos_2 18.0 0.42063 24.5 0.0 0.0 0.0 3
310 ItemPos_3 19.0 0.42063 24.5 0.0 0.0 0.0 3
311 ItemPos_4 20.0 0.42063 24.5 0.0 0.0 0.0 3
312 ItemPos_5 21.0 0.42063 24.5 0.0 0.0 0.0 3
313 Garage_PlayerPos_FromStreet2 11.254 0.42063 19.31 0.0 90.0 0.0 3
314 Garage_NPCPos_ToStreet2 8.785 0.42063 19.238 0.0 270.0 0.0 3
315 Garage_PlayerPos_Quest10020010 19.81 0.42063 27.32 0.0 0.0 0.0 3
316 Garage_Object_Car_01 16.19 0.29 31.46 0.0 135.89999 0.0 3
317 Garage_ObjectPos_14 23.874 0.86 31.988 0.0 0.0 0.0 3
318 Garage_ObjectPos_15 22.254 0.82 22.982 0.0 0.0 0.0 3
319 Garage_ObjectPos_16 31.804 0.42063 28.509 0.0 0.0 0.0 3
320 Garage_ObjectPos_17 29.128 0.25 22.05 0.0 0.0 0.0 3
321 Garage_ObjectPos_18 29.941 0.0 32.857 0.0 0.0 0.0 3
322 Garage_NPCPos_Quest10020024 18.54 0.34 27.46 0.0 210.79999 0.0 3
323 Garage_PlayerPos_Quest10020120 17.75 0.42063 26.39 0.0 30.00001 0.0 3
324 Garage_NPCPos_No11 13.818 0.301 26.28 0.0 70.26791 0.0 3
325 Garage_NPCPos_No11_02 29.598 0.345 23.527 0.0 308.61368 0.0 3
326 Garage_NPCPos_No11_03 15.599 0.345 20.68 0.0 335.6268 0.0 3
327 Garage_NPCPos_No11_04 13.97 0.3 25.64 0.74837 128.50786 359.98956 3
328 Garage_NPCPos_Quest10020120 21.467 0.3 30.233 0.0 206.48201 0.0 3
329 Garage_PlayerPos_Chat01 20.545 0.42063 29.194 0.0 43.57 0.0 3
330 Workshop_PlayerPos_Default 23.75 0.58003 12.5 0.0 202.0 0.0 2
331 Workshop_PlayerPos_FromStreet 22.598 0.58003 7.611 0.0 30.00001 0.0 2
332 Workshop_PlayerPos_FromGarage 22.112 0.58002 14.386 0.0 180.0 0.0 2
333 Workshop_PlayerPos_Quest10020003 23.375 0.58002 11.406 0.0 0.0 0.0 2
334 Workshop_PlayerPos_Quest10020013 29.982 0.58002 15.418 0.0 120.00001 0.0 2
335 Workshop_PlayerPos_Quest10020011 29.867 0.58002 11.406 0.0 30.0 0.0 2
336 Workshop_PlayerPos_Quest10020012 29.587 0.58002 11.979 0.0 92.99999 0.0 2
337 Workshop_PlayerPos_Quest10020001 30.31 0.58002 11.18 0.0 40.0 0.0 2
338 Workshop_PlayerPos_Quest10020028 30.38 0.58002 12.826 0.0 80.0 0.0 2
339 Workshop_PlayerPos_Pos1 29.44 0.605 15.48 0.0 0.0 0.0 2
340 Workshop_PlayerPos_Pos2 30.729 0.584 15.3 0.0 0.0 0.0 2
341 Workshop_NPCPos_ToGarage 22.093 0.749 16.512 0.0 180.0 0.0 2
342 Workshop_NPCPos_ToStreet 21.529 0.666 5.786 0.0 28.1 0.0 2
343 Workshop_NPCPos_Hollow 33.19 0.86 11.482 0.0 270.0 0.0 2
344 Workshop_NPCPos_VHS 28.02 0.87 16.887 0.0 0.0 0.0 2
345 Workshop_NPCPos_Gacha 19.368 1.41 6.382 0.0 270.0 0.0 2
346 Workshop_NPCPos_TimeMachine 30.08 0.4 14.386 0.0 0.0 0.0 2
347 Workshop_NPCPos_Test 28.875 0.58384 9.625 0.0 312.68036 0.0 2
348 Workshop_NPCPos_SisterLing 24.476 0.5998 10.557 0.0 313.60257 0.0 2
349 Workshop_NPCPos_WorkTable 28.336 0.75 8.292 0.0 44.79997 0.0 2
350 Workshop_NPCPos_Noca 22.0 0.58003 8.5 0.0 50.0 0.0 2
351 WorkShop_NPCPos_Noca_Quest10020001 33.372 0.626 14.29 0.0 270.0 0.0 2
352 WorkShop_NPCPos_Billy_Quest10020003 22.0 0.58003 9.5 0.0 125.0 0.0 2
353 WorkShop_NPCPos_Anbi_Quest10020003 23.0 0.58003 9.0 0.0 295.0 0.0 2
354 WorkShop_NPCPos_Noca_Quest10020009 24.14684 0.58003 12.46807 0.0 207.99998 0.0 2
355 WorkShop_NPCPos_Billy_Quest10020009 24.211 0.58003 10.839 0.0 318.87799 0.0 2
356 WorkShop_NPCPos_Anbi_Quest10020009 22.779 0.58384 11.511 0.0 103.268 0.0 2
357 WorkShop_NPCPos_Salesman_Quest10020103 23.46 0.58003 12.533 0.0 206.96613 0.0 2
358 WorkShop_NPCPos_Tsubaki_Quest10020106 31.594 0.597 15.71 0.0 237.34885 0.0 2
359 Workshop_NpcPos_Quest10020151 19.5 0.58003 10.89 0.0 240.0 0.0 2
360 Workshop_NpcPos_Quest10020181 19.674 0.58003 12.272 0.0 4.53792 0.0 2
361 Workshop_NPCPos_BangbooA_VHS 25.03 0.58003 6.0 0.0 280.0 0.0 2
362 Workshop_NPCPos_guest01_VHS 19.845 0.58003 8.695 0.0 312.21448 0.0 2
363 Workshop_NPCPos_guest02_VHS 19.777 0.58003 10.577 0.0 169.99998 0.0 2
364 Workshop_NPCPos_guest03_VHS 19.84 0.58003 15.49 0.0 270.0 0.0 2
365 Workshop_NPCPos_guest04_VHS 19.152 0.58003 7.176 0.0 250.0 0.0 2
366 Workshop_NPCPos_guest05_VHS 19.256 0.58003 11.563 0.0 300.0 0.0 2
367 Workshop_NPCPos_guest06_VHS 19.27 0.58003 14.28 0.0 240.0 0.0 2
368 Workshop_NPCPos_Bangboo01_VHS 21.29 0.58003 13.62 0.0 199.99998 0.0 2
369 Workshop_NPCPos_Bangboo02_VHS 21.93 0.58003 11.36 0.0 150.0 0.0 2
370 Workshop_NPCPos_Bangboo03_VHS 21.13 0.58003 9.31 0.0 99.99999 0.0 2
371 Workshop_NPCPos_Bangboo04_VHS 20.5 0.58003 10.36 0.0 180.0 0.0 2
372 Workshop_NPCPos_Bangboo05_VHS 22.1 0.58003 9.9 0.0 120.00001 0.0 2
373 Workshop_CameraPos_Pos1 30.85 1.93 13.0 8.0 335.0 0.0 2
374 Workshop_CameraPos_Pos2 29.39 1.93 13.2 8.0 30.0 0.0 2
375 Workshop_NPCPos_Telephone 26.807 1.008 8.432 0.0 270.0 0.0 2
376 Workshop_NPCPos_HollowPause 32.61 0.59 11.58 0.0 90.0 0.0 2
377 Workshop_NPCPos_VHSBangboo 26.098 1.337 9.692 0.0 260.0 0.0 2
378 Workshop_PlayerPos_HollowQuest 32.37027 0.58384 11.5826 0.0 86.69299 0.0 2
379 WorkShop_CameraPos_VHSStore 22.53 1.855 10.8 0.0 115.38 0.0 2
380 Workshop_PlayerPos_FromHollow 32.37027 0.58384 11.5826 0.0 86.69299 0.0 2
381 Workshop_PlayerPos_FromVHS 28.0 0.58384 15.6 0.0 0.0 0.0 2
382 Workshop_PlayerPos_VHSStore 22.758 0.58384 9.921 0.0 86.69299 0.0 2
383 Workshop_NPCPos_ARole1 32.5 0.594 15.027 0.0 150.0 0.0 2
384 Workshop_NPCPos_ARole2 31.15 0.594 12.748 0.0 270.0 0.0 2
385 Workshop_NPCPos_ARole3 32.1 0.594 12.55 0.0 120.00001 0.0 2
386 Workshop_NPCPos_ARole4 25.555 0.594 6.693 0.0 306.96448 0.0 2
387 Workshop_NPCPos_ARole5 28.429 0.594 15.22 0.0 186.60002 0.0 2
388 Workshop_NPCPos_ARole6 28.74 0.594 13.821 0.0 131.39603 0.0 2
389 WorkShop_NPCPos_Tsubaki_Quest10020115 28.903 0.58003 16.034 0.0 154.11002 0.0 2
390 Workshop_PlayerPos_Quest10020106 31.701 0.594 13.423 0.0 255.0 0.0 2
391 Workshop_PlayerPos_Quest10020115 30.447 0.594 12.817 0.0 296.12622 0.0 2
392 Workshop_Teleport_ToWorkshop 23.69 0.6 9.698 0.0 60.0 0.0 2
393 Workshop_NPCPos_ARole7 27.35 0.59 16.0 0.0 45.0 0.0 2
394 Workshop_NPCPos_ARole8 29.952 0.594 14.702 0.0 0.0 0.0 2
395 Workshop_NPCPos_ARole8F 30.263 0.594 14.64 0.0 0.0 0.0 2
396 Workshop_NPCPos_ARole9 31.6 0.594 10.85 0.0 307.60001 0.0 2
397 Workshop_NPCPos_ARole10 33.19 0.594 15.438 0.0 260.0 0.0 2
398 Workshop_NPCPos_ARoleTest 30.05 0.594 14.858 0.0 0.0 0.0 2
399 Workshop_PlayerPos_Quest10020109 30.628 0.594 11.88 0.0 280.0 0.0 2
400 Workshop_PlayerPos_Quest10020113 30.628 0.594 11.88 0.0 280.0 0.0 2
401 Workshop_PlayerPos_Quest10020116 30.506 0.594 11.88 0.0 90.0 0.0 2
402 Workshop_PlayerPos_Quest10020010 30.208 0.594 12.092 0.0 348.5 0.0 2
403 Workshop_NPCPos_DrawingRoom 24.38 0.594 6.223 0.0 353.79999 0.0 2
404 Workshop_PlayerPos_Quest10020119 30.892 0.594 10.112 0.0 125.60002 0.0 2
405 Workshop_NPCPos_ARole11 31.605 0.594 9.471 0.0 300.0 0.0 2
406 Workshop_NPCPos_ARole12 30.402 0.6 9.8 0.0 44.15999 0.0 2
407 Workshop_NPCPos_ARole17 30.645 0.58 15.042 0.0 0.0 0.0 2
408 Workshop_NPCPos_ARole16 28.292 0.593 8.216 3.08252 316.2569 0.0 2
409 Workshop_NPCPos_ARole16F 25.559 0.578 7.945 0.0 204.72104 0.0 2
410 Workshop_NPCPos_ARole15 33.043 0.6 13.442 0.0 0.0 0.0 2
411 Workshop_NPCPos_ARole14 33.043 0.6 13.442 0.0 0.0 0.0 2
412 Workshop_NPCPos_ARole13 33.043 0.6 13.442 0.0 0.0 0.0 2
413 WorkShop_NPCPos_Tsubaki_Quest10020119 31.19 0.59 10.23 0.0 289.17999 0.0 2
414 Workshop_PlayerPos_Quest10020151 20.396 0.58003 11.186 0.0 270.0 0.0 2
415 Workshop_PlayerPos_Quest10020111 28.9 0.588 13.1 0.0 129.89999 0.0 2
416 Workshop_NpcPos_VHS31020002 25.688 0.58003 7.624 0.0 251.93011 0.0 2
417 Workshop_NpcPos_VHS31020001 23.12 0.58003 6.209 0.0 29.26875 0.0 2
418 Workshop_NpcPos_VHS31010001 21.59 0.58003 15.2 0.0 240.0 0.0 2
419 Workshop_NpcPos_Bangboo_Quest10020141 25.28177 0.588 6.47026 0.0 320.26306 0.0 2
420 Workshop_NpcPos_Bangboo_Quest10020195 19.567 0.588 15.244 0.0 120.5 0.0 2
421 Workshop_NpcPos_VHS31010002 21.9 0.58003 14.84 0.0 240.0 0.0 2
422 Workshop_PlayerPos_VHS31020002 21.924 0.58003 12.388 0.0 315.51761 0.0 2
423 Workshop_PlayerPos_VHS31020001 24.0 0.58003 9.36 0.0 150.0 0.0 2
424 Workshop_PlayerPos_VHS31010001 21.59 0.58003 14.46 0.0 0.0 0.0 2
425 Workshop_PlayerPos_VHS31010002 21.9 0.58003 14.46 0.0 0.0 0.0 2
426 Workshop_NPCPos_No11_03 25.3 0.587 13.56 0.0 240.0 0.0 2
427 Workshop_PlayerPos_Quest10020123 30.724 0.594 11.259 0.0 125.60002 0.0 2
428 WorkShop_NPCPos_Bangboo_Quest10020106 32.19 0.595 15.605 0.0 337.73215 0.0 2
429 Workshop_Passerby_133 19.237 0.58003 8.191 0.0 290.0 0.0 2
430 Workshop_Passerby_134 19.838 0.58003 10.448 0.0 199.99998 0.0 2
431 Workshop_Passerby_135 19.435 0.58003 15.141 0.0 270.0 0.0 2
432 Workshop_Passerby_136 19.403 0.58003 7.347 0.0 260.0 0.0 2
433 Workshop_Passerby_137 19.292 0.58003 11.969 0.0 270.0 0.0 2
434 Workshop_Passerby_138 20.347 0.58003 15.573 0.0 340.0 0.0 2
435 Workshop_PlayerPos_HollowPause 31.23 0.584 13.08 0.0 118.0 0.0 2
436 Workshop_NPCPos_ARole17F 31.0 0.58 15.15 0.0 311.0 0.0 2
437 Workshop_NpcPos_VHS31020001End 24.626 0.58003 8.681 0.0 311.76859 0.0 2
438 Workshop_NpcPos_VHS31020002_02 25.503 0.58003 7.032 0.0 306.8797 0.0 2
439 Workshop_NpcPos_VHS31020002End 21.218 0.58003 12.853 0.0 126.61777 0.0 2
440 Workshop_NpcPos_VHS31020002_02End 21.66 0.58003 13.136 0.0 152.39877 0.0 2
441 Workshop_NPCPos_ARole18 31.802 0.594 14.909 0.0 283.90863 0.0 2
442 Workshop_PlayerPos_ARole18 28.258 0.594 15.121 0.0 81.46976 0.0 2
443 Borderlands 0.0 0.0 0.0 0.0 0.0 0.0 0

View file

@ -0,0 +1,36 @@
ID LockType LockParam UnlockType UnlockParam MenuType IconRes Name
1001 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconSundryBtn.png UIText_321
1002 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconGashaponBtn.png UIText_322
1003 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconShopBtn02.png UIText_323
1004 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconMissionBtn.png UIText_324
1005 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconYorozuyaManualBtn.png UIText_325
1006 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconBagBtn.png UIText_326
1007 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconBangBooBtn.png UIText_327
1008 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconRoleBtn02.png UIText_328
1009 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconTeleportBtn.png UIText_329
1010 1 None 0 None 0 None None
1011 1 MenuText_LockHint 1 MenuText_UnlockHint 0 None None
1013 1 None 0 None 0 None None
1014 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconSetUp.png UIText_330
1015 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconMail.png UIText_331
1016 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconNotice.png UIText_332
1017 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconFeedback.png UIText_354
1018 1 HollowPause_LockHint 0 None 0 None None
1019 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconSignOut UIText_367
10001 1 None 0 None 0 None None
10002 1 None 0 None 0 None None
10003 1 None 0 None 0 None None
10004 1 None 0 None 0 None None
10005 1 None 0 None 0 None None
10006 1 InventoryText_LockHint 0 InventoryText_UnlockHint 0 None None
10007 1 None 0 None 0 None None
10008 1 None 0 None 0 None None
10009 1 None 0 None 0 None None
10010 1 SmithyText_LockHint 1 SmithyText_UnlockHint 0 None None
10012 1 RamenText_LockHint 1 RamenText_UnlockHint 0 None None
10013 1 WorkbenchText_LockHint 1 WorkbenchText_UnlockHint 0 None None
10014 1 VHSStoreText_LockHint 1 VHSStoreText_UnlockHint 0 None None
10015 1 GroceryText_LockHint 1 GroceryText_UnlockHint 0 None None
10017 1 None 0 None 0 None None
10018 1 None 0 None 0 None None
10019 1 None 0 None 0 None None
1 ID LockType LockParam UnlockType UnlockParam MenuType IconRes Name
2 1001 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconSundryBtn.png UIText_321
3 1002 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconGashaponBtn.png UIText_322
4 1003 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconShopBtn02.png UIText_323
5 1004 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconMissionBtn.png UIText_324
6 1005 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconYorozuyaManualBtn.png UIText_325
7 1006 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconBagBtn.png UIText_326
8 1007 1 None 0 None 0 UI/Sprite/MainCityMenus/Packer/IconBangBooBtn.png UIText_327
9 1008 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconRoleBtn02.png UIText_328
10 1009 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconTeleportBtn.png UIText_329
11 1010 1 None 0 None 0 None None
12 1011 1 MenuText_LockHint 1 MenuText_UnlockHint 0 None None
13 1013 1 None 0 None 0 None None
14 1014 1 None 0 None 1 UI/Sprite/MainCityMenus/Packer/IconSetUp.png UIText_330
15 1015 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconMail.png UIText_331
16 1016 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconNotice.png UIText_332
17 1017 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconFeedback.png UIText_354
18 1018 1 HollowPause_LockHint 0 None 0 None None
19 1019 2 None 0 None 2 UI/Sprite/A1DynamicLoad/IconMenusOption/Packer/IconSignOut UIText_367
20 10001 1 None 0 None 0 None None
21 10002 1 None 0 None 0 None None
22 10003 1 None 0 None 0 None None
23 10004 1 None 0 None 0 None None
24 10005 1 None 0 None 0 None None
25 10006 1 InventoryText_LockHint 0 InventoryText_UnlockHint 0 None None
26 10007 1 None 0 None 0 None None
27 10008 1 None 0 None 0 None None
28 10009 1 None 0 None 0 None None
29 10010 1 SmithyText_LockHint 1 SmithyText_UnlockHint 0 None None
30 10012 1 RamenText_LockHint 1 RamenText_UnlockHint 0 None None
31 10013 1 WorkbenchText_LockHint 1 WorkbenchText_UnlockHint 0 None None
32 10014 1 VHSStoreText_LockHint 1 VHSStoreText_UnlockHint 0 None None
33 10015 1 GroceryText_LockHint 1 GroceryText_UnlockHint 0 None None
34 10017 1 None 0 None 0 None None
35 10018 1 None 0 None 0 None None
36 10019 1 None 0 None 0 None None

6
common/Cargo.toml Normal file
View file

@ -0,0 +1,6 @@
[package]
name = "common"
edition = "2021"
version.workspace = true
[dependencies]

1
common/src/lib.rs Normal file
View file

@ -0,0 +1 @@
pub mod util;

25
common/src/util.rs Normal file
View file

@ -0,0 +1,25 @@
use std::time::{SystemTime, UNIX_EPOCH};
pub fn load_or_create_config(path: &str, defaults: &str) -> String {
std::fs::read_to_string(path).map_or_else(
|_| {
std::fs::write(path, defaults).unwrap();
defaults.to_string()
},
|data| data,
)
}
pub fn cur_timestamp_ms() -> i64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as i64
}
pub fn cur_timestamp_seconds() -> i64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs() as i64
}

View file

@ -1 +1 @@
SKIP_TUTORIAL=0 SKIP_TUTORIAL=1

View file

@ -6,15 +6,14 @@ version.workspace = true
[dependencies] [dependencies]
ansi_term.workspace = true ansi_term.workspace = true
anyhow.workspace = true anyhow.workspace = true
atomic_refcell.workspace = true
dirs.workspace = true dirs.workspace = true
dotenv.workspace = true
env_logger.workspace = true env_logger.workspace = true
hex.workspace = true hex.workspace = true
lazy_static.workspace = true
paste.workspace = true paste.workspace = true
sysinfo.workspace = true sysinfo.workspace = true
itertools.workspace = true
csv.workspace = true
serde.workspace = true serde.workspace = true
serde_json.workspace = true serde_json.workspace = true
@ -27,8 +26,10 @@ tracing-log.workspace = true
tracing-subscriber.workspace = true tracing-subscriber.workspace = true
tracing-bunyan-formatter.workspace = true tracing-bunyan-formatter.workspace = true
common.workspace = true
protocol.workspace = true protocol.workspace = true
qwer.workspace = true qwer.workspace = true
parking_lot.workspace = true
[[bin]] [[bin]]
name = "nap-gameserver" name = "nap-gameserver"

View file

@ -0,0 +1,5 @@
{
"gateway_endpoint": "0.0.0.0:10301",
"skip_tutorial": false,
"system_resources_logging": false
}

22
gameserver/src/config.rs Normal file
View file

@ -0,0 +1,22 @@
use std::sync::LazyLock;
use common::util::load_or_create_config;
use serde::Deserialize;
const DEFAULT_CONFIG: &str = include_str!("../gameserver.default.json");
#[derive(Deserialize)]
pub struct GameServerConfig {
pub gateway_endpoint: String,
pub skip_tutorial: bool,
pub system_resources_logging: bool,
}
pub static CONFIGURATION: LazyLock<GameServerConfig> = LazyLock::new(|| {
serde_json::from_str(&load_or_create_config("gameserver.json", DEFAULT_CONFIG))
.expect("Failed to parse server configuration file")
});
pub fn init_config() {
let _configuration = &*CONFIGURATION;
}

View file

@ -0,0 +1,102 @@
#![allow(unused)]
use std::collections::{BTreeMap, HashSet};
use protocol::{HollowEventType, NodeState, NodeVisible};
use serde::{Deserialize, Deserializer};
#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ConfigEventGraph {
#[serde(rename = "ID")]
pub id: i32,
pub events: BTreeMap<ConfigEventType, ConfigEvent>,
}
#[derive(Deserialize, Default)]
#[serde(untagged)]
pub enum ConfigValue {
Constant(i32),
Expression(String),
#[default]
Empty,
}
#[derive(Deserialize, Ord, PartialOrd, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub enum ConfigEventType {
OnStart,
OnEnd,
OnBro,
OnSis,
#[serde(other)]
Unknown,
}
#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ConfigEvent {
#[serde(default)]
pub actions: Vec<ConfigAction>,
}
#[derive(Deserialize, Default)]
pub enum HollowPositionOffsetType {
#[default]
Relative = 0,
Absolute = 1,
EventPos = 2,
}
#[derive(Deserialize, Default)]
#[serde(tag = "$type")]
pub enum ConfigAction {
#[serde(rename = "Share.CConfigEmpty")]
ConfigEmpty,
#[serde(rename = "Share.CConfigSetMapState")]
#[serde(rename_all = "PascalCase")]
ConfigSetMapState {
#[serde(default)]
x: ConfigValue,
#[serde(default)]
y: ConfigValue,
#[serde(default)]
position: HollowPositionOffsetType,
radius: Option<ConfigValue>,
count: Option<ConfigValue>,
#[serde(default)]
r#type: HashSet<HollowEventType>,
event_type_tag: Option<String>,
#[serde(default)]
from_visible_state: HashSet<NodeVisible>,
#[serde(default)]
to_visible_state: Vec<NodeVisible>,
#[serde(default)]
from_state: HashSet<NodeState>,
#[serde(default)]
to_state: Vec<NodeState>,
#[serde(default)]
exclude_player_pos: bool,
#[serde(default)]
index_list: Vec<ConfigValue>,
#[serde(default)]
use_perform: bool,
},
#[serde(rename = "Share.CConfigTriggerBattle")]
#[serde(rename_all = "PascalCase")]
ConfigTriggerBattle {
#[serde(rename = "BattleID")]
battle_id: ConfigValue,
on_success: Option<String>,
on_failure: Option<String>,
#[serde(default)]
end_hollow: bool,
#[serde(default)]
goto_next_hollow: bool,
},
#[serde(rename = "Share.CConfigFinishHollow")]
ConfigFinishHollow,
#[default]
#[serde(other)]
ConfigUnknown,
}

View file

@ -0,0 +1,76 @@
mod event_graph;
mod templates;
mod tsv_util;
use std::{collections::HashMap, path::Path};
use anyhow::{bail, Result};
pub use event_graph::*;
use paste::paste;
pub use templates::*;
use tokio::sync::OnceCell;
macro_rules! template_collections {
($($template_type:ident;)*) => {
$(paste! {
static [<$template_type:snake:upper _COLLECTION>]: OnceCell<Vec<[<$template_type Template>]>> = OnceCell::const_new();
})*
fn init_template_collections() -> Result<()> {
$(paste! {
let path = concat!("assets/TemplateCollections/", stringify!($template_type), "TemplateCollection.tsv");
let data = std::fs::read_to_string(path)?;
[<$template_type:snake:upper _COLLECTION>].set(tsv_util::from_str(&data)?).unwrap();
})*
Ok(())
}
$(paste! {
pub fn [<iter_ $template_type:snake _collection>]() -> ::std::slice::Iter<'static, [<$template_type Template>]> {
[<$template_type:snake:upper _COLLECTION>].get().unwrap().iter()
}
})*
};
}
template_collections! {
AvatarConfig;
UnlockConfig;
MainCityObject;
NPCTransform;
}
static EVENT_GRAPH_COLLECTION: OnceCell<HashMap<i32, ConfigEventGraph>> = OnceCell::const_new();
fn init_binoutput() -> Result<()> {
let _ = EVENT_GRAPH_COLLECTION.set(serde_json::from_str(
std::fs::read_to_string("assets/BinOutput/EventGraphCollection.json")?.as_str(),
)?);
Ok(())
}
pub fn init_assets() -> Result<()> {
if !Path::new("assets/").exists() {
bail!(
"Assets directory not found! Make sure you have it in the same directory with executable."
)
}
init_template_collections()?;
init_binoutput()
}
pub fn get_main_city_object(tag_id: i32, npc_id: i32) -> Option<&'static MainCityObjectTemplate> {
iter_main_city_object_collection().find(|o| o.tag_id == tag_id && o.npc_id == npc_id)
}
pub fn is_transform_in_section(transform_id: &str, section_id: i32) -> bool {
iter_n_p_c_transform_collection()
.find(|t| t.id == transform_id)
.map_or(false, |t| t.section == section_id)
}
pub fn get_event_graph(id: i32) -> Option<&'static ConfigEventGraph> {
EVENT_GRAPH_COLLECTION.get().unwrap().get(&id)
}

View file

@ -0,0 +1,162 @@
#![allow(dead_code)]
use super::tsv_util::from_sequence;
use serde::Deserialize;
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct MainCityObjectTemplate {
#[serde(rename = "TagID")]
pub tag_id: i32,
#[serde(rename = "NPCID")]
pub npc_id: i32,
pub create_position: String,
pub create_type: i32,
#[serde(rename = "DefaultInteractIDs")]
#[serde(deserialize_with = "from_sequence")]
pub default_interact_ids: Vec<i32>,
pub interact_name: Option<String>,
pub interact_shape: i32,
#[serde(deserialize_with = "from_sequence")]
pub interact_scale: Vec<f64>,
pub fan_interact_param: Option<String>,
pub focus_interact_scale: f64,
pub ignore_collider: bool,
#[serde(rename = "LookIK")]
pub look_ik: bool,
#[serde(rename = "NPCLookIK")]
pub npc_look_ik: bool,
#[serde(rename = "SceneSoundID")]
pub scene_sound_id: i32,
pub player_rotate: bool,
#[serde(rename = "NPCRotate")]
pub npc_rotate: bool,
pub scene_object_name: Option<String>,
pub camera_story_key: Option<String>,
pub action_state: i32,
pub collider_state: Option<String>,
pub item_state: Option<String>,
#[serde(rename = "ObjectIDs")]
#[serde(deserialize_with = "from_sequence")]
pub object_ids: Vec<i32>,
pub create_interval: i32,
pub create_delay: i32,
#[serde(rename = "NPCIcon")]
pub npc_icon: Option<String>,
pub action_switch: Option<String>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct NPCTransformTemplate {
#[serde(rename = "ID")]
pub id: String,
pub position_x: f64,
pub position_y: f64,
pub position_z: f64,
pub rotation_x: f64,
pub rotation_y: f64,
pub rotation_z: f64,
pub section: i32,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct UnlockConfigTemplate {
#[serde(rename = "ID")]
pub id: i32,
pub lock_type: i32,
pub lock_param: Option<String>,
pub unlock_type: i32,
pub unlock_param: Option<String>,
pub menu_type: i32,
pub icon_res: Option<String>,
pub name: Option<String>,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct AvatarConfigTemplate {
#[serde(rename = "ID")]
pub id: i32,
pub code_name: String,
pub name: String,
pub audio_event_replace_param: String,
pub audio_bank: String,
pub hud_icon_path: String,
pub hollow_icon_path: String,
pub icon_path: String,
pub rect_icon_path: String,
pub avatar_path: String,
pub script_config_path: String,
#[serde(rename = "UIScriptConfigPath")]
pub uiscript_config_path: String,
pub prefab_path: String,
#[serde(rename = "UIPrefabPath")]
pub uiprefab_path: String,
pub main_page_show: bool,
pub need_show: bool,
#[serde(deserialize_with = "from_sequence")]
pub hit_types: Vec<i32>,
#[serde(deserialize_with = "from_sequence")]
pub element_types: Vec<i32>,
#[serde(deserialize_with = "from_sequence")]
pub tags: Vec<String>,
pub gender: i32,
pub camp: i32,
pub camp_name: Option<String>,
pub group_icon_path: String,
pub weapon_type: i32,
pub star_initial: i32,
#[serde(rename = "AvatarPieceID")]
pub avatar_piece_id: i32,
pub avatar_decompose: i32,
pub avatar_compose: i32,
#[serde(rename = "HP")]
pub hp: i32,
#[serde(rename = "HPGrowth")]
pub hp_growth: i32,
pub armor: i32,
pub armor_growth: i32,
pub shield: i32,
pub shield_growth: i32,
pub endurance: i32,
pub attack: i32,
pub attack_growth: i32,
pub defence: i32,
pub defence_growth: i32,
pub crit: i32,
pub crit_damage: i32,
pub crit_res: i32,
pub crit_dmg_res: i32,
pub pen_rate: i32,
pub pen_delta: i32,
pub luck: i32,
pub stun: i32,
pub break_stun: i32,
#[serde(rename = "SPBarPoint")]
pub spbar_point: i32,
pub sp_recover: i32,
#[serde(rename = "RBL")]
pub rbl: i32,
#[serde(rename = "RBLCorrectionFactor")]
pub rblcorrection_factor: i32,
#[serde(rename = "RBLProbability")]
pub rblprobability: i32,
pub buff_resist_burn_possibility_ratio: i32,
pub buff_resist_burn_possibility_delta: i32,
pub buff_resist_frozen_possibility_ratio: i32,
pub buff_resist_frozen_possibility_delta: i32,
pub buff_resist_electric_possibility_ratio: i32,
pub buff_resist_electric_possibility_delta: i32,
pub weapon: i32,
#[serde(rename = "RBP")]
pub rbp: i32,
#[serde(rename = "RBPFadeOutRate")]
pub rbp_fade_out_rate: i32,
#[serde(rename = "RBPFadeOutTime")]
pub rbp_fade_out_time: i32,
#[serde(rename = "RBPCorrectionFactor")]
pub rbp_correction_factor: i32,
#[serde(rename = "RBPProbability")]
pub rbp_probability: i32,
}

View file

@ -0,0 +1,31 @@
use std::str::FromStr;
use anyhow::Result;
use csv::ReaderBuilder;
use serde::{de::DeserializeOwned, Deserialize, Deserializer};
pub fn from_sequence<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
where
D: Deserializer<'de>,
T: FromStr + Default,
{
let sequence = String::deserialize(deserializer)?;
match sequence.len() {
0 => Ok(vec![]),
_ => Ok(sequence
.split(",")
.map(|s| s.parse::<T>().unwrap_or_default())
.collect()),
}
}
pub fn from_str<'de, T>(data: &str) -> Result<Vec<T>, csv::Error>
where
T: DeserializeOwned,
{
let mut reader = ReaderBuilder::new()
.delimiter(b'\t')
.from_reader(data.as_bytes());
reader.deserialize::<T>().collect()
}

View file

@ -1,7 +1,7 @@
use std::sync::Arc; use std::sync::Arc;
use anyhow::Result; use anyhow::Result;
use atomic_refcell::AtomicRefCell; use parking_lot::RwLock;
use protocol::{PlayerInfo, PtcPlayerInfoChangedArg}; use protocol::{PlayerInfo, PtcPlayerInfoChangedArg};
use crate::net::NetworkSession; use crate::net::NetworkSession;
@ -12,42 +12,30 @@ use super::manager::{
}; };
pub struct GameContext { pub struct GameContext {
pub player: Arc<AtomicRefCell<PlayerInfo>>, #[allow(unused)]
pub uid_manager: Arc<AtomicRefCell<UniqueIDManager>>, pub uid_manager: Arc<UniqueIDManager>,
pub item_manager: Arc<AtomicRefCell<ItemManager>>, pub item_manager: Arc<ItemManager>,
pub dungeon_manager: Arc<AtomicRefCell<DungeonManager>>, pub dungeon_manager: Arc<DungeonManager>,
pub quest_manager: Arc<AtomicRefCell<QuestManager>>, pub quest_manager: Arc<QuestManager>,
pub scene_unit_manager: Arc<AtomicRefCell<SceneUnitManager>>, pub scene_unit_manager: Arc<SceneUnitManager>,
pub hollow_grid_manager: Arc<AtomicRefCell<HollowGridManager>>, pub hollow_grid_manager: Arc<HollowGridManager>,
pub unlock_manager: Arc<AtomicRefCell<UnlockManager>>, pub unlock_manager: Arc<UnlockManager>,
pub yorozuya_quest_manager: Arc<AtomicRefCell<YorozuyaQuestManager>>, pub yorozuya_quest_manager: Arc<YorozuyaQuestManager>,
} }
impl GameContext { impl GameContext {
pub fn new(player: Arc<AtomicRefCell<PlayerInfo>>) -> Self { pub fn new(player: Arc<RwLock<PlayerInfo>>) -> Self {
let uid_manager = Arc::new(AtomicRefCell::new(UniqueIDManager::new())); let uid_manager = Arc::new(UniqueIDManager::new());
Self { Self {
player: player.clone(),
uid_manager: uid_manager.clone(), uid_manager: uid_manager.clone(),
item_manager: Arc::new(AtomicRefCell::new(ItemManager::new( item_manager: Arc::new(ItemManager::new(uid_manager.clone(), player.clone())),
uid_manager.clone(), dungeon_manager: Arc::new(DungeonManager::new(uid_manager.clone(), player.clone())),
player.clone(), quest_manager: Arc::new(QuestManager::new(uid_manager.clone(), player.clone())),
))), scene_unit_manager: Arc::new(SceneUnitManager::new(uid_manager)),
dungeon_manager: Arc::new(AtomicRefCell::new(DungeonManager::new( hollow_grid_manager: Arc::new(HollowGridManager::new(player.clone())),
uid_manager.clone(), unlock_manager: Arc::new(UnlockManager::new(player.clone())),
player.clone(), yorozuya_quest_manager: Arc::new(YorozuyaQuestManager::new(player)),
))),
quest_manager: Arc::new(AtomicRefCell::new(QuestManager::new(
uid_manager.clone(),
player.clone(),
))),
scene_unit_manager: Arc::new(AtomicRefCell::new(SceneUnitManager::new(uid_manager))),
hollow_grid_manager: Arc::new(AtomicRefCell::new(HollowGridManager::new(
player.clone(),
))),
unlock_manager: Arc::new(AtomicRefCell::new(UnlockManager::new(player.clone()))),
yorozuya_quest_manager: Arc::new(AtomicRefCell::new(YorozuyaQuestManager::new(player))),
} }
} }
} }
@ -64,21 +52,21 @@ impl<T> PlayerOperationResult<T>
where where
T: Send + Sync, T: Send + Sync,
{ {
pub const fn unwrap(&self) -> &T { pub fn take(self) -> T {
&self.result self.result
} }
pub async fn send_changes(&mut self, session: &NetworkSession) -> Result<&T> { pub async fn send_changes(mut self, session: &NetworkSession) -> Result<T> {
if self.player_info_changes.is_some() { if self.player_info_changes.is_some() {
let ptc_player_info_changed = PtcPlayerInfoChangedArg { let ptc_player_info_changed = PtcPlayerInfoChangedArg {
player_uid: session.get_player_uid(), player_uid: session.player_uid().raw(),
player_info: self.player_info_changes.take().unwrap(), player_info: self.player_info_changes.take().unwrap(),
}; };
session.send_rpc_arg(101, &ptc_player_info_changed).await?; session.push_rpc_arg(101, ptc_player_info_changed).await?;
} }
Ok(self.unwrap()) Ok(self.take())
} }
pub const fn ret(result: T) -> Self { pub const fn ret(result: T) -> Self {

View file

@ -1,18 +0,0 @@
use lazy_static::lazy_static;
use serde_json::{Map, Value};
pub const EVENT_GRAPH_COLLECTION: &str = include_str!("../../EventGraphCollection.json");
lazy_static! {
static ref EVENT_MAP: Map<String, Value> = {
serde_json::from_str::<Value>(EVENT_GRAPH_COLLECTION)
.unwrap()
.as_object()
.unwrap()
.clone()
};
}
pub fn get_event_config_json(id: i32) -> &'static Value {
EVENT_MAP.get(&id.to_string()).unwrap()
}

View file

@ -1,11 +0,0 @@
use std::env;
use lazy_static::lazy_static;
lazy_static! {
static ref SKIP_TUTORIAL: i32 = env::var("SKIP_TUTORIAL").map_or(0, |v| v.parse().unwrap());
}
pub fn should_skip_tutorial() -> bool {
*SKIP_TUTORIAL != 0
}

View file

@ -1,5 +1,5 @@
use anyhow::{anyhow, bail, Result}; use anyhow::{anyhow, bail, Result};
use atomic_refcell::AtomicRefCell; use parking_lot::RwLock;
use protocol::*; use protocol::*;
use std::sync::Arc; use std::sync::Arc;
@ -9,26 +9,23 @@ use qwer::{
}; };
pub struct DungeonManager { pub struct DungeonManager {
uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>, uid_mgr: Arc<UniqueIDManager>,
player: Arc<AtomicRefCell<PlayerInfo>>, player: Arc<RwLock<PlayerInfo>>,
scene_properties: AtomicRefCell<PropertyDoubleKeyHashMap<u64, u16, i32>>, scene_properties: RwLock<PropertyDoubleKeyHashMap<u64, u16, i32>>,
} }
impl DungeonManager { impl DungeonManager {
pub fn new( pub fn new(uid_mgr: Arc<UniqueIDManager>, player: Arc<RwLock<PlayerInfo>>) -> Self {
uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>,
player: Arc<AtomicRefCell<PlayerInfo>>,
) -> Self {
Self { Self {
uid_mgr, uid_mgr,
player, player,
scene_properties: AtomicRefCell::new(pdkhashmap![]), scene_properties: RwLock::new(pdkhashmap![]),
} }
} }
pub fn enter_main_city(&self) -> Result<PlayerOperationResult<PtcEnterSceneArg>> { pub fn enter_main_city(&self) -> Result<PlayerOperationResult<PtcEnterSceneArg>> {
let (player_uid, scene_position, scene_rotation) = { let (player_uid, scene_position, scene_rotation) = {
let player = self.player.borrow(); let player = self.player.read();
let pos_in_main_city = player.pos_in_main_city.as_ref().unwrap(); let pos_in_main_city = player.pos_in_main_city.as_ref().unwrap();
( (
@ -38,7 +35,7 @@ impl DungeonManager {
) )
}; };
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let default_scene_uid = player let default_scene_uid = player
.dungeon_collection .dungeon_collection
.as_ref() .as_ref()
@ -92,21 +89,25 @@ impl DungeonManager {
}, },
}; };
let add_dungeon = dungeon_info.clone();
let add_scene = scene_info.clone();
let cur_scene_uid = scene_info.get_uid();
Ok(PlayerOperationResult::with_changes( Ok(PlayerOperationResult::with_changes(
ptc_enter_scene, ptc_enter_scene,
PlayerInfo { PlayerInfo {
dungeon_collection: Some(DungeonCollection { dungeon_collection: Some(DungeonCollection {
dungeons: Some(PropertyHashMap::Modify { dungeons: Some(PropertyHashMap::Modify {
to_add: vec![(dungeon_info.uid, dungeon_info.clone())], to_add: vec![(add_dungeon.uid, add_dungeon)],
to_remove: Vec::new(), to_remove: Vec::new(),
}), }),
scenes: Some(PropertyHashMap::Modify { scenes: Some(PropertyHashMap::Modify {
to_add: vec![(scene_info.get_uid(), scene_info.clone())], to_add: vec![(add_scene.get_uid(), add_scene)],
to_remove: Vec::new(), to_remove: Vec::new(),
}), }),
..Default::default() ..Default::default()
}), }),
scene_uid: Some(scene_info.get_uid()), scene_uid: Some(cur_scene_uid),
..Default::default() ..Default::default()
}, },
)) ))
@ -117,7 +118,7 @@ impl DungeonManager {
scene_uid: u64, scene_uid: u64,
section_id: i32, section_id: i32,
) -> PlayerOperationResult<PtcEnterSectionArg> { ) -> PlayerOperationResult<PtcEnterSectionArg> {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let scene_info = player let scene_info = player
.dungeon_collection .dungeon_collection
.as_mut() .as_mut()
@ -146,7 +147,7 @@ impl DungeonManager {
pub fn enter_scene(&self, scene_uid: u64) -> Result<PlayerOperationResult<PtcEnterSceneArg>> { pub fn enter_scene(&self, scene_uid: u64) -> Result<PlayerOperationResult<PtcEnterSceneArg>> {
let (player_uid, prev_scene_uid) = { let (player_uid, prev_scene_uid) = {
let player = self.player.borrow(); let player = self.player.read();
( (
*player.uid.as_ref().unwrap(), *player.uid.as_ref().unwrap(),
@ -154,7 +155,7 @@ impl DungeonManager {
) )
}; };
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
player.scene_uid.replace(scene_uid); player.scene_uid.replace(scene_uid);
player.prev_scene_uid.replace(prev_scene_uid); player.prev_scene_uid.replace(prev_scene_uid);
let dungeon_collection = player.dungeon_collection.as_mut().unwrap(); let dungeon_collection = player.dungeon_collection.as_mut().unwrap();
@ -244,9 +245,74 @@ impl DungeonManager {
)) ))
} }
pub fn hollow_finished(&self) -> PlayerOperationResult<u64> {
let cur_scene_uid = self.get_cur_scene_uid();
let mut player = self.player.write();
let hollow_scene = player
.dungeon_collection
.as_mut()
.unwrap()
.scenes
.as_mut()
.unwrap()
.get_mut(&cur_scene_uid)
.unwrap();
let dungeon_uid = hollow_scene.get_dungeon_uid();
if let SceneInfo::Hollow {
hollow_system_ui_state,
..
} = hollow_scene
{
hollow_system_ui_state.insert(
HollowSystemType::HollowResultPage,
HollowSystemUIState::Normal,
);
hollow_system_ui_state.insert(HollowSystemType::Menu, HollowSystemUIState::Close);
}
let add_scene = hollow_scene.clone();
let quest_data = player.quest_data.as_ref().unwrap();
let mut dungeon_quest = quest_data
.quests
.as_ref()
.unwrap()
.get(&dungeon_uid, &1001000101)
.unwrap()
.clone();
dungeon_quest.set_progress(1);
dungeon_quest.set_finished_count(1);
dungeon_quest.set_state(QuestState::Finished);
PlayerOperationResult::with_changes(
cur_scene_uid,
PlayerInfo {
dungeon_collection: Some(DungeonCollection {
scenes: Some(PropertyHashMap::Modify {
to_add: vec![(cur_scene_uid, add_scene)],
to_remove: Vec::new(),
}),
..Default::default()
}),
quest_data: Some(QuestData {
quests: Some(PropertyDoubleKeyHashMap::Modify {
to_add: vec![(dungeon_uid, 1001000101, dungeon_quest)],
to_remove: Vec::new(),
}),
..Default::default()
}),
..Default::default()
},
)
}
pub fn get_default_scene_uid(&self) -> u64 { pub fn get_default_scene_uid(&self) -> u64 {
self.player self.player
.borrow() .read()
.dungeon_collection .dungeon_collection
.as_ref() .as_ref()
.unwrap() .unwrap()
@ -257,7 +323,7 @@ impl DungeonManager {
#[allow(dead_code)] #[allow(dead_code)]
pub fn get_default_scene_uid_for_dungeon(&self, dungeon_uid: u64) -> u64 { pub fn get_default_scene_uid_for_dungeon(&self, dungeon_uid: u64) -> u64 {
self.player self.player
.borrow() .read()
.dungeon_collection .dungeon_collection
.as_ref() .as_ref()
.unwrap() .unwrap()
@ -270,11 +336,11 @@ impl DungeonManager {
} }
pub fn get_cur_scene_uid(&self) -> u64 { pub fn get_cur_scene_uid(&self) -> u64 {
self.player.borrow().scene_uid.unwrap() self.player.read().scene_uid.unwrap()
} }
fn add_default_hollow_properties(&self, scene_uid: u64) { fn add_default_hollow_properties(&self, scene_uid: u64) {
let mut props = self.scene_properties.borrow_mut(); let mut props = self.scene_properties.write();
for (sub_key, value) in &[ for (sub_key, value) in &[
(1001, 0), (1001, 0),
@ -313,7 +379,7 @@ impl DungeonManager {
let back_scene_uid = self.get_back_scene_uid(); let back_scene_uid = self.get_back_scene_uid();
{ {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let hollow_scene = player let hollow_scene = player
.dungeon_collection .dungeon_collection
@ -337,7 +403,7 @@ impl DungeonManager {
} }
fn get_back_scene_uid(&self) -> u64 { fn get_back_scene_uid(&self) -> u64 {
let player = self.player.borrow(); let player = self.player.read();
let fight_scene_uid = player.scene_uid.as_ref().unwrap(); let fight_scene_uid = player.scene_uid.as_ref().unwrap();
let fight_scene = player let fight_scene = player
.dungeon_collection .dungeon_collection
@ -353,11 +419,11 @@ impl DungeonManager {
} }
pub fn enter_battle(&self, scene_uid: u64) -> PlayerOperationResult<PtcEnterSceneArg> { pub fn enter_battle(&self, scene_uid: u64) -> PlayerOperationResult<PtcEnterSceneArg> {
let hollow_scene_uid = *self.player.borrow().scene_uid.as_ref().unwrap(); let hollow_scene_uid = *self.player.read().scene_uid.as_ref().unwrap();
let hollow_scene = self.set_cur_hollow_battle(scene_uid, hollow_scene_uid); let hollow_scene = self.set_cur_hollow_battle(scene_uid, hollow_scene_uid);
let ptc_enter_scene = self.enter_scene(scene_uid).unwrap().unwrap().clone(); let ptc_enter_scene = self.enter_scene(scene_uid).unwrap().take().clone();
let player = self.player.borrow(); let player = self.player.read();
let dungeon_collection = player.dungeon_collection.as_ref().unwrap(); let dungeon_collection = player.dungeon_collection.as_ref().unwrap();
let fight_scene = dungeon_collection let fight_scene = dungeon_collection
.scenes .scenes
@ -387,7 +453,7 @@ impl DungeonManager {
} }
fn set_cur_hollow_battle(&self, scene_uid: u64, hollow_scene_uid: u64) -> SceneInfo { fn set_cur_hollow_battle(&self, scene_uid: u64, hollow_scene_uid: u64) -> SceneInfo {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let hollow_scene = player let hollow_scene = player
.dungeon_collection .dungeon_collection
.as_mut() .as_mut()
@ -413,12 +479,12 @@ impl DungeonManager {
} }
pub fn create_fight(&self, id: i32, hollow_scene_uid: u64) -> PlayerOperationResult<u64> { pub fn create_fight(&self, id: i32, hollow_scene_uid: u64) -> PlayerOperationResult<u64> {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let dungeon_collection = player.dungeon_collection.as_mut().unwrap(); let dungeon_collection = player.dungeon_collection.as_mut().unwrap();
let scenes = dungeon_collection.scenes.as_mut().unwrap(); let scenes = dungeon_collection.scenes.as_mut().unwrap();
let hollow_scene = scenes.get_mut(&hollow_scene_uid).unwrap(); let hollow_scene = scenes.get_mut(&hollow_scene_uid).unwrap();
let fight_scene_uid = self.uid_mgr.borrow().next(); let fight_scene_uid = self.uid_mgr.next();
let fight_scene = SceneInfo::Fight { let fight_scene = SceneInfo::Fight {
uid: fight_scene_uid, uid: fight_scene_uid,
id, id,
@ -452,10 +518,11 @@ impl DungeonManager {
) )
} }
#[allow(dead_code)]
pub fn is_in_tutorial(&self) -> bool { pub fn is_in_tutorial(&self) -> bool {
let cur_scene_uid = self.get_cur_scene_uid(); let cur_scene_uid = self.get_cur_scene_uid();
let player = self.player.borrow(); let player = self.player.read();
let cur_scene = player let cur_scene = player
.dungeon_collection .dungeon_collection
.as_ref() .as_ref()
@ -480,7 +547,7 @@ impl DungeonManager {
let mut dungeon = self.create_base_dungeon(id, back_scene_uid, world_quest_id); let mut dungeon = self.create_base_dungeon(id, back_scene_uid, world_quest_id);
dungeon.hollow_event_version = 526; dungeon.hollow_event_version = 526;
let scene_uid = self.uid_mgr.borrow().next(); let scene_uid = self.uid_mgr.next();
dungeon.default_scene_uid = scene_uid; dungeon.default_scene_uid = scene_uid;
dungeon.scene_properties_uid = scene_uid; dungeon.scene_properties_uid = scene_uid;
@ -491,7 +558,7 @@ impl DungeonManager {
index.try_into().unwrap(), index.try_into().unwrap(),
AvatarUnitInfo { AvatarUnitInfo {
uid: *avatar_uid, uid: *avatar_uid,
properties_uid: self.uid_mgr.borrow().next(), properties_uid: self.uid_mgr.next(),
is_banned: false, is_banned: false,
modified_property: pdkhashmap![], modified_property: pdkhashmap![],
hp_add_hollow: 0, hp_add_hollow: 0,
@ -566,10 +633,10 @@ impl DungeonManager {
}; };
{ {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
player player
.scene_properties .scene_properties
.replace(self.scene_properties.borrow().clone()); .replace(self.scene_properties.read().clone());
let dungeon_collection = player.dungeon_collection.as_mut().unwrap(); let dungeon_collection = player.dungeon_collection.as_mut().unwrap();
@ -584,7 +651,7 @@ impl DungeonManager {
.unwrap() .unwrap()
.insert(scene_uid, scene.clone()); .insert(scene_uid, scene.clone());
} }
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let items = player.items.as_mut().unwrap(); let items = player.items.as_mut().unwrap();
let mut updated_items = Vec::new(); let mut updated_items = Vec::new();
@ -598,7 +665,7 @@ impl DungeonManager {
} }
let mut prop_changes = Vec::new(); let mut prop_changes = Vec::new();
for (key, sub_key, value) in &*self.scene_properties.borrow_mut() { for (key, sub_key, value) in &*self.scene_properties.write() {
prop_changes.push((*key, *sub_key, *value)); prop_changes.push((*key, *sub_key, *value));
} }
@ -633,7 +700,7 @@ impl DungeonManager {
let mut dungeon = self.create_base_dungeon(id, 0, 0); let mut dungeon = self.create_base_dungeon(id, 0, 0);
let dungeon_uid = dungeon.uid; let dungeon_uid = dungeon.uid;
let scene_uid = self.uid_mgr.borrow().next(); let scene_uid = self.uid_mgr.next();
let hall_scene_info = SceneInfo::Hall { let hall_scene_info = SceneInfo::Hall {
uid: scene_uid, uid: scene_uid,
id, id,
@ -650,7 +717,7 @@ impl DungeonManager {
dungeon.default_scene_uid = scene_uid; dungeon.default_scene_uid = scene_uid;
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let dungeon_collection = player.dungeon_collection.as_mut().unwrap(); let dungeon_collection = player.dungeon_collection.as_mut().unwrap();
dungeon_collection dungeon_collection
@ -690,7 +757,7 @@ impl DungeonManager {
let mut dungeon = self.create_base_dungeon(2, 0, 0); let mut dungeon = self.create_base_dungeon(2, 0, 0);
let dungeon_uid = dungeon.uid; let dungeon_uid = dungeon.uid;
let scene_uid = self.uid_mgr.borrow().next(); let scene_uid = self.uid_mgr.next();
let fresh_scene_info = SceneInfo::Fresh { let fresh_scene_info = SceneInfo::Fresh {
uid: scene_uid, uid: scene_uid,
id: 2, id: 2,
@ -707,7 +774,7 @@ impl DungeonManager {
dungeon.default_scene_uid = scene_uid; dungeon.default_scene_uid = scene_uid;
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let dungeon_collection = player.dungeon_collection.as_mut().unwrap(); let dungeon_collection = player.dungeon_collection.as_mut().unwrap();
dungeon_collection dungeon_collection
@ -747,8 +814,8 @@ impl DungeonManager {
back_scene_uid: u64, back_scene_uid: u64,
world_quest_id: i32, world_quest_id: i32,
) -> DungeonInfo { ) -> DungeonInfo {
let player = self.player.borrow(); let player = self.player.read();
let uid = self.uid_mgr.borrow().next(); let uid = self.uid_mgr.next();
DungeonInfo { DungeonInfo {
uid, uid,

View file

@ -3,28 +3,29 @@ use std::{
sync::Arc, sync::Arc,
}; };
use crate::game::data; use parking_lot::RwLock;
use atomic_refcell::AtomicRefCell;
use protocol::*; use protocol::*;
use qwer::{phashmap, phashset, PropertyHashMap, PropertyHashSet}; use qwer::{phashmap, phashset, PropertyHashMap, PropertyHashSet};
use crate::data::{self, ConfigAction, ConfigEventType, ConfigValue};
pub struct HollowGridManager { pub struct HollowGridManager {
player: Arc<AtomicRefCell<PlayerInfo>>, player: Arc<RwLock<PlayerInfo>>,
map: AtomicRefCell<Option<HollowGridMapProtocolInfo>>, map: RwLock<Option<HollowGridMapProtocolInfo>>,
events: AtomicRefCell<HashMap<u64, EventInfo>>, events: RwLock<HashMap<u64, EventInfo>>,
} }
impl HollowGridManager { impl HollowGridManager {
pub fn new(player: Arc<AtomicRefCell<PlayerInfo>>) -> Self { pub fn new(player: Arc<RwLock<PlayerInfo>>) -> Self {
Self { Self {
player, player,
map: AtomicRefCell::new(None), map: RwLock::new(None),
events: AtomicRefCell::new(HashMap::new()), events: RwLock::new(HashMap::new()),
} }
} }
pub fn get_cur_position_in_hollow(&self) -> u16 { pub fn get_cur_position_in_hollow(&self) -> u16 {
self.map.borrow().as_ref().unwrap().start_grid self.map.read().as_ref().unwrap().start_grid
} }
pub fn move_to( pub fn move_to(
@ -32,7 +33,7 @@ impl HollowGridManager {
destination_grid: u16, destination_grid: u16,
scene_uid: u64, scene_uid: u64,
) -> (PtcHollowGridArg, Option<PtcSyncHollowEventInfoArg>) { ) -> (PtcHollowGridArg, Option<PtcSyncHollowEventInfoArg>) {
let mut map = self.map.borrow_mut(); let mut map = self.map.write();
let map = map.as_mut().unwrap(); let map = map.as_mut().unwrap();
map.start_grid = destination_grid; map.start_grid = destination_grid;
@ -40,7 +41,7 @@ impl HollowGridManager {
self.update_position_to_scene(scene_uid, destination_grid); self.update_position_to_scene(scene_uid, destination_grid);
let mut events = self.events.borrow_mut(); let mut events = self.events.write();
let sync_event_info = let sync_event_info =
if let Entry::Vacant(entry) = events.entry(u64::from(destination_grid)) { if let Entry::Vacant(entry) = events.entry(u64::from(destination_grid)) {
let event_info = EventInfo { let event_info = EventInfo {
@ -81,7 +82,7 @@ impl HollowGridManager {
( (
PtcHollowGridArg { PtcHollowGridArg {
player_uid: self.player.borrow().uid.unwrap(), player_uid: self.player.read().uid.unwrap(),
is_partial: true, is_partial: true,
scene_uid, scene_uid,
hollow_level: 1, hollow_level: 1,
@ -91,32 +92,45 @@ impl HollowGridManager {
) )
} }
pub fn battle_finished(&self) -> PtcSyncHollowEventInfoArg { pub fn battle_finished(&self) -> (PtcSyncHollowEventInfoArg, bool) {
let map = self.map.borrow(); let map = self.map.read();
let map = map.as_ref().unwrap(); let map = map.as_ref().unwrap();
let cur_grid = map.grids.get(&map.start_grid).unwrap(); let cur_grid = map.grids.get(&map.start_grid).unwrap();
PtcSyncHollowEventInfoArg { let graph =
event_graph_uid: u64::from(map.start_grid), data::get_event_graph(cur_grid.grid.event_graph_info.hollow_event_template_id).unwrap();
hollow_event_template_id: cur_grid.grid.event_graph_info.hollow_event_template_id,
event_graph_id: cur_grid.grid.event_graph_info.hollow_event_template_id, let mut hollow_finished = false;
updated_event: EventInfo { if let Some(event) = graph.events.get(&ConfigEventType::OnEnd) {
id: 1000, if let Some(ConfigAction::ConfigFinishHollow) = event.actions.first() {
cur_action_id: 2001, hollow_finished = true;
action_move_path: vec![1001, 1002, 2001], }
state: EventState::WaitingClient,
prev_state: EventState::Running,
cur_action_info: ActionInfo::None {},
cur_action_state: ActionState::Init,
predicated_failed_actions: phashset![],
stack_frames: Vec::new(),
},
specials: phashmap![],
} }
(
PtcSyncHollowEventInfoArg {
event_graph_uid: u64::from(map.start_grid),
hollow_event_template_id: cur_grid.grid.event_graph_info.hollow_event_template_id,
event_graph_id: cur_grid.grid.event_graph_info.hollow_event_template_id,
updated_event: EventInfo {
id: 1000,
cur_action_id: 2001,
action_move_path: vec![1001, 1002, 2001],
state: EventState::WaitingClient,
prev_state: EventState::Running,
cur_action_info: ActionInfo::None {},
cur_action_state: ActionState::Init,
predicated_failed_actions: phashset![],
stack_frames: Vec::new(),
},
specials: phashmap![],
},
hollow_finished,
)
} }
pub fn get_cur_event_template_id(&self) -> i32 { pub fn get_cur_event_template_id(&self) -> i32 {
let map = self.map.borrow(); let map = self.map.read();
let map = map.as_ref().unwrap(); let map = map.as_ref().unwrap();
let cur_grid = map.grids.get(&map.start_grid).unwrap(); let cur_grid = map.grids.get(&map.start_grid).unwrap();
@ -124,7 +138,7 @@ impl HollowGridManager {
} }
fn update_position_to_scene(&self, scene_uid: u64, pos: u16) { fn update_position_to_scene(&self, scene_uid: u64, pos: u16) {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let scene = player let scene = player
.dungeon_collection .dungeon_collection
.as_mut() .as_mut()
@ -156,14 +170,19 @@ impl HollowGridManager {
event_graph_uid: u64, event_graph_uid: u64,
_event_id: i32, _event_id: i32,
move_path: Vec<i32>, move_path: Vec<i32>,
) -> (PtcSyncHollowEventInfoArg, PtcHollowGridArg, Option<i32>) { ) -> (
PtcSyncHollowEventInfoArg,
PtcHollowGridArg,
Option<i32>,
bool,
) {
let (player_uid, scene_uid) = { let (player_uid, scene_uid) = {
let player = self.player.borrow(); let player = self.player.read();
(player.uid.unwrap(), player.scene_uid.unwrap()) (player.uid.unwrap(), player.scene_uid.unwrap())
}; };
let mut map = self.map.borrow_mut(); let mut map = self.map.write();
let map = map.as_mut().unwrap(); let map = map.as_mut().unwrap();
let mut trigger_battle_id = None; let mut trigger_battle_id = None;
@ -175,32 +194,33 @@ impl HollowGridManager {
grids: HashMap::new(), grids: HashMap::new(),
}; };
let mut hollow_finished = false;
let sync_hollow_event = { let sync_hollow_event = {
let info = map.grids.get(&(event_graph_uid as u16)).unwrap().clone(); let info = map.grids.get(&(event_graph_uid as u16)).unwrap().clone();
let event_config = let graph =
data::get_event_config_json(info.grid.event_graph_info.hollow_event_template_id); data::get_event_graph(info.grid.event_graph_info.hollow_event_template_id).unwrap();
let mut last_action = &ConfigAction::ConfigEmpty;
let mut last_exec_type = "";
for id in &move_path { for id in &move_path {
let index = (id % 1000) - 1; let index = (id % 1000) - 1;
let actions = if id / 1000 == 1 { let event = if id / 1000 == 1 {
event_config["Events"]["OnStart"]["Actions"] graph.events.get(&ConfigEventType::OnStart)
.as_array()
.unwrap()
} else { } else {
event_config["Events"]["OnEnd"]["Actions"] graph.events.get(&ConfigEventType::OnEnd)
.as_array()
.unwrap()
}; };
if let Some(action) = actions.get(index as usize) { if let Some(action) = event.unwrap().actions.get(index as usize) {
last_exec_type = action["$type"].as_str().unwrap(); last_action = action;
match action["$type"].as_str().unwrap() { match action {
"Share.CConfigSetMapState" => { ConfigAction::ConfigSetMapState { x, y, .. } => {
let x = action["X"].as_i64().unwrap() as u16; let (ConfigValue::Constant(x), ConfigValue::Constant(y)) = (x, y)
let y = action["Y"].as_i64().unwrap() as u16; else {
panic!("ConfigSetMapState: only constant values are supported");
};
let uid = (y * 11) + x; let uid = ((y * 11) + x) as u16;
if let Some(info) = map.grids.get_mut(&uid) { if let Some(info) = map.grids.get_mut(&uid) {
info.grid.flag |= HollowGridFlag::Visible as i32 info.grid.flag |= HollowGridFlag::Visible as i32
| HollowGridFlag::CanMove as i32 | HollowGridFlag::CanMove as i32
@ -209,13 +229,16 @@ impl HollowGridManager {
grid_update.grids.insert(uid, info.clone()); grid_update.grids.insert(uid, info.clone());
} }
} }
"Share.CConfigTriggerBattle" => { ConfigAction::ConfigTriggerBattle { .. } => {
trigger_battle_id = trigger_battle_id =
Some(match info.grid.event_graph_info.hollow_event_template_id { Some(match info.grid.event_graph_info.hollow_event_template_id {
1000107 => 10101002, 1000107 => 10101002,
_ => 10101001, _ => 10101001,
}); });
} }
ConfigAction::ConfigFinishHollow => {
hollow_finished = true;
}
_ => {} _ => {}
}; };
} }
@ -223,15 +246,11 @@ impl HollowGridManager {
let mut action_move_path = move_path; let mut action_move_path = move_path;
let last_client_action = *action_move_path.iter().last().unwrap(); let last_client_action = *action_move_path.last().unwrap();
let actions = if last_client_action / 1000 == 1 { let actions = if last_client_action / 1000 == 1 {
event_config["Events"]["OnStart"]["Actions"] &graph.events.get(&ConfigEventType::OnStart).unwrap().actions
.as_array()
.unwrap()
} else { } else {
event_config["Events"]["OnEnd"]["Actions"] &graph.events.get(&ConfigEventType::OnEnd).unwrap().actions
.as_array()
.unwrap()
}; };
let state = if last_client_action == -1 { let state = if last_client_action == -1 {
EventState::Finished EventState::Finished
@ -239,32 +258,14 @@ impl HollowGridManager {
action_move_path.push(-1); action_move_path.push(-1);
EventState::Finished EventState::Finished
} else { } else {
if last_exec_type != "Share.CConfigEmpty" { if !matches!(last_action, ConfigAction::ConfigEmpty) {
action_move_path.push(last_client_action + 1); action_move_path.push(last_client_action + 1);
} }
EventState::WaitingClient EventState::WaitingClient
}; };
let finish_event = if last_exec_type != "Share.CConfigTriggerBattle" { let finish_event = if let ConfigAction::ConfigTriggerBattle { .. } = last_action {
PtcSyncHollowEventInfoArg {
event_graph_uid,
hollow_event_template_id: info.grid.event_graph_info.hollow_event_template_id,
event_graph_id: info.grid.event_graph_info.hollow_event_template_id,
updated_event: EventInfo {
id: 1000,
cur_action_id: *action_move_path.iter().last().unwrap(),
action_move_path,
state,
prev_state: EventState::Running,
cur_action_info: ActionInfo::None {},
cur_action_state: ActionState::Init,
predicated_failed_actions: phashset![],
stack_frames: Vec::new(),
},
specials: phashmap![],
}
} else {
PtcSyncHollowEventInfoArg { PtcSyncHollowEventInfoArg {
event_graph_uid, event_graph_uid,
hollow_event_template_id: info.grid.event_graph_info.hollow_event_template_id, hollow_event_template_id: info.grid.event_graph_info.hollow_event_template_id,
@ -282,13 +283,36 @@ impl HollowGridManager {
}, },
specials: phashmap![], specials: phashmap![],
} }
} else {
PtcSyncHollowEventInfoArg {
event_graph_uid,
hollow_event_template_id: info.grid.event_graph_info.hollow_event_template_id,
event_graph_id: info.grid.event_graph_info.hollow_event_template_id,
updated_event: EventInfo {
id: 1000,
cur_action_id: *action_move_path.last().unwrap(),
action_move_path,
state,
prev_state: EventState::Running,
cur_action_info: ActionInfo::None {},
cur_action_state: ActionState::Init,
predicated_failed_actions: phashset![],
stack_frames: Vec::new(),
},
specials: phashmap![],
}
}; };
//tracing::info!("sending evt info: {:#?}", &finish_event); //tracing::info!("sending evt info: {:#?}", &finish_event);
finish_event finish_event
}; };
(sync_hollow_event, grid_update, trigger_battle_id) (
sync_hollow_event,
grid_update,
trigger_battle_id,
hollow_finished,
)
} }
pub fn sync_hollow_maps(&self, player_uid: u64, scene_uid: u64) -> PtcSyncHollowGridMapsArg { pub fn sync_hollow_maps(&self, player_uid: u64, scene_uid: u64) -> PtcSyncHollowGridMapsArg {
@ -296,14 +320,14 @@ impl HollowGridManager {
player_uid, player_uid,
scene_uid, scene_uid,
hollow_level: 1, hollow_level: 1,
main_map: self.map.borrow().clone().unwrap(), main_map: self.map.read().clone().unwrap(),
time_period: TimePeriodType::Random, time_period: TimePeriodType::Random,
weather: WeatherType::Random, weather: WeatherType::Random,
} }
} }
pub fn init_default_map(&self) { pub fn init_default_map(&self) {
*self.map.borrow_mut() = Some(HollowGridMapProtocolInfo { *self.map.write() = Some(HollowGridMapProtocolInfo {
row: 5, row: 5,
col: 11, col: 11,
start_grid: 22, start_grid: 22,

View file

@ -1,4 +1,4 @@
use atomic_refcell::AtomicRefCell; use parking_lot::RwLock;
use protocol::{ItemInfo, PlayerInfo}; use protocol::{ItemInfo, PlayerInfo};
use qwer::{phashmap, PropertyHashMap}; use qwer::{phashmap, PropertyHashMap};
use std::sync::Arc; use std::sync::Arc;
@ -8,15 +8,12 @@ use crate::game::{util, PlayerOperationResult};
use super::UniqueIDManager; use super::UniqueIDManager;
pub struct ItemManager { pub struct ItemManager {
uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>, uid_mgr: Arc<UniqueIDManager>,
player_info: Arc<AtomicRefCell<PlayerInfo>>, player_info: Arc<RwLock<PlayerInfo>>,
} }
impl ItemManager { impl ItemManager {
pub fn new( pub fn new(uid_mgr: Arc<UniqueIDManager>, player_info: Arc<RwLock<PlayerInfo>>) -> Self {
uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>,
player_info: Arc<AtomicRefCell<PlayerInfo>>,
) -> Self {
Self { Self {
uid_mgr, uid_mgr,
player_info, player_info,
@ -24,7 +21,7 @@ impl ItemManager {
} }
pub fn add_resource(&self, currency_id: i32, amount: i32) -> PlayerOperationResult<i32> { pub fn add_resource(&self, currency_id: i32, amount: i32) -> PlayerOperationResult<i32> {
let mut player_info = self.player_info.borrow_mut(); let mut player_info = self.player_info.write();
for (uid, item) in player_info.items.as_mut().unwrap() { for (uid, item) in player_info.items.as_mut().unwrap() {
if let ItemInfo::Resource { id, count, .. } = item { if let ItemInfo::Resource { id, count, .. } = item {
@ -45,7 +42,7 @@ impl ItemManager {
} }
} }
let uid = self.uid_mgr.borrow().next(); let uid = self.uid_mgr.next();
let item = ItemInfo::Resource { let item = ItemInfo::Resource {
uid, uid,
id: currency_id, id: currency_id,
@ -70,7 +67,7 @@ impl ItemManager {
} }
pub fn unlock_avatar(&self, id: i32) -> PlayerOperationResult<u64> { pub fn unlock_avatar(&self, id: i32) -> PlayerOperationResult<u64> {
let uid = self.uid_mgr.borrow().next(); let uid = self.uid_mgr.next();
let avatar = ItemInfo::Avatar { let avatar = ItemInfo::Avatar {
uid, uid,
@ -89,10 +86,10 @@ impl ItemManager {
}; };
// Unlock & equip default weapon // Unlock & equip default weapon
let weapon_uid = *self.unlock_weapon(10012).unwrap(); let weapon_uid = self.unlock_weapon(10012).take();
self.equip_weapon(weapon_uid, uid); self.equip_weapon(weapon_uid, uid);
let mut player_info = self.player_info.borrow_mut(); let mut player_info = self.player_info.write();
let items = player_info.items.as_mut().unwrap(); let items = player_info.items.as_mut().unwrap();
items.insert(uid, avatar.clone()); items.insert(uid, avatar.clone());
@ -112,10 +109,10 @@ impl ItemManager {
} }
pub fn unlock_weapon(&self, id: i32) -> PlayerOperationResult<u64> { pub fn unlock_weapon(&self, id: i32) -> PlayerOperationResult<u64> {
let mut player_info = self.player_info.borrow_mut(); let mut player_info = self.player_info.write();
let items = player_info.items.as_mut().unwrap(); let items = player_info.items.as_mut().unwrap();
let uid = self.uid_mgr.borrow().next(); let uid = self.uid_mgr.next();
let weapon = ItemInfo::Weapon { let weapon = ItemInfo::Weapon {
uid, uid,
@ -149,7 +146,7 @@ impl ItemManager {
weapon_uid: u64, weapon_uid: u64,
equip_avatar_uid: u64, equip_avatar_uid: u64,
) -> PlayerOperationResult<bool> { ) -> PlayerOperationResult<bool> {
let mut player_info = self.player_info.borrow_mut(); let mut player_info = self.player_info.write();
let items = player_info.items.as_mut().unwrap(); let items = player_info.items.as_mut().unwrap();
let Some(ItemInfo::Weapon { avatar_uid, .. }) = items.get_mut(&weapon_uid) else { let Some(ItemInfo::Weapon { avatar_uid, .. }) = items.get_mut(&weapon_uid) else {

View file

@ -1,4 +1,4 @@
use atomic_refcell::AtomicRefCell; use parking_lot::RwLock;
use protocol::{AccountInfo, PlayerInfo, PropertyBlob}; use protocol::{AccountInfo, PlayerInfo, PropertyBlob};
use qwer::OctData; use qwer::OctData;
use std::sync::Arc; use std::sync::Arc;
@ -7,17 +7,17 @@ const CLIENT_PROP_FLAG: u16 = 1;
#[derive(Default)] #[derive(Default)]
pub struct PropertyManager { pub struct PropertyManager {
pub account_info: Arc<AtomicRefCell<AccountInfo>>, pub account_info: Arc<RwLock<AccountInfo>>,
pub player_info: Arc<AtomicRefCell<PlayerInfo>>, pub player_info: Arc<RwLock<PlayerInfo>>,
} }
impl PropertyManager { impl PropertyManager {
pub fn serialize_account_info(&self) -> PropertyBlob { pub fn serialize_account_info(&self) -> PropertyBlob {
Self::serialize_property(&*self.account_info.borrow()).unwrap() Self::serialize_property(&*self.account_info.read()).unwrap()
} }
pub fn serialize_player_info(&self) -> PropertyBlob { pub fn serialize_player_info(&self) -> PropertyBlob {
Self::serialize_property(&*self.player_info.borrow()).unwrap() Self::serialize_property(&*self.player_info.read()).unwrap()
} }
pub fn serialize_property(prop: &impl OctData) -> Result<PropertyBlob, std::io::Error> { pub fn serialize_property(prop: &impl OctData) -> Result<PropertyBlob, std::io::Error> {

View file

@ -1,6 +1,6 @@
use std::sync::Arc; use std::sync::Arc;
use atomic_refcell::AtomicRefCell; use parking_lot::RwLock;
use qwer::PropertyDoubleKeyHashMap; use qwer::PropertyDoubleKeyHashMap;
use crate::game::PlayerOperationResult; use crate::game::PlayerOperationResult;
@ -9,22 +9,19 @@ use super::UniqueIDManager;
use protocol::*; use protocol::*;
pub struct QuestManager { pub struct QuestManager {
uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>, uid_mgr: Arc<UniqueIDManager>,
player: Arc<AtomicRefCell<PlayerInfo>>, player: Arc<RwLock<PlayerInfo>>,
} }
impl QuestManager { impl QuestManager {
pub fn new( pub fn new(uid_mgr: Arc<UniqueIDManager>, player: Arc<RwLock<PlayerInfo>>) -> Self {
uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>,
player: Arc<AtomicRefCell<PlayerInfo>>,
) -> Self {
Self { uid_mgr, player } Self { uid_mgr, player }
} }
pub fn add_world_quest(&self, quest: QuestInfo) -> PlayerOperationResult<u64> { pub fn add_world_quest(&self, quest: QuestInfo) -> PlayerOperationResult<u64> {
let mut world_quest_collection_uid = self let mut world_quest_collection_uid = self
.player .player
.borrow() .read()
.quest_data .quest_data
.as_ref() .as_ref()
.unwrap() .unwrap()
@ -32,9 +29,9 @@ impl QuestManager {
.unwrap(); .unwrap();
if world_quest_collection_uid == 0 { if world_quest_collection_uid == 0 {
world_quest_collection_uid = self.uid_mgr.borrow().next(); world_quest_collection_uid = self.uid_mgr.next();
self.player self.player
.borrow_mut() .write()
.quest_data .quest_data
.as_mut() .as_mut()
.unwrap() .unwrap()
@ -50,7 +47,7 @@ impl QuestManager {
collection_uid: u64, collection_uid: u64,
mut quest: QuestInfo, mut quest: QuestInfo,
) -> PlayerOperationResult<u64> { ) -> PlayerOperationResult<u64> {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let quest_data = player.quest_data.as_mut().unwrap(); let quest_data = player.quest_data.as_mut().unwrap();
quest.set_collection_uid(collection_uid); quest.set_collection_uid(collection_uid);

View file

@ -1,21 +1,24 @@
use std::{collections::HashMap, sync::Arc}; use std::{collections::HashMap, sync::Arc};
use atomic_refcell::AtomicRefCell; use anyhow::{bail, Result};
use parking_lot::RwLock;
use protocol::*; use protocol::*;
use qwer::{phashmap, PropertyHashMap}; use qwer::{phashmap, PropertyHashMap};
use crate::data;
use super::UniqueIDManager; use super::UniqueIDManager;
pub struct SceneUnitManager { pub struct SceneUnitManager {
uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>, uid_mgr: Arc<UniqueIDManager>,
units: AtomicRefCell<HashMap<u64, SceneUnitProtocolInfo>>, units: RwLock<HashMap<u64, SceneUnitProtocolInfo>>,
} }
impl SceneUnitManager { impl SceneUnitManager {
pub fn new(uid_mgr: Arc<AtomicRefCell<UniqueIDManager>>) -> Self { pub fn new(uid_mgr: Arc<UniqueIDManager>) -> Self {
Self { Self {
uid_mgr, uid_mgr,
units: AtomicRefCell::new(HashMap::new()), units: RwLock::new(HashMap::new()),
} }
} }
@ -26,9 +29,9 @@ impl SceneUnitManager {
quest_id: i32, quest_id: i32,
interacts_info: PropertyHashMap<i32, InteractInfo>, interacts_info: PropertyHashMap<i32, InteractInfo>,
) -> u64 { ) -> u64 {
let uid = self.uid_mgr.borrow().next(); let uid = self.uid_mgr.next();
self.units.borrow_mut().insert( self.units.write().insert(
uid, uid,
SceneUnitProtocolInfo::NpcProtocolInfo { SceneUnitProtocolInfo::NpcProtocolInfo {
uid, uid,
@ -42,6 +45,10 @@ impl SceneUnitManager {
uid uid
} }
pub fn get(&self, uid: u64) -> Option<SceneUnitProtocolInfo> {
self.units.read().get(&uid).map(|u| u.clone())
}
pub fn sync(&self, scene_uid: u64, section_id: i32) -> PtcSyncSceneUnitArg { pub fn sync(&self, scene_uid: u64, section_id: i32) -> PtcSyncSceneUnitArg {
PtcSyncSceneUnitArg { PtcSyncSceneUnitArg {
scene_uid, scene_uid,
@ -50,181 +57,74 @@ impl SceneUnitManager {
removed_scene_units: Vec::new(), removed_scene_units: Vec::new(),
scene_units: self scene_units: self
.units .units
.borrow() .read()
.iter() .iter()
.map(|(_uid, unit)| unit.clone()) .map(|(_, unit)| unit.clone())
.collect(), .collect(),
} }
} }
pub fn add_scene_units(&self, section_id: i32) {
for o in data::iter_main_city_object_collection().filter(|o| {
o.create_type == 0
&& data::is_transform_in_section(&o.create_position, section_id)
&& o.default_interact_ids.len() != 0
&& !o.create_position.ends_with("_Test")
}) {
self.create_npc(
o.npc_id,
o.tag_id,
0,
PropertyHashMap::Base(
o.default_interact_ids
.iter()
.map(|id| {
(
*id,
create_interact(
*id,
o.interact_shape as u16,
InteractScale::from_slice(&o.interact_scale).unwrap(),
&o.interact_name.clone().unwrap_or_default(),
phashmap![],
),
)
})
.collect(),
),
);
}
}
// TODO: partial_sync for newly added/removed units // TODO: partial_sync for newly added/removed units
}
// currently hardcoded for Main City section 2 struct InteractScale(pub f64, pub f64, pub f64, pub f64, pub f64);
pub fn add_default_units(&self) { impl InteractScale {
self.create_npc( pub fn from_slice(v: &[f64]) -> Result<Self> {
100171011, if v.len() != 5 {
3, bail!("InteractScale slice should contain 5 values");
0, }
phashmap![(
19900006,
create_interact(
0,
1,
2.0,
0.0,
0.0,
0.0,
0.0,
"",
phashmap![(0, String::new())]
)
)],
);
self.create_npc( Ok(Self(v[0], v[1], v[2], v[3], v[4]))
100171011,
4,
0,
phashmap![(
19900006,
create_interact(
0,
1,
2.0,
0.0,
0.0,
0.0,
0.0,
"",
phashmap![(0, String::new())]
)
)],
);
self.create_npc(
100171011,
1002,
0,
phashmap![(
19900062,
create_interact(
0,
1,
2.0,
0.0,
0.0,
0.0,
0.0,
"",
phashmap![(0, String::new())]
)
)],
);
self.create_npc(
100171011,
1001,
0,
phashmap![(
10000010,
create_interact(
10000010,
1,
1.0,
0.0,
0.0,
0.0,
0.0,
"A",
phashmap![(1001, String::from("A"))]
)
)],
);
self.create_npc(
100171011,
1005,
0,
phashmap![(
10000014,
create_interact(
10000014,
1,
1.0,
0.0,
0.0,
0.0,
0.0,
"A",
phashmap![(1005, String::from("A"))]
)
)],
);
self.create_npc(
100173001,
2028,
0,
phashmap![(
19900052,
create_interact(
19900052,
2,
9.0,
2.0,
2.0,
90.0,
10.0,
"A",
phashmap![(2028, String::from("A"))]
)
)],
);
self.create_npc(
100172011,
2000,
0,
phashmap![(
19900030,
create_interact(
0,
1,
2.0,
0.0,
0.0,
0.0,
0.0,
"",
phashmap![(2000, String::from("A")), (2052, String::from("B"))]
)
)],
);
self.create_npc(100172081, 2052, 0, phashmap![]);
} }
} }
#[allow(clippy::too_many_arguments)]
fn create_interact( fn create_interact(
interact_id: i32, interact_id: i32,
interact_shape: u16, interact_shape: u16,
scale_x: f64, scale: InteractScale,
scale_y: f64,
scale_z: f64,
scale_w: f64,
scale_r: f64,
name: &str, name: &str,
participators: PropertyHashMap<i32, String>, participators: PropertyHashMap<i32, String>,
) -> InteractInfo { ) -> InteractInfo {
InteractInfo { InteractInfo {
interact_id, interact_id,
interact_shape, interact_shape,
scale_x, scale_x: scale.0,
scale_y, scale_y: scale.1,
scale_z, scale_z: scale.2,
scale_w, scale_w: scale.3,
scale_r, scale_r: scale.4,
name: name.to_string(), name: name.to_string(),
participators, participators,
} }

View file

@ -1,22 +1,14 @@
use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::atomic::{AtomicU64, Ordering};
const BASE_UID: u64 = 1000000; pub struct UniqueIDManager(AtomicU64);
pub struct UniqueIDManager {
uid_counter: AtomicU64,
}
impl UniqueIDManager { impl UniqueIDManager {
const BASE_UID: u64 = 1000000;
pub const fn new() -> Self { pub const fn new() -> Self {
Self { Self(AtomicU64::new(Self::BASE_UID))
uid_counter: AtomicU64::new(BASE_UID),
}
} }
pub fn next(&self) -> u64 { pub fn next(&self) -> u64 {
let uid = self.uid_counter.load(Ordering::SeqCst) + 1; self.0.fetch_add(1, Ordering::SeqCst) + 1
self.uid_counter.store(uid, Ordering::SeqCst);
uid
} }
} }

View file

@ -1,22 +1,22 @@
use std::sync::Arc; use std::sync::Arc;
use atomic_refcell::AtomicRefCell; use parking_lot::RwLock;
use protocol::*; use protocol::*;
use qwer::PropertyHashSet; use qwer::PropertyHashSet;
use crate::game::PlayerOperationResult; use crate::game::PlayerOperationResult;
pub struct UnlockManager { pub struct UnlockManager {
player: Arc<AtomicRefCell<PlayerInfo>>, player: Arc<RwLock<PlayerInfo>>,
} }
impl UnlockManager { impl UnlockManager {
pub fn new(player: Arc<AtomicRefCell<PlayerInfo>>) -> Self { pub fn new(player: Arc<RwLock<PlayerInfo>>) -> Self {
Self { player } Self { player }
} }
pub fn unlock(&self, unlock_id: i32) -> PlayerOperationResult<PtcUnlockArg> { pub fn unlock(&self, unlock_id: i32) -> PlayerOperationResult<PtcUnlockArg> {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let unlock_info = player.unlock_info.as_mut().unwrap(); let unlock_info = player.unlock_info.as_mut().unwrap();
unlock_info unlock_info

View file

@ -1,7 +1,7 @@
use std::collections::HashSet; use std::collections::HashSet;
use std::sync::Arc; use std::sync::Arc;
use atomic_refcell::AtomicRefCell; use parking_lot::RwLock;
use qwer::{PropertyDoubleKeyHashMap, PropertyHashSet}; use qwer::{PropertyDoubleKeyHashMap, PropertyHashSet};
use crate::game::PlayerOperationResult; use crate::game::PlayerOperationResult;
@ -9,11 +9,11 @@ use crate::game::PlayerOperationResult;
use protocol::*; use protocol::*;
pub struct YorozuyaQuestManager { pub struct YorozuyaQuestManager {
player: Arc<AtomicRefCell<PlayerInfo>>, player: Arc<RwLock<PlayerInfo>>,
} }
impl YorozuyaQuestManager { impl YorozuyaQuestManager {
pub fn new(player: Arc<AtomicRefCell<PlayerInfo>>) -> Self { pub fn new(player: Arc<RwLock<PlayerInfo>>) -> Self {
Self { player } Self { player }
} }
@ -23,7 +23,7 @@ impl YorozuyaQuestManager {
hollow_quest_type: HollowQuestType, hollow_quest_type: HollowQuestType,
id: i32, id: i32,
) -> PlayerOperationResult<i32> { ) -> PlayerOperationResult<i32> {
let mut player = self.player.borrow_mut(); let mut player = self.player.write();
let yorozuya = player.yorozuya_info.as_mut().unwrap(); let yorozuya = player.yorozuya_info.as_mut().unwrap();
let hollow_quests = yorozuya.hollow_quests.as_mut().unwrap(); let hollow_quests = yorozuya.hollow_quests.as_mut().unwrap();

View file

@ -1,6 +1,4 @@
mod context; mod context;
pub mod data;
pub mod globals;
pub mod manager; pub mod manager;
pub mod util; pub mod util;

View file

@ -14,7 +14,7 @@ pub fn cur_timestamp_ms() -> u64 {
pub fn create_default_account(id: u64) -> AccountInfo { pub fn create_default_account(id: u64) -> AccountInfo {
AccountInfo { AccountInfo {
account_name: Some(format!("1_{id}")), account_name: Some(format!("1_{id}")),
players: Some(vec![id]), players: Some(Vec::new()),
gm_level: Some(10), gm_level: Some(10),
account_type: Some(1), account_type: Some(1),
register_cps: Some(String::new()), register_cps: Some(String::new()),

View file

@ -23,7 +23,10 @@ macro_rules! log_error {
}; };
} }
pub fn init_tracing() { pub fn init_logging() {
#[cfg(target_os = "windows")]
ansi_term::enable_ansi_support().unwrap();
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
} }

View file

@ -1,53 +1,40 @@
use std::path::Path; use std::io::{stdin, Read};
use anyhow::Result; use anyhow::Result;
use tracing::Level; use tracing::Level;
mod config;
mod data;
mod game; mod game;
mod logging; mod logging;
mod net; mod net;
use logging::{init_system_logging, init_tracing}; use config::{init_config, CONFIGURATION};
use data::init_assets;
const GATE_HOST: &str = "0.0.0.0"; use logging::{init_logging, init_system_logging};
const GATE_PORT: u16 = 10301;
#[tokio::main] #[tokio::main]
async fn main() -> Result<()> { async fn main() -> Result<()> {
#[cfg(target_os = "windows")] init_logging();
ansi_term::enable_ansi_support().unwrap(); init_config();
if let Err(err) = init_assets() {
init_config()?; tracing::error!("Error occurred during assets initialization: {err}");
init_tracing(); on_critical_fault();
}
let span = tracing::span!(Level::DEBUG, "main"); let span = tracing::span!(Level::DEBUG, "main");
let _enter = span.enter(); let _enter = span.enter();
init_system_logging().await; if CONFIGURATION.system_resources_logging {
init_system_logging().await;
net::gateway::listen(GATE_HOST, GATE_PORT).await?;
Ok(())
}
fn init_config() -> Result<()> {
let local_dotenv = Path::new(".env");
if local_dotenv.exists() {
dotenv::dotenv()?;
} else {
let config = dirs::config_dir()
.ok_or_else(|| anyhow::anyhow!("No config directory found"))?
.join("nap-gameserver");
std::fs::create_dir_all(&config)?;
let env = config.join(".env");
if !env.exists() {
std::fs::write(&env, "SKIP_TUTORIAL=0")?;
}
dotenv::from_path(&env)?;
} }
Ok(()) net::gateway::listen(&CONFIGURATION.gateway_endpoint).await
}
fn on_critical_fault() {
eprintln!("Critical error occurred, press any key to exit...");
let _ = stdin().read(&mut [0u8]).unwrap();
std::process::exit(1);
} }

View file

@ -6,9 +6,9 @@ use crate::log_error;
use super::NetworkSession; use super::NetworkSession;
pub async fn listen(host: &str, port: u16) -> Result<()> { pub async fn listen(bind_addr: &str) -> Result<()> {
let listener = TcpListener::bind(format!("{host}:{port}")).await?; let listener = TcpListener::bind(bind_addr).await?;
tracing::info!("Listening at {host}:{port}"); tracing::info!("Listening at {bind_addr}");
loop { loop {
let Ok((client_socket, client_addr)) = listener.accept().await else { let Ok((client_socket, client_addr)) = listener.accept().await else {
@ -17,7 +17,7 @@ pub async fn listen(host: &str, port: u16) -> Result<()> {
tracing::info!("New session from {client_addr}"); tracing::info!("New session from {client_addr}");
let mut session = NetworkSession::new(client_socket, client_addr); let mut session = NetworkSession::new(client_socket);
tokio::spawn( tokio::spawn(
async move { async move {
log_error!( log_error!(

View file

@ -1,16 +1,13 @@
use super::*; use super::*;
pub async fn on_rpc_battle_report_arg( pub async fn on_rpc_battle_report(
session: &NetworkSession, _session: &NetworkSession,
arg: &RpcBattleReportArg, arg: &RpcBattleReportArg,
) -> Result<()> { ) -> Result<RpcBattleReportRet> {
let need_index = arg let need_index = arg
.battle_reports .battle_reports
.iter()
.last() .last()
.map_or(0, |report| report.index + 1); .map_or(0, |report| report.index + 1);
session Ok(RpcBattleReportRet::new(need_index))
.send_rpc_ret(RpcBattleReportRet::new(need_index))
.await
} }

View file

@ -1,13 +1,13 @@
use std::time::{SystemTime, UNIX_EPOCH}; use common::util;
use super::*; use super::*;
const START_PROC_ID: i32 = 1; const START_PROC_ID: i32 = 1;
pub async fn on_rpc_advance_beginner_procedure_arg( pub async fn on_rpc_advance_beginner_procedure(
session: &NetworkSession, session: &NetworkSession,
arg: &RpcAdvanceBeginnerProcedureArg, arg: &RpcAdvanceBeginnerProcedureArg,
) -> Result<()> { ) -> Result<RpcAdvanceBeginnerProcedureRet> {
let next_procedure_id = if arg.procedure_id == 0 { let next_procedure_id = if arg.procedure_id == 0 {
START_PROC_ID START_PROC_ID
} else { } else {
@ -19,33 +19,25 @@ pub async fn on_rpc_advance_beginner_procedure_arg(
Box::pin(world::enter_main_city(session)).await?; Box::pin(world::enter_main_city(session)).await?;
} }
session Ok(RpcAdvanceBeginnerProcedureRet::new(next_procedure_id))
.send_rpc_ret(RpcAdvanceBeginnerProcedureRet::new(next_procedure_id))
.await
} }
pub async fn on_rpc_beginnerbattle_begin_arg( pub async fn on_rpc_beginnerbattle_begin(
session: &NetworkSession, _session: &NetworkSession,
arg: &RpcBeginnerbattleBeginArg, arg: &RpcBeginnerbattleBeginArg,
) -> Result<()> { ) -> Result<RpcBeginnerbattleBeginRet> {
let cur_timestamp = SystemTime::now() Ok(RpcBeginnerbattleBeginRet::new(format!(
.duration_since(UNIX_EPOCH) "{}-{}",
.unwrap() arg.battle_id,
.as_secs(); util::cur_timestamp_seconds()
)))
session
.send_rpc_ret(RpcBeginnerbattleBeginRet::new(format!(
"{cur_timestamp}-{}",
arg.battle_id
)))
.await
} }
pub async fn on_rpc_beginnerbattle_end_arg( pub async fn on_rpc_beginnerbattle_end(
session: &NetworkSession, _session: &NetworkSession,
arg: &RpcBeginnerbattleEndArg, arg: &RpcBeginnerbattleEndArg,
) -> Result<()> { ) -> Result<RpcBeginnerbattleEndRet> {
tracing::info!("Battle statistics: {:?}", arg.battle_statistics); tracing::info!("Battle statistics: {:?}", arg.battle_statistics);
session.send_rpc_ret(RpcBeginnerbattleEndRet::new()).await Ok(RpcBeginnerbattleEndRet::new())
} }

View file

@ -1,54 +1,88 @@
use itertools::Itertools;
use qwer::{phashmap, phashset, PropertyHashMap, PropertyHashSet}; use qwer::{phashmap, phashset, PropertyHashMap, PropertyHashSet};
use std::collections::HashMap; use std::collections::HashMap;
use crate::data;
use super::*; use super::*;
pub async fn on_rpc_hollow_move_arg( pub async fn on_rpc_hollow_move(
session: &mut NetworkSession, session: &mut NetworkSession,
arg: &RpcHollowMoveArg, arg: &RpcHollowMoveArg,
) -> Result<()> { ) -> Result<RpcHollowMoveRet> {
tracing::info!("Hollow movement {:?}", &arg); tracing::info!("Hollow movement {:?}", &arg);
let destination_pos = *arg.positions.iter().last().unwrap(); let destination_pos = *arg.positions.last().unwrap();
let scene_uid = session.get_player().scene_uid.unwrap(); let scene_uid = session.ns_prop_mgr.player_info.read().scene_uid.unwrap();
let hollow_grid_manager = session.context.hollow_grid_manager.borrow(); let (ptc_hollow_grid, ptc_sync_hollow_event) = session
let (ptc_hollow_grid, ptc_sync_hollow_event) = .context
hollow_grid_manager.move_to(destination_pos, scene_uid); .hollow_grid_manager
.move_to(destination_pos, scene_uid);
session
.push_rpc_arg(PTC_HOLLOW_GRID_ID, ptc_hollow_grid)
.await?;
session.send_rpc_arg(114, &ptc_hollow_grid).await?;
if let Some(ptc_sync_hollow_event) = ptc_sync_hollow_event { if let Some(ptc_sync_hollow_event) = ptc_sync_hollow_event {
session.send_rpc_arg(210, &ptc_sync_hollow_event).await?; session
.push_rpc_arg(PTC_SYNC_HOLLOW_EVENT_INFO_ID, ptc_sync_hollow_event)
.await?;
} }
let pos = PtcPositionInHollowChangedArg { let pos = PtcPositionInHollowChangedArg {
player_uid: 1337, player_uid: session.player_uid().raw(),
hollow_level: arg.hollow_level, hollow_level: arg.hollow_level,
position: destination_pos, position: destination_pos,
}; };
session.send_rpc_arg(141, &pos).await?;
session session
.send_rpc_ret(RpcHollowMoveRet::new( .push_rpc_arg(PTC_POSITION_IN_HOLLOW_CHANGED_ID, pos)
arg.hollow_level,
*arg.positions.iter().last().unwrap(),
))
.await
}
pub async fn on_rpc_end_battle_arg(session: &NetworkSession, arg: &RpcEndBattleArg) -> Result<()> {
tracing::info!("RpcEndBattle: {:?}", &arg);
let player_uid = session.get_player_uid();
let hollow_grid_manager = session.context.hollow_grid_manager.borrow();
session
.send_rpc_arg(210, &hollow_grid_manager.battle_finished())
.await?; .await?;
let dungeon_manager = session.context.dungeon_manager.borrow(); Ok(RpcHollowMoveRet::new(
let ptc_enter_scene = dungeon_manager arg.hollow_level,
*arg.positions.last().unwrap(),
))
}
pub async fn on_rpc_end_battle(
session: &NetworkSession,
arg: &RpcEndBattleArg,
) -> Result<RpcEndBattleRet> {
tracing::info!("RpcEndBattle: {:?}", &arg);
let player_uid = session.player_uid().raw();
let (sync_event, hollow_finished) = session.context.hollow_grid_manager.battle_finished();
if !hollow_finished {
session
.push_rpc_arg(PTC_SYNC_HOLLOW_EVENT_INFO_ID, sync_event)
.await?;
} else {
let _ = session
.context
.dungeon_manager
.hollow_finished()
.send_changes(session)
.await?;
let ptc_dungeon_quest_finished = PtcDungeonQuestFinishedArg {
player_uid,
quest_id: 1001000101,
success: true,
reward_items: phashmap![],
statistics: phashmap![(QuestStatisticsType::ArrivedLevel, 1)],
};
session
.push_rpc_arg(PTC_DUNGEON_QUEST_FINISHED_ID, ptc_dungeon_quest_finished)
.await?;
}
let ptc_enter_scene = session
.context
.dungeon_manager
.leave_battle() .leave_battle()
.unwrap() .unwrap()
.send_changes(session) .send_changes(session)
@ -56,39 +90,51 @@ pub async fn on_rpc_end_battle_arg(session: &NetworkSession, arg: &RpcEndBattleA
.clone(); .clone();
session session
.send_rpc_arg( .push_rpc_arg(
124, PTC_SYNC_HOLLOW_GRID_MAPS_ID,
&hollow_grid_manager.sync_hollow_maps(player_uid, dungeon_manager.get_cur_scene_uid()), session.context.hollow_grid_manager.sync_hollow_maps(
player_uid,
session.context.dungeon_manager.get_cur_scene_uid(),
),
) )
.await?; .await?;
let ptc_position_in_hollow_changed = PtcPositionInHollowChangedArg { let ptc_position_in_hollow_changed = PtcPositionInHollowChangedArg {
player_uid, player_uid,
hollow_level: 1, hollow_level: 1,
position: hollow_grid_manager.get_cur_position_in_hollow(), position: session
.context
.hollow_grid_manager
.get_cur_position_in_hollow(),
}; };
session session
.send_rpc_arg(141, &ptc_position_in_hollow_changed) .push_rpc_arg(
PTC_POSITION_IN_HOLLOW_CHANGED_ID,
ptc_position_in_hollow_changed,
)
.await?; .await?;
session.send_rpc_arg(118, &ptc_enter_scene).await?;
session session
.send_rpc_ret(RpcEndBattleRet::new( .push_rpc_arg(PTC_ENTER_SCENE_ID, ptc_enter_scene)
hollow_grid_manager.get_cur_event_template_id(), .await?;
HashMap::new(),
)) Ok(RpcEndBattleRet::new(
.await session
.context
.hollow_grid_manager
.get_cur_event_template_id(),
HashMap::new(),
))
} }
pub async fn on_rpc_run_hollow_event_graph_arg( pub async fn on_rpc_run_hollow_event_graph(
session: &mut NetworkSession, session: &mut NetworkSession,
arg: &RpcRunHollowEventGraphArg, arg: &RpcRunHollowEventGraphArg,
) -> Result<()> { ) -> Result<RpcRunHollowEventGraphRet> {
tracing::info!("Run hollow event graph {:?}", arg); tracing::info!("Run hollow event graph {:?}", arg);
let scene_uid = session.get_player().scene_uid.unwrap(); let scene_uid = session.ns_prop_mgr.player_info.read().scene_uid.unwrap();
if arg.event_graph_uid == 3405096459205834 { if arg.event_graph_uid == 3405096459205834 {
// Perform (cutscene) // Perform (cutscene)
@ -109,45 +155,94 @@ pub async fn on_rpc_run_hollow_event_graph_arg(
}, },
specials: phashmap![], specials: phashmap![],
}; };
session.send_rpc_arg(210, &finish_perform).await?; session
.push_rpc_arg(PTC_SYNC_HOLLOW_EVENT_INFO_ID, finish_perform)
.await?;
let hollow_grid_manager = session.context.hollow_grid_manager.borrow(); let (ptc_hollow_grid, ptc_sync_hollow_event) =
let (ptc_hollow_grid, ptc_sync_hollow_event) = hollow_grid_manager.move_to(22, scene_uid); session.context.hollow_grid_manager.move_to(22, scene_uid);
session.send_rpc_arg(114, &ptc_hollow_grid).await?; session
.push_rpc_arg(PTC_HOLLOW_GRID_ID, ptc_hollow_grid)
.await?;
if let Some(ptc_sync_hollow_event) = ptc_sync_hollow_event { if let Some(ptc_sync_hollow_event) = ptc_sync_hollow_event {
session.send_rpc_arg(210, &ptc_sync_hollow_event).await?; session
.push_rpc_arg(PTC_SYNC_HOLLOW_EVENT_INFO_ID, ptc_sync_hollow_event)
.await?;
} }
} else { } else {
let hollow_grid_manager = session.context.hollow_grid_manager.borrow(); let (sync_hollow_event, hollow_grid, trigger_battle_id, hollow_finished) = session
let (sync_hollow_event, hollow_grid, trigger_battle_id) = hollow_grid_manager .context
.hollow_grid_manager
.run_event_graph(arg.event_graph_uid, arg.event_id, arg.move_path.clone()); .run_event_graph(arg.event_graph_uid, arg.event_id, arg.move_path.clone());
session.send_rpc_arg(210, &sync_hollow_event).await?; if !hollow_finished {
session.send_rpc_arg(114, &hollow_grid).await?; session
.push_rpc_arg(PTC_SYNC_HOLLOW_EVENT_INFO_ID, sync_hollow_event)
.await?;
}
session
.push_rpc_arg(PTC_HOLLOW_GRID_ID, hollow_grid)
.await?;
if hollow_finished {
let _ = session
.context
.dungeon_manager
.hollow_finished()
.send_changes(session)
.await?;
let ptc_dungeon_quest_finished = PtcDungeonQuestFinishedArg {
player_uid: session.player_uid().raw(),
quest_id: 1001000101,
success: true,
reward_items: phashmap![],
statistics: phashmap![],
};
session
.push_rpc_arg(PTC_DUNGEON_QUEST_FINISHED_ID, ptc_dungeon_quest_finished)
.await?;
}
if let Some(trigger_battle_id) = trigger_battle_id { if let Some(trigger_battle_id) = trigger_battle_id {
let dungeon_manager = session.context.dungeon_manager.borrow(); let hollow_uid = *session
let hollow_uid = *session.get_player().scene_uid.as_ref().unwrap(); .ns_prop_mgr
let battle_scene_uid = *dungeon_manager .player_info
.read()
.scene_uid
.as_ref()
.unwrap();
let battle_scene_uid = session
.context
.dungeon_manager
.create_fight(trigger_battle_id, hollow_uid) .create_fight(trigger_battle_id, hollow_uid)
.send_changes(session) .send_changes(session)
.await?; .await?;
let ptc_position_in_hollow_changed = PtcPositionInHollowChangedArg { let ptc_position_in_hollow_changed = PtcPositionInHollowChangedArg {
player_uid: 1337, player_uid: session.player_uid().raw(),
hollow_level: 1, hollow_level: 1,
position: hollow_grid_manager.get_cur_position_in_hollow(), position: session
.context
.hollow_grid_manager
.get_cur_position_in_hollow(),
}; };
session session
.send_rpc_arg(141, &ptc_position_in_hollow_changed) .push_rpc_arg(
PTC_POSITION_IN_HOLLOW_CHANGED_ID,
ptc_position_in_hollow_changed,
)
.await?; .await?;
session session
.send_rpc_arg( .push_rpc_arg(
118, PTC_ENTER_SCENE_ID,
dungeon_manager session
.context
.dungeon_manager
.enter_battle(battle_scene_uid) .enter_battle(battle_scene_uid)
.send_changes(session) .send_changes(session)
.await?, .await?,
@ -156,36 +251,63 @@ pub async fn on_rpc_run_hollow_event_graph_arg(
} }
} }
session.send_rpc_ret(RpcRunHollowEventGraphRet::new()).await Ok(RpcRunHollowEventGraphRet::new())
} }
pub async fn on_rpc_start_hollow_quest_arg( pub async fn on_rpc_start_hollow_quest(
session: &NetworkSession, session: &NetworkSession,
arg: &RpcStartHollowQuestArg, arg: &RpcStartHollowQuestArg,
) -> Result<()> { ) -> Result<RpcStartHollowQuestRet> {
tracing::info!("start hollow quest: {arg:?}"); tracing::info!("start hollow quest: {arg:?}");
// Set avatar HP properties
for (_idx, avatar_uid) in &arg.avatar_map { for (_idx, avatar_uid) in &arg.avatar_map {
// Set character HP let update_properties = {
let update_properties = PtcPropertyChangedArg { let player_info = session.ns_prop_mgr.player_info.read();
scene_unit_uid: *avatar_uid, let items = player_info.items.as_ref().unwrap();
is_partial: true, let Some(ItemInfo::Avatar { id, .. }) = items
changed_properties: phashmap![(1, 500), (111, 500)], .iter()
.find(|(uid, _)| **uid == *avatar_uid)
.map(|(_, item)| item)
else {
return Ok(RpcStartHollowQuestRet::error(
ErrorCode::ObjectNotExist,
Vec::new(),
));
};
let avatar_config = data::iter_avatar_config_collection()
.find(|c| c.id == *id)
.unwrap();
PtcPropertyChangedArg {
scene_unit_uid: *avatar_uid,
is_partial: true,
changed_properties: phashmap![(1, avatar_config.hp), (111, avatar_config.hp)],
}
}; };
session.send_rpc_arg(129, &update_properties).await?; session
.push_rpc_arg(PTC_PROPERTY_CHANGED_ID, update_properties)
.await?;
} }
let dungeon_manager = session.context.dungeon_manager.borrow(); let avatars = arg
.avatar_map
let avatars: Vec<u64> = arg.avatar_map.iter().map(|(_idx, uid)| *uid).collect(); .iter()
let (dungeon_uid, scene_uid) = *dungeon_manager .sorted_by_key(|kv| kv.0)
.map(|(_idx, uid)| *uid)
.collect::<Vec<_>>();
let (dungeon_uid, scene_uid) = session
.context
.dungeon_manager
.create_hollow(10001, 10010001, &avatars) .create_hollow(10001, 10010001, &avatars)
.send_changes(session) .send_changes(session)
.await?; .await?;
let quest_manager = session.context.quest_manager.borrow(); session
quest_manager .context
.quest_manager
.add_quest_to_collection( .add_quest_to_collection(
dungeon_uid, dungeon_uid,
QuestInfo::DungeonInner { QuestInfo::DungeonInner {
@ -203,30 +325,40 @@ pub async fn on_rpc_start_hollow_quest_arg(
.send_changes(session) .send_changes(session)
.await?; .await?;
let ptc_enter_scene = dungeon_manager let ptc_enter_scene = session
.context
.dungeon_manager
.enter_scene(scene_uid)? .enter_scene(scene_uid)?
.send_changes(session) .send_changes(session)
.await? .await?
.clone(); .clone();
let hollow_grid_manager = session.context.hollow_grid_manager.borrow(); session.context.hollow_grid_manager.init_default_map();
hollow_grid_manager.init_default_map();
session session
.send_rpc_arg( .push_rpc_arg(
124, PTC_SYNC_HOLLOW_GRID_MAPS_ID,
&hollow_grid_manager.sync_hollow_maps(session.get_player_uid(), scene_uid), session
.context
.hollow_grid_manager
.sync_hollow_maps(session.player_uid().raw(), scene_uid),
) )
.await?; .await?;
let ptc_position_in_hollow_changed = PtcPositionInHollowChangedArg { let ptc_position_in_hollow_changed = PtcPositionInHollowChangedArg {
player_uid: 1337, player_uid: session.player_uid().raw(),
hollow_level: 1, hollow_level: 1,
position: hollow_grid_manager.get_cur_position_in_hollow(), position: session
.context
.hollow_grid_manager
.get_cur_position_in_hollow(),
}; };
session session
.send_rpc_arg(141, &ptc_position_in_hollow_changed) .push_rpc_arg(
PTC_POSITION_IN_HOLLOW_CHANGED_ID,
ptc_position_in_hollow_changed,
)
.await?; .await?;
let ptc_sync_hollow_event_info = PtcSyncHollowEventInfoArg { let ptc_sync_hollow_event_info = PtcSyncHollowEventInfoArg {
@ -248,9 +380,11 @@ pub async fn on_rpc_start_hollow_quest_arg(
}; };
session session
.send_rpc_arg(210, &ptc_sync_hollow_event_info) .push_rpc_arg(PTC_SYNC_HOLLOW_EVENT_INFO_ID, ptc_sync_hollow_event_info)
.await?; .await?;
session.send_rpc_arg(118, &ptc_enter_scene).await?; session
session.send_rpc_ret(RpcStartHollowQuestRet::new()).await .push_rpc_arg(PTC_ENTER_SCENE_ID, ptc_enter_scene)
.await?;
Ok(RpcStartHollowQuestRet::new())
} }

View file

@ -1,36 +1,70 @@
use std::time::{SystemTime, UNIX_EPOCH}; use std::time::{SystemTime, UNIX_EPOCH};
use super::*; use super::*;
use crate::game::util; use crate::{
game::util,
net::session::{AccountUID, PlayerUID},
};
const DEFAULT_ACCOUNT_ID: u64 = 1337; const DEFAULT_ACCOUNT_ID: u64 = 1;
pub async fn on_rpc_login_arg(session: &NetworkSession, arg: &RpcLoginArg) -> Result<()> { pub async fn on_rpc_login(session: &NetworkSession, arg: &RpcLoginArg) -> Result<RpcLoginRet> {
tracing::info!("Received rpc login arg: {}", arg.account_name); tracing::info!("Received rpc login arg: {}", arg.account_name);
*session.get_account_mut() = util::create_default_account(DEFAULT_ACCOUNT_ID);
session match session.logged_in(
.send_rpc_ret(RpcLoginRet::new( AccountUID(DEFAULT_ACCOUNT_ID),
util::create_default_account(DEFAULT_ACCOUNT_ID),
) {
Ok(()) => Ok(RpcLoginRet::new(
session.ns_prop_mgr.serialize_account_info(), session.ns_prop_mgr.serialize_account_info(),
)) )),
.await Err(_) => Ok(RpcLoginRet::error(ErrorCode::RepeatedLogin, Vec::new())),
}
} }
pub async fn on_ptc_get_server_timestamp_arg( pub async fn on_rpc_create_player(
session: &NetworkSession, session: &NetworkSession,
_arg: &PtcGetServerTimestampArg, _arg: &RpcCreatePlayerArg,
) -> Result<()> { ) -> Result<RpcCreatePlayerRet> {
let account_uid = session.account_uid();
let player_count = session
.ns_prop_mgr
.account_info
.read()
.players
.as_ref()
.unwrap()
.len();
let player_uid = PlayerUID::new(account_uid, player_count + 1);
session session
.send_rpc_ret(PtcGetServerTimestampRet::new( .ns_prop_mgr
SystemTime::now() .account_info
.duration_since(UNIX_EPOCH) .write()
.unwrap() .players
.as_millis() as u64, .as_mut()
0, .unwrap()
)) .push(player_uid.raw());
.await
Ok(RpcCreatePlayerRet::new(player_uid.raw()))
} }
pub async fn on_rpc_keep_alive_arg(session: &NetworkSession, _arg: &RpcKeepAliveArg) -> Result<()> { pub async fn on_ptc_get_server_timestamp(
session.send_rpc_ret(RpcKeepAliveRet::new()).await _session: &NetworkSession,
_arg: &PtcGetServerTimestampArg,
) -> Result<PtcGetServerTimestampRet> {
Ok(PtcGetServerTimestampRet::new(
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64,
0,
))
}
pub async fn on_rpc_keep_alive(
_session: &NetworkSession,
_arg: &RpcKeepAliveArg,
) -> Result<RpcKeepAliveRet> {
Ok(RpcKeepAliveRet::new())
} }

View file

@ -1,8 +1,8 @@
use super::*; use super::*;
pub async fn on_rpc_get_player_mails_arg( pub async fn on_rpc_get_player_mails(
session: &NetworkSession, _session: &NetworkSession,
_arg: &RpcGetPlayerMailsArg, _arg: &RpcGetPlayerMailsArg,
) -> Result<()> { ) -> Result<RpcGetPlayerMailsRet> {
session.send_rpc_ret(RpcGetPlayerMailsRet::new(0)).await Ok(RpcGetPlayerMailsRet::new(0))
} }

View file

@ -9,10 +9,6 @@ mod role;
mod world; mod world;
mod yorozuya; mod yorozuya;
use super::NetworkSession;
use anyhow::Result;
use protocol::*;
pub use battle::*; pub use battle::*;
pub use beginner_procedure::*; pub use beginner_procedure::*;
pub use hollow::*; pub use hollow::*;
@ -23,3 +19,71 @@ pub use progression::*;
pub use role::*; pub use role::*;
pub use world::*; pub use world::*;
pub use yorozuya::*; pub use yorozuya::*;
use super::NetworkSession;
use anyhow::Result;
use paste::paste;
use protocol::*;
macro_rules! protocol_handlers {
($($name:ident;)*) => {
pub trait ProtocolHandler {
async fn on_message(session: &mut NetworkSession, protocol_id: u16, payload: Vec<u8>) -> Result<()> {
use ::qwer::OctData;
use ::tracing::Instrument;
paste! {
match protocol_id {
$(::protocol::[<$name:snake:upper _ID>] => {
let arg = ::protocol::[<$name Arg>]::unmarshal_from(&mut &payload[..], 0)?;
let ret = [<on_$name:snake>](session, &arg)
.instrument(tracing::info_span!(stringify!([<on_$name:snake>]), protocol_id = protocol_id))
.await?;
session.flush_rpc_queue().await?;
session.send_rpc_ret(ret).await
}
)*
_ => {
tracing::warn!("Message with protocol id {protocol_id} wasn't handled!");
Ok(())
},
}
}
}
async fn send_rpc_ret(&self, data: impl ::qwer::OctData) -> Result<()>;
}
};
}
protocol_handlers! {
RpcLogin;
RpcCreatePlayer;
PtcGetServerTimestamp;
PtcPlayerOperation;
RpcAdvanceBeginnerProcedure;
RpcBattleReport;
RpcBeginnerbattleBegin;
RpcBeginnerbattleEnd;
RpcCheckYorozuyaInfoRefresh;
RpcCloseLevelChgTips;
RpcDelNewMap;
RpcEndBattle;
RpcEnterWorld;
RpcReenterWorld;
RpcFinishActPerformShow;
RpcFinishEventGraphPerformShow;
RpcGetPlayerMails;
RpcHollowMove;
RpcInteractWithUnit;
RpcKeepAlive;
RpcLeaveCurDungeon;
RpcModNickName;
RpcPerformEnd;
RpcPerformJump;
RpcPerformTrigger;
RpcRunEventGraph;
RpcRunHollowEventGraph;
RpcSavePosInMainCity;
RpcStartHollowQuest;
}

View file

@ -1,36 +1,32 @@
use super::*; use super::*;
pub async fn on_rpc_perform_trigger_arg( pub async fn on_rpc_perform_trigger(
session: &NetworkSession, _session: &NetworkSession,
arg: &RpcPerformTriggerArg, arg: &RpcPerformTriggerArg,
) -> Result<()> { ) -> Result<RpcPerformTriggerRet> {
session Ok(RpcPerformTriggerRet::new(format!(
.send_rpc_ret(RpcPerformTriggerRet::new(format!( "{}-{}",
"{}-{}", arg.perform_id, arg.perform_type
arg.perform_id, arg.perform_type )))
)))
.await
} }
pub async fn on_rpc_perform_end_arg( pub async fn on_rpc_perform_end(
session: &NetworkSession, _session: &NetworkSession,
_arg: &RpcPerformEndArg, _arg: &RpcPerformEndArg,
) -> Result<()> { ) -> Result<RpcPerformEndRet> {
session.send_rpc_ret(RpcPerformEndRet::new()).await Ok(RpcPerformEndRet::new())
} }
pub async fn on_rpc_finish_a_c_t_perform_show_arg( pub async fn on_rpc_finish_act_perform_show(
session: &NetworkSession, _session: &NetworkSession,
_arg: &RpcFinishACTPerformShowArg, _arg: &RpcFinishActPerformShowArg,
) -> Result<()> { ) -> Result<RpcFinishActPerformShowRet> {
session Ok(RpcFinishActPerformShowRet::new())
.send_rpc_ret(RpcFinishACTPerformShowRet::new())
.await
} }
pub async fn on_rpc_perform_jump_arg( pub async fn on_rpc_perform_jump(
session: &NetworkSession, _session: &NetworkSession,
_arg: &RpcPerformJumpArg, _arg: &RpcPerformJumpArg,
) -> Result<()> { ) -> Result<RpcPerformJumpRet> {
session.send_rpc_ret(RpcPerformJumpRet::new()).await Ok(RpcPerformJumpRet::new())
} }

View file

@ -1,8 +1,15 @@
use super::*; use super::*;
pub async fn on_rpc_close_level_chg_tips_arg( pub async fn on_rpc_close_level_chg_tips(
session: &NetworkSession, _session: &NetworkSession,
_arg: &RpcCloseLevelChgTipsArg, _arg: &RpcCloseLevelChgTipsArg,
) -> Result<()> { ) -> Result<RpcCloseLevelChgTipsRet> {
session.send_rpc_ret(RpcCloseLevelChgTipsRet::new()).await Ok(RpcCloseLevelChgTipsRet::new())
}
pub async fn on_rpc_del_new_map(
_session: &NetworkSession,
_arg: &RpcDelNewMapArg,
) -> Result<RpcDelNewMapRet> {
Ok(RpcDelNewMapRet::new())
} }

View file

@ -1,25 +1,28 @@
use super::*; use super::*;
#[tracing::instrument(skip(session))] pub async fn on_rpc_mod_nick_name(
pub async fn on_rpc_mod_nick_name_arg(
session: &NetworkSession, session: &NetworkSession,
arg: &RpcModNickNameArg, arg: &RpcModNickNameArg,
) -> Result<()> { ) -> Result<RpcModNickNameRet> {
tracing::info!("creating character"); tracing::info!("creating character");
let mut player = session.get_player_mut(); let player_info_changed = {
player.nick_name.replace(arg.nick_name.clone()); let mut player = session.ns_prop_mgr.player_info.write();
player.avatar_id.replace(arg.avatar_id); player.nick_name.replace(arg.nick_name.clone());
player.avatar_id.replace(arg.avatar_id);
let player_info_changed = PtcPlayerInfoChangedArg { PtcPlayerInfoChangedArg {
player_uid: player.uid.unwrap(), player_uid: player.uid.unwrap(),
player_info: PlayerInfo { player_info: PlayerInfo {
nick_name: Some(arg.nick_name.clone()), nick_name: Some(arg.nick_name.clone()),
avatar_id: Some(arg.avatar_id), avatar_id: Some(arg.avatar_id),
..Default::default() ..Default::default()
}, },
}
}; };
session.send_rpc_arg(101, &player_info_changed).await?; session
session.send_rpc_ret(RpcModNickNameRet::new()).await .push_rpc_arg(PTC_PLAYER_INFO_CHANGED_ID, player_info_changed)
.await?;
Ok(RpcModNickNameRet::new())
} }

View file

@ -2,35 +2,45 @@ use qwer::{
pdkhashmap, phashmap, phashset, PropertyDoubleKeyHashMap, PropertyHashMap, PropertyHashSet, pdkhashmap, phashmap, phashset, PropertyDoubleKeyHashMap, PropertyHashMap, PropertyHashSet,
}; };
use crate::game::{globals, util}; use crate::config::CONFIGURATION;
use crate::data;
use crate::game::util;
use crate::net::session::PlayerUID;
use super::*; use super::*;
static UNLOCK_AVATARS: [i32; 12] = [ pub async fn on_rpc_run_event_graph(
1011, 1021, 1031, 1041, 1061, 1081, 1091, 1101, 1111, 1121, 1131, 1141,
];
static UNLOCK_FEATURES: [i32; 35] = [
1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1013, 1014, 1015, 1016, 1017,
1018, 1019, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010, 10012, 10013,
10014, 10015, 10017, 10018, 10019,
];
#[tracing::instrument(skip(session))]
pub async fn on_rpc_run_event_graph_arg(
session: &NetworkSession, session: &NetworkSession,
arg: &RpcRunEventGraphArg, arg: &RpcRunEventGraphArg,
) -> Result<()> { ) -> Result<RpcRunEventGraphRet> {
tracing::info!("RunEventGraph requested"); let unit = session.context.scene_unit_manager.get(arg.owner_uid);
let interact_id = match unit {
Some(SceneUnitProtocolInfo::NpcProtocolInfo { interacts_info, .. })
if interacts_info.len() != 0 =>
{
*interacts_info.iter().next().unwrap().0
}
Some(SceneUnitProtocolInfo::NpcProtocolInfo { tag, id, .. }) => {
let main_city_object = data::get_main_city_object(tag, id).unwrap();
*main_city_object.default_interact_ids.first().unwrap()
}
None => {
return Ok(RpcRunEventGraphRet::error(
ErrorCode::EntityNotExist,
Vec::new(),
))
}
};
let mut ptc_sync_event_info = PtcSyncEventInfoArg { let mut ptc_sync_event_info = PtcSyncEventInfoArg {
owner_type: EventGraphOwnerType::SceneUnit, owner_type: arg.owner_type,
owner_uid: arg.owner_uid, owner_uid: arg.owner_uid,
updated_events: pdkhashmap![], updated_events: pdkhashmap![],
}; };
ptc_sync_event_info.updated_events.insert( ptc_sync_event_info.updated_events.insert(
10000009, interact_id,
100, 100,
EventInfo { EventInfo {
id: 100, id: 100,
@ -45,18 +55,80 @@ pub async fn on_rpc_run_event_graph_arg(
}, },
); );
session.send_rpc_arg(177, &ptc_sync_event_info).await?; session
session.send_rpc_ret(RpcRunEventGraphRet::new()).await .push_rpc_arg(PTC_SYNC_EVENT_INFO_ID, ptc_sync_event_info)
.await?;
Ok(RpcRunEventGraphRet::new())
} }
#[tracing::instrument(skip(session))] pub async fn on_rpc_finish_event_graph_perform_show(
pub async fn on_rpc_interact_with_unit_arg( session: &NetworkSession,
arg: &RpcFinishEventGraphPerformShowArg,
) -> Result<RpcFinishEventGraphPerformShowRet> {
let mut ptc_sync_event_info = PtcSyncEventInfoArg {
owner_type: EventGraphOwnerType::SceneUnit,
owner_uid: arg.owner_uid,
updated_events: pdkhashmap![],
};
ptc_sync_event_info.updated_events.insert(
arg.event_graph_id,
arg.event_id,
EventInfo {
id: arg.event_id,
cur_action_id: -1,
action_move_path: Vec::from([101, 102, 101, -1]),
state: EventState::Finished,
prev_state: EventState::Initing,
cur_action_info: ActionInfo::None {},
cur_action_state: ActionState::Init,
predicated_failed_actions: phashset![],
stack_frames: Vec::new(),
},
);
session
.push_rpc_arg(PTC_SYNC_EVENT_INFO_ID, ptc_sync_event_info)
.await?;
Ok(RpcFinishEventGraphPerformShowRet::new())
}
pub async fn on_rpc_interact_with_unit(
session: &NetworkSession, session: &NetworkSession,
arg: &RpcInteractWithUnitArg, arg: &RpcInteractWithUnitArg,
) -> Result<()> { ) -> Result<RpcInteractWithUnitRet> {
tracing::info!("InteractWithUnit"); tracing::info!(
"InteractWithUnit: unit_uid: {}, interaction: {}",
arg.unit_uid,
arg.interaction
);
if arg.event_graph_id == 19900062 { let unit = session.context.scene_unit_manager.get(arg.unit_uid);
let interact_id = match unit {
Some(SceneUnitProtocolInfo::NpcProtocolInfo { interacts_info, .. })
if interacts_info.len() != 0 =>
{
*interacts_info.iter().next().unwrap().0
}
Some(SceneUnitProtocolInfo::NpcProtocolInfo { tag, id, .. }) => {
let main_city_object = data::get_main_city_object(tag, id).unwrap();
*main_city_object.default_interact_ids.first().unwrap()
}
None => {
return Ok(RpcInteractWithUnitRet::error(
ErrorCode::EntityNotExist,
Vec::new(),
))
}
};
// 0 - ServerInteractiveSystem::TriggerEnterEvent
// 1 - ServerInteractiveSystem::TriggerExitEvent
// 2 - ServerInteractiveSystem::TriggerInteractDirectly
if arg.interaction == 2 {
let mut ptc_sync_event_info = PtcSyncEventInfoArg { let mut ptc_sync_event_info = PtcSyncEventInfoArg {
owner_type: EventGraphOwnerType::SceneUnit, owner_type: EventGraphOwnerType::SceneUnit,
owner_uid: arg.unit_uid, owner_uid: arg.unit_uid,
@ -64,7 +136,7 @@ pub async fn on_rpc_interact_with_unit_arg(
}; };
ptc_sync_event_info.updated_events.insert( ptc_sync_event_info.updated_events.insert(
10000009, interact_id,
100, 100,
EventInfo { EventInfo {
id: 100, id: 100,
@ -79,41 +151,34 @@ pub async fn on_rpc_interact_with_unit_arg(
}, },
); );
session.send_rpc_arg(177, &ptc_sync_event_info).await?; session
.push_rpc_arg(PTC_SYNC_EVENT_INFO_ID, ptc_sync_event_info)
.await?;
} }
session.send_rpc_ret(RpcInteractWithUnitRet::new()).await Ok(RpcInteractWithUnitRet::new())
} }
pub async fn on_rpc_leave_cur_dungeon_arg( pub async fn on_rpc_leave_cur_dungeon(
session: &NetworkSession, session: &NetworkSession,
_arg: &RpcLeaveCurDungeonArg, _arg: &RpcLeaveCurDungeonArg,
) -> Result<()> { ) -> Result<RpcLeaveCurDungeonRet> {
let dungeon_manager = session.context.dungeon_manager.borrow(); Box::pin(enter_main_city(session)).await?;
if dungeon_manager.is_in_tutorial() { Ok(RpcLeaveCurDungeonRet::new())
Box::pin(enter_main_city(session)).await?;
}
// TODO: enter scene by back_scene_uid from cur DungeonInfo.
session.send_rpc_ret(RpcLeaveCurDungeonRet::new()).await
} }
pub async fn on_ptc_player_operation_arg( pub async fn on_ptc_player_operation(
session: &NetworkSession, _session: &NetworkSession,
_arg: &PtcPlayerOperationArg, _arg: &PtcPlayerOperationArg,
) -> Result<()> { ) -> Result<PtcPlayerOperationRet> {
session.send_rpc_ret(PtcPlayerOperationRet::new()).await Ok(PtcPlayerOperationRet::new())
} }
#[tracing::instrument(skip(session))] pub async fn on_rpc_save_pos_in_main_city(
pub async fn on_rpc_save_pos_in_main_city_arg( _session: &NetworkSession,
session: &NetworkSession, _arg: &RpcSavePosInMainCityArg,
arg: &RpcSavePosInMainCityArg, ) -> Result<RpcSavePosInMainCityRet> {
) -> Result<()> { Ok(RpcSavePosInMainCityRet::new())
tracing::info!("MainCity pos updated");
session.send_rpc_ret(RpcSavePosInMainCityRet::new()).await
} }
fn create_player(id: u64) -> PlayerInfo { fn create_player(id: u64) -> PlayerInfo {
@ -127,7 +192,7 @@ fn create_player(id: u64) -> PlayerInfo {
z: 11.18, z: 11.18,
}); });
if globals::should_skip_tutorial() { if CONFIGURATION.skip_tutorial {
let beginner_procedure = player.beginner_procedure_info.as_mut().unwrap(); let beginner_procedure = player.beginner_procedure_info.as_mut().unwrap();
beginner_procedure.procedure_info.replace(6); beginner_procedure.procedure_info.replace(6);
player.nick_name.replace(String::from("xeondev")); player.nick_name.replace(String::from("xeondev"));
@ -138,28 +203,32 @@ fn create_player(id: u64) -> PlayerInfo {
} }
pub async fn enter_main_city(session: &NetworkSession) -> Result<()> { pub async fn enter_main_city(session: &NetworkSession) -> Result<()> {
let dungeon_manager = session.context.dungeon_manager.borrow(); let hall_scene_uid = session.context.dungeon_manager.get_default_scene_uid();
let scene_unit_mgr = session.context.scene_unit_manager.borrow();
let hall_scene_uid = dungeon_manager.get_default_scene_uid();
session session
.send_rpc_arg( .push_rpc_arg(
243, PTC_ENTER_SECTION_ID,
dungeon_manager session
.context
.dungeon_manager
.enter_scene_section(hall_scene_uid, 2) .enter_scene_section(hall_scene_uid, 2)
.unwrap(), .take(),
) )
.await?; .await?;
session session
.send_rpc_arg(180, &scene_unit_mgr.sync(hall_scene_uid, 2)) .push_rpc_arg(
PTC_SYNC_SCENE_UNIT_ID,
session.context.scene_unit_manager.sync(hall_scene_uid, 2),
)
.await?; .await?;
session session
.send_rpc_arg( .push_rpc_arg(
118, PTC_ENTER_SCENE_ID,
dungeon_manager session
.context
.dungeon_manager
.enter_main_city()? .enter_main_city()?
.send_changes(session) .send_changes(session)
.await?, .await?,
@ -167,38 +236,39 @@ pub async fn enter_main_city(session: &NetworkSession) -> Result<()> {
.await .await
} }
pub async fn on_rpc_enter_world_arg( pub async fn on_rpc_enter_world(
session: &NetworkSession, session: &NetworkSession,
_arg: &RpcEnterWorldArg, _arg: &RpcEnterWorldArg,
) -> Result<()> { ) -> Result<RpcEnterWorldRet> {
let account = session.get_account(); {
let account = session.ns_prop_mgr.account_info.read();
let id = *account.players.as_ref().unwrap().iter().next().unwrap(); // get first id from list let player_uid = *account.players.as_ref().unwrap().first().unwrap(); // get first id from list
*session.get_player_mut() = create_player(id); session.set_cur_player(PlayerUID::from(player_uid), create_player(player_uid))?;
}
let item_manager = session.context.item_manager.borrow();
let item_manager = &session.context.item_manager;
item_manager.add_resource(501, 120); item_manager.add_resource(501, 120);
item_manager.add_resource(10, 228); item_manager.add_resource(10, 228);
item_manager.add_resource(100, 1337); item_manager.add_resource(100, 1337);
for avatar_id in UNLOCK_AVATARS { for avatar_id in data::iter_avatar_config_collection()
.filter(|c| c.camp != 0)
.map(|c| c.id)
{
item_manager.unlock_avatar(avatar_id); item_manager.unlock_avatar(avatar_id);
} }
let unlock_manager = session.context.unlock_manager.borrow(); for unlock_id in data::iter_unlock_config_collection().map(|c| c.id) {
for unlock_id in UNLOCK_FEATURES { session.context.unlock_manager.unlock(unlock_id);
unlock_manager.unlock(unlock_id);
} }
let dungeon_manager = session.context.dungeon_manager.borrow(); session.context.dungeon_manager.create_hall(1);
dungeon_manager.create_hall(1); session.context.scene_unit_manager.add_scene_units(2);
let scene_unit_mgr = session.context.scene_unit_manager.borrow();
scene_unit_mgr.add_default_units();
let quest_manager = session.context.quest_manager.borrow(); let quest_manager = session.context.quest_manager.clone();
quest_manager.add_world_quest(QuestInfo::MainCity { quest_manager.add_world_quest(QuestInfo::MainCity {
id: 10020001, id: 10020002,
finished_count: 0, finished_count: 0,
collection_uid: 0, collection_uid: 0,
progress: 0, progress: 0,
@ -226,27 +296,59 @@ pub async fn on_rpc_enter_world_arg(
dungeon_uid: 0, dungeon_uid: 0,
}); });
let yorozuya_quest_manager = session.context.yorozuya_quest_manager.borrow(); session.context.yorozuya_quest_manager.add_hollow_quest(
yorozuya_quest_manager.add_hollow_quest(102, HollowQuestType::SideQuest, 10010002); 102,
HollowQuestType::SideQuest,
10010002,
);
if globals::should_skip_tutorial() { if CONFIGURATION.skip_tutorial {
Box::pin(enter_main_city(session)).await?; Box::pin(enter_main_city(session)).await?;
} else { } else {
let fresh_scene_uid = *dungeon_manager.create_fresh().unwrap(); let fresh_scene_uid = session.context.dungeon_manager.create_fresh().take();
session session
.send_rpc_arg( .push_rpc_arg(
118, PTC_ENTER_SCENE_ID,
dungeon_manager session
.context
.dungeon_manager
.enter_scene(fresh_scene_uid) .enter_scene(fresh_scene_uid)
.unwrap() .unwrap()
.unwrap(), .take(),
) )
.await?; .await?;
} }
session session
.send_rpc_ret(RpcEnterWorldRet::new( .push_rpc_arg(
session.ns_prop_mgr.serialize_player_info(), PTC_SYNC_SCENE_TIME_ID,
)) PtcSyncSceneTimeArg {
.await timestamp: 3600 * 8 * 1000,
last_timestamp: 0,
},
)
.await?;
Ok(RpcEnterWorldRet::new(
session.ns_prop_mgr.serialize_player_info(),
))
}
pub async fn on_rpc_reenter_world(
session: &NetworkSession,
_arg: &RpcReenterWorldArg,
) -> Result<RpcReenterWorldRet> {
tracing::warn!("OnRpcReenterWorld: world re-entrance is not implemented yet, kicking player!");
session
.push_rpc_arg(
PTC_KICK_PLAYER_ID,
PtcKickPlayerArg {
reason_id: 2,
reason_str: String::new(),
},
)
.await?;
Ok(RpcReenterWorldRet::error(ErrorCode::Fail, Vec::new()))
} }

View file

@ -1,10 +1,8 @@
use super::*; use super::*;
pub async fn on_rpc_check_yorozuya_info_refresh_arg( pub async fn on_rpc_check_yorozuya_info_refresh(
session: &NetworkSession, _session: &NetworkSession,
_arg: &RpcCheckYorozuyaInfoRefreshArg, _arg: &RpcCheckYorozuyaInfoRefreshArg,
) -> Result<()> { ) -> Result<RpcCheckYorozuyaInfoRefreshRet> {
session Ok(RpcCheckYorozuyaInfoRefreshRet::new())
.send_rpc_ret(RpcCheckYorozuyaInfoRefreshRet::new())
.await
} }

View file

@ -1,16 +1,10 @@
use anyhow::Result;
use paste::paste;
use tokio::io::AsyncReadExt; use tokio::io::AsyncReadExt;
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tracing::Instrument;
use protocol::*;
use qwer::ProtocolHeader; use qwer::ProtocolHeader;
use super::handlers::*;
use super::NetworkSession;
pub struct Packet { pub struct Packet {
#[allow(unused)]
pub to_channel: u16, pub to_channel: u16,
pub header: ProtocolHeader, pub header: ProtocolHeader,
pub body: Vec<u8>, pub body: Vec<u8>,
@ -82,189 +76,3 @@ impl From<ResponseBody> for Vec<u8> {
out out
} }
} }
macro_rules! trait_handler {
($($name:ident $protocol_id:expr;)*) => {
#[allow(dead_code)]
#[allow(unused_variables)]
pub trait PacketHandler {
$(
paste! {
async fn [<on_$name:snake>](session: &mut NetworkSession, arg: &$name) -> Result<()> {
[<on_$name:snake>](session, arg).await
}
}
)*
async fn on_message(session: &mut NetworkSession, protocol_id: u16, payload: Vec<u8>) -> Result<()> {
use ::qwer::OctData;
match protocol_id {
$(
$protocol_id => {
let arg = $name::unmarshal_from(&mut &payload[..], 0)?;
paste! {
Self::[<on_$name:snake>](session, &arg)
.instrument(tracing::info_span!(stringify!([<on_$name:snake>]), protocol_id = protocol_id))
.await
}
}
)*
_ => {
tracing::warn!("Unknown protocol id: {protocol_id}");
Ok(())
},
}
}
}
};
}
trait_handler! {
RpcLoginArg 100;
// PtcAbilityPopText 239;
// PtcAccountInfoChanged 102;
// PtcAvatarMapChanged 246;
// PtcBeforeGoToHollowLevel 145;
// PtcCardDisable 217;
// PtcChallengeQuestFinished 193;
// PtcClientCommon 110;
// PtcConfigUpdated 277;
// PtcDungeonQuestFinished 148;
// PtcDungeonQuestPrepareToFinish 136;
// PtcEnterScene 118;
// PtcEnterSceneBegin 200;
// PtcEnterSceneEnd 224;
// PtcEnterSection 243;
// PtcFairyInfoChanged 134;
// PtcFunctionSwitchMask 279;
PtcGetServerTimestampArg 204;
// PtcGoToHollowLevel 154;
// PtcHollowBlackout 268;
// PtcHollowGlobalEvent 138;
// PtcHollowGrid 114;
// PtcHollowPushBack 284;
// PtcHollowQuestUnlockedByMainCityQuest 201;
// PtcHpOrStressChanged 226;
// PtcItemChanged 117;
// PtcKickPlayer 184;
// PtcPauseMainCityTime 116;
// PtcPlayerInfoChangedArg 101;
// PtcPlayerMailsReceived 222;
// PtcPlayerMailsRemoved 225;
PtcPlayerOperationArg 203;
// PtcPopupWindow 206;
// PtcPosition 176;
// PtcPositionInHollowChanged 141;
// PtcPrepareSection 115;
// PtcPreventAddiction 270;
// PtcPropertyChanged 129;
// PtcQuestUnlocked 158;
// PtcReceivedChatMessage_Player2Client 165;
// PtcScenePropertyChanged 128;
// PtcShowCardGenreTips 276;
// PtcShowTips 207;
// PtcShowUnlockIDTips 278;
// PtcStaminaOverLevelPunish 147;
// PtcSyncEventInfo 177;
// PtcSyncHollowEventInfo 210;
// PtcSyncHollowGridMaps 124;
// PtcSyncSceneTime 249;
// PtcSyncSceneUnit 180;
// PtcTransformToHollowGrid 144;
// PtcUnlock 196;
// RpcAFKHollowQuest 241;
RpcAdvanceBeginnerProcedureArg 171;
// RpcAvatarAdvance 111;
// RpcAvatarLevelUp 107;
// RpcAvatarSkillLevelUp 197;
// RpcAvatarStarUp 108;
// RpcAvatarUnlockTalent 199;
// RpcAwardAllPlayerMail 257;
// RpcAwardPlayerMail 256;
// RpcBattleRebegin 286;
RpcBattleReportArg 125;
// RpcBeginArchiveBattleQuest 137;
RpcBeginnerbattleBeginArg 258;
RpcBeginnerbattleEndArg 285;
// RpcBeginnerbattleRebegin 250;
// RpcBuyAutoRecoveryItem 167;
// RpcBuyVHSCollection 269;
RpcCheckYorozuyaInfoRefreshArg 245;
// RpcClickHollowSystem 282;
RpcCloseLevelChgTipsArg 244;
// RpcCreatePlayer 104;
// RpcDebugPay 216;
// RpcDelNewMap 287;
// RpcDelNewRamen 228;
// RpcDressEquipment 112;
// RpcEatRamen 283;
RpcEndBattleArg 251;
// RpcEndSlotMachine 186;
// RpcEnterSection 175;
RpcEnterWorldArg 105;
// RpcEquipDecompose 170;
// RpcEquipGacha 169;
// RpcEquipLock 172;
// RpcEquipmentLevelUp 130;
// RpcEquipmentStarUp 131;
RpcFinishACTPerformShowArg 185;
// RpcFinishBlackout 267;
// RpcFinishEventGraphPerformShow 187;
// RpcFinishGraphInClient 146;
// RpcGMCommand 113;
// RpcGacha 173;
// RpcGetArchiveReward 166;
// RpcGetAuthKey 280;
// RpcGetChatHistory_Client2Player 159;
RpcGetPlayerMailsArg 221;
// RpcGetShopInfo 122;
// RpcGetYorozuyaInfo 182;
// RpcGiveUpDungeonQuest 142;
// RpcHollowChangeAffix 143;
RpcHollowMoveArg 248;
// RpcHollowShopping 213;
RpcInteractWithUnitArg 181;
// RpcItemConvert 281;
RpcKeepAliveArg 149;
RpcLeaveCurDungeonArg 140;
// RpcLeaveWorld 190;
// RpcLogin 100;
// RpcLogout 103;
// RpcMakeChoiceOfEvent 214;
// RpcMakeInitiativeItem 234;
RpcModNickNameArg 215;
// RpcOpenVHSStore 135;
RpcPerformEndArg 255;
RpcPerformJumpArg 254;
RpcPerformTriggerArg 253;
// RpcPrepareNextHollowEnd 252;
// RpcReadPlayerMail 263;
// RpcReceiveVHSStoreReward 227;
// RpcReenterWorld 150;
// RpcRefreshShop 237;
// RpcRefreshVHSTrending 235;
// RpcRemoveHollowCurse 229;
// RpcRemovePlayerMailsFromClient 264;
RpcRunEventGraphArg 179;
RpcRunHollowEventGraphArg 211;
RpcSavePosInMainCityArg 202;
// RpcSelectChallenge 236;
// RpcSelectVHSCollection 219;
// RpcSendChatMessage_Client2Player 163;
// RpcSetBGM 273;
// RpcSetMainCityObjectState 274;
// RpcSetPlayerMailOld 265;
// RpcShopping 230;
RpcStartHollowQuestArg 183;
// RpcSwitchHollowRank 198;
// RpcUndressEquipment 109;
// RpcUseInitiativeItem 220;
// RpcWeaponDecompose 120;
// RpcWeaponDress 132;
// RpcWeaponLevelUp 126;
// RpcWeaponLock 119;
// RpcWeaponRefine 232;
// RpcWeaponStarUp 127;
// RpcWeaponUnDress 139;
// RpcYorozuyaManualReceiveReward 168;
}

View file

@ -1,74 +1,96 @@
use anyhow::Result; use anyhow::Result;
use atomic_refcell::{AtomicRef, AtomicRefMut}; use protocol::{AccountInfo, PlayerInfo};
use protocol::*;
use qwer::{OctData, ProtocolHeader}; use qwer::{OctData, ProtocolHeader};
use std::collections::VecDeque;
use std::io::Cursor; use std::io::Cursor;
use std::net::SocketAddr;
use std::sync::Arc; use std::sync::Arc;
use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpStream; use tokio::net::TcpStream;
use tokio::sync::{Mutex, MutexGuard}; use tokio::sync::{Mutex, MutexGuard, OnceCell};
use crate::game::manager::net_stream; use crate::game::manager::net_stream;
use crate::game::GameContext; use crate::game::GameContext;
use super::{packet::PacketHandler, Packet, RequestBody, ResponseBody}; use super::handlers::ProtocolHandler;
use super::{Packet, RequestBody, ResponseBody};
#[derive(Clone, Copy, Debug)]
pub struct AccountUID(pub u64);
#[derive(Clone, Copy, Debug)]
pub struct PlayerUID(u64);
impl PlayerUID {
pub const fn new(account_uid: AccountUID, index: usize) -> Self {
Self(account_uid.0 * 100 + index as u64)
}
pub const fn from(raw: u64) -> Self {
Self(raw)
}
pub const fn raw(&self) -> u64 {
self.0
}
}
struct QueueItem(pub u16, pub Vec<u8>);
pub struct NetworkSession { pub struct NetworkSession {
client_socket: Arc<Mutex<TcpStream>>, client_socket: Arc<Mutex<TcpStream>>,
client_addr: SocketAddr,
cur_rpc_uid: u64, cur_rpc_uid: u64,
outgoing_rpc_queue: Mutex<VecDeque<QueueItem>>,
pub ns_prop_mgr: net_stream::PropertyManager, pub ns_prop_mgr: net_stream::PropertyManager,
pub context: GameContext, pub context: GameContext,
account_uid: OnceCell<AccountUID>,
player_uid: OnceCell<PlayerUID>,
} }
impl NetworkSession { impl NetworkSession {
pub fn new(client_socket: TcpStream, client_addr: SocketAddr) -> Self { pub fn new(client_socket: TcpStream) -> Self {
let ns_prop_mgr = net_stream::PropertyManager::default(); let ns_prop_mgr = net_stream::PropertyManager::default();
Self { Self {
client_socket: Arc::new(Mutex::new(client_socket)), client_socket: Arc::new(Mutex::new(client_socket)),
client_addr,
cur_rpc_uid: 0, cur_rpc_uid: 0,
outgoing_rpc_queue: Mutex::new(VecDeque::new()),
context: GameContext::new(ns_prop_mgr.player_info.clone()), context: GameContext::new(ns_prop_mgr.player_info.clone()),
ns_prop_mgr, ns_prop_mgr,
account_uid: OnceCell::new(),
player_uid: OnceCell::new(),
} }
} }
pub fn get_player_uid(&self) -> u64 { async fn client_socket(&self) -> MutexGuard<'_, TcpStream> {
self.get_player().uid.unwrap()
}
pub fn get_account(&self) -> AtomicRef<AccountInfo> {
self.ns_prop_mgr.account_info.borrow()
}
pub fn get_player(&self) -> AtomicRef<PlayerInfo> {
self.ns_prop_mgr.player_info.borrow()
}
pub fn get_account_mut(&self) -> AtomicRefMut<'_, AccountInfo> {
self.ns_prop_mgr.account_info.try_borrow_mut().unwrap()
}
pub fn get_player_mut(&self) -> AtomicRefMut<'_, PlayerInfo> {
self.ns_prop_mgr.player_info.try_borrow_mut().unwrap()
}
pub async fn client_socket(&self) -> MutexGuard<'_, TcpStream> {
self.client_socket.lock().await self.client_socket.lock().await
} }
pub fn logged_in(&self, uid: AccountUID, account: AccountInfo) -> Result<()> {
self.account_uid.set(uid)?;
*self.ns_prop_mgr.account_info.write() = account;
Ok(())
}
pub fn set_cur_player(&self, uid: PlayerUID, player: PlayerInfo) -> Result<()> {
self.player_uid.set(uid)?;
*self.ns_prop_mgr.player_info.write() = player;
Ok(())
}
pub fn account_uid(&self) -> AccountUID {
*self.account_uid.get().unwrap()
}
pub fn player_uid(&self) -> PlayerUID {
*self.player_uid.get().unwrap()
}
pub async fn run(&mut self) -> Result<()> { pub async fn run(&mut self) -> Result<()> {
let channel_id = match self.read_handshake().await { let Some(_channel_id) = self.read_handshake().await? else {
Ok(channel_id) => channel_id, return Ok(());
Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => return Ok(()),
Err(e) => return Err(e.into()),
}; };
tracing::info!(
"Session ({}) bound to channel {channel_id}",
self.client_addr
);
loop { loop {
let packet = match Packet::read(&mut *self.client_socket().await).await { let packet = match Packet::read(&mut *self.client_socket().await).await {
@ -83,11 +105,62 @@ impl NetworkSession {
} }
} }
async fn read_handshake(&mut self) -> Result<u16, std::io::Error> { async fn read_handshake(&mut self) -> Result<Option<u16>> {
self.client_socket().await.read_u16_le().await match self.client_socket().await.read_u16_le().await {
Ok(channel_id) => Ok(Some(channel_id)),
Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => Ok(None),
Err(e) => return Err(e.into()),
}
} }
pub async fn send_rpc_ret(&self, data: impl OctData) -> Result<()> { pub async fn push_rpc_arg(&self, protocol_id: u16, data: impl OctData) -> Result<()> {
let mut payload = Vec::new();
let mut cursor = Cursor::new(&mut payload);
data.marshal_to(&mut cursor, 0)?;
self.outgoing_rpc_queue
.lock()
.await
.push_back(QueueItem(protocol_id, payload));
Ok(())
}
pub async fn flush_rpc_queue(&self) -> Result<()> {
let mut queue = self.outgoing_rpc_queue.lock().await;
while let Some(QueueItem(protocol_id, payload)) = queue.pop_front() {
self.send_rpc_arg(protocol_id, payload).await?;
}
Ok(())
}
async fn send_rpc_arg(&self, protocol_id: u16, payload: Vec<u8>) -> Result<()> {
let header: Vec<u8> = ProtocolHeader::default().into();
let body: Vec<u8> = RequestBody {
protocol_id,
payload,
}
.into();
let mut packet = Vec::new();
packet.extend(0_u16.to_le_bytes());
packet.extend(((body.len() + 2) as u32).to_le_bytes());
packet.extend((header.len() as u16).to_le_bytes());
packet.extend(header);
packet.extend(body);
packet.extend(0_u16.to_le_bytes()); // middleware count
self.client_socket().await.write_all(&packet).await?;
tracing::info!("Ptc with protocol id {protocol_id} sent");
Ok(())
}
}
impl ProtocolHandler for NetworkSession {
async fn send_rpc_ret(&self, data: impl OctData) -> Result<()> {
let header = ProtocolHeader { let header = ProtocolHeader {
is_rpc_ret: true, is_rpc_ret: true,
rpc_arg_uid: self.cur_rpc_uid, rpc_arg_uid: self.cur_rpc_uid,
@ -116,33 +189,4 @@ impl NetworkSession {
self.client_socket().await.write_all(&packet).await?; self.client_socket().await.write_all(&packet).await?;
Ok(()) Ok(())
} }
pub async fn send_rpc_arg(&self, protocol_id: u16, data: &impl OctData) -> Result<()> {
let header: Vec<u8> = ProtocolHeader::default().into();
let mut payload = Vec::new();
let mut cursor = Cursor::new(&mut payload);
data.marshal_to(&mut cursor, 0)?;
let body: Vec<u8> = RequestBody {
protocol_id,
payload,
}
.into();
let mut packet = Vec::new();
packet.extend(0_u16.to_le_bytes());
packet.extend(((body.len() + 2) as u32).to_le_bytes());
packet.extend((header.len() as u16).to_le_bytes());
packet.extend(header);
packet.extend(body);
packet.extend(0_u16.to_le_bytes()); // middleware count
self.client_socket().await.write_all(&packet).await?;
tracing::info!("Ptc with protocol id {protocol_id} sent");
Ok(())
}
} }
// Auto implemented
impl PacketHandler for NetworkSession {}

View file

@ -7,3 +7,4 @@ version.workspace = true
byteorder.workspace = true byteorder.workspace = true
hex.workspace = true hex.workspace = true
qwer.workspace = true qwer.workspace = true
serde.workspace = true

View file

@ -1,3 +1,5 @@
use serde::Deserialize;
use super::*; use super::*;
#[derive(OctData, Clone, Debug, PartialEq, Eq)] #[derive(OctData, Clone, Debug, PartialEq, Eq)]
@ -5,9 +7,101 @@ use super::*;
pub enum ErrorCode { pub enum ErrorCode {
Fail = -1, Fail = -1,
Success = 0, Success = 0,
Timeout = 1,
EntityNotExist = 2,
InvalidVersion = 3,
InvalidTemplateID = 4,
InvalidConfigVersion = 5,
ObjectNotExist = 100,
ConfigError = 101,
NoEnoughRes = 102,
NoEnoughEXP = 103,
NoEnoughItem = 104,
NoEnoughMaterials = 105,
NoEnoughGoods = 106,
NoEnoughCurrency = 107,
CannotFindGoods = 108,
AvatarMaxLevelLimit = 109,
AvatarMaxStarLimit = 110,
AvatarMaxAdvanceLevelLimit = 111,
EquipMaxLevelLimit = 112,
EquipMaxStarLimit = 113,
SceneAlreadyDestroyed = 114,
StageAlreadyDestroyed = 115,
ErrorSrcPosition = 116,
ErrorGraph = 117,
NodeFinished = 118,
NodeRunFailure = 119,
UnknownAvatarSkill = 120,
AvatarSkillMaxLevelLimit = 121,
AvatarTalentMaxLevelLimit = 122,
AvatarStarNotEnough = 123,
InvalidActionMovePath = 124,
ActionIDNotExist = 125,
NickNameMaxLength = 126,
NickNameIllegal = 127,
Ban = 128,
RepeatedLogin = 129,
FuncNotOpen = 130,
TokenError = 131,
PlayerNotExist = 132,
InvalidParam = 133,
ItemBeOccupy = 134,
ItemBeLock = 135,
EquipGachaClose = 136,
InvalidQuestState = 137,
QuestMaxFinishCnt = 138,
NoEnoughTimes = 139,
BattleReportLimit = 140,
BattleReportInvalid = 141,
MaxLevelLimit = 142,
MaxStarLimit = 143,
MaxRefineLimit = 144,
AlreadyGet = 145,
RepeatedModName = 146,
VHSStoreUnlock = 147,
VHSStoreAlreadSlot = 148,
VHSStoreSlotNumErr = 149,
FuncNotUnlock = 150,
VHSStoreRamenContinueEat = 151,
VHSStoreAlreadyUnlock = 152,
AFKGamePlayClose = 153,
InitiativeItemUnlock = 154,
InitiativeItemLevel = 155,
PrepareAvatarsFail = 156,
AlreadyAFK = 157,
HollowDoEvtListNotEmpty = 158,
HollowEvtNotCompleted = 159,
HollowMoveFail = 160,
BuyNumOverflow = 161,
PackgeOverflow = 162,
ReplacePkg = 163,
FileLenghCheckFaild = 164,
HashCheckFaild = 165,
DiskNotEnough = 166,
NotReachable = 167,
ServerException = 168,
RequestException = 169,
OherDownLoadError = 170,
QuestProgressNotEnough = 171,
ConditionComplete = 172,
ConditionNoComplete = 173,
PayErrCode0 = 174,
PayErrCode1 = 175,
PayErrCode2 = 176,
PayErrCode3 = 177,
PayErrCode4 = 178,
PayErrCode5 = 179,
NoWhite = 180,
NoWhiteDevice = 181,
NoWhiteIp = 182,
SdkError = 183,
StopServer = 184,
AccountServerError = 185,
CloseServer = 187,
} }
#[derive(OctData, Clone, Copy, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(i16)] #[repr(i16)]
pub enum HollowQuestType { pub enum HollowQuestType {
Common = 0, Common = 0,
@ -20,6 +114,16 @@ pub enum HollowQuestType {
AvatarSide = 7, AvatarSide = 7,
} }
#[derive(OctData, Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[repr(i16)]
pub enum UnlockIDType {
HollowCard = 1,
HollowBuff = 2,
HollowEvent = 3,
HollowItem = 4,
Curse = 5,
}
#[derive(OctData, Clone, Debug, PartialEq, Eq)] #[derive(OctData, Clone, Debug, PartialEq, Eq)]
#[repr(u8)] #[repr(u8)]
pub enum FairyState { pub enum FairyState {
@ -38,7 +142,7 @@ pub enum FightRanking {
S = 5, S = 5,
} }
#[derive(OctData, Hash, Clone, Debug, PartialEq, Eq)] #[derive(OctData, Hash, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
#[repr(i16)] #[repr(i16)]
pub enum BattleRewardType { pub enum BattleRewardType {
Client = 1, Client = 1,
@ -69,7 +173,7 @@ pub enum HollowBattleEventType {
LevelFin = 5, LevelFin = 5,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(i16)] #[repr(i16)]
pub enum QuestType { pub enum QuestType {
ArchiveFile = 1, ArchiveFile = 1,
@ -103,7 +207,7 @@ pub enum ActionState {
Error = 3, Error = 3,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(u8)] #[repr(u8)]
pub enum DungeonContentDropPoolType { pub enum DungeonContentDropPoolType {
Card = 0, Card = 0,
@ -133,14 +237,14 @@ pub enum UIType {
Archive = 3, Archive = 3,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(i16)] #[repr(i16)]
pub enum ACTPerformShowMoment { pub enum ACTPerformShowMoment {
Begin = 0, Begin = 0,
End = 1, End = 1,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(i16)] #[repr(i16)]
pub enum HollowSystemType { pub enum HollowSystemType {
Card = 1, Card = 1,
@ -160,7 +264,7 @@ pub enum HollowSystemUIState {
Brighten = 2, Brighten = 2,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(i16)] #[repr(i16)]
pub enum HollowShopType { pub enum HollowShopType {
All = 0, All = 0,
@ -193,7 +297,7 @@ pub enum WeatherType {
Thunder = 5, Thunder = 5,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(i16)] #[repr(i16)]
pub enum PropertyType { pub enum PropertyType {
Hp = 1, Hp = 1,
@ -323,7 +427,7 @@ pub enum PropertyType {
EnumCount = 10351, EnumCount = 10351,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(i16)] #[repr(i16)]
pub enum ScenePropertyType { pub enum ScenePropertyType {
Stamina = 1001, Stamina = 1001,
@ -458,7 +562,7 @@ flag! {
} }
} }
#[derive(OctData, Clone, Debug)] #[derive(OctData, Clone, Debug, Hash, PartialEq, Eq, Deserialize)]
#[repr(i16)] #[repr(i16)]
pub enum NodeState { pub enum NodeState {
All = 0, All = 0,
@ -475,7 +579,7 @@ pub enum NodeState {
EnumCount = 11, EnumCount = 11,
} }
#[derive(OctData, Clone, Debug)] #[derive(OctData, Clone, Debug, Hash, PartialEq, Eq, Deserialize)]
#[repr(i16)] #[repr(i16)]
pub enum NodeVisible { pub enum NodeVisible {
All = 0, All = 0,
@ -486,24 +590,34 @@ pub enum NodeVisible {
EnumCount = 5, EnumCount = 5,
} }
#[derive(OctData, Clone, Debug)] #[derive(OctData, Clone, Debug, Hash, PartialEq, Eq, Deserialize)]
#[repr(i16)] #[repr(i16)]
pub enum HollowEventType { pub enum HollowEventType {
None = 0, None = 0,
All = 1, All = 1,
Begin = 10, Begin = 10,
End = 20, End = 20,
#[serde(rename = "Interact_End")]
InteractEnd = 21, InteractEnd = 21,
#[serde(rename = "Battle_End")]
BattleEnd = 22, BattleEnd = 22,
#[serde(rename = "Change_Level_Interact")]
ChangeLevelInteract = 23, ChangeLevelInteract = 23,
#[serde(rename = "Change_Level_Fight")]
ChangeLevelFight = 24, ChangeLevelFight = 24,
Battle = 30, Battle = 30,
#[serde(rename = "Battle_Normal")]
BattleNormal = 31, BattleNormal = 31,
#[serde(rename = "Battle_Elite")]
BattleElite = 32, BattleElite = 32,
#[serde(rename = "Battle_Boss")]
BattleBoss = 33, BattleBoss = 33,
Dialog = 40, Dialog = 40,
#[serde(rename = "Dialog_Positive")]
DialogPositive = 41, DialogPositive = 41,
#[serde(rename = "Dialog_Negative")]
DialogNegative = 42, DialogNegative = 42,
#[serde(rename = "Dialog_Special")]
DialogSpecial = 43, DialogSpecial = 43,
} }
@ -525,7 +639,7 @@ pub enum QuestState {
Finished = 3, Finished = 3,
} }
#[derive(OctData, Clone, Debug, PartialEq, Eq, Hash)] #[derive(OctData, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(u8)] #[repr(u8)]
pub enum QuestStatisticsType { pub enum QuestStatisticsType {
ArrivedLevel = 1, ArrivedLevel = 1,
@ -569,7 +683,7 @@ pub enum InteractTarget {
TriggerBox = 1, TriggerBox = 1,
} }
#[derive(OctData, Clone, Debug)] #[derive(OctData, Clone, Copy, Debug)]
#[repr(i16)] #[repr(i16)]
pub enum EventGraphOwnerType { pub enum EventGraphOwnerType {
Scene = 0, Scene = 0,

View file

@ -4,10 +4,12 @@ use qwer::{OctData, PropertyDoubleKeyHashMap, PropertyHashMap, PropertyHashSet};
mod enums; mod enums;
mod polymorphic; mod polymorphic;
mod protocol_id;
mod rpc_ptc; mod rpc_ptc;
mod structs; mod structs;
pub use enums::*; pub use enums::*;
pub use polymorphic::*; pub use polymorphic::*;
pub use protocol_id::*;
pub use rpc_ptc::*; pub use rpc_ptc::*;
pub use structs::*; pub use structs::*;

View file

@ -658,6 +658,30 @@ macro_rules! polymorphic_quest_info {
)* )*
} }
} }
pub fn set_state(&mut self, state: QuestState) {
match self {
$(
$name::$variant { state: ref mut c, .. } => *c = state,
)*
}
}
pub fn set_progress(&mut self, progress: u16) {
match self {
$(
$name::$variant { progress: ref mut c, .. } => *c = progress,
)*
}
}
pub fn set_finished_count(&mut self, finished_count: i32) {
match self {
$(
$name::$variant { finished_count: ref mut c, .. } => *c = finished_count,
)*
}
}
} }
}; };
} }

146
protocol/src/protocol_id.rs Normal file
View file

@ -0,0 +1,146 @@
pub const RPC_LOGIN_ID: u16 = 100;
pub const PTC_PLAYER_INFO_CHANGED_ID: u16 = 101;
pub const PTC_ACCOUNT_INFO_CHANGED_ID: u16 = 102;
pub const RPC_LOGOUT_ID: u16 = 103;
pub const RPC_CREATE_PLAYER_ID: u16 = 104;
pub const RPC_ENTER_WORLD_ID: u16 = 105;
pub const RPC_AVATAR_LEVEL_UP_ID: u16 = 107;
pub const RPC_AVATAR_STAR_UP_ID: u16 = 108;
pub const RPC_UNDRESS_EQUIPMENT_ID: u16 = 109;
pub const PTC_CLIENT_COMMON_ID: u16 = 110;
pub const RPC_AVATAR_ADVANCE_ID: u16 = 111;
pub const RPC_DRESS_EQUIPMENT_ID: u16 = 112;
pub const RPC_GM_COMMAND_ID: u16 = 113;
pub const PTC_HOLLOW_GRID_ID: u16 = 114;
pub const PTC_PREPARE_SECTION_ID: u16 = 115;
pub const PTC_PAUSE_MAIN_CITY_TIME_ID: u16 = 116;
pub const PTC_ITEM_CHANGED_ID: u16 = 117;
pub const PTC_ENTER_SCENE_ID: u16 = 118;
pub const RPC_WEAPON_LOCK_ID: u16 = 119;
pub const RPC_WEAPON_DECOMPOSE_ID: u16 = 120;
pub const RPC_GET_SHOP_INFO_ID: u16 = 122;
pub const PTC_SYNC_HOLLOW_GRID_MAPS_ID: u16 = 124;
pub const RPC_BATTLE_REPORT_ID: u16 = 125;
pub const RPC_WEAPON_LEVEL_UP_ID: u16 = 126;
pub const RPC_WEAPON_STAR_UP_ID: u16 = 127;
pub const PTC_SCENE_PROPERTY_CHANGED_ID: u16 = 128;
pub const PTC_PROPERTY_CHANGED_ID: u16 = 129;
pub const RPC_EQUIPMENT_LEVEL_UP_ID: u16 = 130;
pub const RPC_EQUIPMENT_STAR_UP_ID: u16 = 131;
pub const RPC_WEAPON_DRESS_ID: u16 = 132;
pub const PTC_FAIRY_INFO_CHANGED_ID: u16 = 134;
pub const RPC_OPEN_VHS_STORE_ID: u16 = 135;
pub const PTC_DUNGEON_QUEST_PREPARE_TO_FINISH_ID: u16 = 136;
pub const RPC_BEGIN_ARCHIVE_BATTLE_QUEST_ID: u16 = 137;
pub const PTC_HOLLOW_GLOBAL_EVENT_ID: u16 = 138;
pub const RPC_WEAPON_UN_DRESS_ID: u16 = 139;
pub const RPC_LEAVE_CUR_DUNGEON_ID: u16 = 140;
pub const PTC_POSITION_IN_HOLLOW_CHANGED_ID: u16 = 141;
pub const RPC_GIVE_UP_DUNGEON_QUEST_ID: u16 = 142;
pub const RPC_HOLLOW_CHANGE_AFFIX_ID: u16 = 143;
pub const PTC_TRANSFORM_TO_HOLLOW_GRID_ID: u16 = 144;
pub const PTC_BEFORE_GO_TO_HOLLOW_LEVEL_ID: u16 = 145;
pub const RPC_FINISH_GRAPH_IN_CLIENT_ID: u16 = 146;
pub const PTC_STAMINA_OVER_LEVEL_PUNISH_ID: u16 = 147;
pub const PTC_DUNGEON_QUEST_FINISHED_ID: u16 = 148;
pub const RPC_KEEP_ALIVE_ID: u16 = 149;
pub const RPC_REENTER_WORLD_ID: u16 = 150;
pub const PTC_GO_TO_HOLLOW_LEVEL_ID: u16 = 154;
pub const PTC_QUEST_UNLOCKED_ID: u16 = 158;
pub const RPC_GET_CHAT_HISTORY_CLIENT2_PLAYER_ID: u16 = 159;
pub const RPC_SEND_CHAT_MESSAGE_CLIENT2_PLAYER_ID: u16 = 163;
pub const PTC_RECEIVED_CHAT_MESSAGE_PLAYER2_CLIENT_ID: u16 = 165;
pub const RPC_GET_ARCHIVE_REWARD_ID: u16 = 166;
pub const RPC_BUY_AUTO_RECOVERY_ITEM_ID: u16 = 167;
pub const RPC_YOROZUYA_MANUAL_RECEIVE_REWARD_ID: u16 = 168;
pub const RPC_EQUIP_GACHA_ID: u16 = 169;
pub const RPC_EQUIP_DECOMPOSE_ID: u16 = 170;
pub const RPC_ADVANCE_BEGINNER_PROCEDURE_ID: u16 = 171;
pub const RPC_EQUIP_LOCK_ID: u16 = 172;
pub const RPC_GACHA_ID: u16 = 173;
pub const RPC_ENTER_SECTION_ID: u16 = 175;
pub const PTC_POSITION_ID: u16 = 176;
pub const PTC_SYNC_EVENT_INFO_ID: u16 = 177;
pub const RPC_RUN_EVENT_GRAPH_ID: u16 = 179;
pub const PTC_SYNC_SCENE_UNIT_ID: u16 = 180;
pub const RPC_INTERACT_WITH_UNIT_ID: u16 = 181;
pub const RPC_GET_YOROZUYA_INFO_ID: u16 = 182;
pub const RPC_START_HOLLOW_QUEST_ID: u16 = 183;
pub const PTC_KICK_PLAYER_ID: u16 = 184;
pub const RPC_FINISH_ACT_PERFORM_SHOW_ID: u16 = 185;
pub const RPC_END_SLOT_MACHINE_ID: u16 = 186;
pub const RPC_FINISH_EVENT_GRAPH_PERFORM_SHOW_ID: u16 = 187;
pub const RPC_LEAVE_WORLD_ID: u16 = 190;
pub const PTC_CHALLENGE_QUEST_FINISHED_ID: u16 = 193;
pub const PTC_UNLOCK_ID: u16 = 196;
pub const RPC_AVATAR_SKILL_LEVEL_UP_ID: u16 = 197;
pub const RPC_SWITCH_HOLLOW_RANK_ID: u16 = 198;
pub const RPC_AVATAR_UNLOCK_TALENT_ID: u16 = 199;
pub const PTC_ENTER_SCENE_BEGIN_ID: u16 = 200;
pub const PTC_HOLLOW_QUEST_UNLOCKED_BY_MAIN_CITY_QUEST_ID: u16 = 201;
pub const RPC_SAVE_POS_IN_MAIN_CITY_ID: u16 = 202;
pub const PTC_PLAYER_OPERATION_ID: u16 = 203;
pub const PTC_GET_SERVER_TIMESTAMP_ID: u16 = 204;
pub const PTC_POPUP_WINDOW_ID: u16 = 206;
pub const PTC_SHOW_TIPS_ID: u16 = 207;
pub const PTC_SYNC_HOLLOW_EVENT_INFO_ID: u16 = 210;
pub const RPC_RUN_HOLLOW_EVENT_GRAPH_ID: u16 = 211;
pub const RPC_HOLLOW_SHOPPING_ID: u16 = 213;
pub const RPC_MAKE_CHOICE_OF_EVENT_ID: u16 = 214;
pub const RPC_MOD_NICK_NAME_ID: u16 = 215;
pub const RPC_DEBUG_PAY_ID: u16 = 216;
pub const PTC_CARD_DISABLE_ID: u16 = 217;
pub const RPC_SELECT_VHS_COLLECTION_ID: u16 = 219;
pub const RPC_USE_INITIATIVE_ITEM_ID: u16 = 220;
pub const RPC_GET_PLAYER_MAILS_ID: u16 = 221;
pub const PTC_PLAYER_MAILS_RECEIVED_ID: u16 = 222;
pub const PTC_ENTER_SCENE_END_ID: u16 = 224;
pub const PTC_PLAYER_MAILS_REMOVED_ID: u16 = 225;
pub const PTC_HP_OR_STRESS_CHANGED_ID: u16 = 226;
pub const RPC_RECEIVE_VHS_STORE_REWARD_ID: u16 = 227;
pub const RPC_DEL_NEW_RAMEN_ID: u16 = 228;
pub const RPC_REMOVE_HOLLOW_CURSE_ID: u16 = 229;
pub const RPC_SHOPPING_ID: u16 = 230;
pub const RPC_WEAPON_REFINE_ID: u16 = 232;
pub const RPC_MAKE_INITIATIVE_ITEM_ID: u16 = 234;
pub const RPC_REFRESH_VHS_TRENDING_ID: u16 = 235;
pub const RPC_SELECT_CHALLENGE_ID: u16 = 236;
pub const RPC_REFRESH_SHOP_ID: u16 = 237;
pub const PTC_ABILITY_POP_TEXT_ID: u16 = 239;
pub const RPC_AFK_HOLLOW_QUEST_ID: u16 = 241;
pub const PTC_ENTER_SECTION_ID: u16 = 243;
pub const RPC_CLOSE_LEVEL_CHG_TIPS_ID: u16 = 244;
pub const RPC_CHECK_YOROZUYA_INFO_REFRESH_ID: u16 = 245;
pub const PTC_AVATAR_MAP_CHANGED_ID: u16 = 246;
pub const RPC_HOLLOW_MOVE_ID: u16 = 248;
pub const PTC_SYNC_SCENE_TIME_ID: u16 = 249;
pub const RPC_BEGINNERBATTLE_REBEGIN_ID: u16 = 250;
pub const RPC_END_BATTLE_ID: u16 = 251;
pub const RPC_PREPARE_NEXT_HOLLOW_END_ID: u16 = 252;
pub const RPC_PERFORM_TRIGGER_ID: u16 = 253;
pub const RPC_PERFORM_JUMP_ID: u16 = 254;
pub const RPC_PERFORM_END_ID: u16 = 255;
pub const RPC_AWARD_PLAYER_MAIL_ID: u16 = 256;
pub const RPC_AWARD_ALL_PLAYER_MAIL_ID: u16 = 257;
pub const RPC_BEGINNERBATTLE_BEGIN_ID: u16 = 258;
pub const RPC_READ_PLAYER_MAIL_ID: u16 = 263;
pub const RPC_REMOVE_PLAYER_MAILS_FROM_CLIENT_ID: u16 = 264;
pub const RPC_SET_PLAYER_MAIL_OLD_ID: u16 = 265;
pub const RPC_FINISH_BLACKOUT_ID: u16 = 267;
pub const PTC_HOLLOW_BLACKOUT_ID: u16 = 268;
pub const RPC_BUY_VHS_COLLECTION_ID: u16 = 269;
pub const PTC_PREVENT_ADDICTION_ID: u16 = 270;
pub const RPC_SET_BGM_ID: u16 = 273;
pub const RPC_SET_MAIN_CITY_OBJECT_STATE_ID: u16 = 274;
pub const PTC_SHOW_CARD_GENRE_TIPS_ID: u16 = 276;
pub const PTC_CONFIG_UPDATED_ID: u16 = 277;
pub const PTC_SHOW_UNLOCK_ID_TIPS_ID: u16 = 278;
pub const PTC_FUNCTION_SWITCH_MASK_ID: u16 = 279;
pub const RPC_GET_AUTH_KEY_ID: u16 = 280;
pub const RPC_ITEM_CONVERT_ID: u16 = 281;
pub const RPC_CLICK_HOLLOW_SYSTEM_ID: u16 = 282;
pub const RPC_EAT_RAMEN_ID: u16 = 283;
pub const PTC_HOLLOW_PUSH_BACK_ID: u16 = 284;
pub const RPC_BEGINNERBATTLE_END_ID: u16 = 285;
pub const RPC_BATTLE_REBEGIN_ID: u16 = 286;
pub const RPC_DEL_NEW_MAP_ID: u16 = 287;

View file

@ -53,7 +53,7 @@ macro_rules! ret {
}; };
} }
#[derive(OctData)] #[derive(OctData, Debug)]
pub struct RpcLoginArg { pub struct RpcLoginArg {
pub account_name: String, pub account_name: String,
pub token: String, pub token: String,
@ -61,6 +61,9 @@ pub struct RpcLoginArg {
pub config_sign: String, pub config_sign: String,
} }
#[derive(OctData, Debug)]
pub struct RpcCreatePlayerArg {}
#[derive(OctData, Clone, Debug)] #[derive(OctData, Clone, Debug)]
pub struct PtcEnterSceneArg { pub struct PtcEnterSceneArg {
pub player_uid: u64, pub player_uid: u64,
@ -76,6 +79,9 @@ pub struct PtcEnterSceneArg {
pub camera_y: u32, pub camera_y: u32,
} }
#[derive(OctData, Clone, Debug)]
pub struct RpcReenterWorldArg {}
#[derive(OctData, Clone, Debug)] #[derive(OctData, Clone, Debug)]
pub struct RpcEnterWorldArg {} pub struct RpcEnterWorldArg {}
@ -117,7 +123,7 @@ pub struct RpcModNickNameArg {
} }
#[derive(OctData, Clone, Debug)] #[derive(OctData, Clone, Debug)]
pub struct RpcFinishACTPerformShowArg { pub struct RpcFinishActPerformShowArg {
pub moment: ACTPerformShowMoment, pub moment: ACTPerformShowMoment,
pub step: u8, pub step: u8,
} }
@ -312,15 +318,60 @@ pub struct RpcEndBattleArg {
pub battle_statistics: LogBattleStatistics, pub battle_statistics: LogBattleStatistics,
} }
#[derive(OctData, Debug)]
pub struct RpcFinishEventGraphPerformShowArg {
pub owner_type: EventGraphOwnerType,
pub owner_uid: u64,
pub event_graph_id: i32,
pub event_id: i32,
pub step: u8,
pub return_map: HashMap<String, i32>,
}
#[derive(OctData, Debug)]
pub struct RpcDelNewMapArg {
pub map_type: UnlockIDType,
pub ids: PropertyHashSet<i32>,
}
#[derive(OctData, Debug)]
pub struct PtcDungeonQuestFinishedArg {
pub player_uid: u64,
pub quest_id: i32,
pub success: bool,
pub reward_items: PropertyHashMap<u64, ItemIDCount>,
pub statistics: PropertyHashMap<QuestStatisticsType, u64>,
}
#[derive(OctData, Debug)]
pub struct PtcSyncSceneTimeArg {
pub timestamp: u64,
pub last_timestamp: u64,
}
#[derive(OctData, Debug)]
pub struct PtcKickPlayerArg {
pub reason_id: i32,
pub reason_str: String,
}
ret! { ret! {
struct RpcLoginRet { struct RpcLoginRet {
account_info: PropertyBlob, account_info: PropertyBlob,
} }
struct RpcCreatePlayerRet {
player_uid: u64,
}
struct RpcEnterWorldRet { struct RpcEnterWorldRet {
player_info: PropertyBlob, player_info: PropertyBlob,
} }
struct RpcReenterWorldRet {
player_info: PropertyBlob,
}
struct RpcGetPlayerMailsRet { struct RpcGetPlayerMailsRet {
mail_count: u32, // Actually List<CPlayerMailInfo>, TODO! mail_count: u32, // Actually List<CPlayerMailInfo>, TODO!
} }
@ -344,7 +395,7 @@ ret! {
struct RpcModNickNameRet { struct RpcModNickNameRet {
} }
struct RpcFinishACTPerformShowRet { struct RpcFinishActPerformShowRet {
} }
struct RpcKeepAliveRet { struct RpcKeepAliveRet {
@ -400,4 +451,10 @@ ret! {
hollow_event_id: i32, hollow_event_id: i32,
reward_items_classify: HashMap<BattleRewardType, HashMap<u64, ItemIDCount>>, reward_items_classify: HashMap<BattleRewardType, HashMap<u64, ItemIDCount>>,
} }
struct RpcFinishEventGraphPerformShowRet {
}
struct RpcDelNewMapRet {
}
} }

View file

@ -13,3 +13,4 @@ protocol = []
[dependencies] [dependencies]
byteorder.workspace = true byteorder.workspace = true
qwer-derive.workspace = true qwer-derive.workspace = true
itertools.workspace = true

View file

@ -612,7 +612,7 @@ fn test_dkhashmap_iter() {
impl<K, V> OctData for PropertyHashMap<K, V> impl<K, V> OctData for PropertyHashMap<K, V>
where where
K: OctData + Eq + std::hash::Hash, K: OctData + Eq + Ord + std::hash::Hash,
V: OctData, V: OctData,
{ {
fn marshal_to<W: std::io::Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> { fn marshal_to<W: std::io::Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> {
@ -721,8 +721,8 @@ where
impl<K1, K2, V> OctData for PropertyDoubleKeyHashMap<K1, K2, V> impl<K1, K2, V> OctData for PropertyDoubleKeyHashMap<K1, K2, V>
where where
K1: OctData + Eq + std::hash::Hash, K1: OctData + Eq + Ord + std::hash::Hash,
K2: OctData + Eq + std::hash::Hash, K2: OctData + Eq + Ord + std::hash::Hash,
V: OctData, V: OctData,
{ {
fn marshal_to<W: std::io::Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> { fn marshal_to<W: std::io::Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> {

View file

@ -6,6 +6,7 @@ use std::{
}; };
use byteorder::{ReadBytesExt, WriteBytesExt}; use byteorder::{ReadBytesExt, WriteBytesExt};
use itertools::Itertools;
pub use qwer_derive::OctData; pub use qwer_derive::OctData;
@ -133,12 +134,12 @@ where
impl<K, V> OctData for HashMap<K, V> impl<K, V> OctData for HashMap<K, V>
where where
K: OctData + Eq + Hash, K: OctData + Eq + Hash + Ord,
V: OctData, V: OctData,
{ {
default fn marshal_to<W: Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> { default fn marshal_to<W: Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> {
(self.len() as i32).marshal_to(w, bt_property_tag)?; (self.len() as i32).marshal_to(w, bt_property_tag)?;
for (key, value) in self { for (key, value) in self.iter().sorted_by_key(|kv| kv.0) {
key.marshal_to(w, bt_property_tag)?; key.marshal_to(w, bt_property_tag)?;
value.marshal_to(w, bt_property_tag)?; value.marshal_to(w, bt_property_tag)?;
} }
@ -164,8 +165,8 @@ where
#[cfg(feature = "collection")] #[cfg(feature = "collection")]
impl<K1, K2, V> OctData for DoubleKeyHashMap<K1, K2, V> impl<K1, K2, V> OctData for DoubleKeyHashMap<K1, K2, V>
where where
K1: OctData + Eq + Hash, K1: OctData + Eq + Hash + Ord,
K2: OctData + Eq + Hash, K2: OctData + Eq + Hash + Ord,
V: OctData, V: OctData,
{ {
fn marshal_to<W: Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> { fn marshal_to<W: Write>(&self, w: &mut W, bt_property_tag: u16) -> Result<()> {

View file

@ -17,6 +17,7 @@ serde.workspace = true
serde_json.workspace = true serde_json.workspace = true
tokio-util.workspace = true tokio-util.workspace = true
ansi_term.workspace = true ansi_term.workspace = true
rand.workspace = true
[[bin]] [[bin]]
name = "nap-sdkserver" name = "nap-sdkserver"

View file

@ -15,7 +15,7 @@ pub fn encrypt_config(content: &str, key: &str) -> Vec<u8> {
leb128::write::unsigned(&mut out, u64::try_from(k.len()).unwrap()).unwrap(); leb128::write::unsigned(&mut out, u64::try_from(k.len()).unwrap()).unwrap();
out.extend_from_slice(k); out.extend_from_slice(k);
out.extend(0_u32.to_le_bytes()); out.extend([0u8; 4]);
out.extend(u32::try_from(content_bytes.len()).unwrap().to_le_bytes()); out.extend(u32::try_from(content_bytes.len()).unwrap().to_le_bytes());
out.extend(content_bytes); out.extend(content_bytes);

View file

@ -0,0 +1,38 @@
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ConfigInfo {
pub min_version: String,
pub latest_version: String,
pub game_res_url: String,
pub design_data_url: String,
pub server_list_url: String,
}
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ConfigInfoGroup {
pub version_info_groups: HashMap<String, ConfigInfo>,
}
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct AppConfig {
pub info_groups: HashMap<String, ConfigInfoGroup>,
}
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ServerListInfo {
pub sid: i32,
pub server_name: String,
pub ip: String,
pub port: String,
pub notice_region: String,
pub protocol: String,
#[serde(rename = "$Type")]
ty: String,
}

View file

@ -0,0 +1,23 @@
use serde::Serialize;
#[derive(Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct HttpRet<Ext> {
pub error_code: i32,
pub error_msg: Option<String>,
pub ext: Ext,
}
#[derive(Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct EntryTokenRet {
pub birthday: String,
pub country: String,
pub token: String,
}
#[derive(Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct EntryAccountServerRet {
pub address: String,
}

View file

@ -0,0 +1,2 @@
pub mod config;
pub mod entry;

View file

@ -7,6 +7,7 @@ use axum::{
}; };
mod crypto; mod crypto;
mod data;
mod services; mod services;
use services::{auth, config, entry, errors}; use services::{auth, config, entry, errors};

View file

@ -1,57 +1,63 @@
use std::sync::LazyLock;
use axum::{body::Body, response::IntoResponse}; use axum::{body::Body, response::IntoResponse};
use serde_json::json; use rand::Rng;
use serde::de::DeserializeOwned;
use crate::crypto; use crate::crypto;
use crate::data::config::*;
pub const APP_CONFIG_ENDPOINT: &str = "/design_data/NAP_Publish_AppStore_0.1.0/oversea/config.bin"; pub const APP_CONFIG_ENDPOINT: &str = "/design_data/NAP_Publish_AppStore_0.1.0/oversea/config.bin";
pub const SERVER_LIST_ENDPOINT: &str = pub const SERVER_LIST_ENDPOINT: &str =
"/design_data/NAP_Publish_AppStore_0.1.0/oversea/serverlist.bin"; "/design_data/NAP_Publish_AppStore_0.1.0/oversea/serverlist.bin";
pub const VERSIONS_BUNDLE_ENDPOINT: &str = "/game_res/NAP_Publish/output_147608_1361f678bc/client/StandaloneWindows64/oversea/versions.bundle"; pub const VERSIONS_BUNDLE_ENDPOINT: &str = "/game_res/NAP_Publish/output_147608_1361f678bc/client/StandaloneWindows64/oversea/versions.bundle";
static APP_CONFIG: LazyLock<AppConfig> = LazyLock::new(|| read_config("config.json"));
static SERVER_LIST: LazyLock<Vec<ServerListInfo>> =
LazyLock::new(|| read_config("serverlist.json"));
static VERSIONS_BUNDLE: LazyLock<Box<[u8]>> = LazyLock::new(|| read_binary_data("versions.bundle"));
pub async fn application() -> Vec<u8> { pub async fn application() -> Vec<u8> {
crypto::encrypt_config( crypto::encrypt_config(
json!({ serde_json::to_string(&*APP_CONFIG).unwrap().as_str(),
"InfoGroups": { &random_xorpad(16),
"StandaloneWindows64": {
"VersionInfoGroups": {
"0.1.0": {
"MinVersion": "0.1.0",
"LatestVersion": "0.1.0",
"GameResUrl": "http://127.0.0.1:21000/game_res/NAP_Publish/output_147608_1361f678bc/client/",
"DesignDataUrl": "http://127.0.0.1:21000/",
"ServerListUrl": "http://127.0.0.1:21000/design_data/NAP_Publish_AppStore_0.1.0/oversea/serverlist.bin",
"$Type": "Foundation.ConfigurationInfo"
},
},
"$Type": "Foundation.ConfigurationInfoGroup"
},
},
})
.to_string()
.as_str(),
"MostSecureKey",
) )
} }
pub async fn server_list() -> Vec<u8> { pub async fn server_list() -> Vec<u8> {
crypto::encrypt_config( crypto::encrypt_config(
json!([{ serde_json::to_string(&*SERVER_LIST).unwrap().as_str(),
"sid": 142, &random_xorpad(16),
"serverName": "HollowPS",
"ip": "127.0.0.1",
"port": "21000",
"noticeRegion": "nap_glb_cbus01",
"protocol": "http",
"$Type": "MoleMole.ServerListInfo"
}])
.to_string()
.as_str(),
"MostSecureKey",
) )
} }
pub const VERSION_BUNDLE: &[u8] = include_bytes!("../../versions.bundle");
pub async fn versions_bundle() -> impl IntoResponse { pub async fn versions_bundle() -> impl IntoResponse {
Body::from(VERSION_BUNDLE) Body::from(&**VERSIONS_BUNDLE)
}
fn read_config<T>(file: &str) -> T
where
T: DeserializeOwned,
{
let data = std::fs::read_to_string(format!("assets/Application/{file}")).unwrap();
serde_json::from_str::<T>(&data).unwrap()
}
fn read_binary_data(file: &str) -> Box<[u8]> {
std::fs::read(format!("assets/Application/{file}"))
.unwrap()
.into()
}
fn random_xorpad(len: usize) -> String {
const CHARSET: &[u8] = b"0123456789";
let mut rng = rand::thread_rng();
(0..len)
.map(|_| {
let idx = rng.gen_range(0..CHARSET.len());
CHARSET[idx] as char
})
.collect()
} }

View file

@ -1,31 +1,33 @@
use crate::data::entry::*;
use axum::Json; use axum::Json;
use serde_json::json;
pub const ACCOUNT_TOKEN_ENDPOINT: &str = "/account/token"; pub const ACCOUNT_TOKEN_ENDPOINT: &str = "/account/token";
pub const ACCOUNT_SERVER_ENDPOINT: &str = "/account/account_server"; pub const ACCOUNT_SERVER_ENDPOINT: &str = "/account/account_server";
#[tracing::instrument] #[tracing::instrument]
pub async fn account_token() -> Json<serde_json::Value> { pub async fn account_token() -> Json<HttpRet<EntryTokenRet>> {
tracing::info!("account_token"); tracing::info!("account_token");
Json(json!({
"ErrorCode": 0, Json(HttpRet {
"ErrorMsg": null, error_code: 0,
"Ext": { error_msg: None,
"Birthday": "01.01", ext: EntryTokenRet {
"Country": "RU", birthday: String::from("01.01"),
"Token": "MostSecureTokenEver" country: String::from("RU"),
} token: String::from("MostSecureTokenEver"),
})) },
})
} }
#[tracing::instrument] #[tracing::instrument]
pub async fn account_server() -> Json<serde_json::Value> { pub async fn account_server() -> Json<HttpRet<EntryAccountServerRet>> {
tracing::info!("account_server"); tracing::info!("account_server");
Json(json!({
"ErrorCode": 0, Json(HttpRet {
"ErrorMsg": null, error_code: 0,
"Ext": { error_msg: None,
"Address": "127.0.0.1:10301/0" ext: EntryAccountServerRet {
} address: String::from("127.0.0.1:10301/0"),
})) },
})
} }