Angepinnt [SAMMELTHREAD] Kleine Scripting Fragen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

  • Ich speicher mir aber immer nur den Index, ich kann ja dann nicht abfragen ob "JobFahrzeug[playerid] == i" ist ?
    Da es ja noch andere Fahrzeuge mit dem Index gibt.

    Was passiert denn, wenn ich die VID speichere das Fahrzeug heißt Job1Fahrzeug[2], wenn ich das einer Variable gebe heißt die doch nicht auch Job1Fahrzeug[2] oder?

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • BrightLeaN schrieb:

    aber immer nur den Index
    Du kannst doch das rückwärts machen:


    C-Quellcode

    1. stock GetUserByVehicle(vehicleid)
    2. {
    3. for(new i=GetPlayerPoolSize(),idx; i!=-1; i--)
    4. {
    5. if(!IsPlayerConnected(i)) continue;
    6. idx = JobFahrzeug[i];
    7. if(idx == -1) continue; //ungültiger Index (Wert evtl abändern)
    8. if(vehicleid == Job1Fahrzeug[idx]) return i;
    9. }
    10. return INVALID_PLAYER_ID;
    11. }
    Alles anzeigen
    Und dann bekommst du die playerid von dem Spieler, dem das Fahrzeug mit dem dazugehörigen index gehört :)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Hö,
    ich wunder mich gerade, wie ich die Objekte destroye vom Fahrzeug?
    ObjektLkwJob1[1][/*Index*/]

    Der Index ist ja gleich pInfo[playerid][pJobVeh] (< -- das ist JobFahrzeug)
    Ist das nicht Riskant?

    Funktioniert der Code so auch, wenn ich nicht der Killer vom Fahrzeug bin, sollte es ja, kann es nur nicht testen :D

    C-Quellcode

    1. public OnVehicleDeath(vehicleid, killerid)
    2. {
    3. if(GetUserByVehicle(vehicleid) != INVALID_PLAYER_ID)
    4. {
    5. new string[250];
    6. format(string,sizeof(string),"(DEBUG) - vehicleid: %d, Index: %d",vehicleid,pInfo[killerid][pJobVeh]);
    7. SCM(killerid,-1,string);
    8. SCM(killerid,-1,"Job Abgebrochen");
    9. LKWJob1[killerid] = false;
    10. LKWJob1Ende[killerid] = false;
    11. LKWObjectStatus[killerid] = 0;
    12. pInfo[killerid][pJobVeh] = -1;
    13. DisablePlayerCheckpoint(killerid);
    14. }
    15. return 1;
    16. }
    Alles anzeigen

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Wie realisiere ich am cleversten ein "Runden" System in einem Gamemode mit mehreren Minigames?

    Weil bei einer Programmiersprache wie C oder PAWN wird sowas ja ziemlich sperrig, wenn ich in jedem public abfragen muss welcher Spielmodus aktuell aktiv ist, und ich dann immer fuer diesen Modus die Dinge definieren muss.
    Undzwar ich habe folgendes.
    Ich habe bspw. Spielmodi wie Deathmatch Rennen etc. und nachdem z.B. ein Deathmatch gespielt wurde, soll aus dem Pool der Minigames ein anderer ausgesucht werden, und dieser dann gestartet werden.
    Bisher habe ich das ziemlich doof geloest indem ich halt fuer jeden Mode ein eigenes Script habe, was vermutlich einfacher ist.
    Problem ist: Das Random aussuchen geht schwer, und der gmx ist ja auch nervig.

    Oder ist da der Weg ueber eine objektorientierte Sprache ueber APIs sinvoller?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Sub Royal ()

  • PAWN-Quellcode

    1. else if(BeatUnix[i] == 0
    2. zu:
    3. if(BeatUnix[i] > 0) { BeatUnix[i] --; }
    4. else if(BeatUnix[i] <= 0) { UnfreezePlayer(i); }


    Verstehe aber auch nicht wieso du den PVar setzt, den Spieler Entfreezt und dann den PVar wieder auf 0 setzt.
    In dieser Abfrage, ergibt dies keinen wirklichen Mehrsinn.

    MfG.
    Bestes Zitat des Jahres von Max Jackson!
    Vertrauen kann man mir auch, ich bin hier auf Breadfish schon sehr lange Aktiv und das sollte schon auf einer gewissen Weise, eine Vertrauensbasis schaffen. Ich meine, meine schlimmste Verwarnung war lediglich eine Morddrohung - Is ja nix.
  • itsMagic. schrieb:

    PAWN-Quellcode

    1. else if(BeatUnix[i] == 0zu:if(BeatUnix[i] > 0) { BeatUnix[i] --; }else if(BeatUnix[i] <= 0) { UnfreezePlayer(i); }


    Verstehe aber auch nicht wieso du den PVar setzt, den Spieler Entfreezt und dann den PVar wieder auf 0 setzt.
    In dieser Abfrage, ergibt dies keinen wirklichen Mehrsinn.

    MfG.
    Wird trotzdem weiterhin ausgeführt.
    Mit freundlichen Grüßen
    ArcadioN
  • Zeig mal bitte die ganze Funktion dazu.

    //e Und bei UnfreezePlayer();
    BeatUnix = -1;

    Und deine Abfrage ändern in:
    else if(BeatUnix[i] == 0zu:if(BeatUnix[i] > 0) { BeatUnix[i] --; }else if(BeatUnix[i] == 0) { UnfreezePlayer(i); }
    Bestes Zitat des Jahres von Max Jackson!
    Vertrauen kann man mir auch, ich bin hier auf Breadfish schon sehr lange Aktiv und das sollte schon auf einer gewissen Weise, eine Vertrauensbasis schaffen. Ich meine, meine schlimmste Verwarnung war lediglich eine Morddrohung - Is ja nix.
  • itsMagic. schrieb:

    Zeig mal bitte die ganze Funktion dazu.

    //e Und bei UnfreezePlayer();
    BeatUnix = -1;

    Und deine Abfrage ändern in:
    else if(BeatUnix[i] == 0zu:if(BeatUnix[i] > 0) { BeatUnix[i] --; }else if(BeatUnix[i] == 0) { UnfreezePlayer(i); }

    PAWN-Quellcode

    1. if(Spieler[i][pKnast] == 1) {
    2. if(Spieler[i][pKnasttime] > 0) { Spieler[i][pKnasttime] --; }
    3. else {
    4. Spieler[i][pKnast] = 0;
    5. Spieler[i][pKnasttime] = 0;
    6. Spieler[i][pKnastZelle] = 0;
    7. SetPlayerInterior(i,0);
    8. SetPlayerVirtualWorld(i,0);
    9. UnfreezePlayer(i);
    10. SpawnPlayer(i);
    11. }
    12. if(BeatUnix[i] > 0) { BeatUnix[i] --; }
    13. else if(BeatUnix[i] <= 0) { UnfreezePlayer(i); }
    14. }
    Alles anzeigen
    Mit freundlichen Grüßen
    ArcadioN

  • Hier, so sollte es klappen.

    PAWN-Quellcode

    1. if(Spieler[i][pKnast] == 1){
    2. if(Spieler[i][pKnasttime] > 0) { Spieler[i][pKnasttime] --; }
    3. else {
    4. Spieler[i][pKnast] = 0;
    5. Spieler[i][pKnasttime] = 0;
    6. Spieler[i][pKnastZelle] = 0;
    7. SetPlayerInterior(i,0);
    8. SetPlayerVirtualWorld(i,0);
    9. UnfreezePlayer(i);
    10. SpawnPlayer(i);
    11. }
    12. if(BeatUnix[i] > 0) { BeatUnix[i] --; }
    13. else { UnfreezePlayer(i); BeatUnix[i] = 0;}
    14. }
    Alles anzeigen
    Bestes Zitat des Jahres von Max Jackson!
    Vertrauen kann man mir auch, ich bin hier auf Breadfish schon sehr lange Aktiv und das sollte schon auf einer gewissen Weise, eine Vertrauensbasis schaffen. Ich meine, meine schlimmste Verwarnung war lediglich eine Morddrohung - Is ja nix.
  • Wenn ich diesen Befehle eingebe kommt das ich bitte die /help öffnen soll.

    Wo liegt der Denkfehler ?


    PAWN-Quellcode

    1. CMD:accept(playerid,params[])
    2. {
    3. if(!Spieler[playerid][pLoggedIn])return 1;
    4. new option[32],string[128];
    5. if(sscanf(params,"s[32]",option))
    6. {
    7. SendClientMessage(playerid,Grau,"|__________________ Accept __________________|");
    8. SendClientMessage(playerid,Weiss,"Verwendung: /accept [Name]");
    9. SendClientMessage(playerid,Weiss,"Verfügbare Namen: Stats");
    10. SendClientMessage(playerid,Grau,"|____________________________________________|");
    11. return 1;
    12. }
    13. if(strcmp(option,"Stats",true) == 0)
    14. {
    15. if(AcceptStats[playerid] != -255)
    16. {
    17. AcceptStats[playerid] = -255;
    18. ShowStats(AcceptStats[playerid],playerid);
    19. format(string,sizeof(string),"* %s schaut sich deine Statistik an.",Spieler[playerid][pName]);
    20. SendClientMessage(AcceptStats[playerid],Hellblau,string);
    21. }
    22. else { SendClientMessage(playerid,Grau,"Niemand hat dir das Angebot gemacht, sich Statistiken anzuschauen."); }
    23. }
    24. return 1;
    25. }
    Alles anzeigen
    Mit freundlichen Grüßen
    ArcadioN
  • Sub Royal schrieb:

    Bisher habe ich das ziemlich doof geloest indem ich halt fuer jeden Mode ein eigenes Script habe, was vermutlich einfacher ist.
    Problem ist: Das Random aussuchen geht schwer, und der gmx ist ja auch nervig.
    Nutze doch Includes ;)

    Für jeden Mode, ein Include :)

    Und baust halt in jedes Include auch eine Reset Funktion ein, was alle Objekte + Fahrzeuge etc zerstört und eben alles zurücksetzt :)

    Dann brauchst du keinen gmx, setzt das einfach alles zurück und startest einfach den neuen Mode mit einer Init Funktion :)

    Dann hast du auch alles separat, aber ohne gmx oder anderen Schnick-Schnack. (arbeite schön mit static, dann kommt sich da nichts in die Quere Modularer Skripten).


    Madness schrieb:

    Wenn ich diesen Befehle eingebe kommt das ich bitte die /help öffnen soll.
    Wie die /help...was meinst du? Davon steht doch gar nichts im Befehl?

    Aber ich würde es an deiner Stelle so schreiben:


    C-Quellcode

    1. //Falls du eins der Makros nicht hast:
    2. #define SCM SendClientMessage
    3. #define SCME(%0,%1,%2,%3) format(string,sizeof(string),%2,%3),SCM(%0,%1,string)
    4. #define IsNull(%0) (%0[0] == '\0' || %0[0] == '\1')
    5. //Und dann so der Code:
    6. CMD:accept(playerid,params[])
    7. {
    8. if(!Spieler[playerid][pLoggedIn]) return 1;
    9. if(IsNull(params))
    10. {
    11. SCM(playerid,Grau,"|__________________ Accept __________________|");
    12. SCM(playerid,Weiss,"Verwendung: /accept [Name]");
    13. SCM(playerid,Weiss,"Verfügbare Namen: Stats");
    14. SCM(playerid,Grau,"|____________________________________________|");
    15. return 1;
    16. }
    17. if(!strcmp(params,"Stats",true))
    18. {
    19. if(AcceptStats[playerid] == -255) return SCM(playerid,Grau,"Niemand hat dir das Angebot gemacht, sich Statistiken anzuschauen.");
    20. AcceptStats[playerid] = -255;
    21. ShowStats(AcceptStats[playerid],playerid);
    22. new string[64];
    23. SCME(AcceptStats[playerid],Hellblau,"* %s schaut sich deine Statistik an.",Spieler[playerid][pName]);
    24. }
    25. return 1;
    26. }
    Alles anzeigen
    Finde du solltest Makros nutzen...weiiil macht den Code übersichtlicher und du kannst wesentlich schneller skripten, aber jeder wie er mag.

    Kannst natürlich auch alles ausschreiben...

    Falls du etwas mehr lesen magst: breadfish.de/index.php?thread/…-strukturierter-skripten/

    Gibt viele Infos darüber :)

    Aber ist natürlich jedem selbst überlassen ^^


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Kaliber schrieb:

    Für jeden Mode, ein Include
    Halt ich persönlich nicht für sinnvoll,
    Dort verliert man eher die Übersicht und man muss für jedes Objekt/Auto/Textdraw etc. diese dauernd neu und entladen.
    Das ist nicht nur viel zu aufwändig sondern auch nervenaufreibend, wenn man eine Sache irgendwie vergessen hat zu löschen.

    Sinnvoller wäre es hier mit changemode -> SendRconCommandzu arbeiten und entsprechend verschiedenen Gamemodes.
    Man kann den Mode sogar zufällig auswählen lassen. Geht mit Modes in einem Gamemode auch, aber man kommt um hooking und abfragen welcher Mode aktiv ist nicht herum.
    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."
    Margarete Stokowski
  • Akino Kiritani schrieb:

    Dort verliert man eher die Übersicht
    Worüber?


    Akino Kiritani schrieb:

    und man muss für jedes Objekt/Auto/Textdraw etc. diese dauernd neu und entladen.
    dauernd? 1x laden und 1x entladen...

    Das spart halt aber den gmx...


    Akino Kiritani schrieb:

    wenn man eine Sache irgendwie vergessen hat zu löschen.
    Wie sollte das denn passieren?
    Wenn es genau N Variablen gibt, muss man doch nur durch N Variablen gehen mit einer Schleife und eben löschen...


    Naja..wie jeder meint, ich find es äußerst praktisch xD


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Kaliber schrieb:

    dauernd? 1x laden und 1x entladen...
    Für jeden mode einmal
    Also schon "dauernd"

    Kaliber schrieb:

    Das spart halt aber den gmx...
    Ein Glück haben wir heute alle keine Zeit mehr. Zumal das Laden und Entladen von allem auch "Zeit kostet".

    Kaliber schrieb:

    Worüber?
    Wenn man mit pawno arbeitet dann verliert man schon schnell die Übersicht, wenn man wirklich Modular arbeitet.
    Wenn man jeden Mode in ein Include packe, dann kann ich auch gleich bei seperaten Modes bleiben und muss mir keine Gedanken darüber machen ob ich alles entladen habe.

    Kaliber schrieb:

    Wenn es genau N Variablen gibt, muss man doch nur durch N Variablen gehen mit einer Schleife und eben löschen...
    Dann muss man jedes Object in einen Objekt Pool packen, find ich - falls man keinen Streamer benutzt, etwas blöd.

    Kaliber schrieb:

    Naja..wie jeder meint, ich find es äußerst praktisch xD
    Das musst du mir jetzt mal erklären, in wiefern ist es praktischer, alles in einer riesigen Sammlung an Includes zu haben, die man nicht mal ohne restart neu laden kann ?

    Modulares arbeiten hat durchaus seine Vorteile, aber hier ist es mMn nicht angebracht.
    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."
    Margarete Stokowski
  • Mois,
    random(sizeof(/*Array-Name*/));
    Wie kann ich die ersten beiden Einträge eine geringe Wahrscheinlichkeit geben beim randomisieren wie zuvor gezeigt?

    Heißt ich will das die Zahl 0 oder 1 eine geringere Wahrscheinlichkeit haben als die 2 hier im Beispiel

    C-Quellcode

    1. stock const AHVehTypes1[][] =
    2. {
    3. {"Fahrzeug1",410, 2500}, //Geringe Wahrscheinlichkeit
    4. {"Fahrzeug2",411, 1000},
    5. {"Fahrzeug3",412, 5020}, //hohe Wahrscheinlichkeit

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Du kannst das bspw. prozentual machen

    PAWN-Quellcode

    1. new rand = random(100);
    2. if(rand < 20) // Fahrzeug 1
    3. else if(rand >= 20 && rand < 30) // Fahrzeug 2
    4. else if(rand >= 30) // Fahrzeug 3
    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."
    Margarete Stokowski
  • Wann benutzte ich >= und wann >
    Ist das nicht das Selbe?


    Irgendwie spawnt mein Fahrzeug nicht, warum?

    C-Quellcode

    1. stock const Float:AHCarSpawn1[][] =
    2. {
    3. {740.280,-1346.980,13.209,242.152},
    4. //... +5 Einträge
    5. };


    C-Quellcode

    1. new AutohausCar1[6];

    Quellcode

    1. stock const AHVehTypes1[][] =
    2. {
    3. {"X","X",411,1},
    4. // +8 Einträge
    5. };

    C-Quellcode

    1. for(new i; i<sizeof(AHCarSpawn1); i++)
    2. {
    3. for(new icar; icar<sizeof(AutohausCar1); icar++)
    4. {
    5. new Fahrzeug;
    6. new zufall = random(1000);
    7. if(zufall < 10) Fahrzeug = 0;
    8. else if(zufall <= 10 && zufall < 20) Fahrzeug = 1;
    9. else if(zufall >= 21) Fahrzeug = random(7) + 2;
    10. new Color1 = random(127);
    11. new Color2 = random(127);
    12. AutohausCar1[icar] = CreateVehicle(AHVehTypes1[Fahrzeug][2], AHCarSpawn1[i][0], AHCarSpawn1[i][1], AHCarSpawn1[i][2], AHCarSpawn1[i][3], Color1, Color2, 300);
    13. }
    14. }
    Alles anzeigen

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • BrightLeaN schrieb:

    new zufall = random(1000);
    if(zufall < 10) Fahrzeug = 0;
    else if(zufall <= 10 && zufall < 20) Fahrzeug = 1;
    else if(zufall >= 21) Fahrzeug = random(7) + 2;
    Mach mal nur:

    C-Quellcode

    1. new zufall = random(100);
    2. if(zufall < 10) Fahrzeug = 0; //10% Wahrscheinlich
    3. else if(zufall < 20) Fahrzeug = 1; //10% Wahrscheinlich
    4. else Fahrzeug = random(7) + 2; //80% Wahrscheinlich
    > bedeutet eben echt größer.

    6 > 5 = 6 ist größer als 5...richtig
    6 > 6 = 6 ist größer als 6...falsch

    6 => 5 = 6 ist größer gleich 5...richtig
    6 => 6 = 6 ist größer gleich 6...richtig

    Also >= ist größer oder gleich


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/