Bizinteriors funktionieren nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bizinteriors funktionieren nicht

    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-Quellcode

    1. new bInfo[sizeof(BizInts)][bizinfo];



    C-Quellcode

    1. enum bizinteriors{
    2. Name[35],
    3. Interior,
    4. Welt,
    5. Biztype,
    6. Float:IX,Float:IY,Float:IZ// Exit Position
    7. }

    C-Quellcode

    1. stock const BizInts[][bizinteriors]={
    2. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    3. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    4. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    5. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    6. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    7. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    8. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988},
    9. {"24/7",4,1,1,/*InteriorPos*/-27.312300,29.277599,1003.549988}
    10. };

    C-Quellcode

    1. enum buildungs{
    2. Name[35],
    3. Interior,
    4. Welt,
    5. Float:EX,Float:EY,Float:EZ,// Enter Position
    6. Float:IX,Float:IY,Float:IZ// Exit Position
    7. }

    C-Quellcode

    1. if(GetPVarInt(playerid,"InBiz")!=-1)
    2. {
    3. new b=GetPVarInt(playerid,"InBiz");
    4. new bi=bInfo[b][bInterior];
    5. if(IsPlayerInRangeOfPoint(playerid,3.0,BizInts[bi][IX],BizInts[bi][IY],BizInts[bi][IZ]))
    6. {
    7. SetPlayerPos(playerid,bInfo[b][bX],bInfo[b][bY],bInfo[b][bZ]);
    8. SetPlayerInterior(playerid,0);
    9. SetPlayerVirtualWorld(playerid,0);
    10. SetPVarInt(playerid,"InBiz",-1);
    11. return 1;
    12. }
    13. }
    14. else
    15. {
    16. for(new b;b<sizeof(bInfo);b++)
    17. {
    18. if(IsPlayerInRangeOfPoint(playerid,5.0,bInfo[b][bX],bInfo[b][bY],bInfo[b][bZ]))
    19. {
    20. if(bInfo[b][biztype]==7)return 1;
    21. new bi=bInfo[b][bInterior];
    22. SetPlayerPos(playerid,BizInts[bi][IX],BizInts[bi][IY],BizInts[bi][IZ]);
    23. SetPlayerInterior(playerid,BizInts[bi][Interior]);
    24. SetPlayerVirtualWorld(playerid,BizInts[bi][Welt]);
    25. SetPVarInt(playerid,"InBiz",b);
    26. return 1;
    27. }
    28. }
    29. }
    Alles anzeigen

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • BrightLeaN schrieb:

    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;
    Das ist Quatsch, was du da machst.

    Nur so schreiben:

    C-Quellcode

    1. SetPlayerPos(playerid,BizInts[b][IX],BizInts[b][IY],BizInts[b][IZ]);
    2. SetPlayerInterior(playerid,BizInts[b][Interior]);
    3. SetPlayerVirtualWorld(playerid,BizInts[b][Welt]);
    4. SetPVarInt(playerid,"InBiz",b);
    5. return 1;


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Danke, ich spawne aber wieder mitten im nirgendwo.


    prntscr.com/mvlov6

    C-Quellcode

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

    Ist doch richtig so?





    C-Quellcode

    1. enum bizinteriors{
    2. Name[35],
    3. Interior,
    4. Welt,
    5. Biztype,
    6. Float:IX,Float:IY,Float:IZ// Exit Position
    7. }
    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-Quellcode

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

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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von BrightLeaN ()

  • 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.
    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-Quellcode

    1. new bi=bInfo[bInterior];
    2. SetPlayerPos(playerid,BizInts[bi][IX],BizInts[bi][IY],BizInts[bi][IZ]);
    3. SetPlayerInterior(playerid,BizInts[bi][Interior]);
    4. SetPlayerVirtualWorld(playerid,BizInts[bi][Welt]);
    5. SetPVarInt(playerid,"InBiz",b);
    6. 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.)


    C-Quellcode

    1. if(GetPVarInt(playerid,"InBiz")!=-1)
    2. {
    3. new b=GetPVarInt(playerid,"InBiz");
    4. new bi=bInfo[b][bInterior];
    5. if(IsPlayerInRangeOfPoint(playerid,3.0,BizInts[bi][IX],BizInts[bi][IY],BizInts[bi][IZ]))
    6. {
    7. SetPlayerPos(playerid,bInfo[b][bX],bInfo[b][bY],bInfo[b][bZ]);
    8. SetPlayerInterior(playerid,0);
    9. SetPlayerVirtualWorld(playerid,0);
    10. SetPVarInt(playerid,"InBiz",-1);
    11. return 1;
    12. }
    13. }
    Alles anzeigen


    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?

    Quellcode

    1. BizBefehl[][35]=
    2. {
    3. "",
    4. "Benutze '/Mieten'",
    5. "Benutze 'Enter'",
    6. };
    indem ich abfrage ob BizBefehl == 2 ist?

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • BrightLeaN schrieb:

    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.


    BrightLeaN schrieb:

    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.
  • Neu

    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?


    C-Quellcode

    1. enum buildungs{
    2. Name[35],
    3. Interior,
    4. Welt,
    5. Float:EX,Float:EY,Float:EZ,// Enter Position
    6. Float:IX,Float:IY,Float:IZ// Exit Position
    7. }
    8. stock const Building[][buildungs]={
    9. {"Fahrschule",3,0,/*Eingang*/X,X,X,/*Ausgang*/Y,Y,Y},
    10. {"Los Santos Bank",0,0,/*Eingang*/X,X,X,/*Ausgang*/Y,Y,Y}
    11. };
    Alles anzeigen


    C-Quellcode

    1. if(GetPVarInt(playerid,"InBuilding")!=-1)
    2. {
    3. new e=GetPVarInt(playerid,"InBuilding");
    4. if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][IX],Building[e][IY],Building[e][IZ]))
    5. {
    6. SetPlayerPos(playerid,Building[e][EX],Building[e][EY],Building[e][EZ]);
    7. SetPlayerInterior(playerid,0);
    8. SetPlayerVirtualWorld(playerid,0);
    9. SetPVarInt(playerid,"InBuilding",-1);
    10. return 1;
    11. }
    12. }
    13. else
    14. {
    15. for(new e;e<sizeof (Building);e++)
    16. {
    17. if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][EX],Building[e][EY],Building[e][EZ]))
    18. {
    19. SetPlayerPos(playerid,Building[e][IX],Building[e][IY],Building[e][IZ]);
    20. if(Building[e][Interior]!=0)SetPlayerInterior(playerid,Building[e][Interior]);
    21. if(Building[e][Welt]!=0)SetPlayerVirtualWorld(playerid,Building[e][Welt]);
    22. SetPVarInt(playerid,"InBuilding",e);
    23. return 1;
    24. }
    25. }
    26. }
    Alles anzeigen

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Neu

    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 :)

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


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Neu

    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?
    prntscr.com/myaj5m

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Neu

    BrightLeaN schrieb:

    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:

    PAWN-Quellcode

    1. if(GetPVarInt(playerid,"InBuilding")!=-1)
    2. {
    3. new e=GetPVarInt(playerid,"InBuilding");
    4. if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][IX],Building[e][IY],Building[e][IZ]))
    5. {
    6. SetPlayerPos(playerid,Building[e][EX],Building[e][EY],Building[e][EZ]);
    7. SetPlayerInterior(playerid,0);
    8. SetPlayerVirtualWorld(playerid,0);
    9. SetPVarInt(playerid,"InBuilding",-1);
    10. return 1;
    11. }
    12. }
    13. else
    14. {
    15. new Float:dist = 3.0, Float:tmp, e = -1;
    16. for(new i; i<sizeof(Building); i++)
    17. {
    18. tmp = GetPlayerDistanceFromPoint(playerid, Building[i][EX],Building[i][EY],Building[i][EZ]);
    19. if(tmp < dist)
    20. {
    21. dist = tmp;
    22. e = i;
    23. }
    24. }
    25. if(e != -1)
    26. {
    27. SetPlayerPos(playerid,Building[e][IX],Building[e][IY],Building[e][IZ]);
    28. if(Building[e][Interior]!=0)SetPlayerInterior(playerid,Building[e][Interior]);
    29. if(Building[e][Welt]!=0)SetPlayerVirtualWorld(playerid,Building[e][Welt]);
    30. SetPVarInt(playerid,"InBuilding",e);
    31. return 1;
    32. }
    33. }
    Alles anzeigen

  • Neu

    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.

    C-Quellcode

    1. stock const Building[][buildungs]={
    2. {"Fahrschule",3,0,/*Eingang*/Y,Y,Y,/*Ausgang*/X,X,X},
    3. {"Los Santos Bank",0,0,/*Eingang*/Y,Y,Y,/*Ausgang*/X,X,X}
    4. };
    5. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    6. {
    7. if(!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_SECONDARY_ATTACK))// Enter
    8. {
    9. if(GetPVarInt(playerid,"InBuilding")!=-1)
    10. {
    11. new e=GetPVarInt(playerid,"InBuilding");
    12. if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][IX],Building[e][IY],Building[e][IZ]))
    13. {
    14. SetPlayerPos(playerid,Building[e][EX],Building[e][EY],Building[e][EZ]);
    15. SetPlayerInterior(playerid,0);
    16. SetPlayerVirtualWorld(playerid,0);
    17. SetPVarInt(playerid,"InBuilding",-1);
    18. return 1;
    19. }
    20. }
    21. else
    22. {
    23. new Float:dist = 3.0, Float:tmp, e = -1;
    24. for(new i; i<sizeof(Building); i++)
    25. {
    26. tmp = GetPlayerDistanceFromPoint(playerid, Building[i][EX],Building[i][EY],Building[i][EZ]);
    27. if(tmp < dist)
    28. {
    29. dist = tmp;
    30. e = i;
    31. }
    32. }
    33. if(e != -1)
    34. {
    35. SetPlayerPos(playerid,Building[e][IX],Building[e][IY],Building[e][IZ]);
    36. if(Building[e][Interior]!=0)SetPlayerInterior(playerid,Building[e][Interior]);
    37. if(Building[e][Welt]!=0)SetPlayerVirtualWorld(playerid,Building[e][Welt]);
    38. SetPVarInt(playerid,"InBuilding",e);
    39. return 1;
    40. }
    41. }
    Alles anzeigen

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Neu

    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.