📄 questfunction.cpp
字号:
}
//> BBD 040329
void CQuestInMap::DeleteRequeitalTable()
{
SAFE_DELETE(m_cRequital);
}
void CQuestInMap::GiveRequitalAfterKillNpc( const CHARLIST *a, const CHARLIST *d)
{
if( !d ) return;
//d啊 阁胶磐啊 酒聪搁 府畔
if( d->IsPlayer() ) return;
//npc刚历 茫绊 瘤档啊 嘎绰瘤 茫绰促.
REQUITALLISTITER it = FindRequitalNpc( d->npc_index );
if( it == NULL ) return;
//<! BBD 040318 // 局矫寸檬 甘逞滚俊 秦寸窍绰 饭内靛父 掘绢吭栏骨肺 厚背啊 公狼固
//甘锅龋 犬牢
// if( (*it).Map_num != MapNumber ) return;
//> BBD 040318
if( (*it).Tile_area > 0 )
{
RequitalRoundUser( d->GetServerID(), (*it) );
}
else if( (*it).Tile_area == 0 )
{
RequitalKillUser( a->GetServerID(), (*it) );
}
}
list<table_requital_list >::iterator CQuestInMap::FindRequitalNpc( const int iNpcIndex)
{
if( m_cRequital == NULL ) return NULL;
return m_cRequital->GetRequital_KillNpc( iNpcIndex );
}
void CQuestInMap::RequitalRoundUser( const int &cn, table_requital_list& table)
{
list<int> ListCn;
ListCn = GetRoundUser( cn );
if( ListCn.size() <= 0 ) return;
list<int>::iterator it;
int i = 0; // BBD 040401
int rate = rand()%SEALSTONE_ITEMGIVERATE; // BBD 040401
for( it = ListCn.begin(); it != ListCn.end(); it++ )
{
//<! BBD 040401 搬拌籍篮 傈眉狼 1/2父 瘤鞭
if(table.WarStatus)
{
if((i%SEALSTONE_ITEMGIVERATE) == rate)
{
GiveRequitalByCn( (*it), table );
}
i++;
}
else
{
GiveRequitalByCn( (*it), table );
}
//> BBD 040401 搬拌籍篮 傈眉狼 1/2父 瘤鞭
}
}
void CQuestInMap::RequitalKillUser( int cn, table_requital_list& table)
{
GiveRequitalByCn( cn, table );
}
void CQuestInMap::GiveRequitalByCn( const int cn, table_requital_list& table)
{
CHARLIST *ch = CheckServerId( cn);
if( !ch) return;
//<! BBD 040318 惫瘤傈俊 曼啊吝牢瘤狼 眉农
if(table.WarStatus) // 惫瘤傈 曼啊老锭父 焊惑阑 临巴烙
{
//<!BBD 040401 惫啊 规绢仿俊 蝶扼 酒捞袍 瘤鞭阑 搬沥
int nResult = DecideRequitalByNationDefensePoint(ch);
if( nResult == -1) // 俊矾牢版快
{
MyLog( LOG_NORMAL, "Character have wrong nation code name : %s", ch->Name );
}
else if(nResult == 0) // 焊惑犬伏郴肺 给甸绢吭促.
{
return;
}
//>BBD 040401 惫啊 规绢仿俊 蝶扼 酒捞袍 瘤鞭阑 搬沥
// Attack茄 仇捞 惫瘤傈俊 曼啊吝牢瘤 犬牢且 鞘夸 乐澜
if(!ch->JoinLocalWar)
{
return;
}
// 规绢惫 敲饭捞绢搁 林瘤 富磊
switch(table.Npc_index)
{
case SEALSTONE_YLLSE_NO:
{
if(ch->name_status.nation == N_YILSE)
{
return;
}
break;
}
case SEALSTONE_VYSEUS_NO:
{
if(ch->name_status.nation == N_VYSEUS)
{
return;
}
break;
}
case SEALSTONE_ZYPERN_NO:
{
if(ch->name_status.nation == N_ZYPERN)
{
return;
}
break;
}
default:
break;
}
//<! BBD 040329 惫瘤傈 傈侩狼 酒捞袍阑 霖饶 府畔窍磊
if(!Requital_About_SealStone(cn, table.Sardonyx, table.LeafOfBlessed, table.ref_index))
{
::OutMessage(ch,2,13);//"牢亥配府 傍埃捞 面盒摹 臼嚼聪促."
}
else
{
::OutMessage(ch,4,120);//"酒捞袍捞 牢亥配府肺 瘤鞭登菌嚼聪促.
return;
}
//> BBD 040329 惫瘤傈 傈侩狼 酒捞袍阑 霖饶 府畔窍磊
}
//> BBD 040318 惫瘤傈俊 曼啊吝牢瘤狼 眉农
if(table.Item_no != 0) //item
{
//<! BBD 040322
if(SetRareItemInvPc( cn, table.Item_no, table.Item_Min, table.Item_Max, table.Item_rare_count, 0, table.Item_rare_type ))
{
// 己傍
::OutMessage(ch,4,120);//"酒捞袍捞 牢亥配府肺 瘤鞭登菌嚼聪促.
}
else
{
// 角菩
::OutMessage(ch,2,13);//"牢亥配府 傍埃捞 面盒摹 臼嚼聪促."
}
//> BBD 040322
}
if( table.Quest_no !=0) //qust_step
{
var[ cn ][ table.Quest_no ] = table.Quest_step;
}
if( table.Real_Fame !=0 ) //real_fame
{
FameUp2( cn, 1, table.Real_Fame );
}
{//dual fame蔼篮 quest蔼狼 10锅蔼捞促.
const int iOldDF = var[ch->GetServerID()][DUAL_FAME_FIELD];
const int iNewDF = iOldDF+table.Dual_Fame;
var[ch->GetServerID()][DUAL_FAME_FIELD] = iNewDF;
::SaveChangeDualFame( ch, iOldDF, iNewDF, LDF_QUEST);
::MyLog(0,"Increase User Spy Game Point, User : %s, OldPoint %d, NewPoint %d",ch->Name,iOldDF,iNewDF);
}
}
list<int> CQuestInMap::GetRoundUser( const int cn)
{
list<int> RtList;
for( int i = 0; i < PC_COUNT; i++ )
for(int j = 0; j < MAX_AREA_BUFFER; j ++)
if( connections[PC_TABLE[i].ID ].area_tbl[j].bAlive == TRUE )
if( connections[PC_TABLE[i].ID ].area_tbl[j].Type == 2 )
if( connections[ PC_TABLE[i].ID ].area_tbl[j].ID == cn)
if( connections[ PC_TABLE[i].ID ].dwAgentConnectionIndex)
{
RtList.push_back( PC_TABLE[i].ID );
}
return RtList;
}
///CQuestInMap
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///CBossTimer
CBossTimer::CBossTimer()
{
}
CBossTimer::~CBossTimer()
{
m_lUserCn.clear();
int zz = m_lUserCn.size();
RemoveBossNpc();
}
bool CBossTimer::AddUser(const int nCn)
{
ITOR_INT it =find( m_lUserCn.begin(), m_lUserCn.end(), nCn );
if( it == m_lUserCn.end() )
{
m_lUserCn.push_back(nCn);
return true;
}
return false;
}
bool CBossTimer::DeleteUser(const int nCn)
{
ITOR_INT it =find( m_lUserCn.begin(), m_lUserCn.end(), nCn );
if( it != m_lUserCn.end() )
{
m_lUserCn.erase( it);
return true;
}
return false;
}
void CBossTimer::RemoveBossNpc()
{
if( TYPE_BOSS_ONLY == m_nFlag)
{
CHARLIST* pNpc = &NPCList[m_nBossID];
if( !pNpc ) return; //焊胶啊 磷菌促绰 具扁.
if( pNpc->SprNo == m_iBossSprNo )
{
::KillMonster( m_nBossID);
}
else
{
MyLog( 1, "BossTimerStart :DeleteBossNpc: Boss is alive. but sprNo is not accorded" );
}
}
else if( TYPE_BOSS_GROUP == m_nFlag)
{
if( g_pRegenManager->IsExistHunt(m_nBossID) )
{
g_pRegenManager->Remove(m_nBossID);
}
}
}
//CBossTimer
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CScriptTimer
bool CScriptTimer::StartTimer( bool bOnlyServer )
{
//矫埃 例沥 盲农窃荐 持阑巴
//矫埃捞 巢酒乐绰啊 窍绰芭?
if( m_bStart == true) return false;
//server only啊 酒聪搁 努扼捞攫飘档 矫累矫挪促.
if( bOnlyServer == false )
SendSCRIPT_TIEMER( m_dwTimerTime, CMD_SCRIPT_TIMER_START);
m_bStart = true;
return m_bStart;
}
void CScriptTimer::EndTimer( int iFlag)
{
m_bStart = false;
if( iFlag == SCRIPT_END_SUC )
{
SendSCRIPT_TIEMER( 0, CMD_SCRIPT_TIMER_END_SUC);
AfterTimer();
}
else if( iFlag == SCRIPT_END_FAL )
{
SendSCRIPT_TIEMER( 0, CMD_SCRIPT_TIMER_END_FAL);
}
}
void CScriptTimer::ClearTimer()
{
m_dwTimerTime = 0;
m_dwSynchTime = 0;
m_dwSpendTime = 0;
m_ID = 0;
//m_szName = NULL;
m_dwOld = 0;
m_dwSynch = 0;
m_bStart = false;
}
bool CScriptTimer::IsRunning()
{
if( m_bStart== true && m_dwTimerTime > 0 && m_dwSpendTime > 0 )
return true;
return false;
}
void CScriptTimer::SetName( const char* name )
{
if( !name ) return;
strcpy( m_szName, name );
m_szName[30] = '\0';
}
void CScriptTimer::SetTimerTime( DWORD dwTime )
{
//_ASSERTE( dwTime < MAX_TIMER_TIME );
//_ASSERTE( dwTime > 0 );
if( dwTime > MAX_TIMER_TIME || dwTime < 0 )
m_dwTimerTime = MAX_TIMER_TIME;
else
m_dwTimerTime = dwTime;
}
void CScriptTimer::SetSynchroneTime( DWORD dwSynchTime )
{
//_ASSERTE( dwSynchTime < MAX_TIMER_TIME );
//_ASSERTE( dwSynchTime > MIN_SYNCH_TIME );
if( dwSynchTime < MIN_SYNCH_TIME || dwSynchTime > MAX_TIMER_TIME )
m_dwSynchTime = MIN_SYNCH_TIME;
else
m_dwSynchTime = dwSynchTime;
}
void CScriptTimer::RunTimer( ) //捞 窃荐甫 very long捞聪瘪 .75檬付促 角青等促绰吧 蜡狼窍档废
{
//if( !IsRunning() ) return;
//static DWORD dwOld= 0; //贸澜 矫累矫埃
//static DWORD dwSynch = 0; //倔付付促 焊尘鳖?
if( m_dwOld == 0 )
m_dwOld = GetTickCount();
DWORD dwCurrent = GetTickCount();
m_dwSpendTime = dwCurrent - m_dwOld; //倔付唱 矫埃捞 瘤抄绰啊?
if( m_dwSpendTime > m_dwTimerTime ) //矫埃捞 促 馋唱搁 馋郴扼绰 疙飞阑 焊辰促.
{
m_dwOld = 0;
m_dwSynch = 0;
EndTimer( SCRIPT_END_SUC ); //矫埃 促 登辑 场唱搁 己傍利牢 辆丰
return;
}
//汲沥茄 矫埃付促 (*sync)窃荐 角青
if( (m_dwSpendTime - m_dwSynch) > m_dwSynchTime )
{
m_dwSynch = m_dwSpendTime;
//for test
SendSCRIPT_TIEMER( m_dwSpendTime, CMD_SCRIPT_TIMER_SYNC);
//(*m_syncFunc)();
}
//else
//亲惑 (*func)窃荐 角青
//(*m_func)();
}
void CScriptTimer::SetFunction( void (*func)(), void (*syncFunc)() )
{
m_func = func;
m_syncFunc = syncFunc;
}
void CScriptTimer::SendSCRIPT_TIEMER( DWORD dwSpendTime , int iType)
{
if( m_ID == 0) return;
t_packet packet;
packet.h.header.type = iType;
packet.h.header.size = sizeof( t_script_timer);
packet.u.script_timer.dwTime = dwSpendTime;
QueuePacket( connections, m_ID, &packet, 1 );
}
void CScriptTimer::SetAfterMap( const char* mapfile, const int& x, const int& y)
{ //< CSD-030509
strcpy(m_szMapFile, mapfile);
m_nPosX = x;
m_nPosY = y;
} //> CSD-030509
void CScriptTimer::AfterTimer()
{ //< CSD-030509
//鸥捞赣啊 场捞 抄 饶俊 甘捞悼 且荐档 乐绊 促弗 老阑 且荐档 乐蝶.
if( m_ID == 0 ) return;// id啊 汲沥登瘤 臼疽阑锭绰 捞悼窍瘤 臼绰促. bosstimer俊辑 荤侩等促.
//Log_UserInfo( m_ID); // 030617 kyo
::CharUpper(m_szMapFile);
::CharUpper(MapName);
if( strcmp( m_szMapFile, MapName ) == 0 )
{//鞍篮 甘捞搁 涅胶飘 炮饭器飘 肺 捞悼
::QuestTeleport( m_ID, m_nPosX, m_nPosY);
}
else
{
::MapMove( m_ID, m_szMapFile, m_nPosX, m_nPosY);
}
} //> CSD-030509
bool CScriptTimer::ConfirmSyncTimer( DWORD dwTimer)
{
//dwRecvTime捞尔 泅犁矫埃捞尔 +-X檬 捞惑 瞒捞唱搁 悼扁拳 角菩促..
return true;
}
extern void LogInFile( string szFilePath, char *szFormat, ... ); //kyo
void CScriptTimer::Log_UserInfo( const int nCn)//kyo
{
CHARLIST *ch = CheckServerId( nCn );
if( !ch ) return;
char szFilename[32];
string szItem;
sprintf( szFilename, "./QuestLog/%s.txt", ch->Name );
char buff[8];
for( int a=0; a<3; a++ )
{
for( int b=0; b<3; b++ )
{
for( int c=0; c<8; c++ )
{
itoa( ch->inv[a][b][c].item_no, buff, 8);
szItem += buff;
szItem += " ";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -