📄 npc.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////
// NPC.cpp : implementation file
//
//
// - NPC Status Diagram 累己 [碍辆龋]
//
////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "NPC.h"
#include "DBSocket.h"
#include "CUdpSocket.h"
#include "MapServerSocket.h"
#include "ServerMem.h"
#include "CLog.h"
#include "QuestEngine.h"
#ifdef DEF_AZIT
#include "AzitManager.h"
#include "Azit.h"
#endif
////////////////////////////////////////////////////////////////////////////////////////
// Global Class
////////////////////////////////////////////////////////////////////////////////////////
extern CQuestEngine *g_pQuestEngine; // Quest Engine
extern MapServerSocket *g_pServer; // Map Server
extern BaseData g_Base; // Data Base 包访
extern Map *g_pMap; // MAP 包府 (User捞悼)
extern _LPDBSOCK g_lpDBSock; // World Server傈价侩
extern _LPUDPSOCKET g_lpUdpSock; // Wrod Server傈价侩
extern _LPCLOGMANAGER g_lpLog ;
extern ServerMem *g_pServerMem;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
//
////////////////////////////////////////////////////////////////////////////////////////
NPC::NPC()
{
m_pNPCList = new _ZP_NPCLIST_REP;
m_pAttackSkill = new CEnchant;
// memset( m_pNPCList, 0x0, sizeof( _ZP_NPCLIST_REP ) );
m_pAssistSkill = NULL;
m_pOnKillSkill = NULL;
m_pOnAttackSkill= NULL;
m_pTimeSkill = NULL;
m_pCurseSkill = NULL ;
Clear_NPC();
m_pDropItem = NULL;
m_bPoolUse = false;
}
NPC::~NPC()
{
// --------------------------------------------------------------------------------
// NPC LIST包访 Memory Free
// --------------------------------------------------------------------------------
if( m_pNPCList )
delete m_pNPCList;
// --------------------------------------------------------------------------------
// NPC Skill Delete
// --------------------------------------------------------------------------------
if( m_pAttackSkill ) // ATTACK SKILL Memory Free
delete m_pAttackSkill;
if( m_pAssistSkill )
delete m_pAssistSkill;
if( m_pOnKillSkill )
delete m_pOnKillSkill;
if( m_pOnAttackSkill)
delete m_pOnAttackSkill;
if( m_pTimeSkill )
delete m_pTimeSkill;
if( m_pCurseSkill )
delete m_pCurseSkill;
// --------------------------------------------------------------------------------
// Drop Item Memory Free
// --------------------------------------------------------------------------------
if( m_pDropItem )
delete m_pDropItem;
}
////////////////////////////////////////////////////////////////////////////////////////
// 眠饶 颇扼固磐 函荐甫 眠啊 矫糯
//
// - MAP俊 NPC殿废 流立 殿废 矫糯
// - MAP Class俊 眠饶 烹钦窍档废 累诀
////////////////////////////////////////////////////////////////////////////////////////
NPC::NPC( _NPC_ *pNPC )
{
// --------------------------------------------------------------------------------
// 荤侩 函荐 檬扁拳
// --------------------------------------------------------------------------------
m_pNPCList = new _ZP_NPCLIST_REP;
m_pAttackSkill = new CEnchant;
m_pAssistSkill = NULL;
m_pOnKillSkill = NULL;
m_pOnAttackSkill= NULL;
m_pTimeSkill = NULL;
m_pCurseSkill = NULL;
m_pDropItem = NULL;
// memset( m_pNPCList, 0x0, sizeof( _ZP_NPCLIST_REP ) );
Clear_NPC();
// --------------------------------------------------------------------------------
// NPC甫 积己 矫糯
// --------------------------------------------------------------------------------
m_dwHandle = g_pMap->CreateTempHandle(); // 货肺款 NPC Handle 蔼阑 掘澜
m_nMapLayer = pNPC->nMapLayer; // NPC困摹 Map Array
m_dwDBSEQ = pNPC->nIndex; // DB SEQ蔼 檬扁拳
// --------------------------------------------------------------------------------
// 积己俊 角菩茄 坷幅 贸府 风凭阑 梅啊矫糯
// --------------------------------------------------------------------------------
if( !SetBaseNPC( m_dwDBSEQ ) ) // NPC 扁夯单捞鸥 涝仿
{
ErrorMsg( "(X) Map Index=%d, Monster Index=%d,m_dwDBSEQ (%d)",pNPC->nMapLayer, pNPC->nIndex,m_dwDBSEQ );
delete this;
return;
}
// --------------------------------------------------------------------------------
// 檬扁 矫累 蔼阑 且寸 矫糯
// --------------------------------------------------------------------------------
m_nTurnNum = abs(m_dwHandle % MAX_NPCTURN_NUM);// NPC悼累 Turn
m_nCounterTurnNum = (m_nTurnNum + MAX_NPCTURN_NUM /2) % MAX_NPCTURN_NUM ;
m_StartPoint = pNPC->StartPoint; // 檬扁 困摹 蔼 历厘
m_pNPCList->wRotation = pNPC->nRotation; // NPC雀傈 阿档
m_Tile.x = (WORD)m_StartPoint.x / 100; // NPC困摹 Tile
m_Tile.y = (WORD)m_StartPoint.y / 100;
m_MoveFrom = m_StartPoint; // 捞悼 矫累 困摹 檬扁拳
m_MoveTo = m_StartPoint; // 捞悼 格利 困摹 檬扁拳
// --------------------------------------------------------------------------------
// NPC狼 檬扁 惑怕
// --------------------------------------------------------------------------------
// 檬扁 蔼阑 ROMMING 惑怕肺 函版矫糯
if( IsMonster() )
{
if( pNPC->nStrategy == STRATEGY_STAND )
pNPC->nStrategy = STRATEGY_ROAMING;
}
m_nBaseStrategy = pNPC->nStrategy; // 傈帆
m_nStrategy = m_nBaseStrategy; // Base傈帆阑 涝仿 矫糯
m_nStepNow = 0;
ClearTarget();
m_dwSummoner = 0;
m_lpParentFD = NULL ;
m_bIsSendDeadPacket = false ;
m_pStrategicTarget = NULL ;
m_pGuardTarget = NULL ;
// --------------------------------------------------------------------------------
// NPC捞悼 困摹 蔼阑 涝仿 矫糯
// --------------------------------------------------------------------------------
if( pNPC->point[0].x == 0 )
{
m_ptPoints[0].x = m_Tile.x;
m_ptPoints[0].y = m_Tile.y;
}
else
{
for( int i= 0; i < MAXNODES; i++ )
{
m_ptPoints[i] = pNPC->point[i];
}
}
// --------------------------------------------------------------------------------
// 秦寸 NPC甫 困摹俊 且寸 矫糯 (GAME MAP)
// --------------------------------------------------------------------------------
#ifdef DEF_ZONEBOSS
if( m_nClassType == MONSTER_UNIQUE ||
m_nClassType == MONSTER_ZONEBOSS )
#else
if( m_nClassType == MONSTER_UNIQUE)
#endif
{
m_nStatus = STATUS_DEAD;
g_pMap->Monster_Create( this );
}
else
{
ChangeStatus(STATUS_STAY) ;
if( IsMonster() )
{
#ifdef DEF_AZIT
if( MAP_AZIT == GetLocationMapType() )
{
g_pMap->AzitNPC_Create( this, m_Tile ); // Monaster AOI俊 困摹 矫糯
}
else
{
g_pMap->Monster_Create( this , m_Tile ); // Monaster AOI俊 困摹 矫糯
}
#else
g_pMap->Monster_Create( this , m_Tile ); // Monaster AOI俊 困摹 矫糯
#endif
}
else
{
#ifdef DEF_AZIT
if( MAP_AZIT == GetLocationMapType() )
{
g_pMap->AzitNPC_Create( this, m_Tile ); // Monaster AOI俊 困摹 矫糯
}
else
{
g_pMap->NPC_Create( this , m_Tile ); // NPC甫 AOI俊 困摹 矫糯
}
#else
g_pMap->NPC_Create( this , m_Tile ); // NPC甫 AOI俊 困摹 矫糯
#endif
}
}
// --------------------------------------------------------------------------------
// SKILL且寸 Pointer且寸 Logice 荐沥
//
// - 秦寸 胶懦 沥焊 涝仿
// - SKILL 涝仿矫 NPC NAME巩力肺 促矫 涝仿 矫糯
// --------------------------------------------------------------------------------
if( m_nAttackSkill )
{
m_pAttackSkill->Clear_Skill();
m_pAttackSkill->ReadSkill( m_nAttackSkill );
CBeing *pThis = this; // 扁粮 荐摹 Backup
*pThis += (CBeing)*m_pAttackSkill;
}
// --------------------------------------------------------------------------------
// MAGIC/RARE 阁胶磐俊辑 积己瞪 ITEM殿废
// --------------------------------------------------------------------------------
m_pDropItem = new CItem;
m_pDropItem->m_bPoolUse = true; // Item Pool 荤侩
m_pDropItem->dwMagicNum = MAGIC_NUM; // MAGIC NUM
m_pDropItem->m_nMapLayer = m_nMapLayer; // Item Layer 涝仿
m_bPoolUse = false;
}
////////////////////////////////////////////////////////////////////////////////////////
// NPC 沥焊福 檬扁拳 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void NPC::Clear_NPC()
{
dwMagicNum = MAGIC_NUM;
m_dwHandle = 0;
m_nKillTurn = 0;
m_lpParentFD = NULL;
m_pParentMonster = NULL;
m_dwSummoner = 0;
m_bIsSendDeadPacket = false ;
m_bStunTurn = false;
m_bSlowTurn = false;
m_bHoldTurn = false;
m_bNoTargetTurn = false;
m_bBindTurn = false;
m_nBeforeSightRange = 0 ;
m_bIsSpirit = false ;
m_nUniqueBeforeTime = 0;
m_nCurseDownHP = 0;
m_dwAIType = 0x00;
m_dwQuestNewBaseID = 0;
memset( m_pNPCList, 0x0, sizeof( _ZP_NPCLIST_REP ) );
memset(&m_ItemAuthority,0x0, MAX_PLAYERAUTHLIST *sizeof(CItemAuthority)) ;
m_pQuestNPCTrigger = NULL;
if(m_pAssistSkill)
m_pAssistSkill->Clear_Skill();
if(m_pOnKillSkill)
m_pOnKillSkill->Clear_Skill();
if(m_pOnAttackSkill)
m_pOnAttackSkill->Clear_Skill();
if(m_pTimeSkill)
m_pTimeSkill->Clear_Skill();
if(m_pCurseSkill)
m_pCurseSkill->Clear_Skill();
m_nGold = 0 ;
m_sFollowTile = 10;
m_sTeleportTile = 18;
#ifdef DEF_MUTATION
m_nDropItemNum = 0; // Item Drop肮荐
#endif
m_dwChannelHandle = 0;
#ifdef DEF_QUESTONKILLHACK
m_dwPlayerHandleToKill = 0; // 阁胶磐甫 磷牢 敲饭捞绢 勤甸
#endif
#ifdef DEF_AZIT
m_dwGuildHandle = 0;
#endif
}
////////////////////////////////////////////////////////////////////////////////////////
// 阁胶磐 积己
//
// - 饭绢/倒楷 函捞 阁胶磐甫 1/2 犬伏肺 免泅矫糯
// - 檬扁 阁胶磐 积己 风凭苞 烹钦矫糯
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -