void UpdateScoreAndPing(PCHAR Data, int iBitLength, PlayerID sender) { RakNet::BitStream bsData(Data,iBitLength/8,FALSE); RakNet::BitStream bsSend; BYTE bytePlayerID = pRak->GetIndexFromPlayerID(sender); if(!pNetGame->GetPlayerPool()->GetSlotState(bytePlayerID)) return; CPlayerPool *pPlayerPool = pNetGame->GetPlayerPool(); int write_counter=0; PlayerID pID; BYTE x=0; while(x!=MAX_PLAYERS) { if(pPlayerPool->GetSlotState(x) == TRUE) { pID = pRak->GetPlayerIDFromIndex(x); bsSend.Write((BYTE)x); bsSend.Write((int)pPlayerPool->GetScore(x)); bsSend.Write((int)pRak->GetLastPing(pRak->GetPlayerIDFromIndex(x))); if(pPlayerPool->IsAdmin(bytePlayerID)) { bsSend.Write(pID.binaryAddress); } else { bsSend.Write((unsigned long)0UL); } write_counter++; } x++; } pRak->RPC("UpdateScPing",&bsSend,HIGH_PRIORITY,RELIABLE,0,sender,FALSE,FALSE); }
void cmdGetIP(PCHAR szCmd) { if(!strlen(szCmd)) { pChatWindow->AddDebugMessage("Usage: /getip [player_id]"); return; } BYTE bytePlayerID; sscanf(szCmd,"%u",&bytePlayerID); if(pNetGame) { CPlayerPool *pPlayerPool = pNetGame->GetPlayerPool(); if(pPlayerPool->GetSlotState(bytePlayerID)) { char ret[30]; DWORD ip = pPlayerPool->GetIPAddress(bytePlayerID); IP2String(ip,ret); pChatWindow->AddDebugMessage("%s is: %s", pPlayerPool->GetPlayerName(bytePlayerID),ret); } else { pChatWindow->AddDebugMessage("That player doesn't appear to be active."); } } }
void CRcon::Packet_NewIncomingConnection(Packet* pPacket) { in_addr in; in.s_addr = pPacket->playerId.binaryAddress; logprintf("[RCON] Admin [%s] has connected.", inet_ntoa(in)); RakNet::BitStream bsSend; char* szHostname = pConsole->GetStringVariable( "hostname" ); BYTE byteHostnameLength = strlen(szHostname); CPlayerPool* pPlayerPool = pNetGame->GetPlayerPool(); bsSend.Write( byteHostnameLength ); bsSend.Write( szHostname, byteHostnameLength ); m_pRakServer->RPC( RPC_RconConnect,&bsSend,HIGH_PRIORITY,RELIABLE,0,UNASSIGNED_PLAYER_ID,true,false); bsSend.Reset(); for( int i = 0; i < MAX_PLAYERS; i++ ) { if( pPlayerPool->GetSlotState(i) == TRUE ) { bsSend.Write((BYTE)i); bsSend.Write(pPlayerPool->GetPlayerName(i),MAX_PLAYER_NAME); pRcon->GetRakServer()->RPC( RPC_ServerJoin, &bsSend, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_PLAYER_ID, true, false ); bsSend.Reset(); PLAYER_DATA playerData = GetPlayerInformation( i ); bsSend.Write( (BYTE)i ); bsSend.Write( (PCHAR)&playerData, sizeof(PLAYER_DATA) ); pRcon->GetRakServer()->RPC( RPC_RconPlayerInfo, &bsSend, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_PLAYER_ID, true, false ); bsSend.Reset(); } } }
void CNetGame::Packet_StatsUpdate(Packet *p) { RakNet::BitStream bsStats(p->data, p->length, false); CPlayerPool *pPlayerPool = GetPlayerPool(); BYTE bytePlayerID = (BYTE)p->playerIndex; int iMoney; WORD wAmmo; BYTE bytePacketID; bsStats.Read(bytePacketID); bsStats.Read(iMoney); bsStats.Read(wAmmo); if(pPlayerPool) { if(pPlayerPool->GetSlotState(bytePlayerID)) { pPlayerPool->SetPlayerMoney(bytePlayerID,iMoney); pPlayerPool->SetPlayerAmmo(bytePlayerID, (DWORD)wAmmo); pPlayerPool->GetAt(bytePlayerID)->SetCurrentWeaponAmmo((DWORD)wAmmo); } } }
void CNetGame::Packet_WeaponsUpdate(Packet *p) { RakNet::BitStream bsData(p->data, p->length, false); CPlayerPool *pPlayerPool = GetPlayerPool(); BYTE bytePlayerID = (BYTE)p->playerIndex; BYTE byteLength = (p->length - 1) / 4; // Should be number of changed weapons //printf("Original: %d New: %d", p->length, byteLength); BYTE byteIndex; BYTE byteWeapon; WORD wordAmmo; if (pPlayerPool) { //printf("1"); if (pPlayerPool->GetSlotState(bytePlayerID)) { //printf("2"); CPlayer* pPlayer = pPlayerPool->GetAt(bytePlayerID); bsData.Read(byteIndex); // Dump the first byte, we don't need it while (byteLength) { //printf("3"); bsData.Read(byteIndex); bsData.Read(byteWeapon); bsData.Read(wordAmmo); //printf("\n%u %u %i", byteIndex, byteWeapon, wordAmmo); if (byteIndex < (BYTE)13) { //printf("\n%d %d %d", byteIndex, byteWeapon, wordAmmo); pPlayer->m_dwSlotAmmo[byteIndex] = (DWORD)wordAmmo; pPlayer->m_byteSlotWeapon[byteIndex] = byteWeapon; } byteLength--; } } } }
void Chat(PCHAR Data, int iBitLength, PlayerID sender) { CHAR szText[256]; BYTE byteTextLen; CPlayerPool *pPool = pNetGame->GetPlayerPool(); RakNet::BitStream bsData(Data,iBitLength/8,FALSE); bsData.Read(byteTextLen); bsData.Read(szText,byteTextLen); szText[byteTextLen] = '\0'; char* szMsg = szText; if(!pPool->GetSlotState(pRak->GetIndexFromPlayerID(sender))) return; logprintf("[%s]: %s", pPool->GetPlayerName(pRak->GetIndexFromPlayerID(sender)), szText); char* szPlayerName = pPool->GetPlayerName(pRak->GetIndexFromPlayerID(sender)); // lua_getglobal( L, "OnPlayerChat" ); // lua_pushnumber( L, strlen(szPlayerName) ); // lua_pushstring( L, szPlayerName ); // lua_pushstring( L, szMsg ); // if (lua_pcall( L, 3, 0, 0 )==1){ pRcon->OutputChatMessage(pPool->GetPlayerName(pRak->GetIndexFromPlayerID(sender)), szText); // Now pass it off to all the other clients. RakNet::BitStream bsSend; BYTE bytePlayerID = pRak->GetIndexFromPlayerID(sender); bsSend.Write(bytePlayerID); bsSend.Write(byteTextLen); bsSend.Write(szText,byteTextLen); pRak->RPC("Chat",&bsSend,HIGH_PRIORITY,RELIABLE,0,sender,TRUE,FALSE); // } }
void TheGameLoop() { // If the game is not inited then do it now. if(!bGameInited && FileCheckSum()) { if(tSettings.bPlayOnline) { pNetGame = new CNetGame(tSettings.szConnectHost,atoi(tSettings.szConnectPort), tSettings.szNickName,tSettings.szConnectPass); } pGame->ToggleFrameLimiterState(TRUE); bGameInited = TRUE; return; } // The NetGame processing has been moved // to the Direct3DDevice::Present hook. // This is to solve alt-tab issues. // BEGIN: HEALTH BAR AND PLAYER NAME STUFF if(!pGame->IsMenuActive() && bShowNameTags) { if(!bbfont) { bbfont = new CBBFont(pD3DDevice, "vcmpfnt"); bbfont->Initialise(); } if (!HealthBarOldStateBlock) { pD3DDevice->BeginStateBlock(); pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); pD3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); pD3DDevice->SetRenderState(D3DRS_ZENABLE, 1); pD3DDevice->SetRenderState(D3DRS_FILLMODE, 3); pD3DDevice->SetRenderState(D3DRS_CULLMODE, 1); pD3DDevice->SetRenderState(D3DRS_WRAP0, 0); pD3DDevice->SetRenderState(D3DRS_CLIPPING, 1); pD3DDevice->SetRenderState(D3DRS_VERTEXBLEND, 0); pD3DDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 1); pD3DDevice->SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, 0); pD3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 15); pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 1); pD3DDevice->SetRenderState(D3DRS_SRCBLEND, 5); pD3DDevice->SetRenderState(D3DRS_DESTBLEND, 6); pD3DDevice->SetRenderState(D3DRS_BLENDOP, 1); pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, 4); pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, 2); pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, 0); pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, 4); pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, 2); pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, 0); pD3DDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); pD3DDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, 0); pD3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, 1); pD3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, 1); pD3DDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); pD3DDevice->SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE); pD3DDevice->SetStreamSource(0, NULL, 0); pD3DDevice->EndStateBlock(&HealthBarOldStateBlock); } if (!HealthBarNewStateBlock) { pD3DDevice->BeginStateBlock(); pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); pD3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); pD3DDevice->SetRenderState(D3DRS_ZENABLE, 1); pD3DDevice->SetRenderState(D3DRS_FILLMODE, 3); pD3DDevice->SetRenderState(D3DRS_CULLMODE, 1); pD3DDevice->SetRenderState(D3DRS_WRAP0, 0); pD3DDevice->SetRenderState(D3DRS_CLIPPING, 1); pD3DDevice->SetRenderState(D3DRS_VERTEXBLEND, 0); pD3DDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 1); pD3DDevice->SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, 0); pD3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 15); pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 1); pD3DDevice->SetRenderState(D3DRS_SRCBLEND, 5); pD3DDevice->SetRenderState(D3DRS_DESTBLEND, 6); pD3DDevice->SetRenderState(D3DRS_BLENDOP, 1); pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, 4); pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, 2); pD3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, 0); pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, 1); pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, 2); pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, 0); pD3DDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); pD3DDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, 0); pD3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, 1); pD3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, 1); pD3DDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); pD3DDevice->SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE); pD3DDevice->EndStateBlock(&HealthBarNewStateBlock); } pD3DDevice->CaptureStateBlock(HealthBarOldStateBlock); pD3DDevice->ApplyStateBlock(HealthBarNewStateBlock); D3DXMATRIX matTransposed; D3DXMatrixTranspose(&matTransposed, (D3DXMATRIX*)&matView); matTransposed._14 = matTransposed._24 = matTransposed._34 = 0.0f; if(pNetGame) { CPlayerPool* pPlayerPool = pNetGame->GetPlayerPool(); for(int x=0; x < MAX_PLAYERS; x++) { if(pPlayerPool->GetSlotState(x) == TRUE) // player is in use { CRemotePlayer* Player = pPlayerPool->GetAt(x); if( Player->IsActive() && (Player->GetDistanceFromLocalPlayer() <= 80.0f) ) // Active and within reasonable distance { CPlayerPed* PlayerPed = Player->GetPlayerPed(); if(PlayerPed->IsOnScreen()) { // They're onscreen MATRIX4X4 matPlayer; PlayerPed->GetMatrix(&matPlayer); matTransposed._41 = matPlayer.vPos.X; matTransposed._42 = matPlayer.vPos.Y; matTransposed._43 = matPlayer.vPos.Z + 1.0f; pD3DDevice->SetTransform(D3DTS_WORLD, &matTransposed); float Health = Player->GetReportedHealth(); if (Health > 100.0f) Health = 100.0f; HealthBarBGVertices[0].x = HealthBarBGVertices[1].x = (0.0058f * Health) - 0.29f; pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, HealthBarBDRVertices, sizeof(HealthBarVertices_s)); pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, HealthBarVertices, sizeof(HealthBarVertices_s)); pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, HealthBarBGVertices, sizeof(HealthBarVertices_s)); if(bbfont) { bbfont->Begin(); //bbfont->Draw(pPlayerPool->GetPlayerName(x), 0.285f, 0xFF000000); bbfont->Draw(pPlayerPool->GetPlayerName(x), 0.300f, Player->GetTeamColorAsARGB()); bbfont->End(); } } } } } } pD3DDevice->ApplyStateBlock(HealthBarOldStateBlock); // END: HEALTH BAR AND PLAYER NAME STUFF } if(!pGame->IsMenuActive()) { if((pNetGame) && GetAsyncKeyState(VK_F5)) { pGame->DisplayHud(FALSE); pScoreBoard->Draw(); } else if((pNetGame) && GetAsyncKeyState(VK_F6)) { pGame->DisplayHud(FALSE); pNetStats->Draw(); } else { pGame->DisplayHud(TRUE); if(pChatWindow) pChatWindow->Draw(); if(pCmdWindow) pCmdWindow->Draw(); } } }