Ir para conteúdo
  • Cadastre-se

Posts Recomendados

.Qual servidor ou website você utiliza como base? 

OT MANAGER

Qual o motivo deste tópico? 

ERRO DE LOGS

Está surgindo algum erro? Se sim coloque-o aqui. 

SIM

Citar

ERRO DE ACTIONS.CCP, GALERA AO ABRIR O OT EU PERCEBI QUE TODA VEZ QUE LOGA UM  PLAYER OU ELE EXECUTA ALGUMA TAREFA, COMO ABRIR DEPOSIT, MATAR OU ATACAR UM BIXO APARECE ESSES LOGS DE (ACTIONS.CCP)
E ISSO PODE ESTA CAUSANDO DDOS NO MEU SERVIDOR MTOS LOGS CONSTANTE. ALGUEM ME AJUDA A TIRAR

TEM UM ARQUIVO COM O NOME ACTIONS.CCP COM OS SCRPIT ABAIXO

 

Você tem o código disponível? Se tiver publique-o aqui: 

/**
 * The Forgotten Server - a free and open-source MMORPG server emulator
 * Copyright (C) 2019  Mark Samman <[email protected]>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
#include "otpch.h"

#include <string>
#include <utility>

#include "actions.h"
#include "bed.h"
#include "configmanager.h"
#include "container.h"
#include "game.h"
#include "pugicast.h"
#include "rewardchest.h"
#include "spells.h"


extern Game g_game;
extern Spells* g_spells;
extern Actions* g_actions;
extern ConfigManager g_config;

Actions::Actions() : scriptInterface("Action Interface") {
    scriptInterface.initState();
}

Action::Action(LuaScriptInterface* interface) :
    Event(interface), function(nullptr), allowFarUse(false), checkFloor(true),
    checkLineOfSight(true) {}

Actions::~Actions() {
    clear(false);
}

void Actions::clearMap(ActionUseMap* map, bool fromLua) {
    if(map == nullptr) {
        DLOG_F(WARNING, "Map pointer is nullptr!");
        return;
    }

    for (auto it = map->begin(); it != map->end(); ) {
        if (fromLua == it->second.fromLua) {
            it = map->erase(it);
        } else {
            ++it;
        }
    }
}

void Actions::clear(bool fromLua) {
    DLOG_F(INFO, "Clear");

    DLOG_F(INFO, "Clear Use Item");
    clearMap(&useItemMap, fromLua);
    DLOG_F(INFO, "Clear Unique Item");
    clearMap(&uniqueItemMap, fromLua);
    DLOG_F(INFO, "Clear Action Item");
    clearMap(&actionItemMap, fromLua);

    DLOG_F(INFO, "Restart Lua State?[%s]", fromLua == true ? "yes" : "no");
    reInitState(fromLua);
}

LuaScriptInterface& Actions::getScriptInterface() {
    DLOG_F(INFO, "Get Script Interface");
    return scriptInterface;
}

std::string Actions::getScriptBaseName() const {
    DLOG_F(INFO, "Get Script Base Name");
    return "actions";
}

Event_ptr Actions::getEvent(const std::string& nodeName) {
    DLOG_F(INFO, "Get Event[%s]", nodeName.c_str());

    if (strcasecmp(nodeName.c_str(), "action") != 0) {
        DLOG_F(WARNING, "Nullptr");
        return nullptr;
    }
    return Event_ptr(new Action(&scriptInterface));
}

bool Actions::registerEvent(Event_ptr event, const pugi::xml_node& node) {
    // event is guaranteed to be an Action
    Action_ptr action{static_cast<Action*>(event.release())};

    pugi::xml_attribute attr;
    if ((attr = node.attribute("itemid"))) {
        uint16_t id = pugi::cast<uint16_t>(attr.value());

        auto result = useItemMap.emplace(id, std::move(*action));
        if (!result.second) {
            LOG_F(WARNING, "Duplicate registered item with id:[%d] ", id);
        }
        return result.second;
    } else if ((attr = node.attribute("fromid"))) {
        pugi::xml_attribute toIdAttribute = node.attribute("toid");
        if (!toIdAttribute) {
            LOG_F(WARNING, "Missing toid in fromid:[%s] ", attr.as_string());
            return false;
        }

        uint16_t fromId = pugi::cast<uint16_t>(attr.value());
        uint16_t iterId = fromId;
        uint16_t toId = pugi::cast<uint16_t>(toIdAttribute.value());

        auto result = useItemMap.emplace(iterId, *action);
        if (!result.second) {
            LOG_F(WARNING, "Duplicate registered item with id:[%d] in "
                            "fromid:[%d], toid[%d]!", iterId, fromId, toId);
        }

        bool success = result.second;
        while (++iterId <= toId) {
            result = useItemMap.emplace(iterId, *action);
            if (!result.second) {
                LOG_F(WARNING, "Duplicate registered item with id:[%d] in "
                                "fromid:[%d], toid[%d]!", iterId, fromId, toId);
                continue;
            }
            success = true;
        }
        return success;
    } else if ((attr = node.attribute("uniqueid"))) {
        uint16_t uid = pugi::cast<uint16_t>(attr.value());

        auto result = uniqueItemMap.emplace(uid, std::move(*action));
        if (!result.second) {
            LOG_F(WARNING, "Duplicate registered item with uid:[%d] ", uid);
        }
        return result.second;
    } else if ((attr = node.attribute("fromuid"))) {
        pugi::xml_attribute toUidAttribute = node.attribute("touid");
        if (!toUidAttribute) {
            LOG_F(WARNING, "Missing touid in fromuid:[%s] ", attr.as_string());
            return false;
        }

        uint16_t fromUid = pugi::cast<uint16_t>(attr.value());
        uint16_t iterUid = fromUid;
        uint16_t toUid = pugi::cast<uint16_t>(toUidAttribute.value());

        auto result = uniqueItemMap.emplace(iterUid, *action);
        if (!result.second) {
            LOG_F(WARNING, "Duplicate registered item with uid:[%d] in "
                        "fromuid:[%d], touid[%d]!", iterUid, fromUid, toUid);
        }

        bool success = result.second;
        while (++iterUid <= toUid) {
            result = uniqueItemMap.emplace(iterUid, *action);
            if (!result.second) {
                LOG_F(WARNING, "Duplicate registered item with uid:[%d] in "
                        "fromuid:[%d], touid[%d]!", iterUid, fromUid, toUid);
                continue;
            }
            success = true;
        }
        return success;
    } else if ((attr = node.attribute("actionid"))) {
        uint16_t aid = pugi::cast<uint16_t>(attr.value());

        auto result = actionItemMap.emplace(aid, std::move(*action));
        if (!result.second) {
            LOG_F(WARNING, "Duplicate registered item with aid:[%d] ", aid);
        }
        return result.second;
    } else if ((attr = node.attribute("fromaid"))) {
        pugi::xml_attribute toAidAttribute = node.attribute("toaid");
        if (!toAidAttribute) {
            LOG_F(WARNING, "Missing toaid in fromaid:[%s] ", attr.as_string());
            return false;
        }

        uint16_t fromAid = pugi::cast<uint16_t>(attr.value());
        uint16_t iterAid = fromAid;
        uint16_t toAid = pugi::cast<uint16_t>(toAidAttribute.value());

        auto result = actionItemMap.emplace(iterAid, *action);
        if (!result.second) {
            LOG_F(WARNING, "Duplicate registered item with aid:[%d] in "
                        "fromaid:[%d], toaid[%d]!", iterAid, fromAid, toAid);
        }

        bool success = result.second;
        while (++iterAid <= toAid) {
            result = actionItemMap.emplace(iterAid, *action);
            if (!result.second) {
                LOG_F(WARNING, "Duplicate registered item with aid:[%d] in "
                        "fromaid:[%d], toaid[%d]!", iterAid, fromAid, toAid);
                continue;
            }
            success = true;
        }
        return success;
    }
    return false;
}

bool Actions::registerLuaEvent(Action* event) {
    DLOG_F(INFO, "Register Lua Event");

    Action_ptr action{ event };
    if (action->getItemIdRange().size() > 0) {
        if (action->getItemIdRange().size() == 1) {
            auto result = useItemMap.emplace(action->getItemIdRange().at(0),
                                            std::move(*action));
            if (!result.second) {
                LOG_F(WARNING, "Duplicate registered item with id:[%d] ",
                        action->getItemIdRange().at(0));
            }
            return result.second;
        } else {
            auto v = action->getItemIdRange();
            for (auto i = v.begin(); i != v.end(); i++) {
                auto result = useItemMap.emplace(*i, std::move(*action));
                if (!result.second) {
                    LOG_F(WARNING, "Duplicate registered item with id:[%d] in "
                                "range from id:[%d], to id[%d]!", *i, v.at(0),
                                v.at(v.size() - 1));
                    continue;
                }
            }
            return true;
        }
    } else if (action->getUniqueIdRange().size() > 0) {
        if (action->getUniqueIdRange().size() == 1) {
            auto result = uniqueItemMap.emplace(
                        action->getUniqueIdRange().at(0), std::move(*action));
            if (!result.second) {
                LOG_F(WARNING, "Duplicate registered item with uid:[%d] ",
                        action->getUniqueIdRange().at(0));
            }
            return result.second;
        } else {
            auto v = action->getUniqueIdRange();
            for (auto i = v.begin(); i != v.end(); i++) {
                auto result = uniqueItemMap.emplace(*i, std::move(*action));
                if (!result.second) {
                    LOG_F(WARNING, "Duplicate registered item with uid:[%d] in "
                            "range from uid:[%d], to uid[%d]!", *i, v.at(0),
                            v.at(v.size() - 1));
                    continue;
                }
            }
            return true;
        }
    } else if (action->getActionIdRange().size() > 0) {
        if (action->getActionIdRange().size() == 1) {
            auto result = actionItemMap.emplace(
                        action->getActionIdRange().at(0), std::move(*action));
            if (!result.second) {
                LOG_F(WARNING, "Duplicate registered item with aid:[%d] ",
                        action->getActionIdRange().at(0));
            }
            return result.second;
        } else {
            auto v = action->getActionIdRange();
            for (auto i = v.begin(); i != v.end(); i++) {
                auto result = actionItemMap.emplace(*i, std::move(*action));
                if (!result.second) {
                    LOG_F(WARNING, "Duplicate registered item with aid:[%d] in "
                            "range from aid:[%d], to aid[%d]!", *i, v.at(0),
                            v.at(v.size() - 1));
                    continue;
                }
            }
            return true;
        }
    } else {
        LOG_F(ERROR, "There is no id / aid / uid set for this event");
        return false;
    }
}

ReturnValue Actions::canUse(const Player* player, const Position& pos) {
    DLOG_F(INFO, "Player[%d] canUse from position:x[%d], y[%d], z[%d]?",
                    player == nullptr ? 0 : player->getID(),
                    pos.getX(), pos.getY(), pos.getZ());
    if (pos.x != 0xFFFF) {
        const Position& playerPos = player->getPosition();
        if (playerPos.z != pos.z) {
            DLOG_F(WARNING, "Player[%d] first needs to go [%s]",
                player == nullptr ? 0 : player->getID(), playerPos.z > pos.z ?
                "Upstairs" : "Downstairs");
            return playerPos.z > pos.z ?
                    RETURNVALUE_FIRSTGOUPSTAIRS : RETURNVALUE_FIRSTGODOWNSTAIRS;
        }

        if (!Position::areInRange<1, 1>(playerPos, pos)) {
            DLOG_F(WARNING, "Player[%d] is too far to use!",
                            player == nullptr ? 0 : player->getID());
            return RETURNVALUE_TOOFARAWAY;
        }
    }
    DLOG_F(INFO, "Player[%d] canUse from his position!",
    player == nullptr ? 0 : player->getID());
    return RETURNVALUE_NOERROR;
}

ReturnValue Actions::canUse(const Player* player, const Position& pos,
                            const Item* item) {
    DLOG_F(INFO, "Player[%d] canUse cid[%d] from position:x[%d], y[%d], z[%d]?",
            player == nullptr ? 0 : player->getID(), item == nullptr ?
            0 : item->getClientID(), pos.getX(), pos.getY(), pos.getZ());
    Action* action = getAction(item);
    if (action != nullptr) {
        return action->canExecuteAction(player, pos);
    }
    DLOG_F(INFO, "Player[%d] canUse item from his position!",
                    player == nullptr ? 0 : player->getID());
    return RETURNVALUE_NOERROR;
}

ReturnValue Actions::canUseFar(const Creature* creature, const Position& toPos,
                                bool checkLineOfSight, bool checkFloor) {
    DLOG_F(INFO, "Creature[%d] canUseFar to position:x[%d], y[%d], z[%d],"
            "checkLineOfSight[%d], checkFloor[%d]", creature == nullptr ?
            0 : creature->getID(), toPos.getX(), toPos.getY(), toPos.getZ(),
            checkLineOfSight, checkFloor);

    if (toPos.x == 0xFFFF) {
        DLOG_F(INFO, "Creature[%d] can use from far!", creature == nullptr ?
                                                        0 : creature->getID());
        return RETURNVALUE_NOERROR;
    }

    const Position& creaturePos = creature->getPosition();
    if (checkFloor && creaturePos.z != toPos.z) {
        DLOG_F(WARNING, "Creature[%d] first needs to go [%s]",
        creature == nullptr ? 0 : creature->getID(), creaturePos.z > toPos.z ?
                                                    "Upstairs" : "Downstairs");
        return creaturePos.z > toPos.z ?
                    RETURNVALUE_FIRSTGOUPSTAIRS : RETURNVALUE_FIRSTGODOWNSTAIRS;
    }

    if (!Position::areInRange<7, 5>(toPos, creaturePos)) {
        DLOG_F(WARNING, "Creature[%d] is too far to use!",
                        creature == nullptr ? 0 : creature->getID());
        return RETURNVALUE_TOOFARAWAY;
    }

    if (checkLineOfSight && !g_game.canThrowObjectTo(creaturePos, toPos)) {
        DLOG_F(WARNING, "Creature[%d] can throw!", creature == nullptr ?
                                                    0 : creature->getID());
        return RETURNVALUE_CANNOTTHROW;
    }

    DLOG_F(INFO, "Creature can use far!");
    return RETURNVALUE_NOERROR;
}

Action* Actions::getAction(const Item* item) {
    DLOG_F(INFO, "Get Item cid:[%d] Action", item == nullptr ?
            0 : item->getClientID());

    if (item->hasAttribute(ITEM_ATTRIBUTE_UNIQUEID)) {
        DLOG_F(INFO, "Item has Attribute UniqueID");
        auto it = uniqueItemMap.find(item->getUniqueId());
        if (it != uniqueItemMap.end()) {
            return &it->second;
        }
    }

    if (item->hasAttribute(ITEM_ATTRIBUTE_ACTIONID)) {
        DLOG_F(INFO, "Item has Attribute ActionID");
        auto it = actionItemMap.find(item->getActionId());
        if (it != actionItemMap.end()) {
            return &it->second;
        }
    }

    DLOG_F(INFO, "Regular Item");
    auto it = useItemMap.find(item->getID());
    if (it != useItemMap.end()) {
        return &it->second;
    }

    // rune items
    DLOG_F(INFO, "Item is a rune");
    return g_spells->getRuneSpell(item->getID());
}

ReturnValue Actions::internalUseItem(Player* player, const Position& pos,
                                    uint8_t index, Item* item, bool isHotkey) {
    DLOG_F(INFO, "Internal Use Item Player[%d], Position:x[%d], y[%d], z[%d], "
        "Index:[%d], Item cid:[%d], isHotkey:[%d]", player == nullptr ?
        0 : player->getID(), pos.getX(), pos.getY(), pos.getZ(), index,
        item == nullptr ? 0 : item->getClientID(), isHotkey);

    if (Door* door = item->getDoor()) {
        DLOG_F(INFO, "Door");
        if (!door->canUse(player)) {
            DLOG_F(WARNING, "Cannot use on this door!");
            return RETURNVALUE_CANNOTUSETHISOBJECT;
        }
    }

    Action* action = getAction(item);
    if (action != nullptr) {
        DLOG_F(INFO, "Action");
        if (action->isScripted()) {
            if (action->executeUse(player, item, pos, nullptr, pos, isHotkey)) {
                DLOG_F(INFO, "Player internalUseItem Success!");
                return RETURNVALUE_NOERROR;
            }

            if (item->isRemoved()) {
                DLOG_F(WARNING, "Cannot use on this object(action)!");
                return RETURNVALUE_CANNOTUSETHISOBJECT;
            }
        } else if (action->function) {
            if (action->function(player, item, pos, nullptr, pos, isHotkey)) {
                DLOG_F(INFO, "Player internalUseItem Success!");
                return RETURNVALUE_NOERROR;
            }
        }
    }

    if (BedItem* bed = item->getBed()) {
        if (!bed->canUse(player)) {
            DLOG_F(WARNING, "Cannot use on this object(Bed)!");
            return RETURNVALUE_CANNOTUSETHISOBJECT;
        }

        if (bed->trySleep(player)) {
            player->setBedItem(bed);
            g_game.sendOfflineTrainingDialog(player);
        }

        DLOG_F(INFO, "Player internalUseItem Success!");
        return RETURNVALUE_NOERROR;
    }

    if (Container* container = item->getContainer()) {
        DLOG_F(INFO, "Container");

        Container* openContainer;

        // depot container
        if (DepotLocker* depot = container->getDepotLocker()) {
            DLOG_F(INFO, "Depot Locker");
            DepotLocker* myDepotLocker = player->getDepotLocker(depot->getDepotId());
            myDepotLocker->setParent(depot->getParent()->getTile());
            openContainer = myDepotLocker;
            player->setLastDepotId(depot->getDepotId());
        } else {
            openContainer = container;
        }

        // reward chest
        if (container->getRewardChest() != nullptr) {
            DLOG_F(INFO, "Reward Chest");
            RewardChest* myRewardChest = player->getRewardChest();
            if (myRewardChest->size() == 0) {
                DLOG_F(WARNING, "Reward Chest is Empty");
                return RETURNVALUE_REWARDCHESTISEMPTY;
            }

            myRewardChest->setParent(container->getParent()->getTile());
            for (auto& it : player->rewardMap) {
                it.second->setParent(myRewardChest);
            }

            openContainer = myRewardChest;
        }

        // reward container proxy created when the boss dies
        if (container->getID() == ITEM_REWARD_CONTAINER
            && !container->getReward()) {
            DLOG_F(INFO, "Reward Container Proxy(Boss)");
            if (Reward* reward = player->getReward(
                        container->getIntAttr(ITEM_ATTRIBUTE_DATE), false)) {
                reward->setParent(container->getRealParent());
                openContainer = reward;
            } else {
                DLOG_F(WARNING, "This is impossible!");
                return RETURNVALUE_THISISIMPOSSIBLE;
            }
        }

        uint32_t corpseOwner = container->getCorpseOwner();
        if (container->isRewardCorpse()) {
            DLOG_F(INFO, "Corpse");

            // only players who participated in the fight can open the corpse
            if (player->getGroup()->id >= 4 || player->getAccountType() >= 3) {
                DLOG_F(WARNING, "You can't open corpse(ADM)");
                return RETURNVALUE_YOUCANTOPENCORPSEADM;
            }
            if (!player->getReward(container->getIntAttr(ITEM_ATTRIBUTE_DATE), false)) {
                DLOG_F(WARNING, "You aren't the owner!");
                return RETURNVALUE_YOUARENOTTHEOWNER;
            }
        } else if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) {
            DLOG_F(WARNING, "You aren't the owner!");
            return RETURNVALUE_YOUARENOTTHEOWNER;
        }

        // open/close container
        int32_t oldContainerId = player->getContainerID(openContainer);
        if (oldContainerId != -1) {
            DLOG_F(INFO, "Close Container");
            player->onCloseContainer(openContainer);
            player->closeContainer(oldContainerId);
        } else {
            DLOG_F(INFO, "Add Container");
            player->addContainer(index, openContainer);
            player->onSendContainer(openContainer);
        }
        DLOG_F(INFO, "Player internalUseItem Success!");
        return RETURNVALUE_NOERROR;
    }

    const ItemType& it = Item::items[item->getID()];
    if (it.canReadText) {
        if (it.canWriteText) {
            DLOG_F(INFO, "Can Read/Write Text");
            player->setWriteItem(item, it.maxTextLen);
            player->sendTextWindow(item, it.maxTextLen, true);
        } else {
            DLOG_F(INFO, "Can Read Text");
            player->setWriteItem(nullptr);
            player->sendTextWindow(item, 0, false);
        }
        DLOG_F(INFO, "Player internalUseItem Success!");
        return RETURNVALUE_NOERROR;
    }

    DLOG_F(WARNING, "Player can't use this object!");
    return RETURNVALUE_CANNOTUSETHISOBJECT;
}

bool Actions::useItem(Player* player, const Position& pos, uint8_t index,
                        Item* item, bool isHotkey) {
    DLOG_F(INFO, "Use Item Player[%d], Position:x[%d], y[%d], z[%d], "
        "Index:[%d], Item cid:[%d], isHotkey:[%d]", player == nullptr ?
        0 : player->getID(), pos.getX(), pos.getY(), pos.getZ(), index,
        item == nullptr ? 0 : item->getClientID(), isHotkey);

    player->setNextAction(OTSYS_TIME() + g_config.getNumber(
                                        ConfigManager::ACTIONS_DELAY_INTERVAL));

    if (isHotkey) {
        showUseHotkeyMessage(player, item, player->getItemTypeCount(
                                                            item->getID(), -1));
    }

    ReturnValue ret = internalUseItem(player, pos, index, item, isHotkey);
    if (ret != RETURNVALUE_NOERROR) {
        player->sendCancelMessage(ret);
        DLOG_F(WARNING, "Player can't use item!");
        return false;
    }
    DLOG_F(INFO, "Success using item!");
    return true;
}

bool Actions::useItemEx(Player* player, const Position& fromPos,
                        const Position& toPos, uint8_t toStackPos,
                        Item* item, bool isHotkey,
                        Creature* creature/* = nullptr*/) {
    DLOG_F(INFO, "Use Item Ex Player[%d], From Position:x[%d], y[%d], z[%d], "
        "To Position:x[%d], y[%d], z[%d], toStackPos[%d], Item cid:[%d], "
        "isHotkey:[%d]", player == nullptr ? 0 : player->getID(),
        fromPos.getX(), fromPos.getY(), fromPos.getZ(), toPos.getX(),
        toPos.getY(), toPos.getZ(), toStackPos, item == nullptr ?
        0 : item->getClientID(), isHotkey);

    player->setNextAction(OTSYS_TIME() + g_config.getNumber(
                                    ConfigManager::EX_ACTIONS_DELAY_INTERVAL));

    Action* action = getAction(item);
    if (action == nullptr) {
        player->sendCancelMessage(RETURNVALUE_CANNOTUSETHISOBJECT);
        DLOG_F(WARNING, "Player can't use object(no action)!");
        return false;
    }

    ReturnValue ret = action->canExecuteAction(player, toPos);
    if (ret != RETURNVALUE_NOERROR) {
        player->sendCancelMessage(ret);
        DLOG_F(WARNING, "Player can't use object(with action)!");
        return false;
    }

    if (isHotkey) {
        showUseHotkeyMessage(player, item,
                            player->getItemTypeCount(item->getID(), -1));
    }

    if (action->function) {
        DLOG_F(INFO, "Action is a function");
        if (action->function(player, item, fromPos, action->getTarget(player,
                            creature, toPos, toStackPos), toPos, isHotkey)) {
            DLOG_F(INFO, "Success executing function!");
            return true;
        }
        DLOG_F(WARNING, "Failed to execute function!");
        return false;
    }

    if (!action->executeUse(player, item, fromPos, action->getTarget(player,
                            creature, toPos, toStackPos), toPos, isHotkey)) {
        if (!action->hasOwnErrorHandler()) {
            player->sendCancelMessage(RETURNVALUE_CANNOTUSETHISOBJECT);
        }
        DLOG_F(WARNING, "Player can't use object!");
        return false;
    }

    DLOG_F(INFO, "Success using item(ex)!");
    return true;
}

