Beiträge von Mann im Mond

    Was soll passieren, wenn es mehrere mit der gleichen Score gibt? Irgeneinen davon auswählen oder wie?
    Um das zu lösen, musst du einen Schleife benutzen, die die Score aller Spieler kontrolliert mit
    GetPlayerScore(playerid);


    KEKS: Dein Code ist unlesbar,zumindest für mich. Einrücken würde den anderen entgegenkommen

    Ich habs es doch oben geschrieben. Warum benutzt du eine while Schleife innerhalb einer for Schleife. Ich habe dir oben die Sachen geschriben, die du machen musst. Nimm deinen Code von ganz oben, ohne diese while Schleife und füg bei "/enter" unter "SetPlayerInterior(...)"
    SetPlayerVirtualWorld(playerid,i);
    Dann fügst du bei /exit, nach der "{" von PlayerToPoint
    if(GetPlayerVirtualWorld(playerid) == i)
    {
    [Hier kommt jetzt sowas wie SetPlayerPos usw.]
    }


    So dann entferne die neue Variable der Häuser "Virtual World" wieder und du bist fertig

    Du liegst falsch:
    Ich habe zuvor das gleiche geschrieben:

    Zitat

    und später bei /exit eine Überprüfung

    Zitat

    Man machs mit einer Variabel


    Ich wollte es Audifire lediglich vereinfachen und ihm die unnötige Arbeit ersparen eine Variable zu erstellen. Ich denke da ist meine Lösung sowohl effektiver als auch dynamischer und einfacher. Mit dynamischer mein ich ganz einfach, dass einem das Script die Zählarbeit bei der Erstellung neuer Häuser abnimmt (Stichwort: "Hm, welche VirtualWorld kann ich denn jetzt noch verwenden").
    Solange Audifire nicht mehr als 255 Häuser macht, funktioniert meine vorgeschlagene Lösung mit 99% Sicherheit - auch ohne es getestet zu haben.

    Wenn du in keinem Auto sitzen würdest, könntest du
    public OnPlayerPickUpPickup(playerid, pickupid)
    verwenden, um dies zu überprüfen. Da dies allerdings für Fahrzeuge meines Wissens nach nicht funktioniert, musst du es mit PlayerToPoint lösen, wie weiter oben schon gesagt wurde. Allerdings musst du diese PlayerToPoint Abfrage jede Sekunde ausführen mit Hilfe eines Timers.


    // Oben
    forward Check();


    // In OnGameModeInit
    SetTimer("Check", 1000, 1);


    // der public
    public Check()
    {
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerToPoint(...))
    {
    // Was soll passieren
    }
    }
    }
    }
    Wenn du bereits einen Timer hast, der jede Sekunde einen public aufruft, mach den Code des publics am Besten gleich dort mit rein

    er du benutzt die schnellere und einfachere Variante: http://wiki.sa-mp.com/wiki/Fast_Commands


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    //dcmd(BEFEHL,LÄNGE,CMDTEXT);
    dcmd(hilfe,5,cmdtext);
    [...]
    }


    // dcmd_BEFEHL(playerid,params[])
    dcmd_hilfe(playerid,params[])
    {
    #pragma unused params // da du params, also den Text, den der Spieler hinter den Befehl geschrieben hat, nicht benutzt
    [...]
    return 1;
    }

    Ich hab dir doch bereits die Lösung oben geschrieben. Diese musstest du nur geringfügung abändern:
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(reason == 255)
    {
    SetPlayerScore(playerid,(GetPlayerScore(playerid)-2));
    }
    SetPlayerScore(killerid,(GetPlayerScore(killerid)+2));
    return 1;
    }
    Ohne das "www" funktionierts: http://wiki.sa-mp.com
    Speichern kannst wie oben gesagt mit Hilfe eines "Login/Register" Scripts, welches du auch selber schreiben könntest

    Alles was du suchst, kommt unter
    OnPlayerDeath(playerid,killerid,reason)
    playerid: Der Spieler der gestorben ist
    killerid: Der Mörder
    reason: Der Grund, siehe http://www.wiki.sa-mp.com


    Also z.B. entsprechend
    SetPlayerScore(playerid,(GetPlayerScore(playerid)-2));


    Mit dem Speichern kommt drauf an, ob du es in MySQL oder in einem File speichern will, auch dazu findest du unter wiki eine Anleitung

    Ja ist es, allerdings kann es ist dies sehr unsicher, da es nach einem Neustart immer mal passieren kann, dass ein Server abstürzt.
    Überprüfe lediglich die Uhrzeit mit
    gettime(stunde,minute,sekunde);
    Je kleiner der Zeitinterval des Timers, desto genauer, allerdings solltest du sicherstellen, dass es nur einmal passiert, dass der Server neustarte, z.B. mit Hilfe einer globalen Variablen. Um zu jeder vollen Stunde etwas aufzurufen, kannst du genauso eine lobale Variable verwenden und einen Timer, der jede Minute ausgeführt wird:
    // oben
    new gHour;


    //im Timer
    new
    hour,
    minute,
    second;
    gettime(hour, minute, second);
    if(hour > gHour)
    {
    // ... wird zur vollen Stunde nur einmal aufgerufen, da zuerst die lokale Variable erhöht wird, danach erst die globale
    }
    gHour = hour;
    [...]
    Es gibt aber mehrere Wege es umzusetzen, war nur ein kleines Beispiel, da ich nicht genau wusste, wann der Timer genau aufgerufen werden soll... Genau zur vollen Stunde, hauptsache um 2 oder wie auch immer

    Ich denke es liegt an deiner Überprüfung ob der Spieler ein bestimmter Member oder Leader ist. Mach um sicherzugehen, dass es dran nicht liegt ein else rein, welches eine Nachricht ausgibt
    if(PlayerInfo[playerid][pMember] == 8 || PlayerInfo[playerid][pLeader] == 8)
    {
    //[...]
    }
    else
    {
    SendClientMessage(playerid,FARBE," Falsches Team");
    }

    Du kannst es im Prinzip schon machen, allerdings nur bei selbst gemappten Häusern, bei anderen geht das nicht.
    Bei selbst gemachten Häusern müsstest du entsprechend jedes einzelne Objekt bewegen, dass diese auf dem Boden liegen, bzw. einfach wie oben bereits gesagt alle Objekte nach unten verschieben. Ist aber mit viel Aufwand verbunden...
    Ein Rakteneinschlag kannst du allerdings nicht überprüfen, außer du machst es ein wenig anders. Du überprüfst ob der Spieler den Feuerknopf drückt und gleichzeitig einen Raktenwerfer in der Hand hat und in der Nähe eines Hauses ist, welches zusammenfliegen kann. Ob der Spieler allerdings auf das Haus schiesst oder in Leere kann man nicht überprüfen...

    Wie KeksOf Death schon gesagt hat liegt der Fehler, dass dieser Befehl kommt am /breakout Befehl und nicht am /accept Befehl.


    new LawOffer[MAX_PLAYERS];
    // in OnPlayerConnect
    LawOffer[playerid] = 999;
    // im /breakout Befehl
    LawOffer[giveplayerid] = playerid // Oder je nachdem was du anstatt giveplayerid verwendest im /breakout Befehl

    Ich denk er braucht es in dem Befehl /backup. Du musst den Code oben einfach in deinen /backup Befehl einbauen. Wenn du mit dcmd arbeitest entsprechend in
    dcmd_backup(playerid,params[])
    {
    new
    Float:pX,
    Float:pY,
    Float:pZ;
    GetPlayerPos(playerid,pX,pY,pZ);
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(gTeam[i] == gTeam[playerid])
    {
    SetPlayerCheckpoint(i,pX,pY,pZ,3.0);
    SendClientMessage(i,FARBE,"...");
    }
    }
    }
    return 1;
    }
    Das muss natürlich noch erweitert werden und kann auch genauso normal in dem Befehl unter OnPlayerCommandText verwendet werden.

    Wie weiter oben schon gesagt wurde ist es kein Problem einen solchen Befehl mit
    einer Schleife
    for(new c = 0; c < MAX_VEHICLES; c++)
    einer Überprüfung ob das Auto gespawnt ist (such im englischen Forum nach "IsVehicleConnected" oder "IsVehicleSpawned")
    und
    SetVehicleToRespawn(c);
    kein Problem. Ob du diesen Befehl in ein FS packst oder in deinen Gamemode miteinbauest spielt keine Rolle. Allerdings ist es fraglich ob man extra ein FS machen sollte für einen Befehl... Ich würde dir deshalb dazu raten es in deinen Gamemode miteinzubauen.

    Oder du kannst MySQL zur Specherung deiner Datenb benutzen. Dann benötigst du allerdings eine entsprechende Datenbank und ein MySQL Plugin, das du im englischen SAMP Forum findest

    Das kann sein. Ich weiß nicht genau, wann es nicht aufgerufen wurde, habe es aber schon mehrmals erlebt bei Leuten mit Wlan z.B. Wann genau das der Fall ist weiß ich auch nicht und welche Voraussetzungen es geben muss, aber es geht