Beispiel #1
0
void CNetSends::Death( unsigned char uc, unsigned char ucKiller, unsigned char ucReason )
{
	CPlayerPool* pPlayer = CPlayerPoolManager::Find( uc );
	if ( pPlayer )
	{
		RakNet::BitStream bsSend;

		bsSend.Write( uc );
		bsSend.Write( ucReason );
		bsSend.Write( ucKiller );

		if ( ( ucKiller != INVALID_PLAYER_ID ) && ( ucKiller < MAX_PLAYERS ) )
		{
			CPlayerPool* pKiller = CPlayerPoolManager::Find( ucKiller );
			if ( pKiller )
			{
				if ( ( pKiller->GetTeam() == INVALID_TEAM_ID ) || ( ( pKiller->GetTeam() != INVALID_TEAM_ID ) && ( pKiller->GetTeam() != pPlayer->GetTeam() ) ) )
				{
					if (CConfigLoader::GetDeathmatchScoreB()) pKiller->IncScore();

					bsSend.Write( (unsigned char)VALID_KILL );

					CScripting::PushFunction( "onPlayerKill" );
					CScripting::PushPlayerPointer( pKiller );
					CScripting::PushPlayerPointer( pPlayer );
					CScripting::PushInteger( ucReason );
					CScripting::CallFunction();

					CPlayerSendPackets::Kill( ucKiller, pKiller->GetTeam(), uc, pPlayer->GetTeam(), ucReason );
				}
				else
				{
					if (CConfigLoader::GetDeathmatchScoreB()) pKiller->DecScore();

					bsSend.Write( (unsigned char)TEAM_KILL );

					CScripting::PushFunction( "onPlayerTeamKill" );
					CScripting::PushPlayerPointer( pKiller );
					CScripting::PushPlayerPointer( pPlayer );
					CScripting::PushInteger( ucReason );
					CScripting::CallFunction();

					CPlayerSendPackets::TeamKill( ucKiller, pKiller->GetTeam(), uc, pPlayer->GetTeam(), ucReason );
				}
			}
			else
			{
				bsSend.Write( (unsigned char)SELF_KILL );

				CScripting::PushFunction( "onPlayerDeath" );
				CScripting::PushPlayerPointer( pPlayer );
				CScripting::PushInteger( ucReason );
				CScripting::CallFunction();

				CPlayerSendPackets::Death( uc, ucReason );
			}
		}
		else
		{
			bsSend.Write( (unsigned char)SELF_KILL );

			CScripting::PushFunction( "onPlayerDeath" );
			CScripting::PushPlayerPointer( pPlayer );
			CScripting::PushInteger( ucReason );
			CScripting::CallFunction();

			CPlayerSendPackets::Death( uc, ucReason );
		}

		// Broadcast it
		NetInterface->RPC( "Death", &bsSend, HIGH_PRIORITY, RELIABLE, 0, pPlayer->GetPlayerID(), TRUE, FALSE );

		// Now let the player who died know aswell.
		NetInterface->RPC( "OwnDeath", &bsSend, HIGH_PRIORITY, RELIABLE, 0, pPlayer->GetPlayerID(), FALSE, FALSE );
	}
}