Enter/Exit funktioniert nicht wie gewollt

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
  • Hallo Community!
    Habe ein kleines Problem, der /enter Befehl klappt nicht mehr so ganz wie er sollte.
    Sobald der Spieler an ein Marker ist der in bdInfo fest gelegt ist soll er in ein Business Interior gelangen, dies klappt aber nicht ganz.
    Sobald 'IsPlayerInRangeOfPoint' kommt beendet er das ganze.


    #define MAX_SHOP 6


    new bdInfo[MAX_SHOP][buildingsEnum] = {
    {"Bürger Shot Nord",1559,1199.2811,-918.6648,43.1191}, // BSE1
    {"Bürger Shot West",1559,810.9824,-1616.2720,13.5469}, // BSE2
    {"Bürger Shot Nord",1559,1872.7986,2071.6619,11.0625}, // BSE3
    {"Bürger Shot Nord-West",1559,2472.3940,2034.2115,11.0625}, // BSE4
    {"Bürger Shot West",1559,2169.9138,2795.8726,10.8203} // BSE5
    };


    ocmd:enter(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(bsInfo); i++)
    {
    new tmp_i = MAX_SHOP;
    print("DEBUG: Aufgerufen");
    if(!bsInfo[i][db_id])continue;
    print("bsInfo[i][db_id]");
    if(bsInfo[i][ib_x]==0.0)continue;
    print("bsInfo[i][ib_x] >0.0");
    if(!IsPlayerInRangeOfPoint(playerid, 2, bdInfo[tmp_i][bd_x], bdInfo[tmp_i][bd_y],bdInfo[tmp_i][bd_z]))continue;
    printf("IsPlayerInRangeOfPoint(playerid, 2, bdInfo[%i][bd_x], bdInfo[%i][bd_y],bdInfo[%i][bd_z]",tmp_i,tmp_i,tmp_i);
    format(string,128,"{C8C8C8}Sie können das Geschäft nicht betreten. {E90000}(Lager leer)");
    if(bsInfo[i][b_prods] <1)return SCM(playerid,COLOR_GRAU,string);
    SetPlayerPos(playerid,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]);
    print("SetPlayerPos");
    SetPlayerInterior(playerid,bsInfo[i][b_interior]);
    print("SetPlayerInterior");
    SetPlayerVirtualWorld(playerid,i);
    SetPVarInt(playerid,"tmp_ID",tmp_i);
    printf("x='%f' | y='%f' | z='%f'",bdInfo[tmp_i][bd_x], bdInfo[tmp_i][bd_y],bdInfo[tmp_i][bd_z]);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(hInfo[i][i_x] == 0.0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(hInfo[i][h_lock] == 1)
    {
    if(!strcmp(hInfo[i][h_besitzer],SpielerName(playerid),true))
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return GameTextForPlayer(playerid,"~r~Abgeschlossen",1000,1);


    }
    else if(hInfo[i][h_lock] == 0)
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    }
    return 1;
    }
    return 1;
    }


    ocmd:exit(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    for(new i=0; i<sizeof(bsInfo); i++)
    {
    new tmp_i = GetPVarInt(playerid,"tmp_ID");
    if(GetPlayerVirtualWorld(playerid)!=i)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]))continue;
    SetPlayerPos(playerid,bdInfo[tmp_i][bd_x],bdInfo[tmp_i][bd_y],bdInfo[tmp_i][bd_z]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(GetPlayerVirtualWorld(playerid)!=i)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]))continue;
    SetPlayerPos(playerid,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    return 1;
    }
    return 1;
    }


    Debugg:

  • Ah, die Debugs hast du schon gemacht, das spart natürlich sehr viel Arbeit, schön dass das mal jemand macht. :thumbup:


    Teste es mal so:

    Spoiler anzeigen
    ocmd:enter(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(bsInfo); i++)
    {
    print("DEBUG: Aufgerufen");
    if(!bsInfo[i][db_id])continue;
    print("bsInfo[i][db_id]");
    if(bsInfo[i][ib_x]==0.0)continue;
    print("bsInfo[i][ib_x] >0.0");
    if(!IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]))continue;
    printf("IsPlayerInRangeOfPoint(playerid, 2, bdInfo[%i][bd_x], bdInfo[%i][bd_y],bdInfo[%i][bd_z]",i,i,i);
    format(string,128,"{C8C8C8}Sie können das Geschäft nicht betreten. {E90000}(Lager leer)");
    if(bsInfo[i][b_prods] <1)return SCM(playerid,COLOR_GRAU,string);
    SetPlayerPos(playerid,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]);
    print("SetPlayerPos");
    SetPlayerInterior(playerid,bsInfo[i][b_interior]);
    print("SetPlayerInterior");
    SetPlayerVirtualWorld(playerid,i);
    SetPVarInt(playerid,"tmp_ID",i);
    printf("x='%f' | y='%f' | z='%f'",bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(hInfo[i][i_x] == 0.0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(hInfo[i][h_lock] == 1)
    {
    if(!strcmp(hInfo[i][h_besitzer],SpielerName(playerid),true))
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return GameTextForPlayer(playerid,"~r~Abgeschlossen",1000,1);

    Spoiler anzeigen
    }
    else if(hInfo[i][h_lock] == 0)
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    }
    return 1;
    }
    return 1;
    }


    Das tmp_i war eigentlich nicht nötig.

  • Bei den Häusern hat es geklappt beim Bürger shot leider nicht mehr.
    Hier der Debug code:

  • Debugge es mal so (mit Werten):

    Spoiler anzeigen
    ocmd:enter(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(bsInfo); i++)
    {
    printf("DEBUG: Aufgerufen: %d", i);
    printf("db_id: %d", bsInfo[i][db_id]);
    if(!bsInfo[i][db_id])continue;
    printf("ib_x: %f", bsInfo[i][ib_x]);
    if(bsInfo[i][ib_x]==0.0)continue;
    printf("Range: %d", IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]));
    if(!IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]))continue;
    format(string,128,"{C8C8C8}Sie können das Geschäft nicht betreten. {E90000}(Lager leer)");
    if(bsInfo[i][b_prods] <1)return SCM(playerid,COLOR_GRAU,string);
    SetPlayerPos(playerid,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]);
    print("SetPlayerPos");
    SetPlayerInterior(playerid,bsInfo[i][b_interior]);
    print("SetPlayerInterior");
    SetPlayerVirtualWorld(playerid,i);
    SetPVarInt(playerid,"tmp_ID",i);
    printf("x='%f' | y='%f' | z='%f'",bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(hInfo[i][i_x] == 0.0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(hInfo[i][h_lock] == 1)
    {
    if(!strcmp(hInfo[i][h_besitzer],SpielerName(playerid),true))
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return GameTextForPlayer(playerid,"~r~Abgeschlossen",1000,1);

    Spoiler anzeigen
    }
    else if(hInfo[i][h_lock] == 0)
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    }
    return 1;
    }
    return 1;
    }

  • Folgender debugg code:

  • Wieso eigentlich 15 Durchläufe?
    new bdInfo[MAX_SHOP][buildingsEnum] = {
    {"Bürger Shot Nord",1559,1199.2811,-918.6648,43.1191}, // BSE1
    {"Bürger Shot West",1559,810.9824,-1616.2720,13.5469}, // BSE2
    {"Bürger Shot Nord",1559,1872.7986,2071.6619,11.0625}, // BSE3
    {"Bürger Shot Nord-West",1559,2472.3940,2034.2115,11.0625}, // BSE4
    {"Bürger Shot West",1559,2169.9138,2795.8726,10.8203} // BSE5
    };
    Hier sind nur 5.


    Ist es Absicht, dass du bsInfo im Befehl geschrieben hast anstatt bdInfo, oder nicht? Ändere das ggf mal.

  • Schreibe es einfach mal so, klappt es dann?

    Spoiler anzeigen
    ocmd:enter(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(bdInfo); i++)
    {
    printf("DEBUG: Aufgerufen: %d", i);
    printf("db_id: %d", bdInfo[i][db_id]);
    if(!bdInfo[i][db_id])continue;
    printf("ib_x: %f", bdInfo[i][ib_x]);
    if(bdInfo[i][ib_x]==0.0)continue;
    printf("Range: %d", IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]));
    if(!IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]))continue;
    format(string,128,"{C8C8C8}Sie können das Geschäft nicht betreten. {E90000}(Lager leer)");
    if(bdInfo[i][b_prods] <1)return SCM(playerid,COLOR_GRAU,string);
    SetPlayerPos(playerid,bdInfo[i][ib_x],bdInfo[i][ib_y],bdInfo[i][ib_z]);
    print("SetPlayerPos");
    SetPlayerInterior(playerid,bdInfo[i][b_interior]);
    print("SetPlayerInterior");
    SetPlayerVirtualWorld(playerid,i);
    SetPVarInt(playerid,"tmp_ID",i);
    printf("x='%f' | y='%f' | z='%f'",bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(hInfo[i][i_x] == 0.0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(hInfo[i][h_lock] == 1)
    {
    if(!strcmp(hInfo[i][h_besitzer],SpielerName(playerid),true))
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return GameTextForPlayer(playerid,"~r~Abgeschlossen",1000,1);

    Spoiler anzeigen
    }
    else if(hInfo[i][h_lock] == 0)
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    }
    return 1;
    }
    return 1;
    }

  • Geht leider immer noch nicht, ich musste den Code etwas umschreiben weil du hattest überall bdInfo gemacht und da war viel von bsInfo :D
    Aber nun gut.
    Diesmal hat er es nur 4x aufgerufen.

  • Dort kommen Fehler.
    Ich will ja das so machen das wenn er im bdInfo im Marker ist dazu sind die Kordinaten drinne.
    bd_x bis z sind nur die Kordinaten der Marker.
    So und wenn der im Marker ist und enter drückt soll er in das Business Interior kommen bsp Bürgershot.

  • Poste bitte dann mal beide Arrays mit den Daten und beide enums dazu. Sonst kann ich mir das nur schwer vorstellen, wie du das haben willst.
    Wäre auch gut wenn du dazu schreibst, welche die Koordinaten des Markers sind und die Koordinaten sind zu denen er teleportiert werden soll.

  • Okay :)


    enum bizEnum {
    Float:bx,
    Float:by,
    Float:bz,
    Float:ib_x, //Zu den soll er Teleportiert werden (Im Script bereits festgelegt)
    Float:ib_y, //Zu den soll er Teleportiert werden (Im Script bereits festgelegt)
    Float:ib_z, //Zu den soll er Teleportiert werden (Im Script bereits festgelegt)
    b_interior,
    b_besitzer[MAX_PLAYER_NAME],
    b_level,
    b_preis,
    db_id,
    b_pickup,
    Text3D:b_text,
    b_kasse,
    b_cobesitzer[MAX_PLAYER_NAME],
    b_cokasse,
    b_prods,
    b_pPrice,
    b_tauftrag,
    b_id
    }


    enum buildingsEnum {
    bd_itext[128],
    bd_pickup,
    Float:bd_x, //Kordinate vom Marker
    Float:bd_y, //Kordinate vom Marker
    Float:bd_z, //Kordinate vom Marker
    Text3D:bd_text
    }


    new bdInfo[MAX_SHOP][buildingsEnum] = {
    {"Bürger Shot Nord",1559,1199.2811,-918.6648,43.1191}, // BSE1 //Die Kordinaten sagen aus wo der Marker steht.
    {"Bürger Shot West",1559,810.9824,-1616.2720,13.5469}, // BSE2
    {"Bürger Shot Nord",1559,1872.7986,2071.6619,11.0625}, // BSE3
    {"Bürger Shot Nord-West",1559,2472.3940,2034.2115,11.0625}, // BSE4
    {"Bürger Shot West",1559,2169.9138,2795.8726,10.8203} // BSE5
    };

  • enum buildingsEnum {
    bd_itext[128],
    bd_pickup,
    Float:bd_x, //Kordinate vom Marker
    Float:bd_y, //Kordinate vom Marker
    Float:bd_z, //Kordinate vom Marker
    Text3D:bd_text,
    Float:bx,
    Float:by,
    Float:bz,
    Float:ib_x, //Zu den soll er Teleportiert werden (Im Script bereits festgelegt)
    Float:ib_y, //Zu den soll er Teleportiert werden (Im Script bereits festgelegt)
    Float:ib_z, //Zu den soll er Teleportiert werden (Im Script bereits festgelegt)
    b_interior,
    b_besitzer[MAX_PLAYER_NAME],
    b_level,
    b_preis,
    db_id,
    b_pickup,
    Text3D:b_text,
    b_kasse,
    b_cobesitzer[MAX_PLAYER_NAME],
    b_cokasse,
    b_prods,
    b_pPrice,
    b_tauftrag,
    b_id
    }


    Versuche es mal so

  • Sorry, hatte gestern keine Zeit mehr.
    Allerdings fehlen da noch immer die Daten. Schau mal, bei dem bdInfo hast du die Daten auch gepostet, genau diese fehlen bei dem bsInfo. Oder hast du da gar keine? Das würde auch erklären warum der Befehl immer 0 ausgibt.

  • Naja, das ist ja dann genau das Problem. Du hast keine Daten, sprich:
    if(!IsPlayerInRangeOfPoint(playerid,2,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]))continue;
    bsInfo ist ja leer, sprich immer 0.0000.


    => Das heißt, egal wie rum ich es drehe, entweder wirst du zum 0-Punkt teleportiert, oder es wird abgefragt ob du am 0-Punkt bist.


    Du brauchst ja beide Daten, sprich beide Positionen, einmal die Position vom Marker (die hast du ja anscheinend), aber die Position im Burger Shot fehlt.