Beiträge von DJ Deagle

    Hi,


    wie oben steht, habe ich ein Problem mit meinem /carlock-Befehl.
    Ich bekomme immer folgende Meldung im Chat:

    Code
    [07:10:14] Du bist nicht in der nähe eines Fahrzeuges, für das du einen Schlüssel besitzt!
    [07:10:14] Du hast dein Fahrzeug aufgeschlossen!
    
    
    [07:11:44] Du bist nicht in der nähe eines Fahrzeuges, für das du einen Schlüssel besitzt!
    [07:11:44] Du hast dein Fahrzeug abgeschlossen!


    Man beachte, dass ich trotz, dass das Fahrzeug auf/abgeschlossen wird die Meldung bekomme, dass ich nicht in der nähe eines Fahrzeuges bin, für welches ich einen Schlüssel besitze.


    Hier der Befehl:
    ocmd:carlock(playerid,params[])
    {
    GetPlayerName(playerid,sendername,sizeof sendername);
    for(new c;c<MaxVehikel;c++) {
    if(!pCarInfo[code=c][cCreated])continue;
    if((!strcmp(sendername,pCarInfo[code=c][cOwner],true))) {
    new Float:pP[3];
    GetVehiclePos(pCarInfo[code=c][cVeh],pP[0],pP[1],pP[2]);
    if(IsPlayerInRangeOfPoint(playerid,5,pP[0],pP[1],pP[2])) {
    pCarInfo[code=c][cLocked] = (!pCarInfo[code=c][cLocked]);
    SetVehicleLock(pCarInfo[code=c][cVeh],pCarInfo[code=c][cLocked]);
    SendClientMessage(playerid,COLOR_YELLOW,(pCarInfo[code=c][cLocked]) ? ("Du hast dein Fahrzeug aufgeschlossen!") : ("Du hast dein Fahrzeug abgeschlossen!"));
    PlayerPlaySound(playerid, 1145, 0.0, 0.0, 0.0);
    } else {
    SendClientMessage(playerid,COLOR_GREY,"Du bist nicht in der nähe eines Fahrzeuges, für das du einen Schlüssel besitzt!");
    }
    }
    }
    return 1;
    }


    Was mach' ich nu falsch? Jeffry: ? :D


    lg
    Deagle

    Zitat

    This will be everytime a SendClientMessageToAll function is used and everytime a SendClientMessage function is sent towards the NPC


    Wenn man einen SendClientMessage ausführt oder man eine Nachricht direkt an den NPC sendet (SendClientMessage(NPCID,-1,"XXX"))

    Zitat

    This callback won't be called when someone says something. For a version of this with player text, see NPC:OnPlayerText.


    Wenn du keinen Realchat hast (%s sagt: %s), musst du den Callback NPC:OnPlayerText verwenden.


    Besser erklärt?

    Poste den Code mit dem du die Seite wechselst und den Code mit dem du den Dialog mit den Fahrzeug-Info's anzeigen lässt.


    new curpage = GetPVarInt(playerid, "vspawner_page");
    if(playertextid == gNextButtonTextDrawId[playerid] && GetPVarInt(playerid, "vspawner_active") != 0) {
    if(curpage < (GetNumberOfPages() - 1)) {
    SetPVarInt(playerid, "vspawner_page", curpage + 1);
    ShowPlayerModelPreviews(playerid);
    UpdatePageTextDraw(playerid);
    PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
    } else {
    PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
    }
    return 1;
    }
    else if(playertextid == gPrevButtonTextDrawId[playerid] && GetPVarInt(playerid, "vspawner_active") != 0) {
    if(curpage > 0) {
    SetPVarInt(playerid, "vspawner_page", curpage - 1);
    ShowPlayerModelPreviews(playerid);
    UpdatePageTextDraw(playerid);
    PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0);
    } else {
    PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
    }
    return 1;
    }
    if(GetPVarInt(playerid, "vspawner_active") != 0) {
    new x;
    while(x != SELECTION_ITEMS) {
    if(playertextid == gSelectionItems[playerid][x]) {
    ShowVehicleInfoData(playerid,x);
    PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
    DestroySelectionMenu(playerid);
    CancelSelectTextDraw(playerid);
    SetPVarInt(playerid, "vspawner_active", 0);
    return 1;
    }
    x++;
    }
    }


    stock ShowVehicleInfoData(playerid, selecteditem)
    {
    new str[512],rnd=random(2500);
    format(str,sizeof str,"{FFFFFF}Du hast folgendes Fahrzeug ausgewählt.\n\nName: {00FF00}%s\n{FFFFFF}Importkosten: {FF0000}%s{FFFFFF}€\n{FFFFFF}Kostenaufschlag (für die Lieferanten): {FF0000}%s{FFFFFF}€\n\nGesamtkosten: {FF0000}%s{FFFFFF}€",PlayerVehicle[gItemList[selecteditem]-400],inspoints(DealerVehPrice[selecteditem]),inspoints(rnd),inspoints(DealerVehPrice[selecteditem]+rnd));
    SetPVarInt(playerid,"ImportVeh",selecteditem);
    SetPVarInt(playerid,"Lieferkosten",rnd);
    ShowPlayerDialog(playerid,DLG_AH_IMPORTCAR,DIALOG_STYLE_MSGBOX,"Fahrzeug importieren",str,"Import","Abbrechen");
    return 1;
    }


    Wirklich Super erklärt! :thumbup::thumbup::thumbup:


    Nun klappt alles Wunderbar.
    Allerdings habe ich noch das folgende Problem:


    Wenn ich im Bestellmenü die Seite wechsle (Von 1 auf 2), wird die Vehikel-ID auf der 2. Seite nicht erhöht.
    Dazu habe ich hier zwei kleine Screens die das zeigen:


    Die hellblauen Punkte zeigen immer, wo ich gerade raufgeklickt habe.


    P.S.: Das mit dem Array klappt alles :)

    Das listitem bei OnDialogResponse fragst du genauso ab:


    Ich habe es nun mal ohne Dialoge gemacht.
    Folgendes Problem: Ich steige als "Besitzer" dieses Autohausfahrzeuges in das Fahrzeug ein, doch es passiert nicht das, was passieren soll.
    Hier der OnPlayerStateChange:
    if(newstate == PLAYER_STATE_DRIVER) {
    new veh=GetPlayerVehicleID(playerid);
    if(Buycar[veh] == 0) {
    //mein Code
    } else {
    if(AHCarInfo[veh][aSeller] == pInfo[playerid][pAH]) {
    SendClientMessage(playerid,COLOR_WHITE,"Du kannst das Ausstellungsfahrzeug mit dem Befehl '/parkcdcar' umparken.");
    SendClientMessage(playerid,COLOR_GREY,"Beachte: Dabei darf das Fahrzeug das Autohausgelände nicht verlassen!");
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[GetPlayerVehicleID(playerid)] = true;
    } else {
    TogglePlayerControllable(playerid, false);
    SendClientMessage(playerid,COLOR_WHITE,"Du bist in einem Autohausauto!");
    }
    }
    }
    Ich bekomme keine Meldung.


    /e: Habe grad folgende Debugs reingehauen:
    } else {
    print("Check 1");
    printf("1 |-> AHCarInfo: %d | pAH: %d",AHCarInfo[veh][aSeller],pInfo[playerid][pAH]);
    if(AHCarInfo[veh][aSeller] == pInfo[playerid][pAH]) {
    printf("2 |-> AHCarInfo: %d | pAH: %d",AHCarInfo[veh][aSeller],pInfo[playerid][pAH]);
    SendClientMessage(playerid,COLOR_WHITE,"Du kannst das Ausstellungsfahrzeug mit dem Befehl '/parkcdcar' umparken.");
    SendClientMessage(playerid,COLOR_GREY,"Beachte: Dabei darf das Fahrzeug das Autohausgelände nicht verlassen!");
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[GetPlayerVehicleID(playerid)] = true;
    } else {
    print("Nicht Inhaber");
    TogglePlayerControllable(playerid, false);
    SendClientMessage(playerid,COLOR_WHITE,"Du bist in einem Autohausauto!");
    }
    }
    Mit diesem Ergebnis:

    Code
    [07:56:06] Check 1

    Hi,


    ich habe bei meinem Autohaussystem nun versucht, die Fahrzeuge die einem Autohaus gehören so vom Besitzer umparken zu lassen, dass es für den Käufer attraktiv aussieht.
    "Versucht" trifft es da am besten. Ich hatte eine schleife, die alle Fahrzeuge durchgeht und checkt ob es ein Autohausfahrzeug ist:
    for(new v;v<MAX_VEHICLES;v++) {
    if(AHCarInfo[v][aSeller] == pInfo[playerid][pAH]) {
    format(str,sizeof str,"%s{FFFFFF}Fahrzeug: %s | Preis: %s€\n",str,PlayerVehicle[AHCarInfo[v][aModel]-400],inspoints(AHCarInfo[v][aPrice]);
    }
    }
    Dabei kam aber nie etwas brauchbares raus.
    Daher frage ich nun hier ( Jeffry: :whistling: ) wie ich es am besten machen kann.
    Alle Fahrzeuge die zu einem Autohaus gehören sind in folgendem "Array" gespeichert:
    enum zSellerCarInfo
    {
    aID,//DatenbankID
    aModel,
    aPrice,
    aSeller,
    Float:aPosX,
    Float:aPosY,
    Float:aPosZ,
    Float:aPosA,
    aVeh//Das Fahrzeug"objekt"
    };
    new AHCarInfo[MAX_SELLERCARS][zSellerCarInfo];
    Und bevor jemand fragt, hier werden diese gespawnt:
    stock LoadDealerCars()
    {
    mysql_query("SELECT * FROM `Dealercars`");
    mysql_store_result();
    if(mysql_num_rows() != 0) {
    new str[1024],idx=0;
    while(mysql_fetch_row(str)) {
    sscanf(str, "e<p<|>ddddffffd>",AHCarInfo[idx]);
    AHCarInfo[idx][aVeh]=CreateVehicle(AHCarInfo[idx][aModel],AHCarInfo[idx][aPosX],AHCarInfo[idx][aPosY],AHCarInfo[idx][aPosZ],AHCarInfo[idx][aPosA],random(128),random(128),-1);
    Buycar[AHCarInfo[idx][aVeh]] = 1;
    idx++;
    }
    mysql_free_result();
    }
    return 1;
    }


    Wie genau kann ich es am besten machen?


    lg
    Deagle

    Oh, äh.. Ja jetzt klappt alles. Jeffry:
    Allerdings wird der Eintrag irgendwie nicht gelöscht:
    [pwn[format(query,sizeof query,"DELETE * FROM `Ordereddealercars` WHERE `ID` = '%d'", db_ID[listitem]);
    mysql_query(query); [/pwn]

    Code
    [19:55:43] ::: MySQL Query Error :::
    [19:55:43] ErrorID: 1064
    [19:55:43] Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM `Ordereddealercars` WHERE `ID` = '3'' at line 1
    [19:55:43] ResultID: -1
    [19:55:43] ExtraID: -1
    [19:55:43] Callback: NULL
    [19:55:43] Query: DELETE * FROM `Ordereddealercars` WHERE `ID` = '3'
    [19:55:43] ConnectionHandle: 1

    sscanf(q,"p<|>{i}ddd",seller,model,reward);
    zu:
    sscanf(q,"p<|>ddd",seller,model,reward);


    Aber wieso denn?

    SQL
    SELECT `Seller`, `Model`, `Reward` FROM `Ordereddealercars` WHERE `ID` = '%d'


    Die Struktur ist: "ID | SELLER | MODEL | REWARD"
    Das heißt er würde doch SELLER = AUTO_INCREMENT ID, MODEL = SELLER, REWARD = MODEL machen?

    Code
    [18:58:56] VehicleID: 1
    [18:58:56] playerid: 2
    [18:58:56] inJob gesetzt
    [18:58:56] TruckerjobCP gesetzt
    [18:58:56] Seller: 411


    411 Soll aber doch das Model sein.
    Datenbankstruktur ist wiefolgt:
    "ID | SELLER | MODEL | REWARD"


    Hier nochmal wo aus der DB gezogen wird:
    while(mysql_fetch_row_format(q)) {
    sscanf(q,"p<|>{i}ddd",seller,model,reward);
    }


    Jeffry:
    LeijaT:

    Debugge es mal so. Was wird geprintet?


    Habe es so debuggt:
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    printf("VehicleID: %d", GetPlayerVehicleID(playerid));
    Motor[GetPlayerVehicleID(playerid)] = true;
    //Ab hier geht nix mehr.
    printf("playerid: %d", playerid);
    inJob[playerid] = 1;
    print("inJob gesetzt");
    TruckerjobCP[playerid] = 120;
    print("TruckerjobCP gesetzt");
    SetPlayerCheckpoint(playerid,AHInfo[seller][zPosX],AHInfo[seller][zPosY],AHInfo[seller][zPosZ],7);
    print("Checkpoint gesetzt.");
    printf("Checkpointkoordinaten: %f | %f | %f",AHInfo[seller][zPosX],AHInfo[seller][zPosY],AHInfo[seller][zPosZ]);
    SendClientMessage(playerid,COLOR_WHITE,"");
    Output:

    Code
    [17:59:16] VehicleID: 1
    [17:59:16] playerid: 2
    [17:59:16] inJob gesetzt
    [17:59:16] TruckerjobCP gesetzt

    Wie hast du denn die Variablen "Motor", "inJob" und "TruckerjobCP" deklariert? (new...)
    Hast du eine mehrzeilige Meldung mit vielen Zahlen im Compiler?


    new bool:Motor[MAX_VEHICLES]=false,inJob[MAX_PLAYERS],TruckerjobCP[MAX_PLAYERS];

    Code
    Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase


    Genug Zahlen? :D

    Jetzt sollte es klarer sein.


    Ok. Nun klappt alles wunderbar. Leider werden nun ab der markierten Zeile keine Sachen mehr ausgeführt (SendClientMessage usw):
    case DLG_TRUCKER_CARIMPORT:
    {
    if(response) {
    new q[256],seller,model,reward,Float:lPos[3],Float:zang,query[256];
    format(query,sizeof query,"SELECT `Seller`, `Model`, `Reward` FROM `Ordereddealercars` WHERE `ID` = '%d'", db_ID[listitem]);
    mysql_query(query);
    mysql_store_result();
    while(mysql_fetch_row_format(q)) {
    sscanf(q,"p<|>{i}ddd",seller,model,reward);
    }
    mysql_free_result();
    GetPlayerPos(playerid,lPos[0],lPos[1],lPos[2]);
    GetVehicleZAngle(GetPlayerVehicleID(playerid),zang);
    Jobtrailer[playerid] = CreateVehicle(591,lPos[0],lPos[1],lPos[2]+1000,zang,random(128),random(128),-1);
    JTrailerInfo[Jobtrailer[playerid]][jSeller] = seller;
    JTrailerInfo[Jobtrailer[playerid]][jModel] = model;
    JTrailerInfo[Jobtrailer[playerid]][jReward] = reward;
    SetTimerEx("AttachTrailerToTruck",750,0,"ddd",playerid,Jobtrailer[playerid],GetPlayerVehicleID(playerid));
    TogglePlayerControllable(playerid,false);
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[GetPlayerVehicleID(playerid)] = true;
    //Ab hier geht nix mehr.
    inJob[playerid] = 1;
    TruckerjobCP[playerid] = 120;
    SetPlayerCheckpoint(playerid,AHInfo[seller][zPosX],AHInfo[seller][zPosY],AHInfo[seller][zPosZ],7);
    printf("%f | %f | %f",AHInfo[seller][zPosX],AHInfo[seller][zPosY],AHInfo[seller][zPosZ]);
    SendClientMessage(playerid,COLOR_WHITE,"");
    SendClientMessage(playerid,COLOR_WHITE,"Bitte fahre zum Autohaus und lade das Fahrzeug ab!");
    format(query,sizeof query,"DELETE * FROM `Ordereddealercars` WHERE `ID` = '%d'", db_ID[listitem]);
    mysql_query(query);
    }
    }
    Warum?