void Actions::showUseHotkeyMessage(Player* player, const Item* item,
                                    uint32_t count) {
    DLOG_F(INFO, "Show Use Hotkey Message.");
    std::ostringstream ss;

    const ItemType& it = Item::items[item->getID()];
    if (!it.showCount) {
        ss << "Using one of " << item->getName() << "...";
    } else if (count == 1) {
        ss << "Using the last " << item->getName() << "...";
    } else {
        ss << "Using one of " << count << ' ' << item->getPluralName() << "...";
    }
    player->sendTextMessage(MESSAGE_INFO_DESCR, ss.str());
}

bool Action::configureEvent(const pugi::xml_node& node) {
    DLOG_F(INFO, "Configure Event[%s]", node.name());
    pugi::xml_attribute allowFarUseAttr = node.attribute("allowfaruse");
    if (allowFarUseAttr != nullptr) {
        allowFarUse = allowFarUseAttr.as_bool();
        DLOG_F(INFO, "Event[%s]: Allow Far Use:[%d]", node.name(), allowFarUse);
    }

    pugi::xml_attribute blockWallsAttr = node.attribute("blockwalls");
    if (blockWallsAttr != nullptr) {
        checkLineOfSight = blockWallsAttr.as_bool();
        DLOG_F(INFO, "Event[%s]: Block Walls:[%d]", node.name(),
                checkLineOfSight);
    }

    pugi::xml_attribute checkFloorAttr = node.attribute("checkfloor");
    if (checkFloorAttr != nullptr) {
        checkFloor = checkFloorAttr.as_bool();
        DLOG_F(INFO, "Event[%s]: Check Floor:[%d]", node.name(), checkFloor);
    }

    DLOG_F(INFO, "Event[%s] configured with success!", node.name());
    return true;
}

