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>
156 lines
6.1 KiB
JSON
156 lines
6.1 KiB
JSON
{
|
|
"reference": "UserInterface/PythonPlayerEventHandler.cpp",
|
|
"reference_sha256": "2ef7f3cbb7fb6e9c86815b39a6a85cd83bd793ef460c8e0d8c532e2e585927f5",
|
|
"priority": "P0",
|
|
"contracts": [
|
|
"movement.keyboard.motion"
|
|
],
|
|
"functions": {
|
|
"CPythonPlayerEventHandler::GetSingleton": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::GetSingleton"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::~CPythonPlayerEventHandler": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::~CPythonPlayerEventHandler"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnClearAffects": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnClearAffects"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnSetAffect": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnSetAffect"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnResetAffect": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnResetAffect"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnSyncing": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnSyncing"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnWaiting": {
|
|
"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.",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnWaiting"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnMoving": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnMoving"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnMove": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnMove"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnStop": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnStop"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnWarp": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnWarp"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnAttack": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnAttack"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnUseSkill": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnUseSkill"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnUpdate": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnUpdate"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnChangeShape": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnChangeShape"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::OnHit": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnHit"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::FlushVictimList": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::FlushVictimList"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::CPythonPlayerEventHandler": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CPythonPlayerEventHandler"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnSetFlyTarget": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnSetFlyTarget"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::Set": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::Set"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtAnotherTarget": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtAnotherTarget"
|
|
]
|
|
},
|
|
"CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget": {
|
|
"status": "PORTED",
|
|
"impl": [
|
|
"extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget"
|
|
]
|
|
}
|
|
}
|
|
}
|