Bizinteriors funktionieren nicht

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,
    Wenn ich ein Biz entern möchte, dann spawne ich immer mitten im nirgendwo und nicht im Biz-Interior


    (Vom Sammelthread hierhin verschoben)


    Ich will noch eine Abfrage machen, wenn das Biz nicht betretbar ist, dass kein Teleport stattfindet

    C
    new bInfo[sizeof(BizInts)][bizinfo];



    C
    enum bizinteriors{
    	Name[35],
    	Interior,
    	Welt,
    	Biztype,
     	Float:IX,Float:IY,Float:IZ// Exit Position
    }
    C
    stock const BizInts[][bizinteriors]={
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988}
    };
    C
    enum buildungs{
    	Name[35],
    	Interior,
    	Welt,
    	Float:EX,Float:EY,Float:EZ,// Enter Position
    	Float:IX,Float:IY,Float:IZ// Exit Position
    }

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Das ist Quatsch, was du da machst.


    Nur so schreiben:


    C
    SetPlayerPos(playerid,BizInts[b][IX],BizInts[b][IY],BizInts[b][IZ]);
    SetPlayerInterior(playerid,BizInts[b][Interior]);
    SetPlayerVirtualWorld(playerid,BizInts[b][Welt]);
    SetPVarInt(playerid,"InBiz",b);
    return 1;

    ast2ufdyxkb1.png


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

  • Danke, ich spawne aber wieder mitten im nirgendwo.



    http://prntscr.com/mvlov6

    C
    {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},


    Ist doch richtig so?






    C
    enum bizinteriors{
    	Name[35],
    	Interior,
    	Welt,
    	Biztype,
     	Float:IX,Float:IY,Float:IZ// Exit Position
    }

    Ich speichere hier den Biztypen ab, was nicht wofür ich das so gemacht habe, kann ich damit vorher abfragen ob dies 1 ist und dann wird wieder return 1; aufgerufen um leichter abzufragen ob das Biz betretbar ist?
    Habe ja die normale Abfragen da einzeln so. Wofür benutzt man die Welt? Diese Daten entnehme ich ja nicht von den raw Infos


    C
    if(bInfo[b][biztype]==7)return 1;

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

    Einmal editiert, zuletzt von Jameso ()

  • Also wenn ich deinen Code richtig verstehe, ist der Ansatz von Kaliber falsch.


    Korrigiere mich wenn ich falsch liege, aber jedes "building" hat ein "bizint". buildings.Interior beinhaltet einen Index für BizInts. BizInts.Interior ist die wirkliche InteriorID, die gesetzt werden soll. Wenn dem so ist stellt sich mir aber die Frage, wieso du 8x das gleiche Interior erstellst - das ist dann ja gar nicht notwendig. Außerdem fehlen uns die Werte, die in dem Array bInfo sind.


    Um zu überprüfen, ob es ein begehbares Business ist oder nicht würde sich beispielsweise auch anbieten, buildings.Interior auf -1 zu setzen -> invalider Interior gleich nicht betretbar (in dem Fall ist der Check selbstverständlich auch anzupassen).


    Zusätzlich: Setzt du denn beim Spawn / wo auch immer die P-Var "InBiz" auf -1? Ansonsten wird deine Überprüfung am Anfang immer wahr sein, da GetPVarInt() 0 zurückgibt, falls diese nicht existiert.


    Ich würde dir auch empfehlen deine variablen klarer zu benennen oder ggf. zu kommentieren - die sind nicht wirklich eindeutig.

  • Alles klar,
    Ich schiebe das Problem mal auf das Spiel.
    http://prntscr.com/mvtge7
    Das Bizinterior funktioniert gar nicht, hier sind 2 mal die selben abgebildet nur das obere funktioniert. :D


    Problem gelöst :D


    @Kaliber

    C
    new bi=bInfo[bInterior];
    SetPlayerPos(playerid,BizInts[bi][IX],BizInts[bi][IY],BizInts[bi][IZ]);
    SetPlayerInterior(playerid,BizInts[bi][Interior]);
    SetPlayerVirtualWorld(playerid,BizInts[bi][Welt]);
    SetPVarInt(playerid,"InBiz",b);
    return 1;


    Warum ist das Quatsch?
    Damit frage ich ab ob der Spieler genau bei diesem Biz ist und nicht bei einem anderen.


    Das ist ja hier das selbe bei dem Eingang (Zeile 5.)




    Soll ich das alte so lassen oder deins übernehmen, beide funktionieren.


    Kann ich eine easy Abfrage machen ob ein Biz betretbar ist mit dieser Variable?

    Code
    BizBefehl[][35]=
    {
    	"",
    	"Benutze '/Mieten'",
    	"Benutze 'Enter'",
    };

    indem ich abfrage ob BizBefehl == 2 ist?

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Soll ich das alte so lassen oder deins übernehmen, beide funktionieren.

    Ich bin da bei Douq, die Variablen sind nicht wirklich sprechend, es ist schwer zu sagen, we deine Umsetzung tatsächlich aussehen soll, aber ich vermute, dass es so passt, wie dein Code aktuell aussieht, da du das ja auf zwei Arrays getrennt hast, daher passt der Ansatz von Kaliber für mich auch nicht.
    Wenn dein Code funktioniert, dann nutze deinen Code.



    Kann ich eine easy Abfrage machen ob ein Biz betretbar ist mit dieser Variable?

    Ja, das könntest du so machen. Den Index (0, 1, 2) im zugehörigen Array des Biz speichern und entsprechend dem Wert dann den Text dieses Arrays ausgeben.

  • Ich habe erneut ein Problem mit den Teleports, diesmal nicht mit Biz Gebäuden :D


    Gehe ich in das erste Gebäude (Z.10), dann komme ich in das Interior rein und alles ist super.
    Ich will in das zweite Gebäude (Z.11), was keinen Interior hat und keine andere Virtuelle Welt werde ich an den Eingangspunkt irgendwie wieder hin tpt.
    Also ich steh auf der Stelle, will das Gebäude betreten und werde auf der Stelle teleportiert, allerdings passiert das nur beim ersten mal. Drücke ich erneut enter erscheine ich am anderen Punkt und das geht auch umgekehrt.


    Woran kann es liegen?
    Es könnte eventuell am PVar liegen, da dieser auf -1 gesetzt wird beim Login kommt dies nicht in Frage oder?




    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Man kann dir so echt schwer helfen...printe dir halt mal die ganzen Schritte und schau zu welchem Zeitpunkt die Variablen welchen Wert haben, so kannst du dem Fehler auf die Schliche kommen ;)


    Das nennt man Debugging und ist ein gänger Teil des programmierens.


    Sehr wichtig, dass man das lernt :)


    https://forum.sa-mp.com/showthread.php?p=3040929

    ast2ufdyxkb1.png


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

  • Also,
    Wenn ich das Gebäude betreten will ist mein PVar vorher auf -1.
    Betrete ich das Gebäude wird mein PVar auf 3 gesetzt (ist auch richtig so).
    Nur, dass ich nicht in das Gebäude teleportiert werde sondern zum Eingang, heißt da quasi wo ich stehe.


    Von dort an ist es so, dass mein Wert auf -1 ist, wenn ich im Gebäude bin und auf 3, wenn ich draußen bin.


    Hat es was damit zutun, dass beide Punkte in der Range sind?
    http://prntscr.com/myaj5m

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Hat es was damit zutun, dass beide Punkte in der Range sind?

    Ja.


    Versuche es so, das liest den am nächsten liegenden Einstiegs-Punkt aus und nimmt den dann:
    if(GetPVarInt(playerid,"InBuilding")!=-1)
    {
    new e=GetPVarInt(playerid,"InBuilding");
    if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][IX],Building[e][IY],Building[e][IZ]))
    {
    SetPlayerPos(playerid,Building[e][EX],Building[e][EY],Building[e][EZ]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    SetPVarInt(playerid,"InBuilding",-1);
    return 1;
    }
    }
    else
    {
    new Float:dist = 3.0, Float:tmp, e = -1;
    for(new i; i<sizeof(Building); i++)
    {
    tmp = GetPlayerDistanceFromPoint(playerid, Building[i][EX],Building[i][EY],Building[i][EZ]);
    if(tmp < dist)
    {
    dist = tmp;
    e = i;
    }
    }
    if(e != -1)
    {
    SetPlayerPos(playerid,Building[e][IX],Building[e][IY],Building[e][IZ]);
    if(Building[e][Interior]!=0)SetPlayerInterior(playerid,Building[e][Interior]);
    if(Building[e][Welt]!=0)SetPlayerVirtualWorld(playerid,Building[e][Welt]);
    SetPVarInt(playerid,"InBuilding",e);
    return 1;
    }
    }

  • Sind die selben Koordinaten.
    Tritt nur hierbei auf, da ich hier kein Interior und oder eine andere Virtuelle Welt benutzte.


    X unterscheidet sich Eingang / Ausgang um 0,04
    Y unterscheidet sich Eingang / Ausgang um 1,90


    Der Ein- und Ausgang ist ja fast gleich, trotzdem glaube ich, dass es daran liegt.
    Der vertauscht das Ganze, das Problem tritt ja nur beim ersten mal auf. Später komme ich in kein anderes Gebäude mehr rein, nur in das mit dem Problem am Anfang.
    Der PVar ist ja dann nicht mehr auf -1 trotzdem lässt er mich raus und reingehen bei den anderen Gebäuden ist das nicht, da komme ich nicht mehr rein.


    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Selbstverständlich wird er auf -1 gesetzt. Das Problem mit dem ersten mal tritt nur bei der "Los Santos Bank" auf und nicht bei der "Fahrschule" wo ein Interior gegeben ist.

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Ok, gut.
    Vertauschen kann er das aber eigentlich nicht, da du ja beim Betreten nur auf die Exit Position abfragst, somit ist ihm die Position des Pfeils innen egal.


    Könnte es sein, dass du die Enter/Exit Positionen bei der Bank vertauscht hast? Drehe diese mal um und prüfe ob es dann geht.