Modyfikacja (cheat) w grze sauerbraten

Ponieważ ostatnio nagromadziło się wiele pracy, a (jak powszechnie wiadomo) praca wywołuje stres… Należało ten stres rozładować 😉 Z pomocą nadeszła gra sauerbraten. Jest to chyba najlepsza darmowa propozycja dla użytkowników linuxa, a co więcej jest to aplikacja openSourcowa, a więc mamy dostęp do kodu źródłowego, czyli możemy sami modyfikować to i owo.

Sauerbraten, aby zoptymalizować liczbę przesyłanych danych do/z serwera, większość pracy wykonuje po stronie klienta. Daje to możliwość wykonania pewnych modyfikacji kodu, które chciałbym tutaj przedstawić. Nie są to typowe cheaty, które nie dają przeciwnikowi żadnych szans, a jedynie drobne modyfikacje, które sprawiają, że gra się lepiej.

Zaczynamy

Po ściągnięciu źródeł gry (są one dołączone do jej dystrybucji), możemy przystąpić do modyfikacji. To, co będzie nas interesowało, to structura zawarta w pliku src/fpsgame/game.h. Odpowiada ona za zachowanie się konkretnych typów broni używanych w grze. Wygląda ona następująco:


static const struct guninfo { short sound, attackdelay, damage, projspeed, part, 
			      kickamount, range; const char *name, *file; 
			    } guns[NUMGUNS] =
 {
 { S_PUNCH1, 250, 50, 0, 0, 0, 14, "fist", "fist" },
 { S_SG, 1400, 10, 0, 0, 20, 1024, "shotgun", "shotg" }, // *SGRAYS
 { S_CG, 100, 30, 0, 0, 7, 1024, "chaingun", "chaing"},
 { S_RLFIRE, 800, 120, 80, 0, 10, 1024, "rocketlauncher", "rocket"},
 { S_RIFLE, 1500, 100, 0, 0, 30, 2048, "rifle", "rifle" },
 { S_FLAUNCH, 500, 75, 80, 0, 10, 1024, "grenadelauncher", "gl" },
 { S_PISTOL, 500, 25, 0, 0, 7, 1024, "pistol", "pistol" },
 { S_FLAUNCH, 200, 20, 50, PART_FIREBALL1, 1, 1024, "fireball", NULL },
 { S_ICEBALL, 200, 40, 30, PART_FIREBALL2, 1, 1024, "iceball", NULL },
 { S_SLIMEBALL, 200, 30, 160, PART_FIREBALL3, 1, 1024, "slimeball", NULL },
 { S_PIGR1, 250, 50, 0, 0, 1, 12, "bite", NULL },
 { -1, 0, 120, 0, 0, 0, 0, "barrel", NULL }
};

Pola, które będą nas interesowały, to:

Numer kolejny pola Nazwa Opis
2 attackdelay Zwłoka potrzebna na przeładowanie broni. Szczególnie uciążliwa dla rifle.
6 kickamount Siła odrzutu po wykonaniu strzału. 0 – brak odrzutu, 1024 – zaczynamy latać po każdym strzale 😉
4 projspeed Szybkość „projekcji”, czyli czas potrzebny na przebycie drogi przez pocisk… Przydatne przy graniu z wyrzutnią rakiet, wówczas pocisk nie leci w powietrzu, zanim trafi w cel. 0 – trafia od razu, 1024 – wlecze się okrutnie

Polecam poeksperymentować z tymi parametrami i ustawić je pod siebie tak, aby grało się nam komfortowo, dla przykładu poniżej moja własna structurka.


static const struct guninfo { short sound, attackdelay, damage, projspeed, part, 
			      kickamount, range; const char *name, *file; 
			    } guns[NUMGUNS] =
{
    { S_PUNCH1,    250,  50, 0,   0, 0,   4,  "fist",            "fist"  },
    { S_SG,       1400,  10, 0,   0, 0, 1024, "shotgun",         "shotg" },  // *SGRAYS
    { S_CG,        100,  30, 0,   0, 0, 1024,  "chaingun",        "chaing"},
    { S_RLFIRE,    800, 0, 0,  0, 0, 1024, "rocketlauncher",  "rocket"},
    { S_RIFLE,     200, 100, 0,   0, 0, 2048, "rifle",           "rifle" },
    { S_FLAUNCH,   500,  75, 80,  0, 0, 1024, "grenadelauncher", "gl" },
    { S_PISTOL,    500,  25, 0,   0,  0, 1024, "pistol",          "pistol" },
    { S_FLAUNCH,   200,  20, 50,  PART_FIREBALL1,  0, 1024, "fireball",  NULL },
    { S_ICEBALL,   200,  40, 30,  PART_FIREBALL2,  0, 1024, "iceball",   NULL },
    { S_SLIMEBALL, 200,  30, 160, PART_FIREBALL3,  0, 1024, "slimeball", NULL },
    { S_PIGR1,     250,  50, 0,   0,  0,   12, "bite",            NULL },
    { -1,            0, 120, 0,   0,  0,    0, "barrel",          NULL }
};

Celność

Oprócz powyżej opisanych własności broni możemy jeszcze poprawić celność shotguna. W tym celu należy zmodyfikować plik src/fpsgame/weapon.cpp około linii 130 wygląda on tak:


void offsetray(const vec &from, const vec &to, int spread, float range, vec &dest)
   {
       float f = to.dist(from)*spread/1000;
       for(;;)
       {
           #define RNDD rnd(101)-50
           vec v(RNDD, RNDD, RNDD);
           if(v.magnitude()>50) continue;
           v.mul(f);
           v.z /= 2;
           dest = to;
           dest.add(v);
           vec dir = dest;
           dir.sub(from);
           dir.normalize();
           raycubepos(from, dir, dest, range, RAY_CLIPMAT|RAY_ALPHAPOLY);
           return;
       }
   }

Zmieniamy linijkę

#define RNDD rnd(101)-50

na

#define RNDD rnd(2)-1

Co minimalizuje rozrzut shotguna i daje mu celność rifle’a.

Po tych modyfikacjach możemy cieszyć się na nowo grą, którą sobie sami skompilujemy. Kompilacja jest banalnie prosta i polega na wydaniu jednego polecenia make, piszemy po prostu make i to wszystko. Jedyne, o czym należy pamiętać, to zależności, których wymaga sauerbraten do kompilacji i są to wersje developerskie następujących pakietów:

  • OpenGL
  • SDL
  • SDL_mixer
  • SDL_image
  • zlib

W razie problemów dokładniejszy opis kompilacji znajduje się w pliku src/readme_source.txt

Inne możliwości modyfikacji ?

Bardzo często spotykaną u graczy modyfikacją jest manipulacja w pliku client.cpp, polegająca na tym, że klient wysyła do serwera strukturę, w której znajdują się koordynaty, w których się aktualnie znajduje, tyle tylko, że te koordynaty nie są prawdziwe. Efekt jest taki, że wszyscy gracze widzą Cię w innym miejscu, niż naprawdę się znajdujesz. Nie przedstawiłem jednak w tym wpisie dokładnie, jak to zrobić, ponieważ moim zdaniem modyfikacja ta odbiera przyjemność z gry zarówno nam, jak i innym współgraczom.

Jedna odpowiedź do “Modyfikacja (cheat) w grze sauerbraten”

  1. Birk pisze:

    Very nice.

    I have also released my own cheat on http://uuzvlv6hayzquoon.onion.to or http://hackbraten2.ml 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *