• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

C++ attempt to call method 'addWings' (a nil value)

luanmaximus123

New Member
Joined
Oct 28, 2010
Messages
11
Reaction score
1
Hi guys, I'm trying to add the addWing function, but something seems to be wrong. I don't know what it could be. Can someone please help me?

player.cpp
Lua:
bool Player::addWing(uint8_t wingId)
{
    if (!g_game.wings.getWingByID(wingId)) {
        return false;
    }

    const uint8_t tmpWingId = wingId - 1;
    const uint32_t key = PSTRG_WINGS_RANGE_START + (tmpWingId / 31);

    int32_t value;
    if (getStorageValue(key, value)) {
        value |= (1 << (tmpWingId % 31));
    }
    else {
        value = (1 << (tmpWingId % 31));
    }

    addStorageValue(key, value);
    return true;
}


bool Player::addAura(uint8_t auraId)
{
    if (!g_game.auras.getAuraByID(auraId)) {
        return false;
    }

    const uint8_t tmpAuraId = auraId - 1;
    const uint32_t key = PSTRG_AURAS_RANGE_START + (tmpAuraId / 31);

    int32_t value;
    if (getStorageValue(key, value)) {
        value |= (1 << (tmpAuraId % 31));
    }
    else {
        value = (1 << (tmpAuraId % 31));
    }

    addStorageValue(key, value);
    return true;
}

player.h
Code:
bool addAura(uint8_t auraId);
bool addWing(uint8_t wingId);

luascript.cpp
Code:
registerMethod("Player", "addWing", LuaScriptInterface::luaPlayerAddWing);
registerMethod("Player", "addAura", LuaScriptInterface::luaPlayerAddAura);
Code:
int LuaScriptInterface::luaPlayerAddWing(lua_State* L)
{
    // player:addWing(wingId or wingName)
    Player* player = getUserdata<Player>(L, 1);
    if (!player) {
        lua_pushnil(L);
        return 1;
    }

    Wing* wing = nullptr;
    if (isNumber(L, 2)) {
        wing = g_game.wings.getWingByID(getNumber<uint8_t>(L, 2));
    }
    else {
        wing = g_game.wings.getWingByName(getString(L, 2));
    }

    if (!wing) {
        lua_pushnil(L);
        return 1;
    }

    pushBoolean(L, player->addWing(wing->id));
    return 1;
}


int LuaScriptInterface::luaPlayerAddAura(lua_State* L)
{
    // player:addAura(id or name)
    Player* player = getUserdata<Player>(L, 1);
    if (!player) {
        lua_pushnil(L);
        return 1;
    }

    Aura* aura = nullptr;
    if (isNumber(L, 2)) {
        aura = g_game.auras.getAuraByID(getNumber<uint8_t>(L, 2));
    }
    else {
        aura = g_game.auras.getAuraByName(getString(L, 2));
    }

    if (!aura) {
        lua_pushnil(L);
        return 1;
    }

    pushBoolean(L, player->addAura(aura->id));
    return 1;
}

luascript.h
Code:
static int luaPlayerAddWing(lua_State* L);
static int luaPlayerAddAura(lua_State* L);

.lua
Code:
player:addWing(1)

Error:
Code:
Lua Script Error: [Scripts Interface]
C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:callback
C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:16: attempt to call method 'addWings' (a nil value)
stack traceback:
        [C]: in function 'addWings'
        C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:16: in function <C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:6>
 
Hi guys, I'm trying to add the addWing function, but something seems to be wrong. I don't know what it could be. Can someone please help me?

player.cpp
Lua:
bool Player::addWing(uint8_t wingId)
{
    if (!g_game.wings.getWingByID(wingId)) {
        return false;
    }

    const uint8_t tmpWingId = wingId - 1;
    const uint32_t key = PSTRG_WINGS_RANGE_START + (tmpWingId / 31);

    int32_t value;
    if (getStorageValue(key, value)) {
        value |= (1 << (tmpWingId % 31));
    }
    else {
        value = (1 << (tmpWingId % 31));
    }

    addStorageValue(key, value);
    return true;
}


bool Player::addAura(uint8_t auraId)
{
    if (!g_game.auras.getAuraByID(auraId)) {
        return false;
    }

    const uint8_t tmpAuraId = auraId - 1;
    const uint32_t key = PSTRG_AURAS_RANGE_START + (tmpAuraId / 31);

    int32_t value;
    if (getStorageValue(key, value)) {
        value |= (1 << (tmpAuraId % 31));
    }
    else {
        value = (1 << (tmpAuraId % 31));
    }

    addStorageValue(key, value);
    return true;
}

player.h
Code:
bool addAura(uint8_t auraId);
bool addWing(uint8_t wingId);

luascript.cpp
Code:
registerMethod("Player", "addWing", LuaScriptInterface::luaPlayerAddWing);
registerMethod("Player", "addAura", LuaScriptInterface::luaPlayerAddAura);
Code:
int LuaScriptInterface::luaPlayerAddWing(lua_State* L)
{
    // player:addWing(wingId or wingName)
    Player* player = getUserdata<Player>(L, 1);
    if (!player) {
        lua_pushnil(L);
        return 1;
    }

    Wing* wing = nullptr;
    if (isNumber(L, 2)) {
        wing = g_game.wings.getWingByID(getNumber<uint8_t>(L, 2));
    }
    else {
        wing = g_game.wings.getWingByName(getString(L, 2));
    }

    if (!wing) {
        lua_pushnil(L);
        return 1;
    }

    pushBoolean(L, player->addWing(wing->id));
    return 1;
}


int LuaScriptInterface::luaPlayerAddAura(lua_State* L)
{
    // player:addAura(id or name)
    Player* player = getUserdata<Player>(L, 1);
    if (!player) {
        lua_pushnil(L);
        return 1;
    }

    Aura* aura = nullptr;
    if (isNumber(L, 2)) {
        aura = g_game.auras.getAuraByID(getNumber<uint8_t>(L, 2));
    }
    else {
        aura = g_game.auras.getAuraByName(getString(L, 2));
    }

    if (!aura) {
        lua_pushnil(L);
        return 1;
    }

    pushBoolean(L, player->addAura(aura->id));
    return 1;
}

luascript.h
Code:
static int luaPlayerAddWing(lua_State* L);
static int luaPlayerAddAura(lua_State* L);

.lua
Code:
player:addWing(1)

Error:
Code:
Lua Script Error: [Scripts Interface]
C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:callback
C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:16: attempt to call method 'addWings' (a nil value)
stack traceback:
        [C]: in function 'addWings'
        C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:16: in function <C:\forgottenserver-1.4\data\scripts\actions\tools\wings.lua:6>

In here
registerMethod("Player", "addWing", LuaScriptInterface::luaPlayerAddWing);

Thats how you will use that so: player:addWing(1)
 
Back
Top