Beiträge von Templer

    Ok, korrektur entschuldigung. Es geht tatsächlich. Also lies zu und lern aus deinen Fehler ^^


    Nehmen wir an, dein GM heißt gm.pwn und beinhaltet folgendes:


    #include <a_samp>


    main() { }


    public OnGameModeInit()
    {
    #include <fahrzeuge.inc>
    #include <objekte.inc>
    #include <pickups.inc>
    }


    und die Includes oben haben dann folgenden Inhalt:


    Bei fahrzeuge.inc

    CreateVehicle(560,4,3,1,0,1,1,-1);
    CreateVehicle(560,4,3,1,0,1,1,-1);
    CreateVehicle(560,4,3,1,0,1,1,-1);
    CreateVehicle(560,4,3,1,0,1,1,-1);
    //usw ^^


    Bei objekte.inc

    CreateObject(2342,0,0,20,0,0,90);
    CreateObject(2342,0,0,20,0,0,90);
    CreateObject(2342,0,0,20,0,0,90);
    CreateObject(2342,0,0,20,0,0,90);
    CreateObject(2342,0,0,20,0,0,90);
    //usw ^^


    Bei pickups.inc



    CreatePickup(231,1,0,0,0);
    CreatePickup(231,1,0,0,0);
    CreatePickup(231,1,0,0,0);
    CreatePickup(231,1,0,0,0);
    //usw ^^


    Also wie du erkennen kannst wären bei den Includes keine Funktion oder Callbacks mehr, sondern es wird der Inhalt in das GM kompiliert.


    Jedoch rate ich dir davon ab so zu programmieren, denn dadurch verlierst du stark an überblick. So wie Goldkiller dir seine Variante gezeigt hat wäre auch nicht zu empfehlen, denn es kann zu Fehler führen, also zum Callback-Ausfall. Natürlich kann der Code hier oben auch zu einem Codeausfall führen und letztendlich ist entweder meine Variante (von Y_Less) gut, oder du die Variante von Goldkiller verwendest, aber per CallLocalFunction, damit nicht der ganze Callback oder Funktion für den Spieler abbricht, wenn ein Array- oder Zeigerfehler aufretet.


    Und zu deinem Problem derzeit, bitte schau dir meinen Code oben genauer an und vergleiche ihn mit deinem.


    //EDIT: Sry für das komische Deutsch in meinem Text, aber es ist bei mir sehr heiß und ich aus Faulheit nicht korrigieren möchte ^^

    ^^, ein Include kann nur fpr ein gesamtes Script vorgenommen werden, aber nicht für CodeZeilen. Wenn du aber wirklich es so umständlich unternehmen willst, dann mache die Include-Beifügungen oberhalb vom Callback und im Include selber würde es dann so aussehen:


    forward IncludeOnPlayerCommandText(playerid,cmdtext[]);


    public OnPlayerCommandText(playerid,cmdtext[])
    {
    if(!strcmp(cmdtext,"/portBefehl",false)) return SetPlayerPos(playerid,0,0,0);
    return CallLocalFunction("IncludeOnPlayerCommandText","ds",playerid,cmdtext);
    }


    #if defined _ALS_OnPlayerCommandText
    #undef OnPlayerCommandText
    #else
    #define _ALS_OnPlayerCommandText
    #endif
    #define OnPlayerCommandText IncludeOnPlayerCommandText

    Hier bitte, hab dir was programmiert ^^


    //Wenn der Boolean DESC WAHR ist, dann ordnet er die Zahlen aufsteigend, wenn der Boolean FALSCH ist, dann
    //absteigend.
    OrderIntArray(array[],length,bool:DESC=true)
    {
    #define MAX_ARRAY_SIZE (32) //Wieviele Zahlen es max. zum ordnen gibt. Je höher, desto mehr Arbeitsspeicher.
    if(length>MAX_ARRAY_SIZE) return false;
    new cache[MAX_ARRAY_SIZE],size=length,range,cnr=-2147483647,lnr=2147483646;
    for(new order;order!=size;order++)
    {
    for(range=0;range!=size;range++)
    {
    if((DESC&&array[range]>cnr&&array[range]<lnr)) cnr = array[range];
    else if(!DESC&&array[range]>cnr&&array[range]<lnr) lnr = array[range];
    }
    if(order>0&&cache[order-1]==(DESC?cnr:lnr)) break;
    cache[order]=(DESC?cnr:lnr);
    if(DESC) {lnr=cnr; cnr=-2147483647;}
    else {cnr=lnr; lnr=2147483646;}
    }
    for(new edit;edit!=size;edit++) array[edit]=cache[edit];
    return true;
    }


    Und hier eine kleine Verwendung mit deinen Zahlen


    new Werte[]={1000,920,100,400};


    main()
    {
    OrderIntArray(Werte,sizeof(Werte),false);
    for(new edit;edit!=sizeof(Werte);edit++) printf("WERT in Feld %d: %d",edit,Werte[edit]);
    }

    AM besten wäre es vl. den Spieler für 2 Sekunden einzufrieren, damit dein MapStreamer den Boden lädt und er nichtmehr durchfliegt, ein Beispiel:


    forward UnFreeze(playerid);


    public UnFreeze(playerid) TogglePlayerControllable(playerid,1);


    public OnPlayerCommandText(playerid,cmdtext[])
    {
    if(!strcmp(cmdtext,"/portme",false))
    {
    SetPlayerPos(playerid,1244,-300,24.23); //Setze Spielerposition
    TogglePlayerControllable(playerid,0); //Friere Spieler ein
    return SetTimerEx("UnFreeze",2000,false,"d",playerid); //Taue Spieler nach 2 Sekunden wieder auf
    }
    return 0;
    }

    Dann schau dir vl dort die for-Schleife an wo sie verwendet wird bzw. die Variable die für einen ArrayBereich gesetzt wird. Unten ein kleines Beispiel was "sein" könnte, auch mit einer anderen ungültigen Zahl.


    new zahl=-1;
    g_cars[zahl][gcar_id] = CreateVehicle(Blah Blah...);


    wenn du verstehst was ich meine ^^, also per printf Debuggen

    Ersetze die Funktion "GetPointDistanceToPointExMorph" in der morphinc.inc um in


    Float:GetPointDistanceToPointExMorph(Float:ppX,Float:ppY,Float:ppZ,Float:ppX2,Float:ppY2,Float:ppZ2)
    {
    new Float:x, Float:y, Float:z;
    x = ppX-ppX2;
    y = ppY-ppY2;
    z = ppZ-ppZ2;
    return floatsqroot(x*x+y*y+z*z);
    }


    In der Zeile 3781, 3772, 3763 kannst du die Definition von "string" löschen.


    In der Zeile 3372 sollst du die Variable "playerid" löschen.


    Füge im Script oben zu den anderen forward´s folgendes ein:


    forward lspdgate1();
    forward lspdgate2();


    Dann erstelle oben im Script (also global) folgende Variable


    new MoneySpam[MAX_PLAYERS];


    Und suche überall nach dem UnFreezePlayer und FreezePlayer und ersetze es mit folgendem:


    //Wenn dort FreezePlayer steht, ersetze es mit...
    TogglePlayerControllable(playerid,0);



    //Wenn dort UnFreezePlayer steht, ersetze es mit...
    TogglePlayerControllable(playerid,1);


    Ich freue mich auf die nächsten Fehlermeldungen ^^ Und diesmal bitte auch die Fehlerzeilen dazuposten.

    Bei deinem Streamer ist diese Sache was ich dir programmiert habe integriert und ich würde dir auch daher empfehlen die StreamerVariante zu verwenden ^^


    Also habe theorethisch mir oben umsonst Mühe gemacht, da ich ned wusste, ob du nen Streamer benützt oder nicht ^^


    Hier ist die native von deiner Funktion:


    native CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, worldid = -1, interiorid = -1, playerid = -1, Float:distance = 200.0);


    und wie man sehen kann, musst du nur die worldid nach der Rotation in der Z-Achse (rz) setzen ^^.


    CreateDynamicObject(1232,0,0,0,0,0,0,3); //Setzt für alle Spieler das Object mit dem Model 1232, wenn Sie in der 3. VW sind


    aus diesem Grunde, kannst du dann auch gleich meine Sachen aus deinem Script löschen, da sie sonst in Konflikt miteinander kommen.

    Ok in diesem Fall wäre nicht der Befehl wichtig, sondern dann doch eher die Funktion AddVehicle!


    Meine Vermutung liegt an einem großem ArrayFehler, denn meißt entstehen solche "Crashes" bei multi-dimensionalen Array´s. Bei den einfachen bricht nur der Code ab ^^.

    Ok bitte löscht ihm nicht alle Hoffnungen raus. Wenn ihr zu SAMP neu seit und ihr nicht wisst, ob es geht, dann wäre das Stillschweigen auch oft die richtige Lösung, denn es reicht schon wenn einer meint, dass es ned geht. Dann müssen ned alle noch dazu schmeißen...


    Hier die Lösung:


    new VehicleStatus[MAX_VEHICLES][4];


    public OnEnterExitModShop(playerid, enterexit, interiorid)
    {
    if(GetPlayerState(playerid)!=PLAYER_STATE_DRIVER) return false;
    new vehicleid = GetPlayerVehicleID(playerid);
    if(!enterexit) UpdateVehicleDamageStatus(vehicleid,VehicleStatus[vehicleid][0],VehicleStatus[vehicleid][1],VehicleStatus[vehicleid][2],VehicleStatus[vehicleid][3]);
    else GetVehicleDamageStatus(vehicleid,VehicleStatus[vehicleid][0],VehicleStatus[vehicleid][1],VehicleStatus[vehicleid][2],VehicleStatus[vehicleid][3]);
    return true;
    }


    //EDIT: Der Fahrzeugschaden wäre nun mit der unteren Lösung dann auch dabei, was ich oben vergessen habe ^^


    enum vehStatInfo
    {
    panel,
    door,
    light,
    tire,
    Float:health,
    }
    new VehicleStatus[MAX_VEHICLES][vehStatInfo];


    public OnEnterExitModShop(playerid, enterexit, interiorid)
    {
    if(GetPlayerState(playerid)!=PLAYER_STATE_DRIVER) return false;
    new vehicleid = GetPlayerVehicleID(playerid);
    if(!enterexit)
    {
    UpdateVehicleDamageStatus(vehicleid,VehicleStatus[vehicleid][panel],VehicleStatus[vehicleid][door],VehicleStatus[vehicleid][light],VehicleStatus[vehicleid][tire]);
    SetVehicleHealth(vehicleid,VehicleStatus[vehicleid][health]);
    }
    else
    {
    GetVehicleDamageStatus(vehicleid,VehicleStatus[vehicleid][panel],VehicleStatus[vehicleid][door],VehicleStatus[vehicleid][light],VehicleStatus[vehicleid][tire]);
    GetVehicleHealth(vehicleid,VehicleStatus[vehicleid][health]);
    }
    return true;
    }

    Der Befehl dazu wäre auch interessant, denn deine Definitionen sind richtig. Aber irgendwie merke ich auch gerade, dass du ungern Scahen aus deinem Script hier offenlegen willst ^^ Aber es geht nunmal nicht anders, wenn du es nicht alleine lösen kannst bzw. du hier Hilfe verlangst.

    Am besten ises wenn du den HexCode 0x0013F714 in Stack #60 kurz veränderst in 0x00000000, ansonsten frag mal Kye, da nur er (was ich glaube) den SourceCode hat um nachzusehen.


    Wenn du ihn nicht fragen willst, dann poste uns die Problemzeile von deinem Sourcecode.

    Die Verwendung sollte logisch sein ^^


    new Text3D:PickupText[MAX_PICKUPS];
    new Text3D:ObjectText[MAX_OBJECTS];


    CreatePickupWithText(model, type, Float:X, Float:Y, Float:Z, Virtualworld, text[])
    {
    new pick = CreatePickup(model,type,X,Y,Z,Virtualworld);
    PickupText[pick]=Create3DTextLabel(text,0xFFAA00FF,X,Y,floatadd(Z,2),25,Virtualworld,1);
    return pick;
    }
    DestroyPickupWithText(pickupid)
    {
    if(PickupText[pickupid]>0) Delete3DTextLabel(PickupText[pickupid]);
    PickupText[pickupid]=0;
    return DestroyPickup(pickupid);
    }
    CreateObjectWithText(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance, text[])
    {
    new object = CreateObject(modelid,X,Y,Z,rX,rY,rZ,DrawDistance);
    ObjectText[pick]=Create3DTextLabel(text,0xFFAA00FF,X,Y,floatadd(Z,2),DrawDistance,Virtualworld,1);
    return object;
    }
    DestroyObjectWithText(objectid)
    {
    if(ObjectText[objectid]>0) Delete3DTextLabel(ObjectText[objectid]);
    ObjectText[objectid]=0;
    return DestroyObject(objectid);
    }