Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
3596 lines
95 KiB
C++
3596 lines
95 KiB
C++
// CharStatus.cpp: implementation of the CCharStatus class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#define NATION_HUMAN 0
|
||
#define NATION_AKHAN 1
|
||
#define NATION_UNKNONE 2
|
||
|
||
//#include <crtdbg.h>
|
||
#include "ClientMain.h"
|
||
#include "CharStatus.h"
|
||
#include "CharacterControl.h"
|
||
#include <vector.h>
|
||
#include "DataTable.h"
|
||
#include "GUIMessageBox.h"
|
||
|
||
#include "Item\ItemMgr.h"
|
||
#include "Skill\SkillMgr.h"
|
||
|
||
CDataTable g_dtDateTable;
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
CCharStatus::CCharStatus()
|
||
{
|
||
int i, j, k;
|
||
|
||
for(k = 0; k < 3; k++)
|
||
{
|
||
for(j = 0; j < 6; j++)
|
||
{
|
||
for(i = 0; i < 6; i++)
|
||
{
|
||
m_aryInven[k][j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
}
|
||
|
||
for(j = 0; j < 4; j++)
|
||
{
|
||
for(i = 0; i < 8; i++)
|
||
{
|
||
m_aryExchange[j][i] = ITEM_EMPTY;
|
||
m_aryExchange2[j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
|
||
for(k = 0; k < 4; k++)
|
||
{
|
||
for(j = 0; j < 12; j++)
|
||
{
|
||
for(i = 0; i < 8; i++)
|
||
{
|
||
m_aryDeposit[k][j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
}
|
||
|
||
for(j = 0; j < 8; j++)
|
||
{
|
||
for(i = 0; i < 8; i++)
|
||
{
|
||
m_aryStreetTrade[j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
|
||
m_dwExchangeGold = 0;
|
||
m_dwExchange2Gold = 0;
|
||
|
||
m_dwDepositGold = 0;
|
||
m_cSavePass = 0;
|
||
m_dwMaxTab = 0;
|
||
m_dwDepositFlag = 0;
|
||
m_cUsedDeposit = 0;
|
||
|
||
for(i = 0; i < 15; i++)
|
||
{
|
||
m_lstEquipment[i] = NULL;
|
||
}
|
||
|
||
for(i = 0; i < 20; i++)
|
||
{
|
||
m_lstSkillSlot[i] = NULL;
|
||
}
|
||
|
||
for(i = 0; i < 10; i++)
|
||
{
|
||
m_lstQuickSlot[i] = NULL;
|
||
}
|
||
|
||
for(i = 0; i < 32; i++)
|
||
{
|
||
m_aryEnchantLevel[i] = 0;
|
||
}
|
||
|
||
m_lpQuickSelected = NULL;
|
||
|
||
m_PartyInfo.m_cMemberNum = 0;
|
||
m_PartyInfo.m_dwPartyID = 0;
|
||
for(i = 0; i < 10; i++)
|
||
{
|
||
m_PartyInfo.MemberCID[i] = 0;
|
||
}
|
||
|
||
m_lPotionCoolDownTime = 0;
|
||
|
||
m_bUseChant = FALSE;
|
||
|
||
m_lpUpgrade[0] = NULL;
|
||
m_lpUpgrade[1] = NULL;
|
||
|
||
m_Info.Class = 0;
|
||
}
|
||
|
||
CCharStatus::~CCharStatus()
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
CItemInstance *lpItem;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end();)
|
||
{
|
||
lpItem = (*it);
|
||
it = m_lstInventory.erase(it);
|
||
delete lpItem;
|
||
}
|
||
m_lstInventory.clear();
|
||
|
||
for(it = m_lstDeposit.begin(); it != m_lstDeposit.end();)
|
||
{
|
||
lpItem = (*it);
|
||
it = m_lstDeposit.erase(it);
|
||
delete lpItem;
|
||
}
|
||
m_lstDeposit.clear();
|
||
|
||
for(it = m_lstStreetTrade.begin(); it != m_lstStreetTrade.end();)
|
||
{
|
||
lpItem = (*it);
|
||
it = m_lstStreetTrade.erase(it);
|
||
delete lpItem;
|
||
}
|
||
m_lstStreetTrade.clear();
|
||
|
||
list<FriendInfo *>::iterator itFriend;
|
||
FriendInfo *lpFriend;
|
||
for(itFriend = m_lstFriendList.begin(); itFriend != m_lstFriendList.end();)
|
||
{
|
||
lpFriend = (*itFriend);
|
||
itFriend = m_lstFriendList.erase(itFriend);
|
||
delete lpFriend;
|
||
}
|
||
m_lstFriendList.clear();
|
||
|
||
list<BanInfo *>::iterator itBan;
|
||
BanInfo *lpBan;
|
||
for(itBan = m_lstBanList.begin(); itBan != m_lstBanList.end();)
|
||
{
|
||
lpBan = (*itBan);
|
||
itBan = m_lstBanList.erase(itBan);
|
||
delete lpBan;
|
||
}
|
||
m_lstBanList.clear();
|
||
|
||
int i;
|
||
for(i = 0; i < 10; i++)
|
||
{
|
||
if(m_lstQuickSlot[i])
|
||
{
|
||
delete m_lstQuickSlot[i];
|
||
m_lstQuickSlot[i] = NULL;
|
||
}
|
||
}
|
||
m_lpQuickSelected = NULL;
|
||
for(i = 0; i < 20; i++)
|
||
{
|
||
if(m_lstSkillSlot[i])
|
||
{
|
||
delete m_lstSkillSlot[i];
|
||
m_lstSkillSlot[i] = NULL;
|
||
}
|
||
}
|
||
vector<CItemInstance *>::iterator itSkill;
|
||
for(itSkill = m_lstClassSkill.begin(); itSkill != m_lstClassSkill.end();)
|
||
{
|
||
lpItem = (*itSkill);
|
||
itSkill = m_lstClassSkill.erase(itSkill);
|
||
delete lpItem;
|
||
}
|
||
m_lstClassSkill.clear();
|
||
for(i = 0; i < 15; i++)
|
||
{
|
||
if(m_lstEquipment[i])
|
||
{
|
||
delete m_lstEquipment[i];
|
||
m_lstEquipment[i] = NULL;
|
||
}
|
||
}
|
||
|
||
if(m_lpUpgrade[0]) { delete m_lpUpgrade[0]; m_lpUpgrade[0] = NULL; }
|
||
if(m_lpUpgrade[1]) { delete m_lpUpgrade[1]; m_lpUpgrade[1] = NULL; }
|
||
}
|
||
|
||
void CCharStatus::StatusUpdate()
|
||
{
|
||
m_MaxHP = 0;
|
||
m_MaxMP = 0;
|
||
|
||
m_llExpMax = g_dtDateTable.MAXEXPTABLE[m_Info.Level];
|
||
|
||
m_lAddMaxHP = 0;
|
||
m_lAddMaxMP = 0;
|
||
m_lAddSTR = 0;
|
||
m_lAddDEX = 0;
|
||
m_lAddCON = 0;
|
||
m_lAddINT = 0;
|
||
m_lAddWIS = 0;
|
||
|
||
m_lMinDamage = 0;
|
||
m_lMaxDamage = 0;
|
||
m_lDefensePower = 0;
|
||
m_lAttackRevision = 0;
|
||
m_lDefenseRevision = 0;
|
||
m_lCriticalPercent = 0;
|
||
m_fBlockPercent = 0.0f;
|
||
m_lMagicResistance = 0;
|
||
|
||
int i, j;
|
||
unsigned long dwWeaponCount = 0;
|
||
BOOL bDualWeapon = FALSE;
|
||
|
||
long lAddMaxHP = 0;
|
||
long lAddMaxMP = 0;
|
||
long lAddSTR = 0;
|
||
long lAddDEX = 0;
|
||
long lAddCON = 0;
|
||
long lAddINT = 0;
|
||
long lAddWIS = 0;
|
||
|
||
long lMinDamage = 0;
|
||
long lMaxDamage = 0;
|
||
long lDefensePower = 0;
|
||
long lAttackRevision = 0;
|
||
long lDefenseRevision = 0;
|
||
long lCriticalPercent = 0;
|
||
float fBlockPercent = 0.0f;
|
||
long lMagicResistance = 0;
|
||
|
||
for(i = 0; i < 15; i++)
|
||
{
|
||
if((i == Item::EquipmentPos::WEAPON_HAND2 || i == Item::EquipmentPos::SHIELD_HAND2) && m_cWeaponPos == 0) continue;
|
||
if((i == Item::EquipmentPos::WEAPON_HAND1 || i == Item::EquipmentPos::SHIELD_HAND1) && m_cWeaponPos == 1) continue;
|
||
|
||
if(m_lstEquipment[i])
|
||
{
|
||
Item::CEquipment *lpEquip = Item::CEquipment::DowncastToEquipment(m_lstEquipment[i]->m_lpItemBase);
|
||
if(lpEquip)
|
||
{
|
||
unsigned long dwType = m_lstEquipment[i]->GetItemType();
|
||
|
||
if((dwType == Item::CItemType::SWORD || dwType == Item::CItemType::BLUNT || dwType == Item::CItemType::AXE || dwType == Item::CItemType::DAGGER) &&
|
||
(i == Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos || i == Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos))
|
||
{
|
||
dwWeaponCount++;
|
||
bDualWeapon = TRUE;
|
||
} else
|
||
{
|
||
bDualWeapon = FALSE;
|
||
}
|
||
|
||
for(j = 1; j < Item::Attribute::MAX_ATTRIBUTE_NUM; j++)
|
||
{
|
||
// if(lpEquip->GetAttribute((Item::Attribute::Type)j) == 0) break;
|
||
switch(j)
|
||
{
|
||
case Item::Attribute::MIN_DAMAGE:
|
||
if(dwType != Item::CItemType::SKILL_A_ATTACK && dwType != Item::CItemType::SKILL_A_GUARD &&
|
||
dwType != Item::CItemType::SKILL_A_GUN && dwType != Item::CItemType::SKILL_A_KNIFE)
|
||
{
|
||
if(bDualWeapon)
|
||
{
|
||
lMinDamage += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lMinDamage += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::MAX_DAMAGE:
|
||
if(dwType != Item::CItemType::SKILL_A_ATTACK && dwType != Item::CItemType::SKILL_A_GUARD &&
|
||
dwType != Item::CItemType::SKILL_A_GUN && dwType != Item::CItemType::SKILL_A_KNIFE)
|
||
{
|
||
if(bDualWeapon)
|
||
{
|
||
lMaxDamage += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lMaxDamage += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::DEFENCE:
|
||
if(bDualWeapon)
|
||
{
|
||
lDefensePower += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lDefensePower += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::OFFENCE_REVISION:
|
||
if(bDualWeapon)
|
||
{
|
||
lAttackRevision += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lAttackRevision += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::DEFENCE_REVISION:
|
||
if(bDualWeapon)
|
||
{
|
||
lDefenseRevision += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lDefenseRevision += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::CRITICAL_PERCENTAGE:
|
||
if(bDualWeapon)
|
||
{
|
||
lCriticalPercent += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lCriticalPercent += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::BLOCKING_PERCENTAGE:
|
||
if(bDualWeapon)
|
||
{
|
||
fBlockPercent += (lpEquip->GetAttribute((Item::Attribute::Type)j) / 2.0f);
|
||
} else
|
||
{
|
||
m_fBlockPercent += (lpEquip->GetAttribute((Item::Attribute::Type)j) / 2.0f);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::MAGIC_RESISTANCE:
|
||
if(bDualWeapon)
|
||
{
|
||
lMagicResistance += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lMagicResistance += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::MAX_HP:
|
||
if(bDualWeapon)
|
||
{
|
||
lAddMaxHP += lpEquip->GetAttribute((Item::Attribute::Type)j) * 50;
|
||
} else
|
||
{
|
||
m_lAddMaxHP += lpEquip->GetAttribute((Item::Attribute::Type)j) * 50;
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::MAX_MP:
|
||
if(bDualWeapon)
|
||
{
|
||
lAddMaxMP += lpEquip->GetAttribute((Item::Attribute::Type)j) * 50;
|
||
} else
|
||
{
|
||
m_lAddMaxMP += lpEquip->GetAttribute((Item::Attribute::Type)j) * 50;
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::ADD_STR:
|
||
if(bDualWeapon)
|
||
{
|
||
lAddSTR += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lAddSTR += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::ADD_DEX:
|
||
if(bDualWeapon)
|
||
{
|
||
lAddDEX += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lAddDEX += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::ADD_CON:
|
||
if(bDualWeapon)
|
||
{
|
||
lAddCON += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lAddCON += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::ADD_INT:
|
||
if(bDualWeapon)
|
||
{
|
||
lAddINT += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lAddINT += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
|
||
case Item::Attribute::ADD_WIS:
|
||
if(bDualWeapon)
|
||
{
|
||
lAddWIS += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
} else
|
||
{
|
||
m_lAddWIS += lpEquip->GetAttribute((Item::Attribute::Type)j);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if(dwWeaponCount)
|
||
{
|
||
m_lAddMaxHP += lAddMaxHP / dwWeaponCount;
|
||
m_lAddMaxMP += lAddMaxMP / dwWeaponCount;
|
||
m_lAddSTR += lAddSTR / dwWeaponCount;
|
||
m_lAddDEX += lAddDEX / dwWeaponCount;
|
||
m_lAddCON += lAddCON / dwWeaponCount;
|
||
m_lAddINT += lAddINT / dwWeaponCount;
|
||
m_lAddWIS += lAddWIS / dwWeaponCount;
|
||
|
||
m_lMinDamage += lMinDamage / dwWeaponCount;
|
||
m_lMaxDamage += lMaxDamage / dwWeaponCount;
|
||
m_lDefensePower += lDefensePower / dwWeaponCount;
|
||
m_lAttackRevision += lAttackRevision / dwWeaponCount;
|
||
m_lDefenseRevision += lDefenseRevision / dwWeaponCount;
|
||
m_lCriticalPercent += lCriticalPercent / dwWeaponCount;
|
||
m_fBlockPercent += fBlockPercent / dwWeaponCount;
|
||
m_lMagicResistance += lMagicResistance / dwWeaponCount;
|
||
}
|
||
|
||
BOOL bDex = FALSE;
|
||
if(m_lstEquipment[11 + m_cWeaponPos])
|
||
{
|
||
Item::CEquipment *lpEquip = Item::CEquipment::DowncastToEquipment(m_lstEquipment[11 + m_cWeaponPos]->m_lpItemBase);
|
||
if(lpEquip)
|
||
{
|
||
unsigned long dwType = m_lstEquipment[11 + m_cWeaponPos]->GetItemType();
|
||
if(dwType == Item::CItemType::BOW || dwType == Item::CItemType::CROSSBOW)
|
||
{
|
||
bDex = TRUE;
|
||
}
|
||
}
|
||
}
|
||
|
||
if(bDex)
|
||
{
|
||
m_lMinDamage += ((m_Info.DEX + m_lAddDEX) / 2);
|
||
m_lMaxDamage += ((m_Info.DEX + m_lAddDEX) / 2);
|
||
} else
|
||
{
|
||
m_lMinDamage += ((m_Info.STR + m_lAddSTR) / 3);
|
||
m_lMaxDamage += ((m_Info.STR + m_lAddSTR) / 3);
|
||
}
|
||
|
||
if(m_Info.Class == 2 || m_Info.Class == 7 || m_Info.Class == 8 || m_Info.Class == 24)
|
||
{
|
||
m_lMinDamage += ((m_Info.DEX + m_lAddDEX) / 6);
|
||
m_lMaxDamage += ((m_Info.DEX + m_lAddDEX) / 6);
|
||
}
|
||
|
||
m_lDefensePower += 0;
|
||
switch(m_Info.Class)
|
||
{
|
||
case 1:
|
||
case 5:
|
||
case 6:
|
||
m_lAttackRevision += ((m_Info.STR + m_lAddSTR) / 4);
|
||
m_lDefenseRevision += (((m_Info.STR + m_lAddSTR) / 4.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));
|
||
break;
|
||
|
||
case 2:
|
||
case 7:
|
||
case 8:
|
||
m_lAttackRevision += ((m_Info.DEX + m_lAddDEX) / 4);
|
||
m_lDefenseRevision += (((m_Info.DEX + m_lAddDEX) / 4.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));
|
||
break;
|
||
|
||
case 3:
|
||
case 9:
|
||
case 10:
|
||
m_lAttackRevision += ((m_Info.INT + m_lAddINT) / 4);
|
||
m_lDefenseRevision += (((m_Info.INT + m_lAddINT) / 4.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));
|
||
break;
|
||
|
||
case 4:
|
||
case 11:
|
||
case 12:
|
||
m_lAttackRevision += ((m_Info.WIS + m_lAddWIS) / 2);
|
||
m_lDefenseRevision += ((m_Info.DEX + m_lAddDEX) / 5.0f);/*(((m_Info.WIS + m_lAddWIS) / 4.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));*/
|
||
break;
|
||
|
||
// <20><>ĭ
|
||
|
||
case 17:
|
||
case 19:
|
||
case 20:
|
||
m_lAttackRevision += ((m_Info.STR + m_lAddSTR) / 4);
|
||
m_lDefenseRevision += (((m_Info.STR + m_lAddSTR) / 4.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));
|
||
break;
|
||
|
||
case 18:
|
||
case 24:
|
||
m_lAttackRevision += ((m_Info.DEX + m_lAddDEX) / 4);
|
||
m_lDefenseRevision += (((m_Info.DEX + m_lAddDEX) / 4.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));
|
||
break;
|
||
|
||
case 21:
|
||
m_lAttackRevision += ((m_Info.DEX + m_lAddDEX) / 2);
|
||
m_lDefenseRevision += ((m_Info.DEX + m_lAddDEX) / 5.0f);
|
||
break;
|
||
|
||
case 22:
|
||
m_lAttackRevision += ((m_Info.INT + m_lAddINT) / 4);
|
||
m_lDefenseRevision += (((m_Info.INT + m_lAddINT) / 4.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));
|
||
break;
|
||
|
||
case 23:
|
||
m_lAttackRevision += ((m_Info.WIS + m_lAddWIS) / 2);
|
||
m_lDefenseRevision += (((m_Info.WIS + m_lAddWIS) / 2.0f) + ((m_Info.DEX + m_lAddDEX) / 5.0f));
|
||
break;
|
||
}
|
||
m_lCriticalPercent += ((m_Info.DEX + m_lAddDEX) / 5);
|
||
m_fBlockPercent += 0.0f;
|
||
m_lMagicResistance += ((m_Info.WIS + m_lAddWIS) / 3);
|
||
|
||
long lCON = ((m_Info.CON + m_lAddCON) - 20); if(lCON < 0 ) lCON = 0;
|
||
long lINT = ((m_Info.INT + m_lAddINT) - 20); if(lINT < 0 ) lINT = 0;
|
||
long lWIS = ((m_Info.WIS + m_lAddWIS) - 20); if(lWIS < 0 ) lWIS = 0;
|
||
|
||
switch(m_Info.Class)
|
||
{
|
||
case 1: // Fighter
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 300;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 5: // Defender
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 800;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 6: // Warrior
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 550;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
break;
|
||
|
||
case 2: // Rogue
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 7: // Assasin
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 800;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 800;
|
||
break;
|
||
|
||
case 8: // Archer
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
break;
|
||
|
||
case 3: // Mage
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
if(lINT * m_Info.Level > lWIS * m_Info.Level / 2.0f)
|
||
m_MaxMP += lINT * m_Info.Level + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 9: // Sorcerer
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
if(lINT * m_Info.Level > lWIS * m_Info.Level / 2.0f)
|
||
m_MaxMP += lINT * m_Info.Level + m_Info.Level * 40 + 800;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 800;
|
||
break;
|
||
|
||
case 10: // Enchanter
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
if(lINT * m_Info.Level > lWIS * m_Info.Level / 2.0f)
|
||
m_MaxMP += lINT * m_Info.Level + m_Info.Level * 40 + 550;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
break;
|
||
|
||
case 4: // Acolyte
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 300;
|
||
if(lINT * m_Info.Level / 2.0f > lWIS * m_Info.Level)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 11: // Priest
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 800;
|
||
if(lINT * m_Info.Level / 2.0f > lWIS * m_Info.Level)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 12: // Cleric
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 550;
|
||
if(lINT * m_Info.Level / 2.0f > lWIS * m_Info.Level)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level + m_Info.Level * 40 + 550;
|
||
break;
|
||
|
||
case 17: // Combatent
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 300;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 19: // Templer
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 800;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 20: // Attacker
|
||
m_MaxHP = lCON * m_Info.Level + m_Info.Level * 40 + 550;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
break;
|
||
|
||
case 21: // Gunner
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 800;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 800;
|
||
break;
|
||
|
||
case 18: // Opiciator
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level + m_Info.Level * 40 + 300;
|
||
break;
|
||
|
||
case 22: // Rune Ope
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
if(lINT * m_Info.Level > lWIS * m_Info.Level / 2.0f)
|
||
m_MaxMP += lINT * m_Info.Level + m_Info.Level * 40 + 800;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 800;
|
||
break;
|
||
|
||
case 23: // Life Ope
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
if(lINT * m_Info.Level / 2.0f > lWIS * m_Info.Level)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 550;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level + m_Info.Level * 40 + 550;
|
||
break;
|
||
|
||
case 24: // Shadow Ope
|
||
m_MaxHP = lCON * m_Info.Level / 2.0f + m_Info.Level * 40 + 800;
|
||
if(lINT > lWIS)
|
||
m_MaxMP += lINT * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
else
|
||
m_MaxMP += lWIS * m_Info.Level / 2.0f + m_Info.Level * 40 + 300;
|
||
break;
|
||
}
|
||
|
||
for(i = 0; i < 15; i++)
|
||
{
|
||
if(m_lstEquipment[i])
|
||
{
|
||
if(CheckItemByStatus(m_lstEquipment[i]))
|
||
{
|
||
m_lstEquipment[i]->m_bCanUsed = TRUE;
|
||
} else
|
||
{
|
||
m_lstEquipment[i]->m_bCanUsed = FALSE;
|
||
}
|
||
}
|
||
}
|
||
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
Item::CEquipment *lpEquip = Item::CEquipment::DowncastToEquipment(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->m_lpItemBase);
|
||
if(lpEquip)
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
if(dwType == Item::CItemType::STAFF)
|
||
{
|
||
g_CharacterData.m_dwMaxCombo = 2;
|
||
} else
|
||
{
|
||
g_CharacterData.m_dwMaxCombo = 4;
|
||
}
|
||
|
||
if(dwType == Item::CItemType::BOW || dwType == Item::CItemType::CROSSBOW)
|
||
{
|
||
m_bRangedWeapon = TRUE;
|
||
} else
|
||
{
|
||
m_bRangedWeapon = FALSE;
|
||
}
|
||
}
|
||
} else
|
||
{
|
||
g_CharacterData.m_dwMaxCombo = 0;
|
||
m_bRangedWeapon = FALSE;
|
||
}
|
||
|
||
unsigned long dwComboCount[7] = { 10, 10, 10, 10, 10, 10, 10 };
|
||
|
||
for(i = 0; i < 20; i++)
|
||
{
|
||
if(m_Skill.SSlot[i].SKILLINFO.wSkill)
|
||
{
|
||
const Skill::ProtoType *lpSkill = g_SkillMgr.GetSkillProtoType(m_Skill.SSlot[i].SKILLINFO.wSkill);
|
||
|
||
if(lpSkill && lpSkill->m_eSkillType == Skill::Type::PASSIVE)
|
||
{
|
||
switch(m_Skill.SSlot[i].SKILLINFO.wSkill)
|
||
{
|
||
case 0x8102: // <20>ҵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if((m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::SWORD ||
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::TWOHANDED_SWORD)) ||
|
||
(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::SWORD ||
|
||
m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::TWOHANDED_SWORD)))
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) dwComboCount[0] = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) dwComboCount[0] = 6;
|
||
else dwComboCount[0] = 4;
|
||
}
|
||
break;
|
||
|
||
case 0x8103: // <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if((m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::AXE ||
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::TWOHANDED_AXE)) ||
|
||
(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::AXE ||
|
||
m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::TWOHANDED_AXE)))
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) dwComboCount[1] = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) dwComboCount[1] = 6;
|
||
else dwComboCount[1] = 4;
|
||
}
|
||
break;
|
||
|
||
case 0x8105: // <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if((m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::BLUNT ||
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::TWOHANDED_BLUNT)) ||
|
||
(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::BLUNT ||
|
||
m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::TWOHANDED_BLUNT)))
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) dwComboCount[2] = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) dwComboCount[2] = 6;
|
||
else dwComboCount[2] = 4;
|
||
}
|
||
break;
|
||
|
||
case 0x8705: // <20>ܰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if((m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::DAGGER) ||
|
||
(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos] &&
|
||
m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::DAGGER))
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) dwComboCount[3] = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) dwComboCount[3] = 6;
|
||
else dwComboCount[3] = 4;
|
||
}
|
||
break;
|
||
|
||
/* case 0x8805: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::BOW ||
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::CROSSBOW))
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) g_CharacterData.m_dwMaxCombo = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) g_CharacterData.m_dwMaxCombo = 6;
|
||
}
|
||
break;*/
|
||
|
||
case 0x9102: // ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::COM_BLUNT ||
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::OPP_AXE ||
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::OPP_HAMMER))
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) dwComboCount[4] = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) dwComboCount[4] = 6;
|
||
else dwComboCount[4] = 4;
|
||
}
|
||
break;
|
||
|
||
case 0x9105: // <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::COM_SWORD ||
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::OPP_SLUSHER))
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) dwComboCount[5] = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) dwComboCount[5] = 6;
|
||
else dwComboCount[5] = 4;
|
||
}
|
||
break;
|
||
|
||
case 0x9207: // Ŭ<><C5AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos] &&
|
||
m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType() == Item::CItemType::OPP_TALON)
|
||
{
|
||
m_lAttackRevision += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel) * 2;
|
||
m_lMinDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
m_lMaxDamage += (m_Skill.SSlot[i].SKILLINFO.cLockCount * 6 + m_Skill.SSlot[i].SKILLINFO.cSkillLevel);
|
||
if(m_Skill.SSlot[i].SKILLINFO.cLockCount == 1) dwComboCount[6] = 5;
|
||
else if(m_Skill.SSlot[i].SKILLINFO.cLockCount > 1) dwComboCount[6] = 6;
|
||
else dwComboCount[6] = 4;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
unsigned long dwCombo = 10;
|
||
for(i = 0; i < 7; i++)
|
||
{
|
||
if(dwCombo > dwComboCount[i])
|
||
{
|
||
dwCombo = dwComboCount[i];
|
||
}
|
||
}
|
||
|
||
if(dwCombo != 10) g_CharacterData.m_dwMaxCombo = dwCombo;
|
||
|
||
if(m_lCriticalPercent > 90) m_lCriticalPercent = 90;
|
||
float fSpeedFactor = 1.0f + ((m_Info.DEX + m_lAddDEX) - 20) * 0.005f;
|
||
if(fSpeedFactor > 2.0f) fSpeedFactor = 2.0f;
|
||
g_CharacterData.m_fWalkSpeed = 150.0f * fSpeedFactor;
|
||
g_CharacterData.m_fRunSpeed = 490.0f * fSpeedFactor;
|
||
|
||
m_lRealMinDamage = m_lMinDamage;
|
||
m_lRealMaxDamage = m_lMaxDamage;
|
||
m_lRealDefensePower = m_lDefensePower;
|
||
|
||
m_fRealBlockPercent = m_fBlockPercent;
|
||
|
||
/* m_lCriticalPercent;
|
||
m_lAttackRevision;
|
||
m_lDefenseRevision;*/
|
||
// æƮ / <20><>æƮ <20><>ġ <20><><EFBFBD><EFBFBD>
|
||
for(i = 0; i < 32; i++)
|
||
{
|
||
if(m_aryEnchantLevel[i])
|
||
{
|
||
switch(i)
|
||
{
|
||
case 0: // BattleSong
|
||
m_lMinDamage += m_aryEnchantLevel[i];
|
||
m_lMaxDamage += m_aryEnchantLevel[i];
|
||
break;
|
||
|
||
case 1: // MaintenanceChant
|
||
m_lDefensePower += (m_aryEnchantLevel[i] / 2);
|
||
break;
|
||
|
||
case 2: // AccelerationChant
|
||
m_lMinDamage += (m_aryEnchantLevel[i] / 2);
|
||
m_lMaxDamage += (m_aryEnchantLevel[i] / 2);
|
||
break;
|
||
|
||
case 3: // LifeAura
|
||
break;
|
||
|
||
case 4:
|
||
break;
|
||
|
||
case 5:
|
||
break;
|
||
|
||
case 6:
|
||
break;
|
||
|
||
case 7:
|
||
break;
|
||
|
||
case 8:
|
||
break;
|
||
|
||
case 9:
|
||
break;
|
||
|
||
case 10:
|
||
break;
|
||
|
||
case 11:
|
||
break;
|
||
|
||
case 12:
|
||
break;
|
||
|
||
case 13:
|
||
break;
|
||
|
||
case 14: // Blaze
|
||
g_CharacterData.m_fWalkSpeed = g_CharacterData.m_fWalkSpeed * 1.5f;
|
||
g_CharacterData.m_fRunSpeed = g_CharacterData.m_fRunSpeed * 1.5f;
|
||
|
||
m_lMinDamage += 10;
|
||
m_lMaxDamage += 10;
|
||
|
||
m_lDefensePower -= 10;
|
||
m_lMagicResistance += 40;
|
||
break;
|
||
|
||
case 15: // Charging
|
||
g_CharacterData.m_fWalkSpeed = g_CharacterData.m_fWalkSpeed * 1.5f;
|
||
g_CharacterData.m_fRunSpeed = g_CharacterData.m_fRunSpeed * 1.5f;
|
||
|
||
m_lDefensePower += 10;
|
||
m_lMagicResistance += 30;
|
||
break;
|
||
|
||
case 16: // Stealth
|
||
if(m_Info.Class == 7 || m_Info.Class == 24)
|
||
{
|
||
g_CharacterData.m_fWalkSpeed = g_CharacterData.m_fWalkSpeed * (0.5f + m_aryEnchantLevel[i] / 20.0f);
|
||
g_CharacterData.m_fRunSpeed = g_CharacterData.m_fRunSpeed * (0.5f + m_aryEnchantLevel[i] / 20.0f);
|
||
} else
|
||
{
|
||
g_CharacterData.m_fWalkSpeed = g_CharacterData.m_fWalkSpeed * (0.5f + m_aryEnchantLevel[i] / 40.0f);
|
||
g_CharacterData.m_fRunSpeed = g_CharacterData.m_fRunSpeed * (0.5f + m_aryEnchantLevel[i] / 40.0f);
|
||
}
|
||
break;
|
||
|
||
case 17: // Mana Shell
|
||
break;
|
||
|
||
case 18: // Encourage
|
||
m_lMinDamage += (m_aryEnchantLevel[i] / 2);
|
||
m_lMaxDamage += (m_aryEnchantLevel[i] / 2);
|
||
|
||
m_lDefensePower += (m_aryEnchantLevel[i] / 2);
|
||
break;
|
||
|
||
case 19: // EnchantWeapon
|
||
m_lMinDamage += m_aryEnchantLevel[i];
|
||
m_lMaxDamage += m_aryEnchantLevel[i];
|
||
break;
|
||
|
||
case 20: // BrightArmor
|
||
m_lDefensePower += m_aryEnchantLevel[i];
|
||
break;
|
||
|
||
case 21: // HardenSkin
|
||
m_lDefensePower += m_aryEnchantLevel[i];
|
||
break;
|
||
|
||
case 22: // Flexibility
|
||
break;
|
||
|
||
case 23: // Guard
|
||
m_fBlockPercent = (m_aryEnchantLevel[i] / 2.0f);
|
||
break;
|
||
|
||
case 24: // Hold
|
||
break;
|
||
|
||
case 25: // Stun
|
||
break;
|
||
|
||
case 26: // Frozen
|
||
g_CharacterData.m_fWalkSpeed = g_CharacterData.m_fWalkSpeed / 2.0f;
|
||
g_CharacterData.m_fRunSpeed = g_CharacterData.m_fRunSpeed / 2.0f;
|
||
break;
|
||
|
||
case 27: // Poisoned
|
||
break;
|
||
|
||
case 28: // LowerStrength
|
||
m_lMinDamage -= (m_aryEnchantLevel[i] / 2);
|
||
m_lMaxDamage -= (m_aryEnchantLevel[i] / 2);
|
||
|
||
m_lDefensePower -= (m_aryEnchantLevel[i] / 2);
|
||
break;
|
||
|
||
case 29:
|
||
break;
|
||
|
||
case 30:
|
||
break;
|
||
|
||
case 31:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// g_CharacterData.m_fWalkSpeed = 150.0f * 5.0f;
|
||
// g_CharacterData.m_fRunSpeed = 490.0f * 5.0f;
|
||
}
|
||
|
||
void CCharStatus::CheckInvenField(unsigned long dwCommand, CItemInstance *lpItem)
|
||
{
|
||
const Item::ItemInfo *lpItemInfo = &lpItem->GetItemInfo();
|
||
unsigned char cPosX, cPosY, cTab;
|
||
lpItem->m_lpItemBase->GetPos().GetPos(cPosX, cPosY, cTab);
|
||
|
||
for(int j = cPosY; j < cPosY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = cPosX; i < cPosX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
switch(dwCommand)
|
||
{
|
||
case 0:
|
||
m_aryInven[cTab][j][i] = ITEM_EMPTY;
|
||
break;
|
||
|
||
case 1:
|
||
m_aryInven[cTab][j][i] = lpItem->m_dwItemUID;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::CheckDepositField(unsigned long dwCommand, CItemInstance *lpItem)
|
||
{
|
||
const Item::ItemInfo *lpItemInfo = &lpItem->GetItemInfo();
|
||
unsigned char cPosX, cPosY, cTab;
|
||
lpItem->m_lpItemBase->GetPos().GetPos(cPosX, cPosY, cTab);
|
||
|
||
for(int j = cPosY; j < cPosY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = cPosX; i < cPosX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
switch(dwCommand)
|
||
{
|
||
case 0:
|
||
m_aryDeposit[cTab][j][i] = ITEM_EMPTY;
|
||
break;
|
||
|
||
case 1:
|
||
m_aryDeposit[cTab][j][i] = lpItem->m_dwItemUID;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::CheckExchangeField(unsigned long dwCommand, CItemInstance *lpItem, BOOL bSelf)
|
||
{
|
||
const Item::ItemInfo *lpItemInfo = &lpItem->GetItemInfo();
|
||
unsigned char cPosX, cPosY, cTab;
|
||
lpItem->m_lpItemBase->GetPos().GetPos(cPosX, cPosY, cTab);
|
||
|
||
for(int j = cPosY; j < cPosY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = cPosX; i < cPosX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
switch(dwCommand)
|
||
{
|
||
case 0:
|
||
if(bSelf)
|
||
m_aryExchange[j][i] = ITEM_EMPTY;
|
||
else
|
||
m_aryExchange2[j][i] = ITEM_EMPTY;
|
||
break;
|
||
|
||
case 1:
|
||
if(bSelf)
|
||
m_aryExchange[j][i] = lpItem->m_dwItemUID;
|
||
else
|
||
m_aryExchange2[j][i] = lpItem->m_dwItemUID;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::CheckStreetTradeField(unsigned long dwCommand, CItemInstance *lpItem)
|
||
{
|
||
const Item::ItemInfo *lpItemInfo = &lpItem->GetItemInfo();
|
||
unsigned char cPosX, cPosY, cTab;
|
||
lpItem->m_lpItemBase->GetPos().GetPos(cPosX, cPosY, cTab);
|
||
|
||
for(int j = cPosY; j < cPosY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = cPosX; i < cPosX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
switch(dwCommand)
|
||
{
|
||
case 0:
|
||
m_aryStreetTrade[j][i] = ITEM_EMPTY;
|
||
break;
|
||
|
||
case 1:
|
||
m_aryStreetTrade[j][i] = lpItem->m_dwItemUID;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
__int64 CCharStatus::IsCheckItem(CItemInstance *lpItem, unsigned long dwPos, unsigned long dwInvenX, unsigned long dwInvenY, unsigned long dwInvenTab)
|
||
{
|
||
const Item::ItemInfo *lpItemInfo = &lpItem->GetItemInfo();
|
||
unsigned char cPosX, cPosY, cTab;
|
||
lpItem->m_lpItemBase->GetPos().GetPos(cPosX, cPosY, cTab);
|
||
|
||
switch(dwPos)
|
||
{
|
||
case 0: // <20>κ<EFBFBD>
|
||
{
|
||
if(dwInvenX + lpItemInfo->m_DetailData.m_cXSize > 6) return ITEM_FAILED;
|
||
if(dwInvenY + lpItemInfo->m_DetailData.m_cYSize > 6) return ITEM_FAILED;
|
||
|
||
__int64 m_ddExistItem = ITEM_EMPTY;
|
||
for(int j = dwInvenY; j < dwInvenY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = dwInvenX; i < dwInvenX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
if(m_aryInven[dwInvenTab][j][i] != ITEM_EMPTY)
|
||
{
|
||
if(m_ddExistItem == ITEM_EMPTY)
|
||
m_ddExistItem = m_aryInven[dwInvenTab][j][i];
|
||
else if(m_ddExistItem != m_aryInven[dwInvenTab][j][i])
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
}
|
||
|
||
return m_ddExistItem;
|
||
}
|
||
break;
|
||
|
||
case 4: // â<><C3A2>
|
||
{
|
||
if(dwInvenX + lpItemInfo->m_DetailData.m_cXSize > 8) return ITEM_FAILED;
|
||
if(dwInvenY + lpItemInfo->m_DetailData.m_cYSize > 12) return ITEM_FAILED;
|
||
|
||
__int64 m_ddExistItem = ITEM_EMPTY;
|
||
for(int j = dwInvenY; j < dwInvenY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = dwInvenX; i < dwInvenX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
if(m_aryDeposit[dwInvenTab][j][i] != ITEM_EMPTY)
|
||
{
|
||
if(m_ddExistItem == ITEM_EMPTY)
|
||
m_ddExistItem = m_aryDeposit[dwInvenTab][j][i];
|
||
else if(m_ddExistItem != m_aryDeposit[dwInvenTab][j][i])
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
}
|
||
|
||
return m_ddExistItem;
|
||
}
|
||
break;
|
||
|
||
case 5: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
if(dwInvenX + lpItemInfo->m_DetailData.m_cXSize > 8) return ITEM_FAILED;
|
||
if(dwInvenY + lpItemInfo->m_DetailData.m_cYSize > 8) return ITEM_FAILED;
|
||
|
||
if(lpItem->GetItemPos() != ClientSocket::ItemPos_Inven) return ITEM_FAILED;
|
||
|
||
__int64 m_ddExistItem = ITEM_EMPTY;
|
||
for(int j = dwInvenY; j < dwInvenY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = dwInvenX; i < dwInvenX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
if(m_aryStreetTrade[j][i] != ITEM_EMPTY)
|
||
{
|
||
return ITEM_FAILED;
|
||
/* if(m_ddExistItem == ITEM_EMPTY)
|
||
m_ddExistItem = m_aryStreetTrade[j][i];
|
||
else if(m_ddExistItem != m_aryStreetTrade[j][i])
|
||
return ITEM_FAILED;*/
|
||
}
|
||
}
|
||
}
|
||
|
||
return m_ddExistItem;
|
||
}
|
||
break;
|
||
|
||
case 3: // <20><>ȯ
|
||
{
|
||
if(dwInvenX + lpItemInfo->m_DetailData.m_cXSize > 8) return ITEM_FAILED;
|
||
if(dwInvenY + lpItemInfo->m_DetailData.m_cYSize > 4) return ITEM_FAILED;
|
||
|
||
__int64 m_ddExistItem = ITEM_EMPTY;
|
||
for(int j = dwInvenY; j < dwInvenY + lpItemInfo->m_DetailData.m_cYSize; j++)
|
||
{
|
||
for(int i = dwInvenX; i < dwInvenX + lpItemInfo->m_DetailData.m_cXSize; i++)
|
||
{
|
||
if(m_aryExchange[j][i] != ITEM_EMPTY)
|
||
{
|
||
if(m_ddExistItem == ITEM_EMPTY)
|
||
m_ddExistItem = m_aryExchange[j][i];
|
||
else if(m_ddExistItem != m_aryExchange[j][i])
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
}
|
||
|
||
return m_ddExistItem;
|
||
}
|
||
break;
|
||
|
||
case 1: // <20><><EFBFBD><EFBFBD>
|
||
//// <20>ɷ<EFBFBD>ġ <20><><EFBFBD><EFBFBD>
|
||
if(!lpItem->GetIsEquip()) return ITEM_FAILED;
|
||
if(!CheckItemByStatus(lpItem)) return ITEM_FAILED;
|
||
if(!lpItem->GetNowDurability()) return ITEM_FAILED;
|
||
|
||
/* {
|
||
if(lpItem->GetItemType() == Item::CItemType::CROSSBOW ||
|
||
lpItem->GetItemType() == Item::CItemType::BOW)
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
}*/
|
||
|
||
switch (lpItem->GetItemType())
|
||
{
|
||
// <20><><EFBFBD>
|
||
case Item::CItemType::HELM:
|
||
if(Item::EquipmentPos::HELM == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::HEAD:
|
||
if(m_Info.Nationality == NATION_AKHAN && Item::EquipmentPos::HEAD == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::SHIRT:
|
||
if(Item::EquipmentPos::SHIRT == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::TUNIC:
|
||
if(Item::EquipmentPos::TUNIC == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::BODY:
|
||
if(m_Info.Nationality == NATION_AKHAN && Item::EquipmentPos::BODY == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::ARMOUR:
|
||
if(Item::EquipmentPos::ARMOUR == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::SHIELD:
|
||
if(Item::EquipmentPos::SHIELD_HAND1 == dwInvenX || Item::EquipmentPos::SHIELD_HAND2 == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX])
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned char cType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
if(cType == Item::CItemType::BOW || cType == Item::CItemType::CROSSBOW)
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
else
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned char cType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
if(cType == Item::CItemType::TWOHANDED_BLUNT ||
|
||
cType == Item::CItemType::TWOHANDED_AXE ||
|
||
cType == Item::CItemType::TWOHANDED_SWORD ||
|
||
cType == Item::CItemType::BOW ||
|
||
cType == Item::CItemType::CROSSBOW ||
|
||
cType == Item::CItemType::STAFF)
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
return ITEM_EMPTY;
|
||
}
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::PELVIS:
|
||
if(m_Info.Nationality == NATION_AKHAN && Item::EquipmentPos::PELVIS == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::PROTECT_A:
|
||
if(m_Info.Nationality == NATION_AKHAN && Item::EquipmentPos::PROTECT_ARM == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::SKILL_A_ATTACK:
|
||
case Item::CItemType::SKILL_A_GUARD:
|
||
case Item::CItemType::SKILL_A_GUN:
|
||
case Item::CItemType::SKILL_A_KNIFE:
|
||
if(m_Info.Nationality == NATION_AKHAN && Item::EquipmentPos::SKILL_ARM == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX])
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
else
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1])
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1]->GetTwoHandItem())
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
return ITEM_EMPTY;
|
||
}
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::CLOAK:
|
||
if(Item::EquipmentPos::CLOAK == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::GLOVE:
|
||
if(Item::EquipmentPos::GLOVE == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::BOOTS:
|
||
if(Item::EquipmentPos::BOOTS == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
// <20><><EFBFBD>ű<EFBFBD>
|
||
case Item::CItemType::RING:
|
||
if(Item::EquipmentPos::RINGL == dwInvenX || Item::EquipmentPos::RINGR == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::NECKLACE:
|
||
if(Item::EquipmentPos::NECKLACE == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
// <20>ܰŸ<DCB0> <20>Ѽչ<D1BC><D5B9><EFBFBD>
|
||
case Item::CItemType::SWORD: case Item::CItemType::BLUNT: case Item::CItemType::AXE:
|
||
if(m_Info.Nationality == NATION_HUMAN)
|
||
{
|
||
if((Item::EquipmentPos::WEAPON_HAND1 == dwInvenX || Item::EquipmentPos::WEAPON_HAND2 == dwInvenX))
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType == Item::CItemType::ARROW || dwType == Item::CItemType::BOLT ||
|
||
dwType == Item::CItemType::DAGGER)
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
}
|
||
// <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
else if(m_Info.Class == 6 && (Item::EquipmentPos::SHIELD_HAND1 == dwInvenX || Item::EquipmentPos::SHIELD_HAND2 == dwInvenX))
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType != Item::CItemType::SWORD && dwType != Item::CItemType::BLUNT && dwType != Item::CItemType::AXE)
|
||
return ITEM_FAILED;
|
||
} else
|
||
return ITEM_FAILED;
|
||
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
}/**/ else
|
||
return ITEM_FAILED;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::DAGGER:
|
||
if(m_Info.Nationality == NATION_HUMAN)
|
||
{
|
||
if((Item::EquipmentPos::WEAPON_HAND1 == dwInvenX || Item::EquipmentPos::WEAPON_HAND2 == dwInvenX))
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType == Item::CItemType::ARROW || dwType == Item::CItemType::BOLT ||
|
||
dwType == Item::CItemType::SWORD || dwType == Item::CItemType::BLUNT ||
|
||
dwType == Item::CItemType::AXE)
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
}
|
||
// <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
else if(m_Info.Class == 7 && (Item::EquipmentPos::SHIELD_HAND1 == dwInvenX || Item::EquipmentPos::SHIELD_HAND2 == dwInvenX))
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType != Item::CItemType::DAGGER)
|
||
return ITEM_FAILED;
|
||
} else
|
||
return ITEM_FAILED;
|
||
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
}/**/ else
|
||
return ITEM_FAILED;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::COM_BLUNT: case Item::CItemType::COM_SWORD:
|
||
case Item::CItemType::OPP_AXE: case Item::CItemType::OPP_HAMMER: case Item::CItemType::OPP_SLUSHER:
|
||
case Item::CItemType::OPP_TALON:
|
||
if(m_Info.Nationality == NATION_AKHAN && Item::EquipmentPos::WEAPON_HAND1 == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX]) return m_lstEquipment[dwInvenX]->m_dwItemUID; else return ITEM_EMPTY;
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
// <20>ܰŸ<DCB0> <20><><EFBFBD>չ<EFBFBD><D5B9><EFBFBD>
|
||
case Item::CItemType::STAFF:
|
||
case Item::CItemType::TWOHANDED_BLUNT:
|
||
case Item::CItemType::TWOHANDED_AXE:
|
||
case Item::CItemType::TWOHANDED_SWORD:
|
||
case Item::CItemType::OPP_SYTHE:
|
||
if(Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX])
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
else
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
return ITEM_EMPTY;
|
||
}
|
||
} else
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
break;
|
||
|
||
// <20><><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD>
|
||
case Item::CItemType::BOW:
|
||
if(Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX])
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType == Item::CItemType::ARROW)
|
||
{
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
else
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType == Item::CItemType::ARROW)
|
||
{
|
||
return ITEM_EMPTY;
|
||
}
|
||
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
return ITEM_EMPTY;
|
||
}
|
||
} else
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
break;
|
||
|
||
case Item::CItemType::CROSSBOW:
|
||
if(Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos == dwInvenX)
|
||
{
|
||
if(m_lstEquipment[dwInvenX])
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType == Item::CItemType::BOLT)
|
||
{
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
else
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned long dwType = m_lstEquipment[Item::EquipmentPos::SHIELD_HAND1 + m_cWeaponPos]->GetItemType();
|
||
|
||
if(dwType == Item::CItemType::BOLT)
|
||
{
|
||
return ITEM_EMPTY;
|
||
}
|
||
|
||
return ITEM_FAILED;
|
||
}
|
||
|
||
return ITEM_EMPTY;
|
||
}
|
||
} else
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
break;
|
||
|
||
case Item::CItemType::BOLT:
|
||
if(m_Info.Nationality == NATION_HUMAN && (Item::EquipmentPos::SHIELD_HAND1 == dwInvenX || Item::EquipmentPos::SHIELD_HAND2 == dwInvenX))
|
||
{
|
||
if(m_lstEquipment[dwInvenX])
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned char cType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
if(cType != Item::CItemType::CROSSBOW)
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
else
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned char cType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
if(cType == Item::CItemType::CROSSBOW)
|
||
{
|
||
return ITEM_EMPTY;
|
||
}
|
||
}
|
||
return ITEM_FAILED;
|
||
}
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
case Item::CItemType::ARROW:
|
||
if(m_Info.Nationality == NATION_HUMAN && (Item::EquipmentPos::SHIELD_HAND1 == dwInvenX || Item::EquipmentPos::SHIELD_HAND2 == dwInvenX))
|
||
{
|
||
if(m_lstEquipment[dwInvenX])
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned char cType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
if(cType != Item::CItemType::BOW)
|
||
{
|
||
return ITEM_FAILED;
|
||
}
|
||
}
|
||
return m_lstEquipment[dwInvenX]->m_dwItemUID;
|
||
}
|
||
else
|
||
{
|
||
if(m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos])
|
||
{
|
||
unsigned char cType = m_lstEquipment[Item::EquipmentPos::WEAPON_HAND1 + m_cWeaponPos]->GetItemType();
|
||
if(cType == Item::CItemType::BOW)
|
||
{
|
||
return ITEM_EMPTY;
|
||
}
|
||
}
|
||
return ITEM_FAILED;
|
||
}
|
||
} else
|
||
return ITEM_FAILED;
|
||
break;
|
||
|
||
default:
|
||
return ITEM_FAILED;
|
||
}
|
||
break;
|
||
|
||
case 2: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
break;
|
||
}
|
||
|
||
return ITEM_EMPTY;
|
||
}
|
||
|
||
unsigned char CCharStatus::GetAbleInven(LPFieldInstance lpFieldInstance, Item::ItemPos &pItemIndex, BOOL bStack)
|
||
{
|
||
const Item::ItemInfo *lpProtoType = g_ItemMgr.GetItemInfo(lpFieldInstance->m_dwTypeID);
|
||
unsigned long dwSizeX = lpProtoType->m_DetailData.m_cXSize;
|
||
unsigned long dwSizeY = lpProtoType->m_DetailData.m_cYSize;
|
||
|
||
// char strText[MAX_PATH];
|
||
/* sprintf(strText, "0x%08x, %d, %d, %d, %d, %d, %d", lpFieldInstance->m_dwTypeID, pItemIndex.GetXIndex(), pItemIndex.GetYIndex(), pItemIndex.GetZIndex(),
|
||
dwSizeX, dwSizeY, bStack);
|
||
MessageBox(NULL, strText, "abc", MB_OK);*/
|
||
|
||
for(int k = 0; k < 3; k++)
|
||
{
|
||
for(int j = 0; j <= 6 - dwSizeY; j++)
|
||
{
|
||
for(int i = 0; i <= 6 - dwSizeX; i++)
|
||
{
|
||
BOOL bAble = TRUE;
|
||
for(int cy = 0; cy < dwSizeY; cy++)
|
||
{
|
||
for(int cx = 0; cx < dwSizeX; cx++)
|
||
{
|
||
if(m_aryInven[k][j + cy][i + cx] != ITEM_EMPTY)
|
||
{
|
||
CItemInstance *lpItem = GetInventoryItem(m_aryInven[k][j + cy][i + cx]);
|
||
unsigned char cPosX, cPosY, cTab;
|
||
lpItem->m_lpItemBase->GetPos().GetPos(cPosX, cPosY, cTab);
|
||
|
||
if(bStack && lpProtoType->m_DetailData.m_dwFlags & Item::DetailData::STACKABLE && // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD> <20>ƴѰ<C6B4>...
|
||
(cPosX == i && cPosY == j) && lpItem->GetProtoTypeID() == lpFieldInstance->m_dwTypeID && // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD> <20>ƴѰ<C6B4>...
|
||
lpItem->GetNowDurability() < lpItem->GetMaxDurability()) // <20><> <20><><EFBFBD>ֳ<EFBFBD> <20>ƴѰ<C6B4>...
|
||
{
|
||
if(lpItem->GetMaxDurability() - lpItem->GetNowDurability() < lpFieldInstance->m_cNum)
|
||
{
|
||
bAble = FALSE;
|
||
}
|
||
} else
|
||
{
|
||
bAble = FALSE;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if(bAble)
|
||
{
|
||
pItemIndex.m_cPos = ClientSocket::ItemPos_Inven;
|
||
pItemIndex.SetPos(i, j, k);
|
||
/* sprintf(strText, "<22><><EFBFBD><EFBFBD>, %d", lpFieldInstance->m_cNum);
|
||
// sprintf(strText, "%x, %d, %d, %d", m_aryInven[k][j][i], i, j, k);
|
||
MessageBox(NULL, strText, "abc", MB_OK);*/
|
||
|
||
return lpFieldInstance->m_cNum;
|
||
} else
|
||
{
|
||
/* sprintf(strText, "%d, %d, %d", i, j, k);
|
||
// sprintf(strText, "%x, %d, %d, %d", m_aryInven[k][j][i], i, j, k);
|
||
MessageBox(NULL, strText, "abc", MB_OK);*/
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetDepositItem(__int64 ddItemUID)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstDeposit.begin(); it != m_lstDeposit.end(); it++)
|
||
{
|
||
if((*it)->m_dwItemUID == ddItemUID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetDepositItem(Item::ItemPos &pIndex)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstDeposit.begin(); it != m_lstDeposit.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos() == pIndex) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetDepositItem(unsigned short wIndex)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstDeposit.begin(); it != m_lstDeposit.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos().m_cIndex == wIndex) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetDepositItemfromID(unsigned short wProtoTypeID)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstDeposit.begin(); it != m_lstDeposit.end(); it++)
|
||
{
|
||
if((*it)->GetProtoTypeID() == wProtoTypeID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetInventoryItem(__int64 ddItemUID)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end(); it++)
|
||
{
|
||
if((*it)->m_dwItemUID == ddItemUID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetInventoryItem(Item::ItemPos &pIndex)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos() == pIndex) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetInventoryItem(unsigned short wIndex)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos().m_cIndex == wIndex) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetInventoryItemfromID(unsigned short wProtoTypeID)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end(); it++)
|
||
{
|
||
if((*it)->GetProtoTypeID() == wProtoTypeID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetStreetTradeItem(__int64 ddItemUID)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstStreetTrade.begin(); it != m_lstStreetTrade.end(); it++)
|
||
{
|
||
if((*it)->m_dwItemUID == ddItemUID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetStreetTradeItem(Item::ItemPos &pIndex)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstStreetTrade.begin(); it != m_lstStreetTrade.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos() == pIndex) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetStreetTradeItem(unsigned short wIndex)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstStreetTrade.begin(); it != m_lstStreetTrade.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos().m_cIndex == wIndex) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetStreetTradeItemfromID(unsigned short wProtoTypeID)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstStreetTrade.begin(); it != m_lstStreetTrade.end(); it++)
|
||
{
|
||
if((*it)->GetProtoTypeID() == wProtoTypeID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetExchangeItem(__int64 ddItemUID, BOOL bSelf)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
if(bSelf)
|
||
{
|
||
for(it = m_lstExchange.begin(); it != m_lstExchange.end(); it++)
|
||
{
|
||
if((*it)->m_dwItemUID == ddItemUID) return (*it);
|
||
}
|
||
} else
|
||
{
|
||
for(it = m_lstExchange2.begin(); it != m_lstExchange2.end(); it++)
|
||
{
|
||
if((*it)->m_dwItemUID == ddItemUID) return (*it);
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetExchangeItem(unsigned short wIndex, BOOL bSelf)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
if(bSelf)
|
||
{
|
||
for(it = m_lstExchange.begin(); it != m_lstExchange.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos().m_cIndex == wIndex) return (*it);
|
||
}
|
||
} else
|
||
{
|
||
for(it = m_lstExchange2.begin(); it != m_lstExchange2.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos().m_cIndex == wIndex) return (*it);
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetExchangeItem(Item::ItemPos &pIndex, BOOL bSelf)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
if(bSelf)
|
||
{
|
||
for(it = m_lstExchange.begin(); it != m_lstExchange.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos() == pIndex) return (*it);
|
||
}
|
||
} else
|
||
{
|
||
for(it = m_lstExchange2.begin(); it != m_lstExchange2.end(); it++)
|
||
{
|
||
if((*it)->m_lpItemBase->GetPos() == pIndex) return (*it);
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
CItemInstance *CCharStatus::GetExchangeItemfromID(unsigned short wProtoTypeID, BOOL bSelf)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
if(bSelf)
|
||
{
|
||
for(it = m_lstExchange.begin(); it != m_lstExchange.end(); it++)
|
||
{
|
||
if((*it)->GetProtoTypeID() == wProtoTypeID) return (*it);
|
||
}
|
||
} else
|
||
{
|
||
for(it = m_lstExchange2.begin(); it != m_lstExchange2.end(); it++)
|
||
{
|
||
if((*it)->GetProtoTypeID() == wProtoTypeID) return (*it);
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
void CCharStatus::DeleteInventoryItem(CItemInstance *lpDelete)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end(); it++)
|
||
{
|
||
if((*it) == lpDelete)
|
||
{
|
||
CheckInvenField(0, lpDelete);
|
||
m_lstInventory.erase(it);
|
||
SetQuickSlot(lpDelete);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::DeleteDepositItem(CItemInstance *lpDelete)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstDeposit.begin(); it != m_lstDeposit.end(); it++)
|
||
{
|
||
if((*it) == lpDelete)
|
||
{
|
||
CheckDepositField(0, lpDelete);
|
||
m_lstDeposit.erase(it);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::DeleteExchangeItem(CItemInstance *lpDelete, BOOL bSelf)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
if(bSelf)
|
||
{
|
||
for(it = m_lstExchange.begin(); it != m_lstExchange.end(); it++)
|
||
{
|
||
if((*it) == lpDelete)
|
||
{
|
||
CheckExchangeField(0, lpDelete, bSelf);
|
||
m_lstExchange.erase(it);
|
||
break;
|
||
}
|
||
}
|
||
} else
|
||
{
|
||
for(it = m_lstExchange2.begin(); it != m_lstExchange2.end(); it++)
|
||
{
|
||
if((*it) == lpDelete)
|
||
{
|
||
CheckExchangeField(0, lpDelete, bSelf);
|
||
m_lstExchange2.erase(it);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::DeleteStreetTradeItem(CItemInstance *lpDelete)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
for(it = m_lstStreetTrade.begin(); it != m_lstStreetTrade.end(); it++)
|
||
{
|
||
if((*it) == lpDelete)
|
||
{
|
||
CheckStreetTradeField(0, lpDelete);
|
||
m_lstStreetTrade.erase(it);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::AddInventoryItem(CItemInstance *AddItem, BOOL bSound)
|
||
{
|
||
CItemInstance *lpItem = GetInventoryItem(AddItem->m_lpItemBase->GetPos().m_cIndex);
|
||
if(lpItem)
|
||
{
|
||
if(lpItem->GetIsEnableStack())
|
||
{
|
||
DeleteInventoryItem(lpItem);
|
||
delete lpItem;
|
||
} else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
m_lstInventory.push_back(AddItem);
|
||
SetQuickSlot(AddItem);
|
||
CheckInvenField(1, AddItem);
|
||
|
||
if(bSound && AddItem->m_lpItemBase &&
|
||
strcmp(AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName, "NONE"))
|
||
{
|
||
CSoundManager &sm = CSoundManager::GetInstance();
|
||
char Temp[MAX_PATH];
|
||
sprintf(Temp, "%s\\Sound\\Item\\%s", g_ClientMain.m_strClientPath, AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName);
|
||
ISoundObject &sb = sm.GetBuffer(Temp, false);
|
||
sb.Play(false);
|
||
}
|
||
}
|
||
|
||
void CCharStatus::AddEquipItem(unsigned long dwPos, CItemInstance *AddItem, BOOL bSound)
|
||
{
|
||
m_lstEquipment[dwPos] = AddItem;
|
||
|
||
if(bSound && AddItem->m_lpItemBase &&
|
||
strcmp(AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName, "NONE"))
|
||
{
|
||
CSoundManager &sm = CSoundManager::GetInstance();
|
||
char Temp[MAX_PATH];
|
||
sprintf(Temp, "%s\\Sound\\Item\\%s", g_ClientMain.m_strClientPath, AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName);
|
||
ISoundObject &sb = sm.GetBuffer(Temp, false);
|
||
sb.Play(false);
|
||
}
|
||
}
|
||
|
||
void CCharStatus::AddDepositItem(CItemInstance *AddItem, BOOL bSound)
|
||
{
|
||
CItemInstance *lpItem = GetDepositItem(AddItem->m_lpItemBase->GetPos().m_cIndex);
|
||
if(lpItem)
|
||
{
|
||
if(lpItem->GetIsEnableStack())
|
||
{
|
||
DeleteDepositItem(lpItem);
|
||
delete lpItem;
|
||
} else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
m_lstDeposit.push_back(AddItem);
|
||
CheckDepositField(1, AddItem);
|
||
|
||
if(bSound && AddItem->m_lpItemBase &&
|
||
strcmp(AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName, "NONE"))
|
||
{
|
||
CSoundManager &sm = CSoundManager::GetInstance();
|
||
char Temp[MAX_PATH];
|
||
sprintf(Temp, "%s\\Sound\\Item\\%s", g_ClientMain.m_strClientPath, AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName);
|
||
ISoundObject &sb = sm.GetBuffer(Temp, false);
|
||
sb.Play(false);
|
||
}
|
||
}
|
||
|
||
void CCharStatus::AddExchangeItem(CItemInstance *AddItem, BOOL bSelf, BOOL bSound)
|
||
{
|
||
CItemInstance *lpItem = GetExchangeItem(AddItem->m_lpItemBase->GetPos().m_cIndex, bSelf);
|
||
if(lpItem)
|
||
{
|
||
if(lpItem->GetIsEnableStack())
|
||
{
|
||
DeleteExchangeItem(lpItem, bSelf);
|
||
delete lpItem;
|
||
} else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
if(bSelf)
|
||
{
|
||
m_lstExchange.push_back(AddItem);
|
||
} else
|
||
{
|
||
m_lstExchange2.push_back(AddItem);
|
||
}
|
||
CheckExchangeField(1, AddItem, bSelf);
|
||
|
||
if(bSound && AddItem->m_lpItemBase &&
|
||
strcmp(AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName, "NONE"))
|
||
{
|
||
CSoundManager &sm = CSoundManager::GetInstance();
|
||
char Temp[MAX_PATH];
|
||
sprintf(Temp, "%s\\Sound\\Item\\%s", g_ClientMain.m_strClientPath, AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName);
|
||
ISoundObject &sb = sm.GetBuffer(Temp, false);
|
||
sb.Play(false);
|
||
}
|
||
}
|
||
|
||
void CCharStatus::AddStreetTradeItem(CItemInstance *AddItem, BOOL bSound)
|
||
{
|
||
CItemInstance *lpItem = GetStreetTradeItem(AddItem->m_lpItemBase->GetPos().m_cIndex);
|
||
if(lpItem)
|
||
{
|
||
return;
|
||
}
|
||
m_lstStreetTrade.push_back(AddItem);
|
||
CheckStreetTradeField(1, AddItem);
|
||
|
||
if(bSound && AddItem->m_lpItemBase &&
|
||
strcmp(AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName, "NONE"))
|
||
{
|
||
CSoundManager &sm = CSoundManager::GetInstance();
|
||
char Temp[MAX_PATH];
|
||
sprintf(Temp, "%s\\Sound\\Item\\%s", g_ClientMain.m_strClientPath, AddItem->m_lpItemBase->GetItemInfo().m_StringData.m_szEffectSoundName);
|
||
ISoundObject &sb = sm.GetBuffer(Temp, false);
|
||
sb.Play(false);
|
||
}
|
||
}
|
||
|
||
SKILLSLOT *CCharStatus::GetSkillSlot(unsigned short wSkill)
|
||
{
|
||
for(int i = 0; i < 20; i++)
|
||
{
|
||
if(m_Skill.SSlot[i].SKILLINFO.wSkill == wSkill)
|
||
{
|
||
return &m_Skill.SSlot[i];
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
void CCharStatus::DestroyParty()
|
||
{
|
||
m_Info.Party = 0;
|
||
m_PartyInfo.m_cMemberNum = 0;
|
||
m_PartyInfo.m_dwPartyID = 0;
|
||
m_PartyInfo.m_dwLeaderID = 0;
|
||
for(int i = 0; i < 10; i++)
|
||
{
|
||
m_PartyInfo.ServerID[i] = 0;
|
||
m_PartyInfo.MemberCID[i] = 0;
|
||
strcpy(m_PartyInfo.Name[i], "");
|
||
}
|
||
}
|
||
|
||
void CCharStatus::DeletePartyPlayer(unsigned long dwChrID)
|
||
{
|
||
for(int i = 0; i < m_PartyInfo.m_cMemberNum; i++)
|
||
{
|
||
if(m_PartyInfo.MemberCID[i] == dwChrID)
|
||
{
|
||
for(int j = i; j < 9; j++)
|
||
{
|
||
m_PartyInfo.MemberCID[j] = m_PartyInfo.MemberCID[j + 1];
|
||
m_PartyInfo.ServerID[j] = m_PartyInfo.ServerID[j + 1];
|
||
strcpy(m_PartyInfo.Name[j], m_PartyInfo.Name[j + 1]);
|
||
}
|
||
|
||
m_PartyInfo.m_cMemberNum--;
|
||
m_PartyInfo.MemberCID[9] = 0;
|
||
m_PartyInfo.ServerID[9] = 0;
|
||
strcpy(m_PartyInfo.Name[9], "");
|
||
|
||
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
||
if(lpCreature)
|
||
{
|
||
lpCreature->m_dwPartyID = 0;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::AddPartyPlayer(unsigned long dwChrID, unsigned long dwServerID, char *strName)
|
||
{
|
||
for(int i = 0; i < 10; i++)
|
||
{
|
||
if(!m_PartyInfo.MemberCID[i])
|
||
{
|
||
m_PartyInfo.MemberCID[i] = dwChrID;
|
||
m_PartyInfo.ServerID[i] = dwServerID;
|
||
strcpy(m_PartyInfo.Name[i], strName);
|
||
m_PartyInfo.m_cMemberNum++;
|
||
|
||
CCreature *lpCreature = g_CharacterData.GetCreature(dwChrID);
|
||
if(lpCreature)
|
||
{
|
||
lpCreature->m_dwPartyID = m_PartyInfo.m_dwPartyID;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
char *CCharStatus::LoginPartyPlayer(unsigned long dwChrID, unsigned long dwServerID)
|
||
{
|
||
for(int i = 0; i < 10; i++)
|
||
{
|
||
if(m_PartyInfo.MemberCID[i] == dwChrID)
|
||
{
|
||
m_PartyInfo.ServerID[i] = dwServerID;
|
||
return m_PartyInfo.Name[i];
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
char *CCharStatus::LogoutPartyPlayer(unsigned long dwChrID)
|
||
{
|
||
for(int i = 0; i < 10; i++)
|
||
{
|
||
if(m_PartyInfo.MemberCID[i] == dwChrID)
|
||
{
|
||
m_PartyInfo.ServerID[i] = 0;
|
||
return m_PartyInfo.Name[i];
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
BOOL CCharStatus::GetIsInstallSocket(CItemInstance *lpEquipItem, CItemInstance *lpSocketItem)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD> <20>۱<EFBFBD>
|
||
if(lpEquipItem->GetIsEquip())
|
||
{
|
||
Item::CEquipment *lpEquip = Item::CEquipment::DowncastToEquipment(lpEquipItem->m_lpItemBase);
|
||
if(lpEquip)
|
||
{
|
||
if(lpSocketItem->GetNowDurability() == 1)
|
||
{
|
||
if(lpSocketItem->GetItemType() == Item::CItemType::GEM)
|
||
{
|
||
int sn;
|
||
for(sn = 0; sn < lpEquip->m_cMaxSocket; sn++)
|
||
{
|
||
if(!lpEquip->m_cSocket[sn]) break;
|
||
}
|
||
|
||
if(sn < lpEquip->m_cMaxSocket)
|
||
{
|
||
return TRUE;
|
||
}
|
||
} else if(lpSocketItem->GetItemType() == Item::CItemType::RUNE)
|
||
{
|
||
if(!lpEquip->m_usRuneSocket)
|
||
{
|
||
return TRUE;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::CheckPartyMember(unsigned long dwChrID)
|
||
{
|
||
for(int i = 0; i < 10; i++)
|
||
{
|
||
if(m_PartyInfo.MemberCID[i] == dwChrID) return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::IsCheckStatusforSkill(unsigned short wSkill)
|
||
{
|
||
const Skill::ProtoType *lpSkill = g_SkillMgr.GetSkillProtoType(wSkill);
|
||
|
||
if(!lpSkill) return FALSE;
|
||
|
||
SKILLSLOT *lpSkillSlot = GetSkillSlot(lpSkill->m_usSkill_ID);
|
||
unsigned long dwValue;
|
||
|
||
for(int i = 0; i < 2; i++)
|
||
{
|
||
if(lpSkill->m_StatusLimitType[i])
|
||
{
|
||
if(lpSkillSlot)
|
||
dwValue = (lpSkillSlot->SKILLINFO.cLockCount * 6 + lpSkillSlot->SKILLINFO.cSkillLevel + 1) * lpSkill->m_StatusLimitValue[i];
|
||
else
|
||
dwValue = lpSkill->m_StatusLimitValue[i];
|
||
|
||
switch(lpSkill->m_StatusLimitType[i])
|
||
{
|
||
case Skill::StatusLimit::STR:
|
||
if(m_Info.STR < dwValue) return FALSE;
|
||
break;
|
||
case Skill::StatusLimit::DEX:
|
||
if(m_Info.DEX < dwValue) return FALSE;
|
||
break;
|
||
case Skill::StatusLimit::CON:
|
||
if(m_Info.CON < dwValue) return FALSE;
|
||
break;
|
||
case Skill::StatusLimit::INT:
|
||
if(m_Info.INT < dwValue) return FALSE;
|
||
break;
|
||
case Skill::StatusLimit::WIS:
|
||
if(m_Info.WIS < dwValue) return FALSE;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
unsigned long CCharStatus::IsCheckClassforSkill(unsigned short wSkill)
|
||
{
|
||
unsigned char cSkillClass = (unsigned char)(((wSkill & 0xFF00) >> 8) - 0x80);
|
||
|
||
if(m_Info.Nationality == NATION_HUMAN)
|
||
{
|
||
if(1 <= m_Info.Class && m_Info.Class <= 4)
|
||
{
|
||
if(m_Info.Class == cSkillClass) return 1;
|
||
if(1 <= cSkillClass && cSkillClass <= 4) return 2;
|
||
|
||
switch(m_Info.Class)
|
||
{
|
||
case 1:
|
||
if(cSkillClass == 5 || cSkillClass == 6) return 3;
|
||
break;
|
||
|
||
case 2:
|
||
if(cSkillClass == 7 || cSkillClass == 8) return 3;
|
||
break;
|
||
|
||
case 3:
|
||
if(cSkillClass == 9 || cSkillClass == 10) return 3;
|
||
break;
|
||
|
||
case 4:
|
||
if(cSkillClass == 11 || cSkillClass == 12) return 3;
|
||
break;
|
||
}
|
||
} else if(4 < m_Info.Class && m_Info.Class <= 12)
|
||
{
|
||
if(cSkillClass == 1 || cSkillClass == 2 || cSkillClass == 3 || cSkillClass == 4)
|
||
return 1;
|
||
|
||
if(m_Info.Class == cSkillClass) return 1;
|
||
}
|
||
} else if(m_Info.Nationality == NATION_AKHAN)
|
||
{
|
||
if(17 <= m_Info.Class && m_Info.Class <= 18)
|
||
{
|
||
if(m_Info.Class == cSkillClass) return 1;
|
||
if(17 <= cSkillClass && cSkillClass <= 18) return 2;
|
||
|
||
switch(m_Info.Class)
|
||
{
|
||
case 17:
|
||
if(cSkillClass == 19 || cSkillClass == 20 || cSkillClass == 21) return 3;
|
||
break;
|
||
|
||
case 18:
|
||
if(cSkillClass == 22 || cSkillClass == 23 || cSkillClass == 24) return 3;
|
||
break;
|
||
}
|
||
} else if(18 < m_Info.Class && m_Info.Class <= 24)
|
||
{
|
||
if(cSkillClass == 17 || cSkillClass == 18)
|
||
return 1;
|
||
|
||
if(m_Info.Class == cSkillClass) return 1;
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
long CCharStatus::GetUseIP(unsigned long dwKindStatus)
|
||
{
|
||
switch(m_Info.Class)
|
||
{
|
||
case 1:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 2:
|
||
if(dwKindStatus == STATUS_DEX || dwKindStatus == STATUS_STR) return 2; else return 1;
|
||
break;
|
||
|
||
case 3:
|
||
if(dwKindStatus == STATUS_INT || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
|
||
case 4:
|
||
if(dwKindStatus == STATUS_WIS || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 5:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 6:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 7:
|
||
if(dwKindStatus == STATUS_DEX || dwKindStatus == STATUS_STR) return 2; else return 1;
|
||
break;
|
||
|
||
case 8:
|
||
if(dwKindStatus == STATUS_DEX || dwKindStatus == STATUS_STR) return 2; else return 1;
|
||
break;
|
||
|
||
case 9:
|
||
if(dwKindStatus == STATUS_INT || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
|
||
case 10:
|
||
if(dwKindStatus == STATUS_INT || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
|
||
case 11:
|
||
if(dwKindStatus == STATUS_WIS || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 12:
|
||
if(dwKindStatus == STATUS_WIS || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
// <20><>ĭ
|
||
|
||
case 17:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_CON || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
|
||
case 18:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_INT || dwKindStatus == STATUS_WIS || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
|
||
case 19:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 20:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 21:
|
||
if(dwKindStatus == STATUS_DEX || dwKindStatus == STATUS_CON) return 2; else return 1;
|
||
break;
|
||
|
||
case 22:
|
||
if(dwKindStatus == STATUS_INT || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
|
||
case 23:
|
||
if(dwKindStatus == STATUS_WIS || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
|
||
case 24:
|
||
if(dwKindStatus == STATUS_STR || dwKindStatus == STATUS_DEX) return 2; else return 1;
|
||
break;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
unsigned long CCharStatus::CheckUseSkillBook(CItemInstance *lpItem)
|
||
{
|
||
long lINT = (((m_Info.INT + m_lAddINT) - 20) / 10.0f); if(lINT < 0 ) lINT = 0;
|
||
|
||
if(m_Skill.wSkillNum < (m_Info.Level + lINT))
|
||
{
|
||
//// Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
unsigned short wSkill = lpItem->GetSkillID();
|
||
|
||
unsigned long dwClassResult = IsCheckClassforSkill(wSkill);
|
||
if(dwClassResult != 1)
|
||
{
|
||
switch(dwClassResult)
|
||
{
|
||
case 0:
|
||
return 7;
|
||
|
||
case 2:
|
||
return 8;
|
||
|
||
case 3:
|
||
return 9;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
LPSKILLSLOT lpSkillSlot = GetSkillSlot(wSkill);
|
||
if(lpSkillSlot)
|
||
{
|
||
if(lpSkillSlot->SKILLINFO.cLockCount == lpItem->m_lpItemBase->GetItemInfo().m_UseItemInfo.m_usSkill_LockCount)
|
||
{
|
||
if(lpSkillSlot->SKILLINFO.cSkillLevel < 6)
|
||
{
|
||
if(IsCheckStatusforSkill(wSkill))
|
||
{
|
||
return 1;
|
||
} else
|
||
{
|
||
return 2;
|
||
/* CGUIMessageBox *lpMessageBox;
|
||
lpMessageBox = new CGUIMessageBox;
|
||
lpMessageBox->Create("<22>ɷ<EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>ܿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.");*/
|
||
}
|
||
} else
|
||
{
|
||
return 3;
|
||
/* CGUIMessageBox *lpMessageBox;
|
||
lpMessageBox = new CGUIMessageBox;
|
||
lpMessageBox->Create("<22><>ų<EFBFBD><C5B3> <20><> á<><C3A1><EFBFBD>ϴ<EFBFBD>.");
|
||
// <20><>ų<EFBFBD><C5B3> <20><> á<><C3A1>.*/
|
||
}
|
||
} else
|
||
{
|
||
return 4;
|
||
/* // <20>ܿ<EFBFBD> <20><> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>.
|
||
CGUIMessageBox *lpMessageBox;
|
||
lpMessageBox = new CGUIMessageBox;
|
||
lpMessageBox->Create("<22>ܿ<EFBFBD> <20><> <20>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ƴմϴ<D5B4>.");*/
|
||
}
|
||
} else
|
||
{
|
||
if(m_Skill.wSlotNum < 20)
|
||
{
|
||
if(lpItem->m_lpItemBase->GetItemInfo().m_UseItemInfo.m_usSkill_LockCount == 0)
|
||
{
|
||
if(IsCheckStatusforSkill(wSkill))
|
||
{
|
||
return 1;
|
||
} else
|
||
{
|
||
return 2;
|
||
}
|
||
} else
|
||
{
|
||
return 4;
|
||
}
|
||
} else
|
||
{
|
||
return 5;
|
||
/* // ĭ<><C4AD> <20><><EFBFBD><EFBFBD>.
|
||
CGUIMessageBox *lpMessageBox;
|
||
lpMessageBox = new CGUIMessageBox;
|
||
lpMessageBox->Create("<22><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> á<><C3A1><EFBFBD>ϴ<EFBFBD>.");*/
|
||
}
|
||
}
|
||
} else
|
||
{
|
||
return 6;
|
||
/* // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||
CGUIMessageBox *lpMessageBox;
|
||
lpMessageBox = new CGUIMessageBox;
|
||
lpMessageBox->Create("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.");*/
|
||
}
|
||
}
|
||
|
||
unsigned long CCharStatus::CheckUsePotion(CItemInstance *lpItem)
|
||
{
|
||
// <20><><EFBFBD>ٿ<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
if(m_lPotionCoolDownTime <= 0)
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
BOOL CCharStatus::SetQuickSlotItemNumber(CItemInstance *lpItem)
|
||
{
|
||
list<CItemInstance *>::iterator it;
|
||
unsigned long dwItemNumber = 0;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end(); it++)
|
||
{
|
||
if(lpItem->GetProtoTypeID() == (*it)->GetProtoTypeID())
|
||
{
|
||
dwItemNumber += (*it)->GetNowDurability();
|
||
}
|
||
}
|
||
|
||
if(dwItemNumber == 0) return FALSE;
|
||
|
||
if(dwItemNumber > 99)
|
||
lpItem->SetNowDurability(99);
|
||
else
|
||
lpItem->SetNowDurability(dwItemNumber);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void CCharStatus::SetQuickSlot(CItemInstance *lpItem)
|
||
{
|
||
if(!lpItem->m_lpItemBase->IsSet(Item::DetailData::QUICKSLOT_IN)) return;
|
||
|
||
for(int i = 0; i < 10; i++)
|
||
{
|
||
if(m_lstQuickSlot[i])
|
||
{
|
||
if(m_lstQuickSlot[i]->GetProtoTypeID() == lpItem->GetProtoTypeID())
|
||
{
|
||
if(!SetQuickSlotItemNumber(m_lstQuickSlot[i]))
|
||
{
|
||
g_ClientMain.m_Network.SendQuickSlotMove(m_lstQuickSlot[i], ClientSocket::ItemPos_None, i);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
BOOL CCharStatus::CheckItemByStatus(CItemInstance *lpItem)
|
||
{
|
||
const Item::UseLimit *lpLimit = &lpItem->GetItemInfo().m_UseLimit;
|
||
|
||
if(m_Info.Level < lpLimit->m_nStatusLimit[Item::StatusLimit::LEVEL]) return FALSE;
|
||
if(m_Info.STR < lpLimit->m_nStatusLimit[Item::StatusLimit::STR]) return FALSE;
|
||
if(m_Info.DEX < lpLimit->m_nStatusLimit[Item::StatusLimit::DEX]) return FALSE;
|
||
if(m_Info.CON < lpLimit->m_nStatusLimit[Item::StatusLimit::CON]) return FALSE;
|
||
if(m_Info.INT < lpLimit->m_nStatusLimit[Item::StatusLimit::INT]) return FALSE;
|
||
if(m_Info.WIS < lpLimit->m_nStatusLimit[Item::StatusLimit::WIS]) return FALSE;
|
||
|
||
/* if(lpLimit->m_nCanUseRace != Item::Race::ALL)
|
||
{
|
||
switch(lpLimit->m_nCanUseRace)
|
||
{
|
||
case Item::Race::HUMAN:
|
||
if(m_Info.Nationality != NATION_HUMAN) return FALSE;
|
||
break;
|
||
case Item::Race::AKHAN:
|
||
if(m_Info.Nationality != NATION_AKHAN) return FALSE;
|
||
break;
|
||
}
|
||
}*/
|
||
|
||
if(!(lpLimit->m_dwClassLimit & (0x00000001 << (m_Info.Class - 1))))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL CCharStatus::GetExistExchangeItem()
|
||
{
|
||
if(m_lstExchange.size() || m_lstExchange2.size() || m_dwExchangeGold || m_dwExchange2Gold)
|
||
return TRUE;
|
||
else
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::CheckUseSkill()
|
||
{
|
||
/* int nResult = CSceneManager::GetCharacterEvent(g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lpChrModel, EVENT_JUST);
|
||
if(nResult)
|
||
{
|
||
// Skill::LPProtoType lpSkill = g_SkillMgr.GetSkillProtoType(m_lpQuickSelected->GetProtoTypeID());
|
||
// <20><><EFBFBD>⼭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD> üũ
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰų<CAB0>, <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD≯<EFBFBD> FALSE
|
||
/* unsigned long dwMotion = g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwUpperChrAction;
|
||
if(dwMotion == CA_OVERBASH1)
|
||
{
|
||
unsigned char cFrame = (unsigned char)g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_lpChrModel->GetMotionCurrentFrame(0);
|
||
if(lpSkill->m_cMinRange <= cFrame && cFrame <= lpSkill->m_cMaxRange)
|
||
{*/
|
||
// return TRUE;
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
if(m_lpQuickSelected)
|
||
{
|
||
const Skill::ProtoType *lpSkill = g_SkillMgr.GetSkillProtoType(m_lpQuickSelected->GetProtoTypeID());
|
||
|
||
if(m_lpQuickSelected->m_lCoolDownTimeCount <= 0 || (lpSkill->m_bGauge && g_CharacterData.m_bComboSuccess))
|
||
{
|
||
g_CharacterData.m_bComboSuccess = FALSE;
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
g_CharacterData.m_bComboSuccess = FALSE;
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
void CCharStatus::SetActivateSkill(CItemInstance *lpUseSkill)
|
||
{
|
||
m_lpQuickSelected = lpUseSkill;
|
||
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_dwSkillComboCount = 0;
|
||
g_CharacterData.m_lstCharData[g_CharacterData.m_nFocusCharacter]->m_bSkillCombo = FALSE;
|
||
|
||
if(g_CharacterData.m_lpButtonNormal)
|
||
{
|
||
CSceneManager::m_EffectManager.DeleteInterfaceScript(g_CharacterData.m_lpButtonNormal);
|
||
g_CharacterData.m_lpButtonNormal = NULL;
|
||
g_CharacterData.m_bComboSuccess = FALSE;
|
||
|
||
CEffScript *test_script;
|
||
// _ASSERTE(_CrtCheckMemory());
|
||
test_script = new CEffScript;
|
||
test_script->SetInterfaceSet(true);
|
||
test_script->GetScriptBinData("inter_fasthit_button_4.esf");
|
||
CSceneManager::m_EffectManager.AddInterfaceScript(test_script);
|
||
}
|
||
}
|
||
|
||
BOOL CCharStatus::CheckStatus()
|
||
{
|
||
long TIP = m_Info.IP;
|
||
|
||
switch(m_Info.Class)
|
||
{
|
||
case 1: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 2: // <20>α<EFBFBD>
|
||
TIP += (m_Info.STR - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.DEX - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 3: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 4: // <20><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>Ʈ
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20 - (m_Info.Level - 1)) * 2;
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 5: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20 - int((m_Info.Level - 1) * 1.5)) * 2;
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - int((m_Info.Level - 1) * 1.5 + 0.5)) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 6: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20 - (m_Info.Level - 1) * 2) * 2;
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (m_Info.Level - 1) * 1) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 7: // <20><><EFBFBD>ؽ<EFBFBD>
|
||
TIP += (m_Info.STR - 20 - (m_Info.Level - 1) * 1) * 2;
|
||
TIP += (m_Info.DEX - 20 - (m_Info.Level - 1) * 2) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 8: // <20><><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20 - (int)((m_Info.Level - 1) * 1.5 + 0.5)) * 2;
|
||
TIP += (m_Info.DEX - 20 - (int)((m_Info.Level - 1) * 1.5)) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 9: // <20>Ҽ<EFBFBD><D2BC><EFBFBD>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20 - (m_Info.Level - 1) * 1) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20 - (m_Info.Level - 1) * 2) * 2;
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 10: // <20><>æ<EFBFBD><C3A6>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20 - (int)((m_Info.Level - 1) * 1.5 + 0.5)) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20 - (int)((m_Info.Level - 1) * 1.5)) * 2;
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 11: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (int)((m_Info.Level - 1) * 1.5 + 0.5)) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20 - (int)((m_Info.Level - 1) * 1.5)) * 2;
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 12: // Ŭ<><C5AC><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (m_Info.Level - 1) * 1) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20 - (m_Info.Level - 1) * 2) * 2;
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 17: // <20>Ĺ<EFBFBD><C4B9><EFBFBD>Ʈ
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > 10)
|
||
return FALSE;
|
||
break;
|
||
|
||
case 18: // <20><><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20 - (m_Info.Level - 1)) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > 10)
|
||
return FALSE;
|
||
break;
|
||
|
||
case 19: // <20><><EFBFBD>÷<EFBFBD>
|
||
TIP += (m_Info.STR - 20 - (int)((m_Info.Level - 1) * 1.5)) * 2;
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (int)((m_Info.Level - 1) * 1.5 + 0.5)) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 20: // <20><><EFBFBD><EFBFBD>Ŀ
|
||
TIP += (m_Info.STR - 20 - (m_Info.Level - 1) * 2) * 2;
|
||
TIP += (m_Info.DEX - 20);
|
||
TIP += (m_Info.CON - 20 - (m_Info.Level - 1) * 1) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 21: // <20>ų<EFBFBD>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20 - (int)((m_Info.Level - 1) * 1.5)) * 2;
|
||
TIP += (m_Info.CON - 20 - (int)((m_Info.Level - 1) * 1.5 + 0.5)) * 2;
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 22: // <20><> <20><><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20 - (m_Info.Level - 1) * 1) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20 - (m_Info.Level - 1) * 2) * 2;
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 23: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20);
|
||
TIP += (m_Info.DEX - 20 - (m_Info.Level - 1) * 1) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20 - (m_Info.Level - 1) * 2) * 2;
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
|
||
case 24: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
TIP += (m_Info.STR - 20 - (int)((m_Info.Level - 1) * 1.5 + 0.5)) * 2;
|
||
TIP += (m_Info.DEX - 20 - (int)((m_Info.Level - 1) * 1.5)) * 2;
|
||
TIP += (m_Info.CON - 20);
|
||
TIP += (m_Info.INT - 20);
|
||
TIP += (m_Info.WIS - 20);
|
||
if(TIP > (10 + (m_Info.Level - 1) * 2))
|
||
return FALSE;
|
||
break;
|
||
}
|
||
|
||
/* if(m_Info.Class && (long)g_CharacterData.m_fWalkSpeed != 0 && (long)g_CharacterData.m_fRunSpeed != 0)
|
||
{
|
||
float fWalkSpeed, fRunSpeed;
|
||
float fSpeedFactor = 1.0f + ((m_Info.DEX + m_lAddDEX) - 20) * 0.005f;
|
||
if(fSpeedFactor > 2.0f) fSpeedFactor = 2.0f;
|
||
fWalkSpeed = 150.0f * fSpeedFactor;
|
||
fRunSpeed = 490.0f * fSpeedFactor;
|
||
|
||
// æƮ / <20><>æƮ <20><>ġ <20><><EFBFBD><EFBFBD>
|
||
for(unsigned long i = 0; i < 32; i++)
|
||
{
|
||
if(m_aryEnchantLevel[i])
|
||
{
|
||
switch(i)
|
||
{
|
||
case 16: // Stealth
|
||
fWalkSpeed = fWalkSpeed * (0.5f + m_aryEnchantLevel[i] / 20.0f);
|
||
fRunSpeed = fRunSpeed * (0.5f + m_aryEnchantLevel[i] / 20.0f);
|
||
break;
|
||
|
||
case 26: // Frozen
|
||
fWalkSpeed = fWalkSpeed / 2.0f;
|
||
fRunSpeed = fRunSpeed / 2.0f;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if((long)fWalkSpeed != (long)g_CharacterData.m_fWalkSpeed) return FALSE;
|
||
if((long)fRunSpeed != (long)g_CharacterData.m_fRunSpeed) return FALSE;
|
||
}*/
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void CCharStatus::Destroy()
|
||
{
|
||
int i, j, k;
|
||
|
||
for(k = 0; k < 3; k++)
|
||
{
|
||
for(j = 0; j < 6; j++)
|
||
{
|
||
for(i = 0; i < 6; i++)
|
||
{
|
||
m_aryInven[k][j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
}
|
||
|
||
for(k = 0; k < 4; k++)
|
||
{
|
||
for(j = 0; j < 12; j++)
|
||
{
|
||
for(i = 0; i < 8; i++)
|
||
{
|
||
m_aryDeposit[k][j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
}
|
||
|
||
for(j = 0; j < 4; j++)
|
||
{
|
||
for(i = 0; i < 8; i++)
|
||
{
|
||
m_aryExchange[j][i] = ITEM_EMPTY;
|
||
m_aryExchange2[j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
|
||
for(j = 0; j < 8; j++)
|
||
{
|
||
for(i = 0; i < 8; i++)
|
||
{
|
||
m_aryStreetTrade[j][i] = ITEM_EMPTY;
|
||
}
|
||
}
|
||
|
||
m_dwExchangeGold = 0;
|
||
m_dwExchange2Gold = 0;
|
||
|
||
m_dwDepositGold = 0;
|
||
m_cSavePass = 0;
|
||
m_dwMaxTab = 0;
|
||
m_dwDepositFlag = 0;
|
||
m_cUsedDeposit = 0;
|
||
|
||
for(i = 0; i < 32; i++)
|
||
{
|
||
m_aryEnchantLevel[i] = 0;
|
||
}
|
||
|
||
m_PartyInfo.m_cMemberNum = 0;
|
||
m_PartyInfo.m_dwPartyID = 0;
|
||
for(i = 0; i < 10; i++)
|
||
{
|
||
m_PartyInfo.MemberCID[i] = 0;
|
||
}
|
||
|
||
m_lPotionCoolDownTime = 0;
|
||
|
||
list<CItemInstance *>::iterator it;
|
||
CItemInstance *lpItem;
|
||
for(it = m_lstInventory.begin(); it != m_lstInventory.end();)
|
||
{
|
||
lpItem = (*it);
|
||
it = m_lstInventory.erase(it);
|
||
delete lpItem;
|
||
}
|
||
m_lstInventory.clear();
|
||
|
||
for(it = m_lstDeposit.begin(); it != m_lstDeposit.end();)
|
||
{
|
||
lpItem = (*it);
|
||
it = m_lstDeposit.erase(it);
|
||
delete lpItem;
|
||
}
|
||
m_lstDeposit.clear();
|
||
|
||
for(it = m_lstStreetTrade.begin(); it != m_lstStreetTrade.end();)
|
||
{
|
||
lpItem = (*it);
|
||
it = m_lstStreetTrade.erase(it);
|
||
delete lpItem;
|
||
}
|
||
m_lstStreetTrade.clear();
|
||
|
||
list<FriendInfo *>::iterator itFriend;
|
||
FriendInfo *lpFriend;
|
||
for(itFriend = m_lstFriendList.begin(); itFriend != m_lstFriendList.end();)
|
||
{
|
||
lpFriend = (*itFriend);
|
||
itFriend = m_lstFriendList.erase(itFriend);
|
||
delete lpFriend;
|
||
}
|
||
m_lstFriendList.clear();
|
||
|
||
list<BanInfo *>::iterator itBan;
|
||
BanInfo *lpBan;
|
||
for(itBan = m_lstBanList.begin(); itBan != m_lstBanList.end();)
|
||
{
|
||
lpBan = (*itBan);
|
||
itBan = m_lstBanList.erase(itBan);
|
||
delete lpBan;
|
||
}
|
||
m_lstBanList.clear();
|
||
|
||
for(i = 0; i < 32; i++)
|
||
{
|
||
m_aryEnchantLevel[i] = 0;
|
||
}
|
||
|
||
m_bUseChant = FALSE;
|
||
|
||
for(i = 0; i < 10; i++)
|
||
{
|
||
if(m_lstQuickSlot[i])
|
||
{
|
||
delete m_lstQuickSlot[i];
|
||
m_lstQuickSlot[i] = NULL;
|
||
}
|
||
}
|
||
m_lpQuickSelected = NULL;
|
||
for(i = 0; i < 20; i++)
|
||
{
|
||
if(m_lstSkillSlot[i])
|
||
{
|
||
delete m_lstSkillSlot[i];
|
||
m_lstSkillSlot[i] = NULL;
|
||
}
|
||
}
|
||
vector<CItemInstance *>::iterator itSkill;
|
||
for(itSkill = m_lstClassSkill.begin(); itSkill != m_lstClassSkill.end();)
|
||
{
|
||
lpItem = (*itSkill);
|
||
itSkill = m_lstClassSkill.erase(itSkill);
|
||
delete lpItem;
|
||
}
|
||
for(i = 0; i < 15; i++)
|
||
{
|
||
if(m_lstEquipment[i])
|
||
{
|
||
delete m_lstEquipment[i];
|
||
m_lstEquipment[i] = NULL;
|
||
}
|
||
}
|
||
|
||
if(m_lpUpgrade[0]) { delete m_lpUpgrade[0]; m_lpUpgrade[0] = NULL; }
|
||
if(m_lpUpgrade[1]) { delete m_lpUpgrade[1]; m_lpUpgrade[1] = NULL; }
|
||
}
|
||
|
||
void CCharStatus::PayDepositPrice(unsigned short wSrcPos, unsigned short wDstPos)
|
||
{
|
||
if(wDstPos == ClientSocket::ItemPos_Deposit)
|
||
{
|
||
if(wSrcPos != ClientSocket::ItemPos_Deposit)
|
||
{
|
||
m_Info.Gold -= (m_Info.Level * 20);
|
||
}
|
||
}
|
||
}
|
||
|
||
void CCharStatus::ChantDisable()
|
||
{
|
||
for(unsigned long i = 0; i < 20; i++)
|
||
{
|
||
if(g_ClientMain.m_csStatus.m_Skill.SSlot[i].SKILLINFO.wSkill)
|
||
{
|
||
const Skill::ProtoType *lpSkillProtoType = g_SkillMgr.GetSkillProtoType(g_ClientMain.m_csStatus.m_Skill.SSlot[i].SKILLINFO.wSkill);
|
||
|
||
if(lpSkillProtoType && lpSkillProtoType->m_cEndCoolDown)
|
||
{
|
||
g_ClientMain.SetSkillCoolDown(g_ClientMain.m_csStatus.m_Skill.SSlot[i].SKILLINFO.wSkill);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
BOOL CCharStatus::GetCorrectClass(unsigned long dwClassFlag)
|
||
{
|
||
if(dwClassFlag & (0x00000001 << (m_Info.Class - 1)))
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL QuestInstance::StartPhase(unsigned long dwPhase)
|
||
{
|
||
// Trigger_Start<72><74> ã<>Ƽ<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
|
||
m_lstTriggerCount.clear();
|
||
|
||
m_lpPhaseScript = m_lpQuestScript->GetPhase(dwPhase);
|
||
|
||
if(m_lpPhaseScript)
|
||
{
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
m_dwPresentPhase = dwPhase;
|
||
|
||
vector<LPTriggerNode>::iterator it;
|
||
for(it = m_lpPhaseScript->m_lstTrigger.begin(); it != m_lpPhaseScript->m_lstTrigger.end(); it++)
|
||
{
|
||
m_lstTriggerCount.push_back((*it)->m_dwMaxCount);
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL QuestInstance::StartTrigger(LPTriggerNode lpTrigger, BOOL bSuccess)
|
||
{
|
||
vector<LPEventNode>::iterator it;
|
||
if(bSuccess)
|
||
{
|
||
for(it = lpTrigger->m_lstEvent.begin(); it != lpTrigger->m_lstEvent.end(); it++)
|
||
{
|
||
switch((*it)->m_dwEventKind)
|
||
{
|
||
case EVENT_MSGBOX:
|
||
EventMsgBox((*it)->m_strWord);
|
||
break;
|
||
|
||
case EVENT_PHASE:
|
||
EventPhase((*it)->m_dwEventNumber);
|
||
break;
|
||
|
||
case EVENT_END:
|
||
return FALSE;
|
||
}
|
||
}
|
||
} else
|
||
{
|
||
for(it = lpTrigger->m_lstFalseEvent.begin(); it != lpTrigger->m_lstFalseEvent.end(); it++)
|
||
{
|
||
switch((*it)->m_dwEventKind)
|
||
{
|
||
case EVENT_MSGBOX:
|
||
EventMsgBox((*it)->m_strWord);
|
||
break;
|
||
|
||
case EVENT_PHASE:
|
||
EventPhase((*it)->m_dwEventNumber);
|
||
break;
|
||
|
||
case EVENT_END:
|
||
return FALSE;
|
||
}
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
LPQuestInstance CCharStatus::GetProcessQuest(unsigned short wQuestID)
|
||
{
|
||
list<LPQuestInstance>::iterator it;
|
||
for(it = m_lstQuest.begin(); it != m_lstQuest.end(); it++)
|
||
{
|
||
if((unsigned short)(*it)->m_dwQuestID == wQuestID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
BOOL QuestInstance::EventMsgBox(char *strWord)
|
||
{
|
||
CGUIMessageBox *lpMessageBox = new CGUIMessageBox;
|
||
lpMessageBox->Create(strWord);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL QuestInstance::EventPhase(unsigned long dwPhase)
|
||
{
|
||
StartPhase(dwPhase);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
LPTriggerNode CCharStatus::GetTriggertoTalk(LPQuestInstance &lpQuest, unsigned long *dwCount, unsigned long dwChrID)
|
||
{
|
||
list<LPQuestInstance>::iterator itQuest;
|
||
unsigned long dwTriggerCount;
|
||
for(itQuest = m_lstQuest.begin(); itQuest != m_lstQuest.end(); itQuest++)
|
||
{
|
||
for(dwTriggerCount = 0; dwTriggerCount < (*itQuest)->m_lpPhaseScript->m_lstTrigger.size(); dwTriggerCount++)
|
||
{
|
||
if((*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount]->m_dwTriggerKind == TRIGGER_TALK &&
|
||
(*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount]->m_dwTriggerID == dwChrID)
|
||
{
|
||
*dwCount = dwTriggerCount;
|
||
lpQuest = (*itQuest);
|
||
|
||
return (*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount];
|
||
}
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
static BOOL GetInSphere(vector3 vecCenter, float fRadius, vector3 vecPos)
|
||
{
|
||
vector3 vecRay = vecPos - vecCenter;
|
||
if(vecRay.GetLens() <= fRadius) return TRUE;
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
LPTriggerNode CCharStatus::GetTriggertoGeton(LPQuestInstance lpQuest, unsigned long *dwCount, vector3 vecPos)
|
||
{
|
||
list<LPQuestInstance>::iterator itQuest;
|
||
unsigned long dwTriggerCount;
|
||
vector3 vecCenter;
|
||
for(itQuest = m_lstQuest.begin(); itQuest != m_lstQuest.end(); itQuest++)
|
||
{
|
||
for(dwTriggerCount = 0; dwTriggerCount < (*itQuest)->m_lpPhaseScript->m_lstTrigger.size(); dwTriggerCount++)
|
||
{
|
||
if((*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount]->m_dwTriggerKind == TRIGGER_GETON)
|
||
{
|
||
vecCenter.x = (*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount]->m_fPosX;
|
||
vecCenter.y = (*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount]->m_fPosY;
|
||
vecCenter.z = (*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount]->m_fPosZ;
|
||
if(GetInSphere(vecCenter, (*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount]->m_fDistance, vecPos))
|
||
{
|
||
*dwCount = dwTriggerCount;
|
||
lpQuest = (*itQuest);
|
||
|
||
return (*itQuest)->m_lpPhaseScript->m_lstTrigger[dwTriggerCount];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
BOOL CCharStatus::AddFriend(unsigned long dwChrID, char *strName)
|
||
{
|
||
if(!GetIsFriend(dwChrID))
|
||
{
|
||
FriendInfo *lpFriend = new FriendInfo;
|
||
lpFriend->m_dwCID = dwChrID;
|
||
strcpy(lpFriend->m_szName, strName);
|
||
lpFriend->SetLoginStatus(true);
|
||
g_ClientMain.m_csStatus.m_lstFriendList.push_back(lpFriend);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::AddBan(unsigned long dwChrID, char *strName)
|
||
{
|
||
if(!GetIsBan(dwChrID))
|
||
{
|
||
BanInfo *lpBan = new BanInfo;
|
||
lpBan->m_dwCID = dwChrID;
|
||
strcpy(lpBan->m_szName, strName);
|
||
g_ClientMain.m_csStatus.m_lstBanList.push_back(lpBan);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::DeleteFriend(unsigned long dwChrID)
|
||
{
|
||
list<FriendInfo *>::iterator it;
|
||
for(it = m_lstFriendList.begin(); it != m_lstFriendList.end(); it++)
|
||
{
|
||
if((*it)->m_dwCID == dwChrID)
|
||
{
|
||
FriendInfo *lpFriend = (*it);
|
||
m_lstFriendList.erase(it);
|
||
delete lpFriend;
|
||
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::DeleteBan(unsigned long dwChrID)
|
||
{
|
||
list<BanInfo *>::iterator it;
|
||
for(it = m_lstBanList.begin(); it != m_lstBanList.end(); it++)
|
||
{
|
||
if((*it)->m_dwCID == dwChrID)
|
||
{
|
||
BanInfo *lpBan = (*it);
|
||
m_lstBanList.erase(it);
|
||
delete lpBan;
|
||
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::GetIsFriend(unsigned long dwChrID)
|
||
{
|
||
list<FriendInfo *>::iterator it;
|
||
for(it = m_lstFriendList.begin(); it != m_lstFriendList.end(); it++)
|
||
{
|
||
if((*it)->m_dwCID == dwChrID) return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL CCharStatus::GetIsBan(unsigned long dwChrID)
|
||
{
|
||
list<BanInfo *>::iterator it;
|
||
for(it = m_lstBanList.begin(); it != m_lstBanList.end(); it++)
|
||
{
|
||
if((*it)->m_dwCID == dwChrID) return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
FriendInfo *CCharStatus::GetFriend(unsigned long dwChrID)
|
||
{
|
||
list<FriendInfo *>::iterator it;
|
||
for(it = m_lstFriendList.begin(); it != m_lstFriendList.end(); it++)
|
||
{
|
||
if((*it)->m_dwCID == dwChrID) return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
FriendInfo *CCharStatus::GetFriendtoNum(unsigned long dwNum)
|
||
{
|
||
list<FriendInfo *>::iterator it;
|
||
unsigned long dwCount;
|
||
for(it = m_lstFriendList.begin(), dwCount = 0; it != m_lstFriendList.end(); it++, dwCount++)
|
||
{
|
||
if(dwCount < dwNum) continue;
|
||
|
||
return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
BanInfo *CCharStatus::GetBantoNum(unsigned long dwNum)
|
||
{
|
||
list<BanInfo *>::iterator it;
|
||
unsigned long dwCount;
|
||
for(it = m_lstBanList.begin(), dwCount = 0; it != m_lstBanList.end(); it++, dwCount++)
|
||
{
|
||
if(dwCount < dwNum) continue;
|
||
|
||
return (*it);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
BOOL CCharStatus::DeleteQuest(LPQuestInstance lpDeleteQuest)
|
||
{
|
||
list<LPQuestInstance>::iterator it;
|
||
for(it = m_lstQuest.begin(); it != m_lstQuest.end(); it++)
|
||
{
|
||
if((*it) == lpDeleteQuest)
|
||
{
|
||
LPQuestInstance lpDelete = (*it);
|
||
it = m_lstQuest.erase(it);
|
||
delete lpDelete;
|
||
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
unsigned short CCharStatus::GetSkillIDbyChantID(unsigned char cChant)
|
||
{
|
||
unsigned short wSkill;
|
||
|
||
vector<CItemInstance *>::iterator it;
|
||
for(it = m_lstClassSkill.begin(); it != m_lstClassSkill.end(); it++)
|
||
{
|
||
wSkill = (*it)->GetSkillIDbyChantID(cChant);
|
||
if(wSkill)
|
||
{
|
||
return wSkill;
|
||
}
|
||
}
|
||
|
||
for(int i = 0; i < 20; i++)
|
||
{
|
||
if(g_ClientMain.m_csStatus.m_lstSkillSlot[i])
|
||
{
|
||
wSkill = g_ClientMain.m_csStatus.m_lstSkillSlot[i]->GetSkillIDbyChantID(cChant);
|
||
if(wSkill)
|
||
{
|
||
return wSkill;
|
||
}
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
void CCharStatus::SetClassSkill(void)
|
||
{
|
||
unsigned short wClassSkill[20];
|
||
unsigned char cSkillNum;
|
||
|
||
vector<CItemInstance *>::iterator itSkill;
|
||
CItemInstance *lpSkill;
|
||
for(itSkill = m_lstClassSkill.begin(); itSkill != m_lstClassSkill.end();)
|
||
{
|
||
lpSkill = (*itSkill);
|
||
itSkill = m_lstClassSkill.erase(itSkill);
|
||
delete lpSkill;
|
||
}
|
||
m_lstClassSkill.clear();
|
||
|
||
g_SkillMgr.GetClassSkill(m_Info.Class, wClassSkill, &cSkillNum);
|
||
|
||
if(cSkillNum)
|
||
{
|
||
unsigned long i;
|
||
for(i = 0; i < cSkillNum; i++)
|
||
{
|
||
if(wClassSkill[i])
|
||
{
|
||
CItemInstance *lpClassSkill = new CItemInstance;
|
||
lpClassSkill->SetSkillInfo(wClassSkill[i], 0, 1, ClientSocket::ItemPos_SSlot, m_lstClassSkill.size(), 0);
|
||
m_lstClassSkill.push_back(lpClassSkill);
|
||
}
|
||
}
|
||
}
|
||
} |