SAMP Plugin coding Problem

  • Hallo,
    vielleicht könnt ihr mir ja helfen.


    ich bekomme andauernd diese Meldungen und hab keine Ahnung wie ich damit umgehen soll :S
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_amx_Register".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * pAMXFunctions" (?pAMXFunctions@@3PAXA)".
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__sampgdk_CreatePlayerTextDraw".


    Wenn ihr Code auszüge oder weitere Informationen braucht einfach melden


    laut google stimmt irgendwas nicht mit den Linker Einstellungen.
    Falls ein Screenshot nötig ist, einfach melden^^

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • ich hab die gdk ja alles eingebunden etc, aber ich habe keine .lib davon

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ich hab mir mal das sampgdk geladen und da gibt es einen Ordner "lib" (Im Installationspfad).
    Zu dem musst du in den VC++ Directories (Library Paths) ebenfalls einen Eintrag setzen und dann unter deinen Includes im Code:


    Code
    #pragma comment(lib, "sampgdk3.lib")


    Lg.


    #Brotfischbaron


    In schā'a llāh

  • Ok, das hat soweit funktioniert.
    Danke dafür.


    Du weißt nicht zzufällig, wie ich das noch weg bekomme?
    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * pAMXFunctions" (?pAMXFunctions@@3PAXA)".
    Das hatte ich mal wegen der SDK drin, welches aber stark veraltert war und die neuen samp natives nicht mehr unterstützt.
    Darum bin ich auf die GDK umgestiegen und bin mir nicht sicher was ich mit dem "Error" anfangen soll.
    Wenn ich das rausnehme fliegt mir der Server um die Ohren.
    Als ich die SDK noch drin hatte gings^^

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • ich hab es oben so stehen

    Code
    extern void *pAMXFunctions;


    wenn ich allerding das extern weg nehme frisst er das,
    ob der Server anbleibt hab ich allerdings noch nicht ausprobiert

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Naja, extern "exportiert" die Variable, sodass Librarys, die dein Plugin dann verwenden (in diesem Fall dann der SA:MP Server), die Variable verwenden können.
    Wenn die aber schon veraltet ist, und im neueren GDK keine Verwendung mehr findet, denke ich, das du sie nicht brauchst.
    Habe mich aber, wie gesagt, noch nie mit dem Coding von Plugins beschäftigt.


    #Brotfischbaron


    In schā'a llāh

  • Soso, Microsoft Visual Studio.. nunja, du hast auch die .h/.c/.cpp Dateien des SDKs mit zum Projekt hinzugefügt?
    Denn das klingt so, als würden die fehlen. Ohne die weiß der Linker allerdings gar nicht, ob das nun bekannt ist.

  • Ich nutze die SDK gar nicht, da die veraltert ist und die Funktionen die ich brauche nicht unterstützt :S
    Du meinst hoff ich mal die GDK, aber da hab ich alles hinzugefügt.


    //Edit ich hab das mit der SDK nun soweit das der Server nicht mehr crashed, so wie es vorher mal der Fall war ^^
    Aber nun ruft er die Natives nicht auf :S
    Hier einmal der Code


    Der Code
    #include "SDK\amx\amx.h"
    #include "SDK\plugincommon.h"

    Der Code
    #include "Invoke.h"

    Der Code
    #include <string>
    #include <vector>

    Der Code
    #include <cstdlib>
    #include <ctime>

    Der Code
    typedef void (*logprintf_t)(char* format, ...);

    Der Code
    logprintf_t logprintf;
    extern void *pAMXFunctions;

    Der Code
    using namespace std;

    Der Code
    //PAWN native: native CreateDialog(playerid);
    cell AMX_NATIVE_CALL CreateDialog(AMX* amx, cell* params)
    {
    logprintf("Call it. Bitch!");
    float x=1.0,y=1.0;
    const string str = "Text Text";
    int ID = g_Invoke->callNative(&PAWN::TextDrawCreate, amx_ftoc(x), amx_ftoc(y), str);
    int ret = g_Invoke->callNative(&PAWN::SendClientMessage, params[1], 0xFFFFFFFF, "Wanna Try?");
    logprintf("ID I got is %d",ID);
    logprintf("SendClientMessage returnt %d",ret);
    g_Invoke->callNative(&PAWN::TextDrawShowForPlayer, params[1], ID);
    return 1;
    }

    Der Code
    //PAWN native: native Invoke_GetAddresses();
    cell AMX_NATIVE_CALL Invoke_GetAddresses(AMX* amx, cell* params)
    {
    return g_Invoke->getAddresses();
    }

    Der Code
    PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
    {
    return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES;
    }

    Der Code
    PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
    {
    g_Invoke = new Invoke;

    Der Code
    pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
    logprintf = (logprintf_t) ppData[PLUGIN_DATA_LOGPRINTF];

    Der Code
    logprintf(" * New Dialogtypes *");
    logprintf(" * by BlackAce *");
    logprintf(" * loaded. *");
    return true;
    }

    Der Code
    PLUGIN_EXPORT void PLUGIN_CALL Unload()
    {
    logprintf(" * New Dialogtypes *");
    logprintf(" * by BlackAce *");
    logprintf(" * unloaded. *");
    }

    Der Code
    AMX_NATIVE_INFO PluginNatives[] =
    {
    {"CreateDialog", CreateDialog},
    {"Invoke_GetAddresses", Invoke_GetAddresses},
    {0, 0}
    };

    Der Code
    PLUGIN_EXPORT int PLUGIN_CALL AmxLoad( AMX *amx )
    {
    g_Invoke->amx_list.push_back(amx);
    return amx_Register(amx, PluginNatives, -1);
    }

    Der Code
    PLUGIN_EXPORT int PLUGIN_CALL AmxUnload( AMX *amx )
    {
    for(list<AMX *>::iterator i = g_Invoke->amx_list.begin(); i != g_Invoke->amx_list.end(); ++i)
    {
    if(*i == amx)
    {
    g_Invoke->amx_list.erase(i);
    break;
    }
    }
    return AMX_ERR_NONE;
    }

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

    Einmal editiert, zuletzt von Akino Kiritani ()

  • Ja ok,
    ich hab das aus dem Tutorial über das Plugin Coding genommen,
    welches im englischem Forum zu finden ist,
    da ist das vorhanden

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ich habe ja jetzt 2 Sources
    einmal die SDK
    einmal die GDK


    Bei der SDK wird das nicht gecalled
    und bei der GDK lässt sich das nicht compilieren^^

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • 1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * pAMXFunctions" (?pAMXFunctions@@3PAXA)".


    Das ist immer noch das gleiche Problem wie gestern^^


    DMA meinte zwar das er mir helfen wollte, hat es aber bisher noch nicht getan :S

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Vielen Dank für die Idee,
    wusste gar nicht das er die GDK nutzt^^


    Jetzt funktioniert es jedenfalls - ohne Probleme und die natives werden auch gecalled :)


    //Edit
    neues Problem
    der Server crasht mir an einer dieser Stellen immer weg.

    Spoiler anzeigen
    float x=amx_ctof(params[2]),y=amx_ctof(params[3])/float(1.8);
    //float x=amx_ctof(params[2]),y=amx_ctof(params[3])/float(1.8);
    //x=(x<133/2)?x:x-133/2;
    char* text = NULL;
    const char* text2 = NULL;
    int len = NULL, pos = NULL, pos2 = NULL, color = NULL;
    amx_StrParam(amx, params[4], text2);
    cell *addr = NULL;
    std::cout<<"0"<<std::endl;
    amx_GetAddr(amx, params[4], &addr);
    amx_StrLen(addr, &len);
    std::cout<<"1"<<std::endl;
    std::string str=text2, str2 = NULL;
    std::cout<<"2"<<std::endl;
    pos = str.find('{'),pos2 = str.find('}',pos);
    std::cout<<"3"<<std::endl;
    if(pos != -1 && pos2 !=-1)
    {
    std::cout<<"4"<<std::endl;
    str2.copy(text,6,pos);
    std::cout<<"5"<<std::endl;
    text2=str2.c_str();
    std::cout<<"6"<<std::endl;
    logprintf(text2);
    sscanf_s(text2, "%x", &color);
    str.erase(pos,pos2+1);
    }
    text2=str.c_str();

    Ich habe versucht über cout und logprintf irgendetwas ausgeben zulassen,
    aber er gibt einfach nichts aus sondern crasht einfach.
    angeblich soll man mit cout auch was in die Datei schreiben können,
    was aber nicht funktioniert und ich bin auch gerade zu faul mir ein Dateisystem zu schreiben.


    Darum hoffe ich das mir hier jemand helfen kann

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

    Einmal editiert, zuletzt von Akino Kiritani ()