• 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++ How to avoid people using items as a event? (Tfs 1.5)

Marko999x

999x HIGHExP
Premium User
Joined
Dec 14, 2017
Messages
3,547
Solutions
95
Reaction score
2,698
Location
Germany
Hi,
Im trying to avoid people using a item with a new event function but it seems like I did something wrong

events.cpp
C++:
void Events::eventPlayerOnUseItem(Player* player, Item* item)
{
    // Player:onUseItem(item)
    if (info.playerOnUseItem == -1) {
        return;
    }

    if (!scriptInterface.reserveScriptEnv()) {
        std::cout << "[Error - Events::eventPlayerOnUseItem] Call stack overflow" << std::endl;
        return;
    }

    ScriptEnvironment* env = scriptInterface.getScriptEnv();
    env->setScriptId(info.playerOnUseItem, &scriptInterface);

    lua_State* L = scriptInterface.getLuaState();
    scriptInterface.pushFunction(info.playerOnUseItem);

    LuaScriptInterface::pushUserdata<Player>(L, player);
    LuaScriptInterface::setMetatable(L, -1, "Player");

    LuaScriptInterface::pushUserdata<Item>(L, item);
    LuaScriptInterface::setItemMetatable(L, -1, item);

    scriptInterface.callFunction(2);
}

and

C++:
            } else if (methodName == "onUseItem") {
                info.playerOnUseItem = event;

events.h
C++:
int32_t playerOnUseItem = -1;

and

void eventPlayerOnUseItem(Player* player, Item* item);

and in game.cpp under playerUseItem and playerUseItemEx function
C++:
g_events->eventPlayerOnUseItem(player, item);

like that:
1746790809510.webp

lua:
LUA:
local ec = EventCallback

ec.onUseItem = function(player, item)
    if player:getStorageValue(200) == 1 then
        player:sendCancelMessage('Not Possible.')
        return false
    end
    return true
end

ec:register()
The script detects an onUse action, but I can still use the item
And yes I registed everything on events.xml, player.lua, eventscallback etc.
A experienced c++ prob can see the problem alredy xD
 
Last edited:
Solution
The script detects an onUse action, but I can still use the item
You do not return value returned from Lua in C++ eventPlayerOnUseItem function and do not check if it's true in game.cpp.

In events.h:
C++:
void eventPlayerOnUseItem(Player* player, Item* item);
replace with:
C++:
bool eventPlayerOnUseItem(Player* player, Item* item);

In events.cpp:
C++:
void Events::eventPlayerOnUseItem(Player* player, Item* item)
replace with:
C++:
bool Events::eventPlayerOnUseItem(Player* player, Item* item)
and
C++:
scriptInterface.callFunction(2);
replace with:
C++:
return scriptInterface.callFunction(2);

In game.cpp:
C++:
g_events->eventPlayerOnUseItem(player, item);
replace...
The script detects an onUse action, but I can still use the item
You do not return value returned from Lua in C++ eventPlayerOnUseItem function and do not check if it's true in game.cpp.

In events.h:
C++:
void eventPlayerOnUseItem(Player* player, Item* item);
replace with:
C++:
bool eventPlayerOnUseItem(Player* player, Item* item);

In events.cpp:
C++:
void Events::eventPlayerOnUseItem(Player* player, Item* item)
replace with:
C++:
bool Events::eventPlayerOnUseItem(Player* player, Item* item)
and
C++:
scriptInterface.callFunction(2);
replace with:
C++:
return scriptInterface.callFunction(2);

In game.cpp:
C++:
g_events->eventPlayerOnUseItem(player, item);
replace with:
C++:
if (!g_events->eventPlayerOnUseItem(player, item)) {
    return;
}
then if your Lua callback returns false, it will block item usage.
 
Solution
You do not return value returned from Lua in C++ eventPlayerOnUseItem function and do not check if it's true in game.cpp.

In events.h:
C++:
void eventPlayerOnUseItem(Player* player, Item* item);
replace with:
C++:
bool eventPlayerOnUseItem(Player* player, Item* item);

In events.cpp:
C++:
void Events::eventPlayerOnUseItem(Player* player, Item* item)
replace with:
C++:
bool Events::eventPlayerOnUseItem(Player* player, Item* item)
and
C++:
scriptInterface.callFunction(2);
replace with:
C++:
return scriptInterface.callFunction(2);

In game.cpp:
C++:
g_events->eventPlayerOnUseItem(player, item);
replace with:
C++:
if (!g_events->eventPlayerOnUseItem(player, item)) {
    return;
}
then if your Lua callback returns false, it will block item usage.

Yeah that was the problem!
Appreciate it thanks you mate :D
 
Back
Top