#include "Klient.h" #include "Spieler.h" #include // Inhalt der Klient Klasse aus Klient.h // Konstruktor Klient::Klient(SSKlientV* klient) : ReferenceCounter() { this->klient = klient; } // Destruktor Klient::~Klient() { if (klient) klient->release(); } // nicht constant void Klient::offline() { klient = (SSKlientV*)klient->release(); } void Klient::online(SSKlientV* zKlient) { if (klient) klient = (SSKlientV*)klient->release(); klient = dynamic_cast(zKlient->getThis()); } void Klient::sendeSpielerNummer(int sNum, double spielZeit) { if (!klient) return; short len = 13; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0; *(int*)(bytes + 9) = sNum; klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeInitSpieler(int anzahl, RCArray< Spieler >* zSpieler, double spielZeit) { if (!klient) return; short len = (short)(13 + 20 * anzahl); char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 1; *(int*)(bytes + 9) = anzahl; for (int i = 0; i < anzahl; i++) { *(int*)(bytes + i * 20 + 13) = zSpieler->z(i)->getSpielerNummer(); *(int*)(bytes + i * 20 + 17) = zSpieler->z(i)->getSpielerTeam(); *(int*)(bytes + i * 20 + 21) = zSpieler->z(i)->getSpielerFarbe(); *(int*)(bytes + i * 20 + 25) = zSpieler->z(i)->getTeamFarbe(); *(int*)(bytes + i * 20 + 29) = zSpieler->z(i)->getAccountId(); } klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeSpielerPosition(Spieler* zSpieler, double spielZeit) { if (!klient) return; short len = 29; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 2; *(int*)(bytes + 9) = zSpieler->getSpielerNummer(); *(double*)(bytes + 13) = zSpieler->getX(); *(double*)(bytes + 21) = zSpieler->getY(); klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeKammeraSize(int br, int hi, double spielZeit) { if (!klient) return; short len = 17; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 3; *(int*)(bytes + 9) = br; *(int*)(bytes + 13) = hi; klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeStart(double spielZeit) { if (!klient) return; short len = 9; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 4; klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeSpielerTod(Spieler* zSpieler, double spielZeit) { if (!klient) return; short len = 13; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 5; *(int*)(bytes + 9) = zSpieler->getSpielerNummer(); klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeSpielEnde(char gewonnen, double spielZeit) { if (!klient) return; short len = 10; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 6; *(char*)(bytes + 9) = gewonnen; klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeSpielerGeschwindigkeit(Spieler* zSpieler, double spielZeit) { if (!klient) return; short len = 29; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 7; *(int*)(bytes + 9) = zSpieler->getSpielerNummer(); *(double*)(bytes + 13) = zSpieler->getSpeedX(); *(double*)(bytes + 21) = zSpieler->getSpeedY(); klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeSpielerWendigkeit(Spieler* zSpieler, double spielZeit) { if (!klient) return; short len = 21; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 8; *(int*)(bytes + 9) = zSpieler->getSpielerNummer(); *(double*)(bytes + 13) = zSpieler->getKurve(); klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeSpielerKurve(int sNum, char kurve, double spielZeit) { if (!klient) return; short len = 14; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 9; *(int*)(bytes + 9) = sNum; bytes[13] = kurve; klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeKartenSize(int br, int hi, double spielZeit) { if (!klient) return; short len = 17; char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0xA; *(int*)(bytes + 9) = br; *(int*)(bytes + 13) = hi; klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeChatNachricht(const char* txt, double spielZeit) { if (!klient) return; short len = (short)(9 + textLength(txt)); char* bytes = new char[len]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0xB; for (int i = 9; i < len; i++) bytes[i] = txt[i - 9]; klient->spielNachricht(len, bytes); delete[] bytes; } void Klient::sendeLinienUnterbrechung(int sNum, bool unterbrochen, double spielZeit) { if (!klient) return; char* bytes = new char[14]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0xC; *(int*)(bytes + 9) = sNum; *(bytes + 13) = (char)unterbrochen; klient->spielNachricht(14, bytes); delete[] bytes; } void Klient::sendeTeamMaxPunkte(int team, int mP, double spielZeit) { if (!klient) return; char* bytes = new char[17]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0xD; *(int*)(bytes + 9) = team; *(int*)(bytes + 13) = mP; klient->spielNachricht(17, bytes); delete[] bytes; } void Klient::sendeTeamPunkte(int team, int p, double spielZeit) { if (!klient) return; char* bytes = new char[17]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0xE; *(int*)(bytes + 9) = team; *(int*)(bytes + 13) = p; klient->spielNachricht(17, bytes); delete[] bytes; } void Klient::sendeSpielerPunkte(int sNum, int p, double spielZeit) { if (!klient) return; char* bytes = new char[17]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0xF; *(int*)(bytes + 9) = sNum; *(int*)(bytes + 13) = p; klient->spielNachricht(17, bytes); delete[] bytes; } void Klient::sendeTeamTod(int team, double spielZeit) { if (!klient) return; char* bytes = new char[13]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0x10; *(int*)(bytes + 9) = team; klient->spielNachricht(13, bytes); delete[] bytes; } void Klient::sendeTeamName(int team, const char* name) { if (!klient) return; int nL = textLength(name); char* bytes = new char[13 + nL]; *(double*)bytes = 0; *(char*)(bytes + 8) = 0x13; *(int*)(bytes + 9) = team; memcpy(bytes + 13, name, nL); klient->spielNachricht((short)(13 + nL), bytes); delete[] bytes; } void Klient::sendeRundenEnde(int winTeam, double spielZeit) { if (!klient) return; char* bytes = new char[13]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0x11; *(int*)(bytes + 9) = winTeam; klient->spielNachricht(13, bytes); delete[] bytes; } void Klient::sendeZeitVerbleibend(int sekunden, double spielZeit) { if (!klient) return; char* bytes = new char[13]; *(double*)bytes = spielZeit; *(char*)(bytes + 8) = 0x12; *(int*)(bytes + 9) = sekunden; klient->spielNachricht(13, bytes); delete[] bytes; } void Klient::sendeStatistikChatNachricht(int vonAccount, const char* txt) { if (!klient) return; short len = (short)(5 + textLength(txt)); char* bytes = new char[len]; *(char*)(bytes) = 8; *(int*)(bytes + 1) = vonAccount; for (int i = 5; i < len; i++) bytes[i] = txt[i - 5]; klient->statistikNachricht(len, bytes); delete[] bytes; } void Klient::sendeStatistikSpielerOffline(int account) { if (!klient) return; char* bytes = new char[5]; *(char*)(bytes) = 9; *(int*)(bytes + 1) = account; klient->statistikNachricht(5, bytes); delete[] bytes; } void Klient::sendeGesamtSpielerStatistik(GesamtSpielerStatistik* zS) { if (!zS || !klient) return; char snl = (char)zS->zSpielerName()->getLength(); char tnl = (char)zS->zTeamName()->getLength(); int len = 43 + snl + tnl; char* bytes = new char[len]; bytes[0] = 2; *(int*)(bytes + 1) = zS->getSpielerNummer(); *(char*)(bytes + 5) = (char)zS->zSpielerName()->getLength(); for (int i = 0; i < snl; i++) bytes[i + 6] = zS->zSpielerName()->getText()[i]; *(char*)(bytes + 6 + snl) = tnl; for (int i = 0; i < tnl; i++) bytes[i + 7 + snl] = zS->zTeamName()->getText()[i]; *(int*)(bytes + 7 + snl + tnl) = zS->getSpielerFarbe(); *(int*)(bytes + 11 + snl + tnl) = zS->getTeamFarbe(); *(int*)(bytes + 15 + snl + tnl) = zS->getGewonneneRunden(); *(int*)(bytes + 19 + snl + tnl) = zS->getPunkte(); *(int*)(bytes + 23 + snl + tnl) = zS->getLinienLength(); *(int*)(bytes + 27 + snl + tnl) = zS->getZeitAmLeben(); *(int*)(bytes + 31 + snl + tnl) = zS->getZeitTod(); *(int*)(bytes + 35 + snl + tnl) = zS->getKills(); *(int*)(bytes + 39 + snl + tnl) = zS->getTode(); klient->statistikNachricht((short)len, bytes); delete[] bytes; } void Klient::sendeGesamtTeamStatistik(GesamtTeamStatistik* zS) { if (!zS || !klient) return; char tnl = (char)zS->zTeamName()->getLength(); int len = 30 + tnl; char* bytes = new char[len]; bytes[0] = 3; *(int*)(bytes + 1) = zS->getTeamNummer(); *(char*)(bytes + 5) = tnl; for (int i = 0; i < tnl; i++) bytes[i + 6] = zS->zTeamName()->getText()[i]; *(int*)(bytes + 6 + tnl) = zS->getTeamFarbe(); *(int*)(bytes + 10 + tnl) = zS->getGewonneneRunden(); *(int*)(bytes + 14 + tnl) = zS->getPunkte(); *(int*)(bytes + 18 + tnl) = zS->getLinienLength(); *(int*)(bytes + 22 + tnl) = zS->getKills(); *(int*)(bytes + 26 + tnl) = zS->getTode(); klient->statistikNachricht((short)len, bytes); delete[] bytes; } void Klient::sendeRundeStatistik(RundenRundenStatistik* zS) { if (!zS || !klient) return; char* bytes = new char[25]; bytes[0] = 4; *(int*)(bytes + 1) = zS->getRundenNummer(); *(int*)(bytes + 5) = zS->getRundenDauer(); *(int*)(bytes + 9) = zS->getSiegerTeam(); *(int*)(bytes + 13) = zS->getSpielFeldNutzung(); *(int*)(bytes + 17) = zS->zRundenBild()->getBreite(); *(int*)(bytes + 21) = zS->zRundenBild()->getHeight(); klient->statistikNachricht(25, bytes); delete[] bytes; Bild* zB = zS->zRundenBild(); int pixel = zB->getBreite() * zB->getHeight(); while (pixel) { int pStart = zB->getBreite() * zB->getHeight() - pixel; int pLen = pixel > 200 ? 200 : pixel; char* bytes = new char[13 + pLen * 4]; bytes[0] = 5; *(int*)(bytes + 1) = zS->getRundenNummer(); *(int*)(bytes + 5) = pStart; *(int*)(bytes + 9) = pLen; for (int i = 0; i < pLen; i++) *(int*)(bytes + 13 + i * 4) = zB->getBuffer()[pStart + i]; klient->statistikNachricht((short)(13 + pLen * 4), bytes); delete[] bytes; pixel -= pLen; } int anz = zS->getSpielerAnzahl(); for (int i = 0; i < anz; i++) sendeRundeSpielerStatistik(zS->zSpielerStatistik(i), zS->getRundenNummer()); anz = zS->getTeamAnzahl(); for (int i = 0; i < anz; i++) sendeRundeTeamStatistik(zS->zTeamStatistik(i), zS->getRundenNummer()); } void Klient::sendeRundeSpielerStatistik(RundenSpielerStatistik* zS, int runde) { if (!zS || !klient) return; char snl = (char)zS->zSpielerName()->getLength(); char tnl = (char)zS->zTeamName()->getLength(); int len = 31 + snl + tnl; char* bytes = new char[len]; bytes[0] = 6; *(int*)(bytes + 1) = runde; *(int*)(bytes + 5) = zS->getSpielerNummer(); *(char*)(bytes + 9) = snl; for (int i = 0; i < snl; i++) bytes[i + 10] = zS->zSpielerName()->getText()[i]; *(char*)(bytes + 10 + snl) = tnl; for (int i = 0; i < tnl; i++) bytes[i + 11 + snl] = zS->zTeamName()->getText()[i]; *(int*)(bytes + 11 + snl + tnl) = zS->getSpielerFarbe(); *(int*)(bytes + 15 + snl + tnl) = zS->getTeamFarbe(); *(int*)(bytes + 19 + snl + tnl) = zS->getLinienLength(); *(int*)(bytes + 23 + snl + tnl) = zS->getKills(); *(int*)(bytes + 27 + snl + tnl) = zS->getTodesZeit(); klient->statistikNachricht((short)len, bytes); delete[] bytes; } void Klient::sendeRundeTeamStatistik(RundenTeamStatistik* zS, int runde) { if (!zS || !klient) return; char tnl = (char)zS->zTeamName()->getLength(); int len = 27 + tnl; char* bytes = new char[len]; bytes[0] = 7; *(int*)(bytes + 1) = runde; *(int*)(bytes + 5) = zS->getTeamNummer(); *(char*)(bytes + 9) = tnl; for (int i = 0; i < tnl; i++) bytes[i + 10] = zS->zTeamName()->getText()[i]; *(int*)(bytes + 10 + tnl) = zS->getTeamFarbe(); *(char*)(bytes + 14 + tnl) = (char)zS->getErgebnis(); *(int*)(bytes + 15 + tnl) = zS->getLinienLength(); *(int*)(bytes + 19 + tnl) = zS->getKills(); *(int*)(bytes + 23 + tnl) = zS->getTode(); klient->statistikNachricht((short)len, bytes); delete[] bytes; } void Klient::sendeStatistikLadenFertig() { if (!klient) return; char byte = 1; klient->statistikNachricht(1, &byte); } // constant bool Klient::istOnline() const { return klient != 0; }