Abfrage IsPlayerInGebiet

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
  • Hey,
    ich habe eben ein mit einem Tutorial ein GF System geschrieben aber die Abfrage ob der Spieler in einem GangFight ist funktioniert nicht.
    Egal wo ich bin ich bekomme immer die Nachricht du bist nicht im GangFight Gebiet.
    Habe es bei allen 5 probiert..


    Stock
    stock IsPlayerInGebiet(playerid)
    {
    for(new i;i<sizeof(Gebiete);i++)
    {
    new Float:GetX,Float:GetY,Float:GetZ;
    GetPlayerPos(playerid,GetX,GetY,GetZ);
    if(Gebiete[i][MinX] < GetX && Gebiete[i][MaxX] > GetX && Gebiete[i][MinY] < GetY && Gebiete[i][MaxY] > GetY)
    {
    return i;
    }
    return -1;
    }
    return -1;
    }


    Ocmd:
    ocmd:gangfight(playerid,params[])
    {
    if(GetPVarInt(playerid,"Fraktion")==2 || GetPVarInt(playerid,"Fraktion")==3)
    {
    if(GetPVarInt(playerid,"FrakRang")>4)
    {
    if(IsPlayerInGebiet(playerid) > -1)
    {
    new zone = IsPlayerInGebiet(playerid);
    if(Gebiete[zone][gOn] == 1) return SendClientMessage(playerid,rot,"Das Gebiet wird gerade schon angegriffen.");
    if(Gebiete[zone][GFBesitzer] == GetPVarInt(playerid,"Fraktion"))return SendClientMessage(playerid,rot,"....);
    Gebiete[zone][GFAngreifer] = GetPVarInt(playerid,"Fraktion");
    Gebiete[zone][gOn] = 1;
    SetTimerEx("GangFight",10000,0,"i",zone);
    for(new i; i<MAX_PLAYERS; i++)
    {
    SendClientMessage(i,tuerkis,"Es wurde ein GangFight gestartet.");
    SendClientMessage(i,tuerkis,"Haltet euch bitte fern, wenn ihr damit nichts zutun habt.");
    }
    }
    else
    {
    SendClientMessage(playerid,rot,"Du bist in keinem GangFight Gebiet.");
    }
    }
    else
    {
    SendClientMessage(playerid,rot,"Dein Rang ist zu niedrig um ein GangFight zu starten.");
    }
    }
    else
    {
    SendClientMessage(playerid,rot,"Deine Fraktion ist keine Gang.");
    }
    return 1;
    }


    Gebiete:
    new Gebiet[5];
    new Gebiete[5][gebiet] = {
    {GFBesitzer,-729.0828,2784.1543,-897.4752,2731.4478},
    {GFBesitzer,-1266.7142,2561.9902,-1337.7583,2440.3684},
    {GFBesitzer,-617.7786,1422.2673,-885.5745,1621.0100},
    {GFBesitzer,109.6944,1485.1274,289.1925,1335.6724},
    {GFBesitzer,487.0500,2651.3181,63.0710,2386.9675}
    };

  • Hmm zeig mal deinen enum und scheib die Abfrage evtl so:


    if(GetX >= Gebiete[i][MinX] && GetX <= Gebiete[i][MaxX] && GetY >= Gebiete[i][MinY] && GetY <= Gebiete[i][MaxY])


    und dann poste deine Funktion nochmal...

    if(IsPlayerInGebiet(playerid) != -1)


    Ob > -1 oder != -1...ändert hier nicht viel ^^

    ast2ufdyxkb1.png


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

  • @FerienFreak
    jo, ist mir nicht aufgefallen, wollte es erst nur den jeweiligen Fraktionen schicken, habe mir aber dann gedacht,neeeee und die Schleife ausversehen drin gelassen.
    Danke :D



    Die Abfrage habe ich nun geändern, keine Veränderung.


    Mein Enum:
    enum gebiet
    {
    GFBesitzer,
    Float:MinX,
    Float:MinY,
    Float:MaxX,
    Float:MaxY,
    gOn,
    GFAngreifer,
    ScoreBesitzer,
    ScoreAngreifer
    };


    Die Funktion:
    stock IsPlayerInGebiet(playerid)
    {
    for(new i;i<sizeof(Gebiete);i++)
    {
    new Float:GetX,Float:GetY,Float:GetZ;
    GetPlayerPos(playerid,GetX,GetY,GetZ);
    //if(Gebiete[i][MinX] < GetX && Gebiete[i][MaxX] > GetX && Gebiete[i][MinY] < GetY && Gebiete[i][MaxY] > GetY)
    if(GetX >= Gebiete[i][MinX] && GetX <= Gebiete[i][MaxX] && GetY >= Gebiete[i][MinY] && GetY <= Gebiete[i][MaxY])
    {
    return i;
    }
    }
    return -1;
    }


    Anwendung der Funktion bei OnPlayerDeath

    Spoiler anzeigen
    if(IsPlayerInGebiet(playerid) > -1)
    {
    new kill1[100],kill2[100];
    new zone = IsPlayerInGebiet(playerid);
    if(Gebiete[zone][gOn] == 1)
    {
    if(GetPVarInt(playerid,"Fraktion")==Gebiete[zone][GFBesitzer])
    {
    if(GetPVarInt(killerid,"Fraktion")==Gebiete[zone][GFAngreifer])
    {
    Gebiete[zone][GFAngreifer] ++;
    format(kill1,sizeof(kill1),"%s hat %s im GangFight getötet.",SpielerName(killerid),SpielerName(playerid));
    SendClientMessageToAll(tuerkis,kill1);
    }
    }
    if(GetPVarInt(playerid,"Fraktion")==Gebiete[zone][GFAngreifer])
    {
    if(GetPVarInt(killerid,"Fraktion")==Gebiete[zone][GFBesitzer])
    {
    Gebiete[zone][GFBesitzer] ++;
    format(kill2,sizeof(kill2),"%s hat %s im GangFight getötet.",SpielerName(killerid),SpielerName(playerid));
    SendClientMessageToAll(tuerkis,kill2);
    }
    }
    }
    }

  • stock IsPlayerInGebiet(playerid)
    {
    for(new i;i<sizeof(Gebiete);i++)
    {
    new Float:GetX,Float:GetY,Float:GetZ;
    GetPlayerPos(playerid,GetX,GetY,GetZ);
    if(Gebiete[i][MinX] < GetX && Gebiete[i][MaxX] > GetX && Gebiete[i][MinY] < GetY && Gebiete[i][MaxY] > GetY)
    {
    return i;
    }
    }
    return -1;
    }

  • Danke erstmal das mir noch jemand helfen will, jedoch ist dein gesendeter Code der selbe wie ich ihn schon benutze..


    Kennt sich hier echt niemand mit GangFight Systemen aus?
    Würde mich wundern, da es ja in fast jedem Script drin ist :S

  • Schade, dass die Kollegen anfangen zu helfen und dann einfach nicht mehr posten...naja.


    Das Problem liegt nicht am Code sondern daran, dass deine Koordinaten falsch waren.
    new Gebiete[5][gebiet] = {
    {GFBesitzer,-897.4752,2731.4478,-729.0828,2784.1543},
    {GFBesitzer,-1337.7583,2440.3684,-1266.7142,2561.9902},
    {GFBesitzer,-885.5745,1422.2673,-617.7786,1621.0100},
    {GFBesitzer,109.6944,1335.6724,289.1925,1485.1274},
    {GFBesitzer,63.0710,2386.9675,487.0500,2651.3181}
    };


    Erst das kleine X dann das kleine Y, dann das große X und dann das große Y.
    Beachte, dass -10 kleiner als -5 ist, zum Beispiel.


    Der Code, etwas schöner:
    stock IsPlayerInGebiet(playerid)
    {
    new Float:GetX,Float:GetY,Float:GetZ;
    GetPlayerPos(playerid,GetX,GetY,GetZ);
    for(new i;i<sizeof(Gebiete);i++)
    {
    if(GetX >= Gebiete[i][MinX] && GetX <= Gebiete[i][MaxX] && GetY >= Gebiete[i][MinY] && GetY <= Gebiete[i][MaxY])
    {
    return i;
    }
    }
    return -1;
    }


    Und lösche bitte den anderen Thread den du auf gemacht hast, es braucht keine zwei. ;)

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Okay Jeffry der Meister hat geantwortet, nun kann es nur Bug Frei werden :D



    Habe die Koordinaten nun geändert, jetzt habe ich aber noch ein Problem.
    Und zwar haben die Gebiete nun keine Besitzer und ich kann sie auch nicht ändern weil ich nicht weiß wie ich die Besitzer speichern lassen kann..

  • Habe die Koordinaten nun geändert, jetzt habe ich aber noch ein Problem.


    Kopiere die Koordinaten bitte nochmal, da war ein Komma zu viel drin. :whistling:


    Und zwar haben die Gebiete nun keine Besitzer und ich kann sie auch nicht ändern weil ich nicht weiß wie ich die Besitzer speichern lassen kann..


    In welcher Form sollen die gespeichert werden? Als ID (Zahl) oder als Klartext (zum Beispiel der Name des Besitzers)?

  • Ahh, perfekt! :)


    Das kannst du dann zum Beispiel so machen:
    stock GebieteLaden()
    {
    new str[32];
    for(new i=0; i<sizeof(Gebiete); i++)
    {
    format(str, sizeof(str), "BesitzerGF%d", i);
    Gebiete[i][GFBesitzer] = dini_Int("/GebietDatei/GebietDatei.ini",str);
    }
    return 1;
    }


    stock GebieteSpeichern()
    {
    new str[32];
    for(new i=0; i<sizeof(Gebiete); i++)
    {
    format(str, sizeof(str), "BesitzerGF%d", i);
    dini_IntSet("/GebietDatei/GebietDatei.ini",str,Gebiete[i][GFBesitzer]);
    }
    return 1;
    }

  • So :),


    habe es so gemacht wie du es mir hier geschrieben hast.
    Habe das Gebiet angegriffen und der Besitzer hat sich geändert.
    Habe darauf hin dann ein GMX gemacht, jedoch ist wenn der Server wieder online ist der Besitzer wieder 0.
    Habe dann in die ini Datei geguckt die ich erstellt habe in dem Pfad den du bei den Stocks angegeben hast, dieser ist jedoch
    komplett leer..


    Muss ich nicht noch wie bei meinen Account so eine Art Register Stock machen?
    Das heißt wo ich die Datei erst erstellen lasse?

  • Die Datei brauchst du ja nur einmal erstellen (das hast du gemacht) von daher passt das, da brauchst du sonst nichts.
    Hast du dort, wo du den GMX gemacht hast, auch GebieteSpeichern(); aufgerufen? Wenn nicht, das musst du machen.
    Alternativ dort, wo du das Gebiet eroberst.

  • Okay das habe ich noch nicht gemacht.


    Nur mal so eine Frage für die Verständnis:
    Bsp beim Speicher Stock der Gebiete:
    format(str, sizeof(str), "BesitzerGF%d", i);
    dini_IntSet("/GebietDatei/GebietDatei.ini",str,Gebiete[i][GFBesitzer]);


    Beim Speicher Stock der Accounts:
    format(Accounts,sizeof(Accounts),"/AccountsOLD/%s.ini",SpielerName(playerid));
    dini_IntSet(Accounts,"Score",GetPlayerScore(playerid));


    Hast du den Unterschied gesehen?
    Beim Account habe ich den Pfad bei der Zeile mit format.
    Beim GangFight habe den Pfad bei der Zeile mit dini_IntSet.


    Ist das normal?

  • Ok alles klar.
    Sorry das ich so nerv :S


    Gebiete speichern aber immer noch nicht..
    codes:
    Stock Laden und Speichern

    Spoiler anzeigen
    stock GebieteLaden()
    {
    new str[32];
    for(new i=0; i<sizeof(Gebiete); i++)
    {
    format(str, sizeof(str), "BesitzerGF%d", i);
    Gebiete[i][GFBesitzer] = dini_Int("/GebietDatei/GebietDatei.ini",str);
    }
    return 1;
    }

    Spoiler anzeigen
    stock GebieteSpeichern()
    {
    new str[32];
    for(new i=0; i<sizeof(Gebiete); i++)
    {
    format(str, sizeof(str), "BesitzerGF%d", i);
    dini_IntSet("/GebietDatei/GebietDatei.ini",str,Gebiete[i][GFBesitzer]);
    }
    return 1;
    }


    OnGameModExit

    Spoiler anzeigen
    public OnGameModeExit()
    {
    GebieteSpeichern();
    return 1;
    }


    OnGameModInit

    Spoiler anzeigen
    public OnGameModInit()
    {
    GebieteLaden();
    return 1;
    }


    ocmd:gmx

    Spoiler anzeigen
    ocmd:gmx(playerid,params)
    {
    if(GetPVarInt(playerid,"Admin")==5)
    {
    GebieteSpeichern();
    SpielerSpeichern(playerid);
    SendRconCommand("gmx");
    }
    return 1;
    }


    Bild der erstellten Datei:

  • Dafür ist das Forum da, du nervst nicht.
    Die Datei ist eine .txt Datei, keine .ini.


    Aber, um sowas zu verhinden, füge beim Speichern einfach die automatische Erstellung ein und damit hat es sich:
    stock GebieteSpeichern()
    {
    new str[32];
    if(!fexist("/GebietDatei/GebietDatei.ini")) dini_Create("/GebietDatei/GebietDatei.ini");
    for(new i=0; i<sizeof(Gebiete); i++)
    {
    format(str, sizeof(str), "BesitzerGF%d", i);
    dini_IntSet("/GebietDatei/GebietDatei.ini",str,Gebiete[i][GFBesitzer]);
    }
    return 1;
    }