[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • if(strcmp(cmdtext, "/heal", true) == 0)
    {
    {
    new str[122];
    new name[MAX_PLAYER_NAME];
    if(AccInfo[playerid][pVip] >= 1 || AccInfo[playerid][Level] >= 1)
    if (!AccInfo[playerid][pVip]) return SendClientMessage(playerid, red, "** You are not a VIP Member to perform this command (/viphelp).");
    SetPlayerHealth(playerid, 100);
    PlayerPlaySound(playerid,1137,0.0,0.0,0.0);
    SendClientMessage(playerid, COLOR_VIP,"* You typed (/heal) to set your health to 100.");
    GetPlayerName(playerid, name, sizeof(name));
    format(str,sizeof(str),"** %s VIP %s has used the (/heal) command.",Status, name);
    MessageToAdmins(COLOR_MAUVE,str);
    }
    return 1;


    Normale Spieler und VIP's können den Befehl nutzen. Admins jedoch nicht? :s


    Nur Admins und VIP's sollten es benutzen können..

  • if(!strcmp(cmdtext,"/heal",true)){
    new string[128],name[MAX_PLAYER_NAME];GetPlayerName(playerid,name,MAX_PLAYER_NAME);
    if(!AccInfo[playerid][pVip] && !AccInfo[playerid][Level]) return SendClientMessage(playerid,red,"** Your aren't a VIP Member or a Admin to perform this command (/viphelp)!");
    SetPlayerHealth(playerid,100);
    PlayerPlaySound(playerid,1137,0,0,0);
    SendClientMessage(playerid,COLOR_VIP,"* You typed (/heal) to set your health to 100!");
    return format(string,128,"** %s VIP %s has used the (/heal) command!",Status,name),MessageToAdmin(COLOR_MAUVE,string);
    }
    So klappt es

    Einmal editiert, zuletzt von AirM4X ()

    • Offizieller Beitrag

    if(!AccInfo[playerid][pVip] || !AccInfo[playerid][Level])return SendClientMessage(playerid,red,"** Your aren't a VIP Member or a Admin to perform this command (/viphelp)!");

    if(!AccInfo[playerid][pVip] && !AccInfo[playerid][Level]) return SendClientMessage(playerid,red,"** Your aren't a VIP Member or a Admin to perform this command (/viphelp)!");




    Wenn der Admin kein VIP hat, hätte er es sonst nicht nutzen können (andersrum auch.. )

  • Push

    //OnPlayerUpdate
    new keys, ud, lr;
    GetPlayerKeys(playerid, keys, ud, lr);
    if(ud & KEY_UP || ud & -128)GibtGas[playerid] = true;
    else GibtGas[playerid] = false;


    Habe einen weiteren Fehler..
    Jeffry hat mir ja eine Funktion gegeben, die die Geschwindikeit des Spielers verändert, jedoch verändert es die Geschwindigkeit doch nicht..
    Ich habe mir die Geschwindigkeit immer ausgeben lassen usw, und es sah so aus, als ob es klappt..


    Die Geschwindigkeit verändert sich nur, wenn ich laufe und dabei springe. Dann verändert sie sich aber nicht um die Geschwindigkeit, die ich angegeben habe, sondern um 100, 200 , 2000, 3000 ( unterschiedlich ) km/h ..


    Hier nochmal ein Versuch, die Geschwindigkeit auf 30 km/h zu stellen ( OnPlayerUpdate )
    if(!IsPlayerInAnyVehicle(playerid) && !Jumped[playerid])
    {
    new Float:speed; GetPlayerSpeed_New(playerid,speed);
    return SetPlayerSpeed(playerid,30.0,speed);
    }


    Und hier nochmal die Funktionen "GetPlayerSpeed_New" & "SetPlayerSpeed"

    stock GetPlayerSpeed_New(playerid, &Float:speed) // By: [XST]O_x
    {
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid)!=PLAYER_STATE_PASSENGER)
    GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
    else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3;
    speed = ST[3];
    return 1;
    }
    stock SetPlayerSpeed(playerid, Float:_speed, Float:_isspeed){
    if(playerid == INVALID_PLAYER_ID)return INVALID_PLAYER_ID;
    if(IsPlayerNPC(playerid))return 1;
    if(IsPlayerInAnyVehicle(playerid))return 1;
    new Float:x1, Float:y1, Float:z1;
    GetPlayerVelocity(playerid, x1, y1, z1);
    return SetPlayerVelocity(playerid, x1*(1+(1/(1+(_speed/_isspeed)))), y1*(1+(1/(1+(_speed/_isspeed)))), z1);
    }


    Ist irgendwas falsch? ..


    //Post2


    new keys, ud, lr;
    GetPlayerKeys(playerid, keys, ud, lr);
    //Spielergeschwindigkeit..

    else if(IsPlayerInAnyVehicle(playerid))
    {
    new vehicle = GetPlayerVehicleID(playerid);
    if(keys & -128){
    printf("2");
    if(GetVehicleSpeed(vehicle) > float(VehSpeed[GetVehicleModel(vehicle)]))return SetVehicleSpeed(vehicle,float(VehSpeed[GetVehicleModel(vehicle)]));
    else if(GetVehicleSpeed(vehicle) >= float((VehSpeed[GetVehicleModel(vehicle)]/2)))SetVehicleSpeed(vehicle,GetVehicleSpeed(vehicle) +10);
    }
    }


    Außerdem wird die Taste nur manchmal ausgegeben ...



    //Post 1

    Habe auch anstatt


    ud & -128 //&
    ud & KEY_UP // &
    ud == KEY_UP // &
    ud & KEY_UP



    keys & KEY_UP // &
    keys == KEY_UP // &
    keys & -128 // &
    keys == -128



    Jedoch klappt nichts davon ..

  • Die Syntax ist doch einfach ^^

    if(Bedingung)
    {
    //true
    }
    else
    {
    //false
    }

    Das selbe jetzt mit deinen Fahrzeugen ^^ (und du solltest die Abfrage so machen: if(car == 520 || car == 425 || car == 432) da car ein Zwichenspeicher ist bzw. ein eindimensionaler und car != 520 UND 425 UND 432 sein kann ^^

  • //Der Code wird ausgeführt!
    if(car == 520 || car == 425 || car == 432)return SendClientMessage(playerid,COLOR_GREY,"** You aren't allowed to spawn this vehicle!");
    //Der Code wird nicht mehr ausgeführt, da return ....
    Ab dem return SendClientMessage... wird nichts mehr ausgeführt.

  • Hallo allerseits :)


    Ich habe anklickbare TextDraw's, allerdings möchte ich es so scripten, dass man nur ihren Text (string) anklicken kann.
    Im Moment ist es allerdings so, dass man sie auch noch bis zum Bildschirmrand rechts und unten anklicken kann ( ?( )
    Also muss ich nicht mit der Maus direkt auf dem Textdraw sein, sondern kann auch rechts daneben oder darunter sein,
    trotzdem werden sie ausgewählt und wenn ich klicke ausgeführt (falls sie anklickbar sind natürlich). Anscheinend gibt
    es eine Art 'unsichtbares Anklickfeld' ?


    Screens:





    OnGameModeInit (erstellen der Textdraws)

    Spoiler anzeigen
    new Text:Textdraw0;
    new Text:Textdraw1;
    new Text:Textdraw2;
    new Text:Textdraw3;

    Spoiler anzeigen
    public OnGameModeInit()
    {

    Spoiler anzeigen
    Textdraw0 = TextDrawCreate(489.000000, 136.833343, "usebox");
    TextDrawLetterSize(Textdraw0, 0.000000, 24.053705);
    TextDrawTextSize(Textdraw0, 149.500000, 0.000000);
    TextDrawAlignment(Textdraw0, 1);
    TextDrawColor(Textdraw0, 0);
    TextDrawUseBox(Textdraw0, true);
    TextDrawBoxColor(Textdraw0, 102);
    TextDrawSetShadow(Textdraw0, 0);
    TextDrawSetOutline(Textdraw0, 0);
    TextDrawFont(Textdraw0, 0);

    Spoiler anzeigen
    Textdraw1 = TextDrawCreate(295.000000, 133.933319, "Admin");
    TextDrawLetterSize(Textdraw1, 0.449999, 1.600000);
    TextDrawAlignment(Textdraw1, 1);
    TextDrawColor(Textdraw1, -1);
    TextDrawSetShadow(Textdraw1, 0);
    TextDrawSetOutline(Textdraw1, 1);
    TextDrawBackgroundColor(Textdraw1, 51);
    TextDrawFont(Textdraw1, 1);
    TextDrawSetProportional(Textdraw1, 1);

    Spoiler anzeigen
    Textdraw2 = TextDrawCreate(181.000000, 171.266723, "Einfrieren");
    TextDrawLetterSize(Textdraw2, 0.449999, 1.600000);
    TextDrawAlignment(Textdraw2, 1);
    TextDrawColor(Textdraw2, -1);
    TextDrawSetShadow(Textdraw2, 0);
    TextDrawSetOutline(Textdraw2, 1);
    TextDrawBackgroundColor(Textdraw2, 51);
    TextDrawFont(Textdraw2, 1);
    TextDrawSetProportional(Textdraw2, 1);
    TextDrawSetSelectable(Textdraw2, true);

    Spoiler anzeigen
    Textdraw3 = TextDrawCreate(181.000000, 200.199951, "Entfrieren");
    TextDrawLetterSize(Textdraw3, 0.449999, 1.600000);
    TextDrawAlignment(Textdraw3, 1);
    TextDrawColor(Textdraw3, -1);
    TextDrawSetShadow(Textdraw3, 0);
    TextDrawSetOutline(Textdraw3, 1);
    TextDrawBackgroundColor(Textdraw3, 51);
    TextDrawFont(Textdraw3, 1);
    TextDrawSetProportional(Textdraw3, 1);
    TextDrawSetSelectable(Textdraw3, true);
    }



    Hier werden sie dem Spieler angezeigt:

    Spoiler anzeigen
    public OnPlayerCommandText(playerid, cmdtext[]){if (strcmp("/admin", cmdtext, true, 10) == 0){TextDrawShowForPlayer(playerid, Textdraw0);TextDrawShowForPlayer(playerid, Textdraw1);TextDrawShowForPlayer(playerid, Textdraw2);TextDrawShowForPlayer(playerid, Textdraw3); SelectTextDraw(playerid, 0x00FF00FF);}return 0;}



    OnPlayerClickTextDraw():

    Spoiler anzeigen
    public OnPlayerClickTextDraw(playerid, Text:clickedid)
    {
    if(_:clickedid != INVALID_TEXT_DRAW) // If the player clicked a valid textdraw, continue with the coding. (_:var removes the Text: tag, to avoid tag mismatch)
    {

    Spoiler anzeigen
    if(clickedid == Textdraw2) // unser beispiel textdraw ?
    {
    ShowPlayerDialog(playerid, DIALOG_ADMIN_EINFRIEREN, DIALOG_STYLE_INPUT, "Admin", "Gebe die playerid des zu einfrierenden Spielers ein", "Einfrieren", "Abbruch");
    }

    Spoiler anzeigen
    TextDrawHideForPlayer(playerid, Textdraw0);
    TextDrawHideForPlayer(playerid, Textdraw1);
    TextDrawHideForPlayer(playerid, Textdraw2);
    TextDrawHideForPlayer(playerid, Textdraw3);

    Spoiler anzeigen
    CancelSelectTextDraw(playerid);
    }
    return 0;
    }

    2 Mal editiert, zuletzt von 085zehn () aus folgendem Grund: screens hinzugefügt.

  • Funktioniert super, danke! :)


    Nächste Frage: Wie bekomme ich aus dem inputtext eines Dialoges (DIALOG_STYLE_INPUT) eine playerid, bzw wie verwende ich sie weiter wenn sie eingegeben wurde?
    Ich habe hier eine Abfrage, ob es eine Zahl ist, aber mit strlen(inputtext) kann ich nicht weiterarbeiten, was Dialoge angeht bin ich noch nicht so geübt und das war das
    einzige, was mir eingefallen ist, da ich es mal woanders gesehen habe. strlen(inputtext) soll eig die playerid sein, aber nur inputtext nimmt er nicht :(


    Spoiler anzeigen

    if(!response) return SendClientMessage(playerid,-1,"Du hast den Vorgang abgebrochen.");
    if(!IsNumeric(inputtext)) return SendClientMessage(playerid, -1, "Du musst eine playerid eingeben!");
    new string[256];
    TogglePlayerControllable(strlen(inputtext), 0);
    format(string,sizeof(string),"Du hast %s eingefroren.", SpielerInfo[strlen(inputtext)][pName]);
    SendClientMessage(playerid, -1, string);

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen