Heyho embik :)
Biztos hasznotokra válna, ha tudnátok, hogy a felhasználóitok milyen gépet használnak.
Készítettem egy kis rendszert, amivel elmenthetitek a felhasználók RAM mennyiségét (GB-ban) és CPU sebességét (MHz-ben) az adatbázisba.
Kezdjük a kliens részével.
Végig a UserInterface-ben fogunk doglozni.
Nyisd meg a packet.h-t és keresd meg a
HEADER_CG_MARK_LOGIN = 100,
sort.
Ez elé írd be:
HEADER_CG_SYS_INFO_BY_DISTRAUGHT = 99,
Görgess lejjebb a typedef struct command_mark_login -ig.
Elé tedd be ezt:
struct sys_info_by_distraught
{
BYTE header;
float RAM;
int CPU;
};
A PythonNetworkStream.h-ban keresd meg az alábbi sort:
bool SendSpecial(int nLen, void * pvBuf);
Ez elé írd be:
bool SendSYSInfo();
Niysd meg a PythonNetworkStreamPhaseGame.cpp-t és a
BOOL gs_bEmpireLanuageEnable = TRUE;
sor után add hozzá ezeket:
//SYS INFO BY DISTRAUGHT
#define _WIN32_WINNT 0x0501
float GetRAM()
{
MEMORYSTATUSEX memstat;
memstat.dwLength = sizeof(memstat);
GlobalMemoryStatusEx(&memstat);
return (float)memstat.ullTotalPhys / (1024 * 1024 * 1024);
}
int GetCPUSpeedMHz()
{
char Buffer[MAX_PATH];
unsigned long BufSize = MAX_PATH;
unsigned long ulMHz = MAX_PATH;
HKEY hKey;
long lError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &hKey);
if (lError != ERROR_SUCCESS)
return 0;
RegQueryValueEx(hKey, "~MHz", NULL, NULL, (LPBYTE)&ulMHz, &BufSize);
return ulMHz;
}
bool CPythonNetworkStream::SendSYSInfo()
{
std::ifstream check("sentsys.txt");
if (check.good())
{
int i = 0;
check >> i;
if (i > 0) return false;
}
check.close();
sys_info_by_distraught packet;
packet.header = HEADER_CG_SYS_INFO_BY_DISTRAUGHT;
packet.RAM = GetRAM();
packet.CPU = GetCPUSpeedMHz();
if (!Send(sizeof(packet), &packet))
return false;
std::ofstream save("sentsys.txt");
save << "1";
save.close();
return SendSequence();
}
//SYS INFO END
Nyisd meg a PythonNetworkStreamPhaseLogin.cpp-t és keresd meg a SendLoginPacket függvényt.
Keresd meg ebben a függvényben a
if (!Send(sizeof(LoginPacket), &LoginPacket))
sort és elé írd be ezt:
SendSYSInfo();
Most keresd meg a SendLoginPacketNew függvényt is, majd abban is a
if (!Send(sizeof(LoginPacket), &LoginPacket))
sor elé írd be ezt:
SendSYSInfo();
Fordítsd le a kliens binaryt.
Most jön a szerveroldal.
Nyisd meg a packet.h -t és keresd meg ezt:
HEADER_CG_REFINE = 96,
Ez alá add hozzá:
HEADER_CG_SYS_INFO_BY_DISTRAUGHT = 99,
Keresd meg ezt a sort:
typedef struct SPacketGGSetup
Elé tedd be ezt:
struct sys_info_by_distraught
{
BYTE header;
float RAM;
int CPU;
};
Nyisd meg a packet_info.cpp -t és keress rá:
Set(HEADER_CG_TEXT, sizeof(TPacketCGText), "Text", false);
Add elé:
Set(HEADER_CG_SYS_INFO_BY_DISTRAUGHT, sizeof(sys_info_by_distraught), "SYSInfo", true);
Nyisd meg az input.h fájlt és keresd meg a CInputLogin osztályt.
Ezen belül keresd meg ezt a sort:
virtual int Analyze(LPDESC d, BYTE bHeader, const char * c_pData);
Add alá:
void SaveSYSInfo(const char* data);
Nyisd meg az input_login.cpp-t és keresd meg az Analyze függvényt.
Ezen belül keresd meg a
case HEADER_CG_PONG:
sort és add elé:
case HEADER_CG_SYS_INFO_BY_DISTRAUGHT:
SaveSYSInfo(c_pData);
break;
Keresd meg a
int CInputLogin::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
sort és add elé:
void CInputLogin::SaveSYSInfo(const char* data)
{
sys_info_by_distraught* packet = (sys_info_by_distraught*)data;
DBManager::instance().Query("INSERT INTO system_info(ram, cpu, sent_at) VALUES (%f, %d, CURDATE());", packet->RAM, packet->CPU);
return;
}
Fordítsd le a game-et.
Egy adatbáziskezelővel csatlakozz a mysql-re és menj bele a player adatbázisba.
Itt futtasd le az alábbi queryt:
DROP TABLE IF EXISTS `system_info`;
CREATE TABLE `system_info` (
`ram` float(12,0) DEFAULT NULL,
`cpu` int(12) DEFAULT NULL,
`sent_at` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Ezután minden felhasználó belépéskor kiküldi a RAM mennyiségét GB-ban és a CPU sebességét MHz-ben.
Ezek az adatok a player adatbázis system_info táblázatában lesznek tárolva. (ram, cpu, mikor küldte el)
Mindenki csak egyszer küldi ki az adatait, ha azt szeretnéd, hogy újra küldjék el a felhasználók, akkor a patcheredbe a a kliens főmappájába tegyél egy sentsys.txt fájlt, aminek a tartalma csak egy 0 legyen.