📄 npc_pattern.cpp
字号:
n->Gender = pNpcTable->Sel_gender - 1;
break;
}
case 0:
case 3:
{
n->Gender = ran(2);
break;
}
}
if (pNpcTable->nNpcRace == SEALSTONE)
{ // LTS NEW LOCALWAR
if (g_pLocalWarfield != NULL)
{
g_pLocalWarfield->CheckSealStonePtr(n);
}
}
n->MoveSx = x;
n->MoveSy = y;
SetTileOccupied(n->MoveSx, n->MoveSy, false);
n->OldMoveSx = n->MoveSx;
n->OldMoveSy = n->MoveSy;
n->X = n->MoveGox = n->MoveSx*TILE_SIZE + 16;
n->Y = n->MoveGoy = n->MoveSy*TILE_SIZE + 16;
n->ox = n->X;
n->oy = n->Y;
n->MoveP = pNpcTable->Movp + (rand()%20); // 捞悼仿 // LTS AI
n->MovePathCount = 0;
n->MoveType = 0;
int amount = 0;
n->Get_meat = pNpcTable->Get_meat;
amount = pNpcTable->Meat_amount;
if (rand()%6)
{
amount = (amount) ? (rand()%amount + 1):0;
}
else
{
amount = 0;
}
n->Meat_amount = amount;
n->Get_skin = pNpcTable->Get_skin;
amount = pNpcTable->Skin_amount;
if (rand()%3)
{
amount = (amount) ? (rand()%amount + 1):0;
}
else
{
amount = 0;
}
n->Skin_amount = amount;
n->Get_Wool = pNpcTable->Get_Wool;
amount = pNpcTable->Wool_amount;
if (rand()%3)
{
amount = (amount) ? (rand()%amount + 1):0;
}
else
{
amount = 0;
}
n->Wool_amount = amount;
n->Get_beewax = pNpcTable->Get_beewax;
amount = pNpcTable->BeeWax_amount;
if (rand()%3)
{
amount = (amount) ? (rand()%amount + 1):0;
}
else
{
amount = 0;
}
n->BeeWax_amount = amount;
// NPC阑 磷菌阑 锭 掘阑 荐 乐绰 酒捞袍 汲沥
if (!g_pArenaManager->IsColossusArena())
{ //< CSD-030516
SkillMgr.GenerateNPCItem2(n, pNpcTable);
} //> CSD-030516
// 鸥捞怪 阁胶磐 沥焊
n->targetid = -1;
n->attacked = -1;
n->WalkTime = global_time;
n->aitimedelay = 0;
n->tame = 0;
n->tamingcountdown = 0;
n->tamingable = pNpcTable->Tamingable;
// A.I Pattern汲沥秦林绰镑
n->ChairNum = (generationtype == GT_SKILL_SUMMON) ? 0:pNpcTable->nAIType; // LTS AI AI 且寸阑 包府茄促. 0: 努扼捞攫飘 1 : 辑滚
n->patterntype = pNpcTable->nAIBase;
if (n->ChairNum != 0) // LTS NEW AI
{ //< CSD-030417
if (pNpcTable->nAppearType > 0)
{
n->CurrentPhase = pNpcTable->nAppearType;
}
n->patterntype = g_pAIManager->GetNpcAIData(pNpcTable->nAINo, FSTART_AI_PATTERN);
} //> CSD-030417
n->JoinLocalWar = GroupNo; // LTS AI2
n->GainedFame = isBoss; // LTS AI2
n->ctrlpc = -1;
n->bAlive = ALIVE_;
++CurrentNPCNo;
// 010301 KHS
switch (n->generationtype)
{
case GT_SKB_FILE:
{
if (generationpos >= 0 || generationpos < NPCgeneratePositionMax)
{
NPCgeneratePosition[generationpos].curnpc++;
}
break;
}
case GT_SCRIPT:
case GT_SKILL_SUMMON:
{
break;
}
}
SetArea(ADD_NPC_AREA, Num);
Send_CMD_SEALSTONE_STATUS(n, 1);
return 1;
} //> CSD-030408
int NPC_AdjustPosition(int sprno, int* x, int* y)
{ //< CSD-030408
switch (sprno)
{ // Dummy NPC肺辑
case 92:
case 93:
case 94:
case 95: return 1;
}
int ax = *x;
int ay = *y;
const int maxx = 3;
const int maxy = 3;
for (int i = 0; i < maxx; ++i)
{
for (int j = 0; j < maxy; ++j)
{
if (FreeTile(NULL, ax + i, ay + j, ax + i, ay + j))
{
*x = ax + i;
*y = ay + j;
return 1;
}
if (FreeTile(NULL, ax + i, ay - j, ax + i, ay + j))
{
*x = ax + i;
*y = ay - j;
return 1;
}
if (FreeTile(NULL, ax - i, ay + j, ax + i, ay + j))
{
*x = ax - i;
*y = ay + j;
return 1;
}
if (FreeTile(NULL, ax - i, ay - j, ax + i, ay + j))
{
*x = ax - i;
*y = ay - j;
return 1;
}
}
}
return 0;
} //> CSD-030408
void NPC_AutoCreationProc( void )
{
int id;
int x, y;
sNPCgeneratePosition *gpos;
int i;
static int MaxNPC;
static DWORD checktime;
if( global_time - checktime > 10000 ) // 10檬付促
{
checktime = global_time;
for( i = 0 ; i < NPCgeneratePositionMax ; i ++)
{
if(NPCgeneratePosition[i].maxno > NPCgeneratePosition[i].curnpc ) // 茄疙父 惯积矫挪促. 溜, Event侩捞鄂娟扁..
{
gpos = &NPCgeneratePosition[i];
if( gpos->curnpc < gpos->maxno )
{
if( gpos->maxno > 1 )
{
x = gpos->x -3 + (rand()%7);
y = gpos->y -3 + (rand()%7);
}
else
{
x = gpos->x;
y = gpos->y;
}
id = GetAliveNPCList();
if( id >= 0 )
{
if( NPC_AdjustPosition( gpos->npcindex, &x, &y ) )
{
NPC_Create( id, gpos->npcindex, x, y, gpos->eventno, i, GT_SKB_FILE );
}
}
}
}
}
return;
}
return;
}
void NPC_AutoCreationProc2() // LTS AI2
{
static DWORD checktime;
int x,y;
int NPC_ID;
if( global_time - checktime < 10000 ) return;
else checktime = global_time;
for (int j=0;j<MAX_GROUP_NO;j++) // 弊缝 贸澜何磐 场鳖瘤 捣促.
{
int tempStatus=g_pAdventManager->GetActiveStatusByIndex(j);
if (tempStatus>0) // 秦寸 弊缝狼 牢郸胶 锅龋啊 绝促.
{
for (int i=0;i< g_pAdventManager->GetDataCountByIndex(j);i++) // 弊缝单捞磐狼 场鳖瘤 埃促.
{
NPCGenerationPos* Pos=NULL;
Pos=g_pAdventManager->GetGenerationPosByIndex(j,i);
if (!Pos) return;
if (Pos->MaxNo>Pos->CurNPC) //积己登瘤 臼篮 NPC啊 乐促.
{
if (Pos->MaxNo>1)
{
x = Pos->LocationX -3 + (rand()%7);
y = Pos->LocationY -3 + (rand()%7);
}
else
{
x = Pos->LocationX;
y = Pos->LocationY;
}
NPC_ID = GetAliveNPCList();
if( NPC_ID >= 0 )
if( NPC_AdjustPosition( Pos->NPCNo, &x, &y ) )
{
NPC_Create(NPC_ID,Pos->NPCNo, x, y,Pos->EventNo, i, GT_EVENT_MONSTER,j,Pos->isBoss );
Pos->CurNPC++;
MyLog(0,"NPC SPECIAL ID:%d, No:%d, x:%d, y:%d, event:%d, i:%d, Group:%d, GTType:%d",NPC_ID,Pos->NPCNo, x, y,Pos->EventNo, i, j,GT_EVENT_MONSTER);
}
}
}
}
}
}
void NPC_AutoCreate() // LTS AI2
{ //< CSD-030509
NPC_AutoCreationProc();
NPC_AutoCreationProc2(); // 捞亥飘 阁胶磐 殿厘
// 荤成 阁胶磐 殿厘
if (!g_pArenaManager->IsColossusArena())
{
g_pRegenManager->Regenerate();
}
} //> CSD-030509
//---------------------------------------------------------------------------------
// 矫埃捞 DEAD_CHARACTER_CHECK_TIME捞 版苞窍搁 .bAlive啊 DEAD_登绢 乐绰 Character甫 REMOVE_矫挪促.
// NPC老版快 ITEM阑 积己矫挪促.
// 葛电 NPC/PC狼 磷澜篮 咯扁辑 贸府茄促.
//-----------------------------------------------------------------------------------
void NPC_CheckRemove( void )
{
static DWORD time;
int i;
CHARLIST *ch;
if( g_curr_time - time < DEAD_CHARACTER_CHECK_TIME ) return;
time = g_curr_time;
for( i = NPC_LIST_START ; i < MAX_NPC_LIST ; i ++)
{
if( NPCList[i].bAlive >= DEAD_ )
if( NPCList[i].deadcount > 1 )
{
ch = NPCList + i;
ch->deadcount--;
if( ch->deadcount == DEAD_NPC_COUNT_BOTTOM_ ) // Client俊霸辑 Remove矫挪促.
{
if( ( ch->eventno>0 && ch->Race==HUMAN ) || ( ch->Race == SEALSTONE ) )// 捞亥飘甫 啊瘤绊 乐绰 仇捞搁 ..
{
ch->deadcount = 0;
ch->Peacests = 0;
ch->OldMoveSx = ch->MoveSx = ch->X = ch->homex;
ch->OldMoveSy = ch->MoveSy = ch->Y = ch->homey;
ch->X *= TILE_SIZE;
ch->Y *= TILE_SIZE;
// 020701 YGI
ch->Hp = ch->HpMax;
ch->Hungry = ch->HungryMax;
ch->Mana = ch->ManaMax;
ch->bAlive = ALIVE_; // 020716 YGI
SetArea( MOVE_NPC_AREA, i);
//SkillMgr.CharacterToAlive(ch);//促矫 混赴促
continue;
}
SetArea( REMOVE_NPC_AREA, i);
// Client俊辑 荤扼瘤绰 矫埃阑 国扁困窃...
// Client俊辑 荤扼瘤绰 悼救 弊困摹俊辑 积扁搁 救登扁 锭巩.
NPCList[i].bAlive = BUFE_;
}
else if( ch->deadcount <= 1 ) // Server俊技档 Remove矫挪促.
{
ch->deadcount = 0;
RemoveNPCList( i );
}
}
// Remove Process....
}
for( i = DRAGON_CONNECTIONS_START ; i < DRAGON_MAX_CONNECTIONS ; i ++)
{
if( connections[i].dwAgentConnectionIndex && connections[i].state >= CONNECT_JOIN )
if( connections[i].chrlst.bAlive >= DEAD_ )
if( connections[i].chrlst.deadcount >= DEAD_PC_COUNT_BOTTOM_ )
{
ch = &connections[i].chrlst;
ch->deadcount --;
if( ch->deadcount < DEAD_PC_COUNT_BOTTOM_ ) // 磷篮第 Ghost肺 函茄促.
{
RareEM.ClearDynamicRareEffect(ch); //蜡飞捞 登菌阑锭 努府绢 扁瓷酒捞袍 努府绢
// 031009 YGI // 酒饭唱俊辑绰 烹窍瘤 臼绰促. // 归捍傈 吝老订 烹窍瘤 臼绰促.
extern bool CanUseRevivalPosion();
if( CanUseRevivalPosion() && !g_pArenaManager->GetArenaInfo( GetOwnPort() ) && RareEM.IsHaveRivaval(ch) )//狞芒阑 倒绊辑 混府绰 酒捞袍捞 乐栏搁 混妨霖促 // 何劝狼 郡腐辑
{
SkillMgr.CharacterToAlive(ch, 1);
}
else
{
SkillMgr.CharacterToGhost(ch);
}
// 某腐磐 付过沥焊 檬扁拳
ch->Clear();
}
}
}
}
void RecvCMD_MODIFY_POSITION( int cn, t_client_modify_position *p )
{
if( cn < DRAGON_CONNECTIONS_START || cn >= DRAGON_MAX_CONNECTIONS ) return;
LPCHARLIST ch = &connections[ cn].chrlst;
//< CSD-021114
ch->X = ch->MoveGox = p->x;
ch->Y = ch->MoveGoy = p->y;
//> CSD-021114
ch->MoveSx = p->x / TILE_SIZE;
ch->MoveSy = p->y / TILE_SIZE;
ch->MovePathCount = ch->MoveLength = 0;
SetArea(MOVE_PC_AREA, cn );
}
/* ///////////////////////////////////////////////////////////////////////////////////////
CMD_ALL_READY啊 坷搁 圾青茄促.
CMD_NPC_ADD甫 焊郴变 沁瘤父 Client俊辑 Data Loading窍蠢衬绊 矫埃阑 棱酒冈菌促.
//////////////////////////////////////////////////////////////////////////////////////// */
void SendReadyMoveDate( int cn )
{
AREA *a = connections[cn].area_tbl;
int id;
t_packet packet;
for( int i = 0 ; i < MAX_AREA_BUFFER ; i ++)
{
if( a[i].bAlive )
{
switch( a[i].Type )
{
// PC
case 1: id = a[i].ID;
if( connections[ id].chrlst.MovePathCount )// 泅犁 捞悼窍绊 乐绰 吝捞搁....
{
if( SettingMoveData_( id, &connections[id].chrlst, &packet ) )
{
packet.u.server_move.movetype += 100; // 咯扁辑 焊郴林绰 困摹俊辑 矫累茄促.
packet.h.header.type = CMD_MOVE;
QueuePacket( connections, cn, &packet, 1);
}
}
else
{
packet.h.header.type = CMD_MODIFY_POSITION_ABSOLUTE;
{
packet.u.server_modify_position_absolute.id = id;
packet.u.server_modify_position_absolute.x = connections[id].chrlst.X;
packet.u.server_modify_position_absolute.y = connections[id].chrlst.Y;
}
packet.h.header.size = sizeof( t_server_modify_position_absolute );
QueuePacket( connections, cn, &packet, 1);
}
break;
case 2: id = a[i].ID;
if( NPCList[id].MovePathCount )// 泅犁 捞悼窍绊 乐绰 吝捞搁....
{
if( SettingMoveData_( id + 10000, &NPCList[id], &packet ))
{
packet.u.server_move.movetype += 100; // 咯扁辑 焊郴林绰 困摹俊辑 矫累茄促.
packet.h.header.type = CMD_MOVE;
QueuePacket(connections, cn, &packet, 1);
}
}
else
{
packet.h.header.type = CMD_MODIFY_POSITION_ABSOLUTE;
{
packet.u.server_modify_position_absolute.id = id+10000;
packet.u.server_modify_position_absolute.x = NPCList[id].X;
packet.u.server_modify_position_absolute.y = NPCList[id].Y;
}
packet.h.header.size = sizeof( t_server_modify_position_absolute );
QueuePacket( connections, cn, &packet, 1);
}
break;
}
}
}
}
#define TAME_FAIL_CHANGE_NAME 0 // 捞抚官操扁甫 角菩.
#define TAME_NO_CHAR 1 // 弊繁捞抚栏肺 辨甸牢 悼拱捞 绝嚼聪促.
#define TAME_NO_NAME_CHAR 2 // 弊繁 捞抚阑 啊柳 措惑捞 绝嚼聪促.
#define TAME_FOLLOW 3 // 蝶扼癌聪促.
#define TAME_STOP 4 // 肛苗 挤聪促.
#define TAME_ATTACK 5 // 傍拜钦聪促.
#define TAME_SUCCESS_CHANGE_NAME 6 // 捞抚阑 官操菌嚼聪促.
void RecvTameCommand( int cn, t_tame_command *p )
{
int i;
CHARLIST *n, *ch;
t_packet packet;
p->mybaby[19] = 0;
if( p->mybaby[0] == 0 ) { SendTameResult( cn, TAME_NO_CHAR ) ; return; }
p->toname[19] = 0;
for( i = NPC_LIST_START ; i < MAX_NPC_LIST ; i ++ )
{
if( NPCList[i].bAlive == ALIVE_ )
{
if( strcmp(NPCList[i].Name, p->mybaby ) == 0 )
{
n = &NPCList[i];
break;
}
}
}
if( i == MAX_NPC_LIST ) { SendTameResult( cn, TAME_NO_CHAR ) ; return; }
// 弊绰 辨甸牢 悼拱捞 酒聪菌促.
if (n->IsTamedNpc() == false) { SendTameResult(cn, TAME_NO_CHAR); return; }
// 寸脚捞 林牢捞 酒聪促.
if( strcmp( n->HostName, connections[cn].chrlst.Name)) {SendTameResult( cn, TAME_NO_CHAR ) ; return; }
switch( p->cmd )
{
case LC_TAME_NAME : if( p->toname[0] == 0 ) return;
strcpy( n->Name, p->toname );
packet.h.header.type = CMD_TAME_NAME_CHANGE;
packet.u.tame_name_change.id = i + 10000;
strcpy( packet.u.tame_name_change.name, n->Name );
packet.h.header.size = sizeof( t_tame_name_change );
CastNPC2Other( i, &packet );
break;
case LC_TAME_ATTACK :
if( p->toname[0] == 0 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -