Beiträge von Hagi

    Also erstmal, die Vorstellung ist nicht gut gemacht. Aber es geht ja um die Map:


    Eigentlich siehts ganz gut aus, vllt ein paar Kanten drin; aber sonst ganz gut gemacht. Was mit jetzt nicht gefällt, ist die Garage: Da sind die Wände einfach viel zu eintönig.

    Mal so ne Frage:


    Ich habe einen Radius (sagen wir mal 400 Meter) und ich möchte diesen auf der Minimap visuell sichtbar machen. Dann müsste ich ja mehrere GangZones nutzen und diese so anordnen, dass in etwa ein Kreis bei rauskommt (mit vielen kleinen Kanten, aber besser gehts halt nicht).


    Hat da jemand eine Funktion parat, die genau das macht? Ich meine ich hätte vor einiger Zeit mal was bezüglich dieses Problems gelesen, bin mir aber nicht mehr ganz sicher.

    Ach, was auch noch wichtig ist: Bei der Speed Funktion kannst/musst du den letzten Faktor deinen Bedürfnissen anpassen:


    gesch_f = floatsqroot(floatpower(fPos[0], 2) + floatpower(fPos[1], 2) + floatpower(fPos[2], 2)) * 170;


    Ich glaub mit 170 fährt ein Infernus knapp 240 km/h.

    Dann nimmste die for raus und klatscht das alles in OnPlayerUpdate :D



    if(!IsPlayerInAnyVehicle(playerid)) continue;
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) continue;
    if(!IsPlayerInRangeOfPoint(playerid,2.0,x,y,z)) continue; // hier kann auch eine Area benutzt werden
    new speed = getVehSpeed(playerid);
    if(speed > limit) // limit bitte angeben
    {
    new Float:health;
    GetVehicleHealth(GetPlayerVehicleID(playerid),health);
    SetVehicleHealth(GetPlayerVehicleID(playerid),health-wert); // wert bitte angeben
    }

    Darum bleib ich eigentlich immer gerne von OnPlayerUpdate weg, da es halt sehr oft (immer wenn beim Player was geupdated wird) aufgerufen wird. Da sind die 5 mal der Timer in der Sekunde weniger aufrufe. Dafür hat man beim Timer natürlich ne loop die alle Spieler durchgeht. Alternativ könnte man halt auch für jeden Spieler einen eigenen TimerEx verwenden. Dann summiert sich das aber natürlich auch wieder.

    Du brauchst erstmal ne Funktion, die dir die Geschwindigkeit berechnet:
    Hier ist eine, die ich mal für nen Speedo geschrieben hab:


    stock getVehSpeed(playerid)
    {
    new Float:gesch_f,gesch,Float:fPos[3];
    GetVehicleVelocity(GetPlayerVehicleID(playerid), fPos[0], fPos[1], fPos[2]);
    gesch_f = floatsqroot(floatpower(fPos[0], 2) + floatpower(fPos[1], 2) + floatpower(fPos[2], 2)) * 170;
    gesch = floatround(gesch_f);
    return gesch;
    }


    Dann brauchst du einen Timer mit einem sehr kleinen Delay (warum steht weiter oben in einem Post von mir)


    SetTimer("checkspeed",200,1); // Unter OnGameModeInit, alternativ kann man auch jedem Spieler einen eigenen Timer geben. KEine Ahnung ob das besser für die Performance ist


    Dann benötigen wir noch das check Callback



    forward checkspeed();
    public checkspeed()
    {
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(!IsPlayerInAnyVehicle(i)) continue;
    if(GetPlayerState != PLAYER_STATE_DRIVER) continue;
    if(!IsPlayerInRangeOfPoint(i,2.0,x,y,z)) continue; // hier kann auch eine Area benutzt werden
    new speed = getVehSpeed(i);
    if(speed > limit) // limit bitte angeben
    {
    new Float:health;
    GetVehicleHealth(GetPlayerVehicleID(i),health);
    SetVehicleHealth(GetPlayerVehicleID(i),health-wert); // wert bitte angeben
    }
    }
    }

    Das Problem mit der Area (und auch einer kleinen IsPlayerInRangeOfPoint) ist aber, dass diese dann nur so groß sein dürfte wie der Bremsstein. Da du allerdings einen Timer nutzen musst um die Position jedes Spielers zu überprüfen, muss dieser einen sehr kleinen Delay haben, da die Zeit, in der man in der Area oder im Radius ist dann dementsprechend klein ist. Also wird das ganze System sehr laufzeit- und performance lastig.

    Sicher?


    Allein dieser Satz, und da kommen noch die ganzen Platzhalter Variablen rein, hat schon 146 Zeichen:


    Zitat

    You are currently banned from this server.\nUser:%s\nIP:%s\nTime:%02d:%02d:on %02d/%s%02d/%s04%d\nAdmin: Anti Rcon Hack\nReason: Bad Rcon Attempt


    Gehen wir von 24 Zeichen des Nutzernamen aus: macht das
    146+22 (-2 wegen %s)
    Ip hat nochmal 15 Zeichen
    168+13(-2 wegen %s)
    Und dann kommen da nochmal Datum usw zu:


    Also brauchste schonmal minimum
    181+Datum und Zeit = etwa 200 Zeichen.

    Bin mir nicht ganz sicher, ob das in deiner Funktion Auto (Auto solltest du übrigens nicht verwenden, da das nen reservierter Begriff von Pawn ist) so funktioniert. Mach das ma lieber so:


    stock Autofunction(carid)
    {
    new modelid = GetVehicleModel(carid);
    if(modelid == 400 || modelid == 401 || modelid == 402 || modelid == 404 || modelid == 405 || modelid == 409 || modelid == 410 || modelid == 411 || modelid == 412 || modelid == 413 || modelid == 414 || modelid == 415 || modelid == 416) return 1;
    if(modelid == 418 || modelid == 419 || modelid == 420 || modelid == 421 || modelid == 422 || modelid == 423 || modelid == 424 || modelid == 426 || modelid == 427 || modelid == 428 || modelid == 429 || modelid == 434 || modelid == 436) return 1;
    if(modelid == 438 || modelid == 439 || modelid == 440 || modelid == 442 || modelid == 444 || modelid == 445 || modelid == 451 || modelid == 456 || modelid == 458 || modelid == 459 || modelid == 466 || modelid == 467 || modelid == 470) return 1;
    if(modelid == 474 || modelid == 475 || modelid == 477 || modelid == 478 || modelid == 479 || modelid == 480 || modelid == 482 || modelid == 483 || modelid == 489 || modelid == 490 || modelid == 491 || modelid == 492 || modelid == 494) return 1;
    if(modelid == 495 || modelid == 496 || modelid == 498 || modelid == 499 || modelid == 500 || modelid == 500 || modelid == 502 || modelid == 503 || modelid == 504 || modelid == 505 || modelid == 506 || modelid == 507 || modelid == 508) return 1;
    if(modelid == 516 || modelid == 517 || modelid == 518 || modelid == 525 || modelid == 526 || modelid == 527 || modelid == 528 || modelid == 529 || modelid == 533 || modelid == 534 || modelid == 535 || modelid == 536 || modelid == 540) return 1;
    if(modelid == 541 || modelid == 542 || modelid == 543 || modelid == 545 || modelid == 546 || modelid == 547 || modelid == 549 || modelid == 550 || modelid == 551 || modelid == 552 || modelid == 554 || modelid == 555 || modelid == 556) return 1;
    if(modelid == 557 || modelid == 558 || modelid == 559 || modelid == 560 || modelid == 561 || modelid == 562 || modelid == 565 || modelid == 567 || modelid == 568 || modelid == 575 || modelid == 576 || modelid == 579 || modelid == 580) return 1;
    if(modelid == 582 || modelid == 585 || modelid == 587 || modelid == 588 || modelid == 589 || modelid == 596 || modelid == 597 || modelid == 598 || modelid == 599 || modelid == 600 || modelid == 602 || modelid == 603 || modelid == 604) return 1;
    if(modelid == 605 || modelid == 609) return 1;
    return 0;
    }

    Schau dir mal den letzten Teil an:


    if(!strcmp(tmp,"Fallschirm",true))
    {
    format(string,sizeof(string),"Adminbefehl: %s hat sich ein Fallschirm gegeben.",SpielerName(playerid));
    GivePlayerWeapon(playerid,46,1);
    }
    if(!strcmp(tmp,"Keine",true))
    {
    format(string,sizeof(string),"Adminbefehl: %s hat alle seine Waffen entsorgt.",SpielerName(playerid));
    ResetPlayerWeapons(playerid);
    }
    else
    {
    SendClientMessage(playerid,FARBE_GRAU,"Waffe gibt es nicht");
    return 1;
    }


    Da du kein else if nutzt, wird nur bei der letzten if ein else mit der Nachricht ausgegeben, dass diese Waffe nicht existiert. Heißt, solange du dir "Keine" nicht gibst, kommt die Meldung. Gibst du dir hingegen "Keine" kommt keine Meldung mehr.

    Da wirst du einfach das Array per for durchlaufen müssen:


    if(GetVehicleModel(vehicleid) == BootName)


    Also:


    for(new i = 0;i<sizeof(BootName);i++)
    {
    if(GetPlayerVehicleModel(vehicleid) == BootName[i])
    {
    // hier code ausführen
    // kannst dann nen break; reinsetzen, da du die Schleife dann ja nicht mehr zu Ende laufen lassen musst.
    }
    }


    edit: Notfalls kannst du das auch mit einem enum lösen

    new enum modelenum
    {
    modelid
    };
    new BootName[][modelenum] = {
    {430},
    {446},
    {452},
    {453},
    {454},
    {472},
    {473},
    {484},
    {493},
    {595}
    };


    for(new i = 0;i<sizeof(BootName);i++)
    {
    if(GetPlayerVehicleModel(vehicleid) == BootName[i][modelid])
    {
    // hier code ausführen
    // kannst dann nen break; reinsetzen, da du die Schleife dann ja nicht mehr zu Ende laufen lassen musst.
    }
    }

    Ich kenne das GF jetzt nicht, aber wenn du die Bank meinst, die fast jedes Script benutzt, dann suchst du vergeblich. Das ist nämlich kein Interior sondern ein Raum in der Ortschaft Palomino Creek. Du meinst doch das wo man im SP die Bank ausraubt?

    Okai, fangen wir ganz vorne an.


    Es gibt in fast allen Programmiersprachen Variablen.


    In Pawn (das womit man einen SAMP Server codet) deklariert man diese folgendermaßen:


    new dasisteinstring[128]; // Die Zahl in Klammern gibt die Anzahl der Cells an. Also wenn man so will die Anzahl der Buchstaben
    new dasisteinint; // Ein Integer, auch Ganzzahl (z.B. 1234) benötigt keine Cells, daher auch keine Angabe dazu
    new Float:dasisteinefloat // Eine Float, auch Fließkommazahl (z.B. 123,567) benötigt den Prefix Float: vor dem Bezeichner der Variable


    Da wir hier mit dem Spielernamen, also einer Zeichenkette (String) arbeiten wollen, benötigen wir Variablen des ersten Typs (siehe oben).


    new playername[MAX_PLAYER_NAME]; // Ich deklariere hier eine Variable des Typs String (eigentlich Array aber ist ja egll). Diese hat 24 Cells, da MAX_PLAYER_NAME für die Zahl 24 steht


    In diese Variable wollen wir jetzt den Spielernamen schreiben. Das native (also die Funktion) GetPlayerName(playerid,string,len); SChreibt uns den Namen des Spielers mit der ID = playerid direkt in den angegebenen String:
    new playername[MAX_PLAYER_NAME];
    GetPlayerName(playerid,playername,sizeof(playername));
    Alternativ könnte man auch folgendes machen:
    new playername[24];
    GetPlayerName(playerid,playername,24);


    Damit steht dann der Name des Spielers mit der ID playerid in der Variable 'playername';


    Da wir jetzt den Namen in einen andere String "einbauen" wollen, müssen wir erstmal einen anderen String deklarieren:


    new stringmitname[64]; // in diesen String passen 64 ASCII Zeichen


    Jetzt kommen wir zum native format. Mit format können wir Datentypen (String,Integer,Float usw.) in einen String schreiben. Dafür werden im Text Platzhalter verwendet:


    Code
    %b 	Inserts a number at this position in binary radix
    %c 	Inserts a single character.
    %d 	Inserts an integer (whole) number
    %f 	Inserts a floating point number.
    %i 	Inserts an integer.
    %s 	Inserts a string.
    %x 	Inserts a number in hexadecimal notation.
    %% 	Inserts the literal '%'


    Wollen wir also den Spielernamen in die Varialb schreiben, benötigen wir %s, da es sich bei 'playername' um einen String handelt:


    new stringmitname[64];
    format(stringmitname,sizeof(stringmitname),"Dein Name lautet: %s",playername);
    Alternativ geht auch
    new stringmitname[64];
    format(stringmitname,64,"Dein Name lautet: %s",playername);