namespace {

bool enterMarket(Player* player, Item* /*unused*/, const Position& /*unused*/,
            Thing* /*unused*/, const Position& /*unused*/, bool /*unused*/) {
    DLOG_F(INFO, "Player[%d] trying to enter market.", player == nullptr ?
            0 : player->getID());

    if (player->getLastDepotId() == -1) {
        DLOG_F(WARNING, "Player[%d] doesn't have depot!", player == nullptr ?
                                                        0 : player->getID());
        return false;
    }

    player->sendMarketEnter(player->getLastDepotId());
    DLOG_F(INFO, "enterMarket: Player[%d] Success!", player == nullptr ?
                                                        0 : player->getID());
    return true;
}

bool useImbueShrine(Player* player, Item* /*unused*/,
                    const Position& /*unused*/, Thing* target,
                    const Position& toPos, bool /*unused*/) {
    DLOG_F(INFO, "Use Imbue Shrine: Player[%d], Position: x[%d], y[%d], z[%d],",
             player == nullptr ? 0 : player->getID(), toPos.getX(),
            toPos.getY(), toPos.getZ());

    Item* item = target != nullptr ? target->getItem() : nullptr;
    if (item == nullptr) {
        player->sendTextMessage(MESSAGE_STATUS_SMALL,
                                "This item is not imbuable.");
        DLOG_F(WARNING, "Thing is not an item!");
        return false;
    }

    const ItemType& it = Item::items[item->getID()];
    if (it.imbuingSlots <= 0) {
        player->sendTextMessage(MESSAGE_STATUS_SMALL,
                                "This item is not imbuable.");
        DLOG_F(WARNING, "This item is not imbuable!");
        return false;
    }

    if (item->getTopParent() != player) {
        player->sendTextMessage(MESSAGE_STATUS_SMALL,
                                "You have to pick up the item to imbue it.");
        DLOG_F(WARNING, "You have to pick up the item to imbue it!");
        return false;
    }

    if ((toPos.y & 0x40) == 0) {
        player->sendTextMessage(MESSAGE_STATUS_SMALL,
                                "You cannot imbue an equipped item.");
        DLOG_F(WARNING, "You cannot imbue an equipped item!");
        return false;
    }

    DLOG_F(INFO, "Send Imbuement Windows.");
    player->sendImbuementWindow(target->getItem());

    DLOG_F(INFO, "useImbueShrine: Success!");
    return true;
}

}  // namespace

