[SAMMELTHREAD] Kleine Scripting Fragen

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • Vielen Dank!


    Dann habe ich folgende Sache.


    Will bei Worldbounds x_max und x_min und y_max und y_min tauschen
    Dazu habe ich folgendes


    stock const Float:MAP_WORLDBOUNDS[][]={
    {-1728.326, -2977.858, -945.9079, -2323.897}
    };


    Jedoch meckert der wegen constant expression.


    Was ist daran falsch? Brauche ich fuer jeden Wert ne neue Variable?

    Einmal editiert, zuletzt von Sub Royal ()

  • Was ist daran falsch? Brauche ich fuer jeden Wert ne neue Variable?

    Nein, das Problem ist die Vorbelegung des Arrays im stock.
    Mache es so:
    stock TeleportPlayerToRandomPosition(playerid)
    {
    new Float:Z;
    new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1]));
    new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3]));
    MapAndreas_FindZ_For2DCoord(rx1,ry2,Z);
    SetPlayerPos(playerid,rx1,ry2,Z);
    }

  • Ich muss den Code Abschnitt aber in OnFilterScriptInit verwenden, weshalb es dann jedes mal, sobald ich das FS lade inserted wird.
    Habe sowas versucht, scheint aber nicht zu funktionieren @Jeffry



    db_free_result(db_query(db_handle, "CREATE TABLE IF NOT EXISTS `Settings`(`pSetting` INTEGER DEFAULT 1)"));


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Deshalb das INSERT OR IGNORE Query zusammen mit einem primary key (id zum Beispiel).
    Das wird dann nur ausgeführt, wenn die Zeile mit der id nicht existiert.


    INSERT OR IGNORE INTO Settings VALUES (0, 0);


    Die Tabelle hat dann zwei Spalten, einmal id als primary key und als zweites die pSetting.

  • Okay gut, verwende das nun und es wird inserted (auch nur einmalig wie gewollt), aber scheinbar funktioniert das laden des Wertes nicht mehr ordnungsgemäß, was habe ich falsch gemacht?


    Console:


    Successfully created a connection to "ServerSettings.db".
    INSERT OR IGNORE INTO `Settings` VALUES(0, 1)
    SELECT * FROM `Settings` WHERE `pSetting` = '0'


    Tabelle:


    ID 0, pSetting 1


    Code:



    public OnFilterScriptInit()
    {
    new DBResult: query,string[144];
    query = db_query(db_handle, string);

    // Create a connection to the database
    if((db_handle = db_open("ServerSettings.db")) == DB:0)
    {
    // Error
    print("Failed to open a connection to \"ServerSettings.db\".");
    SendRconCommand("exit");
    }
    else
    {
    // Success
    db_free_result(db_query(db_handle, "CREATE TABLE IF NOT EXISTS `Settings`(`ID` INTEGER PRIMARY KEY AUTOINCREMENT, `pSetting`)"));
    print("Successfully created a connection to \"ServerSettings.db\".");
    }



    format(string, sizeof string, "INSERT OR IGNORE INTO `Settings` VALUES(0, 1)");
    db_free_result(db_query(db_handle, string));
    printf(string);



    format(string, sizeof(string), "SELECT * FROM `Settings` WHERE `pSetting` = '%d'", aSetting);
    query = db_query(db_handle, string);



    new Field[5];
    db_get_field_assoc(query, "pSetting", Field, 5);
    aSetting = strval(Field);
    printf(string);



    return 1;
    }


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Kleiner einwand:for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
    (Wichtig ist das <=)


    GetPlayerPoolSize gibt die höchste Spieler ID zurück, wenn du < benutzt wird der letzte Spieler (der mit der höchsten ID) nie ausgewählt.

    Hab das ganze mal getestet. Einziges Problem ist nur das wir zwei Spieler waren und alle zwei waren Innocent. Es sollte jedoch einen Traitor geben. Wie kann ich das ganze Realisieren?
    Vielen Dank im Voraus!

  • ich hab aus meinem ersten Script das Waffenlager system übernommen, aber wenn ich jz eine Waffe in der Kammer (welche Textdraws sind) anklicke passiert nichts, genauso wie wenn ich Beenden drücke... es ist aber alles gescriptet.. bei OnPlayerClickPlayerTextDraw.



    public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
    {
    new WaffenString[200];
    if(playertextid == PlayerText:INVALID_TEXT_DRAW)
    {
    WaffenlagerVerstecken(playerid);
    CancelSelectTextDraw(playerid);
    }
    if(playertextid == Beenden[playerid])
    {
    WaffenlagerVerstecken(playerid);
    CancelSelectTextDraw(playerid);
    }
    if(playertextid == Waffe1[playerid])
    {
    switch(SpielerInfo[playerid][Fraktion])
    {
    case 1:
    {
    GivePlayerWeapon(playerid, 24, 150);
    format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}Deagle{FEFEFE} genommen", SpielerName(playerid));
    SendClientMessage(playerid, Weiss, "{00FF00}Deagle{FEFEFE} erhalten");
    SAPDWaffenEntnahmeSpeichern(WaffenString);
    }
    case 2:
    {
    GivePlayerWeapon(playerid, 24, 150);
    format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}Deagle{FEFEFE} genommen", SpielerName(playerid));
    SendClientMessage(playerid, Weiss, "{00FF00}Deagle{FEFEFE} erhalten");
    BwWaffenEntnahmeSpeichern(WaffenString);
    }
    case 3:
    {
    GivePlayerWeapon(playerid, 30, 250);
    format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}AK-47{FEFEFE} genommen", SpielerName(playerid));
    SendClientMessage(playerid, Weiss, "{00FF00}AK-47{FEFEFE} erhalten");
    TerrorWaffenEntnahmeSpeichern(WaffenString);
    }
    }
    }
    if(playertextid == Waffe2[playerid])
    {
    switch(SpielerInfo[playerid][Fraktion])
    {
    case 1:
    {
    GivePlayerWeapon(playerid, 29, 300);
    format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}MP5{FEFEFE} genommen", SpielerName(playerid));
    SendClientMessage(playerid, Weiss, "{00FF00}MP5{FEFEFE} erhalten");
    SAPDWaffenEntnahmeSpeichern(WaffenString);
    }
    case 2:
    {
    GivePlayerWeapon(playerid, 27, 50);
    format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}Combat-Shotgun{FEFEFE} genommen", SpielerName(playerid));
    SendClientMessage(playerid, Weiss, "{00FF00}Combat-Shotgun{FEFEFE} erhalten");
    BwWaffenEntnahmeSpeichern(WaffenString);
    }
    case 3:
    {
    GivePlayerWeapon(playerid, 31, 250);
    format(WaffenString, sizeof(WaffenString), "%s hat sich eine {00FF00}M4{FEFEFE} genommen", SpielerName(playerid));
    SendClientMessage(playerid, Weiss, "{00FF00}M4{FEFEFE} erhalten");
    TerrorWaffenEntnahmeSpeichern(WaffenString);
    }
    }
    }
    }

    Mit freundlichen Grüßen,
    Dachdecker

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


    Warum funktioniert MapAndreas bei mir nicht richtig?



    C
    stock TeleportPlayerToRandomPosition(playerid)
    {
    	new Float:Z;
    	new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1]));
    	new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3]));
    	MapAndreas_FindZ_For2DCoord(rx1,ry2,Z);
    	SetPlayerPos(playerid,rx1,ry2,Z);
    }

    Ich werde zwar teleportiert, jedoch ist die Z Koordinate irgendwie immer unter der Erde, woran liegt das?

  • Guten Tag,
    da ich mich gerade daran probiere einen TTT Server für Samp zu Scripten hätte ich mal 2 Fragen.


    Frage 1: Ist es möglich anzufragen ob ein Spieler afk ist und wie lange er das ist? (Ps: Die Include die ich hier im Forum gefunden habe funktioniert bei mir irgendwie nicht)


    Frage 2:
    Sobald die Runde anfängt wird dem Spieler der Wert: SpielGestartet = 1; zugewiesen.
    Nun habe ich einen Globalen Timer erstellt. In diesem soll Abgafragt werden ob alle Spieler tot sind, also wenn der Wert Tot =1; bei allen Spielern gesetzt ist wo SpielGestartet = 1 ist.
    Das habe ich ja realisiert bekommen. Meine Frage nun, wie kann ich abfragen wie viele Spieler den werr Tot = 1 haben?
    Ich möchte nämlich das wenn nur noch ein Spieler Lebt das Spiel beendet wird da ja kein anderer mehr lebt um den letzten überlebenden zu killen.


    Vielen Dank im Voraus!

  • wird das plugin geladen , hast du die SAfull.map im scriptfile ordner und wird das ganze aich initalisiert unter OnGameModeInit
    via MapAndreas_Init ?



    Frage 1: OnPlayerUpdate wird nicht mehr für den User aufgerufen, daran kannst du überprüfen ob der Spieler AFK ist oder nicht. Dafür benötigst du jedoch zusätzlich einen globalen Timer der einen Wert erhöht, welcher bei OnPlayerUpdate zurück gesetzt wird.


    Frage 2: Das kannst du mit einer schleife realisieren, welche durch alle spieler durchgeht, überprüft ob die werte zutreffen und einen eine variable hochzählt wie viele Spieler noch im rennen sind.

  • Ich weiß nicht ob das hier richtig ist aber kann mir einer Helfen ich weill ein PM System machen so das da steht von dem man die PM bekommen hat und zu wen man die PM geschrieben hat

    Ich habe lange gegoogelt und auch viel getestet es hat aber alles nicht funktioniert bzw. ich habe nichts passendes gefunden

    hier mein Code:



    Code: PM System
    ocmd:pm(playerid,params[])
    {
    	new pID,text[128];
    	if(sscanf(params,"is[128]",pID,text))return SendClientMessage(playerid,COLOR_RED,"Info: /pm [ID] [Nachricht]");
    	SendClientMessage(pID,COLOR_ORANGE,text);
    	return 1;
    }


    Hoffe mir kann einer Helfen :/

    Beiträge


    1 [Ja: X | Nein: ]
    50 [Ja: | Nein: X]
    80 [Ja: | Nein: X]
    100 [Ja: | Nein: X]

  • Moin, ich bringe mir momentan das Scripten sogut es geht ohne Tutorials bei hänge aber grad bei einer sache die wahrscheinlich simpler nicht sein könnte.



    dcmd_giverank(playerid,params[])
    {
    new pid;
    new rang = sSpieler[playerid][Rang];
    new spieler[256];
    new leader[256];
    new spielername[MAX_PLAYER_NAME];
    new leadername[MAX_PLAYER_NAME];
    GetPlayerName(pid,leadername,sizeof(leadername));
    GetPlayerName(playerid,spielername,sizeof(spielername));
    if(sscanf(params,"ud",pid,rang)) return SendClientMessage(playerid,Weiß,"Info: /giverank (playerid)(rang)");
    if(pid == INVALID_PLAYER_ID) return SendClientMessage(playerid,Weiß,"Der Spieler mit dieser ID ist nicht Online!");
    if(sSpieler[playerid][Leader] < 1) return SendClientMessage(playerid,Weiß,"Du bist kein Leader!");
    if(pid == playerid) return SendClientMessage(playerid,Weiß,"Du kannst dir nicht selbst einen Rang geben!");
    if(rang < 1 || rang > 6) return SendClientMessage(playerid,Weiß,"Der Rang muss zwischen 1 und 6 liegen!");
    if(sSpieler[playerid][Leader] >= 1)
    {
    sSpieler[pid][Rang] = rang;
    format(spieler,sizeof(spieler),"Du wurdest von %s zum Rang %d gemacht",leadername,rang);
    format(leader,sizeof(leader),"Du hast %s Rang %d gegeben.",spielername,rang);
    SendClientMessage(pid,Weiß,spieler);
    SendClientMessage(playerid,Weiß,leader);
    }
    return 1;
    }


    Dies ist mein aktueller /giverank Befehl für alle Fraktionen.
    Habe momentan 5 im Script. Funktioniert soweit alles gut.
    Wie gebe ich nun aber Jeder Ziffer 1 - 6 einen Namen und das für jede Fraktion?

  • aus dem "i" ein "u" machen.

  • Hey du must das mit format machen.
    ocmd:pm(playerid,params[])
    {
    new pID,text[128],string[160],name[32];
    if(sscanf(params,"us[128]",pID,text))return SendClientMessage(playerid,COLOR_RED,"Info: /pm [ID] [Nachricht]");
    GetPlayerName(playerid,name,sizeof(name));
    format(string,sizeof(string),"[PM] %s [%i] | %s",name,playerid,text);
    SendClientMessage(pID,COLOR_ORANGE,string);
    return 1;
    }


  • Dazu musst du mit String(Zeichenkette) arbeiten. z.B
    new string[128];
    format(string,sizeof(string),"PM von %s: %s",getPlayerName(playerid),text);
    SendClientMessage(pID,deinefarbehier,string);


    getPlayerName Funktion:
    getPlayerName(playerid)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    return name;
    }

  • Habe aktuell eine kleine Funktion geschrieben.


    Diese soll einfach 2 beliebige Spieler auf dem Server tauschen, also die Positionen beider Spieler tauschen.


    Kann ich das ganze noch optimieren?
    Ich habe leider nur diesen Ansatz bisher hingekriegt


    Oder die haessliche Variante ohne goto


    Einmal editiert, zuletzt von Sub Royal ()

  • goto ist zum 3.x jetzt oder so dreck ^^


    Schreib dir doch einfach eine Funktion die dir die IDs von 2 random Spielern wiedergibt und Kapsel das alles ein wenig.


    ast2ufdyxkb1.png


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

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