Interior PVar Problem

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

  • Interior PVar Problem

    Aus den Kleinen Scriptingfragen hierher verschoben.


    Ich habe ein Gebäude, was man betreten kann. In diesem Gebäude kann man ein weiteres Gebäude(Interior) betreten.
    Was ist hier der schlauste Weg? Ich setzte ja den PVar, dass der Spieler in einem Gebäude ist.


    Muss ja so aussehen:
    Spieler in Gebäude 1 ist Pvar InBuilding dementsprechend gesetzt, gehe ich von diesem Gebäude in ein anderes Zimmer als Beispiel muss das Pvar auch dementsprechend gesetzt werden, was hier glaube ich auch der Fall ist.
    Gehe ich wieder zurück wird das Pvar auf -1 gesetzt, aber er ist ja noch im Gebäude.


    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. stock const Building[][buildungs]={
    2. {"Ls Gebäude(1.Interior)",0,0,/*Eingang*X,X,X,/*Ausgang*/Y,Y,Y},
    3. {"Ls Gebäude(2.weiteres Interior)",3,0,/*Eingang*/X,X,X,/*Ausgang*/Y,Y,Y}
    4. };

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

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Eine andere Frage, was funktioniert denn nicht ?

    Ansonsten verstehe ich nicht, wieso du die "BuildingID" in eine PVar setzt, also finde diese Art ziemlich ungewöhnlich. Wieso fragst du nicht über eine Schleife ab ob er generell in der Nähe von einem Ausgang ist.

    Könnte z.B so aussehen

    PAWN-Quellcode

    1. for(new i = 0; i < sizeof Building; i++)
    2. {
    3. if(IsPlayerInRangeOfPoint(playerid,3.0,Building[i][IX],Building[i][IY],Building[i][IZ]))
    4. {
    5. //Aktion
    6. }
    7. }
    У страха глаза велики =O
  • BrightLeaN schrieb:

    Was ist hier der schlauste Weg? Ich setzte ja den PVar, dass der Spieler in einem Gebäude ist.
    Das solltest du dann gar nicht machen und grundsätzlich beide Positionen (Ein- und Ausgang) abfragen.
    Je nach dem wo er am nächsten steht, setzt du ihm die Position an die andere Position.

    Das Speichern der PVar würde ich in dem Fall gar nicht machen, bzw. auf das musst du sogar vollständig verzichten, da sonst das "Weiterspringen" von einem Interior in das nächste nicht klappen wird.

    Vom Code her:
    Zwei mal die Schleife wie ich sie dir gegeben habe, speichere die Distanz in zwei unterschiedliche Variablen, sowie die ID und frage nach den beiden Schleifen ab, welche Distanz kleiner ist und setze den Spieler dann am die dazugehörige Position zur dazugehörigen ID (wenn Interior-Distanz kleiner, dann zur Außgang-Position, und wenn Außgang-Distanz kleiner, dann zur Interior-Position).
  • Stimmt, ich könnte es ja weg lassen. Aber ich wollte den PVar InBuilding noch behalten, damit ich mal irgendwo noch abfragen kann, ob der Spieler in einem Gebäude ist "InBuilding".
    Könnte ich auch so abfragen ob ein Spieler in einem Gebäude ist? Will nur wissen ob das machbar wäre.

    Ich hätte halt abgefragt ob es genau das Gebäude ist und hätte es so eingeteilt in Gebäude in Gebäude, ist das ein Gebäude im Gebäude wird das PVar nicht gesetzt.
    Da ich das ganze sauber halten will, möchte ich gerne darauf verzichten.

    Ich versteh aber nicht, wie das so machbar wäre? Finde das ziemlich kompliziert :D

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

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

    Könnte ich auch so abfragen ob ein Spieler in einem Gebäude ist? Will nur wissen ob das machbar wäre.
    Ja, dann würde ich es dir so vorschlagen:

    PAWN-Quellcode

    1. new Float:e_dist = 3.0, i_dist = 3.0, Float:tmp, e_id = -1, i_id = -1;
    2. for(new i; i<sizeof(Building); i++)
    3. {
    4. tmp = GetPlayerDistanceFromPoint(playerid, Building[i][EX],Building[i][EY],Building[i][EZ]);
    5. if(tmp < e_dist)
    6. {
    7. e_dist = tmp;
    8. e_id = i;
    9. }
    10. tmp = GetPlayerDistanceFromPoint(playerid, Building[i][IX],Building[i][IY],Building[i][IZ]);
    11. if(tmp < i_dist)
    12. {
    13. i_dist = tmp;
    14. i_id = i;
    15. }
    16. }
    17. if(e_dist < i_dist)
    18. {
    19. SetPlayerPos(playerid,Building[e_id][IX],Building[e_id][IY],Building[e_id][IZ]);
    20. if(Building[e_id][IInterior]!=0)SetPlayerInterior(playerid,Building[e_id][IInterior]);
    21. if(Building[e_id][IWelt]!=0)SetPlayerVirtualWorld(playerid,Building[e_id][IWelt]);
    22. SetPVarInt(playerid,"InBuilding", e_id);
    23. }
    24. else
    25. {
    26. SetPlayerPos(playerid,Building[i_id][EX],Building[i_id][EY],Building[i_id][EZ]);
    27. if(Building[i_id][EInterior]!=0)SetPlayerInterior(playerid,Building[i_id][EInterior]);
    28. if(Building[i_id][EWelt]!=0)SetPlayerVirtualWorld(playerid,Building[i_id][EWelt]);
    29. SetPVarInt(playerid,"InBuilding", Building[i_id][EBuilding]);
    30. }
    Alles anzeigen


    Du benötigst hier jeweils die Informationen von Interior und Welt für dein Ein- und Ausgang, nimm diese noch ins Array mit auf.
    Außerdem benötigst du das EBuilding, das wäre die ID des Buildings, in das man kommt, wenn man den Ausgang des vorherigen Buildings nimmt.
    Sprich, bei dir wäre das immer -1, außer bei dem einen Building, in das du nur durch ein anderes Building kommst, da wäre es die ID des Buildings, durch das man in dieses Building kommt.
  • Im Enum habe ich doch das Interior und die Welt?

    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. }


    Quellcode

    1. : error 017: undefined symbol "IInterior"
    2. : error 017: undefined symbol "IInterior"
    3. : error 017: undefined symbol "IWelt"
    4. : error 017: undefined symbol "IWelt"
    5. : error 017: undefined symbol "EInterior"
    6. : error 017: undefined symbol "EInterior"
    7. : error 017: undefined symbol "EWelt"
    8. : error 017: undefined symbol "EWelt"
    9. : error 017: undefined symbol "EBuilding"
    Hast du mit Absicht die Sachen geändert? Also damit meine ich, die Sachen mit dem i am Anfang.
    Die E Variablen habe ich nicht so ganz verstanden, soll ich diese mit ins enum schreiben und bei allen Gebäuden auf -1 setzten und bei dem einen was in einem Gebäude drin ist z.B 1?
    Und warum speichere ich noch einmal das Interior und noch einmal die Welt?
    Meine Inaktivität erklärt mein 7 Tägiger Urlaub :D

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • Alles klar, ich habe es verstanden,
    tag mismatch in Zeile 1. und 13.
    Also, alle Gebäude sind beim EBuilding auf -1, außer das eine Gebäude das hat eine 1 kann ich dann beim 2. Gebäude dort 2 hinschreiben usw. die Aufzählung halt?
    Oder hab ich das falsch verstanden :D

    C-Quellcode

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

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

    tag mismatch in Zeile 1. und 13.
    Schreibe in Zeile 1 vor das i_dist noch "Float:".


    BrightLeaN schrieb:

    Also, alle Gebäude sind beim EBuilding auf -1, außer das eine Gebäude das hat eine 1 kann ich dann beim 2. Gebäude dort 2 hinschreiben usw. die Aufzählung halt?
    Bei EBuilding schreibst du die Building ID rein, in der man ist, wenn man das Building verlässt. Wenn man nach verlassen in keinem mehr ist, dann -1, wenn das Verlassen in ein anderes Building führt, dann diese ID.

  • Irgendwie setzt er die Interior-Welt beim Austritt vom Y in das X Interior nicht auf 0

    C-Quellcode

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

    C-Quellcode

    1. {"X",0,0,/*Eingang*/X, Y, Z,/*Ausgang*/0,0,X, Y, Z,-1},
    2. {"Y",1,0,/*Eingang*/X, Y, Z,/*Ausgang*/0,0,X, Y, Z,0}

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • C-Quellcode

    1. {"X",0,0,/*Eingang*/X, Y, Z,/*Ausgang*/0,0,X, Y, Z,-1},
    2. {"Y",1,0,/*Eingang*/X, Y, Z,/*Ausgang*/0,0,X, Y, Z,0}
    Ich will, dass ein Eingang mit einem Befehl Ein- und Ausschaltbar ist. Ist nichts schweres, aber ich weiß nicht wie ich hier abfrage, ob der Wert IsAllowedToEnter = 1 ist bei Gebäude Y


    C-Quellcode

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

    Ich weiß, dass ich weiß, dass ich nichts weiß.
  • C-Quellcode

    1. if(Building[i_id][IsInteriorClosed] == 1) return SendClientMessage(playerid, 0xFF0000FF, "[Error] Dieses Interior ist gesperrt.");
    Ich hab die Abfrage verändert, ich brauch die Abfrage aber beim Eingang und nicht Ausgang vom Interior (heißt vor dem else teil). Dazu brauch jedes eigene Building, was schließbar ist einen eigenen return Text, wie mache ich das?

    Könnte ich zuerst abfragen ob IsInteriorClosed > als 0 ist und dann abfragen ob es 1, 2 , 3 , 4 ist jede Zahl hat dann sein eigen return Text und sein eigenes Building?

    C-Quellcode

    1. if(e_dist < i_dist)
    2. {
    3. SetPlayerPos(playerid,Building[e_id][IX],Building[e_id][IY],Building[e_id][IZ]);
    4. SetPlayerInterior(playerid,Building[e_id][Interior]);
    5. SetPlayerVirtualWorld(playerid,Building[e_id][Welt]);
    6. SetPVarInt(playerid,"InBuilding", e_id);
    7. }
    8. else
    9. {
    10. SetPlayerPos(playerid,Building[i_id][EX],Building[i_id][EY],Building[i_id][EZ]);
    11. SetPlayerInterior(playerid,Building[i_id][EInterior]);
    12. SetPlayerVirtualWorld(playerid,Building[i_id][EWelt]);
    13. SetPVarInt(playerid,"InBuilding", Building[i_id][EBuilding]);
    14. }
    Alles anzeigen
    Wenn ich die Zeile vor Zeile 3. schreibe, erscheint ein Error in der Konsole

    Quellcode

    1. [15:30:40] [debug] #0 00029f4c in public OnPlayerKeyStateChange (0, 144, 128) from /*X*/.amx
    2. [15:30:41] [debug] Run time error 4: "Array index out of bounds"
    3. [15:30:41] [debug] Attempted to read/write array element at negative index -1



    Mir ist gerade auch noch unklar wie ich in einem anderen Code das richtige Interior schließe bzw. öffne.

    hier möchte ich das Building Nummer 3 schließen.
    würde Building[3][IsInteriorClosed] = 1; ausreichen?

    C-Quellcode

    1. case 0:
    2. {
    3. Building[3][IsInteriorClosed] = 1
    4. }

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