bool Action::loadFunction(const pugi::xml_attribute& attr, bool isScripted) {
    DLOG_F(INFO, "Load function[%s]", attr.as_string());

    const char* functionName = attr.as_string();
    if (strcasecmp(functionName, "market") == 0) {
        DLOG_F(INFO, "function: market");
        function = enterMarket;
    } else if (strcasecmp(functionName, "imbuement") == 0) {
        DLOG_F(INFO, "function: imbuement");
        function = useImbueShrine;
    } else {
        if (!isScripted) {
            LOG_F(WARNING, "Function[%s] does not exist!", functionName);
            return false;
        }
    }

    if (!isScripted) {
        DLOG_F(INFO, "Not scripted!");
        scripted = false;
    }

    DLOG_F(INFO, "loadFunction: Success!");
    return true;
}

std::string Action::getScriptEventName() const {
    DLOG_F(INFO, "Script Event Name: onUse");
    return "onUse";
}

ReturnValue Action::canExecuteAction(const Player* player,
                                    const Position& toPos) {
    DLOG_F(INFO, "Player[%d] can execute action position:x[%d], y[%d], z[%d]?",
            player == nullptr ? 0 : player->getID(), toPos.getX(), toPos.getY(),
            toPos.getZ());
    if (!allowFarUse) {
        return g_actions->canUse(player, toPos);
    }

    return g_actions->canUseFar(player, toPos, checkLineOfSight, checkFloor);
}

