diff --git a/audit/history.jsonl b/audit/history.jsonl index 6e59da17..53afd1d5 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -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: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-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"]} diff --git a/audit/port-map/UserInterface/GameType.cpp.json b/audit/port-map/UserInterface/GameType.cpp.json new file mode 100644 index 00000000..d59110b5 --- /dev/null +++ b/audit/port-map/UserInterface/GameType.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonPlayer.cpp.json b/audit/port-map/UserInterface/PythonPlayer.cpp.json new file mode 100644 index 00000000..499b7e4b --- /dev/null +++ b/audit/port-map/UserInterface/PythonPlayer.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonPlayerEventHandler.cpp.json b/audit/port-map/UserInterface/PythonPlayerEventHandler.cpp.json index 41feea45..15101246 100644 --- a/audit/port-map/UserInterface/PythonPlayerEventHandler.cpp.json +++ b/audit/port-map/UserInterface/PythonPlayerEventHandler.cpp.json @@ -7,77 +7,149 @@ ], "functions": { "CPythonPlayerEventHandler::GetSingleton": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::GetSingleton" + ] }, "CPythonPlayerEventHandler::~CPythonPlayerEventHandler": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::~CPythonPlayerEventHandler" + ] }, "CPythonPlayerEventHandler::OnClearAffects": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnClearAffects" + ] }, "CPythonPlayerEventHandler::OnSetAffect": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnSetAffect" + ] }, "CPythonPlayerEventHandler::OnResetAffect": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnResetAffect" + ] }, "CPythonPlayerEventHandler::OnSyncing": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnSyncing" + ] }, "CPythonPlayerEventHandler::OnWaiting": { - "status": "DIVERGENT", - "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." + "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": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnMoving" + ] }, "CPythonPlayerEventHandler::OnMove": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnMove" + ] }, "CPythonPlayerEventHandler::OnStop": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnStop" + ] }, "CPythonPlayerEventHandler::OnWarp": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnWarp" + ] }, "CPythonPlayerEventHandler::OnAttack": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnAttack" + ] }, "CPythonPlayerEventHandler::OnUseSkill": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnUseSkill" + ] }, "CPythonPlayerEventHandler::OnUpdate": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnUpdate" + ] }, "CPythonPlayerEventHandler::OnChangeShape": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnChangeShape" + ] }, "CPythonPlayerEventHandler::OnHit": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::OnHit" + ] }, "CPythonPlayerEventHandler::FlushVictimList": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::FlushVictimList" + ] }, "CPythonPlayerEventHandler::CPythonPlayerEventHandler": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CPythonPlayerEventHandler" + ] }, "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": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot" + ] }, "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": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget" + ] }, "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": { - "status": "TODO" + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonPlayerEventHandler.cpp:CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget" + ] } } } diff --git a/audit/port-map/UserInterface/PythonPlayerInput.cpp.json b/audit/port-map/UserInterface/PythonPlayerInput.cpp.json new file mode 100644 index 00000000..b4ae1df0 --- /dev/null +++ b/audit/port-map/UserInterface/PythonPlayerInput.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonPlayerInputKeyboard.cpp.json b/audit/port-map/UserInterface/PythonPlayerInputKeyboard.cpp.json new file mode 100644 index 00000000..6a4595fb --- /dev/null +++ b/audit/port-map/UserInterface/PythonPlayerInputKeyboard.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonPlayerInputMouse.cpp.json b/audit/port-map/UserInterface/PythonPlayerInputMouse.cpp.json new file mode 100644 index 00000000..ac049466 --- /dev/null +++ b/audit/port-map/UserInterface/PythonPlayerInputMouse.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonPlayerModule.cpp.json b/audit/port-map/UserInterface/PythonPlayerModule.cpp.json new file mode 100644 index 00000000..7b0d89ce --- /dev/null +++ b/audit/port-map/UserInterface/PythonPlayerModule.cpp.json @@ -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" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonPlayerSkill.cpp.json b/audit/port-map/UserInterface/PythonPlayerSkill.cpp.json new file mode 100644 index 00000000..a1929949 --- /dev/null +++ b/audit/port-map/UserInterface/PythonPlayerSkill.cpp.json @@ -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" + ] + } + } +} diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index 642a8775..71cfac4c 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -429,6 +429,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 4. **2V3 — 本地移动**:加入 `PythonPlayer`、`PythonPlayerInput*`、`PythonPlayerEventHandler`、 `InstanceBaseMovement`、`ActorInstance{Motion,Event,Position,Rotation,CollisionDetection}` 的实际依赖闭包。验收为输入经过新路径 改变位置/朝向、发送与 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 宿主。 diff --git a/extension/src/platform/EterGrnLib/GrannyRuntime.cpp b/extension/src/platform/EterGrnLib/GrannyRuntime.cpp index 1cc02bdc..fc1d26ab 100644 --- a/extension/src/platform/EterGrnLib/GrannyRuntime.cpp +++ b/extension/src/platform/EterGrnLib/GrannyRuntime.cpp @@ -1002,12 +1002,46 @@ void GrannyFreeCompletedModelControls(granny_model_instance const* ModelInstance release_control(c); } -// PORT: Metin2 motions carry no root-motion accumulation, so the model matrix passes through. -void GrannyUpdateModelMatrix(granny_model_instance const*, granny_real32, granny_real32 const* ModelMatrix4x4, - granny_real32* DestMatrix4x4, bool) +// PORT: GrannyUpdateModelMatrix reimplemented for constant-extraction root motion only (walk/run carry +// AccumulationFlags=AccumulationExtracted + LoopTranslation, e.g. warrior run (0,-300,0) = .msa Accumulation). +// 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) - std::memmove(DestMatrix4x4, ModelMatrix4x4, sizeof(float) * 16); + if (!ModelMatrix4x4 || !DestMatrix4x4) + 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) diff --git a/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp b/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp index bd505cc1..1c9f71c0 100644 --- a/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp +++ b/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp @@ -7,14 +7,8 @@ #include "UserInterface/PythonBackground.h" #include "EterLib/StateManager.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 "UserInterface/PythonCharacterManager.h" #include "UserInterface/PythonEventManager.h" #include "UserInterface/PythonNetworkStream.h" #include "GameLib/GameEventManager.h" @@ -25,10 +19,13 @@ #include "UserInterface/MarkManager.h" #include "UserInterface/PythonIME.h" #include "UserInterface/PythonApplication.h" +#include "UserInterface/PythonItem.h" +#include "GameLib/ItemManager.h" +#include "UserInterface/InstanceBase.h" #include "UserInterface/AbstractApplication.h" #include "UserInterface/PythonMessenger.h" #include "UserInterface/PythonMiniMap.h" -#include "UserInterface/PythonPlayer.h" +#include "UserInterface/PythonNonPlayer.h" #include "EterLib/Profiler.h" #include "UserInterface/PythonQuest.h" #include "UserInterface/PythonSafeBox.h" @@ -36,6 +33,7 @@ #include "UserInterface/PythonSkill.h" #include "EterBase/Poly/Poly.h" #include "EterPack/EterPackManager.h" +#include "UserInterface/PythonPlayer.h" #include "UserInterface/PythonTextTail.h" // 40250 UserInterface/ServerStateCheckerModule.cpp @@ -473,279 +471,6 @@ void AddStubConstants_nonplayer(PyObject* poModule) 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 void AddStubConstants_profiler(PyObject* poModule) { diff --git a/extension/src/platform/ScriptLib/GameplayModules.cpp b/extension/src/platform/ScriptLib/GameplayModules.cpp index 730d71f4..19629516 100644 --- a/extension/src/platform/ScriptLib/GameplayModules.cpp +++ b/extension/src/platform/ScriptLib/GameplayModules.cpp @@ -18,7 +18,6 @@ void AddStubConstants_item(PyObject* poModule); void AddStubConstants_messenger(PyObject* poModule); void AddStubConstants_miniMap(PyObject* poModule); void AddStubConstants_nonplayer(PyObject* poModule); -void AddStubConstants_player(PyObject* poModule); void AddStubConstants_profiler(PyObject* poModule); void AddStubConstants_quest(PyObject* poModule); void AddStubConstants_safebox(PyObject* poModule); @@ -579,272 +578,6 @@ PyMethodDef methods_nonplayer[] = { { "LoadNonPlayerData", stub_nonplayer_LoadNonPlayerData, METH_VARARGS }, { 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. 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()); } @@ -1252,11 +985,6 @@ void init_2v0_gameplay_stubs() { PyModule_AddIntConstant(module, "__port_stub__", 1); 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); PyModule_AddIntConstant(module, "__port_stub__", 1); diff --git a/extension/src/platform/ScriptLib/PythonBoot.cpp b/extension/src/platform/ScriptLib/PythonBoot.cpp index bff49da6..e68ee5e4 100644 --- a/extension/src/platform/ScriptLib/PythonBoot.cpp +++ b/extension/src/platform/ScriptLib/PythonBoot.cpp @@ -341,6 +341,7 @@ bool run_main_script_body(const char* lpCmdLine, std::string* error) initapp(); initchr(); initchrmgr(); + initPlayer(); initChat(); initnet(); init_2v0_gameplay_stubs(); diff --git a/extension/src/platform/UserInterface/PythonApplication.cpp b/extension/src/platform/UserInterface/PythonApplication.cpp index 13c89f0e..09c5a179 100644 --- a/extension/src/platform/UserInterface/PythonApplication.cpp +++ b/extension/src/platform/UserInterface/PythonApplication.cpp @@ -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 // here gives the same value. 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(); } // 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 @@ -288,6 +291,9 @@ void CPythonApplication::SetCursorVisible(BOOL, bool) { MT_PLATFORM_STUB(); } BOOL CPythonApplication::GetCursorVisible() { MT_PLATFORM_STUB(); return FALSE; } bool CPythonApplication::GetLiarCursorOn() { MT_PLATFORM_STUB(); return false; } 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::SetGlobalCenterPosition(LONG, LONG) { MT_PLATFORM_STUB(); } void CPythonApplication::SetFPS(int) { MT_PLATFORM_STUB(); } @@ -306,7 +312,6 @@ BOOL SKILL_EFFECT_UPGRADE_ENABLE = FALSE; double g_specularSpd = 0; bool LoadLocaleData(const char*) { MT_PLATFORM_STUB(); return false; } -void SetGuildSymbolPath(const char*) { MT_PLATFORM_STUB(); } void TextTail_SetLivingTime(long) { MT_PLATFORM_STUB(); } namespace { // 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 ); } - -// 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; -} diff --git a/extension/src/platform/pending/GameLib/ItemData.cpp b/extension/src/platform/pending/GameLib/ItemData.cpp index bb057866..7e4e6ab2 100644 --- a/extension/src/platform/pending/GameLib/ItemData.cpp +++ b/extension/src/platform/pending/GameLib/ItemData.cpp @@ -95,3 +95,39 @@ auto CItemData::GetAttachingDataPointer(DWORD, const NRaceData::TAttachingData * MT_PLATFORM_STUB(); return mt_platform_stub_return(); } + +auto CItemData::IsAntiFlag(DWORD) const -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::IsEquipment() const -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::IsFlag(DWORD) const -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::HasNextGrade() const -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetWearFlags() const -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetISellItemPrice() const -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/GameLib/ItemManager.cpp b/extension/src/platform/pending/GameLib/ItemManager.cpp index 423fd2f0..6e130484 100644 --- a/extension/src/platform/pending/GameLib/ItemManager.cpp +++ b/extension/src/platform/pending/GameLib/ItemManager.cpp @@ -21,3 +21,15 @@ auto CItemManager::GetItemDataPointer(DWORD, CItemData **) -> BOOL MT_PLATFORM_STUB(); return mt_platform_stub_return(); } + +auto CItemManager::SelectItemData(DWORD) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemManager::GetSelectedItemDataPointer() -> CItemData * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/GameType.cpp b/extension/src/platform/pending/UserInterface/GameType.cpp deleted file mode 100644 index 89f7fbfa..00000000 --- a/extension/src/platform/pending/UserInterface/GameType.cpp +++ /dev/null @@ -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); -} diff --git a/extension/src/platform/pending/UserInterface/Locale.cpp b/extension/src/platform/pending/UserInterface/Locale.cpp new file mode 100644 index 00000000..4cf93362 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/Locale.cpp @@ -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(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonBackground.cpp b/extension/src/platform/pending/UserInterface/PythonBackground.cpp index 9ae07ff7..26acbf6c 100644 --- a/extension/src/platform/pending/UserInterface/PythonBackground.cpp +++ b/extension/src/platform/pending/UserInterface/PythonBackground.cpp @@ -206,3 +206,9 @@ void CPythonBackground::Initialize() SetAtlasInfoFileName(atlas.c_str()); CMapManager::Initialize(); } + +auto CPythonBackground::GetPickingPoint(D3DXVECTOR3 *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonGuild.cpp b/extension/src/platform/pending/UserInterface/PythonGuild.cpp index 95a7b869..5327fb76 100644 --- a/extension/src/platform/pending/UserInterface/PythonGuild.cpp +++ b/extension/src/platform/pending/UserInterface/PythonGuild.cpp @@ -131,3 +131,9 @@ CPythonGuild::~CPythonGuild() { MT_PLATFORM_STUB(); } + +auto CPythonGuild::IsDoingGuildWar() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonItem.cpp b/extension/src/platform/pending/UserInterface/PythonItem.cpp index a2bb16af..e9ec9d60 100644 --- a/extension/src/platform/pending/UserInterface/PythonItem.cpp +++ b/extension/src/platform/pending/UserInterface/PythonItem.cpp @@ -65,3 +65,39 @@ auto CPythonItem::Update(const POINT &) -> void { MT_PLATFORM_STUB(); } + +auto CPythonItem::GetOwnership(DWORD, const char **) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonItem::GetGroundItemPosition(DWORD, TPixelPosition *) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonItem::GetPickedItemID(DWORD *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonItem::GetCloseItem(const TPixelPosition &, DWORD *, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonItem::GetCloseMoney(const TPixelPosition &, DWORD *, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonItem::GetVirtualNumberOfGroundItem(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonMiniMap.cpp b/extension/src/platform/pending/UserInterface/PythonMiniMap.cpp index 8c7aadd6..03aa06c0 100644 --- a/extension/src/platform/pending/UserInterface/PythonMiniMap.cpp +++ b/extension/src/platform/pending/UserInterface/PythonMiniMap.cpp @@ -70,3 +70,9 @@ auto CPythonMiniMap::DeleteTarget(int) -> void { MT_PLATFORM_STUB(); } + +auto CPythonMiniMap::GetGuildAreaID(DWORD, DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonPlayer.cpp b/extension/src/platform/pending/UserInterface/PythonPlayer.cpp deleted file mode 100644 index 1c9ce605..00000000 --- a/extension/src/platform/pending/UserInterface/PythonPlayer.cpp +++ /dev/null @@ -1,1370 +0,0 @@ -// Stand-in for the 40250 logic unit UserInterface/PythonPlayer.cpp, not ported yet: the platform_stub.py skeleton of its -// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit -// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). -#include "UserInterface/StdAfx.h" -#include "UserInterface/PythonPlayer.h" -#include "UserInterface/PythonApplication.h" -#include "UserInterface/PythonCharacterManager.h" -#include "UserInterface/InstanceBase.h" - -#include "../../PlatformStub.h" - -auto CPythonPlayer::SPlayerStatus::SetPoint(UINT, long) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SPlayerStatus::GetPoint(UINT) -> long -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -CPythonPlayer::CPythonPlayer() -{ - MT_PLATFORM_STUB(); - // PORT: the one member the stand-in's ported functions read; 40250's constructor reaches it - // through Clear() (PythonPlayer.cpp:1624). - m_dwMainCharacterIndex = 0; -} - -CPythonPlayer::~CPythonPlayer() -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::PickCloseMoney() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::PickCloseItem() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetGameWindow(PyObject *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetObserverMode(bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::IsObserverMode() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetQuickCameraMode(bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetAttackKeyState(bool) -> void -{ - MT_PLATFORM_STUB(); -} - -// 40250 PythonPlayer.cpp:87, verbatim: UpdateGame centres the camera on the main actor. -void CPythonPlayer::NEW_GetMainActorPosition(TPixelPosition* pkPPosActor) -{ - TPixelPosition kPPosMainActor; - - IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); - CInstanceBase * pInstance = rkPlayer.NEW_GetMainActorPtr(); - if (pInstance) - { - pInstance->NEW_GetPixelPosition(pkPPosActor); - } - else - { - CPythonApplication::Instance().GetCenterPosition(pkPPosActor); - } -} - -auto CPythonPlayer::RegisterEffect(DWORD, const char *, bool) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_SetMouseState(int, int) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_SetMouseFunc(int, int) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_GetMouseFunc(int) -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_SetMouseMiddleButtonState(int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_SetAutoCameraRotationSpeed(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_ResetCameraRotation() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_SetSingleDirKeyState(int, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_SetSingleDIKKeyState(int, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_SetMultiDirKeyState(bool, bool, bool, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_Attack() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_Fishing() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_CancelFishing() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_LookAtFocusActor() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_IsAttackableDistanceFocusActor() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_MoveToDestPixelPositionDirection(const TPixelPosition &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_MoveToMousePickedDirection() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_MoveToMouseScreenDirection() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_MoveToDirection(float) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NEW_Stop() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_IsEmptyReservedDelayTime(float) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetDungeonDestinationPosition(int, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::AlarmHaveToGo() -> void -{ - MT_PLATFORM_STUB(); -} - -// 40250 PythonPlayer.cpp:127 -CInstanceBase* CPythonPlayer::NEW_FindActorPtr(DWORD dwVID) -{ - CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance(); - return rkChrMgr.GetInstancePtr(dwVID); -} - -// 40250 PythonPlayer.cpp -CInstanceBase* CPythonPlayer::NEW_GetMainActorPtr() -{ - return NEW_FindActorPtr(m_dwMainCharacterIndex); -} - -auto CPythonPlayer::Clear() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::ClearSkillDict() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_ClearSkillData(bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::Update() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetPlayTime() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetPlayTime(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -// 40250 PythonPlayer.cpp:276 -// PORT: the main instance's SetEventHandler(CPythonPlayerEventHandler) is left out; the player event -// handler (PythonPlayerEventHandler.cpp) is not ported. -void CPythonPlayer::SetMainCharacterIndex(int iIndex) -{ - m_dwMainCharacterIndex = iIndex; -} - -// 40250 PythonPlayer.cpp:288 -DWORD CPythonPlayer::GetMainCharacterIndex() -{ - return m_dwMainCharacterIndex; -} - -auto CPythonPlayer::IsMainCharacterIndex(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetGuildID() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::NotifyDeletingCharacterInstance(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NotifyCharacterDead(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NotifyCharacterUpdate(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NotifyDeadMainCharacter() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NotifyChangePKMode() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetName() -> const char * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetName(const char *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetRace(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetRace() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetWeaponPower(DWORD, DWORD, DWORD, DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetStatus(DWORD, long) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetStatus(DWORD) -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::MoveItemData(TItemPos, TItemPos) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetItemData(TItemPos, const TItemData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetItemData(TItemPos) const -> const TItemData * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetItemCount(TItemPos, BYTE) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetItemMetinSocket(TItemPos, DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetItemAttribute(TItemPos, DWORD, BYTE, short) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetItemIndex(TItemPos) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetItemFlags(TItemPos) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetItemCount(TItemPos) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetItemCountByVnum(DWORD) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetItemMetinSocket(TItemPos, DWORD) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetItemAttribute(TItemPos, DWORD, BYTE *, short *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SendClickItemPacket(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RequestAddLocalQuickSlot(DWORD, DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RequestAddToEmptyLocalQuickSlot(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RequestMoveGlobalQuickSlotToLocalQuickSlot(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RequestDeleteGlobalQuickSlot(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RequestUseLocalQuickSlot(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::LocalQuickSlotIndexToGlobalQuickSlotIndex(DWORD) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetGlobalQuickSlotData(DWORD, DWORD *, DWORD *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetLocalQuickSlotData(DWORD, DWORD *, DWORD *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RemoveQuickSlotByValue(int, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::IsItem(TItemPos) -> char -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsBeltInventorySlot(TItemPos) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsInventorySlot(TItemPos) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsEquipmentSlot(TItemPos) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsEquipItemInSlot(TItemPos) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetQuickPage() -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetQuickPage(int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::AddQuickSlot(int, char, char) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::DeleteQuickSlot(int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::MoveQuickSlot(int, int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetSkill(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetSkillSlotIndex(DWORD, DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetSkillIndex(DWORD) -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetSkillGrade(DWORD) -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetSkillLevel(DWORD) -> int -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetSkillCurrentEfficientPercentage(DWORD) -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetSkillNextEfficientPercentage(DWORD) -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetSkillLevel(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetSkillLevel_(DWORD, DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::IsToggleSkill(DWORD) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::ClickSkillSlot(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::ChangeCurrentSkillNumberOnly(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::FindSkillSlotIndexBySkillIndex(DWORD, DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetSkillCoolTime(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::EndSkillCoolTime(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetSkillCoolTime(DWORD) -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetSkillElapsedCoolTime(DWORD) -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsSkillActive(DWORD) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsSkillCoolTime(DWORD) -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::UseGuildSkill(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::AffectIndexToSkillSlotIndex(UINT, DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::AffectIndexToSkillIndex(DWORD, DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetAffect(UINT) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::ResetAffect(UINT) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::ClearAffects() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetTarget(DWORD, BOOL) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::OpenCharacterMenu(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetTargetVID() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::ExitParty() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::AppendPartyMember(DWORD, const char *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::LinkPartyMember(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::UnlinkPartyMember(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::UpdatePartyMemberInfo(DWORD, BYTE, BYTE) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::UpdatePartyMemberAffect(DWORD, BYTE, short) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RemovePartyMember(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::IsPartyMemberByVID(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsPartyMemberByName(const char *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetPartyMemberPtr(DWORD, TPartyMemberInfo **) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::PartyMemberPIDToVID(DWORD, DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::PartyMemberVIDToPID(DWORD, DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsSamePartyMember(DWORD, DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::RememberChallengeInstance(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RememberRevengeInstance(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RememberCantFightInstance(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::ForgetInstance(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::IsChallengeInstance(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsRevengeInstance(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::IsCantFightInstance(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::OpenPrivateShop() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::ClosePrivateShop() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::IsOpenPrivateShop() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::StartStaminaConsume(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::StopStaminaConsume(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetPKMode() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetMobileFlag(BOOL) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::HasMobilePhoneNumber() -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::SetComboSkillFlag(BOOL) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::SetMovableGroundDistance(float) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::ActEmotion(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::StartEmotionProcess() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::EndEmotionProcess() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ToggleCoolTime() -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__ToggleLevelLimit() -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__RefLocalQuickSlot(int) -> TQuickSlot & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__RefGlobalQuickSlot(int) -> TQuickSlot & -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetLevelAtk() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetStatAtk() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetWeaponAtk(DWORD) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetTotalAtk(DWORD, DWORD) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetRaceStat() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetHitRate() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetEvadeRate() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__UpdateBattleStatus() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__DeactivateSkillSlot(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ActivateSkillSlot(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnPressSmart(CInstanceBase &, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnClickSmart(CInstanceBase &, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnPressItem(CInstanceBase &, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnPressActor(CInstanceBase &, DWORD, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnPressGround(CInstanceBase &, const TPixelPosition &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnPressScreen(CInstanceBase &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnClickActor(CInstanceBase &, DWORD, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnClickItem(CInstanceBase &, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__OnClickGround(CInstanceBase &, const TPixelPosition &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__IsMovableGroundDistance(CInstanceBase &, const TPixelPosition &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetPickedActorPtr(CInstanceBase **) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetPickedActorID(DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetPickedItemID(DWORD *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetPickedGroundPos(TPixelPosition *) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__ClearReservedAction() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ReserveClickItem(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ReserveClickActor(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ReserveClickGround(const TPixelPosition &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ReserveUseSkill(DWORD, DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ReserveProcess_ClickActor() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ShowPickedEffect(const TPixelPosition &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__SendClickActorPacket(CInstanceBase &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__ClearAutoAttackTargetActorID() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__SetAutoAttackTargetActorID(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_ShowEffect(int, TPixelPosition) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_SetMouseSmartState(int, bool) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_SetMouseMoveState(int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_SetMouseCameraState(int) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_GetMouseDirRotation(float, float, float *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_GetMultiKeyDirRotation(bool, bool, bool, bool, float *) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::GetDegreeFromDirection(int, int) -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::GetDegreeFromPosition(int, int, int, int) -> float -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::CheckCategory(int) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::CheckAbilitySlot(int) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::RefreshKeyWalkingDirection() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::NEW_RefreshMouseWalkingDirection() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::RefreshInstances() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__CanShot(CInstanceBase &, CInstanceBase &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CanUseSkill() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CanMove() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CanAttack() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CanChangeTarget() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CheckSkillUsable(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__UseCurrentSkill() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__UseChargeSkill(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__UseSkill(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CheckSpecialSkill(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CheckRestSkillCoolTime(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CheckShortLife(TSkillInstance &, CPythonSkill::TSkillData &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CheckShortMana(TSkillInstance &, CPythonSkill::TSkillData &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CheckShortArrow(TSkillInstance &, CPythonSkill::TSkillData &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__CheckDashAffect(CInstanceBase &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__SendUseSkill(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__RunCoolTime(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__GetSkillType(DWORD) -> BYTE -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__IsReservedUseSkill(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__IsMeleeSkill(CPythonSkill::TSkillData &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__IsChargeSkill(CPythonSkill::TSkillData &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetSkillTargetRange(CPythonSkill::TSkillData &) -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__SearchNearTarget() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__IsUsingChargeSkill() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__ProcessEnemySkillTargetRange(CInstanceBase &, CInstanceBase &, CPythonSkill::TSkillData &, DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__HasEnoughArrow() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__HasItem(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetPickableDistance() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetTargetActorPtr() -> CInstanceBase * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__ClearTarget() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__GetTargetVID() -> DWORD -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__SetTargetVID(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__IsSameTargetVID(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__IsTarget() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__ChangeTargetToPickedInstance() -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetSkillTargetInstancePtr(CPythonSkill::TSkillData &) -> CInstanceBase * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetAliveTargetInstancePtr() -> CInstanceBase * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__GetDeadTargetInstancePtr() -> CInstanceBase * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__IsRightButtonSkillMode() -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CPythonPlayer::__Update_AutoAttack() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__Update_NotifyGuildAreaEvent() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CPythonPlayer::__IsProcessingEmotion() -> BOOL -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/pending/UserInterface/PythonSkill.cpp b/extension/src/platform/pending/UserInterface/PythonSkill.cpp new file mode 100644 index 00000000..710f01b0 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonSkill.cpp @@ -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(); +} + +auto CPythonSkill::SSkillData::IsToggleSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsChargeSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::GetSkillData(DWORD, TSkillData **) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::GetTargetRange() const -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::CanChangeDirection() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsFanRange() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsCircleRange() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsAutoSearchTarget() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsNeedTarget() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsUseHPSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsStandingSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::CanUseWeaponType(DWORD) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsOnlyForAlliance() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::CanUseForMe() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::CanUseIfNotEnough() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsNeedEmptyBottle() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsNeedPoisonBottle() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsNeedBow() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsAttackSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsHorseSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsMovingSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsOnlyForGuildWar() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::GetSkillCoolTime(float) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::GetNeedSP(float) -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::GetMotionLoopCount(float) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::GetTargetCount(float) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::GetSkillMotionIndex(int) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsCanUseSkill() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::IsNoMotion() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSkill::SSkillData::GetType() const -> BYTE +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/port/UserInterface/GameType.cpp b/extension/src/port/UserInterface/GameType.cpp new file mode 100644 index 00000000..6b0a19e7 --- /dev/null +++ b/extension/src/port/UserInterface/GameType.cpp @@ -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]; +} diff --git a/extension/src/port/UserInterface/PythonPlayer.cpp b/extension/src/port/UserInterface/PythonPlayer.cpp new file mode 100644 index 00000000..ec2f64ab --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayer.cpp @@ -0,0 +1,1731 @@ +#include "StdAfx.h" +#include "PythonPlayerEventHandler.h" +#include "PythonApplication.h" +#include "PythonItem.h" +#include "../EterBase/Timer.h" + +#include "AbstractPlayer.h" + +enum +{ + MAIN_RACE_WARRIOR_M, + MAIN_RACE_ASSASSIN_W, + MAIN_RACE_SURA_M, + MAIN_RACE_SHAMAN_W, + MAIN_RACE_WARRIOR_W, + MAIN_RACE_ASSASSIN_M, + MAIN_RACE_SURA_W, + MAIN_RACE_SHAMAN_M, + MAIN_RACE_MAX_NUM, +}; + +const DWORD POINT_MAGIC_NUMBER = 0xe73ac1da; + +void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long lPoint) +{ + m_alPoint[ePoint]=lPoint ^ POINT_MAGIC_NUMBER; +} + +long CPythonPlayer::SPlayerStatus::GetPoint(UINT ePoint) +{ + return m_alPoint[ePoint] ^ POINT_MAGIC_NUMBER; +} + +bool CPythonPlayer::AffectIndexToSkillIndex(DWORD dwAffectIndex, DWORD * pdwSkillIndex) +{ + if (m_kMap_dwAffectIndexToSkillIndex.end() == m_kMap_dwAffectIndexToSkillIndex.find(dwAffectIndex)) + return false; + + *pdwSkillIndex = m_kMap_dwAffectIndexToSkillIndex[dwAffectIndex]; + return true; +} + +bool CPythonPlayer::AffectIndexToSkillSlotIndex(UINT uAffect, DWORD* pdwSkillSlotIndex) +{ + DWORD dwSkillIndex=m_kMap_dwAffectIndexToSkillIndex[uAffect]; + + return GetSkillSlotIndex(dwSkillIndex, pdwSkillSlotIndex); +} + +bool CPythonPlayer::__GetPickedActorPtr(CInstanceBase** ppkInstPicked) +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + CInstanceBase* pkInstPicked=rkChrMgr.OLD_GetPickedInstancePtr(); + if (!pkInstPicked) + return false; + + *ppkInstPicked=pkInstPicked; + return true; +} + +bool CPythonPlayer::__GetPickedActorID(DWORD* pdwActorID) +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + return rkChrMgr.OLD_GetPickedInstanceVID(pdwActorID); +} + +bool CPythonPlayer::__GetPickedItemID(DWORD* pdwItemID) +{ + CPythonItem& rkItemMgr=CPythonItem::Instance(); + return rkItemMgr.GetPickedItemID(pdwItemID); +} + +bool CPythonPlayer::__GetPickedGroundPos(TPixelPosition* pkPPosPicked) +{ + CPythonBackground& rkBG=CPythonBackground::Instance(); + + TPixelPosition kPPosPicked; + if (rkBG.GetPickingPoint(pkPPosPicked)) + { + pkPPosPicked->y=-pkPPosPicked->y; + return true; + } + + return false; +} + +void CPythonPlayer::NEW_GetMainActorPosition(TPixelPosition* pkPPosActor) +{ + TPixelPosition kPPosMainActor; + + IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); + CInstanceBase * pInstance = rkPlayer.NEW_GetMainActorPtr(); + if (pInstance) + { + pInstance->NEW_GetPixelPosition(pkPPosActor); + } + else + { + CPythonApplication::Instance().GetCenterPosition(pkPPosActor); + } +} + + + +bool CPythonPlayer::RegisterEffect(DWORD dwEID, const char* c_szFileName, bool isCache) +{ + if (dwEID>=EFFECT_NUM) + return false; + + CEffectManager& rkEftMgr=CEffectManager::Instance(); + rkEftMgr.RegisterEffect2(c_szFileName, &m_adwEffect[dwEID], isCache); + return true; +} + +void CPythonPlayer::NEW_ShowEffect(int dwEID, TPixelPosition kPPosDst) +{ + if (dwEID>=EFFECT_NUM) + return; + + D3DXVECTOR3 kD3DVt3Pos(kPPosDst.x, -kPPosDst.y, kPPosDst.z); + D3DXVECTOR3 kD3DVt3Dir(0.0f, 0.0f, 1.0f); + + CEffectManager& rkEftMgr=CEffectManager::Instance(); + rkEftMgr.CreateEffect(m_adwEffect[dwEID], kD3DVt3Pos, kD3DVt3Dir); +} + +CInstanceBase* CPythonPlayer::NEW_FindActorPtr(DWORD dwVID) +{ + CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance(); + return rkChrMgr.GetInstancePtr(dwVID); +} + +CInstanceBase* CPythonPlayer::NEW_GetMainActorPtr() +{ + return NEW_FindActorPtr(m_dwMainCharacterIndex); +} + +/////////////////////////////////////////////////////////////////////////////////////////// + +void CPythonPlayer::Update() +{ + NEW_RefreshMouseWalkingDirection(); + + CPythonPlayerEventHandler& rkPlayerEventHandler=CPythonPlayerEventHandler::GetSingleton(); + rkPlayerEventHandler.FlushVictimList(); + + if (m_isDestPosition) + { + CInstanceBase * pInstance = NEW_GetMainActorPtr(); + if (pInstance) + { + TPixelPosition PixelPosition; + pInstance->NEW_GetPixelPosition(&PixelPosition); + + if (abs(int(PixelPosition.x) - m_ixDestPos) + abs(int(PixelPosition.y) - m_iyDestPos) < 10000) + { + m_isDestPosition = FALSE; + } + else + { + if (CTimer::Instance().GetCurrentMillisecond() - m_iLastAlarmTime > 20000) + { + AlarmHaveToGo(); + } + } + } + } + + if (m_isConsumingStamina) + { + float fElapsedTime = CTimer::Instance().GetElapsedSecond(); + m_fCurrentStamina -= (fElapsedTime * m_fConsumeStaminaPerSec); + + SetStatus(POINT_STAMINA, DWORD(m_fCurrentStamina)); + + PyCallClassMemberFunc(m_ppyGameWindow, "RefreshStamina", Py_BuildValue("()")); + } + + __Update_AutoAttack(); + __Update_NotifyGuildAreaEvent(); +} + +bool CPythonPlayer::__IsUsingChargeSkill() +{ + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return false; + + if (__CheckDashAffect(*pkInstMain)) + return true; + + if (MODE_USE_SKILL != m_eReservedMode) + return false; + + if (m_dwSkillSlotIndexReserved >= SKILL_MAX_NUM) + return false; + + TSkillInstance & rkSkillInst = m_playerStatus.aSkill[m_dwSkillSlotIndexReserved]; + + CPythonSkill::TSkillData * pSkillData; + if (!CPythonSkill::Instance().GetSkillData(rkSkillInst.dwIndex, &pSkillData)) + return false; + + return pSkillData->IsChargeSkill() ? true : false; +} + +void CPythonPlayer::__Update_AutoAttack() +{ + if (0 == m_dwAutoAttackTargetVID) + return; + + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + // 탄환격 쓰고 달려가는 도중에는 스킵 + if (__IsUsingChargeSkill()) + return; + + CInstanceBase* pkInstVictim=NEW_FindActorPtr(m_dwAutoAttackTargetVID); + if (!pkInstVictim) + { + __ClearAutoAttackTargetActorID(); + } + else + { + if (pkInstVictim->IsDead()) + { + __ClearAutoAttackTargetActorID(); + } + else if (pkInstMain->IsMountingHorse() && !pkInstMain->CanAttackHorseLevel()) + { + __ClearAutoAttackTargetActorID(); + } + else if (pkInstMain->IsAttackableInstance(*pkInstVictim)) + { + if (pkInstMain->IsSleep()) + { + //TraceError("SKIP_AUTO_ATTACK_IN_SLEEPING"); + } + else + { + __ReserveClickActor(m_dwAutoAttackTargetVID); + } + } + } +} + +void CPythonPlayer::__Update_NotifyGuildAreaEvent() +{ + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (pkInstMain) + { + TPixelPosition kPixelPosition; + pkInstMain->NEW_GetPixelPosition(&kPixelPosition); + + DWORD dwAreaID = CPythonMiniMap::Instance().GetGuildAreaID( + ULONG(kPixelPosition.x), ULONG(kPixelPosition.y)); + + if (dwAreaID != m_inGuildAreaID) + { + if (0xffffffff != dwAreaID) + { + PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_Guild_EnterGuildArea", Py_BuildValue("(i)", dwAreaID)); + } + else + { + PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_Guild_ExitGuildArea", Py_BuildValue("(i)", dwAreaID)); + } + + m_inGuildAreaID = dwAreaID; + } + } +} + +void CPythonPlayer::SetMainCharacterIndex(int iIndex) +{ + m_dwMainCharacterIndex = iIndex; + + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (pkInstMain) + { + CPythonPlayerEventHandler& rkPlayerEventHandler=CPythonPlayerEventHandler::GetSingleton(); + pkInstMain->SetEventHandler(&rkPlayerEventHandler); + } +} + +DWORD CPythonPlayer::GetMainCharacterIndex() +{ + return m_dwMainCharacterIndex; +} + +bool CPythonPlayer::IsMainCharacterIndex(DWORD dwIndex) +{ + return (m_dwMainCharacterIndex == dwIndex); +} + +DWORD CPythonPlayer::GetGuildID() +{ + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (!pkInstMain) + return 0xffffffff; + + return pkInstMain->GetGuildID(); +} + +void CPythonPlayer::SetWeaponPower(DWORD dwMinPower, DWORD dwMaxPower, DWORD dwMinMagicPower, DWORD dwMaxMagicPower, DWORD dwAddPower) +{ + m_dwWeaponMinPower=dwMinPower; + m_dwWeaponMaxPower=dwMaxPower; + m_dwWeaponMinMagicPower=dwMinMagicPower; + m_dwWeaponMaxMagicPower=dwMaxMagicPower; + m_dwWeaponAddPower=dwAddPower; + + __UpdateBattleStatus(); +} + +void CPythonPlayer::SetRace(DWORD dwRace) +{ + m_dwRace=dwRace; +} + +DWORD CPythonPlayer::GetRace() +{ + return m_dwRace; +} + +DWORD CPythonPlayer::__GetRaceStat() +{ + switch (GetRace()) + { + case MAIN_RACE_WARRIOR_M: + case MAIN_RACE_WARRIOR_W: + return GetStatus(POINT_ST); + break; + case MAIN_RACE_ASSASSIN_M: + case MAIN_RACE_ASSASSIN_W: + return GetStatus(POINT_DX); + break; + case MAIN_RACE_SURA_M: + case MAIN_RACE_SURA_W: + return GetStatus(POINT_ST); + break; + case MAIN_RACE_SHAMAN_M: + case MAIN_RACE_SHAMAN_W: + return GetStatus(POINT_IQ); + break; + } + return GetStatus(POINT_ST); +} + +DWORD CPythonPlayer::__GetLevelAtk() +{ + return 2*GetStatus(POINT_LEVEL); +} + +DWORD CPythonPlayer::__GetStatAtk() +{ + return (4*GetStatus(POINT_ST)+2*__GetRaceStat())/3; +} + +DWORD CPythonPlayer::__GetWeaponAtk(DWORD dwWeaponPower) +{ + return 2*dwWeaponPower; +} + +DWORD CPythonPlayer::__GetTotalAtk(DWORD dwWeaponPower, DWORD dwRefineBonus) +{ + DWORD dwLvAtk=__GetLevelAtk(); + DWORD dwStAtk=__GetStatAtk(); + + ///// + + DWORD dwWepAtk; + DWORD dwTotalAtk; + + if (LocaleService_IsCHEONMA()) + { + dwWepAtk = __GetWeaponAtk(dwWeaponPower+dwRefineBonus); + dwTotalAtk = dwLvAtk+(dwStAtk+dwWepAtk)*(GetStatus(POINT_DX)+210)/300; + } + else + { + int hr = __GetHitRate(); + dwWepAtk = __GetWeaponAtk(dwWeaponPower+dwRefineBonus); + dwTotalAtk = dwLvAtk+(dwStAtk+dwWepAtk)*hr/100; + } + + return dwTotalAtk; +} + +DWORD CPythonPlayer::__GetHitRate() +{ + int src = 0; + + if (LocaleService_IsCHEONMA()) + { + src = GetStatus(POINT_DX); + } + else + { + src = (GetStatus(POINT_DX) * 4 + GetStatus(POINT_LEVEL) * 2)/6; + } + + return 100*(min(90, src)+210)/300; +} + +DWORD CPythonPlayer::__GetEvadeRate() +{ + return 30*(2*GetStatus(POINT_DX)+5)/(GetStatus(POINT_DX)+95); +} + +void CPythonPlayer::__UpdateBattleStatus() +{ + m_playerStatus.SetPoint(POINT_NONE, 0); + m_playerStatus.SetPoint(POINT_EVADE_RATE, __GetEvadeRate()); + m_playerStatus.SetPoint(POINT_HIT_RATE, __GetHitRate()); + m_playerStatus.SetPoint(POINT_MIN_WEP, m_dwWeaponMinPower+m_dwWeaponAddPower); + m_playerStatus.SetPoint(POINT_MAX_WEP, m_dwWeaponMaxPower+m_dwWeaponAddPower); + m_playerStatus.SetPoint(POINT_MIN_MAGIC_WEP, m_dwWeaponMinMagicPower+m_dwWeaponAddPower); + m_playerStatus.SetPoint(POINT_MAX_MAGIC_WEP, m_dwWeaponMaxMagicPower+m_dwWeaponAddPower); + m_playerStatus.SetPoint(POINT_MIN_ATK, __GetTotalAtk(m_dwWeaponMinPower, m_dwWeaponAddPower)); + m_playerStatus.SetPoint(POINT_MAX_ATK, __GetTotalAtk(m_dwWeaponMaxPower, m_dwWeaponAddPower)); +} + +void CPythonPlayer::SetStatus(DWORD dwType, long lValue) +{ + if (dwType >= POINT_MAX_NUM) + { + assert(!" CPythonPlayer::SetStatus - Strange Status Type!"); + Tracef("CPythonPlayer::SetStatus - Set Status Type Error\n"); + return; + } + + if (dwType == POINT_LEVEL) + { + CInstanceBase* pkPlayer = NEW_GetMainActorPtr(); + + if (pkPlayer) + { + pkPlayer->SetLevel(lValue); + pkPlayer->UpdateTextTailLevel(lValue); + } + + } + + switch (dwType) + { + case POINT_MIN_WEP: + case POINT_MAX_WEP: + case POINT_MIN_ATK: + case POINT_MAX_ATK: + case POINT_HIT_RATE: + case POINT_EVADE_RATE: + case POINT_LEVEL: + case POINT_ST: + case POINT_DX: + case POINT_IQ: + m_playerStatus.SetPoint(dwType, lValue); + __UpdateBattleStatus(); + break; + default: + m_playerStatus.SetPoint(dwType, lValue); + break; + } +} + +int CPythonPlayer::GetStatus(DWORD dwType) +{ + if (dwType >= POINT_MAX_NUM) + { + assert(!" CPythonPlayer::GetStatus - Strange Status Type!"); + Tracef("CPythonPlayer::GetStatus - Get Status Type Error\n"); + return 0; + } + + return m_playerStatus.GetPoint(dwType); +} + +const char* CPythonPlayer::GetName() +{ + return m_stName.c_str(); +} + +void CPythonPlayer::SetName(const char *name) +{ + m_stName = name; +} + +void CPythonPlayer::NotifyDeletingCharacterInstance(DWORD dwVID) +{ + if (m_dwMainCharacterIndex == dwVID) + m_dwMainCharacterIndex = 0; +} + +void CPythonPlayer::NotifyCharacterDead(DWORD dwVID) +{ + if (__IsSameTargetVID(dwVID)) + { + SetTarget(0); + } +} + +void CPythonPlayer::NotifyCharacterUpdate(DWORD dwVID) +{ + if (__IsSameTargetVID(dwVID)) + { + CInstanceBase * pMainInstance = NEW_GetMainActorPtr(); + CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwVID); + if (pMainInstance && pTargetInstance) + { + if (!pMainInstance->IsTargetableInstance(*pTargetInstance)) + { + SetTarget(0); + PyCallClassMemberFunc(m_ppyGameWindow, "CloseTargetBoard", Py_BuildValue("()")); + } + else + { + PyCallClassMemberFunc(m_ppyGameWindow, "RefreshTargetBoardByVID", Py_BuildValue("(i)", dwVID)); + } + } + } +} + +void CPythonPlayer::NotifyDeadMainCharacter() +{ + __ClearAutoAttackTargetActorID(); +} + +void CPythonPlayer::NotifyChangePKMode() +{ + PyCallClassMemberFunc(m_ppyGameWindow, "OnChangePKMode", Py_BuildValue("()")); +} + + +void CPythonPlayer::MoveItemData(TItemPos SrcCell, TItemPos DstCell) +{ + if (!SrcCell.IsValidCell() || !DstCell.IsValidCell()) + return; + + TItemData src_item(*GetItemData(SrcCell)); + TItemData dst_item(*GetItemData(DstCell)); + SetItemData(DstCell, src_item); + SetItemData(SrcCell, dst_item); +} + +const TItemData * CPythonPlayer::GetItemData(TItemPos Cell) const +{ + if (!Cell.IsValidCell()) + return NULL; + + switch (Cell.window_type) + { + case INVENTORY: + case EQUIPMENT: + return &m_playerStatus.aItem[Cell.cell]; + case DRAGON_SOUL_INVENTORY: + return &m_playerStatus.aDSItem[Cell.cell]; + default: + return NULL; + } +} + +void CPythonPlayer::SetItemData(TItemPos Cell, const TItemData & c_rkItemInst) +{ + if (!Cell.IsValidCell()) + return; + + if (c_rkItemInst.vnum != 0) + { + CItemData * pItemData; + if (!CItemManager::Instance().GetItemDataPointer(c_rkItemInst.vnum, &pItemData)) + { + TraceError("CPythonPlayer::SetItemData(window_type : %d, dwSlotIndex=%d, itemIndex=%d) - Failed to item data\n", Cell.window_type, Cell.cell, c_rkItemInst.vnum); + return; + } + } + + switch (Cell.window_type) + { + case INVENTORY: + case EQUIPMENT: + m_playerStatus.aItem[Cell.cell] = c_rkItemInst; + break; + case DRAGON_SOUL_INVENTORY: + m_playerStatus.aDSItem[Cell.cell] = c_rkItemInst; + break; + } +} + +DWORD CPythonPlayer::GetItemIndex(TItemPos Cell) +{ + if (!Cell.IsValidCell()) + return 0; + + return GetItemData(Cell)->vnum; +} + +DWORD CPythonPlayer::GetItemFlags(TItemPos Cell) +{ + if (!Cell.IsValidCell()) + return 0; + const TItemData * pItem = GetItemData(Cell); + assert (pItem != NULL); + return pItem->flags; +} + +DWORD CPythonPlayer::GetItemCount(TItemPos Cell) +{ + if (!Cell.IsValidCell()) + return 0; + const TItemData * pItem = GetItemData(Cell); + if (pItem == NULL) + return 0; + else + return pItem->count; +} + +DWORD CPythonPlayer::GetItemCountByVnum(DWORD dwVnum) +{ + DWORD dwCount = 0; + + for (int i = 0; i < c_Inventory_Count; ++i) + { + const TItemData & c_rItemData = m_playerStatus.aItem[i]; + if (c_rItemData.vnum == dwVnum) + { + dwCount += c_rItemData.count; + } + } + + return dwCount; +} + +DWORD CPythonPlayer::GetItemMetinSocket(TItemPos Cell, DWORD dwMetinSocketIndex) +{ + if (!Cell.IsValidCell()) + return 0; + + if (dwMetinSocketIndex >= ITEM_SOCKET_SLOT_MAX_NUM) + return 0; + + return GetItemData(Cell)->alSockets[dwMetinSocketIndex]; +} + +void CPythonPlayer::GetItemAttribute(TItemPos Cell, DWORD dwAttrSlotIndex, BYTE * pbyType, short * psValue) +{ + *pbyType = 0; + *psValue = 0; + + if (!Cell.IsValidCell()) + return; + + if (dwAttrSlotIndex >= ITEM_ATTRIBUTE_SLOT_MAX_NUM) + return; + + *pbyType = GetItemData(Cell)->aAttr[dwAttrSlotIndex].bType; + *psValue = GetItemData(Cell)->aAttr[dwAttrSlotIndex].sValue; +} + +void CPythonPlayer::SetItemCount(TItemPos Cell, BYTE byCount) +{ + if (!Cell.IsValidCell()) + return; + + (const_cast (GetItemData(Cell)))->count = byCount; + PyCallClassMemberFunc(m_ppyGameWindow, "RefreshInventory", Py_BuildValue("()")); +} + +void CPythonPlayer::SetItemMetinSocket(TItemPos Cell, DWORD dwMetinSocketIndex, DWORD dwMetinNumber) +{ + if (!Cell.IsValidCell()) + return; + if (dwMetinSocketIndex >= ITEM_SOCKET_SLOT_MAX_NUM) + return; + + (const_cast (GetItemData(Cell)))->alSockets[dwMetinSocketIndex] = dwMetinNumber; +} + +void CPythonPlayer::SetItemAttribute(TItemPos Cell, DWORD dwAttrIndex, BYTE byType, short sValue) +{ + if (!Cell.IsValidCell()) + return; + if (dwAttrIndex >= ITEM_ATTRIBUTE_SLOT_MAX_NUM) + return; + + (const_cast (GetItemData(Cell)))->aAttr[dwAttrIndex].bType = byType; + (const_cast (GetItemData(Cell)))->aAttr[dwAttrIndex].sValue = sValue; +} + +int CPythonPlayer::GetQuickPage() +{ + return m_playerStatus.lQuickPageIndex; +} + +void CPythonPlayer::SetQuickPage(int nQuickPageIndex) +{ + if (nQuickPageIndex<0) + m_playerStatus.lQuickPageIndex=QUICKSLOT_MAX_LINE+nQuickPageIndex; + else if (nQuickPageIndex>=QUICKSLOT_MAX_LINE) + m_playerStatus.lQuickPageIndex=nQuickPageIndex%QUICKSLOT_MAX_LINE; + else + m_playerStatus.lQuickPageIndex=nQuickPageIndex; + + PyCallClassMemberFunc(m_ppyGameWindow, "RefreshInventory", Py_BuildValue("()")); +} + +DWORD CPythonPlayer::LocalQuickSlotIndexToGlobalQuickSlotIndex(DWORD dwLocalSlotIndex) +{ + return m_playerStatus.lQuickPageIndex*QUICKSLOT_MAX_COUNT_PER_LINE+dwLocalSlotIndex; +} + +void CPythonPlayer::GetGlobalQuickSlotData(DWORD dwGlobalSlotIndex, DWORD* pdwWndType, DWORD* pdwWndItemPos) +{ + TQuickSlot& rkQuickSlot=__RefGlobalQuickSlot(dwGlobalSlotIndex); + *pdwWndType=rkQuickSlot.Type; + *pdwWndItemPos=rkQuickSlot.Position; +} + +void CPythonPlayer::GetLocalQuickSlotData(DWORD dwSlotPos, DWORD* pdwWndType, DWORD* pdwWndItemPos) +{ + TQuickSlot& rkQuickSlot=__RefLocalQuickSlot(dwSlotPos); + *pdwWndType=rkQuickSlot.Type; + *pdwWndItemPos=rkQuickSlot.Position; +} + +TQuickSlot & CPythonPlayer::__RefLocalQuickSlot(int SlotIndex) +{ + return __RefGlobalQuickSlot(LocalQuickSlotIndexToGlobalQuickSlotIndex(SlotIndex)); +} + +TQuickSlot & CPythonPlayer::__RefGlobalQuickSlot(int SlotIndex) +{ + if (SlotIndex < 0 || SlotIndex >= QUICKSLOT_MAX_NUM) + { + static TQuickSlot s_kQuickSlot; + s_kQuickSlot.Type = 0; + s_kQuickSlot.Position = 0; + return s_kQuickSlot; + } + + return m_playerStatus.aQuickSlot[SlotIndex]; +} + +void CPythonPlayer::RemoveQuickSlotByValue(int iType, int iPosition) +{ + for (BYTE i = 0; i < QUICKSLOT_MAX_NUM; ++i) + { + if (iType == m_playerStatus.aQuickSlot[i].Type) + if (iPosition == m_playerStatus.aQuickSlot[i].Position) + CPythonNetworkStream::Instance().SendQuickSlotDelPacket(i); + } +} + +char CPythonPlayer::IsItem(TItemPos Cell) +{ + if (!Cell.IsValidCell()) + return 0; + + return 0 != GetItemData(Cell)->vnum; +} + +void CPythonPlayer::RequestMoveGlobalQuickSlotToLocalQuickSlot(DWORD dwGlobalSrcSlotIndex, DWORD dwLocalDstSlotIndex) +{ + //DWORD dwGlobalSrcSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(dwLocalSrcSlotIndex); + DWORD dwGlobalDstSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(dwLocalDstSlotIndex); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendQuickSlotMovePacket((BYTE) dwGlobalSrcSlotIndex, (BYTE)dwGlobalDstSlotIndex); +} + +void CPythonPlayer::RequestAddLocalQuickSlot(DWORD dwLocalSlotIndex, DWORD dwWndType, DWORD dwWndItemPos) +{ + if (dwLocalSlotIndex>=QUICKSLOT_MAX_COUNT_PER_LINE) + return; + + DWORD dwGlobalSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(dwLocalSlotIndex); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendQuickSlotAddPacket((BYTE)dwGlobalSlotIndex, (BYTE)dwWndType, (BYTE)dwWndItemPos); +} + +void CPythonPlayer::RequestAddToEmptyLocalQuickSlot(DWORD dwWndType, DWORD dwWndItemPos) +{ + for (int i = 0; i < QUICKSLOT_MAX_COUNT_PER_LINE; ++i) + { + TQuickSlot& rkQuickSlot=__RefLocalQuickSlot(i); + + if (0 == rkQuickSlot.Type) + { + DWORD dwGlobalQuickSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(i); + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendQuickSlotAddPacket((BYTE)dwGlobalQuickSlotIndex, (BYTE)dwWndType, (BYTE)dwWndItemPos); + return; + } + } + +} + +void CPythonPlayer::RequestDeleteGlobalQuickSlot(DWORD dwGlobalSlotIndex) +{ + if (dwGlobalSlotIndex>=QUICKSLOT_MAX_COUNT) + return; + + //if (dwLocalSlotIndex>=QUICKSLOT_MAX_SLOT_PER_LINE) + // return; + + //DWORD dwGlobalSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(dwLocalSlotIndex); + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendQuickSlotDelPacket((BYTE)dwGlobalSlotIndex); +} + +void CPythonPlayer::RequestUseLocalQuickSlot(DWORD dwLocalSlotIndex) +{ + if (dwLocalSlotIndex>=QUICKSLOT_MAX_COUNT_PER_LINE) + return; + + DWORD dwRegisteredType; + DWORD dwRegisteredItemPos; + GetLocalQuickSlotData(dwLocalSlotIndex, &dwRegisteredType, &dwRegisteredItemPos); + + switch (dwRegisteredType) + { + case SLOT_TYPE_INVENTORY: + { + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemUsePacket(TItemPos(INVENTORY, (WORD)dwRegisteredItemPos)); + break; + } + case SLOT_TYPE_SKILL: + { + ClickSkillSlot(dwRegisteredItemPos); + break; + } + case SLOT_TYPE_EMOTION: + { + PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_ActEmotion", Py_BuildValue("(i)", dwRegisteredItemPos)); + break; + } + } +} + +void CPythonPlayer::AddQuickSlot(int QuickSlotIndex, char IconType, char IconPosition) +{ + if (QuickSlotIndex < 0 || QuickSlotIndex >= QUICKSLOT_MAX_NUM) + return; + + m_playerStatus.aQuickSlot[QuickSlotIndex].Type = IconType; + m_playerStatus.aQuickSlot[QuickSlotIndex].Position = IconPosition; +} + +void CPythonPlayer::DeleteQuickSlot(int QuickSlotIndex) +{ + if (QuickSlotIndex < 0 || QuickSlotIndex >= QUICKSLOT_MAX_NUM) + return; + + m_playerStatus.aQuickSlot[QuickSlotIndex].Type = 0; + m_playerStatus.aQuickSlot[QuickSlotIndex].Position = 0; +} + +void CPythonPlayer::MoveQuickSlot(int Source, int Target) +{ + if (Source < 0 || Source >= QUICKSLOT_MAX_NUM) + return; + + if (Target < 0 || Target >= QUICKSLOT_MAX_NUM) + return; + + TQuickSlot& rkSrcSlot=__RefGlobalQuickSlot(Source); + TQuickSlot& rkDstSlot=__RefGlobalQuickSlot(Target); + + std::swap(rkSrcSlot, rkDstSlot); +} + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM +bool CPythonPlayer::IsBeltInventorySlot(TItemPos Cell) +{ + return Cell.IsBeltInventoryCell(); +} +#endif + +bool CPythonPlayer::IsInventorySlot(TItemPos Cell) +{ + return !Cell.IsEquipCell() && Cell.IsValidCell(); +} + +bool CPythonPlayer::IsEquipmentSlot(TItemPos Cell) +{ + return Cell.IsEquipCell(); +} + +bool CPythonPlayer::IsEquipItemInSlot(TItemPos Cell) +{ + if (!Cell.IsEquipCell()) + { + return false; + } + + const TItemData * pData = GetItemData(Cell); + + if (NULL == pData) + { + return false; + } + + DWORD dwItemIndex = pData->vnum; + + CItemManager::Instance().SelectItemData(dwItemIndex); + CItemData * pItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pItemData) + { + TraceError("Failed to find ItemData - CPythonPlayer::IsEquipItem(window_type=%d, iSlotindex=%d)\n", Cell.window_type, Cell.cell); + return false; + } + + return pItemData->IsEquipment() ? true : false; +} + + +void CPythonPlayer::SetSkill(DWORD dwSlotIndex, DWORD dwSkillIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return; + + m_playerStatus.aSkill[dwSlotIndex].dwIndex = dwSkillIndex; + m_skillSlotDict[dwSkillIndex] = dwSlotIndex; +} + +int CPythonPlayer::GetSkillIndex(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return 0; + + return m_playerStatus.aSkill[dwSlotIndex].dwIndex; +} + +bool CPythonPlayer::GetSkillSlotIndex(DWORD dwSkillIndex, DWORD* pdwSlotIndex) +{ + std::map::iterator f=m_skillSlotDict.find(dwSkillIndex); + if (m_skillSlotDict.end()==f) + { + return false; + } + + *pdwSlotIndex=f->second; + + return true; +} + +int CPythonPlayer::GetSkillGrade(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return 0; + + return m_playerStatus.aSkill[dwSlotIndex].iGrade; +} + +int CPythonPlayer::GetSkillLevel(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return 0; + + return m_playerStatus.aSkill[dwSlotIndex].iLevel; +} + +float CPythonPlayer::GetSkillCurrentEfficientPercentage(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return 0; + + return m_playerStatus.aSkill[dwSlotIndex].fcurEfficientPercentage; +} + +float CPythonPlayer::GetSkillNextEfficientPercentage(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return 0; + + return m_playerStatus.aSkill[dwSlotIndex].fnextEfficientPercentage; +} + +void CPythonPlayer::SetSkillLevel(DWORD dwSlotIndex, DWORD dwSkillLevel) +{ + assert(!"CPythonPlayer::SetSkillLevel - \273\347\277\353\307\317\301\366 \276\312\264\302 \307\324\274\366"); + if (dwSlotIndex >= SKILL_MAX_NUM) + return; + + m_playerStatus.aSkill[dwSlotIndex].iGrade = -1; + m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel; +} + +void CPythonPlayer::SetSkillLevel_(DWORD dwSkillIndex, DWORD dwSkillGrade, DWORD dwSkillLevel) +{ + DWORD dwSlotIndex; + if (!GetSkillSlotIndex(dwSkillIndex, &dwSlotIndex)) + return; + + if (dwSlotIndex >= SKILL_MAX_NUM) + return; + + switch (dwSkillGrade) + { + case 0: + m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade; + m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel; + break; + case 1: + m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade; + m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel-20+1; + break; + case 2: + m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade; + m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel-30+1; + break; + case 3: + m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade; + m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel-40+1; + break; + } + + const DWORD SKILL_MAX_LEVEL = 40; + + + + + + if (dwSkillLevel>SKILL_MAX_LEVEL) + { + m_playerStatus.aSkill[dwSlotIndex].fcurEfficientPercentage = 0.0f; + m_playerStatus.aSkill[dwSlotIndex].fnextEfficientPercentage = 0.0f; + + TraceError("CPythonPlayer::SetSkillLevel(SlotIndex=%d, SkillLevel=%d)", dwSlotIndex, dwSkillLevel); + return; + } + + m_playerStatus.aSkill[dwSlotIndex].fcurEfficientPercentage = LocaleService_GetSkillPower(dwSkillLevel)/100.0f; + m_playerStatus.aSkill[dwSlotIndex].fnextEfficientPercentage = LocaleService_GetSkillPower(dwSkillLevel+1)/100.0f; + +} + +void CPythonPlayer::SetSkillCoolTime(DWORD dwSkillIndex) +{ + DWORD dwSlotIndex; + if (!GetSkillSlotIndex(dwSkillIndex, &dwSlotIndex)) + { + Tracenf("CPythonPlayer::SetSkillCoolTime(dwSkillIndex=%d) - FIND SLOT ERROR", dwSkillIndex); + return; + } + + if (dwSlotIndex>=SKILL_MAX_NUM) + { + Tracenf("CPythonPlayer::SetSkillCoolTime(dwSkillIndex=%d) - dwSlotIndex=%d/%d OUT OF RANGE", dwSkillIndex, dwSlotIndex, SKILL_MAX_NUM); + return; + } + + m_playerStatus.aSkill[dwSlotIndex].isCoolTime=true; +} + +void CPythonPlayer::EndSkillCoolTime(DWORD dwSkillIndex) +{ + DWORD dwSlotIndex; + if (!GetSkillSlotIndex(dwSkillIndex, &dwSlotIndex)) + { + Tracenf("CPythonPlayer::EndSkillCoolTime(dwSkillIndex=%d) - FIND SLOT ERROR", dwSkillIndex); + return; + } + + if (dwSlotIndex>=SKILL_MAX_NUM) + { + Tracenf("CPythonPlayer::EndSkillCoolTime(dwSkillIndex=%d) - dwSlotIndex=%d/%d OUT OF RANGE", dwSkillIndex, dwSlotIndex, SKILL_MAX_NUM); + return; + } + + m_playerStatus.aSkill[dwSlotIndex].isCoolTime=false; +} + +float CPythonPlayer::GetSkillCoolTime(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return 0.0f; + + return m_playerStatus.aSkill[dwSlotIndex].fCoolTime; +} + +float CPythonPlayer::GetSkillElapsedCoolTime(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return 0.0f; + + return CTimer::Instance().GetCurrentSecond() - m_playerStatus.aSkill[dwSlotIndex].fLastUsedTime; +} + +void CPythonPlayer::__ActivateSkillSlot(DWORD dwSlotIndex) +{ + if (dwSlotIndex>=SKILL_MAX_NUM) + { + Tracenf("CPythonPlayer::ActivavteSkill(dwSlotIndex=%d/%d) - OUT OF RANGE", dwSlotIndex, SKILL_MAX_NUM); + return; + } + + m_playerStatus.aSkill[dwSlotIndex].bActive = TRUE; + PyCallClassMemberFunc(m_ppyGameWindow, "ActivateSkillSlot", Py_BuildValue("(i)", dwSlotIndex)); +} + +void CPythonPlayer::__DeactivateSkillSlot(DWORD dwSlotIndex) +{ + if (dwSlotIndex>=SKILL_MAX_NUM) + { + Tracenf("CPythonPlayer::DeactivavteSkill(dwSlotIndex=%d/%d) - OUT OF RANGE", dwSlotIndex, SKILL_MAX_NUM); + return; + } + + m_playerStatus.aSkill[dwSlotIndex].bActive = FALSE; + PyCallClassMemberFunc(m_ppyGameWindow, "DeactivateSkillSlot", Py_BuildValue("(i)", dwSlotIndex)); +} + +BOOL CPythonPlayer::IsSkillCoolTime(DWORD dwSlotIndex) +{ + if (!__CheckRestSkillCoolTime(dwSlotIndex)) + return FALSE; + + return TRUE; +} + +BOOL CPythonPlayer::IsSkillActive(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return FALSE; + + return m_playerStatus.aSkill[dwSlotIndex].bActive; +} + +BOOL CPythonPlayer::IsToggleSkill(DWORD dwSlotIndex) +{ + if (dwSlotIndex >= SKILL_MAX_NUM) + return FALSE; + + DWORD dwSkillIndex = m_playerStatus.aSkill[dwSlotIndex].dwIndex; + + CPythonSkill::TSkillData * pSkillData; + if (!CPythonSkill::Instance().GetSkillData(dwSkillIndex, &pSkillData)) + return FALSE; + + return pSkillData->IsToggleSkill(); +} + +void CPythonPlayer::SetPlayTime(DWORD dwPlayTime) +{ + m_dwPlayTime = dwPlayTime; +} + +DWORD CPythonPlayer::GetPlayTime() +{ + return m_dwPlayTime; +} + +void CPythonPlayer::SendClickItemPacket(DWORD dwIID) +{ + if (IsObserverMode()) + return; + + static DWORD s_dwNextTCPTime = 0; + + DWORD dwCurTime=ELTimer_GetMSec(); + + if (dwCurTime >= s_dwNextTCPTime) + { + s_dwNextTCPTime=dwCurTime + 500; + + const char * c_szOwnerName; + if (!CPythonItem::Instance().GetOwnership(dwIID, &c_szOwnerName)) + return; + + if (strlen(c_szOwnerName) > 0) + if (0 != strcmp(c_szOwnerName, GetName())) + { + CItemData * pItemData; + if (!CItemManager::Instance().GetItemDataPointer(CPythonItem::Instance().GetVirtualNumberOfGroundItem(dwIID), &pItemData)) + { + Tracenf("CPythonPlayer::SendClickItemPacket(dwIID=%d) : Non-exist item.", dwIID); + return; + } + if (!IsPartyMemberByName(c_szOwnerName) || pItemData->IsAntiFlag(CItemData::ITEM_ANTIFLAG_DROP | CItemData::ITEM_ANTIFLAG_GIVE)) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotPickItem", Py_BuildValue("()")); + return; + } + } + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + rkNetStream.SendItemPickUpPacket(dwIID); + } +} + +void CPythonPlayer::__SendClickActorPacket(CInstanceBase& rkInstVictim) +{ + // 말을 타고 광산을 캐는 것에 대한 예외 처리 + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (pkInstMain) + if (pkInstMain->IsHoldingPickAxe()) + if (pkInstMain->IsMountingHorse()) + if (rkInstVictim.IsResource()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotMining", Py_BuildValue("()")); + return; + } + + static DWORD s_dwNextTCPTime = 0; + + DWORD dwCurTime=ELTimer_GetMSec(); + + if (dwCurTime >= s_dwNextTCPTime) + { + s_dwNextTCPTime=dwCurTime+1000; + + CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); + + DWORD dwVictimVID=rkInstVictim.GetVirtualID(); + rkNetStream.SendOnClickPacket(dwVictimVID); + } +} + +void CPythonPlayer::ActEmotion(DWORD dwEmotionID) +{ + CInstanceBase * pkInstTarget = __GetAliveTargetInstancePtr(); + if (!pkInstTarget) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShotError", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_TARGET")); + return; + } + + CPythonNetworkStream::Instance().SendChatPacket(_getf("/kiss %s", pkInstTarget->GetNameString())); +} + +void CPythonPlayer::StartEmotionProcess() +{ + __ClearReservedAction(); + __ClearAutoAttackTargetActorID(); + + m_bisProcessingEmotion = TRUE; +} + +void CPythonPlayer::EndEmotionProcess() +{ + m_bisProcessingEmotion = FALSE; +} + +BOOL CPythonPlayer::__IsProcessingEmotion() +{ + return m_bisProcessingEmotion; +} + +// Dungeon +void CPythonPlayer::SetDungeonDestinationPosition(int ix, int iy) +{ + m_isDestPosition = TRUE; + m_ixDestPos = ix; + m_iyDestPos = iy; + + AlarmHaveToGo(); +} + +void CPythonPlayer::AlarmHaveToGo() +{ + m_iLastAlarmTime = CTimer::Instance().GetCurrentMillisecond(); + + ///// + + CInstanceBase * pInstance = NEW_GetMainActorPtr(); + if (!pInstance) + return; + + TPixelPosition PixelPosition; + pInstance->NEW_GetPixelPosition(&PixelPosition); + + float fAngle = GetDegreeFromPosition2(PixelPosition.x, PixelPosition.y, float(m_ixDestPos), float(m_iyDestPos)); + fAngle = fmod(540.0f - fAngle, 360.0f); + D3DXVECTOR3 v3Rotation(0.0f, 0.0f, fAngle); + + PixelPosition.y *= -1.0f; + + CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_middle.mse"); + CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_middle.mse", PixelPosition, v3Rotation); +} + +// Party +void CPythonPlayer::ExitParty() +{ + m_PartyMemberMap.clear(); + + CPythonCharacterManager::Instance().RefreshAllPCTextTail(); +} + +void CPythonPlayer::AppendPartyMember(DWORD dwPID, const char * c_szName) +{ + m_PartyMemberMap.insert(std::make_pair(dwPID, TPartyMemberInfo(dwPID, c_szName))); +} + +void CPythonPlayer::LinkPartyMember(DWORD dwPID, DWORD dwVID) +{ + TPartyMemberInfo * pPartyMemberInfo; + if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo)) + { + TraceError(" CPythonPlayer::LinkPartyMember(dwPID=%d, dwVID=%d) - Failed to find party member", dwPID, dwVID); + return; + } + + pPartyMemberInfo->dwVID = dwVID; + + CInstanceBase * pInstance = NEW_FindActorPtr(dwVID); + if (pInstance) + pInstance->RefreshTextTail(); +} + +void CPythonPlayer::UnlinkPartyMember(DWORD dwPID) +{ + TPartyMemberInfo * pPartyMemberInfo; + if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo)) + { + TraceError(" CPythonPlayer::UnlinkPartyMember(dwPID=%d) - Failed to find party member", dwPID); + return; + } + + pPartyMemberInfo->dwVID = 0; +} + +void CPythonPlayer::UpdatePartyMemberInfo(DWORD dwPID, BYTE byState, BYTE byHPPercentage) +{ + TPartyMemberInfo * pPartyMemberInfo; + if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo)) + { + TraceError(" CPythonPlayer::UpdatePartyMemberInfo(dwPID=%d, byState=%d, byHPPercentage=%d) - Failed to find character", dwPID, byState, byHPPercentage); + return; + } + + pPartyMemberInfo->byState = byState; + pPartyMemberInfo->byHPPercentage = byHPPercentage; +} + +void CPythonPlayer::UpdatePartyMemberAffect(DWORD dwPID, BYTE byAffectSlotIndex, short sAffectNumber) +{ + if (byAffectSlotIndex >= PARTY_AFFECT_SLOT_MAX_NUM) + { + TraceError(" CPythonPlayer::UpdatePartyMemberAffect(dwPID=%d, byAffectSlotIndex=%d, sAffectNumber=%d) - Strange affect slot index", dwPID, byAffectSlotIndex, sAffectNumber); + return; + } + + TPartyMemberInfo * pPartyMemberInfo; + if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo)) + { + TraceError(" CPythonPlayer::UpdatePartyMemberAffect(dwPID=%d, byAffectSlotIndex=%d, sAffectNumber=%d) - Failed to find character", dwPID, byAffectSlotIndex, sAffectNumber); + return; + } + + pPartyMemberInfo->sAffects[byAffectSlotIndex] = sAffectNumber; +} + +void CPythonPlayer::RemovePartyMember(DWORD dwPID) +{ + DWORD dwVID = 0; + TPartyMemberInfo * pPartyMemberInfo; + if (GetPartyMemberPtr(dwPID, &pPartyMemberInfo)) + { + dwVID = pPartyMemberInfo->dwVID; + } + + m_PartyMemberMap.erase(dwPID); + + if (dwVID > 0) + { + CInstanceBase * pInstance = NEW_FindActorPtr(dwVID); + if (pInstance) + pInstance->RefreshTextTail(); + } +} + +bool CPythonPlayer::IsPartyMemberByVID(DWORD dwVID) +{ + std::map::iterator itor = m_PartyMemberMap.begin(); + for (; itor != m_PartyMemberMap.end(); ++itor) + { + TPartyMemberInfo & rPartyMemberInfo = itor->second; + if (dwVID == rPartyMemberInfo.dwVID) + return true; + } + + return false; +} + +bool CPythonPlayer::IsPartyMemberByName(const char * c_szName) +{ + std::map::iterator itor = m_PartyMemberMap.begin(); + for (; itor != m_PartyMemberMap.end(); ++itor) + { + TPartyMemberInfo & rPartyMemberInfo = itor->second; + if (0 == rPartyMemberInfo.strName.compare(c_szName)) + return true; + } + + return false; +} + +bool CPythonPlayer::GetPartyMemberPtr(DWORD dwPID, TPartyMemberInfo ** ppPartyMemberInfo) +{ + std::map::iterator itor = m_PartyMemberMap.find(dwPID); + + if (m_PartyMemberMap.end() == itor) + return false; + + *ppPartyMemberInfo = &(itor->second); + + return true; +} + +bool CPythonPlayer::PartyMemberPIDToVID(DWORD dwPID, DWORD * pdwVID) +{ + std::map::iterator itor = m_PartyMemberMap.find(dwPID); + + if (m_PartyMemberMap.end() == itor) + return false; + + const TPartyMemberInfo & c_rPartyMemberInfo = itor->second; + *pdwVID = c_rPartyMemberInfo.dwVID; + + return true; +} + +bool CPythonPlayer::PartyMemberVIDToPID(DWORD dwVID, DWORD * pdwPID) +{ + std::map::iterator itor = m_PartyMemberMap.begin(); + for (; itor != m_PartyMemberMap.end(); ++itor) + { + TPartyMemberInfo & rPartyMemberInfo = itor->second; + if (dwVID == rPartyMemberInfo.dwVID) + { + *pdwPID = rPartyMemberInfo.dwPID; + return true; + } + } + + return false; +} + +bool CPythonPlayer::IsSamePartyMember(DWORD dwVID1, DWORD dwVID2) +{ + return (IsPartyMemberByVID(dwVID1) && IsPartyMemberByVID(dwVID2)); +} + +// PVP +void CPythonPlayer::RememberChallengeInstance(DWORD dwVID) +{ + m_RevengeInstanceSet.erase(dwVID); + m_ChallengeInstanceSet.insert(dwVID); +} +void CPythonPlayer::RememberRevengeInstance(DWORD dwVID) +{ + m_ChallengeInstanceSet.erase(dwVID); + m_RevengeInstanceSet.insert(dwVID); +} +void CPythonPlayer::RememberCantFightInstance(DWORD dwVID) +{ + m_CantFightInstanceSet.insert(dwVID); +} +void CPythonPlayer::ForgetInstance(DWORD dwVID) +{ + m_ChallengeInstanceSet.erase(dwVID); + m_RevengeInstanceSet.erase(dwVID); + m_CantFightInstanceSet.erase(dwVID); +} + +bool CPythonPlayer::IsChallengeInstance(DWORD dwVID) +{ + return m_ChallengeInstanceSet.end() != m_ChallengeInstanceSet.find(dwVID); +} +bool CPythonPlayer::IsRevengeInstance(DWORD dwVID) +{ + return m_RevengeInstanceSet.end() != m_RevengeInstanceSet.find(dwVID); +} +bool CPythonPlayer::IsCantFightInstance(DWORD dwVID) +{ + return m_CantFightInstanceSet.end() != m_CantFightInstanceSet.find(dwVID); +} + +void CPythonPlayer::OpenPrivateShop() +{ + m_isOpenPrivateShop = TRUE; +} +void CPythonPlayer::ClosePrivateShop() +{ + m_isOpenPrivateShop = FALSE; +} + +bool CPythonPlayer::IsOpenPrivateShop() +{ + return m_isOpenPrivateShop; +} + +void CPythonPlayer::SetObserverMode(bool isEnable) +{ + m_isObserverMode=isEnable; +} + +bool CPythonPlayer::IsObserverMode() +{ + return m_isObserverMode; +} + + +BOOL CPythonPlayer::__ToggleCoolTime() +{ + m_sysIsCoolTime = 1 - m_sysIsCoolTime; + return m_sysIsCoolTime; +} + +BOOL CPythonPlayer::__ToggleLevelLimit() +{ + m_sysIsLevelLimit = 1 - m_sysIsLevelLimit; + return m_sysIsLevelLimit; +} + +void CPythonPlayer::StartStaminaConsume(DWORD dwConsumePerSec, DWORD dwCurrentStamina) +{ + m_isConsumingStamina = TRUE; + m_fConsumeStaminaPerSec = float(dwConsumePerSec); + m_fCurrentStamina = float(dwCurrentStamina); + + SetStatus(POINT_STAMINA, dwCurrentStamina); +} + +void CPythonPlayer::StopStaminaConsume(DWORD dwCurrentStamina) +{ + m_isConsumingStamina = FALSE; + m_fConsumeStaminaPerSec = 0.0f; + m_fCurrentStamina = float(dwCurrentStamina); + + SetStatus(POINT_STAMINA, dwCurrentStamina); +} + +DWORD CPythonPlayer::GetPKMode() +{ + CInstanceBase * pInstance = NEW_GetMainActorPtr(); + if (!pInstance) + return 0; + + return pInstance->GetPKMode(); +} + +void CPythonPlayer::SetMobileFlag(BOOL bFlag) +{ + m_bMobileFlag = bFlag; + PyCallClassMemberFunc(m_ppyGameWindow, "RefreshMobile", Py_BuildValue("()")); +} + +BOOL CPythonPlayer::HasMobilePhoneNumber() +{ + return m_bMobileFlag; +} + +void CPythonPlayer::SetGameWindow(PyObject * ppyObject) +{ + m_ppyGameWindow = ppyObject; +} + +void CPythonPlayer::NEW_ClearSkillData(bool bAll) +{ + std::map::iterator it; + + for (it = m_skillSlotDict.begin(); it != m_skillSlotDict.end();) + { + if (bAll || __GetSkillType(it->first) == CPythonSkill::SKILL_TYPE_ACTIVE) + it = m_skillSlotDict.erase(it); + else + ++it; + } + + for (int i = 0; i < SKILL_MAX_NUM; ++i) + { + ZeroMemory(&m_playerStatus.aSkill[i], sizeof(TSkillInstance)); + } + + for (int j = 0; j < SKILL_MAX_NUM; ++j) + { + // 2004.09.30.myevan.스킬갱신시 스킬 포인트업[+] 버튼이 안나와 처리 + m_playerStatus.aSkill[j].iGrade = 0; + m_playerStatus.aSkill[j].fcurEfficientPercentage=0.0f; + m_playerStatus.aSkill[j].fnextEfficientPercentage=0.05f; + } + + if (m_ppyGameWindow) + PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_CheckGameButton", Py_BuildNone()); +} + +void CPythonPlayer::ClearSkillDict() +{ + // ClearSkillDict + m_skillSlotDict.clear(); + + // Game End - Player Data Reset + m_isOpenPrivateShop = false; + m_isObserverMode = false; + + m_isConsumingStamina = FALSE; + m_fConsumeStaminaPerSec = 0.0f; + m_fCurrentStamina = 0.0f; + + m_bMobileFlag = FALSE; + + __ClearAutoAttackTargetActorID(); +} + +void CPythonPlayer::Clear() +{ + memset(&m_playerStatus, 0, sizeof(m_playerStatus)); + NEW_ClearSkillData(true); + + m_bisProcessingEmotion = FALSE; + + m_dwSendingTargetVID = 0; + m_fTargetUpdateTime = 0.0f; + + // Test Code for Status Interface + m_stName = ""; + m_dwMainCharacterIndex = 0; + m_dwRace = 0; + m_dwWeaponMinPower = 0; + m_dwWeaponMaxPower = 0; + m_dwWeaponMinMagicPower = 0; + m_dwWeaponMaxMagicPower = 0; + m_dwWeaponAddPower = 0; + + ///// + m_MovingCursorPosition = TPixelPosition(0, 0, 0); + m_fMovingCursorSettingTime = 0.0f; + + m_eReservedMode = MODE_NONE; + m_fReservedDelayTime = 0.0f; + m_kPPosReserved = TPixelPosition(0, 0, 0); + m_dwVIDReserved = 0; + m_dwIIDReserved = 0; + m_dwSkillSlotIndexReserved = 0; + m_dwSkillRangeReserved = 0; + + m_isUp = false; + m_isDown = false; + m_isLeft = false; + m_isRight = false; + m_isSmtMov = false; + m_isDirMov = false; + m_isDirKey = false; + m_isAtkKey = false; + + m_isCmrRot = true; + m_fCmrRotSpd = 20.0f; + + m_iComboOld = 0; + + m_dwVIDPicked=0; + m_dwIIDPicked=0; + + m_dwcurSkillSlotIndex = DWORD(-1); + + m_dwTargetVID = 0; + m_dwTargetEndTime = 0; + + m_PartyMemberMap.clear(); + + m_ChallengeInstanceSet.clear(); + m_RevengeInstanceSet.clear(); + + m_isOpenPrivateShop = false; + m_isObserverMode = false; + + m_isConsumingStamina = FALSE; + m_fConsumeStaminaPerSec = 0.0f; + m_fCurrentStamina = 0.0f; + + m_inGuildAreaID = 0xffffffff; + + m_bMobileFlag = FALSE; + + __ClearAutoAttackTargetActorID(); +} + +CPythonPlayer::CPythonPlayer(void) +{ + SetMovableGroundDistance(40.0f); + + // AffectIndex To SkillIndex + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_JEONGWI), 3)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_GEOMGYEONG), 4)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_CHEONGEUN), 19)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_GYEONGGONG), 49)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_EUNHYEONG), 34)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_GONGPO), 64)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_JUMAGAP), 65)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_HOSIN), 94)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_BOHO), 95)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_KWAESOK), 110)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_GICHEON), 96)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_JEUNGRYEOK), 111)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_PABEOP), 66)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_FALLEN_CHEONGEUN), 19)); + ///// + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_GWIGEOM), 63)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_MUYEONG), 78)); + m_kMap_dwAffectIndexToSkillIndex.insert(std::make_pair(int(CInstanceBase::AFFECT_HEUKSIN), 79)); + + m_ppyGameWindow = NULL; + + m_sysIsCoolTime = TRUE; + m_sysIsLevelLimit = TRUE; + m_dwPlayTime = 0; + + m_aeMBFButton[MBT_LEFT]=CPythonPlayer::MBF_SMART; + m_aeMBFButton[MBT_RIGHT]=CPythonPlayer::MBF_CAMERA; + m_aeMBFButton[MBT_MIDDLE]=CPythonPlayer::MBF_CAMERA; + + memset(m_adwEffect, 0, sizeof(m_adwEffect)); + + m_isDestPosition = FALSE; + m_ixDestPos = 0; + m_iyDestPos = 0; + m_iLastAlarmTime = 0; + + Clear(); +} + +CPythonPlayer::~CPythonPlayer(void) +{ +} diff --git a/extension/src/port/UserInterface/PythonPlayerEventHandler.cpp b/extension/src/port/UserInterface/PythonPlayerEventHandler.cpp new file mode 100644 index 00000000..8de2d34b --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayerEventHandler.cpp @@ -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 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()); +} diff --git a/extension/src/port/UserInterface/PythonPlayerEventHandler.h b/extension/src/port/UserInterface/PythonPlayerEventHandler.h new file mode 100644 index 00000000..9187aa0c --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayerEventHandler.h @@ -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 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); + } +}; \ No newline at end of file diff --git a/extension/src/port/UserInterface/PythonPlayerInput.cpp b/extension/src/port/UserInterface/PythonPlayerInput.cpp new file mode 100644 index 00000000..515cfda7 --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayerInput.cpp @@ -0,0 +1,1011 @@ +#include "StdAfx.h" +#include "PythonPlayer.h" +#include "PythonPlayerEventHandler.h" +#include "PythonApplication.h" +#include "../EterLib/Camera.h" +#include "../EterBase/Timer.h" + +const int c_iFastestSendingCount = 3; +const int c_iSlowestSendingCount = 3; +const float c_fFastestSendingDelay = 1.0f / float(c_iFastestSendingCount); +const float c_fSlowestSendingDelay = 1.0f / float(c_iSlowestSendingCount); +const float c_fRotatingStepTime = 0.5f; + +const float c_fComboDistance = 250.0f; +const float c_fClickDistance = 300.0f; + +DWORD CPythonPlayer::__GetPickableDistance() +{ + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (pkInstMain) + if (pkInstMain->IsMountingHorse()) + return 500; + + return 300; +} + +void CPythonPlayer::PickCloseMoney() +{ + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + TPixelPosition kPPosMain; + pkInstMain->NEW_GetPixelPosition(&kPPosMain); + + DWORD dwItemID; + CPythonItem& rkItem=CPythonItem::Instance(); + if (!rkItem.GetCloseMoney(kPPosMain, &dwItemID, __GetPickableDistance())) + return; + + SendClickItemPacket(dwItemID); +} + +void CPythonPlayer::PickCloseItem() +{ + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + TPixelPosition kPPosMain; + pkInstMain->NEW_GetPixelPosition(&kPPosMain); + + DWORD dwItemID; + CPythonItem& rkItem=CPythonItem::Instance(); + if (!rkItem.GetCloseItem(kPPosMain, &dwItemID, __GetPickableDistance())) + return; + + SendClickItemPacket(dwItemID); +} + +bool CPythonPlayer::__IsTarget() +{ + return 0 != __GetTargetVID(); +} + +bool CPythonPlayer::__IsSameTargetVID(DWORD dwVID) +{ + return dwVID == __GetTargetVID(); +} + +DWORD CPythonPlayer::__GetTargetVID() +{ + return m_dwTargetVID; +} + +DWORD CPythonPlayer::GetTargetVID() +{ + return __GetTargetVID(); +} + + +CInstanceBase* CPythonPlayer::__GetTargetActorPtr() +{ + return NEW_FindActorPtr(__GetTargetVID()); +} + +void CPythonPlayer::__SetTargetVID(DWORD dwVID) +{ + m_dwTargetVID=dwVID; +} + +void CPythonPlayer::__ClearTarget() +{ + if (!__IsTarget()) + return; + + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + pkInstMain->ClearFlyTargetInstance(); + + CInstanceBase * pTargetedInstance = __GetTargetActorPtr(); + if (pTargetedInstance) + pTargetedInstance->OnUntargeted(); + + __SetTargetVID(0); + + CPythonNetworkStream::Instance().SendTargetPacket(0); +} + +void CPythonPlayer::SetTarget(DWORD dwVID, BOOL bForceChange) +{ + CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + // 2004. 07. 07. [levites] - 스킬 사용중 타겟이 바뀌는 문제 해결을 위한 코드 + if (!pkInstMain->CanChangeTarget()) + { + return; + } + + DWORD dwCurrentTime = CTimer::Instance().GetCurrentMillisecond(); + + if (__IsSameTargetVID(dwVID)) + { + if (dwVID==pkInstMain->GetVirtualID()) + { + __SetTargetVID(0); + + pkInstMain->OnUntargeted(); + pkInstMain->ClearFlyTargetInstance(); + CPythonNetworkStream::Instance().SendTargetPacket(0); + return; + } + m_dwTargetEndTime = dwCurrentTime + 1000; + return; + } + + if (bForceChange) + { + m_dwTargetEndTime = dwCurrentTime + 2000; + } + else + { + if (m_dwTargetEndTime > dwCurrentTime) + { + return; + } + + m_dwTargetEndTime = dwCurrentTime + 1000; + } + + if (__IsTarget()) + { + CInstanceBase * pTargetedInstance = __GetTargetActorPtr(); + if (pTargetedInstance) + pTargetedInstance->OnUntargeted(); + } + + + CInstanceBase * pkInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(dwVID); + if (pkInstTarget) + { + if (pkInstMain->IsTargetableInstance(*pkInstTarget)) + { + __SetTargetVID(dwVID); + + pkInstTarget->OnTargeted(); + pkInstMain->SetFlyTargetInstance(*pkInstTarget); + pkInstMain->GetGraphicThingInstanceRef().SetFlyEventHandler(CPythonPlayerEventHandler::GetSingleton().GetNormalBowAttackFlyEventHandler(pkInstMain, pkInstTarget)); + CPythonNetworkStream::Instance().SendTargetPacket(dwVID); + + return; + } + } + + __SetTargetVID(0); + + pkInstMain->ClearFlyTargetInstance(); + CPythonNetworkStream::Instance().SendTargetPacket(0); + +} + +bool CPythonPlayer::__ChangeTargetToPickedInstance() +{ + DWORD dwVID; + if (!CPythonCharacterManager::Instance().OLD_GetPickedInstanceVID(&dwVID)) + return false; + + SetTarget(dwVID); + return true; +} + +CInstanceBase * CPythonPlayer::__GetSkillTargetInstancePtr(CPythonSkill::TSkillData& rkSkillData) +{ + if (rkSkillData.IsNeedCorpse()) + return __GetDeadTargetInstancePtr(); + + return __GetAliveTargetInstancePtr(); +} + +CInstanceBase * CPythonPlayer::__GetDeadTargetInstancePtr() +{ + if (!__IsTarget()) + return NULL; + + CInstanceBase * pkInstTarget = __GetTargetActorPtr(); + + if (!pkInstTarget) + return NULL; + + if (!pkInstTarget->IsDead()) + return NULL; + + return pkInstTarget; +} + +CInstanceBase * CPythonPlayer::__GetAliveTargetInstancePtr() +{ + if (!__IsTarget()) + return NULL; + + CInstanceBase * pkInstTarget = __GetTargetActorPtr(); + + if (!pkInstTarget) + return NULL; + + if (pkInstTarget->IsDead()) + return NULL; + + return pkInstTarget; +} + + +void CPythonPlayer::OpenCharacterMenu(DWORD dwVictimActorID) +{ + CInstanceBase * pkInstMain = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + CInstanceBase * pkInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(dwVictimActorID); + if (!pkInstTarget) + return; + + if (!pkInstTarget->IsPC() && !pkInstTarget->IsBuilding()) + return; + +// if (pkInstMain == pkInstTarget) +// return; + + PyCallClassMemberFunc(m_ppyGameWindow, "SetPCTargetBoard", Py_BuildValue("(is)", pkInstTarget->GetVirtualID(), pkInstTarget->GetNameString())); +} + +void CPythonPlayer::__OnClickItem(CInstanceBase& rkInstMain, DWORD dwItemID) +{ +} + +void CPythonPlayer::__OnClickActor(CInstanceBase& rkInstMain, DWORD dwPickedActorID, bool isAuto) +{ + // 만약 스킬을 써서 접근중이라면.. + if (MODE_USE_SKILL == m_eReservedMode) + { + // 같은 캐릭터를 클릭 했으면 리턴 + if (__GetTargetVID() == dwPickedActorID) + return; + + // 2005.03.25.levites + // 탄환격을 쓰고 달려가는중 공격할 수 있는 다른 타겟을 클릭하면 + if (__CheckDashAffect(rkInstMain)) + { + m_dwVIDReserved = dwPickedActorID; + return; + } + } + + __ClearReservedAction(); + + CInstanceBase* pkInstVictim=NEW_FindActorPtr(dwPickedActorID); + CInstanceBase& rkInstVictim=*pkInstVictim; + if (!pkInstVictim) + return; + + // 2005.01.28.myevan + // 초급말 상태에서는 공격이 안되나 NPC 클릭이되어야함 + if (rkInstMain.IsAttackableInstance(*pkInstVictim)) + if (!__CanAttack()) + return; + + if (!rkInstMain.NEW_IsClickableDistanceDestInstance(rkInstVictim)) + { + __ReserveClickActor(dwPickedActorID); + return; + } + + if (rkInstVictim.IsNPC()) + { + __SendClickActorPacket(rkInstVictim); + } + + rkInstMain.NEW_Stop(); + return; +} + +void CPythonPlayer::__OnPressActor(CInstanceBase& rkInstMain, DWORD dwPickedActorID, bool isAuto) +{ + // 만약 스킬을 써서 접근중이라면.. + if (MODE_USE_SKILL == m_eReservedMode) + { + // 같은 캐릭터를 클릭 했으면 리턴 + if (__GetTargetVID() == dwPickedActorID) + return; + + // 2005.03.25.levites + // 탄환격을 쓰고 달려가는중 공격할 수 있는 다른 타겟을 클릭하면 + if (__CheckDashAffect(rkInstMain)) + { + m_dwVIDReserved = dwPickedActorID; + return; + } + } + + __ChangeTargetToPickedInstance(); + __ClearReservedAction(); + + if (!__CanAttack()) + return; + + CInstanceBase* pkInstVictim=NEW_FindActorPtr(dwPickedActorID); + if (!pkInstVictim) + return; + + CInstanceBase& rkInstVictim=*pkInstVictim; + + if (isAuto) + { + // 2004.10.21.myevan.공격가능한 상대만 자동 공격 + if (rkInstMain.IsAttackableInstance(rkInstVictim)) + __SetAutoAttackTargetActorID(rkInstVictim.GetVirtualID()); + } + + if (rkInstMain.IsBowMode()) + { + if (rkInstMain.IsAttackableInstance(rkInstVictim)) + if (!__CanShot(rkInstMain, rkInstVictim)) + return; + } + + if (!rkInstMain.NEW_IsClickableDistanceDestInstance(rkInstVictim)) + { + __ReserveClickActor(dwPickedActorID); + return; + } + + if (!rkInstMain.IsAttackableInstance(rkInstVictim)) + { + return; + } + + CPythonPlayerEventHandler& rkPlayerEventHandler=CPythonPlayerEventHandler::GetSingleton(); + rkInstMain.NEW_AttackToDestInstanceDirection(rkInstVictim, rkPlayerEventHandler.GetNormalBowAttackFlyEventHandler(&rkInstMain, &rkInstVictim)); +} + +void CPythonPlayer::__OnPressItem(CInstanceBase& rkInstMain, DWORD dwPickedItemID) +{ + static DWORD s_dwLastPickItemID=0; + + if (s_dwLastPickItemID==dwPickedItemID) + { + Logn(1, "CPythonPlayer::__OnPressItem - ALREADY PICKED ITEM"); + return; + } + + __ClearReservedAction(); + __ClearAutoAttackTargetActorID(); + + CPythonItem& rkItem=CPythonItem::Instance(); + + TPixelPosition kPPosPickedItem; + if (!rkItem.GetGroundItemPosition(dwPickedItemID, &kPPosPickedItem)) + return; + + if (!rkInstMain.NEW_IsClickableDistanceDestPixelPosition(kPPosPickedItem)) + { + __ReserveClickItem(dwPickedItemID); + return; + } + + rkInstMain.NEW_Stop(); + SendClickItemPacket(dwPickedItemID); +} + +void CPythonPlayer::__OnClickGround(CInstanceBase& rkInstMain, const TPixelPosition& c_rkPPosPickedGround) +{ + if (!__IsMovableGroundDistance(rkInstMain, c_rkPPosPickedGround)) + return; + + if (rkInstMain.NEW_MoveToDestPixelPositionDirection(c_rkPPosPickedGround)) + __ShowPickedEffect(c_rkPPosPickedGround); +} + +void CPythonPlayer::SetMovableGroundDistance(float fDistance) +{ + MOVABLE_GROUND_DISTANCE=fDistance; +} + +bool CPythonPlayer::__IsMovableGroundDistance(CInstanceBase& rkInstMain, const TPixelPosition& c_rkPPosPickedGround) +{ + float fDistance=rkInstMain.NEW_GetDistanceFromDestPixelPosition(c_rkPPosPickedGround); + + if (fDistanceisLock()) + if (!pkInstMain->IsUsingMovingSkill()) + return true; + + CCamera* pkCmrCur=CCameraManager::Instance().GetCurrentCamera(); + if (pkCmrCur) + { + float fCmrCurRot=CameraRotationToCharacterRotation(pkCmrCur->GetRoll()); + + // 현재 + if (m_isCmrRot) + { + float fSigDirRot=fDirRot; + if (fSigDirRot>180.0f) + fSigDirRot=fSigDirRot-360.0f; + + float fRotRat=fSigDirRot; + if (fRotRat>90.0f) + fRotRat=(180.0f-fRotRat); + else if (fRotRat<-90.0f) + fRotRat=(-180.0f-fRotRat); + + float fElapsedTime = CPythonApplication::Instance().GetGlobalElapsedTime(); + + float fRotDeg = -m_fCmrRotSpd * fElapsedTime * fRotRat / 90.0f; + pkCmrCur->Roll(fRotDeg); + } + + fDirRot=fmod(360.0f + fCmrCurRot + fDirRot, 360.0f); + } + + pkInstMain->NEW_MoveToDirection(fDirRot); + + return true; +} + +void CPythonPlayer::NEW_Stop() +{ + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + pkInstMain->NEW_Stop(); + m_isLeft = FALSE; + m_isRight = FALSE; + m_isUp = FALSE; + m_isDown = FALSE; +} + +bool CPythonPlayer::NEW_CancelFishing() +{ + CInstanceBase* pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return false; + + if (pkInstMain->IsFishing()) + { + static DWORD s_dwLastCancelTime = 0; + if (CTimer::Instance().GetCurrentMillisecond() < s_dwLastCancelTime + 500) + return false; + + CPythonNetworkStream::Instance().SendFishingPacket(0); + s_dwLastCancelTime = CTimer::Instance().GetCurrentMillisecond(); + return true; + } + + return false; +} + +void CPythonPlayer::NEW_Fishing() +{ + CInstanceBase* pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + if (pkInstMain->IsFishing()) + { + CPythonNetworkStream::Instance().SendFishingPacket(0); + } + else + { + if (pkInstMain->CanFishing()) + { + int irot; + if (pkInstMain->GetFishingRot(&irot)) + CPythonNetworkStream::Instance().SendFishingPacket(irot); + else + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnFishingWrongPlace", Py_BuildValue("()")); + } + } + } +} + +void CPythonPlayer::NEW_Attack() +{ + // PrivateShop + if (IsOpenPrivateShop()) + return; + + if (!__CanAttack()) + return; + + CInstanceBase* pkInstMain = NEW_GetMainActorPtr(); + if (!pkInstMain) + return; + + if (pkInstMain->IsBowMode()) + { + //CPythonPlayerEventHandler& rkPlayerEventHandler=CPythonPlayerEventHandler::GetSingleton(); + + CInstanceBase * pkInstTarget = __GetAliveTargetInstancePtr(); + if (!pkInstTarget) + { + __ChangeTargetToPickedInstance(); + pkInstTarget = __GetAliveTargetInstancePtr(); + } + + if (pkInstTarget) + { + if (!__CanShot(*pkInstMain, *pkInstTarget)) + return; + + if (!pkInstMain->NEW_IsClickableDistanceDestInstance(*pkInstTarget)) + { + __ReserveClickActor(pkInstTarget->GetVirtualID()); + return; + } + + if (pkInstMain->IsAttackableInstance(*pkInstTarget)) + { + pkInstMain->NEW_LookAtDestInstance(*pkInstTarget); + pkInstMain->NEW_AttackToDestInstanceDirection(*pkInstTarget); + } + } + else + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotUseSkill", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_TARGET")); + return; + } + } + else if (m_isDirKey) + { + float fDirRot=0.0f; + NEW_GetMultiKeyDirRotation(m_isLeft, m_isRight, m_isUp, m_isDown, &fDirRot); + + CCamera* pkCmrCur=CCameraManager::Instance().GetCurrentCamera(); + if (pkCmrCur) + { + float fCmrCurRot=CameraRotationToCharacterRotation(pkCmrCur->GetRoll()); + + fDirRot=fmod(360.0f + fCmrCurRot + fDirRot, 360.0f); + } + + pkInstMain->NEW_Attack(fDirRot); + } + else + { + //!@# 말에 탄 상태에서 맨손 공격은 지원되지 않는다 - [levites] + if (pkInstMain->IsMountingHorse()) + { + if (pkInstMain->IsHandMode()) + return; + } + + pkInstMain->NEW_Attack(); + } +} + +bool CPythonPlayer::NEW_IsEmptyReservedDelayTime(float fElapsedTime) +{ + m_fReservedDelayTime -= fElapsedTime; + + if (m_fReservedDelayTime <= 0.0f) + { + m_fReservedDelayTime = 0.0f; + return true; + } + + return false; +} + + +void CPythonPlayer::NEW_SetAutoCameraRotationSpeed(float fRotSpd) +{ + m_fCmrRotSpd=fRotSpd; +} + +void CPythonPlayer::NEW_ResetCameraRotation() +{ + CCamera* pkCmrCur=CCameraManager::Instance().GetCurrentCamera(); + CPythonApplication & rkApp = CPythonApplication::Instance(); + + pkCmrCur->EndDrag(); + + rkApp.SetCursorNum(CPythonApplication::NORMAL); + if ( CPythonApplication::CURSOR_MODE_HARDWARE == rkApp.GetCursorMode()) + rkApp.SetCursorVisible(TRUE); +} + + +bool CPythonPlayer::__CanShot(CInstanceBase& rkInstMain, CInstanceBase& rkInstTarget) +{ + if (!__HasEnoughArrow()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShot", Py_BuildValue("(is)", GetMainCharacterIndex(), "EMPTY_ARROW")); + return false; + } + + if (rkInstMain.IsInSafe()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShot", Py_BuildValue("(is)", GetMainCharacterIndex(), "IN_SAFE")); + return false; + } + + if (rkInstTarget.IsInSafe()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShot", Py_BuildValue("(is)", GetMainCharacterIndex(), "DEST_IN_SAFE")); + return false; + } + + return true; +} + +bool CPythonPlayer::__CanChangeTarget() +{ + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (!pkInstMain) + return false; + + return pkInstMain->CanChangeTarget(); +} + +bool CPythonPlayer::__CanMove() +{ + if (__IsProcessingEmotion()) + { + return false; + } + + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (!pkInstMain) + return false; + + if (!pkInstMain->CanMove()) + { + if (!pkInstMain->IsUsingMovingSkill()) + return false; + } + + return true; +} +/* +bool CPythonPlayer::__OLD_CanMove() +{ + if (__IsProcessingEmotion()) + { + return false; + } + + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (!pkInstMain) + return false; + + if (pkInstMain->IsDead()) + return false; + + if (pkInstMain->IsStun()) + return false; + + if (pkInstMain->isLock()) + return false; + + if (pkInstMain->IsParalysis()) + return false; + + return true; +} +*/ + +bool CPythonPlayer::__CanAttack() +{ + if (__IsProcessingEmotion()) + { + return false; + } + + if (IsOpenPrivateShop()) + return false; + + if (IsObserverMode()) + return false; + + CInstanceBase* pkInstMain=NEW_GetMainActorPtr(); + if (!pkInstMain) + return false; + + // Fix me + // 뉴마운트 25레벨 이상 35레벨 미만인 경우 중급 마운트를 타고 공격못하도록 하드 코딩... + // 나중에 시간 나면 can attack 체크를 서버에서 해주자... + // ㅡ_ㅡ unique 슬롯에 차는 탈것은 이 조건이랑 관계없이 공격할 수 있어야 한다 ㅡ_ㅡ + // ㅡ_ㅡ 뉴마운트만 이 체크를 하게 함... ㅡ_ㅡ_ㅡ_ㅡ_ㅡ + if (pkInstMain->IsMountingHorse() && pkInstMain->IsNewMount() && (GetSkillGrade(109) < 1 && GetSkillLevel(109) < 11)) + { + return false; + } + + return pkInstMain->CanAttack(); +} + +void CPythonPlayer::NEW_GetMultiKeyDirRotation(bool isLeft, bool isRight, bool isUp, bool isDown, float* pfDirRot) +{ + float fScrX=0.0f; + float fScrY=0.0f; + + if (isLeft) + fScrX=0.0f; + else if (isRight) + fScrX=1.0f; + else + fScrX=0.5f; + + if (isUp) + fScrY=0.0f; + else if (isDown) + fScrY=1.0f; + else + fScrY=0.5f; + + NEW_GetMouseDirRotation(fScrX, fScrY, pfDirRot); +} + +void CPythonPlayer::NEW_GetMouseDirRotation(float fScrX, float fScrY, float* pfDirRot) +{ + long lWidth = UI::CWindowManager::Instance().GetScreenWidth(); + long lHeight = UI::CWindowManager::Instance().GetScreenHeight(); + int nScrPosX=lWidth*fScrX; + int nScrPosY=lHeight*fScrY; + int nScrWidth=lWidth; + int nScrHeight=lHeight; + int nScrCenterX=nScrWidth/2; + int nScrCenterY=nScrHeight/2; + + float finputRotation = GetDegreeFromPosition(nScrPosX, nScrPosY, nScrCenterX, nScrCenterY); + *pfDirRot=finputRotation; +} + + +float CPythonPlayer::GetDegreeFromPosition(int ix, int iy, int iHalfWidth, int iHalfHeight) +{ + D3DXVECTOR3 vtDir(float(ix - iHalfWidth), float(iy - iHalfHeight), 0.0f); + D3DXVec3Normalize(&vtDir, &vtDir); + + D3DXVECTOR3 vtStan(0, -1, 0); + float ret = D3DXToDegree(acosf(D3DXVec3Dot(&vtDir, &vtStan))); + + if (vtDir.x < 0.0f) + ret = 360.0f - ret; + + return 360.0f - ret; +} + +void CPythonPlayer::__ClearReservedAction() +{ + m_eReservedMode=MODE_NONE; +} + +void CPythonPlayer::__ReserveClickItem(DWORD dwItemID) +{ + m_eReservedMode=MODE_CLICK_ITEM; + m_dwIIDReserved=dwItemID; +} + +void CPythonPlayer::__ReserveClickActor(DWORD dwActorID) +{ + m_eReservedMode=MODE_CLICK_ACTOR; + m_dwVIDReserved=dwActorID; +} + +void CPythonPlayer::__ReserveClickGround(const TPixelPosition& c_rkPPosPickedGround) +{ + m_eReservedMode=MODE_CLICK_POSITION; + m_kPPosReserved=c_rkPPosPickedGround; + m_fReservedDelayTime=0.1f; +} + +bool CPythonPlayer::__IsReservedUseSkill(DWORD dwSkillSlotIndex) +{ + if (MODE_USE_SKILL!=m_eReservedMode) + return false; + + if (m_dwSkillSlotIndexReserved!=dwSkillSlotIndex) + return false; + + return true; +} + +void CPythonPlayer::__ReserveUseSkill(DWORD dwActorID, DWORD dwSkillSlotIndex, DWORD dwRange) +{ + m_eReservedMode=MODE_USE_SKILL; + m_dwVIDReserved=dwActorID; + m_dwSkillSlotIndexReserved=dwSkillSlotIndex; + m_dwSkillRangeReserved=dwRange; + + // NOTE : 아슬아슬하게 거리가 꼬이는 문제가 있어서 약간 느슨하게.. + if (m_dwSkillRangeReserved > 100) + m_dwSkillRangeReserved -= 10; +} + +void CPythonPlayer::__ClearAutoAttackTargetActorID() +{ + __SetAutoAttackTargetActorID(0); +} + +void CPythonPlayer::__SetAutoAttackTargetActorID(DWORD dwVID) +{ + m_dwAutoAttackTargetVID = dwVID; +} + + +void CPythonPlayer::__ReserveProcess_ClickActor() +{ + CInstanceBase* pkInstMain = NEW_GetMainActorPtr(); + CInstanceBase* pkInstReserved = NEW_FindActorPtr(m_dwVIDReserved); + if (!pkInstMain || !pkInstReserved) + { + __ClearReservedAction(); + return; + } + + if (!pkInstMain->NEW_IsClickableDistanceDestInstance(*pkInstReserved)) + { + pkInstMain->NEW_MoveToDestInstanceDirection(*pkInstReserved); + return; + } + + if (!pkInstMain->IsAttackableInstance(*pkInstReserved)) + { + pkInstMain->NEW_Stop(); + __SendClickActorPacket(*pkInstReserved); + __ClearReservedAction(); + return; + } + + if (pkInstReserved->IsDead()) + { + __ClearReservedAction(); + return; + } + + if (pkInstMain->IsInSafe()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotAttack", Py_BuildValue("(is)", GetMainCharacterIndex(), "IN_SAFE")); + pkInstMain->NEW_Stop(); + __ClearReservedAction(); + return; + } + + if (pkInstReserved->IsInSafe()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotAttack", Py_BuildValue("(is)", GetMainCharacterIndex(), "DEST_IN_SAFE")); + pkInstMain->NEW_Stop(); + __ClearReservedAction(); + return; + } + + // 탄환격 쓰고 달려가는 도중에는 공격하지 않는다. + if (__CheckDashAffect(*pkInstMain)) + { + return; + } + + ///// + + if (pkInstMain->IsBowMode()) + { + if (!__HasEnoughArrow()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShot", Py_BuildValue("(is)", GetMainCharacterIndex(), "EMPTY_ARROW")); + pkInstMain->NEW_Stop(); + __ClearReservedAction(); + return; + } + } + + if (pkInstReserved->GetVirtualID() != GetTargetVID()) + { + SetTarget(pkInstReserved->GetVirtualID()); + } + + pkInstMain->NEW_AttackToDestInstanceDirection(*pkInstReserved); + __ClearReservedAction(); +} +/* +CInstanceBase* pkInstReserved=NEW_FindActorPtr(m_dwVIDReserved); +if (pkInstReserved) +{ + if (pkInstMain->NEW_IsClickableDistanceDestInstance(*pkInstReserved)) + { + if (pkInstMain->IsAttackableInstance(*pkInstReserved) ) + { + if (!pkInstReserved->IsDead()) + { + if (pkInstMain->IsInSafe()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotAttack", Py_BuildValue("(is)", GetMainCharacterIndex(), "IN_SAFE")); + pkInstMain->NEW_Stop(); + } + else if (pkInstReserved->IsInSafe()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotAttack", Py_BuildValue("(is)", GetMainCharacterIndex(), "DEST_IN_SAFE")); + pkInstMain->NEW_Stop(); + } + else + { + if (pkInstMain->IsBowMode()) + { + if (!__HasEnoughArrow()) + { + PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShot", Py_BuildValue("(is)", GetMainCharacterIndex(), "EMPTY_ARROW")); + pkInstMain->NEW_Stop(); + __ClearReservedAction(); + break; + } + } + + if (pkInstReserved->GetVirtualID() != GetTargetVID()) + { + SetTarget(pkInstReserved->GetVirtualID()); + } + + pkInstMain->NEW_AttackToDestInstanceDirection(*pkInstReserved); + } + } + } + else + { + __SendClickActorPacket(*pkInstReserved); + + pkInstMain->NEW_Stop(); + } + + __ClearReservedAction(); + } + else + { + //Tracen("ReservedMode: MOVE"); + pkInstMain->NEW_MoveToDestInstanceDirection(*pkInstReserved); + } +} +else +{ + __ClearReservedAction(); +} +*/ diff --git a/extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp b/extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp new file mode 100644 index 00000000..2ba1fb42 --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayerInputKeyboard.cpp @@ -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; +} diff --git a/extension/src/port/UserInterface/PythonPlayerInputMouse.cpp b/extension/src/port/UserInterface/PythonPlayerInputMouse.cpp new file mode 100644 index 00000000..d748370f --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayerInputMouse.cpp @@ -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]; +} diff --git a/extension/src/port/UserInterface/PythonPlayerModule.cpp b/extension/src/port/UserInterface/PythonPlayerModule.cpp new file mode 100644 index 00000000..dbdf0822 --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayerModule.cpp @@ -0,0 +1,2574 @@ +#include "../common/PortPythonPointer.h" // PORT: preserve Win32 pointer handles on 64-bit hosts +#include "StdAfx.h" +#include "PythonPlayer.h" +#include "PythonApplication.h" + +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, + +}; + +std::map m_kMap_iEmotionIndex_pkIconImage; + +extern int TWOHANDED_WEWAPON_ATT_SPEED_DECREASE_VALUE; + + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM +class CBeltInventoryHelper +{ +public: + typedef BYTE TGradeUnit; + + static TGradeUnit GetBeltGradeByRefineLevel(int refineLevel) + { + static TGradeUnit beltGradeByLevelTable[] = + { + 0, // 벨트+0 + 1, // +1 + 1, // +2 + 2, // +3 + 2, // +4, + 3, // +5 + 4, // +6, + 5, // +7, + 6, // +8, + 7, // +9 + }; + + return beltGradeByLevelTable[refineLevel]; + } + + // 현재 벨트 레벨을 기준으로, 어떤 셀들을 이용할 수 있는지 리턴 + static const TGradeUnit* GetAvailableRuleTableByGrade() + { + /** + 벨트는 총 +0 ~ +9 레벨을 가질 수 있으며, 레벨에 따라 7단계 등급으로 구분되어 인벤토리가 활성 화 된다. + 벨트 레벨에 따른 사용 가능한 셀은 아래 그림과 같음. 현재 등급 >= 활성가능 등급이면 사용 가능. + (단, 현재 레벨이 0이면 무조건 사용 불가, 괄호 안의 숫자는 등급) + + 2(1) 4(2) 6(4) 8(6) + 5(3) 5(3) 6(4) 8(6) + 7(5) 7(5) 7(5) 8(6) + 9(7) 9(7) 9(7) 9(7) + + 벨트 인벤토리의 크기는 4x4 (16칸) + */ + + static TGradeUnit availableRuleByGrade[c_Belt_Inventory_Slot_Count] = { + 1, 2, 4, 6, + 3, 3, 4, 6, + 5, 5, 5, 6, + 7, 7, 7, 7 + }; + + return availableRuleByGrade; + } + + static bool IsAvailableCell(WORD cell, int beltGrade /*int beltLevel*/) + { + // 기획 또 바뀜.. 아놔... + //const TGradeUnit beltGrade = GetBeltGradeByRefineLevel(beltLevel); + const TGradeUnit* ruleTable = GetAvailableRuleTableByGrade(); + + return ruleTable[cell] <= beltGrade; + } + +}; +#endif + +PyObject * playerPickCloseItem(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().PickCloseItem(); + return Py_BuildNone(); +} + + +PyObject * playerSetGameWindow(PyObject* poSelf, PyObject* poArgs) +{ + PyObject * pyHandle; + if (!PyTuple_GetObject(poArgs, 0, &pyHandle)) + return Py_BadArgument(); + + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + rkPlayer.SetGameWindow(pyHandle); + return Py_BuildNone(); +} + + +PyObject * playerSetQuickCameraMode(PyObject* poSelf, PyObject* poArgs) +{ + int nIsEnable; + if (!PyTuple_GetInteger(poArgs, 0, &nIsEnable)) + return Py_BadArgument(); + + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + rkPlayer.SetQuickCameraMode(nIsEnable ? true : false); + + return Py_BuildNone(); +} + +// Test Code +PyObject * playerSetMainCharacterIndex(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CPythonPlayer::Instance().SetMainCharacterIndex(iVID); + CPythonCharacterManager::Instance().SetMainInstance(iVID); + + return Py_BuildNone(); +} +// Test Code + +PyObject * playerGetMainCharacterIndex(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().GetMainCharacterIndex()); +} + +PyObject * playerGetMainCharacterName(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("s", CPythonPlayer::Instance().GetName()); +} + +PyObject * playerGetMainCharacterPosition(PyObject* poSelf, PyObject* poArgs) +{ + TPixelPosition kPPosMainActor; + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + rkPlayer.NEW_GetMainActorPosition(&kPPosMainActor); + return Py_BuildValue("fff", kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z); +} + +PyObject * playerIsMainCharacterIndex(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().IsMainCharacterIndex(iVID)); +} + +PyObject * playerCanAttackInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVID); + if (!pMainInstance) + return Py_BuildValue("i", 0); + if (!pTargetInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pMainInstance->IsAttackableInstance(*pTargetInstance)); +} + +PyObject * playerIsActingEmotion(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (!pMainInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pMainInstance->IsActingEmotion()); +} + +PyObject * playerIsPVPInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVID); + if (!pMainInstance) + return Py_BuildValue("i", 0); + if (!pTargetInstance) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", pMainInstance->IsPVPInstance(*pTargetInstance)); +} + +PyObject * playerIsSameEmpire(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVID); + if (!pMainInstance) + return Py_BuildValue("i", FALSE); + if (!pTargetInstance) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", pMainInstance->IsSameEmpire(*pTargetInstance)); +} + +PyObject * playerIsChallengeInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().IsChallengeInstance(iVID)); +} + +PyObject * playerIsRevengeInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().IsRevengeInstance(iVID)); +} + +PyObject * playerIsCantFightInstance(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().IsCantFightInstance(iVID)); +} + +PyObject * playerGetCharacterDistance(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVID); + if (!pMainInstance) + return Py_BuildValue("f", -1.0f); + if (!pTargetInstance) + return Py_BuildValue("f", -1.0f); + + return Py_BuildValue("f", pMainInstance->GetDistance(pTargetInstance)); +} + +PyObject * playerIsInSafeArea(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (!pMainInstance) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", pMainInstance->IsInSafe()); +} + +PyObject * playerIsMountingHorse(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (!pMainInstance) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", pMainInstance->IsMountingHorse()); +} + +PyObject * playerIsObserverMode(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + return Py_BuildValue("i", rkPlayer.IsObserverMode()); +} + +PyObject * playerActEmotion(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.ActEmotion(iVID); + return Py_BuildNone(); +} + +PyObject * playerShowPlayer(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (pMainInstance) + pMainInstance->GetGraphicThingInstanceRef().Show(); + return Py_BuildNone(); +} + +PyObject * playerHidePlayer(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (pMainInstance) + pMainInstance->GetGraphicThingInstanceRef().Hide(); + return Py_BuildNone(); +} + + +PyObject * playerComboAttack(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().NEW_Attack(); + return Py_BuildNone(); +} + + +PyObject * playerRegisterEffect(PyObject* poSelf, PyObject* poArgs) +{ + int iEft; + if (!PyTuple_GetInteger(poArgs, 0, &iEft)) + return Py_BadArgument(); + + char* szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BadArgument(); + + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + if (!rkPlayer.RegisterEffect(iEft, szFileName, false)) + return Py_BuildException("CPythonPlayer::RegisterEffect(eEft=%d, szFileName=%s", iEft, szFileName); + + return Py_BuildNone(); +} + +PyObject * playerRegisterCacheEffect(PyObject* poSelf, PyObject* poArgs) +{ + int iEft; + if (!PyTuple_GetInteger(poArgs, 0, &iEft)) + return Py_BadArgument(); + + char* szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BadArgument(); + + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + if (!rkPlayer.RegisterEffect(iEft, szFileName, true)) + return Py_BuildException("CPythonPlayer::RegisterEffect(eEft=%d, szFileName=%s", iEft, szFileName); + + return Py_BuildNone(); +} + +PyObject * playerSetAttackKeyState(PyObject* poSelf, PyObject* poArgs) +{ + int isPressed; + if (!PyTuple_GetInteger(poArgs, 0, &isPressed)) + return Py_BuildException("playerSetAttackKeyState(isPressed) - There is no first argument"); + + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + rkPlayer.SetAttackKeyState(isPressed ? true : false); + return Py_BuildNone(); +} + +PyObject * playerSetSingleDIKKeyState(PyObject* poSelf, PyObject* poArgs) +{ + int eDIK; + if (!PyTuple_GetInteger(poArgs, 0, &eDIK)) + return Py_BuildException("playerSetSingleDIKKeyState(eDIK, isPressed) - There is no first argument"); + + int isPressed; + if (!PyTuple_GetInteger(poArgs, 1, &isPressed)) + return Py_BuildException("playerSetSingleDIKKeyState(eDIK, isPressed) - There is no second argument"); + + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + rkPlayer.NEW_SetSingleDIKKeyState(eDIK, isPressed ? true : false); + return Py_BuildNone(); +} + +PyObject * playerEndKeyWalkingImmediately(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().NEW_Stop(); + return Py_BuildNone(); +} + + +PyObject * playerStartMouseWalking(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildNone(); +} + +PyObject * playerEndMouseWalking(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildNone(); +} + +PyObject * playerResetCameraRotation(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().NEW_ResetCameraRotation(); + return Py_BuildNone(); +} + +PyObject* playerSetAutoCameraRotationSpeed(PyObject* poSelf, PyObject* poArgs) +{ + float fCmrRotSpd; + if (!PyTuple_GetFloat(poArgs, 0, &fCmrRotSpd)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.NEW_SetAutoCameraRotationSpeed(fCmrRotSpd); + return Py_BuildNone(); +} + +PyObject* playerSetMouseState(PyObject* poSelf, PyObject* poArgs) +{ + int eMBT; + if (!PyTuple_GetInteger(poArgs, 0, &eMBT)) + return Py_BuildException(); + + int eMBS; + if (!PyTuple_GetInteger(poArgs, 1, &eMBS)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.NEW_SetMouseState(eMBT, eMBS); + + return Py_BuildNone(); +} + +PyObject* playerSetMouseFunc(PyObject* poSelf, PyObject* poArgs) +{ + int eMBT; + if (!PyTuple_GetInteger(poArgs, 0, &eMBT)) + return Py_BuildException(); + + int eMBS; + if (!PyTuple_GetInteger(poArgs, 1, &eMBS)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.NEW_SetMouseFunc(eMBT, eMBS); + + return Py_BuildNone(); +} + +PyObject* playerGetMouseFunc(PyObject* poSelf, PyObject* poArgs) +{ + int eMBT; + if (!PyTuple_GetInteger(poArgs, 0, &eMBT)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + return Py_BuildValue("i", rkPlayer.NEW_GetMouseFunc(eMBT)); +} + +PyObject* playerSetMouseMiddleButtonState(PyObject* poSelf, PyObject* poArgs) +{ + int eMBS; + if (!PyTuple_GetInteger(poArgs, 0, &eMBS)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.NEW_SetMouseMiddleButtonState(eMBS); + + return Py_BuildNone(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +PyObject * playerGetName(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("s", CPythonPlayer::Instance().GetName()); +} + +PyObject * playerGetRace(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().GetRace()); +} + +PyObject * playerGetJob(PyObject* poSelf, PyObject* poArgs) +{ + int race = CPythonPlayer::Instance().GetRace(); + int job = RaceToJob(race); + return Py_BuildValue("i", job); +} + +PyObject * playerGetPlayTime(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().GetPlayTime()); +} + +PyObject * playerSetPlayTime(PyObject* poSelf, PyObject* poArgs) +{ + int iTime; + if (!PyTuple_GetInteger(poArgs, 0, &iTime)) + return Py_BuildException(); + + CPythonPlayer::Instance().SetPlayTime(iTime); + return Py_BuildNone(); +} + +PyObject * playerIsSkillCoolTime(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().IsSkillCoolTime(iSlotIndex)); +} + +PyObject * playerGetSkillCoolTime(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + float fCoolTime = CPythonPlayer::Instance().GetSkillCoolTime(iSlotIndex); + float fElapsedCoolTime = CPythonPlayer::Instance().GetSkillElapsedCoolTime(iSlotIndex); + return Py_BuildValue("ff", fCoolTime, fElapsedCoolTime); +} + +PyObject * playerIsSkillActive(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().IsSkillActive(iSlotIndex)); +} + +PyObject * playerUseGuildSkill(PyObject* poSelf, PyObject* poArgs) +{ + int iSkillSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSkillSlotIndex)) + return Py_BuildException(); + + CPythonPlayer::Instance().UseGuildSkill(iSkillSlotIndex); + return Py_BuildNone(); +} + +PyObject * playerAffectIndexToSkillIndex(PyObject* poSelf, PyObject* poArgs) +{ + int iAffectIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iAffectIndex)) + return Py_BuildException(); + + DWORD dwSkillIndex; + if (!CPythonPlayer::Instance().AffectIndexToSkillIndex(iAffectIndex, &dwSkillIndex)) + return Py_BuildValue("i", 0); + + return Py_BuildValue("i", dwSkillIndex); +} + +PyObject * playerGetEXP(PyObject* poSelf, PyObject* poArgs) +{ + DWORD dwEXP = CPythonPlayer::Instance().GetStatus(POINT_EXP); + return Py_BuildValue("l", dwEXP); +} + +PyObject * playerGetStatus(PyObject* poSelf, PyObject* poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + + long iValue = CPythonPlayer::Instance().GetStatus(iType); + + if (POINT_ATT_SPEED == iType) + { + CInstanceBase * pInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (pInstance && (CItemData::WEAPON_TWO_HANDED == pInstance->GetWeaponType())) + { + iValue -= TWOHANDED_WEWAPON_ATT_SPEED_DECREASE_VALUE; + } + } + + return Py_BuildValue("i", iValue); +} + +PyObject * playerSetStatus(PyObject* poSelf, PyObject* poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + + int iValue; + if (!PyTuple_GetInteger(poArgs, 1, &iValue)) + return Py_BuildException(); + + CPythonPlayer::Instance().SetStatus(iType, iValue); + return Py_BuildNone(); +} + +PyObject * playerGetElk(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().GetStatus(POINT_GOLD)); +} + +PyObject * playerGetGuildID(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (!pInstance) + return Py_BuildValue("i", 0); + return Py_BuildValue("i", pInstance->GetGuildID()); +} + +PyObject * playerGetGuildName(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + if (pInstance) + { + DWORD dwID = pInstance->GetGuildID(); + std::string strName; + if (CPythonGuild::Instance().GetGuildName(dwID, &strName)) + return Py_BuildValue("s", strName.c_str()); + } + return Py_BuildValue("s", ""); +} + +PyObject * playerGetAlignmentData(PyObject* poSelf, PyObject* poArgs) +{ + CInstanceBase * pInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + int iAlignmentPoint = 0; + int iAlignmentGrade = 4; + if (pInstance) + { + iAlignmentPoint = pInstance->GetAlignment(); + iAlignmentGrade = pInstance->GetAlignmentGrade(); + } + return Py_BuildValue("ii", iAlignmentPoint, iAlignmentGrade); +} + +PyObject * playerSetSkill(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + int iSkillIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSkillIndex)) + return Py_BuildException(); + + CPythonPlayer::Instance().SetSkill(iSlotIndex, iSkillIndex); + return Py_BuildNone(); +} + +PyObject * playerGetSkillIndex(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().GetSkillIndex(iSlotIndex)); +} + +PyObject * playerGetSkillSlotIndex(PyObject* poSelf, PyObject* poArgs) +{ + int iSkillIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex)) + return Py_BuildException(); + + DWORD dwSlotIndex; + if (!CPythonPlayer::Instance().GetSkillSlotIndex(iSkillIndex, &dwSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("i", dwSlotIndex); +} + +PyObject * playerGetSkillGrade(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().GetSkillGrade(iSlotIndex)); +} + +PyObject * playerGetSkillLevel(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().GetSkillLevel(iSlotIndex)); +} + +PyObject * playerGetSkillCurrentEfficientPercentage(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("f", CPythonPlayer::Instance().GetSkillCurrentEfficientPercentage(iSlotIndex)); +} +PyObject * playerGetSkillNextEfficientPercentage(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("f", CPythonPlayer::Instance().GetSkillNextEfficientPercentage(iSlotIndex)); +} + +PyObject * playerClickSkillSlot(PyObject * poSelf, PyObject * poArgs) +{ + int iSkillSlot; + if (!PyTuple_GetInteger(poArgs, 0, &iSkillSlot)) + return Py_BadArgument(); + + CPythonPlayer::Instance().ClickSkillSlot(iSkillSlot); + + return Py_BuildNone(); +} + +PyObject * playerChangeCurrentSkillNumberOnly(PyObject * poSelf, PyObject * poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BadArgument(); + + CPythonPlayer::Instance().ChangeCurrentSkillNumberOnly(iSlotIndex); + + return Py_BuildNone(); +} + +PyObject * playerClearSkillDict(PyObject * poSelf, PyObject * poArgs) +{ + CPythonPlayer::Instance().ClearSkillDict(); + return Py_BuildNone(); +} + +PyObject * playerMoveItem(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos srcCell; + TItemPos dstCell; + switch (PyTuple_Size(poArgs)) + { + case 2: + //int iSourceSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &srcCell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &dstCell.cell)) + return Py_BuildException(); + break; + case 4: + if (!PyTuple_GetByte(poArgs, 0, &srcCell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &srcCell.cell)) + return Py_BuildException(); + if (!PyTuple_GetByte(poArgs, 2, &dstCell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 3, &dstCell.cell)) + return Py_BuildException(); + default: + return Py_BuildException(); + } + + CPythonPlayer::Instance().MoveItemData(srcCell, dstCell); + return Py_BuildNone(); +} + +PyObject * playerSendClickItemPacket(PyObject* poSelf, PyObject* poArgs) +{ + int ivid; + if (!PyTuple_GetInteger(poArgs, 0, &ivid)) + return Py_BuildException(); + + CPythonPlayer::Instance().SendClickItemPacket(ivid); + return Py_BuildNone(); +} + +PyObject * playerGetItemIndex(PyObject* poSelf, PyObject* poArgs) +{ + switch (PyTuple_Size(poArgs)) + { + case 1: + { + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + int ItemIndex = CPythonPlayer::Instance().GetItemIndex(TItemPos (INVENTORY, iSlotIndex)); + return Py_BuildValue("i", ItemIndex); + } + case 2: + { + TItemPos Cell; + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + + int ItemIndex = CPythonPlayer::Instance().GetItemIndex(Cell); + return Py_BuildValue("i", ItemIndex); + } + default: + return Py_BuildException(); + + } +} + +PyObject * playerGetItemFlags(PyObject* poSelf, PyObject* poArgs) +{ + switch (PyTuple_Size(poArgs)) + { + case 1: + { + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + DWORD flags = CPythonPlayer::Instance().GetItemFlags(TItemPos(INVENTORY, iSlotIndex)); + return Py_BuildValue("i", flags); + } + case 2: + { + TItemPos Cell; + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + + DWORD flags = CPythonPlayer::Instance().GetItemFlags(Cell); + return Py_BuildValue("i", flags); + } + default: + return Py_BuildException(); + } +} + + +PyObject * playerGetItemCount(PyObject* poSelf, PyObject* poArgs) +{ + switch (PyTuple_Size(poArgs)) + { + case 1: + { + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + int ItemNum = CPythonPlayer::Instance().GetItemCount(TItemPos (INVENTORY, iSlotIndex)); + return Py_BuildValue("i", ItemNum); + } + case 2: + { + TItemPos Cell; + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + + int ItemNum = CPythonPlayer::Instance().GetItemCount(Cell); + + return Py_BuildValue("i", ItemNum); + } + default: + return Py_BuildException(); + + } +} + +PyObject * playerSetItemCount(PyObject* poSelf, PyObject* poArgs) +{ + switch (PyTuple_Size(poArgs)) + { + case 2: + { + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + BYTE bCount; + if (!PyTuple_GetInteger(poArgs, 1, &bCount)) + return Py_BuildException(); + + if (0 == bCount) + return Py_BuildException(); + + CPythonPlayer::Instance().SetItemCount(TItemPos (INVENTORY, iSlotIndex), bCount); + return Py_BuildNone(); + } + case 3: + { + TItemPos Cell; + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + + BYTE bCount; + if (!PyTuple_GetInteger(poArgs, 2, &bCount)) + return Py_BuildException(); + + CPythonPlayer::Instance().SetItemCount(Cell, bCount); + + return Py_BuildNone(); + } + default: + return Py_BuildException(); + + } +} + +PyObject * playerGetItemCountByVnum(PyObject* poSelf, PyObject* poArgs) +{ + int ivnum; + if (!PyTuple_GetInteger(poArgs, 0, &ivnum)) + return Py_BuildException(); + + int ItemNum = CPythonPlayer::Instance().GetItemCountByVnum(ivnum); + return Py_BuildValue("i", ItemNum); +} + +PyObject * playerGetItemMetinSocket(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos Cell; + int iMetinSocketIndex; + + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &iMetinSocketIndex)) + return Py_BuildException(); + + break; + case 3: + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &iMetinSocketIndex)) + return Py_BuildException(); + + break; + + default: + return Py_BuildException(); + + } + int nMetinSocketValue = CPythonPlayer::Instance().GetItemMetinSocket(Cell, iMetinSocketIndex); + return Py_BuildValue("i", nMetinSocketValue); +} + +PyObject * playerGetItemAttribute(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos Cell; + //int iSlotPos; + int iAttributeSlotIndex; + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &iAttributeSlotIndex)) + return Py_BuildException(); + + break; + case 3: + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 2, &iAttributeSlotIndex)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + BYTE byType; + short sValue; + CPythonPlayer::Instance().GetItemAttribute(Cell, iAttributeSlotIndex, &byType, &sValue); + + return Py_BuildValue("ii", byType, sValue); +} + +PyObject * playerGetItemLink(PyObject * poSelf, PyObject * poArgs) +{ + TItemPos Cell; + + switch (PyTuple_Size(poArgs)) + { + case 1: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + break; + case 2: + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + const TItemData * pPlayerItem = CPythonPlayer::Instance().GetItemData(Cell); + CItemData * pItemData = NULL; + char buf[1024]; + + if (pPlayerItem && CItemManager::Instance().GetItemDataPointer(pPlayerItem->vnum, &pItemData)) + { + char itemlink[256]; + int len; + bool isAttr = false; + + len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x", + pPlayerItem->vnum, pPlayerItem->flags, + pPlayerItem->alSockets[0], pPlayerItem->alSockets[1], pPlayerItem->alSockets[2]); + + for (int i = 0; i < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++i) + if (pPlayerItem->aAttr[i].bType != 0) + { + len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d", + pPlayerItem->aAttr[i].bType, pPlayerItem->aAttr[i].sValue); + isAttr = true; + } + + + if( GetDefaultCodePage() == CP_ARABIC ) { + if (isAttr) + //"item:번호:플래그:소켓0:소켓1:소켓2" + snprintf(buf, sizeof(buf), " |h|r[%s]|cffffc700|H%s|h", pItemData->GetName(), itemlink); + else + snprintf(buf, sizeof(buf), " |h|r[%s]|cfff1e6c0|H%s|h", pItemData->GetName(), itemlink); + } else { + if (isAttr) + //"item:번호:플래그:소켓0:소켓1:소켓2" + snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); + else + snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); + } + } + else + buf[0] = '\0'; + + return Py_BuildValue("s", buf); +} + +PyObject * playerGetISellItemPrice(PyObject * poSelf, PyObject * poArgs) +{ + TItemPos Cell; + + switch (PyTuple_Size(poArgs)) + { + case 1: + if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) + return Py_BuildException(); + break; + case 2: + if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + CItemData * pItemData; + + if (!CItemManager::Instance().GetItemDataPointer(CPythonPlayer::Instance().GetItemIndex(Cell), &pItemData)) + return Py_BuildValue("i", 0); + + int iPrice; + + if (pItemData->IsFlag(CItemData::ITEM_FLAG_COUNT_PER_1GOLD)) + iPrice = CPythonPlayer::Instance().GetItemCount(Cell) / pItemData->GetISellItemPrice(); + else + iPrice = pItemData->GetISellItemPrice() * CPythonPlayer::Instance().GetItemCount(Cell); + + iPrice /= 5; + return Py_BuildValue("i", iPrice); +} + +PyObject * playerGetQuickPage(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().GetQuickPage()); +} + +PyObject * playerSetQuickPage(PyObject* poSelf, PyObject* poArgs) +{ + int iPageIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iPageIndex)) + return Py_BuildException(); + + CPythonPlayer::Instance().SetQuickPage(iPageIndex); + return Py_BuildNone(); +} + +PyObject * playerLocalQuickSlotIndexToGlobalQuickSlotIndex(PyObject* poSelf, PyObject* poArgs) +{ + int iLocalSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iLocalSlotIndex)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + return Py_BuildValue("i", rkPlayer.LocalQuickSlotIndexToGlobalQuickSlotIndex(iLocalSlotIndex)); +} + + +PyObject * playerGetLocalQuickSlot(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + DWORD dwWndType; + DWORD dwWndItemPos; + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.GetLocalQuickSlotData(iSlotIndex, &dwWndType, &dwWndItemPos); + + return Py_BuildValue("ii", dwWndType, dwWndItemPos); +} + +PyObject * playerGetGlobalQuickSlot(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + DWORD dwWndType; + DWORD dwWndItemPos; + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.GetGlobalQuickSlotData(iSlotIndex, &dwWndType, &dwWndItemPos); + + return Py_BuildValue("ii", dwWndType, dwWndItemPos); +} + + +PyObject * playerRequestAddLocalQuickSlot(PyObject * poSelf, PyObject * poArgs) +{ + int nSlotIndex; + int nWndType; + int nWndItemPos; + + if (!PyTuple_GetInteger(poArgs, 0, &nSlotIndex)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &nWndType)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 2, &nWndItemPos)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.RequestAddLocalQuickSlot(nSlotIndex, nWndType, nWndItemPos); + + return Py_BuildNone(); +} + +PyObject * playerRequestAddToEmptyLocalQuickSlot(PyObject* poSelf, PyObject* poArgs) +{ + int nWndType; + if (!PyTuple_GetInteger(poArgs, 0, &nWndType)) + return Py_BuildException(); + + int nWndItemPos; + if (!PyTuple_GetInteger(poArgs, 1, &nWndItemPos)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.RequestAddToEmptyLocalQuickSlot(nWndType, nWndItemPos); + + return Py_BuildNone(); +} + +PyObject * playerRequestDeleteGlobalQuickSlot(PyObject * poSelf, PyObject * poArgs) +{ + int nGlobalSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &nGlobalSlotIndex)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.RequestDeleteGlobalQuickSlot(nGlobalSlotIndex); + return Py_BuildNone(); +} + +PyObject * playerRequestMoveGlobalQuickSlotToLocalQuickSlot(PyObject * poSelf, PyObject * poArgs) +{ + int nGlobalSrcSlotIndex; + int nLocalDstSlotIndex; + + if (!PyTuple_GetInteger(poArgs, 0, &nGlobalSrcSlotIndex)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &nLocalDstSlotIndex)) + return Py_BuildException(); + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + rkPlayer.RequestMoveGlobalQuickSlotToLocalQuickSlot(nGlobalSrcSlotIndex, nLocalDstSlotIndex); + return Py_BuildNone(); +} + +PyObject * playerRequestUseLocalQuickSlot(PyObject* poSelf, PyObject* poArgs) +{ + int iLocalPosition; + if (!PyTuple_GetInteger(poArgs, 0, &iLocalPosition)) + return Py_BuildException(); + + CPythonPlayer::Instance().RequestUseLocalQuickSlot(iLocalPosition); + + return Py_BuildNone(); +} + +PyObject * playerRemoveQuickSlotByValue(PyObject* poSelf, PyObject* poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + + int iPosition; + if (!PyTuple_GetInteger(poArgs, 1, &iPosition)) + return Py_BuildException(); + + CPythonPlayer::Instance().RemoveQuickSlotByValue(iType, iPosition); + + return Py_BuildNone(); +} + +PyObject * playerisItem(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + char Flag = CPythonPlayer::Instance().IsItem(TItemPos(INVENTORY, iSlotIndex)); + + return Py_BuildValue("i", Flag); +} + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM +PyObject * playerIsBeltInventorySlot(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + char Flag = CPythonPlayer::Instance().IsBeltInventorySlot(TItemPos(INVENTORY, iSlotIndex)); + + return Py_BuildValue("i", Flag); +} +#endif + +PyObject * playerIsEquipmentSlot(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + if (iSlotIndex >= c_Equipment_Start) + if (iSlotIndex <= c_DragonSoul_Equip_End) + return Py_BuildValue("i", 1); + + return Py_BuildValue("i", 0); +} + +PyObject * playerIsDSEquipmentSlot(PyObject* poSelf, PyObject* poArgs) +{ + BYTE bWindowType; + if (!PyTuple_GetInteger(poArgs, 0, &bWindowType)) + return Py_BuildException(); + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex)) + return Py_BuildException(); + + if (INVENTORY == bWindowType) + if (iSlotIndex >= c_DragonSoul_Equip_Start) + if (iSlotIndex <= c_DragonSoul_Equip_End) + return Py_BuildValue("i", 1); + + return Py_BuildValue("i", 0); + +} + +PyObject * playerIsCostumeSlot(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + +#ifdef ENABLE_COSTUME_SYSTEM + if (iSlotIndex >= c_Costume_Slot_Start) + if (iSlotIndex <= c_Costume_Slot_End) + return Py_BuildValue("i", 1); +#endif + + return Py_BuildValue("i", 0); +} + +PyObject * playerIsOpenPrivateShop(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().IsOpenPrivateShop()); +} + +PyObject * playerIsValuableItem(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos SlotIndex; + + switch (PyTuple_Size (poArgs)) + { + case 1: + if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.cell)) + return Py_BuildException(); + break; + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + + DWORD dwItemIndex = CPythonPlayer::Instance().GetItemIndex(SlotIndex); + CItemManager::Instance().SelectItemData(dwItemIndex); + CItemData * pItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pItemData) + return Py_BuildException("Can't find item data"); + + BOOL hasMetinSocket = FALSE; + BOOL isHighPrice = FALSE; + + for (int i = 0; i < METIN_SOCKET_COUNT; ++i) + if (CPythonPlayer::METIN_SOCKET_TYPE_NONE != CPythonPlayer::Instance().GetItemMetinSocket(SlotIndex, i)) + hasMetinSocket = TRUE; + + DWORD dwValue = pItemData->GetISellItemPrice(); + if (dwValue > 5000) + isHighPrice = TRUE; + + return Py_BuildValue("i", hasMetinSocket || isHighPrice); +} + +int GetItemGrade(const char * c_szItemName) +{ + std::string strName = c_szItemName; + if (strName.empty()) + return 0; + + char chGrade = strName[strName.length() - 1]; + if (chGrade < '0' || chGrade > '9') + chGrade = '0'; + + int iGrade = chGrade - '0'; + return iGrade; +} + +PyObject * playerGetItemGrade(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos SlotIndex; + switch (PyTuple_Size(poArgs)) + { + case 1: + if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.cell)) + return Py_BuildException(); + break; + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &SlotIndex.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + + int iItemIndex = CPythonPlayer::Instance().GetItemIndex(SlotIndex); + CItemManager::Instance().SelectItemData(iItemIndex); + CItemData * pItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pItemData) + return Py_BuildException("Can't find item data"); + + return Py_BuildValue("i", GetItemGrade(pItemData->GetName())); +} + +#if defined(GAIDEN) +PyObject * playerGetItemUnbindTime(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + return Py_BuildValue("i", (int) CPythonPlayer::instance().GetItemUnbindTime(iSlotIndex)); +} +#endif + +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, +}; + +PyObject * playerCanRefine(PyObject * poSelf, PyObject * poArgs) +{ + int iScrollItemIndex; + TItemPos TargetSlotIndex; + + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &iScrollItemIndex)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.cell)) + return Py_BadArgument(); + break; + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &iScrollItemIndex)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.window_type)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 2, &TargetSlotIndex.cell)) + return Py_BadArgument(); + break; + default: + return Py_BadArgument(); + } + + if (CPythonPlayer::Instance().IsEquipmentSlot(TargetSlotIndex)) + { + return Py_BuildValue("i", REFINE_CANT_REFINE_METIN_TO_EQUIPMENT); + } + + // Scroll + CItemManager::Instance().SelectItemData(iScrollItemIndex); + CItemData * pScrollItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pScrollItemData) + return Py_BuildValue("i", REFINE_CANT); + int iScrollType = pScrollItemData->GetType(); + int iScrollSubType = pScrollItemData->GetSubType(); + if (iScrollType != CItemData::ITEM_TYPE_USE) + return Py_BuildValue("i", REFINE_CANT); + if (iScrollSubType != CItemData::USE_TUNING) + return Py_BuildValue("i", REFINE_CANT); + + // Target Item + int iTargetItemIndex = CPythonPlayer::Instance().GetItemIndex(TargetSlotIndex); + CItemManager::Instance().SelectItemData(iTargetItemIndex); + CItemData * pTargetItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pTargetItemData) + return Py_BuildValue("i", REFINE_CANT); + int iTargetType = pTargetItemData->GetType(); + //int iTargetSubType = pTargetItemData->GetSubType(); + if (CItemData::ITEM_TYPE_ROD == iTargetType) + return Py_BuildValue("i", REFINE_CANT_REFINE_ROD); + + if (pTargetItemData->HasNextGrade()) + { + return Py_BuildValue("i", REFINE_OK); + } + else + { + return Py_BuildValue("i", REFINE_NOT_NEXT_GRADE_ITEM); + } + + return Py_BuildValue("i", REFINE_CANT); +} + +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, +}; + +PyObject * playerCanAttachMetin(PyObject* poSelf, PyObject* poArgs) +{ + int iMetinItemID; + TItemPos TargetSlotIndex; + + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &iMetinItemID)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.cell)) + return Py_BuildException(); + break; + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &iMetinItemID)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &TargetSlotIndex.cell)) + return Py_BuildException(); + break; + default: + return Py_BuildException(); + } + if (CPythonPlayer::Instance().IsEquipmentSlot(TargetSlotIndex)) + { + return Py_BuildValue("i", ATTACH_METIN_CANT_ATTACH_TO_EQUIPMENT); + } + + CItemData * pMetinItemData; + if (!CItemManager::Instance().GetItemDataPointer(iMetinItemID, &pMetinItemData)) + return Py_BuildException("can't find item data"); + + DWORD dwTargetItemIndex = CPythonPlayer::Instance().GetItemIndex(TargetSlotIndex); + CItemData * pTargetItemData; + if (!CItemManager::Instance().GetItemDataPointer(dwTargetItemIndex, &pTargetItemData)) + return Py_BuildException("can't find item data"); + + DWORD dwMetinWearFlags = pMetinItemData->GetWearFlags(); + DWORD dwTargetWearFlags = pTargetItemData->GetWearFlags(); + if (0 == (dwMetinWearFlags & dwTargetWearFlags)) + return Py_BuildValue("i", ATTACH_METIN_NOT_MATCHABLE_ITEM); + if (CItemData::ITEM_TYPE_ROD == pTargetItemData->GetType()) + return Py_BuildValue("i", ATTACH_METIN_CANT); + + BOOL bNotExistGoldSocket = FALSE; + + int iSubType = pMetinItemData->GetSubType(); + for (int i = 0; i < ITEM_SOCKET_SLOT_MAX_NUM; ++i) + { + DWORD dwSocketType = CPythonPlayer::Instance().GetItemMetinSocket(TargetSlotIndex, i); + if (CItemData::METIN_NORMAL == iSubType) + { + if (CPythonPlayer::METIN_SOCKET_TYPE_SILVER == dwSocketType || + CPythonPlayer::METIN_SOCKET_TYPE_GOLD == dwSocketType) + { + return Py_BuildValue("i", ATTACH_METIN_OK); + } + } + else if (CItemData::METIN_GOLD == iSubType) + { + if (CPythonPlayer::METIN_SOCKET_TYPE_GOLD == dwSocketType) + { + return Py_BuildValue("i", ATTACH_METIN_OK); + } + else if (CPythonPlayer::METIN_SOCKET_TYPE_SILVER == dwSocketType) + { + bNotExistGoldSocket = TRUE; + } + } + } + + if (bNotExistGoldSocket) + { + return Py_BuildValue("i", ATTACH_METIN_NOT_EXIST_GOLD_SOCKET); + } + + return Py_BuildValue("i", ATTACH_METIN_NO_MATCHABLE_SOCKET); +} + +enum +{ + DETACH_METIN_CANT, + DETACH_METIN_OK, +}; + +PyObject * playerCanDetach(PyObject * poSelf, PyObject * poArgs) +{ + int iScrollItemIndex; + TItemPos TargetSlotIndex; + switch (PyTuple_Size (poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &iScrollItemIndex)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.cell)) + return Py_BadArgument(); + break; + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &iScrollItemIndex)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.window_type)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 2, &TargetSlotIndex.cell)) + return Py_BadArgument(); + break; + default: + return Py_BadArgument(); + } + + // Scroll + CItemManager::Instance().SelectItemData(iScrollItemIndex); + CItemData * pScrollItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pScrollItemData) + return Py_BuildException("Can't find item data"); + int iScrollType = pScrollItemData->GetType(); + int iScrollSubType = pScrollItemData->GetSubType(); + if (iScrollType != CItemData::ITEM_TYPE_USE) + return Py_BuildValue("i", DETACH_METIN_CANT); + if (iScrollSubType != CItemData::USE_DETACHMENT) + return Py_BuildValue("i", DETACH_METIN_CANT); + + // Target Item + int iTargetItemIndex = CPythonPlayer::Instance().GetItemIndex(TargetSlotIndex); + CItemManager::Instance().SelectItemData(iTargetItemIndex); + CItemData * pTargetItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pTargetItemData) + return Py_BuildException("Can't find item data"); + //int iTargetType = pTargetItemData->GetType(); + //int iTargetSubType = pTargetItemData->GetSubType(); + + if (pTargetItemData->IsFlag(CItemData::ITEM_FLAG_REFINEABLE)) + { + for (int iSlotCount = 0; iSlotCount < METIN_SOCKET_COUNT; ++iSlotCount) + if (CPythonPlayer::Instance().GetItemMetinSocket(TargetSlotIndex, iSlotCount) > 2) + { + return Py_BuildValue("i", DETACH_METIN_OK); + } + } + + return Py_BuildValue("i", DETACH_METIN_CANT); +} + +PyObject * playerCanUnlock(PyObject * poSelf, PyObject * poArgs) +{ + int iKeyItemIndex; + TItemPos TargetSlotIndex; + switch (PyTuple_Size(poArgs)) + { + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &iKeyItemIndex)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.cell)) + return Py_BadArgument(); + break; + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &iKeyItemIndex)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 1, &TargetSlotIndex.window_type)) + return Py_BadArgument(); + if (!PyTuple_GetInteger(poArgs, 2, &TargetSlotIndex.cell)) + return Py_BadArgument(); + break; + default: + return Py_BadArgument(); + } + + // Key + CItemManager::Instance().SelectItemData(iKeyItemIndex); + CItemData * pKeyItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pKeyItemData) + return Py_BuildException("Can't find item data"); + int iKeyType = pKeyItemData->GetType(); + if (iKeyType != CItemData::ITEM_TYPE_TREASURE_KEY) + return Py_BuildValue("i", FALSE); + + // Target Item + int iTargetItemIndex = CPythonPlayer::Instance().GetItemIndex(TargetSlotIndex); + CItemManager::Instance().SelectItemData(iTargetItemIndex); + CItemData * pTargetItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pTargetItemData) + return Py_BuildException("Can't find item data"); + int iTargetType = pTargetItemData->GetType(); + if (iTargetType != CItemData::ITEM_TYPE_TREASURE_BOX) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", TRUE); +} + +PyObject * playerIsRefineGradeScroll(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos ScrollSlotIndex; + switch (PyTuple_Size(poArgs)) + { + case 1: + if (!PyTuple_GetInteger(poArgs, 0, &ScrollSlotIndex.cell)) + return Py_BuildException(); + case 2: + if (!PyTuple_GetInteger(poArgs, 0, &ScrollSlotIndex.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &ScrollSlotIndex.cell)) + return Py_BuildException(); + default: + return Py_BuildException(); + } + + int iScrollItemIndex = CPythonPlayer::Instance().GetItemIndex(ScrollSlotIndex); + CItemManager::Instance().SelectItemData(iScrollItemIndex); + CItemData * pScrollItemData = CItemManager::Instance().GetSelectedItemDataPointer(); + if (!pScrollItemData) + return Py_BuildException("Can't find item data"); + + return Py_BuildValue("i", REFINE_SCROLL_TYPE_UP_GRADE == pScrollItemData->GetValue(0)); +} + +PyObject * playerUpdate(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().Update(); + return Py_BuildNone(); +} + +PyObject * playerRender(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildNone(); +} + +PyObject * playerClear(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().Clear(); + return Py_BuildNone(); +} + +PyObject * playerClearTarget(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().SetTarget(0); + return Py_BuildNone(); +} + +PyObject * playerSetTarget(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CPythonPlayer::Instance().SetTarget(iVID); + return Py_BuildNone(); +} + +PyObject * playerOpenCharacterMenu(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + CPythonPlayer::Instance().OpenCharacterMenu(iVID); + return Py_BuildNone(); +} + +PyObject * playerIsPartyMember(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonPlayer::Instance().IsPartyMemberByVID(iVID)); +} + +PyObject * playerIsPartyLeader(PyObject* poSelf, PyObject* poArgs) +{ + int iVID; + if (!PyTuple_GetInteger(poArgs, 0, &iVID)) + return Py_BuildException(); + + DWORD dwPID; + if (!CPythonPlayer::Instance().PartyMemberVIDToPID(iVID, &dwPID)) + return Py_BuildValue("i", FALSE); + + CPythonPlayer::TPartyMemberInfo * pPartyMemberInfo; + if (!CPythonPlayer::Instance().GetPartyMemberPtr(dwPID, &pPartyMemberInfo)) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", CPythonPlayer::PARTY_ROLE_LEADER == pPartyMemberInfo->byState); +} + +PyObject * playerIsPartyLeaderByPID(PyObject* poSelf, PyObject* poArgs) +{ + int iPID; + if (!PyTuple_GetInteger(poArgs, 0, &iPID)) + return Py_BuildException(); + + CPythonPlayer::TPartyMemberInfo * pPartyMemberInfo; + if (!CPythonPlayer::Instance().GetPartyMemberPtr(iPID, &pPartyMemberInfo)) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", CPythonPlayer::PARTY_ROLE_LEADER == pPartyMemberInfo->byState); +} + +PyObject * playerGetPartyMemberHPPercentage(PyObject* poSelf, PyObject* poArgs) +{ + int iPID; + if (!PyTuple_GetInteger(poArgs, 0, &iPID)) + return Py_BuildException(); + + CPythonPlayer::TPartyMemberInfo * pPartyMemberInfo; + if (!CPythonPlayer::Instance().GetPartyMemberPtr(iPID, &pPartyMemberInfo)) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", pPartyMemberInfo->byHPPercentage); +} + +PyObject * playerGetPartyMemberState(PyObject* poSelf, PyObject* poArgs) +{ + int iPID; + if (!PyTuple_GetInteger(poArgs, 0, &iPID)) + return Py_BuildException(); + + CPythonPlayer::TPartyMemberInfo * pPartyMemberInfo; + if (!CPythonPlayer::Instance().GetPartyMemberPtr(iPID, &pPartyMemberInfo)) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("i", pPartyMemberInfo->byState); +} + +PyObject * playerGetPartyMemberAffects(PyObject* poSelf, PyObject* poArgs) +{ + int iPID; + if (!PyTuple_GetInteger(poArgs, 0, &iPID)) + return Py_BuildException(); + + CPythonPlayer::TPartyMemberInfo * pPartyMemberInfo; + if (!CPythonPlayer::Instance().GetPartyMemberPtr(iPID, &pPartyMemberInfo)) + return Py_BuildValue("i", FALSE); + + return Py_BuildValue("iiiiiii", pPartyMemberInfo->sAffects[0], + pPartyMemberInfo->sAffects[1], + pPartyMemberInfo->sAffects[2], + pPartyMemberInfo->sAffects[3], + pPartyMemberInfo->sAffects[4], + pPartyMemberInfo->sAffects[5], + pPartyMemberInfo->sAffects[6]); +} + +PyObject * playerRemovePartyMember(PyObject* poSelf, PyObject* poArgs) +{ + int iPID; + if (!PyTuple_GetInteger(poArgs, 0, &iPID)) + return Py_BuildException(); + + CPythonPlayer::Instance().RemovePartyMember(iPID); + return Py_BuildNone(); +} + +PyObject * playerExitParty(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer::Instance().ExitParty(); + return Py_BuildNone(); +} + +PyObject * playerGetPKMode(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().GetPKMode()); +} + +PyObject * playerHasMobilePhoneNumber(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().HasMobilePhoneNumber()); +} + +PyObject * playerSetWeaponAttackBonusFlag(PyObject* poSelf, PyObject* poArgs) +{ + int iFlag; + if (!PyTuple_GetInteger(poArgs, 0, &iFlag)) + return Py_BuildException(); + + return Py_BuildNone(); +} + +PyObject * playerToggleCoolTime(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().__ToggleCoolTime()); +} + +PyObject * playerToggleLevelLimit(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().__ToggleLevelLimit()); +} + +PyObject * playerGetTargetVID(PyObject* poSelf, PyObject* poArgs) +{ + return Py_BuildValue("i", CPythonPlayer::Instance().GetTargetVID()); +} + +PyObject * playerRegisterEmotionIcon(PyObject* poSelf, PyObject* poArgs) +{ + int iIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iIndex)) + return Py_BuildException(); + char * szFileName; + if (!PyTuple_GetString(poArgs, 1, &szFileName)) + return Py_BuildException(); + + CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(szFileName); + m_kMap_iEmotionIndex_pkIconImage.insert(std::make_pair(iIndex, pImage)); + + return Py_BuildNone(); +} + +PyObject * playerGetEmotionIconImage(PyObject* poSelf, PyObject* poArgs) +{ + int iIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iIndex)) + return Py_BuildException(); + + if (m_kMap_iEmotionIndex_pkIconImage.end() == m_kMap_iEmotionIndex_pkIconImage.find(iIndex)) + return Py_BuildValue("i", 0); + + return Py_BuildPointer(m_kMap_iEmotionIndex_pkIconImage[iIndex]); +} + +PyObject * playerSetItemData(PyObject* poSelf, PyObject* poArgs) +{ + int iSlotIndex; + if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex)) + return Py_BuildException(); + + int iVirtualID; + if (!PyTuple_GetInteger(poArgs, 1, &iVirtualID)) + return Py_BuildException(); + + int iNum; + if (!PyTuple_GetInteger(poArgs, 2, &iNum)) + return Py_BuildException(); + + TItemData kItemInst; + ZeroMemory(&kItemInst, sizeof(kItemInst)); + kItemInst.vnum=iVirtualID; + kItemInst.count=iNum; + CPythonPlayer::Instance().SetItemData(TItemPos(INVENTORY, iSlotIndex), kItemInst); + return Py_BuildNone(); +} + +PyObject * playerSetItemMetinSocket(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos ItemPos; + int iMetinSocketNumber; + int iNum; + + switch (PyTuple_Size(poArgs)) + { + case 3: + if (!PyTuple_GetInteger(poArgs, 0, &ItemPos.cell)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &iMetinSocketNumber)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 2, &iNum)) + return Py_BuildException(); + + break; + case 4: + if (!PyTuple_GetInteger(poArgs, 0, &ItemPos.window_type)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 1, &ItemPos.cell)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 2, &iMetinSocketNumber)) + return Py_BuildException(); + if (!PyTuple_GetInteger(poArgs, 3, &iNum)) + return Py_BuildException(); + + break; + default: + return Py_BuildException(); + } + + CPythonPlayer::Instance().SetItemMetinSocket(ItemPos, iMetinSocketNumber, iNum); + return Py_BuildNone(); +} + +PyObject * playerSetItemAttribute(PyObject* poSelf, PyObject* poArgs) +{ + TItemPos ItemPos; + int iAttributeSlotIndex; + int iAttributeType; + int iAttributeValue; + + switch (PyTuple_Size(poArgs)) + { + case 4: + if (!PyTuple_GetInteger(poArgs, 0, &ItemPos.cell)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &iAttributeSlotIndex)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 2, &iAttributeType)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 3, &iAttributeValue)) + return Py_BuildException(); + break; + case 5: + if (!PyTuple_GetInteger(poArgs, 0, &ItemPos.window_type)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 1, &ItemPos.cell)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 2, &iAttributeSlotIndex)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 3, &iAttributeType)) + return Py_BuildException(); + + if (!PyTuple_GetInteger(poArgs, 4, &iAttributeValue)) + return Py_BuildException(); + break; + } + CPythonPlayer::Instance().SetItemAttribute(ItemPos, iAttributeSlotIndex, iAttributeType, iAttributeValue); + return Py_BuildNone(); +} + +PyObject * playerSetAutoPotionInfo(PyObject* poSelf, PyObject* poArgs) +{ + int potionType = 0; + if (!PyTuple_GetInteger(poArgs, 0, &potionType)) + return Py_BadArgument(); + + CPythonPlayer* player = CPythonPlayer::InstancePtr(); + + CPythonPlayer::SAutoPotionInfo& potionInfo = player->GetAutoPotionInfo(potionType); + + if (!PyTuple_GetBoolean(poArgs, 1, &potionInfo.bActivated)) + return Py_BadArgument(); + + if (!PyTuple_GetLong(poArgs, 2, &potionInfo.currentAmount)) + return Py_BadArgument(); + + if (!PyTuple_GetLong(poArgs, 3, &potionInfo.totalAmount)) + return Py_BadArgument(); + + if (!PyTuple_GetLong(poArgs, 4, &potionInfo.inventorySlotIndex)) + return Py_BadArgument(); + + return Py_BuildNone(); +} + +PyObject * playerGetAutoPotionInfo(PyObject* poSelf, PyObject* poArgs) +{ + CPythonPlayer* player = CPythonPlayer::InstancePtr(); + + int potionType = 0; + if (!PyTuple_GetInteger(poArgs, 0, &potionType)) + return Py_BadArgument(); + + CPythonPlayer::SAutoPotionInfo& potionInfo = player->GetAutoPotionInfo(potionType); + + return Py_BuildValue("biii", potionInfo.bActivated, int(potionInfo.currentAmount), int(potionInfo.totalAmount), int(potionInfo.inventorySlotIndex)); +} + +PyObject * playerSlotTypeToInvenType(PyObject* poSelf, PyObject* poArgs) +{ + int slotType = 0; + if (!PyTuple_GetInteger(poArgs, 0, &slotType)) + return Py_BadArgument(); + + return Py_BuildValue("i", SlotTypeToInvenType((BYTE)slotType)); +} + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM +// 플레이어가 벨트를 착용 중인지? +PyObject * playerIsEquippingBelt(PyObject* poSelf, PyObject* poArgs) +{ + const CPythonPlayer* player = CPythonPlayer::InstancePtr(); + bool bEquipping = false; + + const TItemData* data = player->GetItemData(TItemPos(EQUIPMENT, c_Equipment_Belt)); + + if (NULL != data) + bEquipping = 0 < data->count; + + return Py_BuildValue("b", bEquipping); + +} + +// 검사하려는 벨트 인벤토리 Cell이 사용 가능한 칸인지? (사용가능 여부는 착용 중인 벨트의 강화 정도에 따라 달라짐) +PyObject * playerIsAvailableBeltInventoryCell(PyObject* poSelf, PyObject* poArgs) +{ + const CPythonPlayer* player = CPythonPlayer::InstancePtr(); + const TItemData* pData = player->GetItemData(TItemPos(EQUIPMENT, c_Equipment_Belt)); + + if (NULL == pData || 0 == pData->count) + return Py_BuildValue("b", false); + + CItemManager::Instance().SelectItemData(pData->vnum); + CItemData * pItem = CItemManager::Instance().GetSelectedItemDataPointer(); + + long beltGrade = pItem->GetValue(0); + + int pos = 0; + if (!PyTuple_GetInteger(poArgs, 0, &pos)) + return Py_BadArgument(); + + //return Py_BuildValue("b", CBeltInventoryHelper::IsAvailableCell(pos - c_Belt_Inventory_Slot_Start, GetItemGrade(pItem->GetName()))); + return Py_BuildValue("b", CBeltInventoryHelper::IsAvailableCell(pos - c_Belt_Inventory_Slot_Start, beltGrade)); +} +#endif + + +// 용혼석 강화 +PyObject* playerSendDragonSoulRefine(PyObject* poSelf, PyObject* poArgs) +{ + BYTE bSubHeader; + PyObject* pDic; + TItemPos RefineItemPoses[DS_REFINE_WINDOW_MAX_NUM]; + if (!PyTuple_GetByte(poArgs, 0, &bSubHeader)) + return Py_BuildException(); + switch (bSubHeader) + { + case DS_SUB_HEADER_CLOSE: + break; + case DS_SUB_HEADER_DO_UPGRADE: + case DS_SUB_HEADER_DO_IMPROVEMENT: + case DS_SUB_HEADER_DO_REFINE: + { + if (!PyTuple_GetObject(poArgs, 1, &pDic)) + return Py_BuildException(); + // PORT: 40250's Python 2.7 is 32-bit, where Py_ssize_t is int; PyDict_Next takes Py_ssize_t*. + Py_ssize_t pos = 0; + PyObject* key, *value; + int size = PyDict_Size(pDic); + + while (PyDict_Next(pDic, &pos, &key, &value)) + { + int i = PyInt_AsLong(key); + if (i > DS_REFINE_WINDOW_MAX_NUM) + return Py_BuildException(); + + if (!PyTuple_GetByte(value, 0, &RefineItemPoses[i].window_type) + || !PyTuple_GetInteger(value, 1, &RefineItemPoses[i].cell)) + { + return Py_BuildException(); + } + } + } + break; + } + + CPythonNetworkStream& rns=CPythonNetworkStream::Instance(); + rns.SendDragonSoulRefinePacket(bSubHeader, RefineItemPoses); + + return Py_BuildNone(); +} +void initPlayer() +{ + static PyMethodDef s_methods[] = + { + { "GetAutoPotionInfo", playerGetAutoPotionInfo, METH_VARARGS }, + { "SetAutoPotionInfo", playerSetAutoPotionInfo, METH_VARARGS }, + + { "PickCloseItem", playerPickCloseItem, METH_VARARGS }, + { "SetGameWindow", playerSetGameWindow, METH_VARARGS }, + { "RegisterEffect", playerRegisterEffect, METH_VARARGS }, + { "RegisterCacheEffect", playerRegisterCacheEffect, METH_VARARGS }, + { "SetMouseState", playerSetMouseState, METH_VARARGS }, + { "SetMouseFunc", playerSetMouseFunc, METH_VARARGS }, + { "GetMouseFunc", playerGetMouseFunc, METH_VARARGS }, + { "SetMouseMiddleButtonState", playerSetMouseMiddleButtonState, METH_VARARGS }, + { "SetMainCharacterIndex", playerSetMainCharacterIndex, METH_VARARGS }, + { "GetMainCharacterIndex", playerGetMainCharacterIndex, METH_VARARGS }, + { "GetMainCharacterName", playerGetMainCharacterName, METH_VARARGS }, + { "GetMainCharacterPosition", playerGetMainCharacterPosition, METH_VARARGS }, + { "IsMainCharacterIndex", playerIsMainCharacterIndex, METH_VARARGS }, + { "CanAttackInstance", playerCanAttackInstance, METH_VARARGS }, + { "IsActingEmotion", playerIsActingEmotion, METH_VARARGS }, + { "IsPVPInstance", playerIsPVPInstance, METH_VARARGS }, + { "IsSameEmpire", playerIsSameEmpire, METH_VARARGS }, + { "IsChallengeInstance", playerIsChallengeInstance, METH_VARARGS }, + { "IsRevengeInstance", playerIsRevengeInstance, METH_VARARGS }, + { "IsCantFightInstance", playerIsCantFightInstance, METH_VARARGS }, + { "GetCharacterDistance", playerGetCharacterDistance, METH_VARARGS }, + { "IsInSafeArea", playerIsInSafeArea, METH_VARARGS }, + { "IsMountingHorse", playerIsMountingHorse, METH_VARARGS }, + { "IsObserverMode", playerIsObserverMode, METH_VARARGS }, + { "ActEmotion", playerActEmotion, METH_VARARGS }, + + { "ShowPlayer", playerShowPlayer, METH_VARARGS }, + { "HidePlayer", playerHidePlayer, METH_VARARGS }, + + { "ComboAttack", playerComboAttack, METH_VARARGS }, + + { "SetAutoCameraRotationSpeed", playerSetAutoCameraRotationSpeed, METH_VARARGS }, + { "SetAttackKeyState", playerSetAttackKeyState, METH_VARARGS }, + { "SetSingleDIKKeyState", playerSetSingleDIKKeyState, METH_VARARGS }, + { "EndKeyWalkingImmediately", playerEndKeyWalkingImmediately, METH_VARARGS }, + { "StartMouseWalking", playerStartMouseWalking, METH_VARARGS }, + { "EndMouseWalking", playerEndMouseWalking, METH_VARARGS }, + { "ResetCameraRotation", playerResetCameraRotation, METH_VARARGS }, + { "SetQuickCameraMode", playerSetQuickCameraMode, METH_VARARGS }, + + /////////////////////////////////////////////////////////////////////////////////////////// + + { "SetSkill", playerSetSkill, METH_VARARGS }, + { "GetSkillIndex", playerGetSkillIndex, METH_VARARGS }, + { "GetSkillSlotIndex", playerGetSkillSlotIndex, METH_VARARGS }, + { "GetSkillGrade", playerGetSkillGrade, METH_VARARGS }, + { "GetSkillLevel", playerGetSkillLevel, METH_VARARGS }, + { "GetSkillCurrentEfficientPercentage", playerGetSkillCurrentEfficientPercentage, METH_VARARGS }, + { "GetSkillNextEfficientPercentage", playerGetSkillNextEfficientPercentage, METH_VARARGS }, + { "ClickSkillSlot", playerClickSkillSlot, METH_VARARGS }, + { "ChangeCurrentSkillNumberOnly", playerChangeCurrentSkillNumberOnly, METH_VARARGS }, + { "ClearSkillDict", playerClearSkillDict, METH_VARARGS }, + + { "GetItemIndex", playerGetItemIndex, METH_VARARGS }, + { "GetItemFlags", playerGetItemFlags, METH_VARARGS }, + { "GetItemCount", playerGetItemCount, METH_VARARGS }, + { "GetItemCountByVnum", playerGetItemCountByVnum, METH_VARARGS }, + { "GetItemMetinSocket", playerGetItemMetinSocket, METH_VARARGS }, + { "GetItemAttribute", playerGetItemAttribute, METH_VARARGS }, +#if defined(GAIDEN) + { "GetItemUnbindTime", playerGetItemUnbindTime, METH_VARARGS }, +#endif + { "GetISellItemPrice", playerGetISellItemPrice, METH_VARARGS }, + { "MoveItem", playerMoveItem, METH_VARARGS }, + { "SendClickItemPacket", playerSendClickItemPacket, METH_VARARGS }, + + /////////////////////////////////////////////////////////////////////////////////////////// + + { "GetName", playerGetName, METH_VARARGS }, + { "GetJob", playerGetJob, METH_VARARGS }, + { "GetRace", playerGetRace, METH_VARARGS }, + { "GetPlayTime", playerGetPlayTime, METH_VARARGS }, + { "SetPlayTime", playerSetPlayTime, METH_VARARGS }, + + { "IsSkillCoolTime", playerIsSkillCoolTime, METH_VARARGS }, + { "GetSkillCoolTime", playerGetSkillCoolTime, METH_VARARGS }, + { "IsSkillActive", playerIsSkillActive, METH_VARARGS }, + { "UseGuildSkill", playerUseGuildSkill, METH_VARARGS }, + { "AffectIndexToSkillIndex", playerAffectIndexToSkillIndex, METH_VARARGS }, + { "GetEXP", playerGetEXP, METH_VARARGS }, + { "GetStatus", playerGetStatus, METH_VARARGS }, + { "SetStatus", playerSetStatus, METH_VARARGS }, + { "GetElk", playerGetElk, METH_VARARGS }, + { "GetMoney", playerGetElk, METH_VARARGS }, + { "GetGuildID", playerGetGuildID, METH_VARARGS }, + { "GetGuildName", playerGetGuildName, METH_VARARGS }, + { "GetAlignmentData", playerGetAlignmentData, METH_VARARGS }, + { "RequestAddLocalQuickSlot", playerRequestAddLocalQuickSlot, METH_VARARGS }, + { "RequestAddToEmptyLocalQuickSlot", playerRequestAddToEmptyLocalQuickSlot, METH_VARARGS }, + { "RequestDeleteGlobalQuickSlot", playerRequestDeleteGlobalQuickSlot, METH_VARARGS }, + { "RequestMoveGlobalQuickSlotToLocalQuickSlot", playerRequestMoveGlobalQuickSlotToLocalQuickSlot, METH_VARARGS }, + { "RequestUseLocalQuickSlot", playerRequestUseLocalQuickSlot, METH_VARARGS }, + { "LocalQuickSlotIndexToGlobalQuickSlotIndex", playerLocalQuickSlotIndexToGlobalQuickSlotIndex, METH_VARARGS }, + + { "GetQuickPage", playerGetQuickPage, METH_VARARGS }, + { "SetQuickPage", playerSetQuickPage, METH_VARARGS }, + { "GetLocalQuickSlot", playerGetLocalQuickSlot, METH_VARARGS }, + { "GetGlobalQuickSlot", playerGetGlobalQuickSlot, METH_VARARGS }, + { "RemoveQuickSlotByValue", playerRemoveQuickSlotByValue, METH_VARARGS }, + + { "isItem", playerisItem, METH_VARARGS }, + { "IsEquipmentSlot", playerIsEquipmentSlot, METH_VARARGS }, + { "IsDSEquipmentSlot", playerIsDSEquipmentSlot, METH_VARARGS }, + { "IsCostumeSlot", playerIsCostumeSlot, METH_VARARGS }, + { "IsValuableItem", playerIsValuableItem, METH_VARARGS }, + { "IsOpenPrivateShop", playerIsOpenPrivateShop, METH_VARARGS }, + +#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM + { "IsBeltInventorySlot", playerIsBeltInventorySlot, METH_VARARGS }, + { "IsEquippingBelt", playerIsEquippingBelt, METH_VARARGS }, + { "IsAvailableBeltInventoryCell", playerIsAvailableBeltInventoryCell, METH_VARARGS }, +#endif + + // Refine + { "GetItemGrade", playerGetItemGrade, METH_VARARGS }, + { "CanRefine", playerCanRefine, METH_VARARGS }, + { "CanDetach", playerCanDetach, METH_VARARGS }, + { "CanUnlock", playerCanUnlock, METH_VARARGS }, + { "CanAttachMetin", playerCanAttachMetin, METH_VARARGS }, + { "IsRefineGradeScroll", playerIsRefineGradeScroll, METH_VARARGS }, + + { "ClearTarget", playerClearTarget, METH_VARARGS }, + { "SetTarget", playerSetTarget, METH_VARARGS }, + { "OpenCharacterMenu", playerOpenCharacterMenu, METH_VARARGS }, + + { "Update", playerUpdate, METH_VARARGS }, + { "Render", playerRender, METH_VARARGS }, + { "Clear", playerClear, METH_VARARGS }, + + // Party + { "IsPartyMember", playerIsPartyMember, METH_VARARGS }, + { "IsPartyLeader", playerIsPartyLeader, METH_VARARGS }, + { "IsPartyLeaderByPID", playerIsPartyLeaderByPID, METH_VARARGS }, + { "GetPartyMemberHPPercentage", playerGetPartyMemberHPPercentage, METH_VARARGS }, + { "GetPartyMemberState", playerGetPartyMemberState, METH_VARARGS }, + { "GetPartyMemberAffects", playerGetPartyMemberAffects, METH_VARARGS }, + { "RemovePartyMember", playerRemovePartyMember, METH_VARARGS }, + { "ExitParty", playerExitParty, METH_VARARGS }, + + // PK Mode + { "GetPKMode", playerGetPKMode, METH_VARARGS }, + + // Mobile + { "HasMobilePhoneNumber", playerHasMobilePhoneNumber, METH_VARARGS }, + + // Emotion + { "RegisterEmotionIcon", playerRegisterEmotionIcon, METH_VARARGS }, + { "GetEmotionIconImage", playerGetEmotionIconImage, METH_VARARGS }, + + // For System + { "SetWeaponAttackBonusFlag", playerSetWeaponAttackBonusFlag, METH_VARARGS }, + { "ToggleCoolTime", playerToggleCoolTime, METH_VARARGS }, + { "ToggleLevelLimit", playerToggleLevelLimit, METH_VARARGS }, + { "GetTargetVID", playerGetTargetVID, METH_VARARGS }, + + { "SetItemData", playerSetItemData, METH_VARARGS }, + { "SetItemMetinSocket", playerSetItemMetinSocket, METH_VARARGS }, + { "SetItemAttribute", playerSetItemAttribute, METH_VARARGS }, + { "SetItemCount", playerSetItemCount, METH_VARARGS }, + + { "GetItemLink", playerGetItemLink, METH_VARARGS }, + { "SlotTypeToInvenType", playerSlotTypeToInvenType, METH_VARARGS }, + { "SendDragonSoulRefine", playerSendDragonSoulRefine, METH_VARARGS }, + + { NULL, NULL, NULL }, + }; + + PyObject* poModule = Py_InitModule("player", s_methods); + 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); + + // Public code with server + 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); + // Special indecies for client + 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); + + // Party + 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); + + // Skill Index + 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); + + // PK Mode + 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); + + // Block Mode + 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); + + // Party + PyModule_AddIntConstant(poModule, "PARTY_EXP_NON_DISTRIBUTION", PARTY_EXP_DISTRIBUTION_NON_PARITY); + PyModule_AddIntConstant(poModule, "PARTY_EXP_DISTRIBUTION_PARITY", PARTY_EXP_DISTRIBUTION_PARITY); + + // Emotion + 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); + +} diff --git a/extension/src/port/UserInterface/PythonPlayerSkill.cpp b/extension/src/port/UserInterface/PythonPlayerSkill.cpp new file mode 100644 index 00000000..6fd32103 --- /dev/null +++ b/extension/src/port/UserInterface/PythonPlayerSkill.cpp @@ -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 kVct_pkInstTarget; + + if (pSkillData->IsFanRange()) + { + if (pkInstMain->NEW_GetInstanceVectorInFanRange(float(dwRange), *pkInstTarget, &kVct_pkInstTarget)) + { + std::vector::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::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 (dwTargetCountNEW_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; +} diff --git a/extension/src/port/UserInterface/StdAfx.h b/extension/src/port/UserInterface/StdAfx.h index bd33377b..0cc49975 100644 --- a/extension/src/port/UserInterface/StdAfx.h +++ b/extension/src/port/UserInterface/StdAfx.h @@ -46,5 +46,6 @@ void initpack(); void initapp(); void initchr(); void initchrmgr(); +void initPlayer(); void initChat(); void initnet(); diff --git a/extension/tests/port_login_flow_server.cpp b/extension/tests/port_login_flow_server.cpp index 6ad48270..f87ff6f8 100644 --- a/extension/tests/port_login_flow_server.cpp +++ b/extension/tests/port_login_flow_server.cpp @@ -509,9 +509,46 @@ bool FakeLoginServer::ServeGame(Connection& c, int index) return Fail(name + ": CG_PONG after the entergame burst: " + error); Event(name + ":burst_pong"); - // Hold the connection until the test stops us. - std::uint8_t byte = 0; - while (!m_stop && c.Read(&byte, 1) == 1) - ; - return true; + // Then hold the connection until the test stops us, reading what the game phase sends the way + // CInputProcessor::Process frames it (static size or TDynamicSizePacketHeader, then the sequence + // byte). A CG_MOVE (input_main.cpp CInputMain::Move) becomes ":move ". + for (;;) + { + std::uint8_t packet[1024] = {}; + if (c.Read(packet, 1) != 1) + return true; + const std::uint8_t header = packet[0]; + size_t size = static_cast(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)); + } + } } diff --git a/extension/tests/port_login_flow_test.cpp b/extension/tests/port_login_flow_test.cpp index c2058950..479f72f8 100644 --- a/extension/tests/port_login_flow_test.cpp +++ b/extension/tests/port_login_flow_test.cpp @@ -377,6 +377,42 @@ int main(int argc, char** argv) return false; }; 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 "; x, y are the TPixelPosition + // (y negated back, as SendCharacterStatePacket does) plus the map base the server gave. + auto moves = [&] { + std::vector 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) { @@ -394,7 +430,7 @@ int main(int argc, char** argv) if (e.rfind(prefix, 0) == 0) want.push_back(e); 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); CHECK(want == got); } diff --git a/libgr2/include/gr2/types.h b/libgr2/include/gr2/types.h index 738736c5..436c85eb 100644 --- a/libgr2/include/gr2/types.h +++ b/libgr2/include/gr2/types.h @@ -131,6 +131,10 @@ struct Animation { float oversampling = 1.0f; int32_t track_group_count = 0; std::vector 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 tracks; // t 处每个 track 的局部 4x4(granny_transform 组合语义,行主序)。 // out 按 tracks 顺序;bone_index 见各 track。 diff --git a/libgr2/src/gr2_anim.cpp b/libgr2/src/gr2_anim.cpp index 1f13edec..e65b9e04 100644 --- a/libgr2/src/gr2_anim.cpp +++ b/libgr2/src/gr2_anim.cpp @@ -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()); 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( // text_track_entry{Real32 TimeStamp; String Text})}(motion event 用) if (!groups.empty() && groups[0].valid())