• 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++ add features from tfs 1.2 to 1.4

_M4G0_

Well-Known Member
Joined
Feb 6, 2016
Messages
504
Solutions
16
Reaction score
98
I added my enchantment system in tfs 1.4, but i had problems, could anyone help?

When i remove the functions everything seems to work normally

movement.cpp
C++:
uint32_t MoveEvents::onPlayerEquip(Player* player, Item* item, slots_t slot, bool isCheck)
{
    player->updateSpecialSkills();
    if (g_events->eventPlayerOnEquipItem(player, item, slot, isCheck)) {
        MoveEvent* moveEvent = getEvent(item, MOVE_EVENT_EQUIP, slot);
        if (!moveEvent) {
            return 1;
        }
        return moveEvent->fireEquip(player, item, slot, isCheck);
    }
    return false;
}

uint32_t MoveEvents::onPlayerDeEquip(Player* player, Item* item, slots_t slot)
{
    player->updateSpecialSkills();
    if (g_events->eventPlayerOnDeEquipItem(player, item, slot, false)) {
        MoveEvent* moveEvent = getEvent(item, MOVE_EVENT_DEEQUIP, slot);
        if (!moveEvent) {
            return 1;
        }
        return moveEvent->fireEquip(player, item, slot, false);
    }
    return false;
}

player.cpp
C++:
void Player::updateSpecialSkills()
{
    for (int32_t i = SPECIALSKILL_FIRST; i <= SPECIALSKILL_LAST; ++i) {
        setVarSpecialSkill(static_cast<SpecialSkills_t>(i), 0);
    }

    for (uint8_t slot = CONST_SLOT_FIRST; slot < CONST_SLOT_LAST; slot++) {
        Thing* thing = getThing(slot);
        if (thing) {
            Item* item = thing->getItem();
            if (item) {
                const ItemType& iType = Item::items[item->getID()];

                for (int32_t i = SPECIALSKILL_FIRST; i <= SPECIALSKILL_LAST; ++i) {
                    if (iType.abilities->specialSkills[i]) {
                        int64_t skillValue = iType.abilities->specialSkills[i];
                        addVarSpecialSkill(static_cast<SpecialSkills_t>(i), skillValue);
                    }

                    const ItemAttributes::CustomAttribute* attr = item->getCustomAttribute(getSpecialSkillCustomAttribute(i));
                    if (attr) {
                        int64_t skillValue = boost::get<int64_t>(attr->value);
                        addVarSpecialSkill(static_cast<SpecialSkills_t>(i), skillValue);
                    }
                }
            }
        }
    }
    sendSkills();
    sendStats();
}
 

Attachments

  • WhatsApp Video 2023-10-12 at 12.52.03.gif
    WhatsApp Video 2023-10-12 at 12.52.03.gif
    22.9 MB · Views: 24 · VirusTotal
This is complete code, someone please help? 😭😭
70883-9228da1abc4f900780993e32ea5b4bf4.gif

events.cpp
C++:
} else if (methodName == "onEquipItem") {
     info.playerOnEquipItem = event;
} else if (methodName == "onDeEquipItem") {
  info.playerOnDeEquipItem = event;

bool Events::eventPlayerOnEquipItem(Player* player, Item* item, slots_t slot, bool isCheck)
{
    // Player:onEquipItem(item, slot, isCheck)
    if (info.playerOnEquipItem == -1) {
        return true;
    }

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

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

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

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

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

    lua_pushnumber(L, (int8_t)slot);
    lua_pushboolean(L, isCheck);

    return scriptInterface.callFunction(4);
}

bool Events::eventPlayerOnDeEquipItem(Player* player, Item* item, slots_t slot, bool isCheck)
{
    // Player:onDeEquipItem(item, slot, isCheck)
    if (info.playerOnDeEquipItem == -1) {
        return true;
    }

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

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

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

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

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

    lua_pushnumber(L, (int8_t)slot);
    lua_pushboolean(L, isCheck);

    return scriptInterface.callFunction(4);
}
events.h

C++:
int32_t playerOnEquipItem = -1;
int32_t playerOnDeEquipItem = -1;

bool eventPlayerOnEquipItem(Player* player, Item* item, slots_t slot, bool isCheck);
bool eventPlayerOnDeEquipItem(Player* player, Item* item, slots_t slot, bool isCheck);

item.cpp
C++:
case ATTR_SPECIAL: {
            std::string special;
            if (!propStream.readString(special)) {
                return ATTR_READ_ERROR;
            }

            setStrAttr(ITEM_ATTRIBUTE_SPECIAL, special);
            break;
        }

if (hasAttribute(ITEM_ATTRIBUTE_SPECIAL)) {
        propWriteStream.write<uint8_t>(ATTR_SPECIAL);
        propWriteStream.writeString(getStrAttr(ITEM_ATTRIBUTE_SPECIAL));
    }

void Item::setCustomAttribute(std::string& key, ItemAttributes::CustomAttribute& value)
{
    int64_t tmpInt = atoi(key.c_str());
    getAttributes()->setCustomAttribute(key, value);
    if (tmpInt > 0) {
        SpecialSkills_t skill = getCustomAttributeSpecialSkill((itemCustomAttrTypes)tmpInt);
        if (skill > 0) {
            Thing* thing = getTopParent() ? (Thing*)getTopParent() : nullptr;
            if (thing)
                if (Creature* creature = thing->getCreature()) {
                    if (Player* player = creature->getPlayer())
                        player->updateSpecialSkills();
                    // printf("player");
                }
        }
    }
}
item.h
C++:
enum AttrTypes_t {
       ATTR_SPECIAL = 38
};

const static uint32_t stringAttributeTypes = ITEM_ATTRIBUTE_SPECIAL;

    void setCustomAttribute(std::string& key, ItemAttributes::CustomAttribute& value);
player.cpp
C++:
void Player::updateSpecialSkills()
{
    for (int32_t i = SPECIALSKILL_FIRST; i <= SPECIALSKILL_LAST; ++i) {
        setVarSpecialSkill(static_cast<SpecialSkills_t>(i), 0);
    }

    for (uint8_t slot = CONST_SLOT_FIRST; slot < CONST_SLOT_LAST; slot++) {
        Thing* thing = getThing(slot);
        if (thing) {
            Item* item = thing->getItem();
            if (item) {
                const ItemType& iType = Item::items[item->getID()];

                for (int32_t i = SPECIALSKILL_FIRST; i <= SPECIALSKILL_LAST; ++i) {
                    if (iType.abilities->specialSkills[i]) {
                        int64_t skillValue = iType.abilities->specialSkills[i];
                        addVarSpecialSkill(static_cast<SpecialSkills_t>(i), skillValue);
                    }

                    const ItemAttributes::CustomAttribute* attr = item->getCustomAttribute(getSpecialSkillCustomAttribute(i));
                    if (attr) {
                        int64_t skillValue = boost::get<int64_t>(attr->value);
                        addVarSpecialSkill(static_cast<SpecialSkills_t>(i), skillValue);
                    }
                }
            }
        }
    }
    sendSkills();
    sendStats();
}

player.h
C++:
  void addVarSpecialSkill(SpecialSkills_t skill, int32_t modifier) {
            varSpecialSkills[skill] += modifier;
        }

      
        void updateSpecialSkills();
 
Back
Top