Thing* Action::getTarget(Player* player, Creature* targetCreature,
                        const Position& toPosition, uint8_t toStackPos) const {
    DLOG_F(INFO, "getTarget:Player[%d], Target[%d], Position:x[%d], y[%d], "
        "z[%d], toStackPos[%d].", player == nullptr ? 0 : player->getID(),
        targetCreature == nullptr ? 0 : targetCreature->getID(),
        toPosition.getX(), toPosition.getY(), toPosition.getZ(), toStackPos);

    if (targetCreature != nullptr) {
        return targetCreature;
    }
    return g_game.internalGetThing(player, toPosition, toStackPos, 0,
                                    STACKPOS_USETARGET);
}

bool Action::executeUse(Player* player, Item* item,
                        const Position& fromPosition, Thing* target,
                        const Position& toPosition, bool isHotkey) {
    DLOG_F(INFO, "Use Item Ex Player[%d], From Position:x[%d], y[%d], z[%d], "
        "To Position:x[%d], y[%d], z[%d], Item cid:[%d], isHotkey:[%d]",
        player == nullptr ? 0 : player->getID(),
        fromPosition.getX(), fromPosition.getY(), fromPosition.getZ(),
        toPosition.getX(), toPosition.getY(), toPosition.getZ(),
        item == nullptr ? 0 : item->getClientID(), isHotkey);

    // onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if (!scriptInterface->reserveScriptEnv()) {
        LOG_F(WARNING, "Call stack overflow!");
        return false;
    }

    ScriptEnvironment* env = scriptInterface->getScriptEnv();
    env->setScriptId(scriptId, scriptInterface);

    lua_State* L = scriptInterface->getLuaState();

    scriptInterface->pushFunction(scriptId);

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

    LuaScriptInterface::pushThing(L, item);
    LuaScriptInterface::pushPosition(L, fromPosition);

    LuaScriptInterface::pushThing(L, target);
    LuaScriptInterface::pushPosition(L, toPosition);

    LuaScriptInterface::pushBoolean(L, isHotkey);

    DLOG_F(INFO, "Call lua function");
    return scriptInterface->callFunction(6);
}
 

 

Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 

 

