|
|
Das Nonstop-Rennen |
:: GTAvision.com ::
:: Scripting - Multiplayer ::
|
|
Author: |
dödel |
|
E-Mail: |
Write me a Mail
|
Kategorie: |
Scripting - Multiplayer |
GTA-Serien: |
|
Description: |
Ein Tutorial, dass euch anhand eines Beispiels erklärt, wie ihr ein Nonstop-Rennen scripten könnt. Ihr findet hier das Script im Format .pwn anstelle einer .pdf und könnt es gleich compilen! |
|
|
|
Tutorial:
|
|
|
/******************************************************************************* ******************************************************************************** ******************************************************************************** * * Tutorial - "Wie scriptet man ein Nonstop-Rennen" by doedel * * * * Das Tutorial ist urheberrechtlich geschuetzt und darf weder kopiert, * noch darf es ohne Erlaubnis geaendert und als seines weitergegeben werden. * * !!!IHR MACHT EUCH SONST STRAFBAR!!! * * Das Tutorial darf nur auf folgenden Seiten veroeffentlicht werden: * * http://www.gtavision.com & http://forum.gtavision.com * Sowie weitere Webseiten vom GTAvision.com Team * und/oder * doedel. * * * * * Fuer Fragen schreibt in unser Forum! * * * * * * Wer Rechtschreibfehler findet, darf sie behalten! * Bei inhaltlichen Fragen bitte im Forum melden. * http://forum.gtavision.com * * * * (C) 2007 by doedel ******************************************************************************** ******************************************************************************** ******************************************************************************** *******************************************************************************/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /******************************************************************************* ******************************************************************************** * ------------- HINWEIS ------------- * Ihr koennt sofort compilen und es ausprobieren. * Es bedarf zum Testen keine Aenderungen ******************************************************************************** *******************************************************************************/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ #include <a_samp> /******************************************************************************/ #define CP1 0 #define CP2 1 #define CP3 2 #define CP4 3 #define CP5 4 #define CP6 5 #define CP7_Ziel 6 /******************************************************************************* ******************************************************************************** * Hier erstellen wir, wie es sich gehoert, * die Checkpoints des zweiten Rennens * * Diese sollten natuerlich auch anders definiert werden * ******************************************************************************** *******************************************************************************/ #define RACE2_CP1_Start 7 #define RACE2_CP2 8 #define RACE2_CP3 9 #define RACE2_CP4 10 #define RACE2_CP5 11 #define RACE2_CP6 12 #define RACE2_CP7 13 #define RACE2_CP8 14 #define RACE2_CP9 15 #define RACE2_CP10 16 #define RACE2_CP11 17 #define RACE2_CP12 18 #define RACE2_CP13 19 #define RACE2_CP14 20 #define RACE2_CP15 21 #define RACE2_CP16_Ziel 22 /******************************************************************************* ******************************************************************************** * Nun erstellen wir eine Variable, damit * sich die Rennen abwechseln * und damit man das laufende Rennen durch * wiederholte Eingabe von /start nicht beenden kann ******************************************************************************** *******************************************************************************/ new raceticket; new racestarted; /******************************************************************************/ new rennen[MAX_PLAYERS]; new platz_1[MAX_PLAYER_NAME]; new platz_2[MAX_PLAYER_NAME]; new platz_3[MAX_PLAYER_NAME]; new string[256]; new cstring[256]; new position = 1; new Countdownanzeige; new Countdownkiller; new kstring[10]; forward JetztAberSchnell(); forward Countdown(); /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ main() { print("n--------------------------------------------"); print(" GTAvision Team - doedel"); print(" TUTORIAL"); print(" Wie scriptet man ein Nonstop-Rennen"); print(" Copyright by doedel"); print("--------------------------------------------n"); } /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ public OnGameModeInit() { SetGameModeText("[TUT] Gamemode: Nonstop-Race by doedel"); AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); AddStaticVehicle(400,2029.6437,1344.4570,10.9125,180.5856, -1, -1); AddStaticVehicle(400,2029.6437,1300.4570,10.9125,180.5856, -1, -1); return 1; } /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/start", cmdtext, true, 6) == 0) { /******************************************************************************* ******************************************************************************** * Hier nutzen wir eine Ueberpruefung um festzustellen, * ob bereits ein Rennen laeuft ******************************************************************************** *******************************************************************************/ if(racestarted == 1) { SendClientMessage(playerid, 0xAA3333AA, "Es laeuft bereits ein Rennen"); return 1; } /******************************************************************************* ******************************************************************************** * Sollte noch kein Rennen laufen, wird die Variable * hiermit darauf eingestellt ******************************************************************************** *******************************************************************************/ racestarted = 1; /******************************************************************************* ******************************************************************************** * Nun nutzen wir die vorhin erstellte Variable, * um zu ueberpruefen welches Rennen gestartet werden soll ******************************************************************************** *******************************************************************************/ if(raceticket == 0) { /******************************************************************************* ******************************************************************************** * Jetzt wird die Variable so eingestellt, * dass beim naechsten Mal auch das naechste Rennen gestartet wird ******************************************************************************** * Sollten noch Rennen folgen, so wird "raceticket++;" genutzt ******************************************************************************** *******************************************************************************/ raceticket++; SendClientMessage(playerid,0xFF0000AA,"Check "Rennen":........OK"); SendClientMessage(playerid,0x00FF00AA,"CP_Start erstellt"); Countdownkiller = SetTimer("Countdown", 1000, true); for(new i=0; i<MAX_PLAYERS ; i++) { SetPlayerRaceCheckpoint(i, 0, 2047.57, 1343.1572, 14.0, 2047.57, 1202.88, 14.0, 12.0); rennen[i] =CP1; } return 1; } if(raceticket==1) { /******************************************************************************* ******************************************************************************** * Wenn wir beim letzten Rennen angekommen sind, * sollten wir 'raceticket' wieder auf 0 stellen, * damit sich alle Rennen auch wiederholen koennen ******************************************************************************** *******************************************************************************/ raceticket=0; SendClientMessage(playerid,0xFF0000AA,"Check "Rennen 2":........OK"); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP_Start erstellt"); Countdownkiller=SetTimer( "Countdown", 1000, true); for(new i=0; i <MAX_PLAYERS; i++) { SetPlayerRaceCheckpoint(i, 0, 2048.2185, 1409.7046, 10.7642, 2056.4238, 1530.6763, 14.0, 12.0); rennen[i] = RACE2_CP1_Start; } return 1; } } return 0; } /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ public OnPlayerEnterRaceCheckpoint(playerid) { switch (rennen[playerid]) { case CP1: { SetPlayerRaceCheckpoint(playerid, 0, 2047.57, 1202.88, 14.0, 2137.57, 1072.88, 14.0, 12.0); SendClientMessage(playerid,0x00FF00AA,"CP1 erstellt"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 7", rennen[playerid]); GameTextForPlayer(playerid, cstring, 1000, 3); } case CP2: { SetPlayerRaceCheckpoint(playerid, 0, 2137.57, 1072.88, 14.0, 2189.57, 1190.88, 14.0, 12.0); SendClientMessage(playerid,0x00FF00AA,"CP2 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 7", rennen[playerid]); GameTextForPlayer(playerid, cstring, 1000, 3); } case CP3: { SetPlayerRaceCheckpoint(playerid, 0, 2189.57, 1190.88, 14.0, 2225.57, 1220.88, 14.0, 12.0); SendClientMessage(playerid,0x00FF00AA,"CP3 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 7", rennen[playerid]); GameTextForPlayer(playerid, cstring, 1000, 3); } case CP4: { SetPlayerRaceCheckpoint(playerid, 0, 2225.57, 1220.888, 14.0, 2222.57, 1371.88, 14.0, 12.0); SendClientMessage(playerid,0x00FF00AA,"CP4 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 7", rennen[playerid]); GameTextForPlayer(playerid, cstring, 1000, 3); } case CP5: { SetPlayerRaceCheckpoint(playerid, 0, 2222.57, 1371.88, 14.0, 2057.2, 1371.88, 14.0, 12.0); SendClientMessage(playerid,0x00FF00AA,"CP5 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 7", rennen[playerid]); GameTextForPlayer(playerid, cstring, 1000, 3); } case CP6: { SetPlayerRaceCheckpoint(playerid, 1, 2057.2, 1371.88, 14.0, 2057.2, 1371.88,14.0, 12.0); SendClientMessage(playerid,0x00FF00AA,"(CP6 erreicht) Komm, noch ein Checkpoint!"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 7", rennen[playerid]); GameTextForPlayer(playerid, cstring, 1000, 3); } case CP7_Ziel: { if(position == 1) { GivePlayerMoney(playerid, 10000); GetPlayerName(playerid, platz_1,sizeof(platz_1)); SendClientMessageToAll(0x0022FFAA, "***************************************************"); format(string, sizeof(string), "Rennen beendet und gewonnen von: %s ",platz_1); SendClientMessageToAll(0xFFF00FAA, string); format(string, sizeof(string), "%s, dein Preis......$10000",platz_1); SendClientMessageToAll(0xFFFF00AA, string); SendClientMessageToAll(0x0022FFAA, "***************************************************"); } if(position == 2) { GivePlayerMoney(playerid, 8000); GetPlayerName(playerid, platz_2,sizeof(platz_2)); SendClientMessageToAll(0x0022FFAA, "***************************************************"); format(string, sizeof(string), "Zweiter wurde: %s ",platz_2); SendClientMessageToAll(0xFFFF00AA, string); format(string, sizeof(string), "%s, dein Preis......$8000",platz_2); SendClientMessageToAll(0xFFFF00AA, string); SendClientMessageToAll(0x0022FFAA, "***************************************************"); } if(position == 3) { GivePlayerMoney(playerid, 5000); GetPlayerName(playerid, platz_3,sizeof(platz_3)); SendClientMessageToAll(0x0022FFAA, "***************************************************"); format(string, sizeof(string), "Dritter ist geworden: %s ",platz_3); SendClientMessageToAll(0xFFFF00AA, string); format(string, sizeof(string), "%s, dein Preis......$5000",platz_3); SendClientMessageToAll(0xFFFF00AA, string); SendClientMessageToAll(0x0022FFAA, "***************************************************"); } DisablePlayerRaceCheckpoint(playerid); rennen[playerid] = 0; /******************************************************************************* ******************************************************************************** * Damit der Timer nicht oefters gestartet wird, * nutzen wir gleich die PositionsVariable * um zu ueberpruefen, ob der Timer schon am Laufen ist ******************************************************************************** *******************************************************************************/ if(position == 1) SetTimer("JetztAberSchnell", 15000, 0); position++; } case RACE2_CP1_Start: { SetPlayerRaceCheckpoint(playerid, 0, 2056.4238,1530.6763,10.7689, 2096.8386,1644.4875,10.7798, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP1 erstellt"); rennen[playerid]++; /******************************************************************************* ******************************************************************************** * Da wir hier bei Checkpoint 7 anfangen, * rechnen wir immer -7, zur Anzeige * bei welchem Checkpoint wir uns befinden ******************************************************************************** *******************************************************************************/ format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP2: { SetPlayerRaceCheckpoint(playerid, 0, 2096.8386,1644.4875,10.7798, 2109.6553,1718.2126,10.7798, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP2 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP3: { SetPlayerRaceCheckpoint(playerid, 0, 2109.6553,1718.2126,10.7798, 1931.5707,1713.8005,10.7642, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP3 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP4: { SetPlayerRaceCheckpoint(playerid, 0, 1931.5707,1713.8005,10.7642, 1627.7561,1713.2161,10.7641, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP4 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP5: { SetPlayerRaceCheckpoint(playerid, 0, 1627.7561,1713.2161,10.7641, 1567.9694,1833.7341,10.9502, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP5 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP6: { SetPlayerRaceCheckpoint(playerid, 0, 1567.9694,1833.7341,10.9502, 1349.3547,1875.8196,10.7642, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP6 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP7: { SetPlayerRaceCheckpoint(playerid, 0, 1349.3547,1875.8196,10.7642, 1269.2195,1738.8813,9.0049, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP7 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP8: { SetPlayerRaceCheckpoint(playerid, 0, 1269.2195,1738.8813,9.0049, 1217.5745,1266.1957,6.7974, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP8 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP9: { SetPlayerRaceCheckpoint(playerid, 0, 1217.5745,1266.1957,6.7974, 1212.0414,1157.4858,6.9048, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP9 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP10: { SetPlayerRaceCheckpoint(playerid, 0, 1212.0414,1157.4858,6.9048, 1312.9362,904.2525,17.5772, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP10 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "RACE2_CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP11: { SetPlayerRaceCheckpoint(playerid, 0, 1312.9362,904.2525,17.5772, 960.7844,744.2357,10.9104, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP11 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP12: { SetPlayerRaceCheckpoint(playerid, 0, 960.7844,744.2357,10.9104, 903.8994,878.8412,13.4444, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP12 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP13: { SetPlayerRaceCheckpoint(playerid, 0, 903.8994,878.8412,13.4444, 834.1436,1123.4434,30.1914, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP13 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP14: { SetPlayerRaceCheckpoint(playerid, 0, 834.1436,1123.4434,30.1914, 799.7081,1636.8066,5.3624, 12.0); SendClientMessage(playerid,0x00FF00AA,"RACE2_CP14 erreicht"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP15: { SetPlayerRaceCheckpoint(playerid, 1, 799.7081,1636.8066,5.3624, 799.7081,1636.8066,5.3624, 18.0); SendClientMessage(playerid,0x00FF00AA,"(RACE2_CP15 erreicht) Komm, noch ein Checkpoint!"); rennen[playerid]++; format(cstring, sizeof(cstring), "CP: %d / 16", rennen[playerid] -7); GameTextForPlayer(playerid, cstring, 1000, 3); } case RACE2_CP16_Ziel: { if(position == 1) { GivePlayerMoney(playerid, 10000); GetPlayerName(playerid, platz_1,sizeof(platz_1)); SendClientMessageToAll(0x0022FFAA, "***************************************************"); format(string, sizeof(string), "Rennen beendet und gewonnen von: %s ",platz_1); SendClientMessageToAll(0xFFF00FAA, string); format(string, sizeof(string), "%s, dein Preis......$10000",platz_1); SendClientMessageToAll(0xFFFF00AA, string); SendClientMessageToAll(0x0022FFAA, "***************************************************"); } if(position == 2) { GivePlayerMoney(playerid, 8000); GetPlayerName(playerid, platz_2,sizeof(platz_2)); SendClientMessageToAll(0x0022FFAA, "***************************************************"); format(string, sizeof(string), "Zweiter wurde: %s ",platz_2); SendClientMessageToAll(0xFFFF00AA, string); format(string, sizeof(string), "%s, dein Preis......$8000",platz_2); SendClientMessageToAll(0xFFFF00AA, string); SendClientMessageToAll(0x0022FFAA, "***************************************************"); } if(position == 3) { GivePlayerMoney(playerid, 5000); GetPlayerName(playerid, platz_3,sizeof(platz_3)); SendClientMessageToAll(0x0022FFAA, "***************************************************"); format(string, sizeof(string), "Dritter ist geworden: %s ",platz_3); SendClientMessageToAll(0xFFFF00AA, string); format(string, sizeof(string), "%s, dein Preis......$5000",platz_3); SendClientMessageToAll(0xFFFF00AA, string); SendClientMessageToAll(0x0022FFAA, "***************************************************"); } DisablePlayerRaceCheckpoint(playerid); rennen[playerid] = 0; /******************************************************************************* * - Selbe Funktion wie beim ersten Ckeckpoint - ******************************************************************************** * Damit der Timer nicht oefters gestartet wird, * nutzen wir gleich die PositionsVariable * um zu ueberpruefen, ob der Timer schon am Laufen ist *******************************************************************************/ if(position == 1) SetTimer("JetztAberSchnell", 15000, 0); position++; } } return 1; } public JetztAberSchnell() { for(new i=0;i < MAX_PLAYERS; i++) { /******************************************************************************* ******************************************************************************** * Damit man wieder ein Rennen starten kann, * wird diese Variable, mit der geprueft wird, ob ein * Rennen laeuft, wieder auf 0 gesetzt ******************************************************************************** *******************************************************************************/ racestarted = 0; position = 1; rennen[i] = 0; DisablePlayerRaceCheckpoint(i); GameTextForAll("Pech wer es nicht geschafft hat..vorbei!", 5000, 5); } } /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ public Countdown() { Countdownanzeige++; if (Countdownanzeige >= 6) { Countdownanzeige = 0; GameTextForAll("GoGoGo",999,5); KillTimer(Countdownkiller); for(new i=0; i<MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { TogglePlayerControllable(i,1); } } } else { format(kstring, sizeof(kstring), "%i", (6 - Countdownanzeige)); GameTextForAll(kstring,999,5); for(new i=0; i <MAX_PLAYERS;i++) { if(IsPlayerConnected(i)) { SetCameraBehindPlayer(i); TogglePlayerControllable(i,0); } } } } /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ public OnPlayerSpawn(playerid) { SendClientMessage(playerid,0x00FF00AA,"Tippe /start fuer ein Rennen ein!"); return 1; } /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ /*-----------||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------*/ public OnGameModeExit() { return 1; } public OnPlayerRequestClass(playerid, classid) { SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746); return 1; } Mit Erlaubnis des Autors wurde dieses Tutorial auf http://www.GTAvision.com hochgeladen. Weitere Tutorials rund um GTA findet ihr dort im Tutorialbereich. ![Das Nonstop-Rennen [NFO-Script]](http://www.gta-nightlife.de/nfos/doedel_nonstop-rennen.gif) Mit Erlaubnis des Autors wurde dieses Tutorial auf http:///www.GTAvision.com hochgeladen. Weitere Tutorials rund um GTA findet ihr dort im Tutorialbereich. |
|
|
|
|