michalmonday

modified netrpc.cpp from RakSAMP to send requests

Aug 18th, 2018
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 39.48 KB | None | 0 0
  1. /*
  2.     Updated to 0.3.7 by P3ti
  3. */
  4.  
  5. #include "main.h"
  6.  
  7.  
  8.  
  9. /*ADDED*/
  10. #include <Windows.h>
  11. #include <WinInet.h>
  12. #include <iostream>
  13. #include <string>
  14.  
  15. #define  INTERNET_OPEN_TYPE_DIRECT 1
  16. #define  INTERNET_SERVICE_HTTP 3
  17. #define GET 0
  18. #define POST 1
  19.  
  20. #pragma comment (lib, "wininet.lib")
  21. std::string HttpRequest(std::string site, std::string param, int port);
  22. /*ADDED*/
  23.  
  24.  
  25.  
  26.  
  27.  
  28. int iNetModeNormalOnfootSendRate, iNetModeNormalIncarSendRate, iNetModeFiringSendRate, iNetModeSendMultiplier;
  29.  
  30. char g_szHostName[256];
  31. BYTE m_bLagCompensation;
  32.  
  33. PLAYERID imitateID = -1;
  34. bool iGettingNewName=false;
  35.  
  36. int iMoney, iDrunkLevel, iLocalPlayerSkin;
  37.  
  38. struct stGTAMenu GTAMenu;
  39.  
  40. struct stSAMPDialog sampDialog;
  41. HFONT hSAMPDlgFont = NULL;
  42. HANDLE hDlgThread = NULL;
  43. HWND hwndSAMPDlg = NULL;
  44.  
  45. PLAYER_SPAWN_INFO SpawnInfo;
  46.  
  47. BOOL bIsSpectating = 0;
  48.  
  49. void ServerJoin(RPCParameters *rpcParams)
  50. {
  51.     if(!iGameInited) return;
  52.  
  53.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  54.     int iBitLength = rpcParams->numberOfBitsOfData;
  55.  
  56.     CHAR szPlayerName[256];
  57.     PLAYERID playerId;
  58.     BYTE byteNameLen=0;
  59.  
  60.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  61.    
  62.     bsData.Read(playerId);
  63.     int iUnk = 0;
  64.     bsData.Read(iUnk);
  65.     BYTE bIsNPC = 0;
  66.     bsData.Read(bIsNPC);
  67.     bsData.Read(byteNameLen);
  68.     if(byteNameLen > 20) return;
  69.     bsData.Read(szPlayerName,byteNameLen);
  70.     szPlayerName[byteNameLen] = '\0';
  71.    
  72.     if(playerId < 0 || playerId >= MAX_PLAYERS) return;
  73.  
  74.     playerInfo[playerId].iIsConnected = 1;
  75.     playerInfo[playerId].byteIsNPC = bIsNPC;
  76.     strcpy((char *)playerInfo[playerId].szPlayerName, szPlayerName);
  77.  
  78.     //Log("***[JOIN] (%d) %s", playerId, szPlayerName);
  79. }
  80.  
  81. void ServerQuit(RPCParameters *rpcParams)
  82. {
  83.     if(!iGameInited) return;
  84.  
  85.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  86.     int iBitLength = rpcParams->numberOfBitsOfData;
  87.  
  88.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  89.     PLAYERID playerId;
  90.     BYTE byteReason;
  91.  
  92.     bsData.Read(playerId);
  93.     bsData.Read(byteReason);
  94.  
  95.     if(playerId < 0 || playerId >= MAX_PLAYERS) return;
  96.  
  97.     playerInfo[playerId].iIsConnected = 0;
  98.     playerInfo[playerId].byteIsNPC = 0;
  99.     //Log("***[QUIT:%d] (%d) %s", byteReason, playerId, playerInfo[playerId].szPlayerName);
  100.     memset(playerInfo[playerId].szPlayerName, 0, 20);  
  101. }
  102.  
  103. void InitGame(RPCParameters *rpcParams)
  104. {
  105.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  106.     int iBitLength = rpcParams->numberOfBitsOfData;
  107.  
  108.     RakNet::BitStream bsInitGame((unsigned char *)Data,(iBitLength/8)+1,false);
  109.  
  110.     PLAYERID MyPlayerID;
  111.     bool bLanMode, bStuntBonus;
  112.     BYTE byteVehicleModels[212];
  113.  
  114.     bool m_bZoneNames, m_bUseCJWalk, m_bAllowWeapons, m_bLimitGlobalChatRadius;
  115.     float m_fGlobalChatRadius, m_fNameTagDrawDistance;
  116.     bool m_bDisableEnterExits, m_bNameTagLOS, m_bManualVehicleEngineAndLight;
  117.     bool m_bShowPlayerTags;
  118.     int m_iShowPlayerMarkers;
  119.     BYTE m_byteWorldTime, m_byteWeather;
  120.     float m_fGravity;
  121.     int m_iDeathDropMoney;
  122.     bool m_bInstagib;
  123.  
  124.     bsInitGame.ReadCompressed(m_bZoneNames);
  125.     bsInitGame.ReadCompressed(m_bUseCJWalk);
  126.     bsInitGame.ReadCompressed(m_bAllowWeapons);
  127.     bsInitGame.ReadCompressed(m_bLimitGlobalChatRadius);
  128.     bsInitGame.Read(m_fGlobalChatRadius);
  129.     bsInitGame.ReadCompressed(bStuntBonus);
  130.     bsInitGame.Read(m_fNameTagDrawDistance);
  131.     bsInitGame.ReadCompressed(m_bDisableEnterExits);
  132.     bsInitGame.ReadCompressed(m_bNameTagLOS);
  133.     bsInitGame.ReadCompressed(m_bManualVehicleEngineAndLight); //
  134.     bsInitGame.Read(iSpawnsAvailable);
  135.     bsInitGame.Read(MyPlayerID);
  136.     bsInitGame.ReadCompressed(m_bShowPlayerTags);
  137.     bsInitGame.Read(m_iShowPlayerMarkers);
  138.     bsInitGame.Read(m_byteWorldTime);
  139.     bsInitGame.Read(m_byteWeather);
  140.     bsInitGame.Read(m_fGravity);
  141.     bsInitGame.ReadCompressed(bLanMode);
  142.     bsInitGame.Read(m_iDeathDropMoney);
  143.     bsInitGame.ReadCompressed(m_bInstagib);
  144.  
  145.     // Server's send rate restrictions
  146.     if(!settings.uiForceCustomSendRates)
  147.     {
  148.         bsInitGame.Read(iNetModeNormalOnfootSendRate);
  149.         bsInitGame.Read(iNetModeNormalIncarSendRate);
  150.         bsInitGame.Read(iNetModeFiringSendRate);
  151.         bsInitGame.Read(iNetModeSendMultiplier);
  152.     }
  153.     else
  154.         bsInitGame.SetReadOffset(bsInitGame.GetReadOffset() + 4*32);
  155.  
  156.     bsInitGame.Read(m_bLagCompensation);
  157.  
  158.     BYTE unk;
  159.     bsInitGame.Read(unk);
  160.     bsInitGame.Read(unk);
  161.     bsInitGame.Read(unk);
  162.  
  163.     BYTE byteStrLen;
  164.     bsInitGame.Read(byteStrLen);
  165.     if(byteStrLen)
  166.     {
  167.         memset(g_szHostName,0,sizeof(g_szHostName));
  168.         bsInitGame.Read(g_szHostName, byteStrLen);
  169.     }
  170.     g_szHostName[byteStrLen] = '\0';
  171.  
  172.     bsInitGame.Read((char *)&byteVehicleModels[0],212);
  173.  
  174.     g_myPlayerID = MyPlayerID;
  175.  
  176.     char szTitle[64];
  177.     if(settings.iConsole)
  178.     {
  179.         sprintf(szTitle, "%s (%d) - %.16s - RakSAMP %s", g_szNickName, g_myPlayerID, g_szHostName, RAKSAMP_VERSION);
  180.         SetConsoleTitle(szTitle);
  181.         Log("Connected to %.64s\n", g_szHostName);
  182.     }
  183.     else
  184.     {
  185.         sprintf(szTitle, "%s (%d) - RakSAMP %s", g_szNickName, g_myPlayerID, RAKSAMP_VERSION);
  186.         SetWindowText(hwnd, szTitle);
  187.         Log("Connected to %.64s", g_szHostName);
  188.     }
  189.  
  190.     iGameInited = 1;
  191. }
  192.  
  193. void WorldPlayerAdd(RPCParameters *rpcParams)
  194. {
  195.     if(!iGameInited) return;
  196.  
  197.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  198.     int iBitLength = rpcParams->numberOfBitsOfData;
  199.  
  200.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  201.  
  202.     PLAYERID playerId;
  203.     BYTE byteFightingStyle=4;
  204.     BYTE byteTeam=0;
  205.     int iSkin=0;
  206.     float vecPos[3];
  207.     float fRotation=0;
  208.     DWORD dwColor=0;
  209.  
  210.     bsData.Read(playerId);
  211.     bsData.Read(byteTeam);
  212.     bsData.Read(iSkin);
  213.     bsData.Read(vecPos[0]);
  214.     bsData.Read(vecPos[1]);
  215.     bsData.Read(vecPos[2]);
  216.     bsData.Read(fRotation);
  217.     bsData.Read(dwColor);
  218.     bsData.Read(byteFightingStyle);
  219.  
  220.     if(playerId < 0 || playerId >= MAX_PLAYERS) return;
  221.  
  222.     playerInfo[playerId].iIsStreamedIn = 1;
  223.     playerInfo[playerId].onfootData.vecPos[0] =
  224.     playerInfo[playerId].incarData.vecPos[0] = vecPos[0];
  225.     playerInfo[playerId].onfootData.vecPos[1] =
  226.     playerInfo[playerId].incarData.vecPos[1] = vecPos[1];
  227.     playerInfo[playerId].onfootData.vecPos[2] =
  228.     playerInfo[playerId].incarData.vecPos[2] = vecPos[2];
  229.  
  230.     //Log("[WORLD ADD] Player [%d]", playerId);
  231. }
  232.  
  233. void WorldPlayerDeath(RPCParameters *rpcParams)
  234. {
  235.     if(!iGameInited) return;
  236.  
  237.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  238.     int iBitLength = rpcParams->numberOfBitsOfData;
  239.  
  240.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  241.  
  242.     PLAYERID playerId;
  243.     bsData.Read(playerId);
  244.  
  245.     if(playerId < 0 || playerId >= MAX_PLAYERS) return;
  246.  
  247.     //Log("[PLAYER_DEATH] %d", playerId);
  248. }
  249.  
  250. void WorldPlayerRemove(RPCParameters *rpcParams)
  251. {
  252.     if(!iGameInited) return;
  253.  
  254.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  255.     int iBitLength = rpcParams->numberOfBitsOfData;
  256.  
  257.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  258.  
  259.     PLAYERID playerId=0;
  260.     bsData.Read(playerId);
  261.  
  262.     if(playerId < 0 || playerId >= MAX_PLAYERS) return;
  263.  
  264.     playerInfo[playerId].iIsStreamedIn = 0;
  265.     playerInfo[playerId].incarData.vecPos[0] = 0.0f;
  266.     playerInfo[playerId].incarData.vecPos[1] = 0.0f;
  267.     playerInfo[playerId].incarData.vecPos[2] = 0.0f;
  268.  
  269.     //Log("[PLAYER_REMOVE] %d", playerId);
  270. }
  271.  
  272. void WorldVehicleAdd(RPCParameters *rpcParams)
  273. {
  274.     if(!iGameInited) return;
  275.  
  276.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  277.     int iBitLength = rpcParams->numberOfBitsOfData;
  278.  
  279.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  280.  
  281.     NEW_VEHICLE NewVehicle;
  282.  
  283.     bsData.Read((char *)&NewVehicle,sizeof(NEW_VEHICLE));
  284.  
  285.     if(NewVehicle.VehicleId < 0 || NewVehicle.VehicleId >= MAX_VEHICLES) return;
  286.  
  287.     vehiclePool[NewVehicle.VehicleId].iDoesExist = 1;
  288.     vehiclePool[NewVehicle.VehicleId].fPos[0] = NewVehicle.vecPos[0];
  289.     vehiclePool[NewVehicle.VehicleId].fPos[1] = NewVehicle.vecPos[1];
  290.     vehiclePool[NewVehicle.VehicleId].fPos[2] = NewVehicle.vecPos[2];
  291.     vehiclePool[NewVehicle.VehicleId].iModelID = NewVehicle.iVehicleType;
  292.  
  293.     //Log("[VEHICLE_ADD:%d] ModelID: %d, Position: %0.2f, %0.2f, %0.2f",
  294.     //  NewVehicle.VehicleId, NewVehicle.iVehicleType, NewVehicle.vecPos[0], NewVehicle.vecPos[1], NewVehicle.vecPos[2]);
  295. }
  296.  
  297. void WorldVehicleRemove(RPCParameters *rpcParams)
  298. {
  299.     if(!iGameInited) return;
  300.  
  301.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  302.     int iBitLength = rpcParams->numberOfBitsOfData;
  303.  
  304.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  305.  
  306.     VEHICLEID VehicleID;
  307.  
  308.     bsData.Read(VehicleID);
  309.  
  310.     if(VehicleID < 0 || VehicleID >= MAX_VEHICLES) return;
  311.  
  312.     vehiclePool[VehicleID].iDoesExist = 0;
  313.     vehiclePool[VehicleID].fPos[0] = 0.0f;
  314.     vehiclePool[VehicleID].fPos[1] = 0.0f;
  315.     vehiclePool[VehicleID].fPos[2] = 0.0f;
  316.  
  317.     //Log("[VEHICLE_REMOVE] %d", VehicleID);
  318. }
  319.  
  320. void ConnectionRejected(RPCParameters *rpcParams)
  321. {
  322.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  323.     int iBitLength = rpcParams->numberOfBitsOfData;
  324.  
  325.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  326.     BYTE byteRejectReason;
  327.  
  328.     bsData.Read(byteRejectReason);
  329.  
  330.     if(byteRejectReason==REJECT_REASON_BAD_VERSION)
  331.     {
  332.         Log("[RAKSAMP] Bad SA-MP version.");
  333.     }
  334.     else if(byteRejectReason==REJECT_REASON_BAD_NICKNAME)
  335.     {
  336.         char szNewNick[32], randgen[4];
  337.  
  338.         iGettingNewName = true;
  339.  
  340.         gen_random(randgen, 4);
  341.         sprintf(szNewNick, "%s_%s", g_szNickName, randgen);
  342.  
  343.         Log("[RAKSAMP] Bad nickname. Changing name to %s", szNewNick);
  344.  
  345.         strcpy(g_szNickName, szNewNick);
  346.         resetPools(1, 0);
  347.     }
  348.     else if(byteRejectReason==REJECT_REASON_BAD_MOD)
  349.     {
  350.         Log("[RAKSAMP] Bad mod version.");
  351.     }
  352.     else if(byteRejectReason==REJECT_REASON_BAD_PLAYERID)
  353.     {
  354.         Log("[RAKSAMP] Bad player ID.");
  355.     }
  356.     else
  357.         Log("ConnectionRejected: unknown");
  358. }
  359.  
  360.  
  361. void ClientMessage(RPCParameters *rpcParams)
  362. {
  363.     //if(!iGameInited) return;
  364.  
  365.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  366.     int iBitLength = rpcParams->numberOfBitsOfData;
  367.  
  368.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  369.     DWORD dwStrLen, dwColor;
  370.     char szMsg[257];
  371.     memset(szMsg, 0, 257);
  372.  
  373.     bsData.Read(dwColor);
  374.     bsData.Read(dwStrLen);
  375.     if(dwStrLen > 256) return;
  376.  
  377.     bsData.Read(szMsg, dwStrLen);
  378.     szMsg[dwStrLen] = 0;
  379.  
  380.     if(settings.iFind)
  381.     {
  382.         for(int i = 0; i < MAX_FIND_ITEMS; i++)
  383.         {
  384.             if(!settings.findItems[i].iExists)
  385.                 continue;
  386.  
  387.             if(strstr(szMsg, settings.findItems[i].szFind))
  388.                 if (settings.findItems[i].szSay[0] != 0x00) {
  389.                     sendChat(settings.findItems[i].szSay);
  390.                 }
  391.                    
  392.         }
  393.     }
  394.  
  395.     char szNonColorEmbeddedMsg[257];
  396.     int iNonColorEmbeddedMsgLen = 0;
  397.  
  398.     for (size_t pos = 0; pos < strlen(szMsg) && szMsg[pos] != '\0'; pos++)
  399.     {
  400.         if (!((*(unsigned char*)(&szMsg[pos]) - 32) >= 0 && (*(unsigned char*)(&szMsg[pos]) - 32) < 224))
  401.             continue;
  402.  
  403.         if(pos+7 < strlen(szMsg))
  404.         {
  405.             if (szMsg[pos] == '{' && szMsg[pos+7] == '}')
  406.             {
  407.                 pos += 7;
  408.                 continue;
  409.             }
  410.         }
  411.  
  412.         szNonColorEmbeddedMsg[iNonColorEmbeddedMsgLen] = szMsg[pos];
  413.         iNonColorEmbeddedMsgLen++;
  414.     }
  415.  
  416.     szNonColorEmbeddedMsg[iNonColorEmbeddedMsgLen] = 0;
  417.  
  418.     Log("[CMSG] %s", szNonColorEmbeddedMsg);
  419. }
  420.  
  421. // copied from https://github.com/Dondor17/WinINet---Simple-GET-POST-request
  422. std::string HttpRequest(std::string site, std::string param, int port) {
  423.     HINTERNET hInternet = InternetOpenW(L"YourUserAgent", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); //you should perhaps edit your useragent ? :p
  424.  
  425.     if (hInternet == NULL)
  426.     {
  427.         return "InternetOpenW failed(hInternet): " + GetLastError();
  428.     }
  429.     else
  430.     {
  431.         std::wstring widestr;
  432.         for (int i = 0; i < site.length(); ++i)
  433.         {
  434.             widestr += wchar_t(site[i]);
  435.         }
  436.         const wchar_t* site_name = widestr.c_str();
  437.  
  438.         std::wstring widestr2;
  439.         for (int i = 0; i < param.length(); ++i)
  440.         {
  441.             widestr2 += wchar_t(param[i]);
  442.         }
  443.         const wchar_t* site_param = widestr2.c_str();
  444.  
  445.         // We need to convert str to const wchar_t as the args require!
  446.  
  447.         HINTERNET hConnect = InternetConnectW(hInternet, site_name, port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL);
  448.  
  449.         if (hConnect == NULL)
  450.         {
  451.             return "InternetConnectW failed(hConnect == NULL): " + GetLastError();
  452.         }
  453.         else
  454.         {
  455.             const wchar_t* parrAcceptTypes[] = { L"text/*", NULL }; // accepted types. We'll choose text.
  456.  
  457.             HINTERNET hRequest = HttpOpenRequestW(hConnect, L"GET", site_param, NULL, NULL, parrAcceptTypes, 0, 0);
  458.  
  459.             if (hRequest == NULL)
  460.             {
  461.                 return "HttpOpenRequestW failed(hRequest == NULL): " + GetLastError();
  462.             }
  463.             else
  464.             {
  465.                 BOOL bRequestSent = HttpSendRequestW(hRequest, NULL, 0, NULL, 0);
  466.  
  467.                 if (!bRequestSent)
  468.                 {
  469.                     return "!bRequestSent    HttpSendRequestW failed with error code " + GetLastError();
  470.                 }
  471.                 else
  472.                 {
  473.                     std::string strResponse;
  474.                     const int nBuffSize = 1024;
  475.                     char buff[nBuffSize];
  476.  
  477.                     BOOL bKeepReading = true;
  478.                     DWORD dwBytesRead = -1;
  479.  
  480.                     while (bKeepReading && dwBytesRead != 0)
  481.                     {
  482.                         bKeepReading = InternetReadFile(hRequest, buff, nBuffSize, &dwBytesRead);
  483.                         strResponse.append(buff, dwBytesRead);
  484.                     }
  485.                     return strResponse;
  486.                 }
  487.                 InternetCloseHandle(hRequest);
  488.             }
  489.             InternetCloseHandle(hConnect);
  490.         }
  491.         InternetCloseHandle(hInternet);
  492.     }
  493. }
  494.  
  495. void Chat(RPCParameters *rpcParams)
  496. {
  497.     if(!iGameInited) return;
  498.  
  499.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  500.     int iBitLength = rpcParams->numberOfBitsOfData;
  501.     PlayerID sender = rpcParams->sender;
  502.  
  503.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  504.     PLAYERID playerId;
  505.     BYTE byteTextLen;
  506.  
  507.     unsigned char szText[256];
  508.     memset(szText, 0, 256);
  509.  
  510.     bsData.Read(playerId);
  511.     bsData.Read(byteTextLen);
  512.     bsData.Read((char*)szText, byteTextLen);
  513.     szText[byteTextLen] = 0;
  514.  
  515.     if(playerId < 0 || playerId >= MAX_PLAYERS)
  516.         return;
  517.  
  518.     if(imitateID == playerId)
  519.         sendChat((char *)szText);
  520.  
  521.     Log("[CHAT] %s: %s", playerInfo[playerId].szPlayerName, szText);
  522.  
  523.     //std::string response = "Response: " + HttpRequest("127.0.0.1", (char*)szText, 8000);
  524.     char request_content[300] = { 0 };
  525.     sprintf(request_content, "%s: %s", playerInfo[playerId].szPlayerName, szText);
  526.     std::string response = HttpRequest("127.0.0.1", request_content, 7891);
  527.  
  528.     if(settings.iFind)
  529.     {
  530.         for(int i = 0; i < MAX_FIND_ITEMS; i++)
  531.         {
  532.             if(!settings.findItems[i].iExists)
  533.                 continue;
  534.  
  535.             if(strstr((const char *)szText, settings.findItems[i].szFind))
  536.             {
  537.                 if(settings.findItems[i].szSay[0] != 0x00)
  538.                     sendChat(settings.findItems[i].szSay);
  539.             }
  540.         }
  541.     }
  542.  
  543.  
  544. }
  545.  
  546. void UpdateScoresPingsIPs(RPCParameters *rpcParams)
  547. {
  548.     if(!iGameInited) return;
  549.  
  550.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  551.     int iBitLength = rpcParams->numberOfBitsOfData;
  552.  
  553.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  554.  
  555.     PLAYERID playerId;
  556.     int iPlayerScore;
  557.     DWORD dwPlayerPing;
  558.  
  559.     for(PLAYERID i=0; i<(iBitLength/8)/9; i++)
  560.     {
  561.         bsData.Read(playerId);
  562.         bsData.Read(iPlayerScore);
  563.         bsData.Read(dwPlayerPing);
  564.  
  565.         if(playerId < 0 || playerId >= MAX_PLAYERS)
  566.             continue;
  567.  
  568.         playerInfo[playerId].iScore = iPlayerScore;
  569.         playerInfo[playerId].dwPing = dwPlayerPing;
  570.     }
  571. }
  572.  
  573. void SetCheckpoint(RPCParameters *rpcParams)
  574. {
  575.     if(!iGameInited) return;
  576.  
  577.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  578.     int iBitLength = rpcParams->numberOfBitsOfData;
  579.  
  580.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  581.  
  582.     bsData.Read(settings.CurrentCheckpoint.fPosition[0]);
  583.     bsData.Read(settings.CurrentCheckpoint.fPosition[1]);
  584.     bsData.Read(settings.CurrentCheckpoint.fPosition[2]);
  585.     bsData.Read(settings.CurrentCheckpoint.fSize);
  586.  
  587.     settings.CurrentCheckpoint.bActive = true;
  588.  
  589.     char SetCheckpointAlert[256];
  590.     sprintf_s(SetCheckpointAlert, 256, "[CP] Checkpoint set to %.2f %.2f %.2f position. (size: %.2f)", settings.CurrentCheckpoint.fPosition[0], settings.CurrentCheckpoint.fPosition[1], settings.CurrentCheckpoint.fPosition[2], settings.CurrentCheckpoint.fSize);
  591.     Log(SetCheckpointAlert);
  592. }
  593.  
  594. void DisableCheckpoint(RPCParameters *rpcParams)
  595. {
  596.     if(!iGameInited) return;
  597.  
  598.     settings.CurrentCheckpoint.bActive = false;
  599.  
  600.     Log("[CP] Current checkpoint disabled.");
  601. }
  602.  
  603. void Pickup(RPCParameters *rpcParams)
  604. {
  605.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  606.     int iBitLength = rpcParams->numberOfBitsOfData;
  607.  
  608.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  609.  
  610.     int PickupID;
  611.     PICKUP Pickup;
  612.  
  613.     bsData.Read(PickupID);
  614.     bsData.Read((PCHAR)&Pickup, sizeof(PICKUP));
  615.  
  616.     if(settings.uiPickupsLogging != 0)
  617.     {
  618.         char szCreatePickupAlert[256];
  619.         sprintf_s(szCreatePickupAlert, sizeof(szCreatePickupAlert), "[CREATEPICKUP] ID: %d | Model: %d | Type: %d | X: %.2f | Y: %.2f | Z: %.2f", PickupID, Pickup.iModel, Pickup.iType, Pickup.fX, Pickup.fY, Pickup.fZ);
  620.         Log(szCreatePickupAlert);
  621.     }
  622. }
  623.  
  624. void DestroyPickup(RPCParameters *rpcParams)
  625. {
  626.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  627.     int iBitLength = rpcParams->numberOfBitsOfData;
  628.  
  629.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  630.  
  631.     int PickupID;
  632.  
  633.     bsData.Read(PickupID);
  634.  
  635.     if(settings.uiPickupsLogging != 0)
  636.     {
  637.         Log("[DESTROYPICKUP] %d", PickupID);
  638.     }
  639. }
  640.  
  641. void RequestClass(RPCParameters *rpcParams)
  642. {
  643.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  644.     int iBitLength = rpcParams->numberOfBitsOfData;
  645.  
  646.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  647.  
  648.     BYTE byteRequestOutcome = 0;
  649.  
  650.     bsData.Read(byteRequestOutcome);
  651.  
  652.     if(byteRequestOutcome)
  653.     {
  654.         bsData.Read((PCHAR)&SpawnInfo,sizeof(PLAYER_SPAWN_INFO));
  655.  
  656.         iLocalPlayerSkin = SpawnInfo.iSkin;
  657.     }
  658. }
  659.  
  660. void ScrInitMenu(RPCParameters *rpcParams)
  661. {
  662.     if(!iGameInited) return;
  663.  
  664.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  665.     int iBitLength = rpcParams->numberOfBitsOfData;
  666.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  667.  
  668.     memset(&GTAMenu, 0, sizeof(struct stGTAMenu));
  669.  
  670.     BYTE byteMenuID;
  671.     BOOL bColumns; // 0 = 1, 1 = 2
  672.     CHAR cText[MAX_MENU_LINE];
  673.     float fX;
  674.     float fY;
  675.     float fCol1;
  676.     float fCol2 = 0.0;
  677.     MENU_INT MenuInteraction;
  678.  
  679.     bsData.Read(byteMenuID);
  680.     bsData.Read(bColumns);
  681.     bsData.Read(cText, MAX_MENU_LINE);
  682.     bsData.Read(fX);
  683.     bsData.Read(fY);
  684.     bsData.Read(fCol1);
  685.     if (bColumns) bsData.Read(fCol2);
  686.     bsData.Read(MenuInteraction.bMenu);
  687.     for (BYTE i = 0; i < MAX_MENU_ITEMS; i++)
  688.         bsData.Read(MenuInteraction.bRow[i]);
  689.  
  690.     Log("[MENU] %s", cText);
  691.     strcpy(GTAMenu.szTitle, cText);
  692.  
  693.     BYTE byteColCount;
  694.     bsData.Read(cText, MAX_MENU_LINE);
  695.     Log("[MENU] %s", cText);
  696.     strcpy(GTAMenu.szSeparator, cText);
  697.  
  698.     bsData.Read(byteColCount);
  699.     GTAMenu.byteColCount = byteColCount;
  700.     for (BYTE i = 0; i < byteColCount; i++)
  701.     {
  702.         bsData.Read(cText, MAX_MENU_LINE);
  703.         Log("[MENU:%d] %s", i, cText);
  704.         strcpy(GTAMenu.szColumnContent[i], cText);
  705.     }
  706.  
  707.     if (bColumns)
  708.     {
  709.         bsData.Read(cText, MAX_MENU_LINE);
  710.         //Log("4: %s", cText);
  711.  
  712.         bsData.Read(byteColCount);
  713.         for (BYTE i = 0; i < byteColCount; i++)
  714.         {
  715.             bsData.Read(cText, MAX_MENU_LINE);
  716.             //Log("5: %d %s", i, cText);
  717.         }
  718.     }
  719. }
  720.  
  721. LRESULT CALLBACK SAMPDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  722. {
  723.     HWND hwndEditBox = GetDlgItem(hwnd, IDE_INPUTEDIT);
  724.     HWND hwndListBox = GetDlgItem(hwnd, IDL_LISTBOX);
  725.     WORD wSelection;
  726.     char szResponse[257];
  727.  
  728.     switch(msg)
  729.     {
  730.     case WM_CREATE:
  731.         {
  732.             HINSTANCE hInst = GetModuleHandle(NULL);
  733.             switch(sampDialog.bDialogStyle)
  734.             {
  735.                 case DIALOG_STYLE_MSGBOX:
  736.                     if(sampDialog.bButton1Len == 0 && sampDialog.bButton2Len == 0)
  737.                     {
  738.                         // no butans, no badi cana cross it
  739.                     }
  740.                     if(sampDialog.bButton1Len != 0 && sampDialog.bButton2Len == 0) // a butan
  741.                     {
  742.                         CreateWindowEx(NULL, "BUTTON", sampDialog.szButton1, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
  743.                             150, 230, 100, 24, hwnd, (HMENU)IDB_BUTTON1, hInst, NULL);
  744.                     }
  745.                     else if(sampDialog.bButton1Len != 0 && sampDialog.bButton2Len != 0) // tu butans
  746.                     {
  747.                         CreateWindowEx(NULL, "BUTTON", sampDialog.szButton1, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
  748.                             100, 230, 100, 24, hwnd, (HMENU)IDB_BUTTON1, hInst, NULL);
  749.  
  750.                         CreateWindowEx(NULL, "BUTTON", sampDialog.szButton2, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
  751.                             210, 230, 100, 24, hwnd, (HMENU)IDB_BUTTON2, hInst, NULL);
  752.                     }
  753.  
  754.                     break;
  755.  
  756.                 case DIALOG_STYLE_INPUT:
  757.                 case DIALOG_STYLE_PASSWORD:
  758.                     {
  759.                         CreateWindowEx(NULL, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER,
  760.                             50, 200, 300, 24, hwnd, (HMENU)IDE_INPUTEDIT, hInst, NULL);
  761.  
  762.                         CreateWindowEx(NULL, "BUTTON", sampDialog.szButton1, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
  763.                             100, 230, 100, 24, hwnd, (HMENU)IDB_BUTTON1, hInst, NULL);
  764.  
  765.                         CreateWindowEx(NULL, "BUTTON", sampDialog.szButton2, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
  766.                             210, 230, 100, 24, hwnd, (HMENU)IDB_BUTTON2, hInst, NULL);
  767.                     }
  768.  
  769.                     break;
  770.  
  771.                 case DIALOG_STYLE_LIST:
  772.                     {
  773.                         hwndListBox = CreateWindowEx(NULL, "LISTBOX", "",
  774.                             WS_CHILD | WS_VISIBLE | LBS_NOTIFY | WS_VSCROLL | WS_BORDER | LBS_HASSTRINGS,
  775.                             10, 10, 375, 225, hwnd, (HMENU)IDL_LISTBOX, hInst, NULL);
  776.  
  777.                         char *szInfoTemp = strtok(sampDialog.szInfo, "\n");
  778.                         while(szInfoTemp != NULL)
  779.                         {
  780.                             int id = SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)szInfoTemp);
  781.                             SendMessage(hwndListBox, LB_SETITEMDATA, id, (LPARAM)id);
  782.  
  783.                             szInfoTemp = strtok(NULL, "\n");
  784.                         }
  785.                        
  786.                         CreateWindowEx(NULL, "BUTTON", sampDialog.szButton1, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
  787.                             100, 230, 100, 24, hwnd, (HMENU)IDB_BUTTON1, hInst, NULL);
  788.  
  789.                         CreateWindowEx(NULL, "BUTTON", sampDialog.szButton2, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
  790.                             210, 230, 100, 24, hwnd, (HMENU)IDB_BUTTON2, hInst, NULL);
  791.                     }
  792.  
  793.                     break;
  794.             }
  795.  
  796.         }
  797.         break;
  798.  
  799.     case WM_COMMAND:
  800.         {
  801.             switch(LOWORD(wParam))
  802.             {
  803.                 case IDB_BUTTON1:
  804.                     if(sampDialog.bDialogStyle == DIALOG_STYLE_LIST)
  805.                     {
  806.                         wSelection = (WORD)SendMessage(hwndListBox, LB_GETCURSEL, 0, 0);
  807.                         if(wSelection != (WORD)-1)
  808.                         {
  809.                             SendMessage(hwndListBox, LB_GETTEXT, wSelection, (LPARAM)szResponse);
  810.                             sendDialogResponse(sampDialog.wDialogID, 1, 0, szResponse);
  811.                             PostQuitMessage(0);
  812.                         }
  813.                         break;
  814.                     }
  815.  
  816.                     GetWindowText(hwndEditBox, szResponse, 257);
  817.                     sendDialogResponse(sampDialog.wDialogID, 1, 0, szResponse);
  818.                     PostQuitMessage(0);
  819.                     break;
  820.  
  821.                 case IDB_BUTTON2:
  822.                     GetWindowText(hwndEditBox, szResponse, 257);
  823.                     sendDialogResponse(sampDialog.wDialogID, 0, 0, szResponse);
  824.                     PostQuitMessage(0);
  825.                     break;
  826.             }
  827.         }
  828.  
  829.         break;
  830.  
  831.     case WM_PAINT:
  832.         {
  833.             if(sampDialog.bDialogStyle != DIALOG_STYLE_LIST)
  834.             {
  835.                 RECT rect;
  836.                 GetClientRect(hwnd, &rect);
  837.                 PAINTSTRUCT ps;
  838.                 HDC hdc = BeginPaint(hwnd, &ps);
  839.                 HDC hdcMem = CreateCompatibleDC(hdc);
  840.                 SelectObject(hdc, hSAMPDlgFont);
  841.                 DrawText(hdc, sampDialog.szInfo, strlen(sampDialog.szInfo), &rect, DT_WORDBREAK | DT_EXPANDTABS);
  842.                 DeleteDC(hdcMem);
  843.                 EndPaint(hwnd, &ps);
  844.             }
  845.             else
  846.             {
  847.                 RECT rect;
  848.                 GetClientRect(hwnd, &rect);
  849.                 PAINTSTRUCT ps;
  850.                 HDC hdc = BeginPaint(hwnd, &ps);
  851.                 HDC hdcMem = CreateCompatibleDC(hdc);
  852.                 DeleteDC(hdcMem);
  853.                 EndPaint(hwnd, &ps);
  854.             }
  855.         }
  856.         break;
  857.  
  858.     case WM_DESTROY:
  859.         PostQuitMessage(0);
  860.         break;
  861.  
  862.     default:
  863.         return DefWindowProc(hwnd, msg, wParam, lParam);
  864.     }
  865.  
  866.     return 0;
  867. }
  868.  
  869. DWORD WINAPI DialogBoxThread(PVOID)
  870. {
  871.     WNDCLASSEX wc;
  872.     MSG Msg;
  873.     HINSTANCE hInstance = GetModuleHandle(NULL);
  874.     RECT conRect;
  875.     if(settings.iConsole)
  876.         GetWindowRect(GetConsoleWindow(), &conRect);
  877.     else
  878.         GetWindowRect(hwnd, &conRect);
  879.  
  880.     wc.cbSize        = sizeof(WNDCLASSEX);
  881.     wc.style         = 0;
  882.     wc.lpfnWndProc   = SAMPDlgProc;
  883.     wc.cbClsExtra    = 0;
  884.     wc.cbWndExtra    = 0;
  885.     wc.hInstance     = hInstance;
  886.     wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  887.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  888.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  889.     wc.lpszMenuName  = NULL;
  890.     wc.lpszClassName = "dlgWndClass";
  891.     wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
  892.  
  893.     if(!RegisterClassEx(&wc))
  894.         return 0;
  895.  
  896.     hSAMPDlgFont = CreateFont(18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Tahoma");
  897.  
  898.     hwndSAMPDlg = CreateWindowEx(NULL, "dlgWndClass", sampDialog.szTitle, NULL,
  899.         conRect.right, conRect.top, 400, 300, NULL, NULL, hInstance, NULL);
  900.  
  901.     if(hwndSAMPDlg == NULL)
  902.         return 0;
  903.  
  904.     ShowWindow(hwndSAMPDlg, 1);
  905.     UpdateWindow(hwndSAMPDlg);
  906.     SetForegroundWindow(hwndSAMPDlg);
  907.  
  908.     while(GetMessage(&Msg, NULL, 0, 0) > 0)
  909.     {
  910.         TranslateMessage(&Msg);
  911.         DispatchMessage(&Msg);
  912.     }
  913.  
  914.     sampDialog.iIsActive = 0;
  915.     SendMessage(hwndSAMPDlg, WM_DESTROY, 0, 0);
  916.     DestroyWindow(hwndSAMPDlg);
  917.     UnregisterClass("dlgWndClass", GetModuleHandle(NULL));
  918.     hSAMPDlgFont = NULL;
  919.     TerminateThread(hDlgThread, 0);
  920.  
  921.     return 0;
  922. }
  923.  
  924. void ScrDialogBox(RPCParameters *rpcParams)
  925. {
  926.     if(!iGameInited) return;
  927.  
  928.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  929.     int iBitLength = rpcParams->numberOfBitsOfData;
  930.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  931.  
  932.     bsData.Read(sampDialog.wDialogID);
  933.     bsData.Read(sampDialog.bDialogStyle);
  934.  
  935.     bsData.Read(sampDialog.bTitleLength);
  936.     bsData.Read(sampDialog.szTitle, sampDialog.bTitleLength);
  937.     sampDialog.szTitle[sampDialog.bTitleLength] = 0;
  938.  
  939.     bsData.Read(sampDialog.bButton1Len);
  940.     bsData.Read(sampDialog.szButton1, sampDialog.bButton1Len);
  941.     sampDialog.szButton1[sampDialog.bButton1Len] = 0;
  942.  
  943.     bsData.Read(sampDialog.bButton2Len);
  944.     bsData.Read(sampDialog.szButton2, sampDialog.bButton2Len);
  945.     sampDialog.szButton2[sampDialog.bButton2Len] = 0;
  946.  
  947.     stringCompressor->DecodeString(sampDialog.szInfo, 256, &bsData);
  948.  
  949.     switch(sampDialog.bDialogStyle)
  950.     {
  951.         case DIALOG_STYLE_MSGBOX:
  952.         case DIALOG_STYLE_INPUT:
  953.         case DIALOG_STYLE_LIST:
  954.         case DIALOG_STYLE_PASSWORD:
  955.             if(!sampDialog.iIsActive)
  956.             {
  957.                 sampDialog.iIsActive = 1;
  958.                 hDlgThread = CreateThread(NULL, 0, DialogBoxThread, NULL, 0, NULL);
  959.             }
  960.         break;
  961.  
  962.         default:
  963.             if(sampDialog.iIsActive)
  964.             {
  965.                 sampDialog.iIsActive = 0;
  966.                 SendMessage(hwndSAMPDlg, WM_DESTROY, 0, 0);
  967.                 DestroyWindow(hwndSAMPDlg);
  968.                 UnregisterClass("dlgWndClass", GetModuleHandle(NULL));
  969.                 hSAMPDlgFont = NULL;
  970.                 TerminateThread(hDlgThread, 0);
  971.             }
  972.         break;
  973.     }
  974. }
  975.  
  976. void ScrGameText(RPCParameters *rpcParams)
  977. {
  978.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  979.     int iBitLength = rpcParams->numberOfBitsOfData;
  980.  
  981.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  982.     char szMessage[400];
  983.     int iType, iTime, iLength;
  984.  
  985.     bsData.Read(iType);
  986.     bsData.Read(iTime);
  987.     bsData.Read(iLength);
  988.  
  989.     if(iLength > 400) return; // tsk tsk, kye
  990.  
  991.     bsData.Read(szMessage, iLength);
  992.     szMessage[iLength] = '\0';
  993.  
  994.     Log("[GAMETEXT] %s", szMessage);
  995. }
  996.  
  997. void ScrPlayAudioStream(RPCParameters *rpcParams)
  998. {
  999.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1000.     int iBitLength = rpcParams->numberOfBitsOfData;
  1001.  
  1002.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1003.     unsigned char bURLLen;
  1004.     char szURL[256];
  1005.  
  1006.     bsData.Read(bURLLen);
  1007.     bsData.Read(szURL, bURLLen);
  1008.     szURL[bURLLen] = 0;
  1009.  
  1010.     Log("[AUDIO_STREAM] %s", szURL);
  1011. }
  1012.  
  1013. void ScrSetDrunkLevel(RPCParameters *rpcParams)
  1014. {
  1015.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1016.     int iBitLength = rpcParams->numberOfBitsOfData;
  1017.  
  1018.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1019.  
  1020.     bsData.Read(iDrunkLevel);
  1021. }
  1022.  
  1023. void ScrHaveSomeMoney(RPCParameters *rpcParams)
  1024. {
  1025.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1026.     int iBitLength = rpcParams->numberOfBitsOfData;
  1027.  
  1028.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1029.  
  1030.     int iGivenMoney;
  1031.     bsData.Read(iGivenMoney);
  1032.  
  1033.     iMoney += iGivenMoney;
  1034. }
  1035.  
  1036. void ScrResetMoney(RPCParameters *rpcParams)
  1037. {
  1038.     iMoney = 0;
  1039. }
  1040.  
  1041. void ScrSetPlayerPos(RPCParameters *rpcParams)
  1042. {
  1043.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1044.     int iBitLength = rpcParams->numberOfBitsOfData;
  1045.  
  1046.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1047.  
  1048.     if(settings.iNormalModePosForce == 0)
  1049.     {
  1050.         bsData.Read(settings.fNormalModePos[0]);
  1051.         bsData.Read(settings.fNormalModePos[1]);
  1052.         bsData.Read(settings.fNormalModePos[2]);
  1053.     }
  1054. }
  1055.  
  1056. void ScrSetPlayerFacingAngle(RPCParameters *rpcParams)
  1057. {
  1058.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1059.     int iBitLength = rpcParams->numberOfBitsOfData;
  1060.  
  1061.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1062.  
  1063.     if(settings.iNormalModePosForce == 0)
  1064.     {
  1065.         bsData.Read(settings.fNormalModeRot);
  1066.     }
  1067. }
  1068.  
  1069. void ScrSetSpawnInfo(RPCParameters *rpcParams)
  1070. {
  1071.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1072.     int iBitLength = rpcParams->numberOfBitsOfData;
  1073.  
  1074.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1075.  
  1076.     PLAYER_SPAWN_INFO SpawnInfo;
  1077.  
  1078.     bsData.Read((PCHAR)&SpawnInfo, sizeof(PLAYER_SPAWN_INFO));
  1079.  
  1080.     if(settings.iNormalModePosForce == 0)
  1081.     {
  1082.         settings.fNormalModePos[0] = SpawnInfo.vecPos[0];
  1083.         settings.fNormalModePos[1] = SpawnInfo.vecPos[1];
  1084.         settings.fNormalModePos[2] = SpawnInfo.vecPos[2];
  1085.     }
  1086. }
  1087.  
  1088. void ScrSetPlayerHealth(RPCParameters *rpcParams)
  1089. {
  1090.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1091.     int iBitLength = rpcParams->numberOfBitsOfData;
  1092.  
  1093.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1094.  
  1095.     bsData.Read(settings.fPlayerHealth);
  1096. }
  1097.  
  1098. void ScrSetPlayerArmour(RPCParameters *rpcParams)
  1099. {
  1100.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1101.     int iBitLength = rpcParams->numberOfBitsOfData;
  1102.  
  1103.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1104.  
  1105.     bsData.Read(settings.fPlayerArmour);
  1106. }
  1107.  
  1108. void ScrSetPlayerSkin(RPCParameters *rpcParams)
  1109. {
  1110.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1111.     int iBitLength = rpcParams->numberOfBitsOfData;
  1112.  
  1113.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1114.  
  1115.     int iPlayerID;
  1116.     unsigned int uiSkin;
  1117.  
  1118.     bsData.Read(iPlayerID);
  1119.     bsData.Read(uiSkin);
  1120.  
  1121.     if(iPlayerID < 0 || iPlayerID >= MAX_PLAYERS)
  1122.         return;
  1123.  
  1124.     if(iGameInited && g_myPlayerID == iPlayerID)
  1125.         iLocalPlayerSkin = uiSkin;
  1126. }
  1127.  
  1128. void ScrCreateObject(RPCParameters *rpcParams)
  1129. {
  1130.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1131.     int iBitLength = rpcParams->numberOfBitsOfData;
  1132.  
  1133.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1134.  
  1135.     unsigned short ObjectID;
  1136.     bsData.Read(ObjectID);
  1137.  
  1138.     unsigned long ModelID;
  1139.     bsData.Read(ModelID);
  1140.  
  1141.     float vecPos[3];
  1142.     bsData.Read(vecPos[0]);
  1143.     bsData.Read(vecPos[1]);
  1144.     bsData.Read(vecPos[2]);
  1145.  
  1146.     float vecRot[3];
  1147.     bsData.Read(vecRot[0]);
  1148.     bsData.Read(vecRot[1]);
  1149.     bsData.Read(vecRot[2]);
  1150.  
  1151.     float fDrawDistance;
  1152.     bsData.Read(fDrawDistance);
  1153.  
  1154.     if(settings.uiObjectsLogging != 0)
  1155.     {
  1156.         char szCreateObjectAlert[256];
  1157.         sprintf_s(szCreateObjectAlert, sizeof(szCreateObjectAlert), "[OBJECT] %d, %d, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.2f", ObjectID, ModelID, vecPos[0], vecPos[1], vecPos[2], vecRot[0], vecRot[1], vecRot[2], fDrawDistance);
  1158.         Log(szCreateObjectAlert);
  1159.     }
  1160. }
  1161.  
  1162. void ScrCreate3DTextLabel(RPCParameters *rpcParams)
  1163. {
  1164.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1165.     int iBitLength = rpcParams->numberOfBitsOfData;
  1166.  
  1167.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1168.  
  1169.     WORD ID;
  1170.     CHAR Text[256];
  1171.     DWORD dwColor;
  1172.     FLOAT vecPos[3];
  1173.     FLOAT DrawDistance;
  1174.     BYTE UseLOS;
  1175.     WORD PlayerID;
  1176.     WORD VehicleID;
  1177.  
  1178.     bsData.Read((WORD)ID);
  1179.     bsData.Read((DWORD)dwColor);
  1180.     bsData.Read((FLOAT)vecPos[0]);
  1181.     bsData.Read((FLOAT)vecPos[1]);
  1182.     bsData.Read((FLOAT)vecPos[2]);
  1183.     bsData.Read((FLOAT)DrawDistance);
  1184.     bsData.Read((BYTE)UseLOS);
  1185.     bsData.Read((WORD)PlayerID);
  1186.     bsData.Read((WORD)VehicleID);
  1187.  
  1188.     stringCompressor->DecodeString(Text, 256, &bsData);
  1189.  
  1190.     if(settings.uiTextLabelsLogging != 0)
  1191.     {
  1192.         char szCreate3DTextLabelAlert[256];
  1193.         sprintf_s(szCreate3DTextLabelAlert, sizeof(szCreate3DTextLabelAlert), "[TEXTLABEL] %d - %s (%X, %.3f, %.3f, %.3f, %.2f, %i, %d, %d)", ID, Text, dwColor, vecPos[0], vecPos[1], vecPos[2], DrawDistance, UseLOS, PlayerID, VehicleID);
  1194.         Log(szCreate3DTextLabelAlert);
  1195.     }
  1196. }
  1197.  
  1198. void ScrShowTextDraw(RPCParameters *rpcParams)
  1199. {
  1200.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1201.     int iBitLength = rpcParams->numberOfBitsOfData;
  1202.  
  1203.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1204.  
  1205.     WORD wTextID;
  1206.     TEXT_DRAW_TRANSMIT TextDrawTransmit;
  1207.  
  1208.     CHAR cText[1024];
  1209.     unsigned short cTextLen = 0;
  1210.  
  1211.     bsData.Read(wTextID);
  1212.     bsData.Read((PCHAR)&TextDrawTransmit, sizeof(TEXT_DRAW_TRANSMIT));
  1213.     bsData.Read(cTextLen);
  1214.     bsData.Read(cText, cTextLen);
  1215.     cText[cTextLen] = '\0';
  1216.  
  1217.     if(settings.uiTextDrawsLogging != 0)
  1218.         SaveTextDrawData(wTextID, &TextDrawTransmit, cText);
  1219.    
  1220.     if(TextDrawTransmit.byteSelectable)
  1221.         Log("[SELECTABLE-TEXTDRAW] ID: %d, Text: %s.", wTextID, cText);
  1222. }
  1223.  
  1224. void ScrHideTextDraw(RPCParameters *rpcParams)
  1225. {
  1226.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1227.     int iBitLength = rpcParams->numberOfBitsOfData;
  1228.  
  1229.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1230.  
  1231.     WORD wTextID;
  1232.     bsData.Read(wTextID);
  1233.  
  1234.     if(settings.uiTextDrawsLogging != 0)
  1235.         Log("[TEXTDRAW:HIDE] ID: %d.", wTextID);
  1236. }
  1237.  
  1238. void ScrEditTextDraw(RPCParameters *rpcParams)
  1239. {
  1240.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1241.     int iBitLength = rpcParams->numberOfBitsOfData;
  1242.  
  1243.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1244.  
  1245.     WORD wTextID;
  1246.     CHAR cText[1024];
  1247.     unsigned short cTextLen = 0;
  1248.  
  1249.     bsData.Read(wTextID);
  1250.     bsData.Read(cTextLen);
  1251.     bsData.Read(cText, cTextLen);
  1252.     cText[cTextLen] = '\0';
  1253.  
  1254.     if(settings.uiTextDrawsLogging != 0)
  1255.         Log("[TEXTDRAW:EDIT] ID: %d, Text: %s.", wTextID, cText);
  1256. }
  1257.  
  1258. void ScrTogglePlayerSpectating(RPCParameters *rpcParams)
  1259. {
  1260.     PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input);
  1261.     int iBitLength = rpcParams->numberOfBitsOfData;
  1262.  
  1263.     RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false);
  1264.  
  1265.     BOOL bToggle;
  1266.  
  1267.     bsData.Read(bToggle);
  1268.  
  1269.     if(bIsSpectating && !bToggle && !iSpawned)
  1270.     {
  1271.         sampSpawn();
  1272.         iSpawned = 1;
  1273.     }
  1274.  
  1275.     bIsSpectating = bToggle;
  1276. }
  1277.  
  1278. void RegisterRPCs(RakClientInterface *pRakClient)
  1279. {
  1280.     if (pRakClient == ::pRakClient)
  1281.     {
  1282.         // Core RPCs
  1283.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ServerJoin, ServerJoin);
  1284.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ServerQuit, ServerQuit);
  1285.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_InitGame, InitGame);
  1286.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_WorldPlayerAdd, WorldPlayerAdd);
  1287.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_WorldPlayerDeath, WorldPlayerDeath);
  1288.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_WorldPlayerRemove, WorldPlayerRemove);
  1289.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_WorldVehicleAdd, WorldVehicleAdd);
  1290.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_WorldVehicleRemove, WorldVehicleRemove);
  1291.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ConnectionRejected, ConnectionRejected);
  1292.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ClientMessage, ClientMessage);
  1293.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_Chat, Chat);
  1294.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_UpdateScoresPingsIPs, UpdateScoresPingsIPs);
  1295.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_SetCheckpoint, SetCheckpoint);
  1296.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_DisableCheckpoint, DisableCheckpoint);
  1297.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_Pickup, Pickup);
  1298.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_DestroyPickup, DestroyPickup);
  1299.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_RequestClass, RequestClass);
  1300.  
  1301.         // Scripting RPCs
  1302.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrInitMenu, ScrInitMenu);
  1303.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrDialogBox, ScrDialogBox);
  1304.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrDisplayGameText, ScrGameText);
  1305.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_PlayAudioStream, ScrPlayAudioStream);
  1306.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrSetPlayerDrunkLevel, ScrSetDrunkLevel);
  1307.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrHaveSomeMoney, ScrHaveSomeMoney);
  1308.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrResetMoney, ScrResetMoney);
  1309.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrSetPlayerPos, ScrSetPlayerPos);
  1310.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrSetPlayerFacingAngle, ScrSetPlayerFacingAngle);
  1311.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrSetSpawnInfo, ScrSetSpawnInfo);
  1312.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrSetPlayerHealth, ScrSetPlayerHealth);
  1313.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrSetPlayerArmour, ScrSetPlayerArmour);
  1314.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrSetPlayerSkin, ScrSetPlayerSkin);
  1315.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrCreateObject, ScrCreateObject);
  1316.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrCreate3DTextLabel, ScrCreate3DTextLabel);
  1317.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrShowTextDraw, ScrShowTextDraw);
  1318.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrHideTextDraw, ScrHideTextDraw);
  1319.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrEditTextDraw, ScrEditTextDraw);
  1320.         pRakClient->RegisterAsRemoteProcedureCall(&RPC_ScrTogglePlayerSpectating, ScrTogglePlayerSpectating);
  1321.     }
  1322. }
  1323.  
  1324. void UnRegisterRPCs(RakClientInterface * pRakClient)
  1325. {
  1326.     if (pRakClient == ::pRakClient)
  1327.     {
  1328.         // Core RPCs
  1329.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ServerJoin);
  1330.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ServerQuit);
  1331.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_InitGame);
  1332.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_WorldPlayerAdd);
  1333.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_WorldPlayerDeath);
  1334.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_WorldPlayerRemove);
  1335.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_WorldVehicleAdd);
  1336.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_WorldVehicleRemove);
  1337.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ConnectionRejected);
  1338.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ClientMessage);
  1339.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_Chat);
  1340.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_UpdateScoresPingsIPs);
  1341.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_SetCheckpoint);
  1342.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_DisableCheckpoint);
  1343.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_Pickup);
  1344.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_DestroyPickup);
  1345.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_RequestClass);
  1346.  
  1347.         // Scripting RPCs
  1348.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrInitMenu);
  1349.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrDialogBox);
  1350.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrDisplayGameText);
  1351.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_PlayAudioStream);
  1352.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrSetPlayerDrunkLevel);
  1353.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrHaveSomeMoney);
  1354.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrResetMoney);
  1355.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrSetPlayerPos);
  1356.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrSetPlayerFacingAngle);
  1357.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrSetSpawnInfo);
  1358.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrSetPlayerHealth);
  1359.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrSetPlayerArmour);
  1360.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrSetPlayerSkin);
  1361.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrCreateObject);
  1362.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrCreate3DTextLabel);
  1363.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrShowTextDraw);
  1364.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrHideTextDraw);
  1365.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrEditTextDraw);
  1366.         pRakClient->UnregisterAsRemoteProcedureCall(&RPC_ScrTogglePlayerSpectating);
  1367.     }
  1368. }
Advertisement
Add Comment
Please, Sign In to add comment