Beiträge von Kaliber

    wie das gehen soll bzw. was genau die besagte Funktion eig. tut.


    Nun, wenn man z.B. DisableInteriorEnterExits(); verwendet, werden alle Interiors die aus dem Singleplayer drinnen sind, deaktiviert.


    Sprich auch alle Bots, auch wenn du den Spieler in den selben Interior setzt z.B. Ammunation / Burger Shot o.ä. ist dort kein Bot oder sonst was, der dir was verkauft.


    SetPlayerShopName


    Diese Funktion sorgt dafür, dass genau in einem bestimmten Laden z.B. nur Ammunation dann da ein Bot steht, der dir Waffen verkauft ;)


    mfg. :thumbup:

    Kaliber das kann nicht sein, da für alle 14 Bots der selbe connect+spawnvorgang ist.


    Na, aber irgendwas muss es ja sein, sonst würde es ja funktionieren :P


    Nutzt du NPC-Plugins...vielleicht nicht alle auf Linux geswitcht? :huh:

    liegt das daran?


    Nein, allerdings ist es auch nicht gut, seinen heapspace (denn das macht man mit #pragma dynamic) um 100kB zu vergrößern :pinch:


    Deine Bots connecten, spawnen und disconnecten. Dann print-Debugge doch einfach wo das Problem ist...lässt du sie evtl in irgendeiner Funktion kicken? Evtl Anti-Cheats? Oder halt irgendwo kick(playerid) ...o.ä.?


    mfg. :rolleyes:

    Nun, da dort kein Fehler ist, muss er woanders liegen :D


    invalid function or declaration kommt immer dann, wenn man Blank Code ohne deklaration oder Funktion einfach so in das Script schreibt.


    //Beispiel1:
    #include <a_samp>


    main() {


    }


    hi
    //Output-> error 010: invalid function or declaration


    Nun, das bedeutet du hast irgendwo in deinem Script Blank Code stehen...


    Du brauchst eigentlich #include <float> und #include <core>...etc nicht schreiben, da das alles schon in der a_samp.inc includiert wird ;)


    Lösche mal das #include <core> raus..vielleicht ist der Fehler dann weg, wenn nicht, dann musst du auf Suche nach Blank-Code gehen :P


    mfg. :thumbup:

    Es ist kein Fehler in der Include Datei ^^


    Das wird nur nicht ganz richtig angezeigt...der eigentliche Fehler liegt in deinem Gamemode ;)


    Poste mal bitte alle Zeilen, bis zu der Zeile wo #include <core> steht ;)


    mfg. :thumbup:

    und stocks brauchen keine Forwards.


    Als erstes solltest du wissen, dass stock nur ein Wort ist, wie verlinkt, dass dafür sorgt, dass der Compiler die Funktion oder Variable ignoriert, falls sie nicht genutzt wird.


    Es handelt sich immer noch um eine Funktion. Und wenn eine Funktion einen TAG zurückgibt, sei es Float oder sonst einer, dann macht das forwarden auch einen Sinn.


    Schauen wir uns dazu ein Beispiel an:


    main() {
    printf("%f",getFloat(2));
    }


    stock Float:getFloat(x) {
    return float(x);
    }


    Wenn wir das genau so machen in dieser Reihenfolge, gibt es ein Problem und zwar bekommen wir diesen Warning:


    Code
    warning 208: function with tag result used before definition, forcing reparse


    Das sagt uns, dass wir bevor wir die Funktion nutzen, entweder die Funktion forwarden müssen oder bevor wir die Funktion nutzen die Funktion erstellen.


    Aus diesem Grund macht das forwarden zwar nicht direkt darüber einen Sinn, aber wenn man es so macht:


    forward Float:getFloat(x);


    main() {
    printf("%f",getFloat(2));
    }


    stock Float:getFloat(x) {
    return float(x);
    }


    ist der Warning weg und es hat durchaus seine Richtigkeit ;)


    mfg. :thumbup:

    Wie kann ich auslesen von welchen spielern ein User zu letzt getötet wurde und welche User ein Spieler zuletzt getötet hat?
    Hat jemand gerade einen Code/FS da hab schon gesucht doch leider nicht gefunden


    Nun, das kannst du über eine globale Variable einfach lösen:


    //Oben in dein Script
    #define MAX_KILL_STATS 5
    #define getKillID(%0) d_idx{%0}


    static DeathInfo[MAX_KILL_STATS][MAX_PLAYERS] = {{-1,...},{-1,...},{-1,...},{-1,...},{-1,...}},d_idx[MAX_PLAYERS char];


    //Unter dem Callback
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID) {
    DeathInfo[getKillID(playerid)][playerid] = killerid;
    d_idx{playerid}++;
    if(getKillID(playerid) == MAX_KILL_STATS) d_idx{playerid} = 0;
    }
    return 1;
    }


    stock GetLastKillerName(playerid) //Gibt den Namen von dem Spieler zurück, der ihn zuletzt getötet hat
    {
    new name[MAX_PLAYER_NAME] = "Nieamnd";
    if(DeathInfo[getKillID(playerid)-1][playerid] == -1) return name;
    return GetPlayerName(DeathInfo[getKillID(playerid)-1][playerid],name,MAX_PLAYER_NAME),name;
    }


    stock ListLastKills(playerid) //Listet die Usernamen, von den Spielern die er zuletzt getötet hat (wenn sie noch on sind)
    {
    new name[MAX_PLAYER_NAME],string[25 + MAX_PLAYER_NAME];
    for(new i; i<MAX_PLAYERS; i++) {
    if(!IsPlayerConnected(i)) continue;
    for(new x; x<MAX_KILL_STATS; x++) {
    if(DeathInfo[x][i] == playerid) {
    GetPlayerName(i,name,MAX_PLAYER_NAME);
    format(string,sizeof string,"Du hast %s getötet gehabt!",name);
    SendClientMessage(playerid,-1,string);
    }
    }
    }
    return 1;
    }


    Ist aus dem Kopf geschrieben..weiß nicht ob es funktioniert, kannst es ja mal probieren ;)


    mfg. :rolleyes:

    Hier, so machst du es ordentlich:



    mfg. :thumbup:

    Ich habe auch nur seinen Code genommen und "angepasst".
    Wenn er sich mit PAWN auseinandersetzen möchte, sollte er seinen eigenen Fehler schon selbst bemerken und somit auch, dass "!" eine Negierung ist und abgefragt wird, ob er NICHT in dieser Range ist.


    Schau dir mal seinen Code genauer an ;)


    Er hat die ! für IsPlayerInRangeOfPoint verwendet um herauszufinden, ob er nicht in dieser Range ist und dann ein return benutzt um den Code zu beenden.
    Wenn es jetzt nur 1ne Abfrage gewesen wäre, dann hätte das auch wunderbar funktioniert...
    Doch bei mehreren ist das natürlich so falsch :rolleyes:


    mfg. :thumbup:

    Dein Code funktioniert so eigentlich gar nicht...da du nach dem ersten return den Code unterbrichst...


    Zudem sind deine permanenten if-Abfragen für den key völlig unnötig...schreibs doch einfach so:


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_SECONDARY_ATTACK ) {
    if(IsPlayerInRangeOfPoint(playerid,1.0,2265.5400,1675.8618,1090.4453)) {
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,9);
    SetPlayerPos(playerid,2268.7078,1675.7773,94.9219);
    } else if(IsPlayerInRangeOfPoint(playerid,1.0,2266.0137,1619.4340,1090.4453)) {
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,9);
    SetPlayerPos(playerid,2269.3811,1619.5103,94.9219);
    } else if(IsPlayerInRangeOfPoint(playerid,1.0,2268.7078,1675.7773,94.9219)) {
    SetPlayerInterior(playerid,1);
    SetPlayerVirtualWorld(playerid,9);
    SetPlayerPos(playerid,2265.5400,1675.8618,1090.4453);
    } else if(IsPlayerInRangeOfPoint(playerid,1.0,2269.3811,1619.5103,94.9219)) {
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,9);
    SetPlayerPos(playerid,2266.0137,1619.4340,1090.4453);
    }
    }
    return 1;
    }


    //Edit: Scott_Mitchell:
    Dein Code ist falsch...die ! stimmen nicht ;)


    mfg. :rolleyes: