⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 questfunction.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 4 页
字号:
}
//> 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 + -