Advertisement
michalmonday

Updated netrpc.cpp to send http request to localhost

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