Advertisement
Guest User

RaceRun - Eine neue Art des Rennens

a guest
Jul 30th, 2014
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 28.18 KB | None | 0 0
  1. /*
  2. RACE RUN - WICHTIGE INFOS:
  3.  
  4. Dieses Filterscript wurde von Maxi Brügge (heyhooo) geschrieben!
  5. Die Teilbearbeitung ist gestattet, solange der Sinn des Werkes nicht verloren geht.
  6. Entfernen der Credits ist nicht erlaubt. Hierbei ist es egal, ob Teile oder das ganze System verwendet werden.
  7. Ebenso ist die Veröffentlichung ohne die Einwilligung von mir nicht gestattet!
  8. #Viel Spaß mit dem Filterscript ;)
  9.  
  10. INFORMATION ZUM RECHTESYSTEM:
  11. Du kannst von deinem Haupt-Script Berechtigungen auf dieses Filterscript übertragen,
  12. indem du das Callback "Permissions" aufrufst. Dieses funktioniert mit der CallRemoteFunction.
  13. Mehr Informationen findest du im Thread.
  14. */
  15.  
  16.  
  17. #include <a_samp>
  18. #include <dini>
  19.  
  20. #if defined MAX_PLAYERS
  21.     #undef MAX_PLAYERS
  22. #endif
  23. #define SCM SendClientMessage
  24.  
  25. //====================SETTINGS=====================//
  26. #define MAX_PLAYERS 50      //Maximale Anzahl an Slots auf dem Server  -> Bei Bedarf ändern!
  27. #define MAX_RACECARS 15     //Maximale Anzahl von Autos bei einem Rennen
  28. #define MAX_RACES 10        //Maximale Anzahl von Rennen, die erstellt werden können
  29. #define MAX_CHECKPOINTS 50  //Maximale Anzahl von Checkpoints, die abgefahren werden können.
  30. #define MAX_LAPS 20         //Maximale Anzahl von Runden, die gefahre werden können.
  31. #define permissions 0       //Permissions verwenden? -> Ob bestimmte Commands nur berechtigte Leute ausführen können. (Siehe Callback "Permissions")
  32. #define command "/rrmenu"   //Öffnen des Haupt-Dialogs
  33.  
  34. #define mcolor 0xFFFFFFFF   //Farbe der Chat-Nachrichten
  35. #define avehicle 411        //AutoID zum erstellen eines Rennen
  36. #define rvehicle 494        //AutoID für die Spieler zum Rennen fahren
  37. #define rvcolor1 -1         //Farbe1 für die Autos zum Rennen fahren
  38. #define rvcolor2 -1         //Farbe2 für die Autos zum Rennen fahren
  39. //=================SETTINGS-ENDE===================//
  40.  
  41. enum
  42. {
  43.     DIALOG_EDIT = 10000,
  44.     DIALOG_EDITA,
  45.     DIALOG_EDITE,
  46.     DIALOG_FAIL,
  47.     DIALOG_INFO,
  48.     DIALOG_AFTERE,
  49.     DIALOG_CAR,
  50.     DIALOG_FINISH,
  51.     DIALOG_START,
  52.     DIALOG_TIME,
  53.     DIALOG_RUNS,
  54.     DIALOG_DESTROY
  55. }
  56.  
  57. enum Daten
  58. {
  59.     Rank,
  60.     Vehicle,
  61.     Edit,
  62.     Run[30],
  63.     pos,
  64.     Auto,
  65.     runcar[MAX_RACECARS],
  66.     check,
  67.     round,
  68.     inrace
  69. }
  70. new pDaten[MAX_PLAYERS][Daten];
  71.  
  72. new Float:point[MAX_CHECKPOINTS][3];
  73. new cars[MAX_RACECARS];
  74. new win[MAX_RACECARS] = -1;
  75. new dtimer[MAX_PLAYERS];
  76. new starttime = -1, runs, thiscar = -1,thischeck = -1, now,timer,l;
  77.  
  78. new Text:Ampel[4], PlayerText:lap[MAX_PLAYERS][4];
  79.  
  80.  
  81. public OnFilterScriptInit()
  82. {
  83.     print("\n------------------------------------------------------------------");
  84.     print("'RaceRun'[TRAIL] © by Maxi Brügge / heyho wurde erfolgreich geladen!");
  85.     print("------------------------------------------------------------------\n");
  86.  
  87.     Ampel[0] = TextDrawCreate(337.461181, 63.916667, "usebox");
  88.     TextDrawLetterSize(Ampel[0], 0.000000, 9.546110);
  89.     TextDrawTextSize(Ampel[0], 303.475830, 0.000000);
  90.     TextDrawAlignment(Ampel[0], 1);
  91.     TextDrawColor(Ampel[0], 0);
  92.     TextDrawUseBox(Ampel[0], true);
  93.     TextDrawBoxColor(Ampel[0], 139);
  94.     TextDrawSetShadow(Ampel[0], 0);
  95.     TextDrawSetOutline(Ampel[0], 0);
  96.     TextDrawFont(Ampel[0], 0);
  97.  
  98.     Ampel[1] = TextDrawCreate(308.756042, 8.166676, ".");
  99.     TextDrawLetterSize(Ampel[1], 2.261302, 10.303332);
  100.     TextDrawAlignment(Ampel[1], 1);
  101.     TextDrawColor(Ampel[1], -1073741569);
  102.     TextDrawSetShadow(Ampel[1], 0);
  103.     TextDrawSetOutline(Ampel[1], 0);
  104.     TextDrawBackgroundColor(Ampel[1], 51);
  105.     TextDrawFont(Ampel[1], 1);
  106.     TextDrawSetProportional(Ampel[1], 1);
  107.  
  108.     Ampel[2] = TextDrawCreate(308.350402, 36.000003, ".");
  109.     TextDrawLetterSize(Ampel[2], 2.261302, 10.303332);
  110.     TextDrawAlignment(Ampel[2], 1);
  111.     TextDrawColor(Ampel[2], 1684301055);
  112.     TextDrawSetShadow(Ampel[2], 0);
  113.     TextDrawSetOutline(Ampel[2], 0);
  114.     TextDrawBackgroundColor(Ampel[2], 51);
  115.     TextDrawFont(Ampel[2], 1);
  116.     TextDrawSetProportional(Ampel[2], 1);
  117.  
  118.     Ampel[3] = TextDrawCreate(308.413360, 64.416664, ".");
  119.     TextDrawLetterSize(Ampel[3], 2.261302, 10.303332);
  120.     TextDrawAlignment(Ampel[3], 1);
  121.     TextDrawColor(Ampel[3], 1684301055);
  122.     TextDrawSetShadow(Ampel[3], 0);
  123.     TextDrawSetOutline(Ampel[3], 0);
  124.     TextDrawBackgroundColor(Ampel[3], 51);
  125.     TextDrawFont(Ampel[3], 1);
  126.     TextDrawSetProportional(Ampel[3], 1);
  127.     return 1;
  128. }
  129.  
  130. public OnFilterScriptExit()
  131. {
  132.     print("\n-----------------------------------------------------");
  133.     print("'RaceRun'[TRAIL] © by Maxi Brügge / heyho was unloaded!");
  134.     print("-----------------------------------------------------\n");
  135.     return 1;
  136. }
  137.  
  138. public OnPlayerRequestClass(playerid, classid)
  139. {
  140.     SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
  141.     SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
  142.     SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
  143.     return 1;
  144. }
  145.  
  146. public OnPlayerConnect(playerid)
  147. {
  148.     pDaten[playerid][pos] = 1;
  149.  
  150.     lap[playerid][0] = CreatePlayerTextDraw(playerid, 641.531494, 1.500000, "usebox");
  151.     PlayerTextDrawLetterSize(playerid, lap[playerid][0], 0.000000, 4.155555);
  152.     PlayerTextDrawTextSize(playerid, lap[playerid][0], 563.973632, 0.000000);
  153.     PlayerTextDrawAlignment(playerid, lap[playerid][0], 1);
  154.     PlayerTextDrawColor(playerid, lap[playerid][0], 0);
  155.     PlayerTextDrawUseBox(playerid, lap[playerid][0], true);
  156.     PlayerTextDrawBoxColor(playerid, lap[playerid][0], 102);
  157.     PlayerTextDrawSetShadow(playerid, lap[playerid][0], 0);
  158.     PlayerTextDrawSetOutline(playerid, lap[playerid][0], 0);
  159.     PlayerTextDrawFont(playerid, lap[playerid][0], 0);
  160.  
  161.     lap[playerid][1] = CreatePlayerTextDraw(playerid, 641.531494, 1.500000, "usebox");
  162.     PlayerTextDrawLetterSize(playerid, lap[playerid][1], 0.000000, 1.627777);
  163.     PlayerTextDrawTextSize(playerid, lap[playerid][1], 563.973632, 0.000000);
  164.     PlayerTextDrawAlignment(playerid, lap[playerid][1], 1);
  165.     PlayerTextDrawColor(playerid, lap[playerid][1], 0);
  166.     PlayerTextDrawUseBox(playerid, lap[playerid][1], true);
  167.     PlayerTextDrawBoxColor(playerid, lap[playerid][1], 102);
  168.     PlayerTextDrawSetShadow(playerid, lap[playerid][1], 0);
  169.     PlayerTextDrawSetOutline(playerid, lap[playerid][1], 0);
  170.     PlayerTextDrawFont(playerid, lap[playerid][1], 0);
  171.  
  172.     lap[playerid][2] = CreatePlayerTextDraw(playerid, 592.210815, 1.166678, "LAP");
  173.     PlayerTextDrawLetterSize(playerid, lap[playerid][2], 0.449999, 1.600000);
  174.     PlayerTextDrawAlignment(playerid, lap[playerid][2], 1);
  175.     PlayerTextDrawColor(playerid, lap[playerid][2], -1);
  176.     PlayerTextDrawSetShadow(playerid, lap[playerid][2], 0);
  177.     PlayerTextDrawSetOutline(playerid, lap[playerid][2], 1);
  178.     PlayerTextDrawBackgroundColor(playerid, lap[playerid][2], 51);
  179.     PlayerTextDrawFont(playerid, lap[playerid][2], 1);
  180.     PlayerTextDrawSetProportional(playerid, lap[playerid][2], 1);
  181.  
  182.     lap[playerid][3] = CreatePlayerTextDraw(playerid, 583.777465, 21.000005, "1 / 5");
  183.     PlayerTextDrawLetterSize(playerid, lap[playerid][3], 0.449999, 1.600000);
  184.     PlayerTextDrawAlignment(playerid, lap[playerid][3], 1);
  185.     PlayerTextDrawColor(playerid, lap[playerid][3], -1);
  186.     PlayerTextDrawSetShadow(playerid, lap[playerid][3], 0);
  187.     PlayerTextDrawSetOutline(playerid, lap[playerid][3], 1);
  188.     PlayerTextDrawBackgroundColor(playerid, lap[playerid][3], 51);
  189.     PlayerTextDrawFont(playerid, lap[playerid][3], 2);
  190.     PlayerTextDrawSetProportional(playerid, lap[playerid][3], 1);
  191.  
  192.     return 1;
  193. }
  194.  
  195. public OnPlayerCommandText(playerid, cmdtext[])
  196. {
  197.     if (strcmp(command, cmdtext, true, 10) == 0)
  198.     {
  199.         #if permissions 1
  200.             if(pDaten[playerid][Rank] == 0) return SCM(playerid, mcolor, "Du hast nicht die ausreichenden Rechte hierzu!");
  201.         #endif
  202.         return ShowPlayerDialog(playerid, DIALOG_EDIT, DIALOG_STYLE_LIST,"RaceRun - Hauptmenü","Neues Rennen erstellen\nVorhandenes starten\nVorhandenes stoppen\nVorhandenes löschen\nHilfe","Weiter","Abbrechen");
  203.     }
  204.     if(strcmp("/rrtele", cmdtext, true, 10) == 0)
  205.     {
  206.         if(pDaten[playerid][inrace] >= 1) return SCM(playerid, mcolor, "Du bist bereits in einem Auto, benutze /rrstop");
  207.         if(starttime == -1) return SCM(playerid, mcolor, "Zurzeit ist kein Event aktiv!");
  208.         if(thiscar == -1) return SCM(playerid, mcolor,"Es sind keine Plätze mehr frei!");
  209.         PutPlayerInVehicle(playerid, cars[thiscar],0);
  210.         new engine, lights, alarm, doors, bonnet, boot, objective;
  211.         GetVehicleParamsEx(cars[thiscar], engine, lights, alarm, doors, bonnet, boot, objective);
  212.         SetVehicleParamsEx(cars[thiscar], 0, lights, alarm, doors, bonnet, boot, objective);
  213.         TogglePlayerControllable(playerid,0);
  214.         pDaten[playerid][Vehicle] = cars[thiscar];
  215.         for(new i = 0; i < 4; i++) TextDrawShowForPlayer(playerid,Ampel[i]);
  216.         pDaten[playerid][inrace] = 1;
  217.         thiscar--;
  218.         return 1;
  219.     }
  220.     if(strcmp("/rrend", cmdtext, true, 10) == 0)
  221.     {
  222.         if(pDaten[playerid][Edit] != 2) return 1;
  223.         if(pDaten[playerid][pos] <= 2) return SCM(playerid,mcolor,"Du hast noch nicht genügend Checkpoints hinzugefügt! Gehe hierzu auf die Map.");
  224.         pDaten[playerid][pos] = 0;
  225.         return ShowPlayerDialog(playerid, DIALOG_AFTERE, DIALOG_STYLE_INPUT,"Strecke hinzugefügt!","{0076FF}Du hast erfolgreich %i Checkpoints hinzugefügt!\n{FFFFFF}Nun müssen die Positionen der Autos gespeichert werden!\nGebe nun die Anzahl der Autos für das Rennen ein!","OK","");
  226.     }
  227.     if(strcmp("/rrstart", cmdtext, true, 10) == 0)
  228.     {
  229.    
  230.     }
  231.     return 0;
  232. }
  233.  
  234. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  235. {
  236.     if(vehicleid != pDaten[playerid][Vehicle]) return TogglePlayerControllable(playerid, 0),TogglePlayerControllable(playerid, 1);
  237.     return 1;
  238. }
  239.  
  240. public OnPlayerExitVehicle(playerid, vehicleid)
  241. {
  242.     if(vehicleid == pDaten[playerid][Vehicle] && pDaten[playerid][inrace] == 2)
  243.     {
  244.         GameTextForPlayer(playerid, "Du hast 15 Sekunden, um in das Auto zurueckzukehren!", 5000, 3);
  245.         dtimer[playerid] = SetTimerEx("DestroyRacecar",15000,0,"i",playerid);
  246.     }
  247. }
  248.  
  249. public OnPlayerEnterCheckpoint(playerid)
  250. {
  251.     if(pDaten[playerid][Edit] == 1 && pDaten[playerid][pos] > 2)
  252.     {
  253.         DisablePlayerCheckpoint(playerid);
  254.         pDaten[playerid][pos] = 0;
  255.         pDaten[playerid][Edit] = 0;
  256.         DestroyVehicle(pDaten[playerid][Vehicle]);
  257.         DisablePlayerRaceCheckpoint(playerid);
  258.         return ShowPlayerDialog(playerid, DIALOG_AFTERE, DIALOG_STYLE_INPUT,"Strecke hinzugefügt!","{FFFFFF}Nun müssen die Positionen der Autos gespeichert werden!\nGebe nun die Anzahl der Autos für das Rennen ein!","OK","");
  259.     }
  260.     return 1;
  261. }
  262.  
  263. public OnPlayerEnterRaceCheckpoint(playerid)
  264. {
  265.     if(pDaten[playerid][inrace] == 2 && IsPlayerInAnyVehicle(playerid))
  266.     {
  267.         if(pDaten[playerid][check] == thischeck && pDaten[playerid][round] == runs) return SetPlayerRaceCheckpoint(playerid,1,point[0][0],point[0][1],point[0][2],point[1][0],point[1][1],point[1][2],5.0),pDaten[playerid][check] = 0;
  268.         else if(pDaten[playerid][check] == thischeck) return SetPlayerRaceCheckpoint(playerid,0,point[0][0],point[0][1],point[0][2],point[1][0],point[1][1],point[1][2],5.0),pDaten[playerid][check] = 0;
  269.         else if(pDaten[playerid][check] == thischeck-1) return SetPlayerRaceCheckpoint(playerid,0,point[thischeck][0],point[thischeck][1],point[thischeck][2],point[0][0],point[0][1],point[0][2],5.0),pDaten[playerid][check]++;
  270.         else if(pDaten[playerid][check] == 0)
  271.         {
  272.             if(pDaten[playerid][round] == runs)
  273.             {
  274.                 GameTextForPlayer(playerid, "Rennen abgeschlossen!", 2000, 3);
  275.                 DestroyVehicle(pDaten[playerid][Vehicle]);
  276.                 pDaten[playerid][inrace] = 0;
  277.                 pDaten[playerid][Vehicle] = 0;
  278.                 pDaten[playerid][check] = 0;
  279.                 pDaten[playerid][round] = 0;
  280.                 win[l] = playerid;
  281.                 if(l == 0) {
  282.                     PlayerPlaySound(playerid,5448,0.0,0.0,0.0);
  283.                     GameTextForPlayer(playerid, "Du wurdest erster!",2000,3);
  284.                 }
  285.                 else if(l == 1) GameTextForPlayer(playerid, "Du wurdest zweiter!",2000,3);
  286.                 else if(l == 2) GameTextForPlayer(playerid, "Du wurdest dritter!",2000,3);
  287.                 l++;
  288.                 for(new i = 0; i < 4; i++) PlayerTextDrawHide(playerid,lap[playerid][i]);
  289.                 DisablePlayerRaceCheckpoint(playerid);
  290.                 return 1;
  291.             }
  292.             new string[10];
  293.             pDaten[playerid][round]++;
  294.             pDaten[playerid][check]++;
  295.             format(string,10,"%i / %i",pDaten[playerid][round],runs);
  296.             PlayerTextDrawSetString(playerid,lap[playerid][3],string);
  297.         }
  298.         pDaten[playerid][check]++;
  299.         SetPlayerRaceCheckpoint(playerid,0,point[pDaten[playerid][check]][0],point[pDaten[playerid][check]][1],point[pDaten[playerid][check]][2],point[pDaten[playerid][check]+1][0],point[pDaten[playerid][check]+1][1],point[pDaten[playerid][check]+1][2],5.0);
  300.     }
  301.     return 1;
  302. }
  303.  
  304. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  305. {
  306.     if(newkeys & KEY_NO)
  307.     {
  308.         if(pDaten[playerid][Edit] == 1)
  309.         {
  310.             new text[15],Float:posi[3],strpos[60];
  311.             format(text,15,"pos%i",pDaten[playerid][pos]);
  312.             GetPlayerPos(playerid,posi[0],posi[1],posi[2]);
  313.             format(strpos,60,"%f,%f,%f",posi[0],posi[1],posi[2]);
  314.             dini_Set(pDaten[playerid][Run],text,strpos);
  315.             SCM(playerid,mcolor,"Checkpoint gesetzt!");
  316.             pDaten[playerid][pos]++;
  317.             return 1;
  318.         }
  319.         else if(GetPlayerVehicleID(playerid) == pDaten[playerid][runcar][pDaten[playerid][Auto]] && GetPlayerVehicleID(playerid) != 0)
  320.         {
  321.             new Float:posi[4],text[15],strpos[60];
  322.             GetVehiclePos(GetPlayerVehicleID(playerid),posi[0],posi[1],posi[2]);
  323.             GetVehicleZAngle(GetPlayerVehicleID(playerid),posi[3]);
  324.             format(text,15,"car%i",pDaten[playerid][pos]);
  325.             format(strpos,60,"%f,%f,%f,%f",posi[0],posi[1],posi[2],posi[3]);
  326.             dini_Set(pDaten[playerid][Run],text,strpos);
  327.             pDaten[playerid][Auto]--;
  328.             SCM(playerid,mcolor,"Auto gespeichert!");
  329.             if(pDaten[playerid][Auto] == 0)
  330.             {
  331.                 for(new i = 0; i < MAX_RACECARS; i++) DestroyVehicle(pDaten[playerid][runcar][i]);
  332.                 return ShowPlayerDialog(playerid,DIALOG_FINISH,DIALOG_STYLE_MSGBOX,"Rennen hinzugefügt","{FFFFFF}Du hast dieses Rennen erfolgreich hinzugefügt!\nUm es zu starten, öffne das Menü.","OK","");
  333.             }
  334.             pDaten[playerid][runcar][pDaten[playerid][Auto]] = CreateVehicle(rvehicle,posi[0]+5.0,posi[1]+5.0,posi[2]+3.0,posi[3],rvcolor1,rvcolor2,-1);
  335.             PutPlayerInVehicle(playerid,pDaten[playerid][runcar][pDaten[playerid][Auto]],0);
  336.             pDaten[playerid][pos]++;
  337.         }
  338.     }
  339.     return 1;
  340. }
  341.  
  342. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  343. {
  344.     switch(dialogid)
  345.     {
  346.         case DIALOG_EDIT:
  347.         {
  348.             if(!response) return SCM(playerid, mcolor,"Vorgang abgebrochen!");
  349.             if(listitem == 0)
  350.             {
  351.                 new pfad[20],count;
  352.                 for(new i = 0; i <= MAX_RACES; i++)
  353.                 {
  354.                     format(pfad,20,"RaceRun/race%i.txt",i);
  355.                     if(fexist(pfad)) count++;
  356.                 }
  357.                 if(count >= MAX_RACES) return ShowPlayerDialog(playerid,DIALOG_FAIL,DIALOG_STYLE_MSGBOX,"Aktion nicht möglich...","{FFFFFF}Du kannst keine Rennen mehr erstellen, da die maximale Anzahl erreicht ist!\nFalls du trotzdem ein neues erstellen möchtest lösche erst ein vorhandenes.","OK","");
  358.                 return ShowPlayerDialog(playerid, DIALOG_EDITA,DIALOG_STYLE_INPUT,"RaceRun - Name","Gebe einen Namen für das Rennen ein!","Weiter","Abbrechen");
  359.             }
  360.             else if(listitem == 1)
  361.             {
  362.                 if(starttime != -1) return ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_MSGBOX,"Aktion nicht möglich...","Es läuft bereits ein Rennen!\nBeende dieses erst.","OK","");
  363.                 new pfad[20],str[100],st[30];
  364.                 for(new i = 0; i < MAX_RACES; i++)
  365.                 {
  366.                     format(pfad,20,"RaceRun/race%i.txt",i);
  367.                     if(!fexist(pfad)) continue;
  368.                     format(st,30,"%s\n",dini_Get(pfad,"name"));
  369.                     strcat(str,st);
  370.                 }
  371.                 return ShowPlayerDialog(playerid, DIALOG_TIME,DIALOG_STYLE_LIST,"Wähle das Rennen, was du starten möchtest",str,"Auswählen","Abbrechen");
  372.             }
  373.             else if(listitem == 2)
  374.             {
  375.                 if(starttime == -1) return SCM(playerid, mcolor, "Zurzeit ist kein Event aktiv!");
  376.                 for(new i = 0; i < MAX_RACECARS; i++) DestroyVehicle(cars[i]);
  377.                 for(new i = 0; i < MAX_PLAYERS; i++) {
  378.                     if(pDaten[i][inrace] == 0) continue;
  379.                     GameTextForPlayer(i, "Rennen wurde administrativ abgebrochen!", 2000, 3);
  380.                     pDaten[i][inrace] = 0;
  381.                     pDaten[i][Vehicle] = 0;
  382.                     pDaten[i][check] = 0;
  383.                     pDaten[i][round] = 0;
  384.                     for(new td = 0; td < 4; td++) PlayerTextDrawHide(playerid,lap[i][td]);
  385.                 }
  386.                 starttime = -1; runs = 0; thiscar = -1; thischeck = -1;
  387.             }
  388.             else if(listitem == 3)
  389.             {
  390.                 new pfad[20],str[100],st[30];
  391.                 for(new i = 0; i < MAX_RACES; i++)
  392.                 {
  393.                     format(pfad,20,"RaceRun/race%i.txt",i);
  394.                     if(!fexist(pfad)) continue;
  395.                     format(st,30,"%s\n",dini_Get(pfad,"name"));
  396.                     strcat(str,st);
  397.                 }
  398.                 return ShowPlayerDialog(playerid, DIALOG_DESTROY,DIALOG_STYLE_LIST,"Wähle das Rennen, was du löschen möchtest",str,"Auswählen","Abbrechen");
  399.             }
  400.         }
  401.         case DIALOG_DESTROY:
  402.         {
  403.             new pfad[30],i2,i3;
  404.             while(i3 != listitem+1)
  405.             {
  406.                 format(pfad,30,"RaceRun/race%i.txt",i2);
  407.                 if(fexist(pfad)) i3++;
  408.                 i2++;
  409.             }
  410.             dini_Remove(pfad);
  411.         }
  412.         case DIALOG_EDITA:
  413.         {
  414.             if(!response) return SCM(playerid, mcolor,"Vorgang abgebrochen!");
  415.             new str[20],Float:posi[3],strpos[50];
  416.             for(new i = 0; i < MAX_RACES; i++)
  417.             {
  418.                 format(str,20,"RaceRun/race%i.txt",i);
  419.                 if(!fexist(str)) break;
  420.             }
  421.             format(pDaten[playerid][Run],30,str);
  422.             dini_Create(str);
  423.             dini_Set(str,"name",inputtext);
  424.             GetPlayerPos(playerid,posi[0],posi[1],posi[2]);
  425.             format(strpos,50,"%f,%f,%f",posi[0],posi[1],posi[2]);
  426.             dini_Set(pDaten[playerid][Run],"pos0",strpos);
  427.             new info[300];
  428.             format(info, sizeof(info),"{FFFFFF}Du kannst ein Rennen auf zwei Möglichkeiten erstellen.\nEntweder makierst du die Checkpoints mithilfe der San Andreas Map\noder du fährst die Strecke mit einem Auto ab und\ndrückst zum erstellen eines Checkpoints die Taste 'H'.");
  429.             return ShowPlayerDialog(playerid, DIALOG_EDITE,DIALOG_STYLE_MSGBOX,"Vorgang wählen...",info,"abfahren","Map");
  430.         }
  431.         case DIALOG_EDITE:
  432.         {
  433.             if(response)
  434.             {
  435.                 new Float:posi[4],info[300];
  436.                 GetPlayerPos(playerid,posi[0],posi[1],posi[2]);
  437.                 GetPlayerFacingAngle(playerid, posi[3]);
  438.                 pDaten[playerid][Vehicle] = CreateVehicle(avehicle,posi[0],posi[1],posi[2],posi[3],-1,-1,-1);
  439.                 PutPlayerInVehicle(playerid,pDaten[playerid][Vehicle],0);
  440.                 SetPlayerCheckpoint(playerid,posi[0],posi[1],posi[2],10.0);
  441.                 format(info,sizeof(info),"{FFFFFF}Fahre nun deine Strecke ab, die du hinzufügen möchtest.\nAchte darauf, dass du an den Punkten, wo ein Checkpoint sein soll,\ndie Taste {0076FF}'N'{FFFFFF} gedrückt wird. Der Spieler weiß sonst nicht, wo er her fahren soll!\n{0076FF}Achte darauf, dass du einen Rundkurs abfährst, damit es ein Rennen sein kann!\nWenn du fertig bist fahre in diesen Checkpoint");
  442.                 ShowPlayerDialog(playerid, DIALOG_INFO,DIALOG_STYLE_MSGBOX,"Und los geht's...",info,"OK","");
  443.                 pDaten[playerid][Edit] = 1;
  444.             }
  445.             else
  446.             {
  447.                 new info[300];
  448.                 format(info, sizeof(info),"{FFFFFF}Drücke nun auf die Taste 'Esc' und wähle im Menü die Map aus.\nHier kannst du nun per Rechtsklick den Weg makieren.\nAchte möglichst darauf, dass der Weg, den du ausählst befahrbar ist.\n{0076FF}Wenn du fertig bist gebe '/rrend' ein. (ohne ' ')");
  449.                 ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_MSGBOX,"Und los geht's...",info,"OK","");
  450.                 pDaten[playerid][Edit] = 2;
  451.             }
  452.         }
  453.         case DIALOG_AFTERE:
  454.         {
  455.             if(!IsNumeric(inputtext)) return ShowPlayerDialog(playerid, DIALOG_AFTERE, DIALOG_STYLE_INPUT,"Strecke hinzugefügt!","{BB0000}Hier müssen Zahlen eingegeben werden!\n{FFFFFF}Nun müssen die Positionen der Autos gespeichert werden!\nGebe nun die Anzahl der Autos für das Rennen ein!","OK","");
  456.             new Float:posi[4],Float:po[6],text[50],spll[3][10];
  457.             GetPlayerPos(playerid,posi[0],posi[1],posi[2]);
  458.             GetPlayerFacingAngle(playerid, posi[3]);
  459.             pDaten[playerid][Auto] = strval(inputtext);
  460.             pDaten[playerid][runcar][pDaten[playerid][Auto]] = CreateVehicle(rvehicle,posi[0]+5.0,posi[1]+5.0,posi[2]+3.0,posi[3],rvcolor1,rvcolor2,-1);
  461.             PutPlayerInVehicle(playerid,pDaten[playerid][runcar][pDaten[playerid][Auto]],0);
  462.             format(text,30,dini_Get(pDaten[playerid][Run],"pos0"));
  463.             split(text,spll,',');
  464.             po[0] = floatstr(spll[0]); po[1] = floatstr(spll[1]); po[2] = floatstr(spll[2]);
  465.             format(text,30,dini_Get(pDaten[playerid][Run],"pos1"));
  466.             split(text,spll,',');
  467.             po[3] = floatstr(spll[0]); po[4] = floatstr(spll[1]); po[5] = floatstr(spll[2]);
  468.             SetPlayerRaceCheckpoint(playerid, 0,po[0],po[1],po[2],po[3],po[4],po[5],5.0);
  469.             new string[400];
  470.             format(string,sizeof(string),"{FFFFFF}Fahre mit dem Auto an die gewünschte Position.\n{0076FF}Bleibe hierbei hinter dem Checkpoint, welche die Teleport-Position markiert!{FFFFFF}\nSobald du die 'N' Taste drückst, wirst du in ein anderes Auto gesetzt,\nwelches du wieder an eine gewünschte Stelle setzten sollst.\n");
  471.             strcat(string,"{0076FF}Die Wiederholungen des Vorgangs entsprechen der Anzahl der angegeben Autos.\n\nDer gesetzte Checkpoint ist in die Fahrt richtung ausgerichtet\nund makiert das Ziel. Achte darauf, das die Autos dahinter stehen und so ausgerichtet sind.");
  472.             return ShowPlayerDialog(playerid,DIALOG_CAR,DIALOG_STYLE_MSGBOX,"Auto-Position speichern",string,"OK","");
  473.         }
  474.         case DIALOG_TIME:
  475.         {
  476.             new i2,i3;
  477.             while(i3 != listitem+1)
  478.             {
  479.                 format(pDaten[playerid][Run],30,"RaceRun/race%i.txt",i2);
  480.                 if(fexist(pDaten[playerid][Run])) i3++;
  481.                 i2++;
  482.             }
  483.             return ShowPlayerDialog(playerid,DIALOG_RUNS,DIALOG_STYLE_INPUT,"Starttime","{FFFFFF}Gebe hier die Zeit in Sekunden an, wie das Rennen automatisch starten soll.\n[Gebe 0 für autostart ('/rrstart') ein]","OK","");
  484.         }
  485.         case DIALOG_RUNS:
  486.         {
  487.             if(!response) return 1;
  488.             if(!IsNumeric(inputtext)) return ShowPlayerDialog(playerid,DIALOG_TIME,DIALOG_STYLE_INPUT,"Starttime","{BB0000}Hier müssen Zahlen eingegeben werden!\n{FFFFFF}Gebe hier die Zeit in Sekunden an, wie das Rennen automatisch starten soll.\n[Gebe 0 für autostart ('/rrstart') ein]","OK","");
  489.             starttime = strval(inputtext);
  490.             if(starttime < 10 && starttime != 0) return ShowPlayerDialog(playerid,DIALOG_TIME,DIALOG_STYLE_INPUT,"Starttime","{BB0000}Gebe mind. 10 Sekunden an! (oder 0 für Autostart mit /rrstart)\n{FFFFFF}Gebe hier die Zeit in Sekunden an, wie das Rennen automatisch starten soll.","OK","");
  491.             return ShowPlayerDialog(playerid, DIALOG_START,DIALOG_STYLE_INPUT,"Rundenanzahl","{FFFFFF}Gebe hier die Runden an, die gefahren werden können. [mind. 1]","Weiter","Abbrechen");
  492.         }
  493.         case DIALOG_START:
  494.         {
  495.             if(!IsNumeric(inputtext)) return ShowPlayerDialog(playerid,DIALOG_RUNS,DIALOG_STYLE_INPUT,"Rundenanzahl","{BB0000}Hier müssen Zahlen eingegeben werden!\n{FFFFFF}Gebe hier die Runden an, die gefahren werden können. [mind. 1]","Weiter","");
  496.             runs = strval(inputtext);
  497.             if(runs < 1 || runs > MAX_LAPS) return ShowPlayerDialog(playerid,DIALOG_RUNS,DIALOG_STYLE_INPUT,"Rundenanzahl","{FFFFFF}Gebe hier die Runden an, die gefahren werden können. {BB0000}[mind. 1]","Weiter","");
  498.             l = 0; thischeck = -1; thiscar = -1;
  499.             new pl[10],spl[4][15],text1[60];
  500.             for(new i; i < MAX_PLAYERS; i++) {pDaten[i][inrace] = 0; pDaten[i][Vehicle] = 0; pDaten[i][check] = 0; pDaten[i][round] = 0;}
  501.             for(new i; i <= MAX_CHECKPOINTS; i++)
  502.             {
  503.                 format(pl,10,"pos%i",i);
  504.                 format(text1,30,dini_Get(pDaten[playerid][Run],pl));
  505.                 if(strlen(text1) == 0) break;
  506.                 split(text1,spl,',');
  507.                 thischeck++;
  508.                 point[i][0] = floatstr(spl[0]);
  509.                 point[i][1] = floatstr(spl[1]);
  510.                 point[i][2] = floatstr(spl[2]);
  511.             }
  512.             for(new i; i < MAX_RACECARS; i++)
  513.             {
  514.                 format(pl,10,"car%i",i);
  515.                 format(text1,60,dini_Get(pDaten[playerid][Run],pl));
  516.                 if(strlen(text1) == 0) break;
  517.                 thiscar++;
  518.                 split(text1,spl,',');
  519.                 cars[i] = CreateVehicle(rvehicle,floatstr(spl[0]),floatstr(spl[1]),floatstr(spl[2]),floatstr(spl[3]),rvcolor1,rvcolor2,-1);
  520.             }
  521.             now = thiscar;
  522.             SendClientMessageToAll(0x00C300FF,"Ein Rennen wurde gestartet! Tippe /rrtele, um dich dorthin zu teleportieren.");
  523.             PlayerPlaySound(playerid,5201,0.0,0.0,0.0);
  524.             SetTimer("RaceStart",starttime*1000-5000,false);
  525.         }
  526.     }
  527.     return 1;
  528. }
  529. public OnPlayerStateChange(playerid, newstate, oldstate)
  530. {
  531.     if(newstate == PLAYER_STATE_DRIVER && GetPlayerVehicleID(playerid) != pDaten[playerid][Vehicle]) {
  532.         for(new i; i < MAX_RACECARS; i++) if(cars[i] == GetPlayerVehicleID(playerid)) return RemovePlayerFromVehicle(playerid);
  533.     }
  534.     if(newstate == PLAYER_STATE_DRIVER && GetPlayerVehicleID(playerid) == pDaten[playerid][Vehicle] && pDaten[playerid][inrace] == 2)
  535.     {
  536.         GameTextForPlayer(playerid, "Weiter gehts!", 1000, 3);
  537.         KillTimer(dtimer[playerid]);
  538.     }
  539.     return 1;
  540. }
  541. public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
  542. {
  543.     if(pDaten[playerid][Edit] == 2)
  544.     {
  545.         new text[15],strpos[60];
  546.         static Float:ppos[3];
  547.         if(ppos[0] == fX && ppos[1] == fY && ppos[2] == fZ){ppos[0]=0; ppos[1]=0; ppos[2]=0; return 1;}
  548.         format(text,15,"pos%i",pDaten[playerid][pos]);
  549.         format(strpos,60,"%f,%f,%f",fX,fY,fZ);
  550.         dini_Set(pDaten[playerid][Run],text,strpos);
  551.         pDaten[playerid][pos]++;
  552.         ppos[0] = fX; ppos[1] = fY; ppos[2] = fZ;
  553.     }
  554.     return 1;
  555. }
  556.  
  557. forward Permissions(playerid, rank);
  558. public Permissions(playerid, rank) return pDaten[playerid][Rank] = rank;
  559.  
  560. forward RaceStart();
  561. public RaceStart()
  562. {
  563.     new string[10];
  564.     static ph = 5;
  565.     format(string,4,"%i",ph);
  566.     starttime = -1;
  567.     if(ph == 5) timer = SetTimer("RaceStart",1000,1);
  568.     else if(ph == 6)
  569.     {
  570.         for(new i = 0; i < MAX_PLAYERS; i++) {
  571.             if(pDaten[i][inrace] == 0) continue;
  572.             for(new td = 0; td < 4; td++) TextDrawHideForPlayer(i,Ampel[td]);
  573.         }
  574.         TextDrawColor(Ampel[1], -1073741569);
  575.         TextDrawColor(Ampel[2], 1684301055);
  576.         TextDrawColor(Ampel[3], 1684301055);
  577.         ph = 5;
  578.         KillTimer(timer);
  579.         return 1;
  580.     }
  581.     else if(ph == 0)
  582.     {
  583.         if(thiscar == now)
  584.         {
  585.             for(new i = 0; i < MAX_RACECARS; i++) DestroyVehicle(cars[i]);
  586.             starttime = -1; runs = 0; thiscar = -1; thischeck = -1;
  587.         }
  588.         TextDrawColor(Ampel[1], 1684301055);
  589.         TextDrawColor(Ampel[2], 1684301055);
  590.         TextDrawColor(Ampel[3], 12255487);
  591.         for(new i = 0; i < MAX_PLAYERS; i++) {
  592.             if(pDaten[i][inrace] == 0) continue;
  593.             for(new td = 0; td < 4; td++) {
  594.                 TextDrawHideForPlayer(i,Ampel[td]);
  595.                 TextDrawShowForPlayer(i,Ampel[td]);
  596.                 PlayerTextDrawShow(i,lap[i][td]);
  597.             }
  598.             SetPlayerRaceCheckpoint(i,0,point[0][0],point[0][1],point[0][2],point[1][0],point[1][1],point[1][2],5.0);
  599.             pDaten[i][check] = 0;
  600.             format(string,10,"1 / %i", runs);
  601.             PlayerTextDrawSetString(i,lap[i][3],string);
  602.             PlayerPlaySound(i, 5201,0.0,0.0,0.0);
  603.             GameTextForPlayer(i, "LOS!", 1000, 3);
  604.             TogglePlayerControllable(i,1);
  605.             pDaten[i][inrace] = 2;
  606.         }
  607.         print("vor motor");
  608.         if(thiscar >= 0) for(new i = thiscar; i >= 0; i--) DestroyVehicle(cars[i]);
  609.         new engine, lights, alarm, doors, bonnet, boot, objective;
  610.         for(new i = 0; i <= now; i++) {
  611.             print("motor");
  612.             GetVehicleParamsEx(cars[i], engine, lights, alarm, doors, bonnet, boot, objective);
  613.             SetVehicleParamsEx(cars[i], 1, lights, alarm, doors, bonnet, boot, objective);
  614.         }
  615.         ph = 6;
  616.         return 1;
  617.     }
  618.     else if(ph == 3)
  619.     {
  620.         for(new i = 0; i < MAX_PLAYERS; i++) {
  621.             if(pDaten[i][inrace] == 0) continue;
  622.             TextDrawHideForPlayer(i,Ampel[2]);
  623.             TextDrawColor(Ampel[2], -6487809);
  624.             TextDrawShowForPlayer(i,Ampel[2]);
  625.             GameTextForPlayer(i, string, 1000, 3);
  626.         }
  627.     }
  628.     else
  629.     {
  630.         for(new i = 0; i < MAX_PLAYERS; i++) {
  631.             if(pDaten[i][inrace] == 0) continue;
  632.             GameTextForPlayer(i, string, 1000, 3);
  633.         }
  634.     }
  635.     ph--;
  636.     return 1;
  637. }
  638.  
  639. forward DestroyRacecar(playerid);
  640. public DestroyRacecar(playerid)
  641. {
  642.     GameTextForPlayer(playerid, "Rennen abgebrochen!", 2000, 3);
  643.     DestroyVehicle(pDaten[playerid][Vehicle]);
  644.     for(new td = 0; td < 4; td++) PlayerTextDrawHide(playerid,lap[playerid][td]);
  645.     pDaten[playerid][inrace] = 0;
  646.     pDaten[playerid][Vehicle] = 0;
  647.     pDaten[playerid][check] = 0;
  648.     pDaten[playerid][round] = 0;
  649. }
  650.  
  651. IsNumeric(const string[])
  652. {
  653.     for (new i = 0, j = strlen(string); i < j; i++) if (string[i] > '9' || string[i] < '0') return 0;
  654.     return 1;
  655. }
  656. stock split(const strsrc[], strdest[][], delimiter)
  657. {
  658.     new i, li;
  659.     new aNum;
  660.     new len;
  661.     while(i <= strlen(strsrc))
  662.     {
  663.         if(strsrc[i] == delimiter || i == strlen(strsrc))
  664.         {
  665.             len = strmid(strdest[aNum], strsrc, li, i, 128);
  666.             strdest[aNum][len] = 0;
  667.             li = i+1;
  668.             aNum++;
  669.         }
  670.         i++;
  671.     }
  672.     return 1;
  673. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement