2V3-a: walk with the keyboard through the ported player chain

PythonPlayer, PythonPlayerInput{,Keyboard,Mouse}, PythonPlayerEventHandler,
PythonPlayerSkill, PythonPlayerModule and GameType are verbatim copies; the
`player` stub module and the pending PythonPlayer/GameType stand-ins are gone.
Unported callees (CPythonSkill, CItemData, CItemManager, CPythonItem, ...) are
pending stubs. 64-bit fixes: emotion icon handles use Py_BuildPointer, and
PyDict_Next takes Py_ssize_t.

The actor did not move because GrannyUpdateModelMatrix passed the model matrix
through. Walk/run motions use constant root-motion extraction
(AccumulationFlags=AccumulationExtracted, LoopTranslation e.g. (0,-300,0) for
the warrior run, same as the .msa Accumulation). libgr2 now reads both fields
from TrackGroups[0], and the runtime moves by LoopTranslation over each
control's local-clock span, blended by control weight. VDA extraction is not
implemented.

port.login_flow presses DIK_UP; the actor walks more than 100 cm, and the fake
server parses CG packets and sees CG_MOVE FUNC_MOVE, then FUNC_WAIT at the new
position. port.login_live against the real server walked 132 cm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 23:41:31 +09:00
co-authored by Claude Opus 5.5
parent 157f7c3bb4
commit ff0983d3c8
39 changed files with 10170 additions and 2039 deletions
+1
View File
@@ -524,3 +524,4 @@
{"time":"2026-09-23T12:14:00Z","event":"test_run","id":"PORT-PLAN 2V2-e.4","result":"PASS","tests":["script/port_gate.sh macos: PASS (11 port tests, port.login_live skipped without MT_LIVE_*; loopback-enabled run)","script/python_game_render_test.sh: PASS (9 terrain chunks, 9 splats, 4 lit character surfaces, textured ground screenshot)","build/formats/formats_map_test: PASS","godot --headless --path project --script res://environment_test.gd: PASS","git diff --check: PASS"],"reason":"The first sandboxed port gate run denied loopback sockets (port.net and port.login_flow); rerunning with local socket access passed. Live smoke remains unrun because credentials are unavailable."} {"time":"2026-09-23T12:14:00Z","event":"test_run","id":"PORT-PLAN 2V2-e.4","result":"PASS","tests":["script/port_gate.sh macos: PASS (11 port tests, port.login_live skipped without MT_LIVE_*; loopback-enabled run)","script/python_game_render_test.sh: PASS (9 terrain chunks, 9 splats, 4 lit character surfaces, textured ground screenshot)","build/formats/formats_map_test: PASS","godot --headless --path project --script res://environment_test.gd: PASS","git diff --check: PASS"],"reason":"The first sandboxed port gate run denied loopback sockets (port.net and port.login_flow); rerunning with local socket access passed. Live smoke remains unrun because credentials are unavailable."}
{"time":"2026-09-23T12:54:00Z","event":"port_round","unit":"PORT-PLAN 2V2-e.5: native map height and character light transition adapter","ported":[],"adapted":["CMapManager Warp-facing AtlasInfo/Setting.txt/height.raw/.msenv loader and 40250 triangle height interpolation","CPythonBackground native map selection/local coordinates/character and background SetLight","Python 3D surface consumes native map name/local frame, removes initial terrain elevation shift and rebuilds on map change","EterBase/Utils MIN/MAX/MINMAX and fMIN/fMAX/fMINMAX exact 40250 pure functions"],"divergent":["CMapOutdoor and placed-object height, attributes, fog, minimap and portal lifecycle remain unported; native map functions are marked ADAPTED/TODO rather than PORTED"],"needs_live":["MT_LIVE_* credentials absent; real-server terrain and cross-map warp screenshots pending"],"tests":["script/python_game_render_test.sh offline: PASS (4/4 native light0, finite view, native map, actor foot-ground delta 0.1 cm, textured ground screenshot)","extension/tests/port_utils_test.cpp: PASS","port_map.py check: 0 errors"],"todo":["full CMapOutdoor/MapManager/PythonBackground unit port","real-server and cross-map visual smoke","2V3 player/input/event/movement chain"]} {"time":"2026-09-23T12:54:00Z","event":"port_round","unit":"PORT-PLAN 2V2-e.5: native map height and character light transition adapter","ported":[],"adapted":["CMapManager Warp-facing AtlasInfo/Setting.txt/height.raw/.msenv loader and 40250 triangle height interpolation","CPythonBackground native map selection/local coordinates/character and background SetLight","Python 3D surface consumes native map name/local frame, removes initial terrain elevation shift and rebuilds on map change","EterBase/Utils MIN/MAX/MINMAX and fMIN/fMAX/fMINMAX exact 40250 pure functions"],"divergent":["CMapOutdoor and placed-object height, attributes, fog, minimap and portal lifecycle remain unported; native map functions are marked ADAPTED/TODO rather than PORTED"],"needs_live":["MT_LIVE_* credentials absent; real-server terrain and cross-map warp screenshots pending"],"tests":["script/python_game_render_test.sh offline: PASS (4/4 native light0, finite view, native map, actor foot-ground delta 0.1 cm, textured ground screenshot)","extension/tests/port_utils_test.cpp: PASS","port_map.py check: 0 errors"],"todo":["full CMapOutdoor/MapManager/PythonBackground unit port","real-server and cross-map visual smoke","2V3 player/input/event/movement chain"]}
{"time":"2026-09-23T13:09:00Z","event":"test_run","id":"PORT-PLAN 2V2-e.5","result":"PASS","tests":["script/port_gate.sh macos: PASS (12 port tests; port.login_live skipped without MT_LIVE_*)","script/python_game_render_test.sh: PASS (4/4 native light0, finite camera matrix, 0.1 cm foot-ground difference, 559 terrain texture contrasts)","port_map.py check: 0 errors","git diff --check: PASS"],"reason":"The first sandboxed port gate run denied localhost sockets; loopback-enabled rerun passed. Full CMapOutdoor and live/cross-map evidence remain outstanding."} {"time":"2026-09-23T13:09:00Z","event":"test_run","id":"PORT-PLAN 2V2-e.5","result":"PASS","tests":["script/port_gate.sh macos: PASS (12 port tests; port.login_live skipped without MT_LIVE_*)","script/python_game_render_test.sh: PASS (4/4 native light0, finite camera matrix, 0.1 cm foot-ground difference, 559 terrain texture contrasts)","port_map.py check: 0 errors","git diff --check: PASS"],"reason":"The first sandboxed port gate run denied localhost sockets; loopback-enabled rerun passed. Full CMapOutdoor and live/cross-map evidence remain outstanding."}
{"time": "2026-09-23T14:45:00Z", "event": "port_round", "unit": "PORT-PLAN 2V3-a: player/input/event handler chain and Granny root motion", "ported": ["UserInterface/PythonPlayer.cpp", "UserInterface/PythonPlayerInput.cpp", "UserInterface/PythonPlayerInputKeyboard.cpp", "UserInterface/PythonPlayerInputMouse.cpp", "UserInterface/PythonPlayerEventHandler.cpp", "UserInterface/PythonPlayerSkill.cpp", "UserInterface/PythonPlayerModule.cpp", "UserInterface/GameType.cpp"], "adapted": ["GrannyUpdateModelMatrix constant-extraction root motion from TrackGroups[0] AccumulationFlags/LoopTranslation (libgr2)"], "divergent": ["VDA accumulation not implemented", "CPythonSkill/CItemData/CItemManager/CPythonItem callees remain pending stubs"], "needs_live": [], "tests": ["port.login_flow: DIK_UP walked 108 cm; fake server got CG_MOVE FUNC_MOVE then FUNC_WAIT at moved y", "port.login_live 192.168.21.203: PASS, walked 132 cm", "ctest all: PASS (login_live skipped without MT_LIVE_*)", "port_map.py check: 0 errors"], "todo": ["mouse click-to-move and attack", "CheckAdvancing/map attribute stubs", "delete legacy movement when default route switches to port"]}
@@ -0,0 +1,62 @@
{
"reference": "UserInterface/GameType.cpp",
"reference_sha256": "7b77d5e103ff1b8463227d8914ebc9fc8a7237c9a2aa254b15dbabcca492f218",
"priority": "P4",
"contracts": [],
"functions": {
"DefaultFont_Startup": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:DefaultFont_Startup"
]
},
"DefaultFont_Cleanup": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:DefaultFont_Cleanup"
]
},
"DefaultFont_SetName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:DefaultFont_SetName"
]
},
"ReloadDefaultFonts": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:ReloadDefaultFonts"
]
},
"DefaultFont_GetResource": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:DefaultFont_GetResource"
]
},
"DefaultItalicFont_GetResource": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:DefaultItalicFont_GetResource"
]
},
"SetGuildSymbolPath": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:SetGuildSymbolPath"
]
},
"GetGuildSymbolFileName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:GetGuildSymbolFileName"
]
},
"SlotTypeToInvenType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/GameType.cpp:SlotTypeToInvenType"
]
}
}
}
@@ -0,0 +1,848 @@
{
"reference": "UserInterface/PythonPlayer.cpp",
"reference_sha256": "6b831abcc6a4d767a9a100a66fc7682ec2508f65839c1dcaf6cfc3940e5f06ae",
"priority": "P0",
"contracts": [],
"functions": {
"CPythonPlayer::SPlayerStatus::SetPoint": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SPlayerStatus::SetPoint"
]
},
"CPythonPlayer::SPlayerStatus::GetPoint": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SPlayerStatus::GetPoint"
]
},
"CPythonPlayer::AffectIndexToSkillIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::AffectIndexToSkillIndex"
]
},
"CPythonPlayer::AffectIndexToSkillSlotIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::AffectIndexToSkillSlotIndex"
]
},
"CPythonPlayer::__GetPickedActorPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetPickedActorPtr"
]
},
"CPythonPlayer::__GetPickedActorID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetPickedActorID"
]
},
"CPythonPlayer::__GetPickedItemID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetPickedItemID"
]
},
"CPythonPlayer::__GetPickedGroundPos": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetPickedGroundPos"
]
},
"CPythonPlayer::NEW_GetMainActorPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NEW_GetMainActorPosition"
]
},
"CPythonPlayer::RegisterEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RegisterEffect"
]
},
"CPythonPlayer::NEW_ShowEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NEW_ShowEffect"
]
},
"CPythonPlayer::NEW_FindActorPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NEW_FindActorPtr"
]
},
"CPythonPlayer::NEW_GetMainActorPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NEW_GetMainActorPtr"
]
},
"CPythonPlayer::Update": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::Update"
]
},
"CPythonPlayer::__IsUsingChargeSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__IsUsingChargeSkill"
]
},
"CPythonPlayer::__Update_AutoAttack": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__Update_AutoAttack"
]
},
"CPythonPlayer::__Update_NotifyGuildAreaEvent": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__Update_NotifyGuildAreaEvent"
]
},
"CPythonPlayer::SetMainCharacterIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetMainCharacterIndex"
]
},
"CPythonPlayer::GetMainCharacterIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetMainCharacterIndex"
]
},
"CPythonPlayer::IsMainCharacterIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsMainCharacterIndex"
]
},
"CPythonPlayer::GetGuildID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetGuildID"
]
},
"CPythonPlayer::SetWeaponPower": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetWeaponPower"
]
},
"CPythonPlayer::SetRace": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetRace"
]
},
"CPythonPlayer::GetRace": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetRace"
]
},
"CPythonPlayer::__GetRaceStat": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetRaceStat"
]
},
"CPythonPlayer::__GetLevelAtk": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetLevelAtk"
]
},
"CPythonPlayer::__GetStatAtk": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetStatAtk"
]
},
"CPythonPlayer::__GetWeaponAtk": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetWeaponAtk"
]
},
"CPythonPlayer::__GetTotalAtk": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetTotalAtk"
]
},
"CPythonPlayer::__GetHitRate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetHitRate"
]
},
"CPythonPlayer::__GetEvadeRate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__GetEvadeRate"
]
},
"CPythonPlayer::__UpdateBattleStatus": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__UpdateBattleStatus"
]
},
"CPythonPlayer::SetStatus": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetStatus"
]
},
"CPythonPlayer::GetStatus": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetStatus"
]
},
"CPythonPlayer::GetName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetName"
]
},
"CPythonPlayer::SetName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetName"
]
},
"CPythonPlayer::NotifyDeletingCharacterInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NotifyDeletingCharacterInstance"
]
},
"CPythonPlayer::NotifyCharacterDead": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NotifyCharacterDead"
]
},
"CPythonPlayer::NotifyCharacterUpdate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NotifyCharacterUpdate"
]
},
"CPythonPlayer::NotifyDeadMainCharacter": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NotifyDeadMainCharacter"
]
},
"CPythonPlayer::NotifyChangePKMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NotifyChangePKMode"
]
},
"CPythonPlayer::MoveItemData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::MoveItemData"
]
},
"CPythonPlayer::GetItemData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetItemData"
]
},
"CPythonPlayer::SetItemData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetItemData"
]
},
"CPythonPlayer::GetItemIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetItemIndex"
]
},
"CPythonPlayer::GetItemFlags": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetItemFlags"
]
},
"CPythonPlayer::GetItemCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetItemCount"
]
},
"CPythonPlayer::GetItemCountByVnum": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetItemCountByVnum"
]
},
"CPythonPlayer::GetItemMetinSocket": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetItemMetinSocket"
]
},
"CPythonPlayer::GetItemAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetItemAttribute"
]
},
"CPythonPlayer::SetItemCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetItemCount"
]
},
"CPythonPlayer::SetItemMetinSocket": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetItemMetinSocket"
]
},
"CPythonPlayer::SetItemAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetItemAttribute"
]
},
"CPythonPlayer::GetQuickPage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetQuickPage"
]
},
"CPythonPlayer::SetQuickPage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetQuickPage"
]
},
"CPythonPlayer::LocalQuickSlotIndexToGlobalQuickSlotIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::LocalQuickSlotIndexToGlobalQuickSlotIndex"
]
},
"CPythonPlayer::GetGlobalQuickSlotData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetGlobalQuickSlotData"
]
},
"CPythonPlayer::GetLocalQuickSlotData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetLocalQuickSlotData"
]
},
"CPythonPlayer::__RefLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__RefLocalQuickSlot"
]
},
"CPythonPlayer::__RefGlobalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__RefGlobalQuickSlot"
]
},
"CPythonPlayer::RemoveQuickSlotByValue": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RemoveQuickSlotByValue"
]
},
"CPythonPlayer::IsItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsItem"
]
},
"CPythonPlayer::RequestMoveGlobalQuickSlotToLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RequestMoveGlobalQuickSlotToLocalQuickSlot"
]
},
"CPythonPlayer::RequestAddLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RequestAddLocalQuickSlot"
]
},
"CPythonPlayer::RequestAddToEmptyLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RequestAddToEmptyLocalQuickSlot"
]
},
"CPythonPlayer::RequestDeleteGlobalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RequestDeleteGlobalQuickSlot"
]
},
"CPythonPlayer::RequestUseLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RequestUseLocalQuickSlot"
]
},
"CPythonPlayer::AddQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::AddQuickSlot"
]
},
"CPythonPlayer::DeleteQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::DeleteQuickSlot"
]
},
"CPythonPlayer::MoveQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::MoveQuickSlot"
]
},
"CPythonPlayer::IsBeltInventorySlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsBeltInventorySlot"
]
},
"CPythonPlayer::IsInventorySlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsInventorySlot"
]
},
"CPythonPlayer::IsEquipmentSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsEquipmentSlot"
]
},
"CPythonPlayer::IsEquipItemInSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsEquipItemInSlot"
]
},
"CPythonPlayer::SetSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetSkill"
]
},
"CPythonPlayer::GetSkillIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillIndex"
]
},
"CPythonPlayer::GetSkillSlotIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillSlotIndex"
]
},
"CPythonPlayer::GetSkillGrade": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillGrade"
]
},
"CPythonPlayer::GetSkillLevel": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillLevel"
]
},
"CPythonPlayer::GetSkillCurrentEfficientPercentage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillCurrentEfficientPercentage"
]
},
"CPythonPlayer::GetSkillNextEfficientPercentage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillNextEfficientPercentage"
]
},
"CPythonPlayer::SetSkillLevel": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetSkillLevel"
]
},
"CPythonPlayer::SetSkillLevel_": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetSkillLevel_"
]
},
"CPythonPlayer::SetSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetSkillCoolTime"
]
},
"CPythonPlayer::EndSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::EndSkillCoolTime"
]
},
"CPythonPlayer::GetSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillCoolTime"
]
},
"CPythonPlayer::GetSkillElapsedCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetSkillElapsedCoolTime"
]
},
"CPythonPlayer::__ActivateSkillSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__ActivateSkillSlot"
]
},
"CPythonPlayer::__DeactivateSkillSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__DeactivateSkillSlot"
]
},
"CPythonPlayer::IsSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsSkillCoolTime"
]
},
"CPythonPlayer::IsSkillActive": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsSkillActive"
]
},
"CPythonPlayer::IsToggleSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsToggleSkill"
]
},
"CPythonPlayer::SetPlayTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetPlayTime"
]
},
"CPythonPlayer::GetPlayTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetPlayTime"
]
},
"CPythonPlayer::SendClickItemPacket": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SendClickItemPacket"
]
},
"CPythonPlayer::__SendClickActorPacket": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__SendClickActorPacket"
]
},
"CPythonPlayer::ActEmotion": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::ActEmotion"
]
},
"CPythonPlayer::StartEmotionProcess": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::StartEmotionProcess"
]
},
"CPythonPlayer::EndEmotionProcess": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::EndEmotionProcess"
]
},
"CPythonPlayer::__IsProcessingEmotion": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__IsProcessingEmotion"
]
},
"CPythonPlayer::SetDungeonDestinationPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetDungeonDestinationPosition"
]
},
"CPythonPlayer::AlarmHaveToGo": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::AlarmHaveToGo"
]
},
"CPythonPlayer::ExitParty": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::ExitParty"
]
},
"CPythonPlayer::AppendPartyMember": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::AppendPartyMember"
]
},
"CPythonPlayer::LinkPartyMember": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::LinkPartyMember"
]
},
"CPythonPlayer::UnlinkPartyMember": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::UnlinkPartyMember"
]
},
"CPythonPlayer::UpdatePartyMemberInfo": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::UpdatePartyMemberInfo"
]
},
"CPythonPlayer::UpdatePartyMemberAffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::UpdatePartyMemberAffect"
]
},
"CPythonPlayer::RemovePartyMember": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RemovePartyMember"
]
},
"CPythonPlayer::IsPartyMemberByVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsPartyMemberByVID"
]
},
"CPythonPlayer::IsPartyMemberByName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsPartyMemberByName"
]
},
"CPythonPlayer::GetPartyMemberPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetPartyMemberPtr"
]
},
"CPythonPlayer::PartyMemberPIDToVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::PartyMemberPIDToVID"
]
},
"CPythonPlayer::PartyMemberVIDToPID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::PartyMemberVIDToPID"
]
},
"CPythonPlayer::IsSamePartyMember": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsSamePartyMember"
]
},
"CPythonPlayer::RememberChallengeInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RememberChallengeInstance"
]
},
"CPythonPlayer::RememberRevengeInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RememberRevengeInstance"
]
},
"CPythonPlayer::RememberCantFightInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::RememberCantFightInstance"
]
},
"CPythonPlayer::ForgetInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::ForgetInstance"
]
},
"CPythonPlayer::IsChallengeInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsChallengeInstance"
]
},
"CPythonPlayer::IsRevengeInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsRevengeInstance"
]
},
"CPythonPlayer::IsCantFightInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsCantFightInstance"
]
},
"CPythonPlayer::OpenPrivateShop": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::OpenPrivateShop"
]
},
"CPythonPlayer::ClosePrivateShop": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::ClosePrivateShop"
]
},
"CPythonPlayer::IsOpenPrivateShop": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsOpenPrivateShop"
]
},
"CPythonPlayer::SetObserverMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetObserverMode"
]
},
"CPythonPlayer::IsObserverMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::IsObserverMode"
]
},
"CPythonPlayer::__ToggleCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__ToggleCoolTime"
]
},
"CPythonPlayer::__ToggleLevelLimit": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::__ToggleLevelLimit"
]
},
"CPythonPlayer::StartStaminaConsume": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::StartStaminaConsume"
]
},
"CPythonPlayer::StopStaminaConsume": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::StopStaminaConsume"
]
},
"CPythonPlayer::GetPKMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::GetPKMode"
]
},
"CPythonPlayer::SetMobileFlag": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetMobileFlag"
]
},
"CPythonPlayer::HasMobilePhoneNumber": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::HasMobilePhoneNumber"
]
},
"CPythonPlayer::SetGameWindow": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::SetGameWindow"
]
},
"CPythonPlayer::NEW_ClearSkillData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::NEW_ClearSkillData"
]
},
"CPythonPlayer::ClearSkillDict": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::ClearSkillDict"
]
},
"CPythonPlayer::Clear": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::Clear"
]
},
"CPythonPlayer::CPythonPlayer": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::CPythonPlayer"
]
},
"CPythonPlayer::~CPythonPlayer": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayer.cpp:CPythonPlayer::~CPythonPlayer"
]
}
}
}
@@ -7,77 +7,149 @@
], ],
"functions": { "functions": {
"CPythonPlayerEventHandler::GetSingleton": { "CPythonPlayerEventHandler::GetSingleton": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::GetSingleton"
]
}, },
"CPythonPlayerEventHandler::~CPythonPlayerEventHandler": { "CPythonPlayerEventHandler::~CPythonPlayerEventHandler": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::~CPythonPlayerEventHandler"
]
}, },
"CPythonPlayerEventHandler::OnClearAffects": { "CPythonPlayerEventHandler::OnClearAffects": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnClearAffects"
]
}, },
"CPythonPlayerEventHandler::OnSetAffect": { "CPythonPlayerEventHandler::OnSetAffect": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnSetAffect"
]
}, },
"CPythonPlayerEventHandler::OnResetAffect": { "CPythonPlayerEventHandler::OnResetAffect": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnResetAffect"
]
}, },
"CPythonPlayerEventHandler::OnSyncing": { "CPythonPlayerEventHandler::OnSyncing": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnSyncing"
]
}, },
"CPythonPlayerEventHandler::OnWaiting": { "CPythonPlayerEventHandler::OnWaiting": {
"status": "DIVERGENT", "status": "PORTED",
"note": "reference fires only inside CInstanceBase::Transform() while IsWalking() and this frame's displacement <=1.0 (InstanceBase.cpp:1922-1930), 100ms throttle vs m_kPPosPrevWaiting; not ported. The old idle-standing resend (_tick_on_waiting) was removed 2026-09-22." "note": "reference fires only inside CInstanceBase::Transform() while IsWalking() and this frame's displacement <=1.0 (InstanceBase.cpp:1922-1930), 100ms throttle vs m_kPPosPrevWaiting; not ported. The old idle-standing resend (_tick_on_waiting) was removed 2026-09-22.",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnWaiting"
]
}, },
"CPythonPlayerEventHandler::OnMoving": { "CPythonPlayerEventHandler::OnMoving": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnMoving"
]
}, },
"CPythonPlayerEventHandler::OnMove": { "CPythonPlayerEventHandler::OnMove": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnMove"
]
}, },
"CPythonPlayerEventHandler::OnStop": { "CPythonPlayerEventHandler::OnStop": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnStop"
]
}, },
"CPythonPlayerEventHandler::OnWarp": { "CPythonPlayerEventHandler::OnWarp": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnWarp"
]
}, },
"CPythonPlayerEventHandler::OnAttack": { "CPythonPlayerEventHandler::OnAttack": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnAttack"
]
}, },
"CPythonPlayerEventHandler::OnUseSkill": { "CPythonPlayerEventHandler::OnUseSkill": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnUseSkill"
]
}, },
"CPythonPlayerEventHandler::OnUpdate": { "CPythonPlayerEventHandler::OnUpdate": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnUpdate"
]
}, },
"CPythonPlayerEventHandler::OnChangeShape": { "CPythonPlayerEventHandler::OnChangeShape": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnChangeShape"
]
}, },
"CPythonPlayerEventHandler::OnHit": { "CPythonPlayerEventHandler::OnHit": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnHit"
]
}, },
"CPythonPlayerEventHandler::FlushVictimList": { "CPythonPlayerEventHandler::FlushVictimList": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::FlushVictimList"
]
}, },
"CPythonPlayerEventHandler::CPythonPlayerEventHandler": { "CPythonPlayerEventHandler::CPythonPlayerEventHandler": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CPythonPlayerEventHandler"
]
}, },
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnSetFlyTarget": { "CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnSetFlyTarget": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnSetFlyTarget"
]
}, },
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot": { "CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot"
]
}, },
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::Set": { "CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::Set": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::Set"
]
}, },
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget": { "CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget"
]
}, },
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtAnotherTarget": { "CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtAnotherTarget": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtAnotherTarget"
]
}, },
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget": { "CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget": {
"status": "TODO" "status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget"
]
} }
} }
} }
@@ -0,0 +1,302 @@
{
"reference": "UserInterface/PythonPlayerInput.cpp",
"reference_sha256": "a1967697f9d0b96bbcdaab5b73c9fc6473739e29281cd96d1d87d0a7af496ea8",
"priority": "P0",
"contracts": [],
"functions": {
"CPythonPlayer::__GetPickableDistance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetPickableDistance"
]
},
"CPythonPlayer::PickCloseMoney": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::PickCloseMoney"
]
},
"CPythonPlayer::PickCloseItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::PickCloseItem"
]
},
"CPythonPlayer::__IsTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsTarget"
]
},
"CPythonPlayer::__IsSameTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsSameTargetVID"
]
},
"CPythonPlayer::__GetTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetTargetVID"
]
},
"CPythonPlayer::GetTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::GetTargetVID"
]
},
"CPythonPlayer::__GetTargetActorPtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetTargetActorPtr"
]
},
"CPythonPlayer::__SetTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__SetTargetVID"
]
},
"CPythonPlayer::__ClearTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ClearTarget"
]
},
"CPythonPlayer::SetTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::SetTarget"
]
},
"CPythonPlayer::__ChangeTargetToPickedInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ChangeTargetToPickedInstance"
]
},
"CPythonPlayer::__GetSkillTargetInstancePtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetSkillTargetInstancePtr"
]
},
"CPythonPlayer::__GetDeadTargetInstancePtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetDeadTargetInstancePtr"
]
},
"CPythonPlayer::__GetAliveTargetInstancePtr": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__GetAliveTargetInstancePtr"
]
},
"CPythonPlayer::OpenCharacterMenu": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::OpenCharacterMenu"
]
},
"CPythonPlayer::__OnClickItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnClickItem"
]
},
"CPythonPlayer::__OnClickActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnClickActor"
]
},
"CPythonPlayer::__OnPressActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressActor"
]
},
"CPythonPlayer::__OnPressItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressItem"
]
},
"CPythonPlayer::__OnClickGround": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnClickGround"
]
},
"CPythonPlayer::SetMovableGroundDistance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::SetMovableGroundDistance"
]
},
"CPythonPlayer::__IsMovableGroundDistance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsMovableGroundDistance"
]
},
"CPythonPlayer::__OnPressGround": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressGround"
]
},
"CPythonPlayer::__OnPressScreen": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__OnPressScreen"
]
},
"CPythonPlayer::NEW_MoveToDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_MoveToDirection"
]
},
"CPythonPlayer::NEW_Stop": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_Stop"
]
},
"CPythonPlayer::NEW_CancelFishing": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_CancelFishing"
]
},
"CPythonPlayer::NEW_Fishing": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_Fishing"
]
},
"CPythonPlayer::NEW_Attack": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_Attack"
]
},
"CPythonPlayer::NEW_IsEmptyReservedDelayTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_IsEmptyReservedDelayTime"
]
},
"CPythonPlayer::NEW_SetAutoCameraRotationSpeed": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_SetAutoCameraRotationSpeed"
]
},
"CPythonPlayer::NEW_ResetCameraRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_ResetCameraRotation"
]
},
"CPythonPlayer::__CanShot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanShot"
]
},
"CPythonPlayer::__CanChangeTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanChangeTarget"
]
},
"CPythonPlayer::__CanMove": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanMove"
]
},
"CPythonPlayer::__CanAttack": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__CanAttack"
]
},
"CPythonPlayer::NEW_GetMultiKeyDirRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_GetMultiKeyDirRotation"
]
},
"CPythonPlayer::NEW_GetMouseDirRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::NEW_GetMouseDirRotation"
]
},
"CPythonPlayer::GetDegreeFromPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::GetDegreeFromPosition"
]
},
"CPythonPlayer::__ClearReservedAction": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ClearReservedAction"
]
},
"CPythonPlayer::__ReserveClickItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveClickItem"
]
},
"CPythonPlayer::__ReserveClickActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveClickActor"
]
},
"CPythonPlayer::__ReserveClickGround": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveClickGround"
]
},
"CPythonPlayer::__IsReservedUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__IsReservedUseSkill"
]
},
"CPythonPlayer::__ReserveUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveUseSkill"
]
},
"CPythonPlayer::__ClearAutoAttackTargetActorID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ClearAutoAttackTargetActorID"
]
},
"CPythonPlayer::__SetAutoAttackTargetActorID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__SetAutoAttackTargetActorID"
]
},
"CPythonPlayer::__ReserveProcess_ClickActor": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInput.cpp:CPythonPlayer::__ReserveProcess_ClickActor"
]
}
}
}
@@ -0,0 +1,38 @@
{
"reference": "UserInterface/PythonPlayerInputKeyboard.cpp",
"reference_sha256": "c559220298d2f50e1028f859dbbe110dea0fe776d0037b66b03916385ecf4e01",
"priority": "P0",
"contracts": [],
"functions": {
"CPythonPlayer::SetAttackKeyState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp:CPythonPlayer::SetAttackKeyState"
]
},
"CPythonPlayer::NEW_SetSingleDIKKeyState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp:CPythonPlayer::NEW_SetSingleDIKKeyState"
]
},
"CPythonPlayer::NEW_SetSingleDirKeyState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp:CPythonPlayer::NEW_SetSingleDirKeyState"
]
},
"CPythonPlayer::NEW_SetMultiDirKeyState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp:CPythonPlayer::NEW_SetMultiDirKeyState"
]
},
"CPythonPlayer::GetDegreeFromDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp:CPythonPlayer::GetDegreeFromDirection"
]
}
}
}
@@ -0,0 +1,92 @@
{
"reference": "UserInterface/PythonPlayerInputMouse.cpp",
"reference_sha256": "6c9476fe2d668e7fcf07c70f6da4e6c24141314cd1d944844785697f684c3bec",
"priority": "P0",
"contracts": [],
"functions": {
"CPythonPlayer::NEW_SetMouseMoveState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_SetMouseMoveState"
]
},
"CPythonPlayer::NEW_MoveToMouseScreenDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_MoveToMouseScreenDirection"
]
},
"CPythonPlayer::NEW_SetMouseCameraState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_SetMouseCameraState"
]
},
"CPythonPlayer::NEW_SetMouseSmartState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_SetMouseSmartState"
]
},
"CPythonPlayer::__OnPressSmart": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::__OnPressSmart"
]
},
"CPythonPlayer::__OnClickSmart": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::__OnClickSmart"
]
},
"CPythonPlayer::__ShowPickedEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::__ShowPickedEffect"
]
},
"CPythonPlayer::NEW_SetMouseFunc": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_SetMouseFunc"
]
},
"CPythonPlayer::NEW_GetMouseFunc": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_GetMouseFunc"
]
},
"CPythonPlayer::SetQuickCameraMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::SetQuickCameraMode"
]
},
"CPythonPlayer::NEW_SetMouseState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_SetMouseState"
]
},
"CPythonPlayer::NEW_SetMouseMiddleButtonState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_SetMouseMiddleButtonState"
]
},
"CPythonPlayer::NEW_RefreshMouseWalkingDirection": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::NEW_RefreshMouseWalkingDirection"
]
},
"CPythonPlayer::__IsRightButtonSkillMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerInputMouse.cpp:CPythonPlayer::__IsRightButtonSkillMode"
]
}
}
}
@@ -0,0 +1,800 @@
{
"reference": "UserInterface/PythonPlayerModule.cpp",
"reference_sha256": "15416546cb584c518de5b984a7dc6ca3f1af1a093b028e834edb7e9c087a1c63",
"priority": "P4",
"contracts": [],
"functions": {
"playerPickCloseItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerPickCloseItem"
]
},
"playerSetGameWindow": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetGameWindow"
]
},
"playerSetQuickCameraMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetQuickCameraMode"
]
},
"playerSetMainCharacterIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetMainCharacterIndex"
]
},
"playerGetMainCharacterIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetMainCharacterIndex"
]
},
"playerGetMainCharacterName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetMainCharacterName"
]
},
"playerGetMainCharacterPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetMainCharacterPosition"
]
},
"playerIsMainCharacterIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsMainCharacterIndex"
]
},
"playerCanAttackInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerCanAttackInstance"
]
},
"playerIsActingEmotion": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsActingEmotion"
]
},
"playerIsPVPInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsPVPInstance"
]
},
"playerIsSameEmpire": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsSameEmpire"
]
},
"playerIsChallengeInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsChallengeInstance"
]
},
"playerIsRevengeInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsRevengeInstance"
]
},
"playerIsCantFightInstance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsCantFightInstance"
]
},
"playerGetCharacterDistance": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetCharacterDistance"
]
},
"playerIsInSafeArea": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsInSafeArea"
]
},
"playerIsMountingHorse": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsMountingHorse"
]
},
"playerIsObserverMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsObserverMode"
]
},
"playerActEmotion": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerActEmotion"
]
},
"playerShowPlayer": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerShowPlayer"
]
},
"playerHidePlayer": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerHidePlayer"
]
},
"playerComboAttack": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerComboAttack"
]
},
"playerRegisterEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRegisterEffect"
]
},
"playerRegisterCacheEffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRegisterCacheEffect"
]
},
"playerSetAttackKeyState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetAttackKeyState"
]
},
"playerSetSingleDIKKeyState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetSingleDIKKeyState"
]
},
"playerEndKeyWalkingImmediately": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerEndKeyWalkingImmediately"
]
},
"playerStartMouseWalking": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerStartMouseWalking"
]
},
"playerEndMouseWalking": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerEndMouseWalking"
]
},
"playerResetCameraRotation": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerResetCameraRotation"
]
},
"playerSetAutoCameraRotationSpeed": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetAutoCameraRotationSpeed"
]
},
"playerSetMouseState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetMouseState"
]
},
"playerSetMouseFunc": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetMouseFunc"
]
},
"playerGetMouseFunc": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetMouseFunc"
]
},
"playerSetMouseMiddleButtonState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetMouseMiddleButtonState"
]
},
"playerGetName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetName"
]
},
"playerGetRace": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetRace"
]
},
"playerGetJob": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetJob"
]
},
"playerGetPlayTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetPlayTime"
]
},
"playerSetPlayTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetPlayTime"
]
},
"playerIsSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsSkillCoolTime"
]
},
"playerGetSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetSkillCoolTime"
]
},
"playerIsSkillActive": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsSkillActive"
]
},
"playerUseGuildSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerUseGuildSkill"
]
},
"playerAffectIndexToSkillIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerAffectIndexToSkillIndex"
]
},
"playerGetEXP": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetEXP"
]
},
"playerGetStatus": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetStatus"
]
},
"playerSetStatus": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetStatus"
]
},
"playerGetElk": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetElk"
]
},
"playerGetGuildID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetGuildID"
]
},
"playerGetGuildName": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetGuildName"
]
},
"playerGetAlignmentData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetAlignmentData"
]
},
"playerSetSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetSkill"
]
},
"playerGetSkillIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetSkillIndex"
]
},
"playerGetSkillSlotIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetSkillSlotIndex"
]
},
"playerGetSkillGrade": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetSkillGrade"
]
},
"playerGetSkillLevel": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetSkillLevel"
]
},
"playerGetSkillCurrentEfficientPercentage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetSkillCurrentEfficientPercentage"
]
},
"playerGetSkillNextEfficientPercentage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetSkillNextEfficientPercentage"
]
},
"playerClickSkillSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerClickSkillSlot"
]
},
"playerChangeCurrentSkillNumberOnly": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerChangeCurrentSkillNumberOnly"
]
},
"playerClearSkillDict": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerClearSkillDict"
]
},
"playerMoveItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerMoveItem"
]
},
"playerSendClickItemPacket": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSendClickItemPacket"
]
},
"playerGetItemIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemIndex"
]
},
"playerGetItemFlags": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemFlags"
]
},
"playerGetItemCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemCount"
]
},
"playerSetItemCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetItemCount"
]
},
"playerGetItemCountByVnum": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemCountByVnum"
]
},
"playerGetItemMetinSocket": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemMetinSocket"
]
},
"playerGetItemAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemAttribute"
]
},
"playerGetItemLink": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemLink"
]
},
"playerGetISellItemPrice": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetISellItemPrice"
]
},
"playerGetQuickPage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetQuickPage"
]
},
"playerSetQuickPage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetQuickPage"
]
},
"playerLocalQuickSlotIndexToGlobalQuickSlotIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerLocalQuickSlotIndexToGlobalQuickSlotIndex"
]
},
"playerGetLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetLocalQuickSlot"
]
},
"playerGetGlobalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetGlobalQuickSlot"
]
},
"playerRequestAddLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRequestAddLocalQuickSlot"
]
},
"playerRequestAddToEmptyLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRequestAddToEmptyLocalQuickSlot"
]
},
"playerRequestDeleteGlobalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRequestDeleteGlobalQuickSlot"
]
},
"playerRequestMoveGlobalQuickSlotToLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRequestMoveGlobalQuickSlotToLocalQuickSlot"
]
},
"playerRequestUseLocalQuickSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRequestUseLocalQuickSlot"
]
},
"playerRemoveQuickSlotByValue": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRemoveQuickSlotByValue"
]
},
"playerisItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerisItem"
]
},
"playerIsBeltInventorySlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsBeltInventorySlot"
]
},
"playerIsEquipmentSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsEquipmentSlot"
]
},
"playerIsDSEquipmentSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsDSEquipmentSlot"
]
},
"playerIsCostumeSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsCostumeSlot"
]
},
"playerIsOpenPrivateShop": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsOpenPrivateShop"
]
},
"playerIsValuableItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsValuableItem"
]
},
"GetItemGrade": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:GetItemGrade"
]
},
"playerGetItemGrade": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemGrade"
]
},
"playerGetItemUnbindTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetItemUnbindTime"
]
},
"playerCanRefine": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerCanRefine"
]
},
"playerCanAttachMetin": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerCanAttachMetin"
]
},
"playerCanDetach": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerCanDetach"
]
},
"playerCanUnlock": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerCanUnlock"
]
},
"playerIsRefineGradeScroll": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsRefineGradeScroll"
]
},
"playerUpdate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerUpdate"
]
},
"playerRender": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRender"
]
},
"playerClear": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerClear"
]
},
"playerClearTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerClearTarget"
]
},
"playerSetTarget": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetTarget"
]
},
"playerOpenCharacterMenu": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerOpenCharacterMenu"
]
},
"playerIsPartyMember": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsPartyMember"
]
},
"playerIsPartyLeader": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsPartyLeader"
]
},
"playerIsPartyLeaderByPID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsPartyLeaderByPID"
]
},
"playerGetPartyMemberHPPercentage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetPartyMemberHPPercentage"
]
},
"playerGetPartyMemberState": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetPartyMemberState"
]
},
"playerGetPartyMemberAffects": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetPartyMemberAffects"
]
},
"playerRemovePartyMember": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRemovePartyMember"
]
},
"playerExitParty": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerExitParty"
]
},
"playerGetPKMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetPKMode"
]
},
"playerHasMobilePhoneNumber": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerHasMobilePhoneNumber"
]
},
"playerSetWeaponAttackBonusFlag": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetWeaponAttackBonusFlag"
]
},
"playerToggleCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerToggleCoolTime"
]
},
"playerToggleLevelLimit": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerToggleLevelLimit"
]
},
"playerGetTargetVID": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetTargetVID"
]
},
"playerRegisterEmotionIcon": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerRegisterEmotionIcon"
]
},
"playerGetEmotionIconImage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetEmotionIconImage"
]
},
"playerSetItemData": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetItemData"
]
},
"playerSetItemMetinSocket": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetItemMetinSocket"
]
},
"playerSetItemAttribute": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetItemAttribute"
]
},
"playerSetAutoPotionInfo": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSetAutoPotionInfo"
]
},
"playerGetAutoPotionInfo": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerGetAutoPotionInfo"
]
},
"playerSlotTypeToInvenType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSlotTypeToInvenType"
]
},
"playerIsEquippingBelt": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsEquippingBelt"
]
},
"playerIsAvailableBeltInventoryCell": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerIsAvailableBeltInventoryCell"
]
},
"playerSendDragonSoulRefine": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:playerSendDragonSoulRefine"
]
},
"initPlayer": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerModule.cpp:initPlayer"
]
}
}
}
@@ -0,0 +1,158 @@
{
"reference": "UserInterface/PythonPlayerSkill.cpp",
"reference_sha256": "6d09ecca17f5b4be9fa67b1bfd9303b5b0a362f4c029b901631846bedc7b0587",
"priority": "P1",
"contracts": [],
"functions": {
"CPythonPlayer::ClearAffects": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::ClearAffects"
]
},
"CPythonPlayer::SetAffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::SetAffect"
]
},
"CPythonPlayer::ResetAffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::ResetAffect"
]
},
"CPythonPlayer::FindSkillSlotIndexBySkillIndex": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::FindSkillSlotIndexBySkillIndex"
]
},
"CPythonPlayer::ChangeCurrentSkillNumberOnly": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::ChangeCurrentSkillNumberOnly"
]
},
"CPythonPlayer::ClickSkillSlot": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::ClickSkillSlot"
]
},
"CPythonPlayer::__CheckSkillUsable": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CheckSkillUsable"
]
},
"CPythonPlayer::__CheckShortArrow": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CheckShortArrow"
]
},
"CPythonPlayer::__CheckShortMana": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CheckShortMana"
]
},
"CPythonPlayer::__CheckShortLife": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CheckShortLife"
]
},
"CPythonPlayer::__CheckRestSkillCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CheckRestSkillCoolTime"
]
},
"CPythonPlayer::__CheckDashAffect": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CheckDashAffect"
]
},
"CPythonPlayer::__UseCurrentSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__UseCurrentSkill"
]
},
"CPythonPlayer::__GetSkillTargetRange": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__GetSkillTargetRange"
]
},
"CPythonPlayer::__ProcessEnemySkillTargetRange": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__ProcessEnemySkillTargetRange"
]
},
"CPythonPlayer::__CanUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CanUseSkill"
]
},
"CPythonPlayer::__UseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__UseSkill"
]
},
"CPythonPlayer::__SendUseSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__SendUseSkill"
]
},
"CPythonPlayer::__GetSkillType": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__GetSkillType"
]
},
"CPythonPlayer::__RunCoolTime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__RunCoolTime"
]
},
"CPythonPlayer::__HasEnoughArrow": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__HasEnoughArrow"
]
},
"CPythonPlayer::__HasItem": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__HasItem"
]
},
"CPythonPlayer::UseGuildSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::UseGuildSkill"
]
},
"CPythonPlayer::SetComboSkillFlag": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::SetComboSkillFlag"
]
},
"CPythonPlayer::__CheckSpecialSkill": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonPlayerSkill.cpp:CPythonPlayer::__CheckSpecialSkill"
]
}
}
}
+1
View File
@@ -429,6 +429,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
4. **2V3 — 本地移动**:加入 `PythonPlayer`、`PythonPlayerInput*`、`PythonPlayerEventHandler`、 4. **2V3 — 本地移动**:加入 `PythonPlayer`、`PythonPlayerInput*`、`PythonPlayerEventHandler`、
`InstanceBaseMovement`、`ActorInstance{Motion,Event,Position,Rotation,CollisionDetection}` 的实际依赖闭包。验收为输入经过新路径 `InstanceBaseMovement`、`ActorInstance{Motion,Event,Position,Rotation,CollisionDetection}` 的实际依赖闭包。验收为输入经过新路径
改变位置/朝向、发送与 40250 相同的移动封包,并在离线边界测试和真服 smoke 中通过。接通时删除对应 legacy 玩法逻辑。 改变位置/朝向、发送与 40250 相同的移动封包,并在离线边界测试和真服 smoke 中通过。接通时删除对应 legacy 玩法逻辑。
2V3-a(2026-09-23):`PythonPlayer`、`PythonPlayerInput`/`InputKeyboard`/`InputMouse`、`PythonPlayerEventHandler`、`PythonPlayerSkill`、`PythonPlayerModule`、`GameType` 原样移植(port-map 标 PORTED),`GameplayModules.cpp` 的 `player` 桩删除,`initPlayer()` 按 40250 顺序在 `initchrmgr()` 后调用;`pending/UserInterface/{PythonPlayer,GameType}.cpp` 替身删除,其余被调方(`CPythonSkill`、`CItemData`、`CItemManager`、`CPythonItem` 等)进 `pending`。64 位修正:`playerGetEmotionIconImage` 用 `Py_BuildPointer`,`PyDict_Next` 用 `Py_ssize_t`。根运动:Granny 运行时的 `GrannyUpdateModelMatrix` 原为直通,按 TrackGroups[0] 的 `AccumulationFlags`(AccumulationExtracted)/`LoopTranslation`(libgr2 新读出,战士 run = (0,-300,0),同 .msa `Accumulation`)按控制器本地时钟推进与权重累加位移(Delta × ModelMatrix);VDA 抽取未实现。`port.login_flow` 按 DIK_UP 经 `game.GameWindow` → `player.SetSingleDIKKeyState` 行走 >100 cm,假服解析 CG 包,收到 `CG_MOVE` FUNC_MOVE 后 FUNC_WAIT 且坐标变化;`port.login_live` 2026-09-23 对 192.168.21.203 走 132 cm 通过。待办:鼠标点地移动/攻击、`CheckAdvancing` 与地图属性替身、legacy 移动逻辑随默认路由切到 `port` 删除。
每个切片都必须同时跑 legacy/port 双路回归;只有 2V3 稳定并把默认路由切到 `port` 后,才能删除总开关和剩余 legacy 宿主。 每个切片都必须同时跑 legacy/port 双路回归;只有 2V3 稳定并把默认路由切到 `port` 后,才能删除总开关和剩余 legacy 宿主。
@@ -1002,12 +1002,46 @@ void GrannyFreeCompletedModelControls(granny_model_instance const* ModelInstance
release_control(c); release_control(c);
} }
// PORT: Metin2 motions carry no root-motion accumulation, so the model matrix passes through. // PORT: GrannyUpdateModelMatrix reimplemented for constant-extraction root motion only (walk/run carry
void GrannyUpdateModelMatrix(granny_model_instance const*, granny_real32, granny_real32 const* ModelMatrix4x4, // AccumulationFlags=AccumulationExtracted + LoopTranslation, e.g. warrior run (0,-300,0) = .msa Accumulation).
granny_real32* DestMatrix4x4, bool) // Each live control contributes LoopTranslation over the local-clock span of the last SecondsElapsed,
// blended by control weight; Dest = Delta x ModelMatrix (row vectors). VDA extraction is not implemented.
void GrannyUpdateModelMatrix(granny_model_instance const* ModelInstance, granny_real32 SecondsElapsed,
granny_real32 const* ModelMatrix4x4, granny_real32* DestMatrix4x4, bool Inverse)
{ {
if (ModelMatrix4x4 && DestMatrix4x4 && ModelMatrix4x4 != DestMatrix4x4) if (!ModelMatrix4x4 || !DestMatrix4x4)
std::memmove(DestMatrix4x4, ModelMatrix4x4, sizeof(float) * 16); return;
float m[16];
std::memcpy(m, ModelMatrix4x4, sizeof(m));
float delta[3] = {0.0f, 0.0f, 0.0f}, total = 0.0f;
if (ModelInstance)
for (const granny_control* c : ModelInstance->controls)
{
const float w = control_weight(c);
const gr2::Animation* a = c->animation->src;
if (w <= 0.0f || !a || !(a->accumulation_flags & 1) || (a->accumulation_flags & 4))
continue;
const float dur = c->animation->pub.Duration;
float t1 = c->local_clock, t0 = t1 - SecondsElapsed * c->speed;
if (c->loop_count != 0)
{
const float end = dur * c->loop_count;
t0 = std::min(std::max(t0, 0.0f), end);
t1 = std::min(std::max(t1, 0.0f), end);
}
const float k = dur > 0.0f ? (t1 - t0) / dur : 0.0f;
for (int i = 0; i < 3; ++i)
delta[i] += w * k * a->loop_translation[i];
total += w;
}
if (total > 0.0f)
{
const float s = (Inverse ? -1.0f : 1.0f) / total;
for (int col = 0; col < 3; ++col)
m[12 + col] += s * (delta[0] * ModelMatrix4x4[col] + delta[1] * ModelMatrix4x4[4 + col] +
delta[2] * ModelMatrix4x4[8 + col]);
}
std::memcpy(DestMatrix4x4, m, sizeof(m));
} }
granny_control* GrannyPlayControlledAnimation(granny_real32 StartTime, granny_animation const* Animation, granny_model_instance* Model) granny_control* GrannyPlayControlledAnimation(granny_real32 StartTime, granny_animation const* Animation, granny_model_instance* Model)
@@ -7,14 +7,8 @@
#include "UserInterface/PythonBackground.h" #include "UserInterface/PythonBackground.h"
#include "EterLib/StateManager.h" #include "EterLib/StateManager.h"
#include "GameLib/MapOutdoor.h" #include "GameLib/MapOutdoor.h"
#include "UserInterface/PythonChat.h"
#include "UserInterface/PythonItem.h"
#include "GameLib/ItemManager.h"
#include "UserInterface/PythonCharacterManager.h"
#include "UserInterface/PythonNonPlayer.h"
#include "UserInterface/InstanceBase.h"
#include "GameLib/RaceManager.h"
#include "EffectLib/EffectManager.h" #include "EffectLib/EffectManager.h"
#include "UserInterface/PythonCharacterManager.h"
#include "UserInterface/PythonEventManager.h" #include "UserInterface/PythonEventManager.h"
#include "UserInterface/PythonNetworkStream.h" #include "UserInterface/PythonNetworkStream.h"
#include "GameLib/GameEventManager.h" #include "GameLib/GameEventManager.h"
@@ -25,10 +19,13 @@
#include "UserInterface/MarkManager.h" #include "UserInterface/MarkManager.h"
#include "UserInterface/PythonIME.h" #include "UserInterface/PythonIME.h"
#include "UserInterface/PythonApplication.h" #include "UserInterface/PythonApplication.h"
#include "UserInterface/PythonItem.h"
#include "GameLib/ItemManager.h"
#include "UserInterface/InstanceBase.h"
#include "UserInterface/AbstractApplication.h" #include "UserInterface/AbstractApplication.h"
#include "UserInterface/PythonMessenger.h" #include "UserInterface/PythonMessenger.h"
#include "UserInterface/PythonMiniMap.h" #include "UserInterface/PythonMiniMap.h"
#include "UserInterface/PythonPlayer.h" #include "UserInterface/PythonNonPlayer.h"
#include "EterLib/Profiler.h" #include "EterLib/Profiler.h"
#include "UserInterface/PythonQuest.h" #include "UserInterface/PythonQuest.h"
#include "UserInterface/PythonSafeBox.h" #include "UserInterface/PythonSafeBox.h"
@@ -36,6 +33,7 @@
#include "UserInterface/PythonSkill.h" #include "UserInterface/PythonSkill.h"
#include "EterBase/Poly/Poly.h" #include "EterBase/Poly/Poly.h"
#include "EterPack/EterPackManager.h" #include "EterPack/EterPackManager.h"
#include "UserInterface/PythonPlayer.h"
#include "UserInterface/PythonTextTail.h" #include "UserInterface/PythonTextTail.h"
// 40250 UserInterface/ServerStateCheckerModule.cpp // 40250 UserInterface/ServerStateCheckerModule.cpp
@@ -473,279 +471,6 @@ void AddStubConstants_nonplayer(PyObject* poModule)
PyModule_AddIntConstant(poModule, "KING", 5); PyModule_AddIntConstant(poModule, "KING", 5);
} }
// 40250 UserInterface/PythonPlayerModule.cpp
extern const DWORD c_iSkillIndex_Tongsol = 121;
extern const DWORD c_iSkillIndex_Combo = 122;
extern const DWORD c_iSkillIndex_Fishing = 123;
extern const DWORD c_iSkillIndex_Mining = 124;
extern const DWORD c_iSkillIndex_Making = 125;
extern const DWORD c_iSkillIndex_Language1 = 126;
extern const DWORD c_iSkillIndex_Language2 = 127;
extern const DWORD c_iSkillIndex_Language3 = 128;
extern const DWORD c_iSkillIndex_Polymorph = 129;
extern const DWORD c_iSkillIndex_Riding = 130;
extern const DWORD c_iSkillIndex_Summon = 131;
enum
{
EMOTION_CLAP = 1,
EMOTION_CHEERS_1,
EMOTION_CHEERS_2,
EMOTION_DANCE_1,
EMOTION_DANCE_2,
EMOTION_DANCE_3,
EMOTION_DANCE_4,
EMOTION_DANCE_5,
EMOTION_DANCE_6, // 강남스타일
EMOTION_CONGRATULATION,
EMOTION_FORGIVE,
EMOTION_ANGRY,
EMOTION_ATTRACTIVE,
EMOTION_SAD,
EMOTION_SHY,
EMOTION_CHEERUP,
EMOTION_BANTER,
EMOTION_JOY,
EMOTION_KISS = 51,
EMOTION_FRENCH_KISS,
EMOTION_SLAP,
};
enum
{
REFINE_SCROLL_TYPE_MAKE_SOCKET = 1,
REFINE_SCROLL_TYPE_UP_GRADE = 2,
};
enum
{
REFINE_CANT,
REFINE_OK,
REFINE_ALREADY_MAX_SOCKET_COUNT,
REFINE_NEED_MORE_GOOD_SCROLL,
REFINE_CANT_MAKE_SOCKET_ITEM,
REFINE_NOT_NEXT_GRADE_ITEM,
REFINE_CANT_REFINE_METIN_TO_EQUIPMENT,
REFINE_CANT_REFINE_ROD,
};
enum
{
ATTACH_METIN_CANT,
ATTACH_METIN_OK,
ATTACH_METIN_NOT_MATCHABLE_ITEM,
ATTACH_METIN_NO_MATCHABLE_SOCKET,
ATTACH_METIN_NOT_EXIST_GOLD_SOCKET,
ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT,
};
enum
{
DETACH_METIN_CANT,
DETACH_METIN_OK,
};
// 40250 UserInterface/PythonPlayerModule.cpp
void AddStubConstants_player(PyObject* poModule)
{
(void) poModule;
PyModule_AddIntConstant(poModule, "LEVEL", POINT_LEVEL);
PyModule_AddIntConstant(poModule, "VOICE", POINT_VOICE);
PyModule_AddIntConstant(poModule, "EXP", POINT_EXP);
PyModule_AddIntConstant(poModule, "NEXT_EXP", POINT_NEXT_EXP);
PyModule_AddIntConstant(poModule, "HP", POINT_HP);
PyModule_AddIntConstant(poModule, "MAX_HP", POINT_MAX_HP);
PyModule_AddIntConstant(poModule, "SP", POINT_SP);
PyModule_AddIntConstant(poModule, "MAX_SP", POINT_MAX_SP);
PyModule_AddIntConstant(poModule, "STAMINA", POINT_STAMINA);
PyModule_AddIntConstant(poModule, "MAX_STAMINA", POINT_MAX_STAMINA);
PyModule_AddIntConstant(poModule, "ELK", POINT_GOLD);
PyModule_AddIntConstant(poModule, "ST", POINT_ST);
PyModule_AddIntConstant(poModule, "HT", POINT_HT);
PyModule_AddIntConstant(poModule, "DX", POINT_DX);
PyModule_AddIntConstant(poModule, "IQ", POINT_IQ);
PyModule_AddIntConstant(poModule, "ATT_POWER", POINT_ATT_POWER);
PyModule_AddIntConstant(poModule, "ATT_MIN", POINT_MIN_ATK);
PyModule_AddIntConstant(poModule, "ATT_MAX", POINT_MAX_ATK);
PyModule_AddIntConstant(poModule, "MIN_MAGIC_WEP", POINT_MIN_MAGIC_WEP);
PyModule_AddIntConstant(poModule, "MAX_MAGIC_WEP", POINT_MAX_MAGIC_WEP);
PyModule_AddIntConstant(poModule, "ATT_SPEED", POINT_ATT_SPEED);
PyModule_AddIntConstant(poModule, "ATT_BONUS", POINT_ATT_GRADE_BONUS);
PyModule_AddIntConstant(poModule, "EVADE_RATE", POINT_EVADE_RATE);
PyModule_AddIntConstant(poModule, "MOVING_SPEED", POINT_MOV_SPEED);
PyModule_AddIntConstant(poModule, "DEF_GRADE", POINT_DEF_GRADE);
PyModule_AddIntConstant(poModule, "DEF_BONUS", POINT_DEF_GRADE_BONUS);
PyModule_AddIntConstant(poModule, "CASTING_SPEED", POINT_CASTING_SPEED);
PyModule_AddIntConstant(poModule, "MAG_ATT", POINT_MAGIC_ATT_GRADE);
PyModule_AddIntConstant(poModule, "MAG_DEF", POINT_MAGIC_DEF_GRADE);
PyModule_AddIntConstant(poModule, "EMPIRE_POINT", POINT_EMPIRE_POINT);
PyModule_AddIntConstant(poModule, "STAT", POINT_STAT);
PyModule_AddIntConstant(poModule, "SKILL_PASSIVE", POINT_SUB_SKILL);
PyModule_AddIntConstant(poModule, "SKILL_SUPPORT", POINT_SUB_SKILL);
PyModule_AddIntConstant(poModule, "SKILL_ACTIVE", POINT_SKILL);
PyModule_AddIntConstant(poModule, "SKILL_HORSE", POINT_HORSE_SKILL);
PyModule_AddIntConstant(poModule, "PLAYTIME", POINT_PLAYTIME);
PyModule_AddIntConstant(poModule, "BOW_DISTANCE", POINT_BOW_DISTANCE);
PyModule_AddIntConstant(poModule, "HP_RECOVERY", POINT_HP_RECOVERY);
PyModule_AddIntConstant(poModule, "SP_RECOVERY", POINT_SP_RECOVERY);
PyModule_AddIntConstant(poModule, "ATTACKER_BONUS", POINT_PARTY_ATT_GRADE);
PyModule_AddIntConstant(poModule, "MAX_NUM", POINT_MAX_NUM);
PyModule_AddIntConstant(poModule, "POINT_CRITICAL_PCT", POINT_CRITICAL_PCT);
PyModule_AddIntConstant(poModule, "POINT_PENETRATE_PCT", POINT_PENETRATE_PCT);
PyModule_AddIntConstant(poModule, "POINT_MALL_ATTBONUS", POINT_MALL_ATTBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_DEFBONUS", POINT_MALL_DEFBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_EXPBONUS", POINT_MALL_EXPBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_ITEMBONUS", POINT_MALL_ITEMBONUS);
PyModule_AddIntConstant(poModule, "POINT_MALL_GOLDBONUS", POINT_MALL_GOLDBONUS);
PyModule_AddIntConstant(poModule, "POINT_MAX_HP_PCT", POINT_MAX_HP_PCT);
PyModule_AddIntConstant(poModule, "POINT_MAX_SP_PCT", POINT_MAX_SP_PCT);
PyModule_AddIntConstant(poModule, "POINT_SKILL_DAMAGE_BONUS", POINT_SKILL_DAMAGE_BONUS);
PyModule_AddIntConstant(poModule, "POINT_NORMAL_HIT_DAMAGE_BONUS", POINT_NORMAL_HIT_DAMAGE_BONUS);
PyModule_AddIntConstant(poModule, "POINT_SKILL_DEFEND_BONUS", POINT_SKILL_DEFEND_BONUS);
PyModule_AddIntConstant(poModule, "POINT_NORMAL_HIT_DEFEND_BONUS", POINT_NORMAL_HIT_DEFEND_BONUS);
PyModule_AddIntConstant(poModule, "POINT_PC_BANG_EXP_BONUS", POINT_PC_BANG_EXP_BONUS);
PyModule_AddIntConstant(poModule, "POINT_PC_BANG_DROP_BONUS", POINT_PC_BANG_DROP_BONUS);
PyModule_AddIntConstant(poModule, "ENERGY", POINT_ENERGY);
PyModule_AddIntConstant(poModule, "ENERGY_END_TIME", POINT_ENERGY_END_TIME);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_NORMAL", CPythonPlayer::SKILL_NORMAL);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_MASTER", CPythonPlayer::SKILL_MASTER);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_GRAND_MASTER", CPythonPlayer::SKILL_GRAND_MASTER);
PyModule_AddIntConstant(poModule, "SKILL_GRADE_PERFECT_MASTER", CPythonPlayer::SKILL_PERFECT_MASTER);
PyModule_AddIntConstant(poModule, "CATEGORY_ACTIVE", CPythonPlayer::CATEGORY_ACTIVE);
PyModule_AddIntConstant(poModule, "CATEGORY_PASSIVE", CPythonPlayer::CATEGORY_PASSIVE);
PyModule_AddIntConstant(poModule, "INVENTORY_PAGE_SIZE", c_Inventory_Page_Size);
PyModule_AddIntConstant(poModule, "INVENTORY_PAGE_COUNT", c_Inventory_Page_Count);
PyModule_AddIntConstant(poModule, "INVENTORY_SLOT_COUNT", c_Inventory_Count);
PyModule_AddIntConstant(poModule, "EQUIPMENT_SLOT_START", c_Equipment_Start);
PyModule_AddIntConstant(poModule, "EQUIPMENT_PAGE_COUNT", c_Equipment_Count);
#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
PyModule_AddIntConstant(poModule, "NEW_EQUIPMENT_SLOT_START", c_New_Equipment_Start);
PyModule_AddIntConstant(poModule, "NEW_EQUIPMENT_SLOT_COUNT", c_New_Equipment_Count);
#endif
PyModule_AddIntConstant(poModule, "MBF_SKILL", CPythonPlayer::MBF_SKILL);
PyModule_AddIntConstant(poModule, "MBF_ATTACK", CPythonPlayer::MBF_ATTACK);
PyModule_AddIntConstant(poModule, "MBF_CAMERA", CPythonPlayer::MBF_CAMERA);
PyModule_AddIntConstant(poModule, "MBF_SMART", CPythonPlayer::MBF_SMART);
PyModule_AddIntConstant(poModule, "MBF_MOVE", CPythonPlayer::MBF_MOVE);
PyModule_AddIntConstant(poModule, "MBF_AUTO", CPythonPlayer::MBF_AUTO);
PyModule_AddIntConstant(poModule, "MBS_PRESS", CPythonPlayer::MBS_PRESS);
PyModule_AddIntConstant(poModule, "MBS_CLICK", CPythonPlayer::MBS_CLICK);
PyModule_AddIntConstant(poModule, "MBT_RIGHT", CPythonPlayer::MBT_RIGHT);
PyModule_AddIntConstant(poModule, "MBT_LEFT", CPythonPlayer::MBT_LEFT);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_NONE", SLOT_TYPE_NONE);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_INVENTORY", SLOT_TYPE_INVENTORY);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_SKILL", SLOT_TYPE_SKILL);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_SHOP", SLOT_TYPE_SHOP);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_EXCHANGE_OWNER", SLOT_TYPE_EXCHANGE_OWNER);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_EXCHANGE_TARGET", SLOT_TYPE_EXCHANGE_TARGET);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_QUICK_SLOT", SLOT_TYPE_QUICK_SLOT);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_SAFEBOX", SLOT_TYPE_SAFEBOX);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_PRIVATE_SHOP", SLOT_TYPE_PRIVATE_SHOP);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_MALL", SLOT_TYPE_MALL);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_EMOTION", SLOT_TYPE_EMOTION);
PyModule_AddIntConstant(poModule, "SLOT_TYPE_DRAGON_SOUL_INVENTORY", SLOT_TYPE_DRAGON_SOUL_INVENTORY);
PyModule_AddIntConstant(poModule, "RESERVED_WINDOW", RESERVED_WINDOW);
PyModule_AddIntConstant(poModule, "INVENTORY", INVENTORY);
PyModule_AddIntConstant(poModule, "EQUIPMENT", EQUIPMENT);
PyModule_AddIntConstant(poModule, "SAFEBOX", SAFEBOX);
PyModule_AddIntConstant(poModule, "MALL", MALL);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_INVENTORY", DRAGON_SOUL_INVENTORY);
PyModule_AddIntConstant(poModule, "GROUND", GROUND);
PyModule_AddIntConstant(poModule, "ITEM_MONEY", -1);
PyModule_AddIntConstant(poModule, "SKILL_SLOT_COUNT", SKILL_MAX_NUM);
PyModule_AddIntConstant(poModule, "EFFECT_PICK", CPythonPlayer::EFFECT_PICK);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_TYPE_NONE", CPythonPlayer::METIN_SOCKET_TYPE_NONE);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_TYPE_SILVER", CPythonPlayer::METIN_SOCKET_TYPE_SILVER);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_TYPE_GOLD", CPythonPlayer::METIN_SOCKET_TYPE_GOLD);
PyModule_AddIntConstant(poModule, "METIN_SOCKET_MAX_NUM", ITEM_SOCKET_SLOT_MAX_NUM);
PyModule_AddIntConstant(poModule, "ATTRIBUTE_SLOT_MAX_NUM", ITEM_ATTRIBUTE_SLOT_MAX_NUM);
PyModule_AddIntConstant(poModule, "REFINE_CANT", REFINE_CANT);
PyModule_AddIntConstant(poModule, "REFINE_OK", REFINE_OK);
PyModule_AddIntConstant(poModule, "REFINE_ALREADY_MAX_SOCKET_COUNT", REFINE_ALREADY_MAX_SOCKET_COUNT);
PyModule_AddIntConstant(poModule, "REFINE_NEED_MORE_GOOD_SCROLL", REFINE_NEED_MORE_GOOD_SCROLL);
PyModule_AddIntConstant(poModule, "REFINE_CANT_MAKE_SOCKET_ITEM", REFINE_CANT_MAKE_SOCKET_ITEM);
PyModule_AddIntConstant(poModule, "REFINE_NOT_NEXT_GRADE_ITEM", REFINE_NOT_NEXT_GRADE_ITEM);
PyModule_AddIntConstant(poModule, "REFINE_CANT_REFINE_METIN_TO_EQUIPMENT", REFINE_CANT_REFINE_METIN_TO_EQUIPMENT);
PyModule_AddIntConstant(poModule, "REFINE_CANT_REFINE_ROD", REFINE_CANT_REFINE_ROD);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_CANT", ATTACH_METIN_CANT);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_OK", ATTACH_METIN_OK);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_NOT_MATCHABLE_ITEM", ATTACH_METIN_NOT_MATCHABLE_ITEM);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_NO_MATCHABLE_SOCKET", ATTACH_METIN_NO_MATCHABLE_SOCKET);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_NOT_EXIST_GOLD_SOCKET", ATTACH_METIN_NOT_EXIST_GOLD_SOCKET);
PyModule_AddIntConstant(poModule, "ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT", ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT);
PyModule_AddIntConstant(poModule, "DETACH_METIN_CANT", DETACH_METIN_CANT);
PyModule_AddIntConstant(poModule, "DETACH_METIN_OK", DETACH_METIN_OK);
PyModule_AddIntConstant(poModule, "PARTY_STATE_NORMAL", CPythonPlayer::PARTY_ROLE_NORMAL);
PyModule_AddIntConstant(poModule, "PARTY_STATE_LEADER", CPythonPlayer::PARTY_ROLE_LEADER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_ATTACKER", CPythonPlayer::PARTY_ROLE_ATTACKER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_TANKER", CPythonPlayer::PARTY_ROLE_TANKER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_BUFFER", CPythonPlayer::PARTY_ROLE_BUFFER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_SKILL_MASTER", CPythonPlayer::PARTY_ROLE_SKILL_MASTER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_BERSERKER", CPythonPlayer::PARTY_ROLE_BERSERKER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_DEFENDER", CPythonPlayer::PARTY_ROLE_DEFENDER);
PyModule_AddIntConstant(poModule, "PARTY_STATE_MAX_NUM", CPythonPlayer::PARTY_ROLE_MAX_NUM);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_TONGSOL", c_iSkillIndex_Tongsol);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_FISHING", c_iSkillIndex_Fishing);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_MINING", c_iSkillIndex_Mining);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_MAKING", c_iSkillIndex_Making);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_COMBO", c_iSkillIndex_Combo);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_LANGUAGE1", c_iSkillIndex_Language1);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_LANGUAGE2", c_iSkillIndex_Language2);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_LANGUAGE3", c_iSkillIndex_Language3);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_POLYMORPH", c_iSkillIndex_Polymorph);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_RIDING", c_iSkillIndex_Riding);
PyModule_AddIntConstant(poModule, "SKILL_INDEX_SUMMON", c_iSkillIndex_Summon);
PyModule_AddIntConstant(poModule, "PK_MODE_PEACE", PK_MODE_PEACE);
PyModule_AddIntConstant(poModule, "PK_MODE_REVENGE", PK_MODE_REVENGE);
PyModule_AddIntConstant(poModule, "PK_MODE_FREE", PK_MODE_FREE);
PyModule_AddIntConstant(poModule, "PK_MODE_PROTECT", PK_MODE_PROTECT);
PyModule_AddIntConstant(poModule, "PK_MODE_GUILD", PK_MODE_GUILD);
PyModule_AddIntConstant(poModule, "PK_MODE_MAX_NUM", PK_MODE_MAX_NUM);
PyModule_AddIntConstant(poModule, "BLOCK_EXCHANGE", BLOCK_EXCHANGE);
PyModule_AddIntConstant(poModule, "BLOCK_PARTY", BLOCK_PARTY_INVITE);
PyModule_AddIntConstant(poModule, "BLOCK_GUILD", BLOCK_GUILD_INVITE);
PyModule_AddIntConstant(poModule, "BLOCK_WHISPER", BLOCK_WHISPER);
PyModule_AddIntConstant(poModule, "BLOCK_FRIEND", BLOCK_MESSENGER_INVITE);
PyModule_AddIntConstant(poModule, "BLOCK_PARTY_REQUEST", BLOCK_PARTY_REQUEST);
PyModule_AddIntConstant(poModule, "PARTY_EXP_NON_DISTRIBUTION", PARTY_EXP_DISTRIBUTION_NON_PARITY);
PyModule_AddIntConstant(poModule, "PARTY_EXP_DISTRIBUTION_PARITY", PARTY_EXP_DISTRIBUTION_PARITY);
PyModule_AddIntConstant(poModule, "EMOTION_CLAP", EMOTION_CLAP);
PyModule_AddIntConstant(poModule, "EMOTION_CHEERS_1", EMOTION_CHEERS_1);
PyModule_AddIntConstant(poModule, "EMOTION_CHEERS_2", EMOTION_CHEERS_2);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_1", EMOTION_DANCE_1);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_2", EMOTION_DANCE_2);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_3", EMOTION_DANCE_3);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_4", EMOTION_DANCE_4);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_5", EMOTION_DANCE_5);
PyModule_AddIntConstant(poModule, "EMOTION_DANCE_6", EMOTION_DANCE_6); // PSY 강남스타일
PyModule_AddIntConstant(poModule, "EMOTION_CONGRATULATION", EMOTION_CONGRATULATION);
PyModule_AddIntConstant(poModule, "EMOTION_FORGIVE", EMOTION_FORGIVE);
PyModule_AddIntConstant(poModule, "EMOTION_ANGRY", EMOTION_ANGRY);
PyModule_AddIntConstant(poModule, "EMOTION_ATTRACTIVE", EMOTION_ATTRACTIVE);
PyModule_AddIntConstant(poModule, "EMOTION_SAD", EMOTION_SAD);
PyModule_AddIntConstant(poModule, "EMOTION_SHY", EMOTION_SHY);
PyModule_AddIntConstant(poModule, "EMOTION_CHEERUP", EMOTION_CHEERUP);
PyModule_AddIntConstant(poModule, "EMOTION_BANTER", EMOTION_BANTER);
PyModule_AddIntConstant(poModule, "EMOTION_JOY", EMOTION_JOY);
PyModule_AddIntConstant(poModule, "EMOTION_KISS", EMOTION_KISS);
PyModule_AddIntConstant(poModule, "EMOTION_FRENCH_KISS", EMOTION_FRENCH_KISS);
PyModule_AddIntConstant(poModule, "EMOTION_SLAP", EMOTION_SLAP);
PyModule_AddIntConstant(poModule, "AUTO_POTION_TYPE_HP", CPythonPlayer::AUTO_POTION_TYPE_HP);
PyModule_AddIntConstant(poModule, "AUTO_POTION_TYPE_SP", CPythonPlayer::AUTO_POTION_TYPE_SP);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_PAGE_SIZE", c_DragonSoul_Inventory_Box_Size);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_PAGE_COUNT", DRAGON_SOUL_GRADE_MAX);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_SLOT_COUNT", c_DragonSoul_Inventory_Count);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_EQUIPMENT_SLOT_START", c_DragonSoul_Equip_Start);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_EQUIPMENT_PAGE_COUNT", DS_DECK_MAX_NUM);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_EQUIPMENT_FIRST_SIZE", c_DragonSoul_Equip_Slot_Max);
PyModule_AddIntConstant(poModule, "DRAGON_SOUL_REFINE_CLOSE", DS_SUB_HEADER_CLOSE);
PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_DO_UPGRADE", DS_SUB_HEADER_DO_UPGRADE);
PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_DO_IMPROVEMENT", DS_SUB_HEADER_DO_IMPROVEMENT);
PyModule_AddIntConstant(poModule, "DS_SUB_HEADER_DO_REFINE", DS_SUB_HEADER_DO_REFINE);
}
// 40250 UserInterface/PythonProfilerModule.cpp // 40250 UserInterface/PythonProfilerModule.cpp
void AddStubConstants_profiler(PyObject* poModule) void AddStubConstants_profiler(PyObject* poModule)
{ {
@@ -18,7 +18,6 @@ void AddStubConstants_item(PyObject* poModule);
void AddStubConstants_messenger(PyObject* poModule); void AddStubConstants_messenger(PyObject* poModule);
void AddStubConstants_miniMap(PyObject* poModule); void AddStubConstants_miniMap(PyObject* poModule);
void AddStubConstants_nonplayer(PyObject* poModule); void AddStubConstants_nonplayer(PyObject* poModule);
void AddStubConstants_player(PyObject* poModule);
void AddStubConstants_profiler(PyObject* poModule); void AddStubConstants_profiler(PyObject* poModule);
void AddStubConstants_quest(PyObject* poModule); void AddStubConstants_quest(PyObject* poModule);
void AddStubConstants_safebox(PyObject* poModule); void AddStubConstants_safebox(PyObject* poModule);
@@ -579,272 +578,6 @@ PyMethodDef methods_nonplayer[] = {
{ "LoadNonPlayerData", stub_nonplayer_LoadNonPlayerData, METH_VARARGS }, { "LoadNonPlayerData", stub_nonplayer_LoadNonPlayerData, METH_VARARGS },
{ NULL, NULL } { NULL, NULL }
}; };
// 40250 UserInterface/PythonPlayerModule.cpp: player export names.
PyObject* stub_player_GetAutoPotionInfo(PyObject*, PyObject*) { return stub_call_named("player.GetAutoPotionInfo", Py_BuildValue("biii", 0, 0, 0, 0)); }
PyObject* stub_player_SetAutoPotionInfo(PyObject*, PyObject*) { return stub_call_named("player.SetAutoPotionInfo", Py_BuildNone()); }
PyObject* stub_player_PickCloseItem(PyObject*, PyObject*) { return stub_call_named("player.PickCloseItem", Py_BuildNone()); }
PyObject* stub_player_SetGameWindow(PyObject*, PyObject*) { return stub_call_named("player.SetGameWindow", Py_BuildNone()); }
PyObject* stub_player_RegisterEffect(PyObject*, PyObject*) { return stub_call_named("player.RegisterEffect", Py_BuildNone()); }
PyObject* stub_player_RegisterCacheEffect(PyObject*, PyObject*) { return stub_call_named("player.RegisterCacheEffect", Py_BuildNone()); }
PyObject* stub_player_SetMouseState(PyObject*, PyObject*) { return stub_call_named("player.SetMouseState", Py_BuildNone()); }
PyObject* stub_player_SetMouseFunc(PyObject*, PyObject*) { return stub_call_named("player.SetMouseFunc", Py_BuildNone()); }
PyObject* stub_player_GetMouseFunc(PyObject*, PyObject*) { return stub_call_named("player.GetMouseFunc", Py_BuildValue("i", 0)); }
PyObject* stub_player_SetMouseMiddleButtonState(PyObject*, PyObject*) { return stub_call_named("player.SetMouseMiddleButtonState", Py_BuildNone()); }
PyObject* stub_player_SetMainCharacterIndex(PyObject*, PyObject*) { return stub_call_named("player.SetMainCharacterIndex", Py_BuildNone()); }
PyObject* stub_player_GetMainCharacterIndex(PyObject*, PyObject*) { return stub_call_named("player.GetMainCharacterIndex", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetMainCharacterName(PyObject*, PyObject*) { return stub_call_named("player.GetMainCharacterName", Py_BuildValue("s", "")); }
PyObject* stub_player_GetMainCharacterPosition(PyObject*, PyObject*) { return stub_call_named("player.GetMainCharacterPosition", Py_BuildValue("fff", 0.0, 0.0, 0.0)); }
PyObject* stub_player_IsMainCharacterIndex(PyObject*, PyObject*) { return stub_call_named("player.IsMainCharacterIndex", Py_BuildValue("i", 0)); }
PyObject* stub_player_CanAttackInstance(PyObject*, PyObject*) { return stub_call_named("player.CanAttackInstance", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsActingEmotion(PyObject*, PyObject*) { return stub_call_named("player.IsActingEmotion", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsPVPInstance(PyObject*, PyObject*) { return stub_call_named("player.IsPVPInstance", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsSameEmpire(PyObject*, PyObject*) { return stub_call_named("player.IsSameEmpire", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsChallengeInstance(PyObject*, PyObject*) { return stub_call_named("player.IsChallengeInstance", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsRevengeInstance(PyObject*, PyObject*) { return stub_call_named("player.IsRevengeInstance", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsCantFightInstance(PyObject*, PyObject*) { return stub_call_named("player.IsCantFightInstance", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetCharacterDistance(PyObject*, PyObject*) { return stub_call_named("player.GetCharacterDistance", Py_BuildValue("f", 0.0)); }
PyObject* stub_player_IsInSafeArea(PyObject*, PyObject*) { return stub_call_named("player.IsInSafeArea", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsMountingHorse(PyObject*, PyObject*) { return stub_call_named("player.IsMountingHorse", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsObserverMode(PyObject*, PyObject*) { return stub_call_named("player.IsObserverMode", Py_BuildValue("i", 0)); }
PyObject* stub_player_ActEmotion(PyObject*, PyObject*) { return stub_call_named("player.ActEmotion", Py_BuildNone()); }
PyObject* stub_player_ShowPlayer(PyObject*, PyObject*) { return stub_call_named("player.ShowPlayer", Py_BuildNone()); }
PyObject* stub_player_HidePlayer(PyObject*, PyObject*) { return stub_call_named("player.HidePlayer", Py_BuildNone()); }
PyObject* stub_player_ComboAttack(PyObject*, PyObject*) { return stub_call_named("player.ComboAttack", Py_BuildNone()); }
PyObject* stub_player_SetAutoCameraRotationSpeed(PyObject*, PyObject*) { return stub_call_named("player.SetAutoCameraRotationSpeed", Py_BuildNone()); }
PyObject* stub_player_SetAttackKeyState(PyObject*, PyObject*) { return stub_call_named("player.SetAttackKeyState", Py_BuildNone()); }
PyObject* stub_player_SetSingleDIKKeyState(PyObject*, PyObject*) { return stub_call_named("player.SetSingleDIKKeyState", Py_BuildNone()); }
PyObject* stub_player_EndKeyWalkingImmediately(PyObject*, PyObject*) { return stub_call_named("player.EndKeyWalkingImmediately", Py_BuildNone()); }
PyObject* stub_player_StartMouseWalking(PyObject*, PyObject*) { return stub_call_named("player.StartMouseWalking", Py_BuildNone()); }
PyObject* stub_player_EndMouseWalking(PyObject*, PyObject*) { return stub_call_named("player.EndMouseWalking", Py_BuildNone()); }
PyObject* stub_player_ResetCameraRotation(PyObject*, PyObject*) { return stub_call_named("player.ResetCameraRotation", Py_BuildNone()); }
PyObject* stub_player_SetQuickCameraMode(PyObject*, PyObject*) { return stub_call_named("player.SetQuickCameraMode", Py_BuildNone()); }
PyObject* stub_player_SetSkill(PyObject*, PyObject*) { return stub_call_named("player.SetSkill", Py_BuildNone()); }
PyObject* stub_player_GetSkillIndex(PyObject*, PyObject*) { return stub_call_named("player.GetSkillIndex", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetSkillSlotIndex(PyObject*, PyObject*) { return stub_call_named("player.GetSkillSlotIndex", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetSkillGrade(PyObject*, PyObject*) { return stub_call_named("player.GetSkillGrade", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetSkillLevel(PyObject*, PyObject*) { return stub_call_named("player.GetSkillLevel", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetSkillCurrentEfficientPercentage(PyObject*, PyObject*) { return stub_call_named("player.GetSkillCurrentEfficientPercentage", Py_BuildValue("f", 0.0)); }
PyObject* stub_player_GetSkillNextEfficientPercentage(PyObject*, PyObject*) { return stub_call_named("player.GetSkillNextEfficientPercentage", Py_BuildValue("f", 0.0)); }
PyObject* stub_player_ClickSkillSlot(PyObject*, PyObject*) { return stub_call_named("player.ClickSkillSlot", Py_BuildNone()); }
PyObject* stub_player_ChangeCurrentSkillNumberOnly(PyObject*, PyObject*) { return stub_call_named("player.ChangeCurrentSkillNumberOnly", Py_BuildNone()); }
PyObject* stub_player_ClearSkillDict(PyObject*, PyObject*) { return stub_call_named("player.ClearSkillDict", Py_BuildNone()); }
PyObject* stub_player_GetItemIndex(PyObject*, PyObject*) { return stub_call_named("player.GetItemIndex", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetItemFlags(PyObject*, PyObject*) { return stub_call_named("player.GetItemFlags", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetItemCount(PyObject*, PyObject*) { return stub_call_named("player.GetItemCount", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetItemCountByVnum(PyObject*, PyObject*) { return stub_call_named("player.GetItemCountByVnum", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetItemMetinSocket(PyObject*, PyObject*) { return stub_call_named("player.GetItemMetinSocket", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetItemAttribute(PyObject*, PyObject*) { return stub_call_named("player.GetItemAttribute", Py_BuildValue("ii", 0, 0)); }
PyObject* stub_player_GetItemUnbindTime(PyObject*, PyObject*) { return stub_call_named("player.GetItemUnbindTime", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetISellItemPrice(PyObject*, PyObject*) { return stub_call_named("player.GetISellItemPrice", Py_BuildValue("i", 0)); }
PyObject* stub_player_MoveItem(PyObject*, PyObject*) { return stub_call_named("player.MoveItem", Py_BuildNone()); }
PyObject* stub_player_SendClickItemPacket(PyObject*, PyObject*) { return stub_call_named("player.SendClickItemPacket", Py_BuildNone()); }
PyObject* stub_player_GetName(PyObject*, PyObject*) { return stub_call_named("player.GetName", Py_BuildValue("s", "")); }
PyObject* stub_player_GetJob(PyObject*, PyObject*) { return stub_call_named("player.GetJob", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetRace(PyObject*, PyObject*) { return stub_call_named("player.GetRace", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetPlayTime(PyObject*, PyObject*) { return stub_call_named("player.GetPlayTime", Py_BuildValue("i", 0)); }
PyObject* stub_player_SetPlayTime(PyObject*, PyObject*) { return stub_call_named("player.SetPlayTime", Py_BuildNone()); }
PyObject* stub_player_IsSkillCoolTime(PyObject*, PyObject*) { return stub_call_named("player.IsSkillCoolTime", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetSkillCoolTime(PyObject*, PyObject*) { return stub_call_named("player.GetSkillCoolTime", Py_BuildValue("ff", 0.0, 0.0)); }
PyObject* stub_player_IsSkillActive(PyObject*, PyObject*) { return stub_call_named("player.IsSkillActive", Py_BuildValue("i", 0)); }
PyObject* stub_player_UseGuildSkill(PyObject*, PyObject*) { return stub_call_named("player.UseGuildSkill", Py_BuildNone()); }
PyObject* stub_player_AffectIndexToSkillIndex(PyObject*, PyObject*) { return stub_call_named("player.AffectIndexToSkillIndex", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetEXP(PyObject*, PyObject*) { return stub_call_named("player.GetEXP", Py_BuildValue("l", 0L)); }
PyObject* stub_player_GetStatus(PyObject*, PyObject*) { return stub_call_named("player.GetStatus", Py_BuildValue("i", 0)); }
PyObject* stub_player_SetStatus(PyObject*, PyObject*) { return stub_call_named("player.SetStatus", Py_BuildNone()); }
PyObject* stub_player_GetElk(PyObject*, PyObject*) { return stub_call_named("player.GetElk", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetMoney(PyObject*, PyObject*) { return stub_call_named("player.GetMoney", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetGuildID(PyObject*, PyObject*) { return stub_call_named("player.GetGuildID", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetGuildName(PyObject*, PyObject*) { return stub_call_named("player.GetGuildName", Py_BuildValue("s", "")); }
PyObject* stub_player_GetAlignmentData(PyObject*, PyObject*) { return stub_call_named("player.GetAlignmentData", Py_BuildValue("ii", 0, 0)); }
PyObject* stub_player_RequestAddLocalQuickSlot(PyObject*, PyObject*) { return stub_call_named("player.RequestAddLocalQuickSlot", Py_BuildNone()); }
PyObject* stub_player_RequestAddToEmptyLocalQuickSlot(PyObject*, PyObject*) { return stub_call_named("player.RequestAddToEmptyLocalQuickSlot", Py_BuildNone()); }
PyObject* stub_player_RequestDeleteGlobalQuickSlot(PyObject*, PyObject*) { return stub_call_named("player.RequestDeleteGlobalQuickSlot", Py_BuildNone()); }
PyObject* stub_player_RequestMoveGlobalQuickSlotToLocalQuickSlot(PyObject*, PyObject*) { return stub_call_named("player.RequestMoveGlobalQuickSlotToLocalQuickSlot", Py_BuildNone()); }
PyObject* stub_player_RequestUseLocalQuickSlot(PyObject*, PyObject*) { return stub_call_named("player.RequestUseLocalQuickSlot", Py_BuildNone()); }
PyObject* stub_player_LocalQuickSlotIndexToGlobalQuickSlotIndex(PyObject*, PyObject*) { return stub_call_named("player.LocalQuickSlotIndexToGlobalQuickSlotIndex", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetQuickPage(PyObject*, PyObject*) { return stub_call_named("player.GetQuickPage", Py_BuildValue("i", 0)); }
PyObject* stub_player_SetQuickPage(PyObject*, PyObject*) { return stub_call_named("player.SetQuickPage", Py_BuildNone()); }
PyObject* stub_player_GetLocalQuickSlot(PyObject*, PyObject*) { return stub_call_named("player.GetLocalQuickSlot", Py_BuildValue("ii", 0, 0)); }
PyObject* stub_player_GetGlobalQuickSlot(PyObject*, PyObject*) { return stub_call_named("player.GetGlobalQuickSlot", Py_BuildValue("ii", 0, 0)); }
PyObject* stub_player_RemoveQuickSlotByValue(PyObject*, PyObject*) { return stub_call_named("player.RemoveQuickSlotByValue", Py_BuildNone()); }
PyObject* stub_player_isItem(PyObject*, PyObject*) { return stub_call_named("player.isItem", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsEquipmentSlot(PyObject*, PyObject*) { return stub_call_named("player.IsEquipmentSlot", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsDSEquipmentSlot(PyObject*, PyObject*) { return stub_call_named("player.IsDSEquipmentSlot", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsCostumeSlot(PyObject*, PyObject*) { return stub_call_named("player.IsCostumeSlot", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsValuableItem(PyObject*, PyObject*) { return stub_call_named("player.IsValuableItem", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsOpenPrivateShop(PyObject*, PyObject*) { return stub_call_named("player.IsOpenPrivateShop", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsBeltInventorySlot(PyObject*, PyObject*) { return stub_call_named("player.IsBeltInventorySlot", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsEquippingBelt(PyObject*, PyObject*) { return stub_call_named("player.IsEquippingBelt", Py_BuildValue("b", 0)); }
PyObject* stub_player_IsAvailableBeltInventoryCell(PyObject*, PyObject*) { return stub_call_named("player.IsAvailableBeltInventoryCell", Py_BuildValue("b", 0)); }
PyObject* stub_player_GetItemGrade(PyObject*, PyObject*) { return stub_call_named("player.GetItemGrade", Py_BuildValue("i", 0)); }
PyObject* stub_player_CanRefine(PyObject*, PyObject*) { return stub_call_named("player.CanRefine", Py_BuildValue("i", 0)); }
PyObject* stub_player_CanDetach(PyObject*, PyObject*) { return stub_call_named("player.CanDetach", Py_BuildValue("i", 0)); }
PyObject* stub_player_CanUnlock(PyObject*, PyObject*) { return stub_call_named("player.CanUnlock", Py_BuildValue("i", 0)); }
PyObject* stub_player_CanAttachMetin(PyObject*, PyObject*) { return stub_call_named("player.CanAttachMetin", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsRefineGradeScroll(PyObject*, PyObject*) { return stub_call_named("player.IsRefineGradeScroll", Py_BuildValue("i", 0)); }
PyObject* stub_player_ClearTarget(PyObject*, PyObject*) { return stub_call_named("player.ClearTarget", Py_BuildNone()); }
PyObject* stub_player_SetTarget(PyObject*, PyObject*) { return stub_call_named("player.SetTarget", Py_BuildNone()); }
PyObject* stub_player_OpenCharacterMenu(PyObject*, PyObject*) { return stub_call_named("player.OpenCharacterMenu", Py_BuildNone()); }
PyObject* stub_player_Update(PyObject*, PyObject*) { return stub_call_named("player.Update", Py_BuildNone()); }
PyObject* stub_player_Render(PyObject*, PyObject*) { return stub_call_named("player.Render", Py_BuildNone()); }
PyObject* stub_player_Clear(PyObject*, PyObject*) { return stub_call_named("player.Clear", Py_BuildNone()); }
PyObject* stub_player_IsPartyMember(PyObject*, PyObject*) { return stub_call_named("player.IsPartyMember", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsPartyLeader(PyObject*, PyObject*) { return stub_call_named("player.IsPartyLeader", Py_BuildValue("i", 0)); }
PyObject* stub_player_IsPartyLeaderByPID(PyObject*, PyObject*) { return stub_call_named("player.IsPartyLeaderByPID", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetPartyMemberHPPercentage(PyObject*, PyObject*) { return stub_call_named("player.GetPartyMemberHPPercentage", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetPartyMemberState(PyObject*, PyObject*) { return stub_call_named("player.GetPartyMemberState", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetPartyMemberAffects(PyObject*, PyObject*) { return stub_call_named("player.GetPartyMemberAffects", Py_BuildValue("iiiiiii", 0, 0, 0, 0, 0, 0, 0)); }
PyObject* stub_player_RemovePartyMember(PyObject*, PyObject*) { return stub_call_named("player.RemovePartyMember", Py_BuildNone()); }
PyObject* stub_player_ExitParty(PyObject*, PyObject*) { return stub_call_named("player.ExitParty", Py_BuildNone()); }
PyObject* stub_player_GetPKMode(PyObject*, PyObject*) { return stub_call_named("player.GetPKMode", Py_BuildValue("i", 0)); }
PyObject* stub_player_HasMobilePhoneNumber(PyObject*, PyObject*) { return stub_call_named("player.HasMobilePhoneNumber", Py_BuildValue("i", 0)); }
PyObject* stub_player_RegisterEmotionIcon(PyObject*, PyObject*) { return stub_call_named("player.RegisterEmotionIcon", Py_BuildNone()); }
PyObject* stub_player_GetEmotionIconImage(PyObject*, PyObject*) { return stub_call_named("player.GetEmotionIconImage", Py_BuildValue("i", 0)); }
PyObject* stub_player_SetWeaponAttackBonusFlag(PyObject*, PyObject*) { return stub_call_named("player.SetWeaponAttackBonusFlag", Py_BuildNone()); }
PyObject* stub_player_ToggleCoolTime(PyObject*, PyObject*) { return stub_call_named("player.ToggleCoolTime", Py_BuildValue("i", 0)); }
PyObject* stub_player_ToggleLevelLimit(PyObject*, PyObject*) { return stub_call_named("player.ToggleLevelLimit", Py_BuildValue("i", 0)); }
PyObject* stub_player_GetTargetVID(PyObject*, PyObject*) { return stub_call_named("player.GetTargetVID", Py_BuildValue("i", 0)); }
PyObject* stub_player_SetItemData(PyObject*, PyObject*) { return stub_call_named("player.SetItemData", Py_BuildNone()); }
PyObject* stub_player_SetItemMetinSocket(PyObject*, PyObject*) { return stub_call_named("player.SetItemMetinSocket", Py_BuildNone()); }
PyObject* stub_player_SetItemAttribute(PyObject*, PyObject*) { return stub_call_named("player.SetItemAttribute", Py_BuildNone()); }
PyObject* stub_player_SetItemCount(PyObject*, PyObject*) { return stub_call_named("player.SetItemCount", Py_BuildNone()); }
PyObject* stub_player_GetItemLink(PyObject*, PyObject*) { return stub_call_named("player.GetItemLink", Py_BuildValue("s", "")); }
PyObject* stub_player_SlotTypeToInvenType(PyObject*, PyObject*) { return stub_call_named("player.SlotTypeToInvenType", Py_BuildValue("i", 0)); }
PyObject* stub_player_SendDragonSoulRefine(PyObject*, PyObject*) { return stub_call_named("player.SendDragonSoulRefine", Py_BuildNone()); }
PyMethodDef methods_player[] = {
{ "GetAutoPotionInfo", stub_player_GetAutoPotionInfo, METH_VARARGS },
{ "SetAutoPotionInfo", stub_player_SetAutoPotionInfo, METH_VARARGS },
{ "PickCloseItem", stub_player_PickCloseItem, METH_VARARGS },
{ "SetGameWindow", stub_player_SetGameWindow, METH_VARARGS },
{ "RegisterEffect", stub_player_RegisterEffect, METH_VARARGS },
{ "RegisterCacheEffect", stub_player_RegisterCacheEffect, METH_VARARGS },
{ "SetMouseState", stub_player_SetMouseState, METH_VARARGS },
{ "SetMouseFunc", stub_player_SetMouseFunc, METH_VARARGS },
{ "GetMouseFunc", stub_player_GetMouseFunc, METH_VARARGS },
{ "SetMouseMiddleButtonState", stub_player_SetMouseMiddleButtonState, METH_VARARGS },
{ "SetMainCharacterIndex", stub_player_SetMainCharacterIndex, METH_VARARGS },
{ "GetMainCharacterIndex", stub_player_GetMainCharacterIndex, METH_VARARGS },
{ "GetMainCharacterName", stub_player_GetMainCharacterName, METH_VARARGS },
{ "GetMainCharacterPosition", stub_player_GetMainCharacterPosition, METH_VARARGS },
{ "IsMainCharacterIndex", stub_player_IsMainCharacterIndex, METH_VARARGS },
{ "CanAttackInstance", stub_player_CanAttackInstance, METH_VARARGS },
{ "IsActingEmotion", stub_player_IsActingEmotion, METH_VARARGS },
{ "IsPVPInstance", stub_player_IsPVPInstance, METH_VARARGS },
{ "IsSameEmpire", stub_player_IsSameEmpire, METH_VARARGS },
{ "IsChallengeInstance", stub_player_IsChallengeInstance, METH_VARARGS },
{ "IsRevengeInstance", stub_player_IsRevengeInstance, METH_VARARGS },
{ "IsCantFightInstance", stub_player_IsCantFightInstance, METH_VARARGS },
{ "GetCharacterDistance", stub_player_GetCharacterDistance, METH_VARARGS },
{ "IsInSafeArea", stub_player_IsInSafeArea, METH_VARARGS },
{ "IsMountingHorse", stub_player_IsMountingHorse, METH_VARARGS },
{ "IsObserverMode", stub_player_IsObserverMode, METH_VARARGS },
{ "ActEmotion", stub_player_ActEmotion, METH_VARARGS },
{ "ShowPlayer", stub_player_ShowPlayer, METH_VARARGS },
{ "HidePlayer", stub_player_HidePlayer, METH_VARARGS },
{ "ComboAttack", stub_player_ComboAttack, METH_VARARGS },
{ "SetAutoCameraRotationSpeed", stub_player_SetAutoCameraRotationSpeed, METH_VARARGS },
{ "SetAttackKeyState", stub_player_SetAttackKeyState, METH_VARARGS },
{ "SetSingleDIKKeyState", stub_player_SetSingleDIKKeyState, METH_VARARGS },
{ "EndKeyWalkingImmediately", stub_player_EndKeyWalkingImmediately, METH_VARARGS },
{ "StartMouseWalking", stub_player_StartMouseWalking, METH_VARARGS },
{ "EndMouseWalking", stub_player_EndMouseWalking, METH_VARARGS },
{ "ResetCameraRotation", stub_player_ResetCameraRotation, METH_VARARGS },
{ "SetQuickCameraMode", stub_player_SetQuickCameraMode, METH_VARARGS },
{ "SetSkill", stub_player_SetSkill, METH_VARARGS },
{ "GetSkillIndex", stub_player_GetSkillIndex, METH_VARARGS },
{ "GetSkillSlotIndex", stub_player_GetSkillSlotIndex, METH_VARARGS },
{ "GetSkillGrade", stub_player_GetSkillGrade, METH_VARARGS },
{ "GetSkillLevel", stub_player_GetSkillLevel, METH_VARARGS },
{ "GetSkillCurrentEfficientPercentage", stub_player_GetSkillCurrentEfficientPercentage, METH_VARARGS },
{ "GetSkillNextEfficientPercentage", stub_player_GetSkillNextEfficientPercentage, METH_VARARGS },
{ "ClickSkillSlot", stub_player_ClickSkillSlot, METH_VARARGS },
{ "ChangeCurrentSkillNumberOnly", stub_player_ChangeCurrentSkillNumberOnly, METH_VARARGS },
{ "ClearSkillDict", stub_player_ClearSkillDict, METH_VARARGS },
{ "GetItemIndex", stub_player_GetItemIndex, METH_VARARGS },
{ "GetItemFlags", stub_player_GetItemFlags, METH_VARARGS },
{ "GetItemCount", stub_player_GetItemCount, METH_VARARGS },
{ "GetItemCountByVnum", stub_player_GetItemCountByVnum, METH_VARARGS },
{ "GetItemMetinSocket", stub_player_GetItemMetinSocket, METH_VARARGS },
{ "GetItemAttribute", stub_player_GetItemAttribute, METH_VARARGS },
{ "GetItemUnbindTime", stub_player_GetItemUnbindTime, METH_VARARGS },
{ "GetISellItemPrice", stub_player_GetISellItemPrice, METH_VARARGS },
{ "MoveItem", stub_player_MoveItem, METH_VARARGS },
{ "SendClickItemPacket", stub_player_SendClickItemPacket, METH_VARARGS },
{ "GetName", stub_player_GetName, METH_VARARGS },
{ "GetJob", stub_player_GetJob, METH_VARARGS },
{ "GetRace", stub_player_GetRace, METH_VARARGS },
{ "GetPlayTime", stub_player_GetPlayTime, METH_VARARGS },
{ "SetPlayTime", stub_player_SetPlayTime, METH_VARARGS },
{ "IsSkillCoolTime", stub_player_IsSkillCoolTime, METH_VARARGS },
{ "GetSkillCoolTime", stub_player_GetSkillCoolTime, METH_VARARGS },
{ "IsSkillActive", stub_player_IsSkillActive, METH_VARARGS },
{ "UseGuildSkill", stub_player_UseGuildSkill, METH_VARARGS },
{ "AffectIndexToSkillIndex", stub_player_AffectIndexToSkillIndex, METH_VARARGS },
{ "GetEXP", stub_player_GetEXP, METH_VARARGS },
{ "GetStatus", stub_player_GetStatus, METH_VARARGS },
{ "SetStatus", stub_player_SetStatus, METH_VARARGS },
{ "GetElk", stub_player_GetElk, METH_VARARGS },
{ "GetMoney", stub_player_GetMoney, METH_VARARGS },
{ "GetGuildID", stub_player_GetGuildID, METH_VARARGS },
{ "GetGuildName", stub_player_GetGuildName, METH_VARARGS },
{ "GetAlignmentData", stub_player_GetAlignmentData, METH_VARARGS },
{ "RequestAddLocalQuickSlot", stub_player_RequestAddLocalQuickSlot, METH_VARARGS },
{ "RequestAddToEmptyLocalQuickSlot", stub_player_RequestAddToEmptyLocalQuickSlot, METH_VARARGS },
{ "RequestDeleteGlobalQuickSlot", stub_player_RequestDeleteGlobalQuickSlot, METH_VARARGS },
{ "RequestMoveGlobalQuickSlotToLocalQuickSlot", stub_player_RequestMoveGlobalQuickSlotToLocalQuickSlot, METH_VARARGS },
{ "RequestUseLocalQuickSlot", stub_player_RequestUseLocalQuickSlot, METH_VARARGS },
{ "LocalQuickSlotIndexToGlobalQuickSlotIndex", stub_player_LocalQuickSlotIndexToGlobalQuickSlotIndex, METH_VARARGS },
{ "GetQuickPage", stub_player_GetQuickPage, METH_VARARGS },
{ "SetQuickPage", stub_player_SetQuickPage, METH_VARARGS },
{ "GetLocalQuickSlot", stub_player_GetLocalQuickSlot, METH_VARARGS },
{ "GetGlobalQuickSlot", stub_player_GetGlobalQuickSlot, METH_VARARGS },
{ "RemoveQuickSlotByValue", stub_player_RemoveQuickSlotByValue, METH_VARARGS },
{ "isItem", stub_player_isItem, METH_VARARGS },
{ "IsEquipmentSlot", stub_player_IsEquipmentSlot, METH_VARARGS },
{ "IsDSEquipmentSlot", stub_player_IsDSEquipmentSlot, METH_VARARGS },
{ "IsCostumeSlot", stub_player_IsCostumeSlot, METH_VARARGS },
{ "IsValuableItem", stub_player_IsValuableItem, METH_VARARGS },
{ "IsOpenPrivateShop", stub_player_IsOpenPrivateShop, METH_VARARGS },
{ "IsBeltInventorySlot", stub_player_IsBeltInventorySlot, METH_VARARGS },
{ "IsEquippingBelt", stub_player_IsEquippingBelt, METH_VARARGS },
{ "IsAvailableBeltInventoryCell", stub_player_IsAvailableBeltInventoryCell, METH_VARARGS },
{ "GetItemGrade", stub_player_GetItemGrade, METH_VARARGS },
{ "CanRefine", stub_player_CanRefine, METH_VARARGS },
{ "CanDetach", stub_player_CanDetach, METH_VARARGS },
{ "CanUnlock", stub_player_CanUnlock, METH_VARARGS },
{ "CanAttachMetin", stub_player_CanAttachMetin, METH_VARARGS },
{ "IsRefineGradeScroll", stub_player_IsRefineGradeScroll, METH_VARARGS },
{ "ClearTarget", stub_player_ClearTarget, METH_VARARGS },
{ "SetTarget", stub_player_SetTarget, METH_VARARGS },
{ "OpenCharacterMenu", stub_player_OpenCharacterMenu, METH_VARARGS },
{ "Update", stub_player_Update, METH_VARARGS },
{ "Render", stub_player_Render, METH_VARARGS },
{ "Clear", stub_player_Clear, METH_VARARGS },
{ "IsPartyMember", stub_player_IsPartyMember, METH_VARARGS },
{ "IsPartyLeader", stub_player_IsPartyLeader, METH_VARARGS },
{ "IsPartyLeaderByPID", stub_player_IsPartyLeaderByPID, METH_VARARGS },
{ "GetPartyMemberHPPercentage", stub_player_GetPartyMemberHPPercentage, METH_VARARGS },
{ "GetPartyMemberState", stub_player_GetPartyMemberState, METH_VARARGS },
{ "GetPartyMemberAffects", stub_player_GetPartyMemberAffects, METH_VARARGS },
{ "RemovePartyMember", stub_player_RemovePartyMember, METH_VARARGS },
{ "ExitParty", stub_player_ExitParty, METH_VARARGS },
{ "GetPKMode", stub_player_GetPKMode, METH_VARARGS },
{ "HasMobilePhoneNumber", stub_player_HasMobilePhoneNumber, METH_VARARGS },
{ "RegisterEmotionIcon", stub_player_RegisterEmotionIcon, METH_VARARGS },
{ "GetEmotionIconImage", stub_player_GetEmotionIconImage, METH_VARARGS },
{ "SetWeaponAttackBonusFlag", stub_player_SetWeaponAttackBonusFlag, METH_VARARGS },
{ "ToggleCoolTime", stub_player_ToggleCoolTime, METH_VARARGS },
{ "ToggleLevelLimit", stub_player_ToggleLevelLimit, METH_VARARGS },
{ "GetTargetVID", stub_player_GetTargetVID, METH_VARARGS },
{ "SetItemData", stub_player_SetItemData, METH_VARARGS },
{ "SetItemMetinSocket", stub_player_SetItemMetinSocket, METH_VARARGS },
{ "SetItemAttribute", stub_player_SetItemAttribute, METH_VARARGS },
{ "SetItemCount", stub_player_SetItemCount, METH_VARARGS },
{ "GetItemLink", stub_player_GetItemLink, METH_VARARGS },
{ "SlotTypeToInvenType", stub_player_SlotTypeToInvenType, METH_VARARGS },
{ "SendDragonSoulRefine", stub_player_SendDragonSoulRefine, METH_VARARGS },
{ NULL, NULL }
};
// 40250 UserInterface/PythonProfilerModule.cpp: profiler export names. // 40250 UserInterface/PythonProfilerModule.cpp: profiler export names.
PyObject* stub_profiler_Push(PyObject*, PyObject*) { return stub_call_named("profiler.Push", Py_BuildNone()); } PyObject* stub_profiler_Push(PyObject*, PyObject*) { return stub_call_named("profiler.Push", Py_BuildNone()); }
PyObject* stub_profiler_Pop(PyObject*, PyObject*) { return stub_call_named("profiler.Pop", Py_BuildNone()); } PyObject* stub_profiler_Pop(PyObject*, PyObject*) { return stub_call_named("profiler.Pop", Py_BuildNone()); }
@@ -1252,11 +985,6 @@ void init_2v0_gameplay_stubs() {
PyModule_AddIntConstant(module, "__port_stub__", 1); PyModule_AddIntConstant(module, "__port_stub__", 1);
AddStubConstants_nonplayer(module); AddStubConstants_nonplayer(module);
} }
{
PyObject* module = Py_InitModule("player", methods_player);
PyModule_AddIntConstant(module, "__port_stub__", 1);
AddStubConstants_player(module);
}
{ {
PyObject* module = Py_InitModule("profiler", methods_profiler); PyObject* module = Py_InitModule("profiler", methods_profiler);
PyModule_AddIntConstant(module, "__port_stub__", 1); PyModule_AddIntConstant(module, "__port_stub__", 1);
@@ -341,6 +341,7 @@ bool run_main_script_body(const char* lpCmdLine, std::string* error)
initapp(); initapp();
initchr(); initchr();
initchrmgr(); initchrmgr();
initPlayer();
initChat(); initChat();
initnet(); initnet();
init_2v0_gameplay_stubs(); init_2v0_gameplay_stubs();
@@ -55,6 +55,9 @@ void CPythonApplication::SetMinFog(float) { MT_PLATFORM_STUB(); }
// this returns it. PORT: no member to hold it; the timer only advances in Process(), so reading it // this returns it. PORT: no member to hold it; the timer only advances in Process(), so reading it
// here gives the same value. // here gives the same value.
float CPythonApplication::GetGlobalTime() { return CTimer::Instance().GetCurrentSecond(); } float CPythonApplication::GetGlobalTime() { return CTimer::Instance().GetCurrentSecond(); }
// In 40250 Process() also copies CTimer::GetElapsedSecond() into m_fGlobalElapsedTime (PythonApplication.cpp:448).
// PORT: read straight from the timer, as GetGlobalTime above.
float CPythonApplication::GetGlobalElapsedTime() { return CTimer::Instance().GetElapsedSecond(); }
void CPythonApplication::SetFrameSkip(bool) { MT_PLATFORM_STUB(); } void CPythonApplication::SetFrameSkip(bool) { MT_PLATFORM_STUB(); }
// PORT: 40250 creates the Win32 window, the D3D8 device, cursors, sound, keyboard, the net device, // PORT: 40250 creates the Win32 window, the D3D8 device, cursors, sound, keyboard, the net device,
// fonts and the IME here. The Godot window and its canvas already exist when the host starts the // fonts and the IME here. The Godot window and its canvas already exist when the host starts the
@@ -288,6 +291,9 @@ void CPythonApplication::SetCursorVisible(BOOL, bool) { MT_PLATFORM_STUB(); }
BOOL CPythonApplication::GetCursorVisible() { MT_PLATFORM_STUB(); return FALSE; } BOOL CPythonApplication::GetCursorVisible() { MT_PLATFORM_STUB(); return FALSE; }
bool CPythonApplication::GetLiarCursorOn() { MT_PLATFORM_STUB(); return false; } bool CPythonApplication::GetLiarCursorOn() { MT_PLATFORM_STUB(); return false; }
void CPythonApplication::SetCursorMode(int) { MT_PLATFORM_STUB(); } void CPythonApplication::SetCursorMode(int) { MT_PLATFORM_STUB(); }
// 40250 returns m_iCursorMode, CURSOR_MODE_HARDWARE from the constructor until SetCursorMode (PythonApplicationCursor.cpp:92).
// PORT: SetCursorMode is still a stub, so the mode stays the constructor's.
int CPythonApplication::GetCursorMode() { return CURSOR_MODE_HARDWARE; }
void CPythonApplication::SetMouseHandler(PyObject*) { MT_PLATFORM_STUB(); } void CPythonApplication::SetMouseHandler(PyObject*) { MT_PLATFORM_STUB(); }
void CPythonApplication::SetGlobalCenterPosition(LONG, LONG) { MT_PLATFORM_STUB(); } void CPythonApplication::SetGlobalCenterPosition(LONG, LONG) { MT_PLATFORM_STUB(); }
void CPythonApplication::SetFPS(int) { MT_PLATFORM_STUB(); } void CPythonApplication::SetFPS(int) { MT_PLATFORM_STUB(); }
@@ -306,7 +312,6 @@ BOOL SKILL_EFFECT_UPGRADE_ENABLE = FALSE;
double g_specularSpd = 0; double g_specularSpd = 0;
bool LoadLocaleData(const char*) { MT_PLATFORM_STUB(); return false; } bool LoadLocaleData(const char*) { MT_PLATFORM_STUB(); return false; }
void SetGuildSymbolPath(const char*) { MT_PLATFORM_STUB(); }
void TextTail_SetLivingTime(long) { MT_PLATFORM_STUB(); } void TextTail_SetLivingTime(long) { MT_PLATFORM_STUB(); }
namespace { namespace {
// The supplied 40250 Client/locale.cfg selects "en" (code page 1252). // The supplied 40250 Client/locale.cfg selects "en" (code page 1252).
@@ -364,72 +369,3 @@ int LocaleService_StringCompareCI( LPCSTR szStringLeft, LPCSTR szStringRight, si
{ {
return strnicmp( szStringLeft, szStringRight, sizeLength ); return strnicmp( szStringLeft, szStringRight, sizeLength );
} }
// 40250 UserInterface/GameType.cpp:9-73 (DEFAULT_FONT), verbatim.
// PORT: the default names are CP949 literals in 40250; ui.py sets the locale font (app.SetDefaultFontName)
// before anything asks for it.
static std::string gs_strDefaultFontName = "굴림체:12.fnt";
static std::string gs_strDefaultItalicFontName = "굴림체:12i.fnt";
static CResource* gs_pkDefaultFont = NULL;
static CResource* gs_pkDefaultItalicFont = NULL;
static bool gs_isReloadDefaultFont = false;
void DefaultFont_Startup()
{
gs_pkDefaultFont = NULL;
}
void DefaultFont_Cleanup()
{
if (gs_pkDefaultFont)
gs_pkDefaultFont->Release();
}
void DefaultFont_SetName(const char * c_szFontName)
{
gs_strDefaultFontName = c_szFontName;
gs_strDefaultFontName += ".fnt";
gs_strDefaultItalicFontName = c_szFontName;
if(strchr(c_szFontName, ':'))
gs_strDefaultItalicFontName += "i";
gs_strDefaultItalicFontName += ".fnt";
gs_isReloadDefaultFont = true;
}
bool ReloadDefaultFonts()
{
CResourceManager& rkResMgr = CResourceManager::Instance();
gs_isReloadDefaultFont = false;
CResource* pkNewFont = rkResMgr.GetResourcePointer(gs_strDefaultFontName.c_str());
pkNewFont->AddReference();
if (gs_pkDefaultFont)
gs_pkDefaultFont->Release();
gs_pkDefaultFont = pkNewFont;
CResource* pkNewItalicFont = rkResMgr.GetResourcePointer(gs_strDefaultItalicFontName.c_str());
pkNewItalicFont->AddReference();
if (gs_pkDefaultItalicFont)
gs_pkDefaultItalicFont->Release();
gs_pkDefaultItalicFont = pkNewItalicFont;
return true;
}
CResource* DefaultFont_GetResource()
{
if (!gs_pkDefaultFont || gs_isReloadDefaultFont)
ReloadDefaultFonts();
return gs_pkDefaultFont;
}
CResource* DefaultItalicFont_GetResource()
{
if (!gs_pkDefaultItalicFont || gs_isReloadDefaultFont)
ReloadDefaultFonts();
return gs_pkDefaultItalicFont;
}
@@ -95,3 +95,39 @@ auto CItemData::GetAttachingDataPointer(DWORD, const NRaceData::TAttachingData *
MT_PLATFORM_STUB(); MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>(); return mt_platform_stub_return<BOOL>();
} }
auto CItemData::IsAntiFlag(DWORD) const -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CItemData::IsEquipment() const -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CItemData::IsFlag(DWORD) const -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CItemData::HasNextGrade() const -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CItemData::GetWearFlags() const -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CItemData::GetISellItemPrice() const -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
@@ -21,3 +21,15 @@ auto CItemManager::GetItemDataPointer(DWORD, CItemData **) -> BOOL
MT_PLATFORM_STUB(); MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>(); return mt_platform_stub_return<BOOL>();
} }
auto CItemManager::SelectItemData(DWORD) -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CItemManager::GetSelectedItemDataPointer() -> CItemData *
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<CItemData *>();
}
@@ -1,10 +0,0 @@
// Pending GameType.cpp dependency of InstanceBase; the full unit is not ported yet.
#include "UserInterface/StdAfx.h"
#include "UserInterface/GameType.h"
std::string g_strGuildSymbolPathName = "mark/10/";
const char* GetGuildSymbolFileName(DWORD dwGuildID)
{
return _getf("%s%03d.jpg", g_strGuildSymbolPathName.c_str(), dwGuildID);
}
@@ -0,0 +1,13 @@
// Stand-in for the 40250 logic unit UserInterface/Locale.cpp, not ported yet: the members the ported units
// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/
// (docs/PORT-PLAN.md).
#include "UserInterface/StdAfx.h"
#include "UserInterface/Locale.h"
#include "../../PlatformStub.h"
auto LocaleService_GetSkillPower(unsigned int) -> int
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<int>();
}
@@ -206,3 +206,9 @@ void CPythonBackground::Initialize()
SetAtlasInfoFileName(atlas.c_str()); SetAtlasInfoFileName(atlas.c_str());
CMapManager::Initialize(); CMapManager::Initialize();
} }
auto CPythonBackground::GetPickingPoint(D3DXVECTOR3 *) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
@@ -131,3 +131,9 @@ CPythonGuild::~CPythonGuild()
{ {
MT_PLATFORM_STUB(); MT_PLATFORM_STUB();
} }
auto CPythonGuild::IsDoingGuildWar() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
@@ -65,3 +65,39 @@ auto CPythonItem::Update(const POINT &) -> void
{ {
MT_PLATFORM_STUB(); MT_PLATFORM_STUB();
} }
auto CPythonItem::GetOwnership(DWORD, const char **) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CPythonItem::GetGroundItemPosition(DWORD, TPixelPosition *) -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonItem::GetPickedItemID(DWORD *) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CPythonItem::GetCloseItem(const TPixelPosition &, DWORD *, DWORD) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CPythonItem::GetCloseMoney(const TPixelPosition &, DWORD *, DWORD) -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CPythonItem::GetVirtualNumberOfGroundItem(DWORD) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
@@ -70,3 +70,9 @@ auto CPythonMiniMap::DeleteTarget(int) -> void
{ {
MT_PLATFORM_STUB(); MT_PLATFORM_STUB();
} }
auto CPythonMiniMap::GetGuildAreaID(DWORD, DWORD) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,193 @@
// Stand-in for the 40250 logic unit UserInterface/PythonSkill.cpp, not ported yet: the members the ported units
// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/
// (docs/PORT-PLAN.md).
#include "UserInterface/StdAfx.h"
#include "UserInterface/PythonSkill.h"
#include "../../PlatformStub.h"
auto CPythonSkill::SSkillData::IsNeedCorpse() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsToggleSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsChargeSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::GetSkillData(DWORD, TSkillData **) -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::GetTargetRange() const -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::CanChangeDirection() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsFanRange() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsCircleRange() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsAutoSearchTarget() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedTarget() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsUseHPSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsStandingSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::CanUseWeaponType(DWORD) -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsOnlyForAlliance() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::CanUseForMe() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::CanUseIfNotEnough() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedEmptyBottle() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedPoisonBottle() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsNeedBow() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsAttackSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsHorseSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsMovingSkill() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::IsOnlyForGuildWar() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::GetSkillCoolTime(float) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::GetNeedSP(float) -> int
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<int>();
}
auto CPythonSkill::SSkillData::GetMotionLoopCount(float) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::GetTargetCount(float) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::GetSkillMotionIndex(int) -> DWORD
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<DWORD>();
}
auto CPythonSkill::SSkillData::IsCanUseSkill() -> bool
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<bool>();
}
auto CPythonSkill::SSkillData::IsNoMotion() -> BOOL
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BOOL>();
}
auto CPythonSkill::SSkillData::GetType() const -> BYTE
{
MT_PLATFORM_STUB();
return mt_platform_stub_return<BYTE>();
}
@@ -0,0 +1,112 @@
#include "StdAfx.h"
#include "GameType.h"
std::string g_strResourcePath = "d:/ymir work/";
std::string g_strImagePath = "d:/ymir work/ui/";
std::string g_strGuildSymbolPathName = "mark/10/";
// DEFAULT_FONT
static std::string gs_strDefaultFontName = "\261\274\270\262\303\274:12.fnt";
static std::string gs_strDefaultItalicFontName = "\261\274\270\262\303\274:12i.fnt";
static CResource* gs_pkDefaultFont = NULL;
static CResource* gs_pkDefaultItalicFont = NULL;
static bool gs_isReloadDefaultFont = false;
void DefaultFont_Startup()
{
gs_pkDefaultFont = NULL;
}
void DefaultFont_Cleanup()
{
if (gs_pkDefaultFont)
gs_pkDefaultFont->Release();
}
void DefaultFont_SetName(const char * c_szFontName)
{
gs_strDefaultFontName = c_szFontName;
gs_strDefaultFontName += ".fnt";
gs_strDefaultItalicFontName = c_szFontName;
if(strchr(c_szFontName, ':'))
gs_strDefaultItalicFontName += "i";
gs_strDefaultItalicFontName += ".fnt";
gs_isReloadDefaultFont = true;
}
bool ReloadDefaultFonts()
{
CResourceManager& rkResMgr = CResourceManager::Instance();
gs_isReloadDefaultFont = false;
CResource* pkNewFont = rkResMgr.GetResourcePointer(gs_strDefaultFontName.c_str());
pkNewFont->AddReference();
if (gs_pkDefaultFont)
gs_pkDefaultFont->Release();
gs_pkDefaultFont = pkNewFont;
CResource* pkNewItalicFont = rkResMgr.GetResourcePointer(gs_strDefaultItalicFontName.c_str());
pkNewItalicFont->AddReference();
if (gs_pkDefaultItalicFont)
gs_pkDefaultItalicFont->Release();
gs_pkDefaultItalicFont = pkNewItalicFont;
return true;
}
CResource* DefaultFont_GetResource()
{
if (!gs_pkDefaultFont || gs_isReloadDefaultFont)
ReloadDefaultFonts();
return gs_pkDefaultFont;
}
CResource* DefaultItalicFont_GetResource()
{
if (!gs_pkDefaultItalicFont || gs_isReloadDefaultFont)
ReloadDefaultFonts();
return gs_pkDefaultItalicFont;
}
// END_OF_DEFAULT_FONT
void SetGuildSymbolPath(const char * c_szPathName)
{
g_strGuildSymbolPathName = "mark/";
g_strGuildSymbolPathName += c_szPathName;
g_strGuildSymbolPathName += "/";
}
const char * GetGuildSymbolFileName(DWORD dwGuildID)
{
return _getf("%s%03d.jpg", g_strGuildSymbolPathName.c_str(), dwGuildID);
}
BYTE c_aSlotTypeToInvenType[SLOT_TYPE_MAX] =
{
RESERVED_WINDOW, // SLOT_TYPE_NONE
INVENTORY, // SLOT_TYPE_INVENTORY
RESERVED_WINDOW, // SLOT_TYPE_SKILL
RESERVED_WINDOW, // SLOT_TYPE_EMOTION
RESERVED_WINDOW, // SLOT_TYPE_SHOP
RESERVED_WINDOW, // SLOT_TYPE_EXCHANGE_OWNER
RESERVED_WINDOW, // SLOT_TYPE_EXCHANGE_TARGET
RESERVED_WINDOW, // SLOT_TYPE_QUICK_SLOT
RESERVED_WINDOW, // SLOT_TYPE_SAFEBOX <- SAFEBOX, MALL의 경우 하드 코딩되어있는 LEGACY 코드를 유지함.
RESERVED_WINDOW, // SLOT_TYPE_PRIVATE_SHOP
RESERVED_WINDOW, // SLOT_TYPE_MALL <- SAFEBOX, MALL의 경우 하드 코딩되어있는 LEGACY 코드를 유지함.
DRAGON_SOUL_INVENTORY, // SLOT_TYPE_DRAGON_SOUL_INVENTORY
};
BYTE SlotTypeToInvenType(BYTE bSlotType)
{
if (bSlotType >= SLOT_TYPE_MAX)
return RESERVED_WINDOW;
else
return c_aSlotTypeToInvenType[bSlotType];
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,280 @@
#include "StdAfx.h"
#include "PythonPlayerEventHandler.h"
#include "PythonPlayer.h"
#include "PythonCharacterManager.h"
#include "PythonNetworkStream.h"
CPythonPlayerEventHandler& CPythonPlayerEventHandler::GetSingleton()
{
static CPythonPlayerEventHandler s_kPlayerEventHandler;
return s_kPlayerEventHandler;
}
CPythonPlayerEventHandler::~CPythonPlayerEventHandler()
{
}
void CPythonPlayerEventHandler::OnClearAffects()
{
CPythonPlayer::Instance().ClearAffects();
}
void CPythonPlayerEventHandler::OnSetAffect(UINT uAffect)
{
CPythonPlayer::Instance().SetAffect(uAffect);
}
void CPythonPlayerEventHandler::OnResetAffect(UINT uAffect)
{
CPythonPlayer::Instance().ResetAffect(uAffect);
}
void CPythonPlayerEventHandler::OnSyncing(const SState& c_rkState)
{
const TPixelPosition& c_rkPPosCurSyncing=c_rkState.kPPosSelf;
m_kPPosPrevWaiting=c_rkPPosCurSyncing;
}
void CPythonPlayerEventHandler::OnWaiting(const SState& c_rkState)
{
DWORD dwCurTime=ELTimer_GetMSec();
if (m_dwNextWaitingNotifyTime>dwCurTime)
return;
m_dwNextWaitingNotifyTime=dwCurTime+100;
const TPixelPosition& c_rkPPosCurWaiting=c_rkState.kPPosSelf;
float dx=m_kPPosPrevWaiting.x-c_rkPPosCurWaiting.x;
float dy=m_kPPosPrevWaiting.y-c_rkPPosCurWaiting.y;
float len=sqrt(dx*dx+dy*dy);
if (len<1.0f)
return;
m_kPPosPrevWaiting=c_rkPPosCurWaiting;
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_WAIT, 0);
//Trace("waiting\n");
}
void CPythonPlayerEventHandler::OnMoving(const SState& c_rkState)
{
DWORD dwCurTime=ELTimer_GetMSec();
if (m_dwNextMovingNotifyTime>dwCurTime)
return;
m_dwNextMovingNotifyTime=dwCurTime+300;
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_MOVE, 0);
// Trace("moving\n");
}
void CPythonPlayerEventHandler::OnMove(const SState& c_rkState)
{
DWORD dwCurTime=ELTimer_GetMSec();
m_dwNextWaitingNotifyTime=dwCurTime+100;
m_dwNextMovingNotifyTime=dwCurTime+300;
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_MOVE, 0);
// Trace("move\n");
}
void CPythonPlayerEventHandler::OnStop(const SState& c_rkState)
{
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_WAIT, 0);
// Trace("stop\n");
}
void CPythonPlayerEventHandler::OnWarp(const SState& c_rkState)
{
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_WAIT, 0);
}
void CPythonPlayerEventHandler::OnAttack(const SState& c_rkState, WORD wMotionIndex)
{
// Tracef("CPythonPlayerEventHandler::OnAttack [%d]\n", wMotionIndex);
assert(wMotionIndex < 255);
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_COMBO, wMotionIndex);
#ifdef __ATTACK_SPEED_CHECK__
static DWORD s_dwLastTime=timeGetTime();
DWORD dwCurTime=timeGetTime();
Tracef("%d\n", dwCurTime-s_dwLastTime);
s_dwLastTime=dwCurTime;
#endif
}
void CPythonPlayerEventHandler::OnUseSkill(const SState& c_rkState, UINT uMotSkill, UINT uArg)
{
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_SKILL|uMotSkill, uArg);
}
void CPythonPlayerEventHandler::OnUpdate()
{
}
void CPythonPlayerEventHandler::OnChangeShape()
{
CPythonPlayer::Instance().NEW_Stop();
}
void CPythonPlayerEventHandler::OnHit(UINT uSkill, CActorInstance& rkActorVictim, BOOL isSendPacket)
{
DWORD dwVIDVictim=rkActorVictim.GetVirtualID();
// Update Target
CPythonPlayer::Instance().SetTarget(dwVIDVictim, FALSE);
// Update Target
if (isSendPacket)
{
//#define ATTACK_TIME_LOG
#ifdef ATTACK_TIME_LOG
static std::map<DWORD, float> s_prevTimed;
float curTime = timeGetTime() / 1000.0f;
bool isFirst = false;
if (s_prevTimed.end() == s_prevTimed.find(dwVIDVictim))
{
s_prevTimed[dwVIDVictim] = curTime;
isFirst = true;
}
float diffTime = curTime-s_prevTimed[dwVIDVictim];
if (diffTime < 0.1f && !isFirst)
{
TraceError("ATTACK(SPEED_HACK): %.4f(%.4f) %d", curTime, diffTime, dwVIDVictim);
}
else
{
TraceError("ATTACK: %.4f(%.4f) %d", curTime, diffTime, dwVIDVictim);
}
s_prevTimed[dwVIDVictim] = curTime;
#endif
CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
rkStream.SendAttackPacket(uSkill, dwVIDVictim);
}
if (!rkActorVictim.IsPushing())
return;
// 거대 몬스터 밀림 제외
extern bool IS_HUGE_RACE(unsigned int vnum);
if (IS_HUGE_RACE(rkActorVictim.GetRace()))
return;
CPythonCharacterManager::Instance().AdjustCollisionWithOtherObjects(&rkActorVictim);
const TPixelPosition& kPPosLast=rkActorVictim.NEW_GetLastPixelPositionRef();
SVictim kVictim;
kVictim.m_dwVID=dwVIDVictim;
kVictim.m_lPixelX=long(kPPosLast.x);
kVictim.m_lPixelY=long(kPPosLast.y);
rkActorVictim.TEMP_Push(kVictim.m_lPixelX, kVictim.m_lPixelY);
m_kVctkVictim.push_back(kVictim);
}
void CPythonPlayerEventHandler::FlushVictimList()
{
if (m_kVctkVictim.empty())
return;
// #0000682: [M2EU] 대진각 스킬 사용시 튕김
unsigned int SYNC_POSITION_COUNT_LIMIT = 16;
unsigned int uiVictimCount = m_kVctkVictim.size();
CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
TPacketCGSyncPosition kPacketSyncPos;
kPacketSyncPos.bHeader=HEADER_CG_SYNC_POSITION;
kPacketSyncPos.wSize=sizeof(kPacketSyncPos)+sizeof(TPacketCGSyncPositionElement) * uiVictimCount;
rkStream.Send(sizeof(kPacketSyncPos), &kPacketSyncPos);
for (unsigned int i = 0; i < uiVictimCount; ++i)
{
const SVictim& rkVictim = m_kVctkVictim[i];
rkStream.SendSyncPositionElementPacket(rkVictim.m_dwVID, rkVictim.m_lPixelX, rkVictim.m_lPixelY);
}
rkStream.SendSequence();
m_kVctkVictim.clear();
}
CPythonPlayerEventHandler::CPythonPlayerEventHandler()
{
m_dwPrevComboIndex=0;
m_dwNextMovingNotifyTime=0;
m_dwNextWaitingNotifyTime=0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnSetFlyTarget()
{
SState s;
m_pInstMain->NEW_GetPixelPosition(&s.kPPosSelf);
s.fAdvRotSelf=m_pInstMain->GetGraphicThingInstancePtr()->GetTargetRotation();
CPythonNetworkStream& rpns=CPythonNetworkStream::Instance();
rpns.SendFlyTargetingPacket(m_pInstTarget->GetVirtualID(), m_pInstTarget->GetGraphicThingInstancePtr()->OnGetFlyTargetPosition());
}
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot(DWORD dwSkillIndex)
{
CPythonNetworkStream& rpns=CPythonNetworkStream::Instance();
rpns.SendShootPacket(dwSkillIndex);
}
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::Set(CPythonPlayerEventHandler * pParent, CInstanceBase * pInstMain, CInstanceBase * pInstTarget)
{
m_pParent=(pParent);
m_pInstMain=(pInstMain);
m_pInstTarget=(pInstTarget);
}
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget(CInstanceBase* pInstTarget)
{
m_pInstTarget = pInstTarget;
}
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtAnotherTarget(DWORD dwSkillIndex, DWORD dwVID)
{
return;
Tracef("Shoot : \264\331\270\245 target\277\241 \270\302\276\322\275\300\264\317\264\331 : %d, %d\n", dwSkillIndex, dwVID);
CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
rkStream.SendAttackPacket(dwSkillIndex, dwVID);
CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(dwVID);
if (pInstance)
{
pInstance->GetGraphicThingInstanceRef().OnShootDamage();
}
}
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget(DWORD dwSkillIndex)
{
// Tracef("Shoot : 원하는 target에 맞았습니다 : %d, %d\n", dwSkillIndex, m_pInstTarget->GetVirtualID());
// CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
// rkStream.SendAttackPacket(dwSkillIndex, m_pInstTarget->GetVirtualID());
}
@@ -0,0 +1,89 @@
#pragma once
#include "../GameLib/ActorInstance.h"
#include "../GameLib/FlyHandler.h"
#include "PythonNetworkStream.h"
#include "InstanceBase.h"
class CPythonPlayerEventHandler : public CActorInstance::IEventHandler
{
public:
static CPythonPlayerEventHandler& GetSingleton();
public:
virtual ~CPythonPlayerEventHandler();
virtual void OnSyncing(const SState& c_rkState);
virtual void OnWaiting(const SState& c_rkState);
virtual void OnMoving(const SState& c_rkState);
virtual void OnMove(const SState& c_rkState);
virtual void OnStop(const SState& c_rkState);
virtual void OnWarp(const SState& c_rkState);
virtual void OnClearAffects();
virtual void OnSetAffect(UINT uAffect);
virtual void OnResetAffect(UINT uAffect);
virtual void OnAttack(const SState& c_rkState, WORD wMotionIndex);
virtual void OnUseSkill(const SState& c_rkState, UINT uMotSkill, UINT uArg);
virtual void OnUpdate();
virtual void OnChangeShape();
virtual void OnHit(UINT uSkill, CActorInstance& rkActorVictim, BOOL isSendPacket);
void FlushVictimList();
protected:
CPythonPlayerEventHandler();
protected:
struct SVictim
{
DWORD m_dwVID;
long m_lPixelX;
long m_lPixelY;
};
protected:
std::vector<SVictim> m_kVctkVictim;
DWORD m_dwPrevComboIndex;
DWORD m_dwNextWaitingNotifyTime;
DWORD m_dwNextMovingNotifyTime;
TPixelPosition m_kPPosPrevWaiting;
private:
class CNormalBowAttack_FlyEventHandler_AutoClear : public IFlyEventHandler
{
public:
CNormalBowAttack_FlyEventHandler_AutoClear() {}
virtual ~CNormalBowAttack_FlyEventHandler_AutoClear() {}
void Set(CPythonPlayerEventHandler * pParent, CInstanceBase * pInstMain, CInstanceBase * pInstTarget);
void SetTarget(CInstanceBase* pInstTarget);
virtual void OnSetFlyTarget();
virtual void OnShoot(DWORD dwSkillIndex);
virtual void OnNoTarget() { /*Tracenf("Shoot : target이 없습니다.");*/ }
virtual void OnExplodingOutOfRange() { /*Tracenf("Shoot : 사정거리가 끝났습니다.");*/ }
virtual void OnExplodingAtBackground() { /*Tracenf("Shoot : 배경에 맞았습니다.");*/ }
virtual void OnExplodingAtAnotherTarget(DWORD dwSkillIndex, DWORD dwVID);
virtual void OnExplodingAtTarget(DWORD dwSkillIndex);
protected:
CPythonPlayerEventHandler * m_pParent;
CInstanceBase * m_pInstMain;
CInstanceBase * m_pInstTarget;
} m_NormalBowAttack_FlyEventHandler_AutoClear;
public:
IFlyEventHandler * GetNormalBowAttackFlyEventHandler(CInstanceBase* pInstMain, CInstanceBase* pInstTarget)
{
m_NormalBowAttack_FlyEventHandler_AutoClear.Set(this,pInstMain,pInstTarget);
return &m_NormalBowAttack_FlyEventHandler_AutoClear;
}
void ChangeFlyTarget(CInstanceBase* pInstTarget)
{
m_NormalBowAttack_FlyEventHandler_AutoClear.SetTarget(pInstTarget);
}
};
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,134 @@
#include "StdAfx.h"
#include "PythonPlayer.h"
#include "InstanceBase.h"
void CPythonPlayer::SetAttackKeyState(bool isPress)
{
if (isPress)
{
CInstanceBase* pkInstMain = NEW_GetMainActorPtr();
if (pkInstMain)
if (pkInstMain->IsFishingMode())
{
NEW_Fishing();
return;
}
}
m_isAtkKey=isPress;
}
void CPythonPlayer::NEW_SetSingleDIKKeyState(int eDIKKey, bool isPress)
{
if (NEW_CancelFishing())
return;
switch (eDIKKey)
{
case DIK_UP:
NEW_SetSingleDirKeyState(DIR_UP, isPress);
break;
case DIK_DOWN:
NEW_SetSingleDirKeyState(DIR_DOWN, isPress);
break;
case DIK_LEFT:
NEW_SetSingleDirKeyState(DIR_LEFT, isPress);
break;
case DIK_RIGHT:
NEW_SetSingleDirKeyState(DIR_RIGHT, isPress);
break;
}
}
void CPythonPlayer::NEW_SetSingleDirKeyState(int eDirKey, bool isPress)
{
switch (eDirKey)
{
case DIR_UP:
m_isUp=isPress;
break;
case DIR_DOWN:
m_isDown=isPress;
break;
case DIR_LEFT:
m_isLeft=isPress;
break;
case DIR_RIGHT:
m_isRight=isPress;
break;
}
m_isDirKey=(m_isUp || m_isDown || m_isLeft || m_isRight);
NEW_SetMultiDirKeyState(m_isLeft, m_isRight, m_isUp, m_isDown);
}
void CPythonPlayer::NEW_SetMultiDirKeyState(bool isLeft, bool isRight, bool isUp, bool isDown)
{
if (!__CanMove())
return;
bool isAny=(isLeft || isRight || isUp || isDown);
if (isAny)
{
float fDirRot=0.0f;
NEW_GetMultiKeyDirRotation(isLeft, isRight, isUp, isDown, &fDirRot);
if (!NEW_MoveToDirection(fDirRot))
{
Tracen("CPythonPlayer::NEW_SetMultiKeyState - NEW_Move -> ERROR");
return;
}
}
else
{
NEW_Stop();
}
}
float CPythonPlayer::GetDegreeFromDirection(int iUD, int iLR)
{
switch(iUD)
{
case KEYBOARD_UD_UP:
if (KEYBOARD_LR_LEFT == iLR)
{
return +45.0f;
}
else if (KEYBOARD_LR_RIGHT == iLR)
{
return -45.0f;
}
return 0.0f;
break;
case KEYBOARD_UD_DOWN:
if (KEYBOARD_LR_LEFT == iLR)
{
return +135.0f;
}
else if (KEYBOARD_LR_RIGHT == iLR)
{
return -135.0f;
}
return +180.0f;
break;
case KEYBOARD_UD_NONE:
if (KEYBOARD_LR_LEFT == iLR)
{
return +90.0f;
}
else if (KEYBOARD_LR_RIGHT == iLR)
{
return -90.0f;
}
break;
}
return 0.0f;
}
@@ -0,0 +1,394 @@
#include "StdAfx.h"
#include "PythonPlayer.h"
#include "PythonApplication.h"
#include "../EterLib/Camera.h"
void CPythonPlayer::NEW_SetMouseMoveState(int eMBS)
{
if (MBS_PRESS==eMBS)
{
NEW_MoveToMouseScreenDirection();
m_isDirMov=true;
}
else if (MBS_CLICK==eMBS)
{
NEW_Stop();
m_isDirMov=false;
}
}
bool CPythonPlayer::NEW_MoveToMouseScreenDirection()
{
UI::CWindowManager& rkWndMgr=UI::CWindowManager::Instance();
long lMouseX;
long lMouseY;
rkWndMgr.GetMousePosition(lMouseX, lMouseY);
long lScrWidth = rkWndMgr.GetScreenWidth();
long lScrHeight = rkWndMgr.GetScreenHeight();
float fMouseX=lMouseX/float(lScrWidth);
float fMouseY=lMouseY/float(lScrHeight);
float fDirRot;
NEW_GetMouseDirRotation(fMouseX, fMouseY, &fDirRot);
return NEW_MoveToDirection(fDirRot);
}
void CPythonPlayer::NEW_SetMouseCameraState(int eMBS)
{
CPythonApplication & rkApp = CPythonApplication::Instance();
CPythonBackground & rkBG = CPythonBackground::Instance();
CCamera* pkCmrCur=CCameraManager::Instance().GetCurrentCamera();
if (pkCmrCur)
{
if (MBS_PRESS==eMBS)
{
UI::CWindowManager& rkWndMgr=UI::CWindowManager::Instance();
long lMouseX;
long lMouseY;
rkWndMgr.GetMousePosition(lMouseX, lMouseY);
pkCmrCur->BeginDrag(lMouseX, lMouseY);
if ( !rkBG.IsMapReady() )
return;
rkApp.SetCursorNum(CPythonApplication::CAMERA_ROTATE);
if ( CPythonApplication::CURSOR_MODE_HARDWARE == rkApp.GetCursorMode())
rkApp.SetCursorVisible(FALSE, true);
}
else if (MBS_CLICK==eMBS)
{
bool isCameraDrag=pkCmrCur->EndDrag();
if ( !rkBG.IsMapReady() )
return;
rkApp.SetCursorNum(CPythonApplication::NORMAL);
if ( CPythonApplication::CURSOR_MODE_HARDWARE == rkApp.GetCursorMode())
rkApp.SetCursorVisible(TRUE);
if (!isCameraDrag)
{
__ChangeTargetToPickedInstance();
CInstanceBase * pkInstPicked;
if (__GetPickedActorPtr(&pkInstPicked))
{
OpenCharacterMenu(pkInstPicked->GetVirtualID());
}
}
}
}
}
void CPythonPlayer::NEW_SetMouseSmartState(int eMBS, bool isAuto)
{
CInstanceBase* pkInstMain=NEW_GetMainActorPtr();
if (!pkInstMain) return;
// PrivateShop
if (IsOpenPrivateShop())
{
// ShopPacket 이 오기전 잠깐 동안
m_isSmtMov=false;
return;
}
// Emotion
if (__IsProcessingEmotion())
{
return;
}
// AFFECT_STUN 처리
if (pkInstMain->IsSleep())
{
return;
}
if (MBS_PRESS==eMBS)
{
m_isSmtMov=true;
__OnPressSmart(*pkInstMain, isAuto);
}
else if (MBS_CLICK==eMBS)
{
m_isSmtMov=false;
__OnClickSmart(*pkInstMain, isAuto);
}
}
void CPythonPlayer::__OnPressSmart(CInstanceBase& rkInstMain, bool isAuto)
{
DWORD dwPickedItemID;
DWORD dwPickedActorID;
TPixelPosition kPPosPickedGround;
bool isPickedItemID=__GetPickedItemID(&dwPickedItemID);
bool isPickedActorID=__GetPickedActorID(&dwPickedActorID);
bool isPickedGroundPos=__GetPickedGroundPos(&kPPosPickedGround);
if (isPickedItemID)
{
__OnPressItem(rkInstMain, dwPickedItemID);
}
else if (isPickedActorID && dwPickedActorID != GetMainCharacterIndex())
{
__OnPressActor(rkInstMain, dwPickedActorID, isAuto);
}
else if (isPickedGroundPos)
{
__OnPressGround(rkInstMain, kPPosPickedGround);
}
else
{
__OnPressScreen(rkInstMain);
}
}
void CPythonPlayer::__OnClickSmart(CInstanceBase& rkInstMain, bool isAuto)
{
DWORD dwPickedItemID;
DWORD dwPickedActorID;
TPixelPosition kPPosPickedGround;
if (__GetPickedItemID(&dwPickedItemID))
{
__OnClickItem(rkInstMain, dwPickedItemID);
}
else if (__GetPickedActorID(&dwPickedActorID))
{
__OnClickActor(rkInstMain, dwPickedActorID, isAuto);
}
else if (__GetPickedGroundPos(&kPPosPickedGround))
{
__OnClickGround(rkInstMain, kPPosPickedGround);
}
else
{
rkInstMain.NEW_Stop();
}
}
void CPythonPlayer::__ShowPickedEffect(const TPixelPosition& c_rkPPosPickedGround)
{
#ifdef __MOVIE_MODE__
CInstanceBase* pkInstMain=NEW_GetMainActorPtr();
if (!pkInstMain) return;
if (pkInstMain->IsMovieMode())
return;
#endif
NEW_ShowEffect(EFFECT_PICK, c_rkPPosPickedGround);
}
bool CPythonPlayer::NEW_SetMouseFunc(int eMBT, int eMBF)
{
if (eMBT>=MBT_NUM)
return false;
m_aeMBFButton[eMBT]=eMBF;
return true;
}
int CPythonPlayer::NEW_GetMouseFunc(int eMBT)
{
if (eMBT>=MBT_NUM)
return false;
return m_aeMBFButton[eMBT];
}
void CPythonPlayer::SetQuickCameraMode(bool isEnable)
{
if (isEnable)
{
}
else
{
NEW_SetMouseCameraState(MBS_CLICK);
}
}
bool CPythonPlayer::NEW_SetMouseState(int eMBT, int eMBS)
{
if (eMBT>=MBT_NUM)
return false;
int eMBF=m_aeMBFButton[eMBT];
switch (eMBF)
{
case MBF_MOVE:
if (__CanMove())
NEW_SetMouseMoveState(eMBS);
break;
case MBF_SMART:
if (CPythonApplication::Instance().IsPressed(DIK_LCONTROL) || CPythonApplication::Instance().IsPressed(DIK_RCONTROL))
{
NEW_Attack();
}
else
{
NEW_SetMouseSmartState(eMBS, false);
}
break;
case MBF_CAMERA:
NEW_SetMouseCameraState(eMBS);
break;
case MBF_AUTO:
NEW_SetMouseSmartState(eMBS, true);
break;
case MBF_ATTACK:
NEW_Attack();
break;
case MBF_SKILL:
if (CPythonApplication::Instance().IsPressed(DIK_LCONTROL))
{
NEW_SetMouseCameraState(eMBS);
}
else
{
if (MBS_PRESS == eMBS)
{
__ChangeTargetToPickedInstance();
__UseCurrentSkill();
}
}
break;
}
return true;
}
void CPythonPlayer::NEW_SetMouseMiddleButtonState(int eMBState)
{
NEW_SetMouseCameraState(eMBState);
}
void CPythonPlayer::NEW_RefreshMouseWalkingDirection()
{
CInstanceBase* pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain) return;
switch (m_eReservedMode)
{
case MODE_CLICK_ITEM:
{
CPythonItem& rkIT=CPythonItem::Instance();
TPixelPosition kPPosPickedItem;
if (rkIT.GetGroundItemPosition(m_dwIIDReserved, &kPPosPickedItem))
{
if (pkInstMain->NEW_GetDistanceFromDestPixelPosition(kPPosPickedItem)<20.0f)
{
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
TPixelPosition kPPosCur;
pkInstMain->NEW_GetPixelPosition(&kPPosCur);
float fCurRot=pkInstMain->GetRotation();
rkNetStream.SendCharacterStatePacket(kPPosCur, fCurRot, CInstanceBase::FUNC_WAIT, 0);
SendClickItemPacket(m_dwIIDReserved);
pkInstMain->NEW_Stop();
__ClearReservedAction();
}
else
{
pkInstMain->NEW_MoveToDestPixelPositionDirection(kPPosPickedItem);
}
}
else
{
__ClearReservedAction();
}
break;
}
case MODE_CLICK_ACTOR:
{
__ReserveProcess_ClickActor();
break;
}
case MODE_CLICK_POSITION:
{
if (!pkInstMain->isLock())
if (NEW_IsEmptyReservedDelayTime(CPythonApplication::Instance().GetGlobalElapsedTime()))
{
pkInstMain->NEW_MoveToDestPixelPositionDirection(m_kPPosReserved);
__ClearReservedAction();
}
break;
}
case MODE_USE_SKILL:
{
CInstanceBase* pkInstReserved=NEW_FindActorPtr(m_dwVIDReserved);
if (pkInstReserved)
{
float fDistance=pkInstMain->GetDistance(pkInstReserved);
// #0000806: [M2EU] 수룡에게 무사(나한군) 탄환격 스킬 사용 안됨
extern bool IS_HUGE_RACE(unsigned int vnum);
if (IS_HUGE_RACE(pkInstReserved->GetRace())) // 거대 종족은 근접을 못함
{
fDistance -= 200.0f; // TEMP: 일단 하드 코딩 처리. 정석적으로는 바운드 스피어를 고려해야함
}
if (fDistance < float(m_dwSkillRangeReserved))
{
// 접근 도중 Target 이 바뀌어 있을 수도 있다 - [levites]
SetTarget(m_dwVIDReserved);
if (__UseSkill(m_dwSkillSlotIndexReserved))
__ClearReservedAction();
}
else
{
pkInstMain->NEW_MoveToDestInstanceDirection(*pkInstReserved);
}
}
else
{
__ClearReservedAction();
}
break;
}
}
if (m_isSmtMov)
__OnPressSmart(*pkInstMain, false);
if (m_isDirMov)
NEW_MoveToMouseScreenDirection();
if (m_isDirKey)
NEW_SetMultiDirKeyState(m_isLeft, m_isRight, m_isUp, m_isDown);
if (m_isAtkKey)
NEW_Attack();
m_iComboOld=pkInstMain->GetComboIndex();
}
BOOL CPythonPlayer::__IsRightButtonSkillMode()
{
return MBF_SKILL == m_aeMBFButton[MBT_RIGHT];
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,991 @@
#include "StdAfx.h"
#include "PythonPlayer.h"
#include "PythonTextTail.h"
#include "PythonNetworkStream.h"
#include "InstanceBase.h"
#include "PythonChat.h"
#include "PythonGuild.h"
#include "../GameLib/ItemManager.h"
void CPythonPlayer::ClearAffects()
{
PyCallClassMemberFunc(m_ppyGameWindow, "ClearAffects", Py_BuildValue("()"));
}
void CPythonPlayer::SetAffect(UINT uAffect)
{
PyCallClassMemberFunc(m_ppyGameWindow, "SetAffect", Py_BuildValue("(i)", uAffect));
/////
DWORD dwSkillIndex;
if (!AffectIndexToSkillIndex(uAffect, &dwSkillIndex))
return;
CPythonSkill::TSkillData * pSkillData;
if (!CPythonSkill::Instance().GetSkillData(dwSkillIndex, &pSkillData))
return;
if (!pSkillData->IsToggleSkill())
return;
DWORD dwSkillSlotIndex;
if (!GetSkillSlotIndex(dwSkillIndex, &dwSkillSlotIndex))
return;
__ActivateSkillSlot(dwSkillSlotIndex);
}
void CPythonPlayer::ResetAffect(UINT uAffect)
{
// 2004.07.17.myevan.스킬 아닌 이펙트가 안 사라지는 문제
PyCallClassMemberFunc(m_ppyGameWindow, "ResetAffect", Py_BuildValue("(i)", uAffect));
DWORD dwSkillIndex;
if (!AffectIndexToSkillIndex(uAffect, &dwSkillIndex))
return;
CPythonSkill::TSkillData * pSkillData;
if (!CPythonSkill::Instance().GetSkillData(dwSkillIndex, &pSkillData))
return;
if (!pSkillData->IsToggleSkill())
return;
DWORD dwSkillSlotIndex;
if (!GetSkillSlotIndex(dwSkillIndex, &dwSkillSlotIndex))
return;
__DeactivateSkillSlot(dwSkillSlotIndex);
}
bool CPythonPlayer::FindSkillSlotIndexBySkillIndex(DWORD dwSkillIndex, DWORD * pdwSkillSlotIndex)
{
for (int i = 0; i < SKILL_MAX_NUM; ++i)
{
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[i];
if (dwSkillIndex == rkSkillInst.dwIndex)
{
*pdwSkillSlotIndex = i;
return true;
}
}
return false;
}
void CPythonPlayer::ChangeCurrentSkillNumberOnly(DWORD dwSlotIndex)
{
if (dwSlotIndex >= SKILL_MAX_NUM)
return;
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSlotIndex];
CPythonSkill::TSkillData * pSkillData;
if (!CPythonSkill::Instance().GetSkillData(rkSkillInst.dwIndex, &pSkillData))
return;
if (!pSkillData->IsCanUseSkill())
return;
if (!__IsRightButtonSkillMode())
{
if (!__IsTarget())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_TARGET"));
return;
}
ClickSkillSlot(dwSlotIndex);
}
else
{
m_dwcurSkillSlotIndex = dwSlotIndex;
PyCallClassMemberFunc(m_ppyGameWindow, "ChangeCurrentSkill", Py_BuildValue("(i)", dwSlotIndex));
}
}
void CPythonPlayer::ClickSkillSlot(DWORD dwSlotIndex)
{
if (dwSlotIndex >= SKILL_MAX_NUM)
return;
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSlotIndex];
CPythonSkill::TSkillData * pSkillData;
if (!CPythonSkill::Instance().GetSkillData(rkSkillInst.dwIndex, &pSkillData))
return;
if (CPythonSkill::SKILL_TYPE_GUILD == pSkillData->byType)
{
UseGuildSkill(dwSlotIndex);
return;
}
if (!pSkillData->IsCanUseSkill())
return;
if (pSkillData->IsStandingSkill())
{
if (pSkillData->IsToggleSkill())
{
if (IsSkillActive(dwSlotIndex))
{
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
if (pkInstMain->IsUsingSkill())
return;
CPythonNetworkStream::Instance().SendUseSkillPacket(rkSkillInst.dwIndex);
return;
}
}
__UseSkill(dwSlotIndex);
return;
}
if (m_dwcurSkillSlotIndex == dwSlotIndex)
{
__UseSkill(m_dwcurSkillSlotIndex);
return;
}
if (!__IsRightButtonSkillMode())
{
__UseSkill(dwSlotIndex);
}
else
{
m_dwcurSkillSlotIndex = dwSlotIndex;
PyCallClassMemberFunc(m_ppyGameWindow, "ChangeCurrentSkill", Py_BuildValue("(i)", dwSlotIndex));
}
}
bool CPythonPlayer::__CheckSkillUsable(DWORD dwSlotIndex)
{
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return false;
if (dwSlotIndex >= SKILL_MAX_NUM)
return false;
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSlotIndex];
CPythonSkill::TSkillData * pSkillData;
if (!CPythonSkill::Instance().GetSkillData(rkSkillInst.dwIndex, &pSkillData))
return false;
if (pkInstMain->IsMountingHorse())
{
if (!pSkillData->IsHorseSkill())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NOT_HORSE_SKILL"));
return false;
}
}
if (pSkillData->IsHorseSkill())
{
if (!pkInstMain->IsMountingHorse())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "HAVE_TO_RIDE"));
return false;
}
}
// 2004.07.26.levites - 안전지대에서 공격 못하도록 수정
// NOTE : 공격 스킬은 안전지대에서 사용하지 못합니다 - [levites]
if (pSkillData->IsAttackSkill())
{
if (pkInstMain->IsInSafe())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "IN_SAFE"));
return false;
}
}
// NOTE : 패시브 스킬은 사용하지 못합니다 - [levites]
if (!pSkillData->IsCanUseSkill())
return false;
// if (CPythonSkill::SKILL_TYPE_PASSIVE == pSkillData->byType)
// return false;
// NOTE : [Only Assassin] 빈병이 있는지 체크 합니다.
if (pSkillData->IsNeedEmptyBottle())
{
if (!__HasItem(27995))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_EMPTY_BOTTLE"));
return false;
}
}
// NOTE : [Only Assassin] 독병이 있는지 체크 합니다.
if (pSkillData->IsNeedPoisonBottle())
{
if (!__HasItem(27996))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_POISON_BOTTLE"));
return false;
}
}
// NOTE : 낚시 중일때는 스킬을 사용하지 못합니다.
if (pkInstMain->IsFishingMode())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "REMOVE_FISHING_ROD"));
return false;
}
// NOTE : 레벨 체크
if (m_sysIsLevelLimit)
{
if (rkSkillInst.iLevel <= 0)
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NOT_YET_LEARN"));
return false;
}
}
// NOTE : 들고 있는 무기 체크
if (!pSkillData->CanUseWeaponType(pkInstMain->GetWeaponType()))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NOT_MATCHABLE_WEAPON"));
return false;
}
if (!pSkillData->IsHorseSkill()) // HORSE 스킬 중에 화살을 쓰지 않는 스킬이 있기 때문에
{
if (__CheckShortArrow(rkSkillInst, *pSkillData))
return false;
// NOTE : 활이 필요할 경우 화살 개수 체크
if (pSkillData->IsNeedBow())
{
if (!__HasEnoughArrow())
return false;
}
}
if (__CheckDashAffect(*pkInstMain))
{
if (!pSkillData->IsChargeSkill())
{
if (__CheckRestSkillCoolTime(dwSlotIndex))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "WAIT_COOLTIME"));
return false;
}
}
}
else
{
if (__CheckRestSkillCoolTime(dwSlotIndex))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "WAIT_COOLTIME"));
return false;
}
if (__CheckShortLife(rkSkillInst, *pSkillData))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NOT_ENOUGH_HP"));
return false;
}
if (__CheckShortMana(rkSkillInst, *pSkillData))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NOT_ENOUGH_SP"));
return false;
}
}
return true;
}
bool CPythonPlayer::__CheckShortArrow(TSkillInstance & rkSkillInst, CPythonSkill::TSkillData& rkSkillData)
{
if (!rkSkillData.IsNeedBow())
return false;
if (__HasEnoughArrow())
return false;
return true;
}
bool CPythonPlayer::__CheckShortMana(TSkillInstance& rkSkillInst, CPythonSkill::TSkillData& rkSkillData)
{
extern const DWORD c_iSkillIndex_Summon;
if (c_iSkillIndex_Summon == rkSkillInst.dwIndex)
return false;
int iNeedSP = rkSkillData.GetNeedSP(rkSkillInst.fcurEfficientPercentage);
int icurSP = GetStatus(POINT_SP);
// NOTE : ToggleSkill 이 아닌데 소모 SP 가 0 이다.
if (!rkSkillData.IsToggleSkill())
{
if (iNeedSP == 0)
{
CPythonChat::Instance().AppendChat(CHAT_TYPE_INFO, "!!! Find strange game data. Please reinstall metin2.");
return true;
}
}
if (rkSkillData.CanUseIfNotEnough())
{
if (icurSP <= 0)
return true;
}
else
{
if (-1 != iNeedSP)
if (iNeedSP > icurSP)
return true;
}
return false;
}
bool CPythonPlayer::__CheckShortLife(TSkillInstance& rkSkillInst, CPythonSkill::TSkillData& rkSkillData)
{
if (!rkSkillData.IsUseHPSkill())
return false;
DWORD dwNeedHP = rkSkillData.GetNeedSP(rkSkillInst.fcurEfficientPercentage);
if (dwNeedHP <= GetStatus(POINT_HP))
return false;
return true;
}
bool CPythonPlayer::__CheckRestSkillCoolTime(DWORD dwSlotIndex)
{
if (!m_sysIsCoolTime)
return false;
if (dwSlotIndex >= SKILL_MAX_NUM)
return false;
float fElapsedTime = CTimer::Instance().GetCurrentSecond() - m_playerStatus.aSkill[dwSlotIndex].fLastUsedTime;
if (fElapsedTime >= m_playerStatus.aSkill[dwSlotIndex].fCoolTime)
return false;
return true;
}
bool CPythonPlayer::__CheckDashAffect(CInstanceBase& rkInstMain)
{
return rkInstMain.IsAffect(CInstanceBase::AFFECT_DASH);
}
void CPythonPlayer::__UseCurrentSkill()
{
__UseSkill(m_dwcurSkillSlotIndex);
}
DWORD CPythonPlayer::__GetSkillTargetRange(CPythonSkill::TSkillData& rkSkillData)
{
return rkSkillData.GetTargetRange() + GetStatus(POINT_BOW_DISTANCE)*100;
}
bool CPythonPlayer::__ProcessEnemySkillTargetRange(CInstanceBase& rkInstMain, CInstanceBase& rkInstTarget, CPythonSkill::TSkillData& rkSkillData, DWORD dwSkillSlotIndex)
{
DWORD dwSkillTargetRange=__GetSkillTargetRange(rkSkillData);
float fSkillTargetRange = float(dwSkillTargetRange);
if (fSkillTargetRange <= 0.0f)
return true;
// #0000806: [M2EU] 수룡에게 무사(나한군) 탄환격 스킬 사용 안됨
float fTargetDistance = rkInstMain.GetDistance(&rkInstTarget);
extern bool IS_HUGE_RACE(unsigned int vnum);
if (IS_HUGE_RACE(rkInstTarget.GetRace()))
{
fTargetDistance -= 200.0f; // TEMP: 일단 하드 코딩 처리. 정석적으로는 바운드 스피어를 고려해야함
}
if (fTargetDistance >= fSkillTargetRange)
{
if (rkSkillData.IsChargeSkill())
{
if (!__IsReservedUseSkill(dwSkillSlotIndex))
__SendUseSkill(dwSkillSlotIndex, 0);
}
__ReserveUseSkill(rkInstTarget.GetVirtualID(), dwSkillSlotIndex, dwSkillTargetRange);
return false;
}
// 2004.07.05.myevan. 궁신탄영 사용시 맵에 끼임. 사용하기전 갈수 있는곳 체크
TPixelPosition kPPosTarget;
rkInstTarget.NEW_GetPixelPosition(&kPPosTarget);
IBackground& rkBG=IBackground::Instance();
if (rkBG.IsBlock(kPPosTarget.x, kPPosTarget.y))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "CANNOT_APPROACH"));
return false;
}
return true;
}
bool CPythonPlayer::__CanUseSkill()
{
CInstanceBase* pkInstMain=NEW_GetMainActorPtr();
if (!pkInstMain)
return false;
if (IsObserverMode())
return false;
// Fix me
// 뉴마운트. 승마스킬레벨 20 미만인 경우, 고급 마운트를 타고 승마 관련 스킬 못 쓰도록 못하도록 하드 코딩...
// 나중에 시간 나면 can use skill 체크를 서버에서 해주자...
if (pkInstMain->IsMountingHorse() && (GetSkillGrade(109) < 1 && GetSkillLevel(109) < 20))
{
return false;
}
return pkInstMain->CanUseSkill();
}
bool CPythonPlayer::__UseSkill(DWORD dwSlotIndex)
{
// PrivateShop
if (IsOpenPrivateShop())
{
return true;
}
if (!__CanUseSkill())
{
return false;
}
if (dwSlotIndex >= SKILL_MAX_NUM)
{
Tracenf("CPythonPlayer::__UseSkill(dwSlotIndex=%d) It's not available skill slot number", dwSlotIndex);
return false;
}
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSlotIndex];
if (__CheckSpecialSkill(rkSkillInst.dwIndex))
{
return true;
}
CPythonSkill::TSkillData * pSkillData;
if (!CPythonSkill::Instance().GetSkillData(rkSkillInst.dwIndex, &pSkillData))
{
Tracenf("CPythonPlayer::__UseSkill(dwSlotIndex=%d) There is no skill data", dwSlotIndex);
return false;
}
if (pSkillData->IsToggleSkill())
{
if (IsSkillActive(dwSlotIndex))
{
CPythonNetworkStream::Instance().SendUseSkillPacket(rkSkillInst.dwIndex, dwSlotIndex);
return false;
}
}
if (!__CheckSkillUsable(dwSlotIndex))
{
return false;
}
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
{
Tracenf("CPythonPlayer::__UseSkill(dwSlotIndex=%d) There is no main player", dwSlotIndex);
return false;
}
if (pkInstMain->IsUsingSkill())
{
return false;
}
CInstanceBase * pkInstTarget = NULL;
// NOTE : 타겟이 필요한 경우
if (pSkillData->IsNeedTarget() ||
pSkillData->CanChangeDirection() ||
pSkillData->IsAutoSearchTarget())
{
if (pSkillData->IsNeedCorpse())
pkInstTarget=__GetDeadTargetInstancePtr();
else
pkInstTarget=__GetAliveTargetInstancePtr();
// 현재 타겟이 없으면..
if (!pkInstTarget)
{
// 업데이트하고..
__ChangeTargetToPickedInstance();
// 다시 얻어낸다.
if (pSkillData->IsNeedCorpse())
pkInstTarget=__GetDeadTargetInstancePtr();
else
pkInstTarget=__GetAliveTargetInstancePtr();
}
if (pkInstTarget)
{
if (pSkillData->IsOnlyForAlliance())
{
if (pkInstMain == pkInstTarget)
{
if (!pSkillData->CanUseForMe())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "CANNOT_USE_SELF"));
return false;
}
}
else if (!pkInstMain->IsAttackableInstance(*pkInstTarget) && pkInstTarget->IsPC())
{
DWORD dwSkillRange = __GetSkillTargetRange(*pSkillData);
if (dwSkillRange > 0)
{
float fDistance=pkInstMain->GetDistance(pkInstTarget);
if (fDistance>=float(dwSkillRange))
{
__ReserveUseSkill(pkInstTarget->GetVirtualID(), dwSlotIndex, dwSkillRange);
return false;
}
}
}
else
{
if (pSkillData->CanUseForMe())
{
pkInstTarget = pkInstMain;
Tracef(" [ALERT] \265\277\267\341\277\241\260\324 \273\347\277\353\307\317\264\302 \261\342\274\372\300\323\277\241\265\265 \300\373\277\241\260\324 \305\270\260\331\306\303 \265\307\276\356\300\326\276\356\274\255 \300\332\275\305\277\241\260\324\267\316 \300\347\274\263\301\244\n");
}
else
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "ONLY_FOR_ALLIANCE"));
return false;
}
}
}
else
{
if (pkInstTarget->IsInSafe())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "CANNOT_ATTACK_ENEMY_IN_SAFE_AREA"));
return false;
}
if (pkInstMain->IsAttackableInstance(*pkInstTarget))
{
if (!__ProcessEnemySkillTargetRange(*pkInstMain, *pkInstTarget, *pSkillData, dwSlotIndex))
return false;
}
else
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "CANNOT_ATTACK"));
return false;
}
}
pkInstMain->SetFlyTargetInstance(*pkInstTarget);
if (pkInstMain != pkInstTarget)
{
if (pkInstMain->IsFlyTargetObject())
{
pkInstMain->NEW_LookAtFlyTarget();
}
else
{
pkInstMain->NEW_LookAtDestInstance(*pkInstTarget);
}
}
}
else
{
if (pSkillData->IsAutoSearchTarget())
{
if (pkInstMain->NEW_GetFrontInstance(&pkInstTarget, 2000.0f))
{
SetTarget(pkInstTarget->GetVirtualID());
if (!__ProcessEnemySkillTargetRange(*pkInstMain, *pkInstTarget, *pSkillData, dwSlotIndex))
return false;
}
else
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_TARGET"));
return false;
}
}
if (pSkillData->CanUseForMe())
{
pkInstTarget = pkInstMain;
pkInstMain->SetFlyTargetInstance(*pkInstMain);
Tracef(" [ALERT] \305\270\260\331\300\314 \276\370\276\356\274\255 \307\303\267\271\300\314\276\356\277\241\260\324 \273\347\277\353\307\325\264\317\264\331\n");
}
else if (pSkillData->IsNeedCorpse())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "ONLY_FOR_CORPSE"));
return false;
}
else
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_TARGET"));
return false;
}
}
}
if (pSkillData->CanChangeDirection())
{
DWORD dwPickedActorID;
TPixelPosition kPPosPickedGround;
if (pkInstTarget && pkInstTarget!=pkInstMain)
{
pkInstMain->NEW_LookAtDestInstance(*pkInstTarget);
}
else if (__GetPickedActorID(&dwPickedActorID))
{
CInstanceBase* pkInstVictim=NEW_FindActorPtr(dwPickedActorID);
if (pkInstVictim)
pkInstMain->NEW_LookAtDestInstance(*pkInstVictim);
}
else if (__GetPickedGroundPos(&kPPosPickedGround))
{
pkInstMain->NEW_LookAtDestPixelPosition(kPPosPickedGround);
}
else
{
Tracenf("CPythonPlayer::__UseSkill(%d) - \310\255\270\351 \261\342\301\330 \271\346\307\342 \274\263\301\244\300\273 \307\330\276\337\307\324", dwSlotIndex);
}
}
// 관격술 처리
DWORD dwTargetMaxCount = pSkillData->GetTargetCount(rkSkillInst.fcurEfficientPercentage);
DWORD dwRange = __GetSkillTargetRange(*pSkillData);
if (dwTargetMaxCount>0 && pkInstTarget)
{
DWORD dwTargetCount=1;
std::vector<CInstanceBase*> kVct_pkInstTarget;
if (pSkillData->IsFanRange())
{
if (pkInstMain->NEW_GetInstanceVectorInFanRange(float(dwRange), *pkInstTarget, &kVct_pkInstTarget))
{
std::vector<CInstanceBase*>::iterator i;
for (i=kVct_pkInstTarget.begin(); i!=kVct_pkInstTarget.end(); ++i)
{
if (dwTargetCount>=dwTargetMaxCount)
break;
CInstanceBase* pkInstEach=*i;
if (pkInstTarget!=pkInstEach && !pkInstEach->IsDead())
{
pkInstMain->AddFlyTargetInstance(*pkInstEach);
CPythonNetworkStream::Instance().SendAddFlyTargetingPacket(pkInstEach->GetVirtualID(), pkInstEach->GetGraphicThingInstanceRef().OnGetFlyTargetPosition());
dwTargetCount++;
}
}
}
}
else if (pSkillData->IsCircleRange())
{
if (pkInstMain->NEW_GetInstanceVectorInCircleRange(float(dwRange), &kVct_pkInstTarget))
{
std::vector<CInstanceBase*>::iterator i;
for (i=kVct_pkInstTarget.begin(); i!=kVct_pkInstTarget.end(); ++i)
{
if (dwTargetCount>=dwTargetMaxCount)
break;
CInstanceBase* pkInstEach=*i;
if (pkInstTarget!=pkInstEach && !pkInstEach->IsDead())
{
pkInstMain->AddFlyTargetInstance(*pkInstEach);
CPythonNetworkStream::Instance().SendAddFlyTargetingPacket(pkInstEach->GetVirtualID(), pkInstEach->GetGraphicThingInstanceRef().OnGetFlyTargetPosition());
dwTargetCount++;
}
}
}
}
if (dwTargetCount<dwTargetMaxCount)
{
while (dwTargetCount<dwTargetMaxCount)
{
TPixelPosition kPPosDst;
pkInstMain->NEW_GetRandomPositionInFanRange(*pkInstTarget, &kPPosDst);
kPPosDst.x=kPPosDst.x;
kPPosDst.y=-kPPosDst.y;
pkInstMain->AddFlyTargetPosition(kPPosDst);
CPythonNetworkStream::Instance().SendAddFlyTargetingPacket(0, kPPosDst);
dwTargetCount++;
}
}
}
/////
// NOTE : 멀리서 적을 클릭해놓고 스킬을 쓰면 스킬을 쓴뒤 바로 적을 공격하는 문제를 수정하기 위한 코드 - [levites]
__ClearReservedAction();
/////
if (!pSkillData->IsNoMotion())
{
DWORD dwMotionIndex = pSkillData->GetSkillMotionIndex(rkSkillInst.iGrade);
DWORD dwLoopCount = pSkillData->GetMotionLoopCount(rkSkillInst.fcurEfficientPercentage);
if (!pkInstMain->NEW_UseSkill(rkSkillInst.dwIndex, dwMotionIndex, dwLoopCount, pSkillData->IsMovingSkill() ? true : false))
{
Tracenf("CPythonPlayer::__UseSkill(%d) - pkInstMain->NEW_UseSkill - ERROR", dwSlotIndex);
return false;
}
}
DWORD dwTargetVID=pkInstTarget ? pkInstTarget->GetVirtualID() : 0;
__SendUseSkill(dwSlotIndex, dwTargetVID);
return true;
}
void CPythonPlayer::__SendUseSkill(DWORD dwSkillSlotIndex, DWORD dwTargetVID)
{
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSkillSlotIndex];
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
rkNetStream.SendUseSkillPacket(rkSkillInst.dwIndex, dwTargetVID);
__RunCoolTime(dwSkillSlotIndex);
}
BYTE CPythonPlayer::__GetSkillType(DWORD dwSkillSlotIndex)
{
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSkillSlotIndex];
CPythonSkill::TSkillData * pkSkillData;
CPythonSkill& rkPythonSkill = CPythonSkill::Instance();
if (!rkPythonSkill.GetSkillData(rkSkillInst.dwIndex, &pkSkillData))
{
//TraceError("CPythonPlayer::__GetSkillType(dwSkillSlotIndex=%d) - NOT CHECK", dwSkillSlotIndex);
return 0;
}
return pkSkillData->GetType();
}
void CPythonPlayer::__RunCoolTime(DWORD dwSkillSlotIndex)
{
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSkillSlotIndex];
CPythonSkill::TSkillData * pkSkillData;
if (!CPythonSkill::Instance().GetSkillData(rkSkillInst.dwIndex, &pkSkillData))
{
TraceError("CPythonPlayer::__SendUseSkill(dwSkillSlotIndex=%d) - NOT CHECK", dwSkillSlotIndex);
return;
}
CPythonSkill::TSkillData& rkSkillData=*pkSkillData;
rkSkillInst.fCoolTime = rkSkillData.GetSkillCoolTime(rkSkillInst.fcurEfficientPercentage);
rkSkillInst.fLastUsedTime = CTimer::Instance().GetCurrentSecond();
int iSpd = 100 - GetStatus(POINT_CASTING_SPEED);
if (iSpd > 0)
iSpd = 100 + iSpd;
else if (iSpd < 0)
iSpd = 10000 / (100 - iSpd);
else
iSpd = 100;
rkSkillInst.fCoolTime = rkSkillInst.fCoolTime * iSpd / 100;
PyCallClassMemberFunc(m_ppyGameWindow, "RunUseSkillEvent", Py_BuildValue("(if)", dwSkillSlotIndex, rkSkillInst.fCoolTime));
}
bool CPythonPlayer::__HasEnoughArrow()
{
CItemData * pItemData;
if (CItemManager::Instance().GetItemDataPointer(GetItemIndex(TItemPos(INVENTORY, c_Equipment_Arrow)), &pItemData))
if (CItemData::ITEM_TYPE_WEAPON == pItemData->GetType())
if (CItemData::WEAPON_ARROW == pItemData->GetSubType())
{
return true;
}
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShotError", Py_BuildValue("(is)", GetMainCharacterIndex(), "EMPTY_ARROW"));
return false;
}
bool CPythonPlayer::__HasItem(DWORD dwItemID)
{
for (int i = 0; i < c_Inventory_Count; ++i)
{
if (dwItemID == GetItemIndex(TItemPos (INVENTORY, i)))
return true;
}
for (int i = 0; i < c_DragonSoul_Inventory_Count; ++i)
{
if (dwItemID == GetItemIndex(TItemPos (DRAGON_SOUL_INVENTORY, i)))
return true;
}
return false;
}
extern const DWORD c_iSkillIndex_Tongsol;
extern const DWORD c_iSkillIndex_Fishing;
extern const DWORD c_iSkillIndex_Mining;
extern const DWORD c_iSkillIndex_Making;
extern const DWORD c_iSkillIndex_Combo;
extern const DWORD c_iSkillIndex_Language1;
extern const DWORD c_iSkillIndex_Language2;
extern const DWORD c_iSkillIndex_Language3;
extern const DWORD c_iSkillIndex_Polymorph;
void CPythonPlayer::UseGuildSkill(DWORD dwSkillSlotIndex)
{
CInstanceBase* pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
if (!pkInstMain->CanUseSkill())
return;
///////////////////////////////////////////////////////////////////////////////////////////////
if (dwSkillSlotIndex >= SKILL_MAX_NUM)
{
Tracenf("CPythonPlayer::UseGuildSkill(dwSkillSlotIndex=%d) It's not available skill slot number", dwSkillSlotIndex);
return;
}
TSkillInstance & rkSkillInst = m_playerStatus.aSkill[dwSkillSlotIndex];
DWORD dwSkillIndex = rkSkillInst.dwIndex;
CPythonSkill::TSkillData * pSkillData;
if (!CPythonSkill::Instance().GetSkillData(dwSkillIndex, &pSkillData))
return;
if (__CheckRestSkillCoolTime(dwSkillSlotIndex))
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "WAIT_COOLTIME"));
return;
}
if (pSkillData->IsOnlyForGuildWar())
{
if (!CPythonGuild::Instance().IsDoingGuildWar())
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "ONLY_FOR_GUILD_WAR"));
return;
}
}
DWORD dwMotionIndex = pSkillData->GetSkillMotionIndex();
if (!pkInstMain->NEW_UseSkill(dwSkillIndex, dwMotionIndex, 1, false))
{
Tracenf("CPythonPlayer::UseGuildSkill(%d) - pkInstMain->NEW_UseSkill - ERROR", dwSkillIndex);
}
///////////////////////////////////////////////////////////////////////////////////////////////
CPythonNetworkStream::Instance().SendGuildUseSkillPacket(dwSkillIndex, 0);
__RunCoolTime(dwSkillSlotIndex);
}
void CPythonPlayer::SetComboSkillFlag(BOOL bFlag)
{
DWORD dwSlotIndex;
if (!GetSkillSlotIndex(c_iSkillIndex_Combo, &dwSlotIndex))
{
Tracef("CPythonPlayer::SetComboSkillFlag(killIndex=%d) - Can't Find Slot Index\n", c_iSkillIndex_Combo);
return;
}
int iLevel = GetSkillLevel(dwSlotIndex);
if (iLevel <= 0)
{
Tracef("CPythonPlayer::SetComboSkillFlag(skillIndex=%d, skillLevel=%d) - Invalid Combo Skill Level\n", c_iSkillIndex_Combo, iLevel);
return;
}
iLevel = MIN(iLevel, 2);
CInstanceBase* pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
if (bFlag)
{
pkInstMain->SetComboType(iLevel);
__ActivateSkillSlot(dwSlotIndex);
}
else
{
pkInstMain->SetComboType(0);
__DeactivateSkillSlot(dwSlotIndex);
}
}
bool CPythonPlayer::__CheckSpecialSkill(DWORD dwSkillIndex)
{
CInstanceBase* pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return false;
// Fishing
if (c_iSkillIndex_Fishing == dwSkillIndex)
{
if (pkInstMain->IsFishingMode())
{
NEW_Fishing();
}
else
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "EQUIP_FISHING_ROD"));
}
return true;
}
// Combo
else if (c_iSkillIndex_Combo == dwSkillIndex)
{
DWORD dwSlotIndex;
if (!GetSkillSlotIndex(dwSkillIndex, &dwSlotIndex))
return false;
int iLevel = GetSkillLevel(dwSlotIndex);
if (iLevel > 0)
{
CPythonNetworkStream::Instance().SendUseSkillPacket(dwSkillIndex);
}
else
{
PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NOT_YET_LEARN"));
}
return true;
}
return false;
}
@@ -46,5 +46,6 @@ void initpack();
void initapp(); void initapp();
void initchr(); void initchr();
void initchrmgr(); void initchrmgr();
void initPlayer();
void initChat(); void initChat();
void initnet(); void initnet();
+41 -4
View File
@@ -509,9 +509,46 @@ bool FakeLoginServer::ServeGame(Connection& c, int index)
return Fail(name + ": CG_PONG after the entergame burst: " + error); return Fail(name + ": CG_PONG after the entergame burst: " + error);
Event(name + ":burst_pong"); Event(name + ":burst_pong");
// Hold the connection until the test stops us. // Then hold the connection until the test stops us, reading what the game phase sends the way
std::uint8_t byte = 0; // CInputProcessor::Process frames it (static size or TDynamicSizePacketHeader, then the sequence
while (!m_stop && c.Read(&byte, 1) == 1) // byte). A CG_MOVE (input_main.cpp CInputMain::Move) becomes "<name>:move <func> <arg> <rot> <x> <y>".
; for (;;)
{
std::uint8_t packet[1024] = {};
if (c.Read(packet, 1) != 1)
return true; return true;
const std::uint8_t header = packet[0];
size_t size = static_cast<size_t>(packet_size_cg(header));
if (is_dynamic_cg(header) || header == HDR_CG_SYNC_POSITION)
{
if (c.Read(packet + 1, sizeof(DynHead) - 1) != 1)
return true;
DynHead head;
std::memcpy(&head, packet, sizeof(head));
size = head.size;
if (size < sizeof(DynHead) || size > sizeof(packet) ||
(size > sizeof(DynHead) && c.Read(packet + sizeof(DynHead), size - sizeof(DynHead)) != 1))
return Fail(name + ": dynamic CG packet " + std::to_string(header) + " in the game phase");
}
else if (size == 0 || size > sizeof(packet))
return Fail(name + ": unknown CG header " + std::to_string(header) + " in the game phase");
else if (size > 1 && c.Read(packet + 1, size - 1) != 1)
return true;
if (is_sequence_cg(header))
{
std::uint8_t sequence = 0;
if (c.Read(&sequence, 1) != 1)
return true;
if (sequence != SEQUENCE_TABLE[c.sequence])
return Fail(name + ": SEQUENCE mismatch on CG header " + std::to_string(header));
c.sequence = (c.sequence + 1) % SEQUENCE_TABLE_SIZE;
}
if (header == HDR_CG_MOVE)
{
CGMove move;
std::memcpy(&move, packet, sizeof(move));
Event(name + ":move " + std::to_string(move.func) + " " + std::to_string(move.arg) + " " +
std::to_string(move.rot) + " " + std::to_string(move.x) + " " + std::to_string(move.y));
}
}
} }
+37 -1
View File
@@ -377,6 +377,42 @@ int main(int argc, char** argv)
return false; return false;
}; };
CHECK(pump_until(3, character_draw)); CHECK(pump_until(3, character_draw));
// 7. (批次 2V3) Keyboard movement through the original path: the key reaches game.GameWindow's
// onPressKeyDict, MoveUp calls player.SetSingleDIKKeyState(DIK_UP, True), CPythonPlayer turns
// it into NEW_MoveToDirection on the main instance, and CPythonPlayerEventHandler::OnMove sends
// CG_MOVE FUNC_MOVE. Releasing the key stops the actor (OnStop: FUNC_WAIT at the new position).
TPixelPosition start = {};
if (main_instance)
main_instance->NEW_GetPixelPosition(&start);
auto walked = [&] {
TPixelPosition now = {};
main_instance->NEW_GetPixelPosition(&now);
return std::hypot(now.x - start.x, now.y - start.y);
};
PythonBoot::UIKey(DIK_UP, true);
CHECK(main_instance && pump_until(3, [&] { return walked() > 100.0f; }));
PythonBoot::UIKey(DIK_UP, false);
CHECK(main_instance && pump_until(2, [&] { return !main_instance->IsWalking(); }));
const float distance = main_instance ? walked() : 0.0f;
std::printf("port_login_flow_test: DIK_UP walked %.0f cm\n", distance);
if (server)
{
// The fake server records "game2:move <func> <arg> <rot> <x> <y>"; x, y are the TPixelPosition
// (y negated back, as SendCharacterStatePacket does) plus the map base the server gave.
auto moves = [&] {
std::vector<std::string> out;
for (const auto& e : server->Events())
if (e.rfind("game2:move ", 0) == 0)
out.push_back(e);
return out;
};
CHECK(pump_until(2, [&] { auto m = moves(); return m.size() >= 2 && m.back().rfind("game2:move 0 ", 0) == 0; }));
const auto m = moves();
CHECK(!m.empty() && m.front().rfind("game2:move 1 0 ", 0) == 0);
for (const auto& e : m)
std::printf("port_login_flow_test: %s\n", e.c_str());
}
} }
if (server) if (server)
{ {
@@ -394,7 +430,7 @@ int main(int argc, char** argv)
if (e.rfind(prefix, 0) == 0) if (e.rfind(prefix, 0) == 0)
want.push_back(e); want.push_back(e);
for (const auto& e : events) for (const auto& e : events)
if (e.rfind(prefix, 0) == 0) if (e.rfind(prefix, 0) == 0 && e.find(":move ") == std::string::npos)
got.push_back(e); got.push_back(e);
CHECK(want == got); CHECK(want == got);
} }
+4
View File
@@ -131,6 +131,10 @@ struct Animation {
float oversampling = 1.0f; float oversampling = 1.0f;
int32_t track_group_count = 0; int32_t track_group_count = 0;
std::vector<TextTrack> text_tracks; // TrackGroups[0].TextTracks std::vector<TextTrack> text_tracks; // TrackGroups[0].TextTracks
// TrackGroups[0].AccumulationFlags / LoopTranslation(root motion:
// 1 = AccumulationExtracted,4 = AccumulationIsVDA)。
int32_t accumulation_flags = 0;
float loop_translation[3] = {0.0f, 0.0f, 0.0f};
std::vector<BoneTrack> tracks; std::vector<BoneTrack> tracks;
// t 处每个 track 的局部 4x4(granny_transform 组合语义,行主序)。 // t 处每个 track 的局部 4x4(granny_transform 组合语义,行主序)。
// out 按 tracks 顺序;bone_index 见各 track。 // out 按 tracks 顺序;bone_index 见各 track。
+11
View File
@@ -109,6 +109,17 @@ bool File::Impl::extract_animation(Ref anim_obj, Ref anim_type, const Skeleton*
out.track_group_count = int32_t(groups.size()); out.track_group_count = int32_t(groups.size());
const auto& tgms = parse_type(mTG->ref_type); const auto& tgms = parse_type(mTG->ref_type);
// TrackGroups[0].AccumulationFlags (Int32) + LoopTranslation (Real32[3])
if (!groups.empty() && groups[0].valid()) {
if (const TypeMember* m = find_member(tgms, "AccumulationFlags"))
out.accumulation_flags = rd_i32(member_slot(groups[0], *m));
if (const TypeMember* m = find_member(tgms, "LoopTranslation")) {
Ref r = member_slot(groups[0], *m);
for (int i = 0; i < 3; ++i)
out.loop_translation[i] = rd_f32(Ref{r.section, r.offset + uint32_t(i) * 4u});
}
}
// TrackGroups[0].TextTracks: RefToArray text_track{String Name; RefToArray Entries( // TrackGroups[0].TextTracks: RefToArray text_track{String Name; RefToArray Entries(
// text_track_entry{Real32 TimeStamp; String Text})}(motion event 用) // text_track_entry{Real32 TimeStamp; String Text})}(motion event 用)
if (!groups.empty() && groups[0].valid()) if (!groups.empty() && groups[0].valid())