Komme nicht weiter...

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
  • Hallöschen, ich hab keine Lösungsidee mehr :D


    Ich arbeite gerade an einer luftabwehr wenn man sich dem alka nähert.
    Error:
    C:\Dokumente und Einstellungen\Kais\Desktop\samp03dsvr_R2_win32\gamemodes\myscript.pwn(56143) : warning 213: tag mismatch
    C:\Dokumente und Einstellungen\Kais\Desktop\samp03dsvr_R2_win32\gamemodes\myscript.pwn(56155) : error 010: invalid function or declaration
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.


    Code:


    public OnPlayerUpdate(playerid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(playerid))
    {
    if(IsPlayerInRangeOfPoint(playerid,30.0,276.7849,-4310.0547,6.4115))
    {
    if(PlayerInfo[i][pMember] == 3 || PlayerInfo[i][pLeader] == 3)
    {
    SendClientMessage(i,COLOR_RED,"Eine unbekannte Person näher sich dem Alkatraz!!");
    }
    }
    if(IsPlayerInRangeOfPoint(i,15.0,276.7849,-4310.0547,6.4115))
    {
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(PlayerInfo[playerid][pMember] == 3 || PlayerInfo[playerid][pLeader] == 3 || PlayerInfo[playerid][pMember] == 2 || PlayerInfo[playerid][pLeader] == 2 || PlayerInfo[playerid][pMember] == 1 || PlayerInfo[playerid][pLeader] == 1)
    {
    if(Luftabwehr == 0)
    {
    return 1;
    }
    else if(Luftabwehr == 0)
    {
    return 1;
    }
    }
    else
    {
    if(Luftabwehr == 0)
    {
    SendClientMessage(playerid, COLOR_RED, "Warnung! Sie betreten unbefugtes Gelände!");
    return 1;
    }
    else if(Luftabwehr == 1 && IsPlayerInRangeOfPoint(playerid, 1.0, X ,Y , Z >= 15)) //Ich wusste nicht wie ich anders abfragen soll, ob der spieler in der Luft ist + Errorszeile^^
    {
    SendClientMessage(playerid, COLOR_RED, "Warnung! Sie betreten unbefugtes Gelände!");
    SendClientMessage(playerid, COLOR_RED, "Die Luftabwehr hat sie im Ziel!");
    SetTimer("Abschuss", 5000, 1);
    }
    }
    }
    }
    }
    return 1;
    }
    return 1;
    }

    Einmal editiert, zuletzt von DialogHD ()

  • Waah, hau erst einmal die Schleife ''for(new i = 0; i < MAX_PLAYERS; i++)'' raus.
    Bei OnPlayerUpdate bringt das 0, außer dass es noch Ressourcenfressender ist als ohnehin schon.
    Zudem benutzt du 'i' nur bei
    if(PlayerInfo[i][pMember] == 3 || PlayerInfo[i][pLeader] == 3)
    {
    SendClientMessage(i,COLOR_RED,"Eine unbekannte Person näher sich dem Alkatraz!!");
    }


    Mach lieber eine neue Function, z.B.
    SendClientMessageToArmy. Erst dort drin eine Schleife wo du auf die Fraktion abfragst.


    Nur mal so ganz am Rande. Zum Rest kann ich dir leider noch nicht viel sagen.


    //edit Parameter weg.

  • else if(Luftabwehr == 1 && IsPlayerInRangeOfPoint(playerid, 1.0, X ,Y , Z >= 15)) //Ich wusste nicht wie ich anders abfragen soll, ob der spieler in der Luft ist + Errorszeile^^


    So jedenfalls nicht. ^^
    Du kannst nicht in einer Funktion (IsPlayerInRangeOfPoint) eine Abfrage einbauen (Z >= 15). Du kannst aber Z + 15 machen.

  • Zitat

    Du kannst nicht in einer Funktion (IsPlayerInRangeOfPoint) eine Abfrage einbauen (Z >= 15). Du kannst aber Z + 15 machen.

    Dann ist es doch keine abfrage mehr ob der spieler über 15 is? ^^


    Zitat

    Zudem benutzt du 'i' nur bei


    if(IsPlayerInRangeOfPoint(i,15.0,276.7849,-4310.0547,6.4115))

  • Nochmal zu der Schleife mit dem i...
    Ich möchte dir erklären, warum es sinnvoll ist es anders zu lösen.


    OnPlayerUpdate wird aufgerufen, wenn der Spieler sich bewegt. Das mehrmals pro Sekunde. D.h. ständig.
    Immer und immer wieder. Für jeden Spieler gleichzeitig.
    Und jetzt möchtest du also mehrmals in einer Sekunde jeden Spieler noch einmal durchgehen, und das für jeden Spieler?


    Glaube mir, das ist unklug. Extrem unklug.
    Die Armys kannst du mit einer extra-Funktion abfragen.
    Und dort, wo du die Nachricht sendest, kannst du ja eine if-Bedingung machen wo du das abfragst.
    if(IsPlayerInRangeOfPoint(i,15.0,276.7849,-4310.0547,6.4115))


    Glaube mir ;)


    Zu deinem eigentlichen Problem:
    else if(Luftabwehr == 1 && IsPlayerInRangeOfPoint(playerid, 1.0, X ,Y , Z >= 15)) //Ich wusste nicht wie ich anders abfragen soll, ob der spieler in der Luft ist + Errorszeile^^
    einfach aufsplitten und die Koordinaten einzeln abfragen.


    else if(Luftabwehr == 1)
    {
    new Float:pX,Float:pY,Float:pZ;
    GetPlayerPos(playerid,pX,pY,pZ);
    //Hier das Aufsplitten. Das -1 und +1 ist jeweils für die Range deiner Abfrage sPlayerInRangeOfPoint(playerid, 1.0, X ,Y , Z >= 15))
    //Bei Z natürlich erhöhen, für dein >= 15.
    if((pX <= X+1) && (pX >= X-1) && (pY <= Y+1) && (pY >= Y-1) && (pZ >= Z+15))
    {
    SendClientMessage(playerid, COLOR_RED, "Warnung! Sie betreten unbefugtes Gelände!");
    SendClientMessage(playerid, COLOR_RED, "Die Luftabwehr hat sie im Ziel!");
    SetTimer("Abschuss", 5000, 1);
    }
    }


    Außerdem gibt es kein unbefugtes Gelände :D Schreib lieber ''Sie betreten unerlaubt das Gelände'' oder so..



    //edit: Letzter Satz :D
    //edit2: GetPlayerPos...

  • Vielleicht hilft dir das hier von BlackFox weiter :P



    /* Skript (c) 2008 - 2009 by BlackFoX_UD_


    -Credits-


    * Samp Functions - Sa-mp Dev Team
    * Script - BlackFoX_UD_


    */
    #include <a_samp>


    new RadarZone;
    new gZoneTimer;
    new pZoneTimer[MAX_PLAYERS];


    public OnFilterScriptInit()
    {
    print("\n--------------------------------------");
    print(" Radar System by BlackFoX_UD_");
    print("--------------------------------------\n");
    RadarZone = GangZoneCreate(-23.35575, 1693.292, 373.692, 2113.696);
    gZoneTimer = SetTimer("ZonenCheck",1000,1);
    return 1;
    }
    forward ZonenCheck();
    public ZonenCheck()
    {
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    if(PlayerIn3DZone(i,373.692,-23.35575,2113.696,1693.292,185.7108,17.6406))
    {
    if(IsInPlaneOrHeli(i))
    {
    if(pZoneTimer[i] == -1)
    {
    GameTextForPlayer(i,"~r~Achtung ~b~du hast noch 7 Sekunden bis dich die Raketen erfassen!",3500,3);
    pZoneTimer[i] = SetTimerEx("ExplodePlayer",7000,0,"i",i);
    }
    }
    }
    else
    {
    if(pZoneTimer[i] > -1)
    {
    KillTimer(pZoneTimer[i]);
    pZoneTimer[i] = -1;
    GameTextForPlayer(i,"~g~Du bist ausser Gefahr.",2000,3);
    }
    }
    }
    }
    return 1;
    }
    forward ExplodePlayer(playerid);
    public ExplodePlayer(playerid)
    {
    if(IsInPlaneOrHeli(playerid))
    {
    new Float:pos[3];
    GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
    CreateExplosion(pos[0],pos[1],pos[2],4,50.0);
    }
    KillTimer(pZoneTimer[playerid]);
    pZoneTimer[playerid] = -1;
    return 1;
    }
    public OnFilterScriptExit()
    {
    KillTimer(gZoneTimer);
    return 1;
    }
    PlayerIn3DZone(playerid,Float:maxX,Float:minX,Float:maxY,Float:minY,Float:maxZ,Float:minZ)
    {
    new Float:jx,Float:jy,Float:jz;
    GetPlayerPos(playerid,jx,jy,jz);
    if(jx < maxX && jx > minX && jy < maxY && jy > minY && jz < maxZ && jz > minZ)return true;
    return false;
    }
    //
    public OnPlayerConnect(playerid)
    {
    pZoneTimer[playerid]=-1;
    GangZoneShowForPlayer(playerid,RadarZone,0x0000FF69);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    if(pZoneTimer[playerid]>-1)KillTimer(pZoneTimer[playerid]);
    return 1;
    }
    stock IsInPlaneOrHeli(playerid)
    {
    new model = GetVehicleModel(GetPlayerVehicleID(playerid));
    switch(model)
    {
    case 592,577,511:return 1;
    case 512,593,520:return 1;
    case 553,476,519:return 1;
    case 460,513,548:return 1;
    case 425,417,487:return 1;
    case 488,497,563:return 1;
    case 447,469:return 1;
    }
    return 0;
    }

  • Wäre eine Alternative.
    Aber ich finde, man sollte Lösungen für ein Problem finden, und nicht nur das Problem umgehen, in dem man ein völlig anderes System verwendet :O


    Aber ja, eine Alternative wäre es...
    Mich würde nur interessieren, ob mein Vorschlag oben funktioniert, wenn man die Abfrage IsPlayerInRangeOfPoint so aufsplittet mit unterschiedlichen Abständen zu den jeweiligen Koordinaten. Sollte doch eigentlich, oder?

  • if((pX <= X+1) && (pX >= X-1) && (pY <= Y+1) && (pY >= Y-1) && (pZ >= Z+15))


    C:\Dokumente und Einstellungen\Kais\Desktop\samp03dsvr_R2_win32\gamemodes\myscript.pwn(56163) : error 017: undefined symbol "X"
    C:\Dokumente und Einstellungen\Kais\Desktop\samp03dsvr_R2_win32\gamemodes\myscript.pwn(56180) : error 076: syntax error in the expression, or invalid function call
    C:\Dokumente und Einstellungen\Kais\Desktop\samp03dsvr_R2_win32\gamemodes\myscript.pwn(56183) : error 010: invalid function or declaration
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    3 Errors.

  • Kann gerade selber nichts ausprobieren hier, sorry.
    Geht wohl doch nicht so, wie ich mir gedacht habe xD


    Das mit dem X versteh ich nicht ganz, an der selben Stelle hast du es bei dir ja auch verwendet bei deinem
    IsPlayerInRangeOfPoint(playerid, 1.0, X ,Y , Z >= 15))...

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Falsch.
    if((pX <= X+1) && (pX >= X-1)
    Ich vergleiche deine X mit meiner pX.
    Die pX habe ich frisch erstellt, da hast du auch keinen Error.


    Weiter oben im Code hast du selber X,Y und Z festgelegt
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    Wobei ich gerade bemerke, dass mein Code dann sowieo zum Teil Schwachsinn ist, weil du dort ebenfalls die Spielerposition reinpackst..
    Ich lass mir mal was anderes einfallen.
    Allerdings erst später, da ich gerade wenig Zeit habe und ohnehin nichts testen kann.

  • der Error ist jetzt weg^^


    nurnoch:
    C:\Dokumente und Einstellungen\Kais\Desktop\samp03dsvr_R2_win32\gamemodes\myscript.pwn(56185) : warning 209: function "OnPlayerUpdate" should return a value
    C:\Dokumente und Einstellungen\Kais\Desktop\samp03dsvr_R2_win32\gamemodes\myscript.pwn(56187) : error 054: unmatched closing brace ("}")
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Error.


  • nope, ist immernoch

    if(IsPlayerInRangeOfPoint(playerid,50.0,276.7849,-4310.0547,6.4115) && PlayerInfo[playerid][pJailed] == 2)
    {


    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Ein Schwerverbrecher ist aus dem Alkatraz ausgebrochen!");
    Sirene();
    }
    }
    return 1;
    }

  • }
    return 1;
    }


    Mach das return 1; mal vor die erste Klammer, und die zweite kommentierst du mal aus.
    Glaube deine letzte } ist die unmatched closing brace ("}") ...


    //edit: Kann eig. nicht sein, aber probiers mal bitte...vielleicht haste ja irgendwo die Klamern vertauscht oder bist irgendwo verrutscht..

  • Die meisten Bugs gefixxt, allerdings wird der Spieler nicht abgeschossen.


    if((pX <= X+1) && (pX >= X-1) && (pY <= Y+1) && (pY >= Y-1) && (pZ >= Z+10) && PlayerInfo[playerid][pJailed] == 0 && alkameldung[playerid] == 0)
    {
    SendClientMessage(playerid, COLOR_RED, "Warnung! Sie betreten unbefugtes Gelände!");
    SendClientMessage(playerid, COLOR_RED, "Die Luftabwehr hat sie im Ziel!");
    alkameldung[playerid] = 1; //Damit der Chat nicht gespamt wird
    SetTimerEx("Abschuss",5000,0,"i",playerid); // Habe mal settimerex anstatt settimer benutzt
    //SetTimer("Abschuss", 5000, 0);
    }


    forward Abschuss(playerid);
    public Abschuss(playerid)
    {
    new Float:X, Float:Y, Float:Z;
    if(IsPlayerInRangeOfPoint(playerid,15.0,276.7849,-4310.0547,6.4115))
    {
    GetPlayerPos(playerid, X, Y, Z);
    CreateExplosion(X, Y, Z, 6, 1.0);
    CreateExplosion(X, Y, Z, 3, 1.0);
    }
    }

    Einmal editiert, zuletzt von DialogHD ()

  • Wird wohl an dem (IsPlayerInRangeOfPoint(playerid,15.0,276.7849,-4310.0547,6.4115)) liegen.
    Erhöhe mal den Abstand wesentlich und schau was passiert (hinter playerid die 15 erhöhen, machs mal auf 50 und schau was passiert...)


    //edit: Wenn das klappt kannste ja mit dem Abstand bisle spielen wie es am besten passt. So hoch nur um zu sehen ob es wirklich daran liegt...

  • Man bekommt ne Meldung etc..
    aber irgendwie bugt das Luftabwehr ==


    Hier /luftan
    if(strcmp(cmd, "/luftan", true) == 0)
    {
    if(PlayerInfo[playerid][pMember] == 3 || PlayerInfo[playerid][pLeader] == 3)
    {
    if(Luftabwehr == 1)
    {
    SendClientMessage(playerid, COLOR_WHITE, "Die Luftabwehr ist bereits eingeschaltet.");
    return 1;
    }
    else if(LuftabwehrPause == 1)
    {
    SendClientMessage(playerid, COLOR_WHITE, "Die Luftabwehr kann jetzt nicht gestartet werden!.");
    }
    else
    {
    Luftabwehr = 1;
    SetTimer("luftaus", 900000, 0);
    SendClientMessage(playerid, COLOR_WHITE, "Du hast die Luftabwehr angeschaltet.");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_WHITE, "*Du bist kein Soldat.");
    }
    return 1;
    }