Blitzer

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
  • Hiho


    Ich habe gerade überhaupt keine Ahnung, wie ich das machen soll.


    Im Moment habe ich ein Blitzersystem, dass IsPlayerInRangeOfPoint benutzt. Nur blitzt der ja rundum über einen bestimmten Radius.
    Nur wie kann ich machen, dass der entweder vorne oder hinten blitzt?


    Hab schon iwie gedacht mit der Facing Angle des Fahrzeugs und der Rotation des Blitzers (x,y,z je auf 0.0).


    Kennt sich da jemand aus..?


    MFG


  • Ich hab dir mal was kleines gebastelt


    stock Check_If_Point_In_Triangle(playerid,Float:X,Float:Y,Float:Z,Float:R,Float:MAX_Z)
    {
    new const Float:Winkel = 60.0;
    new const Float:Weite = 30.0;
    new Float:Pos[8];
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    Pos[4] = Y+(Weite*floatsin(Winkel+R,degrees));
    Pos[5] = Y-(Weite*floatsin(R-Winkel,degrees));
    Pos[6] = X+(Weite*floatcos(Winkel+R,degrees));
    Pos[7] = X-(Weite*floatcos(R-Winkel,degrees));
    return (((Y-Pos[4])*(Pos[0]-X) + (Pos[6]-X)*(Pos[1]-Y)) <0 ||((Pos[4]-Pos[5])*(Pos[0]-Pos[6]) + (Pos[7]-Pos[6])*(Pos[1]-Pos[4])) <0 ||((Pos[5]-Y)*(Pos[0]-Pos[7]) + (X-Pos[7])*(Pos[1]-Pos[5])) <0 || Pos[2] > MAX_Z || Pos[2] < Z) ? 0:1;
    }


    damit kannst du jeweilig abprüfen ob der spieler von einem gewissen punkt in einem dreieck steht


    und um das ganze selbst zu testen da ich mal davon ausgehe das du dir bestimmt nicht vorstellen kannst was genau die berechnung macht und wie es benutzt wird
    noch ein beispiel code
    new Float:Array[4];
    if(!strcmp("/test",cmdtext)){
    new const Float:Winkel = 60.0;
    new const Float:Weite = 30.0;
    GetPlayerPos(playerid,Array[0],Array[1],Array[2]);
    GetPlayerFacingAngle(playerid,Array[3]);
    CreateObject(18880,Array[0],Array[1],Array[2]-1.0,0.0,0.0,Array[3]-180);
    CreateObject(18880,Array[0]+(Weite*floatcos(Winkel+Array[3],degrees)),Array[1]+(Weite*floatsin(Winkel+Array[3],degrees)),Array[2]-1.0,0.0,0.0,Array[3]+180);
    CreateObject(18880,Array[0]-(Weite*floatcos(Array[3]-Winkel,degrees)),Array[1]-(Weite*floatsin(Array[3]-Winkel,degrees)),Array[2]-1.0,0.0,0.0,Array[3]+180);
    return 1;
    }else if(!strcmp("/set",cmdtext)){
    new str_1[30];
    format(str_1,30,"Du bist %s",(Check_If_Point_In_Triangle(playerid,Array[0],Array[1],Array[2]-1.0,Array[3],20.0))?("drinnen"):("drausen"));
    SendClientMessage(playerid,-1,str_1);
    return 1;
    }


    Es kann gut sein das es vllt kürzer geht aber ein anderer weg ist mir beim durchgehen nicht eingefallen als das über die winkelfunktionen zu machen
    falls einer einen einfacheren weg hätte könnte er ihn ja auch drunter posten.


    //edit
    was du auch machen könntest wäre die Zonen per Streamer Plugin zu erstellen mit der Funktion
    CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1);


    das wär wohl doch das einfachste


  • ach du meine Güte. Studierst du oder unterrichtest du als Professor in Mathematik am MIT? :D


    Ich danke dir schon mal. Nun, wie ich das sehe, muss ich einfach die Objektpositionen, die Rotation (Float:R, nehm ich an) und MAX_Z (also den Radius) vom Blitzer bei Check_If_Point_In_Triangle einsetzen und diese Funktion beim Blitzer-Timer abfragen (anstatt InRangeOfPoint)?


    Oder habe ich das System falsch verstanden? :D

  • Ja ein wenig schon nun gut der jeweilige parameter MAX_Z ist eigentlich unnötig
    damit kannst du die höhe begrenzen also Flugzeuge könntest du damit auch blitzen solltest du das hoch genug einstellen.



    stock Check_If_Point_In_Triangle(playerid,Float:X,Float:Y,Float:Z,Float:R,Float:MAX_Z)


    playerid ist klar die spielerid
    X = X koordinate von deinem blitzer
    Y = Y koordinate von deinem blitzer
    Z = Z koordinate von deinem blitzer
    R = Rotation von deinem blitzer kannst den beispiel befehl dazu benutzen da werden zusätzlich zwei blitzer erstellt damit das dreieck klar wird
    du kannst das ganze also die größe des dreieckes durch die konstanten bestimmen



    new const Float:Winkel = 60.0;
    new const Float:Weite = 30.0;


    xD unterrichten tu ich nicht als Lehrer ich helfe nur gelegentlich Leuten bei der Problembewältigung mancher Aufgaben, aber zum Studium ist es noch ein längerer Weg erstmal die 3 Jahre WG fertig machen.



  • vielen Dank für die Erklärung.


    Wieso schreibst du dafür nicht ein Scriptbeispiel / Tutorial? Ich denke, das können sicher einige Leute benutzen :)

  • Ja ein wenig schon nun gut der jeweilige parameter


    vielen Dank für die Erklärung.


    Wieso schreibst du dafür nicht ein Scriptbeispiel / Tutorial? Ich denke, das können sicher einige Leute benutzen

    Kein Problem ich bezieh das mal in betracht ob ich ein Tutorial zur Berechnungen in Samp oder über das Thema eins erstelle jedoch hab ich generel erstmal mal gedacht ein richtiges MySQL Tutorial zu verfassen von A - Z und wenn man sich das Tutorial zu meinem Zollsystem anschaut wird das sehr ausführlich gestaltet sein.