Ir para conteúdo
  • Cadastre-se

Suporte [AJUDA] MOVER ITENS DENTRO DE BP'S NAS HOUSES


Posts Recomendados

Boa noite galera do TibiaKing, tudo certo? Estou com um pequeno problema de que quando um player deixa uma BP na porta da house com alguns itens dentro da bp, outro player que não está invitado consegue abrir a BP e pegas os itens que estão dentro dela, alguém saberia em qual script e o que eu devo mexer para arrumar isso?

 

Agradeço a atenção desde já! ?

houseprotect.lua:

 

Spoiler
local function isInvited(houseId, playerName)
    if(string.find(string.lower(getHouseAccessList(houseId, 0x100)), playerName) or string.find(string.lower(getHouseAccessList(houseId, 0x101)), playerName)) then
        return true
    end
 
    return false
end
 
function onMoveItem(moveItem, frompos, position, cid)
    if((getPlayerGroupId(cid) < 6) and (getTileInfo(position).house) and (getHouseOwner(getHouseFromPos(position)) ~= getPlayerGUID(cid)) and (not isInvited(getHouseFromPos(position), string.lower(getCreatureName(cid))))) then
        doPlayerSendCancel(cid, "You cannot throw there.")
    else
        return true
    end
end

 

Editado por yuriowns (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
13 horas atrás, yuriowns disse:

Boa noite galera do TibiaKing, tudo certo? Estou com um pequeno problema de que quando um player deixa uma BP na porta da house com alguns itens dentro da bp, outro player que não está invitado consegue abrir a BP e pegas os itens que estão dentro dela, alguém saberia em qual script e o que eu devo mexer para arrumar isso?

 

Agradeço a atenção desde já! ?

Caso trata-se de uma house com porta vertical acredito que esteja correto do jeito que vc menciona

Link para o post
Compartilhar em outros sites
2 horas atrás, Aragllov disse:

Caso trata-se de uma house com porta vertical acredito que esteja correto do jeito que vc menciona

Porta vertical ou horizontal acontece este problema amigo :( 

Link para o post
Compartilhar em outros sites

Na minha concepção está correto, o primeiro sqm da house com saída para o sul ou leste, qualquer player alcança o respectivo sqm, com saídas para o oeste e norte o player que não está invitado não consegue alcançar o sqm da porta. Desculpe eu me recordo assim, não sei como funciona o global hoje em dia

Link para o post
Compartilhar em outros sites
8 minutos atrás, Aragllov disse:

Na minha concepção está correto, o primeiro sqm da house com saída para o sul ou leste, qualquer player alcança o respectivo sqm, com saídas para o oeste e norte o player que não está invitado não consegue alcançar o sqm da porta. Desculpe eu me recordo assim, não sei como funciona o global hoje em dia

me desculpe, não entendi kkk o meu ot é na versão 7.4

Link para o post
Compartilhar em outros sites

como mostro no gif, o player não está invitado na house e mesmo assim consegue pegar o que tem dentro da bp na porta, mas não consegue puxar a bp em si que está no chão

2023-03-20_17-39-45.thumb.gif.44d7ad0c8165625570c2ae3c1c9e1224.gif

Link para o post
Compartilhar em outros sites
6 minutos atrás, Aragllov disse:

Posta seu actions.cpp

actions.cpp:

 

Spoiler
////////////////////////////////////////////////////////////////////////
// OpenTibia - an opensource roleplaying game
////////////////////////////////////////////////////////////////////////
// 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 3 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, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////
#include "otpch.h"
 
#include "const.h"
 
#include "actions.h"
#include "tools.h"
 
#include "player.h"
#include "monster.h"
#include "npc.h"
 
#include "item.h"
#include "container.h"
 
#include "game.h"
#include "configmanager.h"
 
#include "combat.h"
#include "spells.h"
 
#include "house.h"
#include "beds.h"
 
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
 
extern Game g_game;
extern Spells* g_spells;
extern Actions* g_actions;
extern ConfigManager g_config;
 
Actions::Actions():
m_interface("Action Interface")
{
    m_interface.initState();
    defaultAction = NULL;
}
 
Actions::~Actions()
{
    clear();
}
 
inline void Actions::clearMap(ActionUseMap& map)
{
    for(ActionUseMap::iterator it = map.begin(); it != map.end(); ++it)
        delete it->second;
 
    map.clear();
}
 
void Actions::clear()
{
    clearMap(useItemMap);
    clearMap(uniqueItemMap);
    clearMap(actionItemMap);
 
    m_interface.reInitState();
    delete defaultAction;
    defaultAction = NULL;
}
 
Event* Actions::getEvent(const std::string& nodeName)
{
    if(asLowerCaseString(nodeName) == "action")
        return new Action(&m_interface);
 
    return NULL;
}
 
bool Actions::registerEvent(Event* event, xmlNodePtr p, bool override)
{
    Action* action = dynamic_cast<Action*>(event);
    if(!action)
        return false;
 
    std::string strValue;
    if(readXMLString(p, "default", strValue) && booleanString(strValue))
    {
        if(!defaultAction)
            defaultAction = action;
        else if(override)
        {
            delete defaultAction;
            defaultAction = action;
        }
        else
            std::clog << "[Warning - Actions::registerEvent] You cannot define more than one default action, if you want to do so "
                << "Please define \"override\"." << std::endl;
 
        return true;
    }
 
    bool success = true;
    std::string endValue;
    if(readXMLString(p, "itemid", strValue))
    {
        IntegerVec intVector;
        if(!parseIntegerVec(strValue, intVector))
        {
            std::clog << "[Warning - Actions::registerEvent] Invalid itemid - '" << strValue << "'" << std::endl;
            return false;
        }
 
        if(useItemMap.find(intVector[0]) != useItemMap.end())
        {
            if(!override)
            {
                std::clog << "[Warning - Actions::registerEvent] Duplicate registered item id: " << intVector[0] << std::endl;
                success = false;
            }
            else
                delete useItemMap[intVector[0]];
        }
 
        if(success)
            useItemMap[intVector[0]] = action;
 
        for(size_t i = 1, size = intVector.size(); i < size; ++i)
        {
            if(useItemMap.find(intVector[i]) != useItemMap.end())
            {
                if(!override)
                {
                    std::clog << "[Warning - Actions::registerEvent] Duplicate registered item id: " << intVector[i] << std::endl;
                    continue;
                }
                else
                    delete useItemMap[intVector[i]];
            }
 
            useItemMap[intVector[i]] = new Action(action);
        }
    }
    else if(readXMLString(p, "fromid", strValue) && readXMLString(p, "toid", endValue))
    {
        IntegerVec intVector = vectorAtoi(explodeString(strValue, ";")), endVector = vectorAtoi(explodeString(endValue, ";"));
        if(intVector[0] && endVector[0] && intVector.size() == endVector.size())
        {
            int32_t tmp = 0;
            for(size_t i = 0, size = intVector.size(); i < size; ++i)
            {
                tmp = intVector[i];
                while(intVector[i] <= endVector[i])
                {
                    if(useItemMap.find(intVector[i]) != useItemMap.end())
                    {
                        if(!override)
                        {
                            std::clog << "[Warning - Actions::registerEvent] Duplicate registered item with id: " << intVector[i] <<
                                ", in fromid: " << tmp << " and toid: " << endVector[i] << std::endl;
                            intVector[i]++;
                            continue;
                        }
                        else
                            delete useItemMap[intVector[i]];
                    }
 
                    useItemMap[intVector[i]++] = new Action(action);
                }
            }
        }
        else
            std::clog << "[Warning - Actions::registerEvent] Malformed entry (from item: \"" << strValue <<
                "\", to item: \"" << endValue << "\")" << std::endl;
    }
 
    if(readXMLString(p, "uniqueid", strValue))
    {
        IntegerVec intVector;
        if(!parseIntegerVec(strValue, intVector))
        {
            std::clog << "[Warning - Actions::registerEvent] Invalid uniqueid - '" << strValue << "'" << std::endl;
            return false;
        }
 
        if(uniqueItemMap.find(intVector[0]) != uniqueItemMap.end())
        {
            if(!override)
            {
                std::clog << "[Warning - Actions::registerEvent] Duplicate registered item uid: " << intVector[0] << std::endl;
                success = false;
            }
            else
                delete uniqueItemMap[intVector[0]];
        }
 
        if(success)
            uniqueItemMap[intVector[0]] = action;
 
        for(size_t i = 1, size = intVector.size(); i < size; ++i)
        {
            if(uniqueItemMap.find(intVector[i]) != uniqueItemMap.end())
            {
                if(!override)
                {
                    std::clog << "[Warning - Actions::registerEvent] Duplicate registered item uid: " << intVector[i] << std::endl;
                    continue;
                }
                else
                    delete uniqueItemMap[intVector[i]];
            }
 
            uniqueItemMap[intVector[i]] = new Action(action);
        }
    }
    else if(readXMLString(p, "fromuid", strValue) && readXMLString(p, "touid", endValue))
    {
        IntegerVec intVector = vectorAtoi(explodeString(strValue, ";")), endVector = vectorAtoi(explodeString(endValue, ";"));
        if(intVector[0] && endVector[0] && intVector.size() == endVector.size())
        {
            int32_t tmp = 0;
            for(size_t i = 0, size = intVector.size(); i < size; ++i)
            {
                tmp = intVector[i];
                while(intVector[i] <= endVector[i])
                {
                    if(uniqueItemMap.find(intVector[i]) != uniqueItemMap.end())
                    {
                        if(!override)
                        {
                            std::clog << "[Warning - Actions::registerEvent] Duplicate registered item with uid: " << intVector[i] <<
                                ", in fromuid: " << tmp << " and touid: " << endVector[i] << std::endl;
                            intVector[i]++;
                            continue;
                        }
                        else
                            delete uniqueItemMap[intVector[i]];
                    }
 
                    uniqueItemMap[intVector[i]++] = new Action(action);
                }
            }
        }
        else
            std::clog << "[Warning - Actions::registerEvent] Malformed entry (from unique: \"" << strValue <<
                "\", to unique: \"" << endValue << "\")" << std::endl;
    }
 
    if(readXMLString(p, "actionid", strValue) || readXMLString(p, "aid", strValue))
    {
        IntegerVec intVector;
        if(!parseIntegerVec(strValue, intVector))
        {
            std::clog << "[Warning - Actions::registerEvent] Invalid actionid - '" << strValue << "'" << std::endl;
            return false;
        }
 
        if(actionItemMap.find(intVector[0]) != actionItemMap.end())
        {
            if(!override)
            {
                std::clog << "[Warning - Actions::registerEvent] Duplicate registered item aid: " << intVector[0] << std::endl;
                success = false;
            }
            else
                delete actionItemMap[intVector[0]];
        }
 
        if(success)
            actionItemMap[intVector[0]] = action;
 
        for(size_t i = 1, size = intVector.size(); i < size; ++i)
        {
            if(actionItemMap.find(intVector[i]) != actionItemMap.end())
            {
                if(!override)
                {
                    std::clog << "[Warning - Actions::registerEvent] Duplicate registered item aid: " << intVector[i] << std::endl;
                    continue;
                }
                else
                    delete actionItemMap[intVector[i]];
            }
 
            actionItemMap[intVector[i]] = new Action(action);
        }
    }
    else if(readXMLString(p, "fromaid", strValue) && readXMLString(p, "toaid", endValue))
    {
        IntegerVec intVector = vectorAtoi(explodeString(strValue, ";")), endVector = vectorAtoi(explodeString(endValue, ";"));
        if(intVector[0] && endVector[0] && intVector.size() == endVector.size())
        {
            int32_t tmp = 0;
            for(size_t i = 0, size = intVector.size(); i < size; ++i)
            {
                tmp = intVector[i];
                while(intVector[i] <= endVector[i])
                {
                    if(actionItemMap.find(intVector[i]) != actionItemMap.end())
                    {
                        if(!override)
                        {
                            std::clog << "[Warning - Actions::registerEvent] Duplicate registered item with aid: " << intVector[i] <<
                                ", in fromaid: " << tmp << " and toaid: " << endVector[i] << std::endl;
                            intVector[i]++;
                            continue;
                        }
                        else
                            delete actionItemMap[intVector[i]];
                    }
 
                    actionItemMap[intVector[i]++] = new Action(action);
                }
            }
        }
        else
            std::clog << "[Warning - Actions::registerEvent] Malformed entry (from action: \"" << strValue <<
                "\", to action: \"" << endValue << "\")" << std::endl;
    }
 
    return success;
}
 
ReturnValue Actions::canUse(const Player* player, const Position& pos)
{
    const Position& playerPos = player->getPosition();
    if(pos.x == 0xFFFF)
        return RET_NOERROR;
 
    if(playerPos.z > pos.z)
        return RET_FIRSTGOUPSTAIRS;
 
    if(playerPos.z < pos.z)
        return RET_FIRSTGODOWNSTAIRS;
 
    if(!Position::areInRange<1,1,0>(playerPos, pos))
        return RET_TOOFARAWAY;
 
    return RET_NOERROR;
}
 
ReturnValue Actions::canUseEx(const Player* player, const Position& pos, const Item* item)
{
    Action* action = NULL;
    if((action = getAction(item, ACTION_UNIQUEID)))
        return action->canExecuteAction(player, pos);
 
    if((action = getAction(item, ACTION_ACTIONID)))
        return action->canExecuteAction(player, pos);
 
    if((action = getAction(item, ACTION_ITEMID)))
        return action->canExecuteAction(player, pos);
 
    if((action = getAction(item, ACTION_RUNEID)))
        return action->canExecuteAction(player, pos);
 
    if(defaultAction)
        return defaultAction->canExecuteAction(player, pos);
 
    return RET_NOERROR;
}
 
ReturnValue Actions::canUseFar(const Creature* creature, const Position& toPos, bool checkLineOfSight)
{
    if(toPos.x == 0xFFFF)
        return RET_NOERROR;
 
    const Position& creaturePos = creature->getPosition();
    if(creaturePos.z > toPos.z)
        return RET_FIRSTGOUPSTAIRS;
 
    if(creaturePos.z < toPos.z)
        return RET_FIRSTGODOWNSTAIRS;
 
    if(!Position::areInRange<7,5,0>(toPos, creaturePos))
        return RET_TOOFARAWAY;
 
    if(checkLineOfSight && !g_game.canThrowObjectTo(creaturePos, toPos))
        return RET_CANNOTTHROW;
 
    return RET_NOERROR;
}
 
Action* Actions::getAction(const Item* item, ActionType_t type) const
{
    if(item->getUniqueId() && (type == ACTION_ANY || type == ACTION_UNIQUEID))
    {
        ActionUseMap::const_iterator it = uniqueItemMap.find(item->getUniqueId());
        if(it != uniqueItemMap.end())
            return it->second;
    }
 
    if(item->getActionId() && (type == ACTION_ANY || type == ACTION_ACTIONID))
    {
        ActionUseMap::const_iterator it = actionItemMap.find(item->getActionId());
        if(it != actionItemMap.end())
            return it->second;
    }
 
    if(type == ACTION_ANY || type == ACTION_ITEMID)
    {
        ActionUseMap::const_iterator it = useItemMap.find(item->getID());
        if(it != useItemMap.end())
            return it->second;
    }
 
    if(type == ACTION_ANY || type == ACTION_RUNEID)
    {
        if(Action* runeSpell = g_spells->getRuneSpell(item->getID()))
            return runeSpell;
    }
 
    return NULL;
}
 
bool Actions::executeUse(Action* action, Player* player, Item* item,
    const PositionEx& posEx, uint32_t creatureId)
{
    return action->executeUse(player, item, posEx, posEx, false, creatureId);
}
 
ReturnValue Actions::internalUseItem(Player* player, const Position& pos, uint8_t index, Item* item, uint32_t creatureId)
{
    if(Door* door = item->getDoor())
    {
        if(!door->canUse(player))
            return RET_CANNOTUSETHISOBJECT;
    }
 
    int32_t tmp = 0;
    if(item->getParent())
        tmp = item->getParent()->__getIndexOfThing(item);
 
    PositionEx posEx(pos, tmp);
    Action* action = NULL;
    if((action = getAction(item, ACTION_UNIQUEID)))
    {
        if(executeUse(action, player, item, posEx, creatureId))
            return RET_NOERROR;
    }
 
    if((action = getAction(item, ACTION_ACTIONID)))
    {
        if(executeUse(action, player, item, posEx, creatureId))
            return RET_NOERROR;
    }
 
    if((action = getAction(item, ACTION_ITEMID)))
    {
        if(executeUse(action, player, item, posEx, creatureId))
            return RET_NOERROR;
    }
 
    if((action = getAction(item, ACTION_RUNEID)))
    {
        if(executeUse(action, player, item, posEx, creatureId))
            return RET_NOERROR;
    }
 
    if(defaultAction)
    {
        if(executeUse(defaultAction, player, item, posEx, creatureId))
            return RET_NOERROR;
    }
 
    if(BedItem* bed = item->getBed())
    {
        if(!bed->canUse(player))
            return RET_CANNOTUSETHISOBJECT;
 
        bed->sleep(player);
        return RET_NOERROR;
    }
 
    if(Container* container = item->getContainer())
    {
        if(container->getCorpseOwner() && !player->canOpenCorpse(container->getCorpseOwner())
            && g_config.getBool(ConfigManager::CHECK_CORPSE_OWNER))
            return RET_YOUARENOTTHEOWNER;
 
        Container* tmpContainer = NULL;
        if(Depot* depot = container->getDepot())
        {
            if(player->hasFlag(PlayerFlag_CannotPickupItem))
                return RET_CANNOTUSETHISOBJECT;
 
            if(Depot* playerDepot = player->getDepot(depot->getDepotId(), true))
            {
                player->useDepot(depot->getDepotId(), true);
                playerDepot->setParent(depot->getParent());
                tmpContainer = playerDepot;
            }
        }
 
        if(!tmpContainer)
            tmpContainer = container;
 
        int32_t oldId = player->getContainerID(tmpContainer);
        if(oldId != -1)
        {
            player->onCloseContainer(tmpContainer);
            player->closeContainer(oldId);
        }
        else
        {
            player->addContainer(index, tmpContainer);
            player->onSendContainer(tmpContainer);
        }
 
        return RET_NOERROR;
    }
 
    if(item->isReadable())
    {
        if(item->canWriteText())
        {
            player->setWriteItem(item, item->getMaxWriteLength());
            player->sendTextWindow(item, item->getMaxWriteLength(), true);
        }
        else
        {
            player->setWriteItem(NULL);
            player->sendTextWindow(item, 0, false);
        }
 
        return RET_NOERROR;
    }
 
    const ItemType& it = Item::items[item->getID()];
    if(it.transformUseTo)
    {
        g_game.transformItem(item, it.transformUseTo);
        g_game.startDecay(item);
        return RET_NOERROR;
    }
 
    if(item->isPremiumScroll())
    {
        std::stringstream ss;
        ss << " You have recived " << it.premiumDays << " premium days.";
        player->sendTextMessage(MSG_INFO_DESCR, ss.str());
 
        player->addPremiumDays(it.premiumDays);
        g_game.internalRemoveItem(NULL, item, 1);
        return RET_NOERROR;
    }
 
    return RET_CANNOTUSETHISOBJECT;
}
 
bool Actions::useItem(Player* player, const Position& pos, uint8_t index, Item* item)
{
    if(!player->canDoAction())
        return false;
 
    player->setNextActionTask(NULL);
    //player->stopWalk();
    player->setNextAction(OTSYS_TIME() + g_config.getNumber(ConfigManager::ACTIONS_DELAY_INTERVAL) - 10);
 
    ReturnValue ret = internalUseItem(player, pos, index, item, 0);
    if(ret == RET_NOERROR)
        return true;
 
    player->sendCancelMessage(ret);
    return false;
}
 
bool Actions::executeUseEx(Action* action, Player* player, Item* item, const PositionEx& fromPosEx,
    const PositionEx& toPosEx, uint32_t creatureId)
{
    return (action->executeUse(player, item, fromPosEx, toPosEx, false,
        creatureId) || action->hasOwnErrorHandler());
}
 
ReturnValue Actions::internalUseItemEx(Player* player, const PositionEx& fromPosEx, const PositionEx& toPosEx,
    Item* item, uint32_t creatureId)
{
    Action* action = NULL;
    if((action = getAction(item, ACTION_UNIQUEID)))
    {
        ReturnValue ret = action->canExecuteAction(player, toPosEx);
        if(ret != RET_NOERROR)
            return ret;
 
        //only continue with next action in the list if the previous returns false
        if(executeUseEx(action, player, item, fromPosEx, toPosEx, creatureId))
            return RET_NOERROR;
    }
 
    if((action = getAction(item, ACTION_ACTIONID)))
    {
        ReturnValue ret = action->canExecuteAction(player, toPosEx);
        if(ret != RET_NOERROR)
            return ret;
 
        //only continue with next action in the list if the previous returns false
        if(executeUseEx(action, player, item, fromPosEx, toPosEx, creatureId))
            return RET_NOERROR;
 
    }
 
    if((action = getAction(item, ACTION_ITEMID)))
    {
        ReturnValue ret = action->canExecuteAction(player, toPosEx);
        if(ret != RET_NOERROR)
            return ret;
 
        //only continue with next action in the list if the previous returns false
        if(executeUseEx(action, player, item, fromPosEx, toPosEx, creatureId))
            return RET_NOERROR;
    }
 
    if((action = getAction(item, ACTION_RUNEID)))
    {
        ReturnValue ret = action->canExecuteAction(player, toPosEx);
        if(ret != RET_NOERROR)
            return ret;
 
        //only continue with next action in the list if the previous returns false
        if(executeUseEx(action, player, item, fromPosEx, toPosEx, creatureId))
            return RET_NOERROR;
    }
 
    if(defaultAction)
    {
        ReturnValue ret = defaultAction->canExecuteAction(player, toPosEx);
        if(ret != RET_NOERROR)
            return ret;
 
        //only continue with next action in the list if the previous returns false
        if(executeUseEx(defaultAction, player, item, fromPosEx, toPosEx, creatureId))
            return RET_NOERROR;
    }
 
    return RET_CANNOTUSETHISOBJECT;
}
 
bool Actions::useItemEx(Player* player, const Position& fromPos, const Position& toPos,
    uint8_t toStackPos, Item* item, uint32_t creatureId/* = 0*/)
{
    if(!player->canDoAction())
        return false;
 
    player->setNextActionTask(NULL);
    //player->stopWalk();
    player->setNextAction(OTSYS_TIME() + g_config.getNumber(ConfigManager::EX_ACTIONS_DELAY_INTERVAL) - 10);
 
    int32_t fromStackPos = 0;
    if(item->getParent())
        fromStackPos = item->getParent()->__getIndexOfThing(item);
 
    PositionEx fromPosEx(fromPos, fromStackPos);
    PositionEx toPosEx(toPos, toStackPos);
 
    ReturnValue ret = internalUseItemEx(player, fromPosEx, toPosEx, item, creatureId);
    if(ret == RET_NOERROR)
        return true;
 
    player->sendCancelMessage(ret);
    return false;
}
 
Action::Action(LuaInterface* _interface):
Event(_interface)
{
    allowFarUse = false;
    checkLineOfSight = true;
}
 
Action::Action(const Action* copy):
Event(copy)
{
    allowFarUse = copy->allowFarUse;
    checkLineOfSight = copy->checkLineOfSight;
}
 
bool Action::configureEvent(xmlNodePtr p)
{
    std::string strValue;
    if(readXMLString(p, "allowfaruse", strValue) || readXMLString(p, "allowFarUse", strValue))
        setAllowFarUse(booleanString(strValue));
 
    if(readXMLString(p, "blockwalls", strValue) || readXMLString(p, "blockWalls", strValue))
        setCheckLineOfSight(booleanString(strValue));
 
    return true;
}
 
ReturnValue Action::canExecuteAction(const Player* player, const Position& pos)
{
    if(player->hasCustomFlag(PlayerCustomFlag_CanUseFar))
        return RET_NOERROR;
 
    if(!getAllowFarUse())
        return g_actions->canUse(player, pos);
 
    return g_actions->canUseFar(player, pos, getCheckLineOfSight());
}
 
bool Action::executeUse(Player* player, Item* item, const PositionEx& fromPos, const PositionEx& toPos, bool extendedUse, uint32_t)
{
    //onUse(cid, item, fromPosition, itemEx, toPosition)
    if(m_interface->reserveEnv())
    {
        ScriptEnviroment* env = m_interface->getEnv();
        if(m_scripted == EVENT_SCRIPT_BUFFER)
        {
            env->setRealPos(player->getPosition());
            std::stringstream scriptstream;
 
            scriptstream << "local cid = " << env->addThing(player) << std::endl;
            env->streamThing(scriptstream, "item", item, env->addThing(item));
            env->streamPosition(scriptstream, "fromPosition", fromPos, fromPos.stackpos);
 
            Thing* thing = g_game.internalGetThing(player, toPos, toPos.stackpos);
            if(thing && (thing != item || !extendedUse))
            {
                env->streamThing(scriptstream, "itemEx", thing, env->addThing(thing));
                env->streamPosition(scriptstream, "toPosition", toPos, toPos.stackpos);
            }
            else
            {
                env->streamThing(scriptstream, "itemEx", NULL, 0);
                env->streamPosition(scriptstream, "toPosition", PositionEx());
            }
 
            if(m_scriptData)
                scriptstream << *m_scriptData;
 
            bool result = true;
            if(m_interface->loadBuffer(scriptstream.str()))
            {
                lua_State* L = m_interface->getState();
                result = m_interface->getGlobalBool(L, "_result", true);
            }
 
            m_interface->releaseEnv();
            return result;
        }
        else
        {
            #ifdef __DEBUG_LUASCRIPTS__
            std::stringstream desc;
            desc << player->getName() << " - " << item->getID() << " " << fromPos << "|" << toPos;
            env->setEvent(desc.str());
            #endif
 
            env->setScriptId(m_scriptId, m_interface);
            env->setRealPos(player->getPosition());
 
            lua_State* L = m_interface->getState();
            m_interface->pushFunction(m_scriptId);
 
            lua_pushnumber(L, env->addThing(player));
            LuaInterface::pushThing(L, item, env->addThing(item));
            LuaInterface::pushPosition(L, fromPos, fromPos.stackpos);
 
            Thing* thing = g_game.internalGetThing(player, toPos, toPos.stackpos);
            if(thing && (thing != item || !extendedUse))
            {
                LuaInterface::pushThing(L, thing, env->addThing(thing));
                LuaInterface::pushPosition(L, toPos, toPos.stackpos);
            }
            else
            {
                LuaInterface::pushThing(L, NULL, 0);
                LuaInterface::pushPosition(L, PositionEx());
            }
 
            bool result = m_interface->callFunction(5);
            m_interface->releaseEnv();
            return result;
        }
    }
    else
    {
        std::clog << "[Error - Action::executeUse]: Call stack overflow." << std::endl;
        return false;
    }
}

 

Link para o post
Compartilhar em outros sites
18 horas atrás, yuriowns disse:

eu precisaria compilar novamente as sources pra arrumar este problema?

sim

procura por
 

ReturnValue Actions::canUse(const Player* player, const Position& pos)
{
    const Position& playerPos = player->getPosition();
    if(pos.x == 0xFFFF)
        return RET_NOERROR;
 
    if(playerPos.z > pos.z)
        return RET_FIRSTGOUPSTAIRS;
 
    if(playerPos.z < pos.z)
        return RET_FIRSTGODOWNSTAIRS;
 
    if(!Position::areInRange<1,1,0>(playerPos, pos))
        return RET_TOOFARAWAY;
 
    return RET_NOERROR;
}


troca por:
 

ReturnValue Actions::canUse(const Player* player, const Position& pos)
{
	const Position& playerPos = player->getPosition();
	if(pos.x == 0xFFFF)
		return RET_NOERROR;

	if(playerPos.z > pos.z)
		return RET_FIRSTGOUPSTAIRS;

	if(playerPos.z < pos.z)
		return RET_FIRSTGODOWNSTAIRS;

	if(!Position::areInRange<1,1,0>(playerPos, pos))
		return RET_TOOFARAWAY;

	Tile* tile = g_game.getTile(pos);
	if(tile)
	{
		HouseTile* houseTile = tile->getHouseTile();
		if(houseTile && houseTile->getHouse() && !houseTile->getHouse()->isInvited(player))
			return RET_PLAYERISNOTINVITED;
	}

	return RET_NOERROR;
}



isso vai checar se o piso que ele ta tentando dar use é de house e se ele ta invitado

*NECESSÁRIO* compilar novamente a source, pode dar somente make mesmo.
caso não saiba fazer isso responda aqui me marcando que dou uma instruida.

Link para o post
Compartilhar em outros sites
6 horas atrás, FeeTads disse:

sim

procura por
 


ReturnValue Actions::canUse(const Player* player, const Position& pos)
{
    const Position& playerPos = player->getPosition();
    if(pos.x == 0xFFFF)
        return RET_NOERROR;
 
    if(playerPos.z > pos.z)
        return RET_FIRSTGOUPSTAIRS;
 
    if(playerPos.z < pos.z)
        return RET_FIRSTGODOWNSTAIRS;
 
    if(!Position::areInRange<1,1,0>(playerPos, pos))
        return RET_TOOFARAWAY;
 
    return RET_NOERROR;
}


troca por:
 


ReturnValue Actions::canUse(const Player* player, const Position& pos)
{
	const Position& playerPos = player->getPosition();
	if(pos.x == 0xFFFF)
		return RET_NOERROR;

	if(playerPos.z > pos.z)
		return RET_FIRSTGOUPSTAIRS;

	if(playerPos.z < pos.z)
		return RET_FIRSTGODOWNSTAIRS;

	if(!Position::areInRange<1,1,0>(playerPos, pos))
		return RET_TOOFARAWAY;

	Tile* tile = g_game.getTile(pos);
	if(tile)
	{
		HouseTile* houseTile = tile->getHouseTile();
		if(houseTile && houseTile->getHouse() && !houseTile->getHouse()->isInvited(player))
			return RET_PLAYERISNOTINVITED;
	}

	return RET_NOERROR;
}



isso vai checar se o piso que ele ta tentando dar use é de house e se ele ta invitado

*NECESSÁRIO* compilar novamente a source, pode dar somente make mesmo.
caso não saiba fazer isso responda aqui me marcando que dou uma instruida.

não manjo muito mano, única coisa q sei é q precisa do VS, isso eu já tenho aqui

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