📄 user.cpp
字号:
// USER.cpp: implementation of the USER class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Server.h"
#include "USER.h"
#include "COM.h"
#include "CircularBuffer.h"
#include "BufferEx.h"
#include "Item.h"
#include "Hyper.h"
#include "Mcommon.h"
#include "Search.h"
#include "ServerDlg.h"
#include "Mcommon.h"
#include "UserManager.h"
#include "UNI_CHAR.h"
#include "RoyalRumble.h"
#include "EventZone.h"
#include "SharedQueue.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "Extern.h" // 寇何函荐 急攫
extern CUserManager *g_pUQM;
extern CSearch *g_pUserList;
extern CServerDlg *g_pMainDlg;
// zinee 02/11/26 for Mail Agent
extern CSharedQueue g_MailAgentQueue;
//extern CRITICAL_SECTION m_CS_ReceiveData[];
extern CRITICAL_SECTION m_CS_FileWrite;
extern CRITICAL_SECTION m_CS_EventItemLogFileWrite;
extern CPtrList RecvPtrList[];
extern long nRecvDataLength[];
// IKING 2002.1.
extern CRITICAL_SECTION m_CS_LoginData;
extern CPtrList RecvLoginData;
extern long nLoginDataCount;
extern CRITICAL_SECTION m_CS_LogoutData;
extern CPtrList RecvLogoutData;
extern long nLogoutDataCount;
extern CPtrList RecvSqlData;
extern CRITICAL_SECTION m_CS_SqlData;
extern long nSqlDataCount;
extern int g_ChatEnable[];
extern CHATDATAPACKET *g_WaitRecvDataChat[DATA_BUF_SIZE_FOR_THREAD+1][AUTOMATA_THREAD+1];
extern int g_nChatDataHead[];
extern int g_nChatDataTail[];
extern BYTE g_ServerId;
extern TCHAR g_arServerIPAddr[16];
extern CString g_strARKRRWinner;
extern DWORD g_ThreadErr[];
extern CEventZone g_QuestEventZone;
extern long g_PotionViewOnOff;
//
/// 鞠龋拳 包访
// 霸烙 付促 促福霸...
//T_KEY private_key = 0x1234567890123456;
//T_KEY private_key = 0x4584263589548694;
T_KEY private_key = 0xd9b4f1a524657845;
//////////////////////////////////////////////////////////////////////
// 傈开函荐
//
int g_8x[] = {-2, -1, 0, 1, 2, 1, 0, -1};
int g_8y[] = {0, -1, -2, -1, 0, 1, 2, 1};
int g_16x[] = {-4, -3, -2, -1, 0, 1, 2, 3, 4, 3, 2, 1, 0, -1, -2, -3};
int g_16y[] = {0, -1, -2, -3, -4, -3, -2, -1, 0, 1, 2, 3, 4, 3, 2, 1};
POINT g_rPt[8][6] =
{
{{-1, -1}, {0, -1}, {-1, 0}, {0, 0}, {100, 100}, {100, 100}},
{{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {0, 0}, {1, 0}},
{{0, -1}, {1, -1}, {0, 0}, {1, 0}, {100, 100}, {100, 100}},
{{-1, -1}, {0, -1}, {-1, 0}, {0, 0}, {-1, 1}, {0, 1}},
{{0, -1}, {1, -1}, {0, 0}, {1, 0}, {0, 1}, {1, 1}},
{{-1, 0}, {0, 0}, {-1, 1}, {0, 1}, {100, 100}, {100, 100}},
{{-1, 0}, {0, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}},
{{0, 0}, {1, 0,}, {0, 1}, {1, 1}, {100, 100}, {100, 100}},
};
short g_sHPConst[CLASS_NUM] = {6, 3, 4, 4}; // 拜捧, 瘤莆捞, 档八, 醚扁
short g_sPPConst[CLASS_NUM] = {1, 5, 3, 5};
short g_sSPConst[CLASS_NUM] = {2, 2, 2, 2};
short g_sHPLV[CLASS_NUM] = {5, 3, 4, 3};
short g_sPPLV[CLASS_NUM] = {1, 4, 2, 3};
short g_sSPLV[CLASS_NUM] = {1, 1, 1, 1};
short g_sHPAdd[CLASS_NUM] = {10, 30, 40, 35};
short g_sPPAdd[CLASS_NUM] = {20, 10, 20, 20};
short g_sSPAdd[CLASS_NUM] = {20, 25, 35, 25};
int g_iAccessoriSlot[MAX_ACCESSORI] = {2, 3, 6, 7};
extern short g_sHPConst[CLASS_NUM];
extern short g_sPPConst[CLASS_NUM];
extern short g_sSPConst[CLASS_NUM];
extern short g_sHPLV[CLASS_NUM];
extern short g_sPPLV[CLASS_NUM];
extern short g_sSPLV[CLASS_NUM];
extern short g_sHPAdd[CLASS_NUM];
extern short g_sPPAdd[CLASS_NUM];
extern short g_sSPAdd[CLASS_NUM];
extern CRoyalRumble g_RR;
//////////////////////////////////////////////////////////////////////
// 秦寸 拌凯俊辑 荤侩且荐乐绰 公扁拌凯 辆幅(酒捞袍 抛捞喉 辆幅)
//
int g_BrawlClass[] = {8,9,10,11,12,13,14,15};
int g_StaffClass[] = {4,5,6,7,12,13,14,15};
int g_EdgedClass[] = {2,3,6,7,10,11,14,15};
int g_FireArmsClass[] = {1,3,5,7,9,11,13,15};
///////////////////////////////////////////////////////////////////////
// 概流窍绊 胶懦捞 辑肺 概莫捞 救登绢辑 概流加己阑 胶懦扁霖栏肺 牧滚飘茄促.
// 拜捧 瘤莆捞 档八 醚扁 公拌凯
BYTE g_DynamicSkillInfo[MAX_SKILL_MAGIC_NUM] = { 8,7,6,9, 0, 13,12,10,11, 0, 16,15,14,17, 0, 21,19,18,20, 0, 0,0,0 };
BOOL g_bDebug = FALSE;
int g_CityRank[5][3] = // 殿鞭窍遏矫 皑家荐摹
{
{{2200}, {2950}, {3800}},
{{1600}, {2300}, {3800}},
{{600}, {870}, {2700}},
{{333}, {870}, {2600}},
{{333}, {870}, {2600}},
};
// 阿 殿鞭寸 穿利 鞘夸荐摹
int g_CityRankValue[] = {-39413, -26242, -11899, -2112, -332, 0, 500, 4000, 26300, 53900, 94000};
//林冈 瘤莆捞 档八 醚扁
int g_ClassWeight[] = {150, 100, 150, 130}; // 阿 拌凯喊 扁夯 公霸
int g_ItemAttUpgrade[] = {10000, 8000, 7000, 6000, 5000, 2000, 1000, 500, 100, 50};//酒捞袍 诀弊饭捞靛 犬伏
int g_ItemDefUpgrade[] = {10000, 8000, 7000, 6000, 5000, 2000, 1000, 500, 100, 50};
int g_ItemAccessoriUpgrade[] = {7000, 5500, 4500};
int g_ItemBlessingUpgrade[] = {5000, 8500, 10000};
int g_ItemNormalDownUpgrade[] = {5000, 1000};
//////////////////////////////////////////////////////////////////////////////////////////////////////
// 秦寸 鸥涝俊 措茄 惑怕捞惑 矫埃 沥焊甫 努府绢 茄促.
//
void USER::ClearAbnormalTime(DWORD dwType)
{
DWORD dwCurrTime = GetTickCount();
switch(dwType)
{
case ABNORMAL_TIME:
m_tAbnormalKind = ABNORMAL_BYTE_NONE;
m_dwAbnormalTime = 0;
m_dwLastAbnormalTime = dwCurrTime;
ClearAbnormalGroup(ABNORMAL_CLEAR_STATUS);
break;
case PSI_ONE_TIME:
m_dwLastHasteTime = dwCurrTime; // 付瘤阜栏肺 庆捞胶飘啊 吧赴矫埃
m_dwLastShieldTime = dwCurrTime; // 付瘤阜栏肺 蒋靛甫 敬 矫埃
m_dwLastDexUpTime = dwCurrTime; // 付瘤阜栏肺 DEX UP 阑 敬 矫埃
m_dwLastMaxHPUpTime = dwCurrTime; // 付瘤阜栏肺 MAX HP UP 阑 敬 矫埃
m_dwLastFastRunTime = dwCurrTime; // 付瘤阜栏肺 菩胶飘繁阑 敬 矫埃
m_dwLastMindShockTime = dwCurrTime; // 付瘤阜栏肺 付牢靛 碱农甫 敬 矫埃
m_dwLastPsiShieldTime = dwCurrTime; // 付瘤阜栏肺 荤捞坷葱蒋靛甫 敬矫埃
m_dwLastPiercingShieldTime = dwCurrTime; // 付瘤阜栏肺 乔绢教蒋靛甫 敬 矫埃
m_dwLastBigShieldTime = dwCurrTime;
m_dwHasteTime = 0; // Haste
m_dwShieldTime = 0; // Shield
m_dwDexUpTime = 0; // Dex Up
m_dwMaxHPUpTime = 0; // Max HP Up
m_dwFastRunTime = 0; // Fast Run
m_dwMindShockTime = 0; // Mind Shock
m_dwPsiShieldTime = 0; // Psionic Shield
m_dwPiercingShieldTime = 0; // Piercing Shield
m_dwBigShieldTime = 0;
ClearAbnormalGroup(ABNORMAL_CLEAR_PSI_ONE);
if(m_bNecklaceOfShield) AddAbnormalInfo(ABNORMAL_SHIELD); // 荐龋狼 格吧捞
break;
case PSI_TWO_TIME:
m_dwLastAdamantineTime = dwCurrTime; // 付瘤阜栏肺 Adamantine阑 敬 矫埃
m_dwLastMightyWeaponTime= dwCurrTime; // 付瘤阜栏肺 MightyWeapon阑 敬 矫埃
m_dwLastBerserkerTime = dwCurrTime; // 付瘤阜栏肺 Berserker甫 敬 矫埃
m_dwAdamantineTime = 0; // Adamantine
m_dwMightyWeaponTime = 0; // Mighty Weapon
m_dwBerserkerTime = 0; // Berserker
ClearAbnormalGroup(ABNORMAL_CLEAR_PSI_TWO);
break;
case PSI_THREE_TIME:
m_dwLastMindGuardTime = dwCurrTime; // 付瘤阜栏肺 Mind Guard 甫 敬矫埃
m_dwMindGuardTime = 0; // Mind Guard
ClearAbnormalGroup(ABNORMAL_CLEAR_PSI_THREE);
break;
}
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction ...
//
USER::USER()
{
m_pCB = new CCircularBuffer(20000); // Socket俊辑 Data甫 罐酒辑 阶酒滴绰 滚欺
m_pCBCore = new CCircularBuffer(20000); // Socket俊辑 罐篮 Data吝俊 蜡瓤茄 菩哦阑 榜扼郴绢 历厘窍绰 滚欺
m_pSharedMemory = NULL;
m_pMD = NULL;
// IKING 2002.1.
m_server = 0;
m_dwLastDownExp = 0;
m_bPseudoString = FALSE;//yskang 0.1 龋莫[局莫]捞 啊楼牢瘤 柳楼牢瘤 备盒^^
m_nGuildUserInfoType = 0x00;//yskang 0.2
ZeroMemory(m_strLoveName,sizeof(m_strLoveName));
InitializeCriticalSection(&m_CS_ExchangeItem);
InitializeCriticalSection(&m_CS_ShopItem);
}
USER::~USER()
{
int i = 0;
EnterCriticalSection( &m_CS_ExchangeItem );
for(i = 0; i < m_arExchangeItem.GetSize(); i++)
{
if( m_arExchangeItem[i] )
{
delete m_arExchangeItem[i];
m_arExchangeItem[i] = NULL;
}
}
m_arExchangeItem.RemoveAll();
LeaveCriticalSection( &m_CS_ExchangeItem );
EnterCriticalSection( &m_CS_ShopItem );
for(i = 0; i < m_arShopItem.GetSize(); i++)
{
if( m_arShopItem[i] )
{
delete m_arShopItem[i];
m_arShopItem[i] = NULL;
}
}
m_arShopItem.RemoveAll();
LeaveCriticalSection( &m_CS_ShopItem );
if(m_pCB) delete m_pCB;
if(m_pCBCore) delete m_pCBCore;
DeleteCriticalSection(&m_CS_ExchangeItem);
DeleteCriticalSection(&m_CS_ShopItem);
}
int USER::Init( int bufCreateFlag )
{
CBSocket::Init(bufCreateFlag);
m_ConnectionSuccessTick = 0;
if ( m_Sid == -1 )
{
m_Sid = 0;
m_iModSid = AUTOMATA_THREAD;
m_uid = m_Sid;
}
else
{
m_iModSid = m_Sid % AUTOMATA_THREAD;
m_uid = m_Sid;
}
m_isCryptionFlag = 0;
m_Recv_value = 0;
m_Send_value = 0;
m_public_key = 0;
SetPublicKey();
m_cryptfn.SetPublicKey( m_public_key );
m_cryptfn.SetPrivateKey(private_key);
// 辑摹 备炼 檬扁拳 窍扁...
if ( m_uid >= 0 )
g_pUserList->SetUserUid( m_uid,this );
m_Recv_value = 0;
m_UserStatus = USER_JUST_CONNECTED;
m_pCom = g_pMainDlg->GetCOM();
m_UserFlag = FALSE;
InitUser();
m_ConnectionSuccessTick = GetTickCount();
// 粮 change IP, Port...
m_strZoneIP = "";
m_nZonePort = -1;
return 1;
}
BOOL USER::InitUser()
{
// Compress Init
memset( m_CompBuf, NULL, 10240 ); // 拘绵且 单捞磐甫 葛栏绰 滚欺
m_iCompIndex = 0; // 拘绵且 单捞磐狼 辨捞
m_CompCount = 0; // 拘绵且 单捞磐狼 俺荐
// Memory DB Data Init
m_pSharedMemory = NULL;
m_pMD = NULL;
// Speed Hack Check 函荐 檬扁拳
m_iTickCount = 0;
m_dwServerTickBasic = 0;
m_dwServerTick = 0;
m_dwClientTick = 0;
m_ZoneIndex = 0;
m_bWhisper = TRUE; // 庇富 倾侩
m_bLive = USER_DEAD; // Live Or Dead
m_NowZoneChanging = FALSE; // 粮 眉牢瘤且锭 TRUE;
m_bBuddyMode = FALSE; // Buddy Off
// m_bTradeMode = FALSE; // Trade Off
m_bTradeWaiting = FALSE; // Trade 夸没饶 搬苞甫 扁促府绰 吝
m_bNowTrading = FALSE; // 泅犁 芭贰吝
m_bExchangeOk = FALSE; // Exchange 铰倡
m_bTradeItem = FALSE; // Item阑 棵妨初澜(X)
m_iTradeUid = -1;
m_bPShopOpen = FALSE; // Personal shop open or closed
m_bPShopView = FALSE; // Personal shop being viewed
m_iPShopViewuid = -1; // Personal shop view uid
m_bViewingAShop = FALSE; // User viewing a personal shop
m_bNoItemMove = FALSE;
m_bRefuse = FALSE; // 扁夯 可记篮 酒捞袍 罐扁
m_iMaxWeight = 0; // 甸荐乐绰 公霸
m_iCurWeight = 0;
m_dwGuild = -1; // 辨靛 牢郸胶
m_sGuildVersion = -1; // 辨靛 巩剧 滚怜
m_bGuildMaster = FALSE; // 辨靛 付胶磐
m_bRepresentationGuild = FALSE; // 鼻茄 措青 咯何
::ZeroMemory(m_strGuildName, sizeof(m_strGuildName)); // 辨靛 捞抚
m_bFieldWarApply = FALSE;
m_FieldWarGMUid = 0; // 鞘靛傈老锭 惑措规 辨付 uid
m_dwFieldWar = 0; // 鞘靛傈 矫累捞搁 惑措祈 辨靛 锅龋啊 甸绢柯促.
::ZeroMemory(m_strChar, sizeof(m_strChar));
::ZeroMemory(m_strTradeUser, sizeof(m_strTradeUser));
::ZeroMemory(m_PersonalShopName, sizeof(m_PersonalShopName));
m_sTempSTR = 0;
m_sTempCON = 0;
m_sTempDEX = 0;
m_sTempINT = 0;
m_sTempVOL = 0;
m_sTempWIS = 0;
m_tTempClass = 255;
m_nHavePsiNum = 0; // 焊蜡 荤捞坷葱 荐
m_tDir = 0; // 蜡历啊 焊绊 乐绰 规氢
m_tIsOP = 0; // 款康磊牢瘤 魄窜
m_bLogOut = FALSE; // Logout 吝牢啊 魄窜
m_bZoneLogOut = FALSE;
int i = 0; // 馆拜胶懦 贸府甫 困秦 檬扁拳
for(i = 0; i < COUNTERATTACK_MAX_NUM; i++)
{
m_CounterAttackList[i].iDamage = 0;
m_CounterAttackList[i].iNpcUid = -1;
m_CounterAttackList[i].lSid = 0;
m_CounterAttackList[i].dwLastAttackTime = GetTickCount();
}
for(i = 0; i < TOTAL_ITEM_NUM; i++) // 芭贰吝 牢亥俊 官差绰 酒捞袍 荐甫 眉农困秦
{
m_TradeItemNum[i].sSid = -1;
m_TradeItemNum[i].sNum = 0;
}
for(i = 0; i < TOTAL_ITEM_NUM; i++) // 酒捞袍 浇吩甫 檬扁拳
{
m_UserItem[i].sLevel = 0; // 捞 酒捞袍阑 荤侩且荐 乐绰 饭骇
m_UserItem[i].sSid = -1;
m_UserItem[i].sCount = 0;
m_UserItem[i].sBullNum = 0;
m_UserItem[i].sDuration = -1;
m_UserItem[i].tIQ = 0;
for(int j = 0; j < MAGIC_NUM; j++) m_UserItem[i].tMagic[j] = 0;
m_UserItem[i].iItemSerial = 0;
}
m_bMakeBuddy = FALSE; // 炉牢瘤 眉农
m_bNowBuddy = FALSE; // 泅犁 滚叼吝牢瘤
for(i = 0; i < MAX_BUDDY_USER_NUM; i++)
{
m_MyBuddy[i].uid = -1;
::ZeroMemory(m_MyBuddy[i].m_strUserID, sizeof(m_MyBuddy[i].m_strUserID));
}
for(i = 0; i < MAX_GUILD_USER; i++)
{
m_MyGuildUser[i].sLevel = 0; // 立加吝牢 辨靛盔
::ZeroMemory(m_MyGuildUser[i].GuildUser, sizeof(m_MyGuildUser[i].GuildUser));
}
for(i = 0; i < MAGIC_COUNT; i++) // 概流 浇吩阑 檬扁拳
{
m_DynamicUserData[i] = 0;
}
for(i = 0; i < EBODY_MAGIC_COUNT; i++) // EBody 概流 浇吩 檬扁拳
{
m_DynamicEBodyData[i] = 0;
}
InitTelList(m_strTeleport);
InitEventSlot();
// m_bLive = USER_LIVE;
m_nCharNum = 0;
DWORD dwCurrTime = GetTickCount();
m_dwLastSpeedTime = dwCurrTime;
m_dwLastMoveAndRun = dwCurrTime;
m_dwLastAttackTime = dwCurrTime;
m_dwLastPsiAttack = dwCurrTime;
m_dwCastDelay = 0;
m_dwLastTimeCount = dwCurrTime;
m_dwLastAbnormalTime = dwCurrTime;
m_dwLastHPTime = dwCurrTime;
m_dwLastPsiDamagedTime = 0;
m_dwLastHasteTime = dwCurrTime;
m_dwLastShieldTime = dwCurrTime;
m_dwLastDexUpTime = dwCurrTime;
m_dwLastMaxHPUpTime = dwCurrTime;
m_dwLastBigShieldTime = dwCurrTime;
m_dwLastFastRunTime = dwCurrTime;
m_dwLastMindShockTime = dwCurrTime;
m_dwLastMindGuardTime = dwCurrTime;
m_dwLastPsiShieldTime = dwCurrTime;
m_dwLastPiercingShieldTime = dwCurrTime;
m_dwLastUpdateTime = dwCurrTime; //
m_dwLastSaveTime = dwCurrTime;
m_lRequireNum = 0;
m_tAbnormalKind = 0;
m_dwAbnormalTime = 0;
m_dwHasteTime = 0;
m_dwShieldTime = 0;
m_dwDexUpTime = 0;
m_dwMaxHPUpTime = 0;
m_dwAdamantineTime = 0;
m_dwMightyWeaponTime= 0;
m_dwBerserkerTime = 0;
m_dwFastRunTime = 0;
m_dwMindShockTime = 0;
m_dwMindGuardTime = 0;
m_dwPsiShieldTime = 0;
m_dwPiercingShieldTime = 0;
m_dwBigShieldTime = 0;
m_dwLastHiExpTime = dwCurrTime;
m_dwLastMagicFindTime = dwCurrTime;
m_dwLastNoChatTime = dwCurrTime;
m_dwHiExpTime = 0; // 版氰摹 2硅
m_dwMagicFindTime = 0; // 概流蛮胶 5硅
m_dwNoChatTime = 0; // 盲陛
m_dwNoDamageTime = 0;
m_dwLastNoDamageTime = dwCurrTime;
m_dwAbnormalInfo = ABNORMAL_NONE;
m_state = STATE_DISCONNECTED;
m_ItemFieldInfoCount = 0;
memset( m_ItemFieldInfoBuf, NULL, 8192 );
m_ItemFieldInfoIndex = 0;
InitUserItem();
InitGuildItem(); // 函荐甫 柄昌捞 技殴茄促.
InitAccountBankItem(); // 函荐甫 柄昌捞 技殴茄促.
m_bPkStatus = FALSE; // 泪矫悼救 墨坷惑怕牢瘤甫 汲沥
m_dwPkStatusTime = 0; // 墨坷己氢老锭 瘤加 矫埃甫 魄沥
m_iCityValue = 0; // 泅犁 穿利 己氢蔼
m_sCityRank = 0; // 矫刮 殿鞭
m_sKillCount = 0; // PK穿利 冉荐
m_sMagicSTR = 0; // 概流加己苞 E_Boady蔼俊狼茄 函拳等蔼
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -