client/UserInterface/PythonPlayer.cpp

1728 lines
42 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
// źȯ<C5BA><C8AF> <20><><EFBFBD><EFBFBD> <20>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><>ŵ
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->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 <TItemData *>(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 <TItemData *>(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 <TItemData *>(GetItemData(Cell)))->aAttr[dwAttrIndex].bType = byType;
(const_cast <TItemData *>(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<DWORD, DWORD>::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 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>Լ<EFBFBD>");
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)
{
// <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3> <20>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
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<DWORD, TPartyMemberInfo>::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<DWORD, TPartyMemberInfo>::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<DWORD, TPartyMemberInfo>::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<DWORD, TPartyMemberInfo>::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<DWORD, TPartyMemberInfo>::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<DWORD, DWORD>::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.<2E><>ų<EFBFBD><C5B3><EFBFBD>Ž<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>[+] <20><>ư<EFBFBD><C6B0> <20>ȳ<EFBFBD><C8B3><EFBFBD> ó<><C3B3>
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)
{
}