LOGS SERVIDOR.png

LOGS SERVIDOR2.png

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por braianlomas
      Como faço para corrigir esse problema para meu cliente, eu uso o tfs 0.3.6  
      Quero resolver esse problema que tenho no meu cliente, como e onde posso resolver?  
      Eu uso o tfs 0.3.6, não tenho as fontes do cliente, se você puder me dar eu vou amá-las para sempre  
       

       
    • Por A.Mokk
      Ola pessoal, estou tentando compilar o TFS 1.5 Downgrade para 8.60 atraves do MSVC 2022, ao tentar compilar da o seguinte erro:
       
       
      Fiz o download do MSVC, GitDash, TFS-SDK-3.2, e de varios boosts que tentei, ao fazer o seguinte procedimento no GitDash:
       
      Ao chegar em ./bootstrap-vcpkg.bat o GitDash nao consegue realizar o procedimento corretamente, alguem poderia me ajudar ?

      Tentei de diversas formas mas o mesmo erro sempre persiste, atualmente meu servidor utiliza TFS 0.4, consigo compilar sem nenhum problema no MSVC 2010, porem, as limitações do TFS 0.4 estão me fazendo precisar atualizar, se alguem souber como corrigir esses erros eu agradeço !

      Tutoriais utilizados :
      Compiling on Windows (vcpkg) · otland/forgottenserver Wiki · GitHub
      Compiling on Windows · otland/forgottenserver Wiki · GitHub
      Compilando TFS 1.3 com vídeo-aula - Tutoriais Infraestrutura & Proteção - Tibia King - Tudo sobre Tibia, OTServ e Bots!
      Compilar TFS 1.3 Vcpkg - Tutoriais Infraestrutura & Proteção - Tibia King - Tudo sobre Tibia, OTServ e Bots!
       
      O que acontece no Powershell:
       
    • Por thunmin
      .Qual servidor ou website você utiliza como base? 
      Canary 2.3.6
      Qual o motivo deste tópico? 
      Queria fazer com que os players não pudessem mexer no aleta sio, pois, agora os mesmos estão conseguindo mexer nos itens
      Está surgindo algum erro? Se sim coloque-o aqui. 
       
      Você tem o código disponível? Se tiver publique-o aqui: 
         
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
    • Por thunmin
      .Qual servidor ou website você utiliza como base? 
      canary para o cliente 13.16
      Qual o motivo deste tópico? 
      Não consigo encontrar onde ajusta
      to com o problema no 13.16  o exausted, por exemplo os kinas era pra combar exori, erori gran e exori min, porém não ta indo ta dando exausted o char ta soltando magia ou runa e não consegue usar as potions
      Está surgindo algum erro? Se sim coloque-o aqui. 
       
      Você tem o código disponível? Se tiver publique-o aqui: 
         
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
    • Por Andersontatuador
      Olá galera da TK, me chamo Anderson estou procurando alguém profissional em otservs e site.
      Já tenho um servidor o site e o cliente preciso só de uma pessoal competente, que esteja empenhado a trabalhar,
      não quero nada de graça, pois nessa onda fui mais roubado do quer eu pagar um profissional.
      caso alguém se interesse entrar em contato comigo através do whatsapp
      82 9 9304-9462
       
      Está surgindo algum erro? Se sim coloque-o aqui. 
       
      Você tem o código disponível? Se tiver publique-o aqui: 
         
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo