Ir para conteúdo

Crypter

Membro
  • Registro em

  • Última visita

Tudo que Crypter postou

  1. Chama discord que te ajudo ᵍᵘˢᵗᵃᵛ#5880
  2. Utiliza a função g_game.getLocalPlayer():getVocation()
  3. useBlackSkull = false Se você colocar false oque acontece?
  4. Posta seu creaturescripts.xml e olha no config.lua os valores que estão no critical
  5. local interval = 1.0 -- intervalo em segundos entre dois efeitos local set_effect = CONST_ME_FIREWORK_RED -- edite o id do efeito local text_msg = "Set Full" -- msg que sai local text_color = COLOR_WHITE -- cor da msg, olha na lib as outras local set = { [CONST_SLOT_HEAD] = 1111, -- id do helmet [CONST_SLOT_ARMOR] = 2222, -- || armor [CONST_SLOT_LEGS] = 3333, --|| legs [CONST_SLOT_FEET] = 4444, --|| boots [CONST_SLOT_LEFT] = 0000 --|| shield } function onEquip(cid, item, slot) sendSetEffect(cid, set_effect, interval*1000) return true end function sendSetEffect(cid, effect, time) if not isCreature(cid) then return false end for slot, id in pairs(set) do if getPlayerSlotItem(cid, slot).itemid ~= id then return false end end doSendMagicEffect(getPlayerPosition(cid), effect) doSendAnimatedText(getCreaturePosition(cid), text_msg, text_color) addEvent(sendSetEffect, time, cid, effect, time) return true end
  6. Da pra compilar com mingw32 sim
  7. Você tem que alterar no próprio object builder abrindo seu dat/spr
  8. No teu servidor tem o xml desse npc recebendo essa script? e ele está no mapa, checa se ñ tem nada errado
  9. Crypter postou uma resposta no tópico em Formação de Equipe
    Tópico atualizado
  10. Campo de visão desse cliente está expandida, como no seu servidor não está igual os tile/item no mapa bugam ficando assim, para arrumar você teria que descobrir o valor usado nesse cliente.
  11. testa ai local config = { posicao = { x = 1168, y = 731, z = 13}, -- Posição em que o player deve estar no altar need = { {item=2140,p={ x = 1295, y = 719, z = 13}},{item=2140,p={ x = 1296, y = 719, z = 13}},{item=2140,p={ x = 1297, y = 719, z = 13}},{item=2140,p={ x = 1295, y = 719, z = 13}} }, teleporte = {1387, { x = 1209, y = 818, z = 13}, { x = 1850, y = 481, z = 12} }, -- { id do Teleporte / onde será criado o teleporte / onde irá teleportar } tempo = 5000 -- Tempo para que o teleporte desapareça } function removeTP() doRemoveItem(getTileItemById(config.teleporte[2], config.teleporte[1]).uid) end function onUse(cid, item, fromPosition, itemEx, toPosition) local pId = getTopCreature(config.posicao).uid if ( pId == 0 or not isPlayer(pId) ) then return true and doPlayerSendCancel(cid, "You need to stay on the correct floor.") end local items_check = {} for p, v in pairs(config.need) do local posiItem = getTileItemById(v.item, v.p) if posiItem ~= 0 then table.insert(items_check,posiItem.uid) end end if not #items_check == #config.need then return true and doPlayerSendCancel(cid, "You need to put all items on the floors.") end for p, v in pairs(items_check) do if v then doRemoveItem(v) end end doCreateTeleport(config.teleporte[1], config.teleporte[3], config.teleporte[2]) doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945) addEvent(removeTP, config.tempo) return true end
  12. tfs 0.4 860
  13. Crypter postou uma resposta no tópico em Formação de Equipe
    Ficou bonito pra quem ta iniciando, caso queira entrar no projeto como sprite só chamar no discord
  14. Crypter postou uma resposta no tópico em Formação de Equipe
    ᵍᵘˢᵗᵃᵛ#5880
  15. Crypter postou uma resposta no tópico em Formação de Equipe
    Por enquanto é um projeto fechado ao público, nossa equipe não pretende mostrar nada por enquanto, desde mapa,a fotos do jogo.
  16. @KotZletY Eu postei o talkaction.cpp com a verificação do vendedor/comprador, como o carinha pediu
  17. Crypter postou uma resposta no tópico em Formação de Equipe
    Recrutamento para equipe Aberto vagas para Programadores, Spriters, Designers e mappers. Caso tenha interesse deixe seu contato aqui no tópico, ou mande-me uma mensagem aqui no xtibia. Informações do projeto:
  18. //////////////////////////////////////////////////////////////////////// // 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 "talkaction.h" #include "iologindata.h" #include "ioban.h" #include "player.h" #include "npc.h" #include "house.h" #include "town.h" #include "teleport.h" #include "status.h" #include "textlogger.h" #include <boost/version.hpp> #ifdef __ENABLE_SERVER_DIAGNOSTIC__ #include "outputmessage.h" #include "connection.h" #include "admin.h" #include "manager.h" #include "protocollogin.h" #include "protocolold.h" #endif #include "configmanager.h" #include "game.h" #include "chat.h" #include "tools.h" #include "resources.h" extern ConfigManager g_config; extern Game g_game; extern Chat g_chat; extern TalkActions* g_talkActions; TalkActions::TalkActions(): m_interface("TalkAction Interface") { m_interface.initState(); defaultTalkAction = NULL; } TalkActions::~TalkActions() { clear(); } void TalkActions::clear() { for(TalkActionsMap::iterator it = talksMap.begin(); it != talksMap.end(); ++it) delete it->second; talksMap.clear(); m_interface.reInitState(); delete defaultTalkAction; defaultTalkAction = NULL; } Event* TalkActions::getEvent(const std::string& nodeName) { if(asLowerCaseString(nodeName) == "talkaction") return new TalkAction(&m_interface); return NULL; } bool TalkActions::registerEvent(Event* event, xmlNodePtr p, bool override) { TalkAction* talkAction = dynamic_cast<TalkAction*>(event); if(!talkAction) return false; std::string strValue; if(readXMLString(p, "default", strValue) && booleanString(strValue)) { if(!defaultTalkAction) defaultTalkAction = talkAction; else if(override) { delete defaultTalkAction; defaultTalkAction = talkAction; } else std::clog << "[Warning - TalkAction::registerEvent] You cannot define more than one default talkAction." << std::endl; return true; } if(!readXMLString(p, "separator", strValue) || strValue.empty()) strValue = ";"; StringVec strVector = explodeString(talkAction->getWords(), strValue); for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it) { trimString(*it); talkAction->setWords(*it); if(talksMap.find(*it) != talksMap.end()) { if(!override) { std::clog << "[Warning - TalkAction::registerEvent] Duplicate registered talkaction with words: " << (*it) << std::endl; continue; } delete talksMap[(*it)]; } talksMap[(*it)] = new TalkAction(talkAction); } delete talkAction; return true; } bool TalkActions::onPlayerSay(Creature* creature, uint16_t channelId, const std::string& words, bool ignoreAccess) { std::string cmd[TALKFILTER_LAST], param[TALKFILTER_LAST]; for(int32_t i = 0; i < TALKFILTER_LAST; ++i) cmd[i] = words; std::string::size_type loc = words.find('"', 0); if(loc != std::string::npos) { cmd[TALKFILTER_QUOTATION] = std::string(words, 0, loc); param[TALKFILTER_QUOTATION] = std::string(words, (loc + 1), (words.size() - (loc - 1))); trimString(cmd[TALKFILTER_QUOTATION]); } loc = words.find(" ", 0); if(loc != std::string::npos) { cmd[TALKFILTER_WORD] = std::string(words, 0, loc); param[TALKFILTER_WORD] = std::string(words, (loc + 1), (words.size() - (loc - 1))); std::string::size_type spaceLoc = words.find(" ", ++loc); if(spaceLoc != std::string::npos) { cmd[TALKFILTER_WORD_SPACED] = std::string(words, 0, spaceLoc); param[TALKFILTER_WORD_SPACED] = std::string(words, (spaceLoc + 1), (words.size() - (spaceLoc - 1))); } } TalkAction* talkAction = NULL; for(TalkActionsMap::iterator it = talksMap.begin(); it != talksMap.end(); ++it) { if(it->first == cmd[it->second->getFilter()] || (!it->second->isSensitive() && boost::algorithm::iequals(it->first, cmd[it->second->getFilter()]))) { talkAction = it->second; break; } } if(!talkAction && defaultTalkAction) talkAction = defaultTalkAction; if(!talkAction || (talkAction->getChannel() != -1 && talkAction->getChannel() != channelId)) return false; Player* player = creature->getPlayer(); if(player) { if(!player->canDoExAction()) return false; StringVec exceptions = talkAction->getExceptions(); if((!ignoreAccess && std::find(exceptions.begin(), exceptions.end(), asLowerCaseString( player->getName())) == exceptions.end() && (talkAction->getAccess() > player->getAccess() || (talkAction->hasGroups() && !talkAction->hasGroup(player->getGroupId())))) || player->isAccountManager()) { if(player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges)) { player->sendTextMessage(MSG_STATUS_SMALL, "You cannot execute this talkaction."); return true; } return false; } if(!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges)) player->setNextExAction(OTSYS_TIME() + g_config.getNumber(ConfigManager::CUSTOM_ACTIONS_DELAY_INTERVAL) - 10); } if(talkAction->isLogged()) { if(player) player->sendTextMessage(MSG_EVENT_ORANGE, words.c_str()); Logger::getInstance()->eFile("talkactions/" + creature->getName() + ".log", words, true); } if(talkAction->isScripted()) return (talkAction->executeSay(creature, cmd[talkAction->getFilter()], param[talkAction->getFilter()], channelId) != 0); if(TalkFunction* function = talkAction->getFunction()) return function(creature, cmd[talkAction->getFilter()], param[talkAction->getFilter()]); return false; } TalkAction::TalkAction(LuaInterface* _interface): Event(_interface) { m_function = NULL; m_filter = TALKFILTER_WORD; m_access = 0; m_channel = -1; m_logged = m_hidden = false; m_sensitive = true; } TalkAction::TalkAction(const TalkAction* copy): Event(copy) { m_words = copy->m_words; m_function = copy->m_function; m_filter = copy->m_filter; m_access = copy->m_access; m_channel = copy->m_channel; m_logged = copy->m_logged; m_hidden = copy->m_hidden; m_sensitive = copy->m_sensitive; m_exceptions = copy->m_exceptions; m_groups = copy->m_groups; } bool TalkAction::configureEvent(xmlNodePtr p) { std::string strValue; if(readXMLString(p, "words", strValue)) m_words = strValue; else if(!readXMLString(p, "default", strValue) || !booleanString(strValue)) { std::clog << "[Error - TalkAction::configureEvent] No words for TalkAction." << std::endl; return false; } if(readXMLString(p, "filter", strValue)) { std::string tmpStrValue = asLowerCaseString(strValue); if(tmpStrValue == "quotation") m_filter = TALKFILTER_QUOTATION; else if(tmpStrValue == "word") m_filter = TALKFILTER_WORD; else if(tmpStrValue == "word-spaced") m_filter = TALKFILTER_WORD_SPACED; else std::clog << "[Warning - TalkAction::configureEvent] Unknown filter for TalkAction: " << strValue << ", using default." << std::endl; } int32_t intValue; if(readXMLInteger(p, "access", intValue)) m_access = intValue; if(readXMLString(p, "group", strValue) || readXMLString(p, "groups", strValue)) { m_groups.clear(); if(!parseIntegerVec(strValue, m_groups)) std::clog << "[Warning - TalkAction::configureEvent] Invalid group(s) for TalkAction: " << strValue << std::endl; } if(readXMLInteger(p, "channel", intValue)) m_channel = intValue; if(readXMLString(p, "logged", strValue) || readXMLString(p, "log", strValue)) m_logged = booleanString(strValue); if(readXMLString(p, "hidden", strValue) || readXMLString(p, "hide", strValue)) m_hidden = booleanString(strValue); if(readXMLString(p, "case-sensitive", strValue) || readXMLString(p, "casesensitive", strValue) || readXMLString(p, "sensitive", strValue)) m_sensitive = booleanString(strValue); if(readXMLString(p, "exception", strValue)) m_exceptions = explodeString(asLowerCaseString(strValue), ";"); return true; } bool TalkAction::loadFunction(const std::string& functionName) { m_functionName = asLowerCaseString(functionName); if(m_functionName == "housebuy") m_function = houseBuy; else if(m_functionName == "housesell") m_function = houseSell; else if(m_functionName == "housekick") m_function = houseKick; else if(m_functionName == "housedoorlist") m_function = houseDoorList; else if(m_functionName == "houseguestlist") m_function = houseGuestList; else if(m_functionName == "housesubownerlist") m_function = houseSubOwnerList; else if(m_functionName == "guildjoin") m_function = guildJoin; else if(m_functionName == "guildcreate") m_function = guildCreate; else if(m_functionName == "thingproporties") m_function = thingProporties; else if(m_functionName == "banishmentinfo") m_function = banishmentInfo; else if(m_functionName == "diagnostics") m_function = diagnostics; else if(m_functionName == "ghost") m_function = ghost; else if(m_functionName == "software") m_function = software; else { std::clog << "[Warning - TalkAction::loadFunction] Function \"" << m_functionName << "\" does not exist." << std::endl; return false; } m_scripted = EVENT_SCRIPT_FALSE; return true; } int32_t TalkAction::executeSay(Creature* creature, const std::string& words, std::string param, uint16_t channel) { //onSay(cid, words, param, channel) if(m_interface->reserveEnv()) { trimString(param); ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; scriptstream << "local words = \"" << words << "\"" << std::endl; scriptstream << "local param = \"" << param << "\"" << std::endl; scriptstream << "local channel = " << channel << std::endl; 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__ char desc[125]; sprintf(desc, "%s - %s- %s", creature->getName().c_str(), words.c_str(), param.c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); lua_pushstring(L, words.c_str()); lua_pushstring(L, param.c_str()); lua_pushnumber(L, channel); bool result = m_interface->callFunction(4); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - TalkAction::executeSay] Call stack overflow." << std::endl; return 0; } } bool TalkAction::houseBuy(Creature* creature, const std::string&, const std::string&) { Player* player = creature->getPlayer(); if(!player || !g_config.getBool(ConfigManager::HOUSE_BUY_AND_SELL)) return false; const Position& pos = getNextPosition(player->getDirection(), player->getPosition()); Tile* tile = g_game.getTile(pos); if(!tile) { player->sendCancel("You have to be looking at door of flat you would like to purchase."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } House* house = tile->getHouse(); if(!house) { player->sendCancel("You have to be looking at door of flat you would like to purchase."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!house->getDoorByPosition(pos)) { player->sendCancel("You have to be looking at door of flat you would like to purchase."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(house->isBidded()) { player->sendCancel("You cannot buy house which is currently bidded on an auction."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!house->isGuild()) { if(Houses::getInstance()->getHouseByPlayerId(player->getGUID())) { player->sendCancel("You already rent another house."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } uint16_t accountHouses = g_config.getNumber(ConfigManager::HOUSES_PER_ACCOUNT); if(accountHouses > 0 && Houses::getInstance()->getHousesCount(player->getAccount()) >= accountHouses) { char buffer[80]; sprintf(buffer, "You may own only %d house%s per account.", accountHouses, (accountHouses != 1 ? "s" : "")); player->sendCancel(buffer); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(g_config.getBool(ConfigManager::HOUSE_NEED_PREMIUM) && !player->isPremium()) { player->sendCancelMessage(RET_YOUNEEDPREMIUMACCOUNT); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } uint32_t levelToBuyHouse = g_config.getNumber(ConfigManager::LEVEL_TO_BUY_HOUSE); if(player->getLevel() < levelToBuyHouse) { char buffer[90]; sprintf(buffer, "You have to be at least Level %d to purchase a house.", levelToBuyHouse); player->sendCancel(buffer); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } } else { if(!player->getGuildId() || player->getGuildLevel() != GUILDLEVEL_LEADER) { player->sendCancel("You have to be at least a guild leader to purchase a hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(Houses::getInstance()->getHouseByGuildId(player->getGuildId())) { player->sendCancel("Your guild rents already another hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } } if(house->getOwner()) { player->sendCancel("This flat is already owned by someone else."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if((uint32_t)g_game.getMoney(player) < house->getPrice() || !g_game.removeMoney(player, house->getPrice())) { player->sendCancel("You do not have enough money."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } house->setOwnerEx(player->getGUID(), true); if(g_config.getBool(ConfigManager::HOUSE_SKIP_INIT_RENT)) { uint32_t paidUntil = time(NULL); switch(Houses::getInstance()->getRentPeriod()) { case RENTPERIOD_DAILY: paidUntil += 86400; break; case RENTPERIOD_WEEKLY: paidUntil += 7 * 86400; break; case RENTPERIOD_MONTHLY: paidUntil += 30 * 86400; break; case RENTPERIOD_YEARLY: paidUntil += 365 * 86400; break; default: break; } house->setPaidUntil(paidUntil); house->setLastWarning(0); } std::string ret = "You have successfully bought this "; if(house->isGuild()) ret += "hall"; else ret += "house"; ret += ", remember to leave money at "; if(house->isGuild()) ret += "guild owner "; if(g_config.getBool(ConfigManager::BANK_SYSTEM)) ret += "bank or "; ret += "depot of this town for rent."; player->sendTextMessage(MSG_INFO_DESCR, ret.c_str()); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); return false; } bool TalkAction::houseSell(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player || !g_config.getBool(ConfigManager::HOUSE_BUY_AND_SELL)) return false; House* house = Houses::getInstance()->getHouseByPlayerId(player->getGUID()); if(!house && (!player->getGuildId() || !(house = Houses::getInstance()->getHouseByGuildId(player->getGuildId())))) { player->sendCancel("You do not rent any flat."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(house->isGuild() && player->getGuildLevel() != GUILDLEVEL_LEADER) { player->sendCancel("You have to be at least a guild leader to sell this hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } Tile* tile = g_game.getTile(player->getPosition()); if(!tile || !tile->getHouseTile() || tile->getHouseTile()->getHouse() != house) { player->sendCancel("You have to be inside a house that you would like to sell."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } Player* tradePartner = NULL; ReturnValue ret = g_game.getPlayerByNameWildcard(param, tradePartner); if(ret != RET_NOERROR) { player->sendCancelMessage(ret); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(tradePartner == player) { player->sendCancel("You cannot trade with yourself."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(tradePartner == player) { player->sendCancel("You cannot trade with yourself."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!house->isGuild()) { if(Houses::getInstance()->getHouseByPlayerId(tradePartner->getGUID())) { player->sendCancel("Trade player already rents another house."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } uint16_t housesPerAccount = g_config.getNumber(ConfigManager::HOUSES_PER_ACCOUNT); if(housesPerAccount > 0 && Houses::getInstance()->getHousesCount(tradePartner->getAccount()) >= housesPerAccount) { char buffer[100]; sprintf(buffer, "Trade player has reached limit of %d house%s per account.", housesPerAccount, (housesPerAccount != 1 ? "s" : "")); player->sendCancel(buffer); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!player->isPremium() && !g_config.getBool(ConfigManager::HOUSE_NEED_PREMIUM)) { player->sendCancel("You do not have a premium account."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!tradePartner->isPremium() && !g_config.getBool(ConfigManager::HOUSE_NEED_PREMIUM)) { player->sendCancel("Trade player does not have a premium account."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } uint32_t levelToBuyHouse = g_config.getNumber(ConfigManager::LEVEL_TO_BUY_HOUSE); if(tradePartner->getLevel() < levelToBuyHouse) { char buffer[100]; sprintf(buffer, "Trade player has to be at least Level %d to buy house.", levelToBuyHouse); player->sendCancel(buffer); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } } else { if(!tradePartner->getGuildId() || tradePartner->getGuildLevel() != GUILDLEVEL_LEADER) { player->sendCancel("Trade player has to be at least a guild leader to buy a hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(Houses::getInstance()->getHouseByGuildId(tradePartner->getGuildId())) { player->sendCancel("Trade player's guild already rents another hall."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } } if(!Position::areInRange<3,3,0>(tradePartner->getPosition(), player->getPosition())) { player->sendCancel("Trade player is too far away."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } if(!Houses::getInstance()->payRent(player, house, 0)) { player->sendCancel("You have to pay a pre-rent first."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } Item* transferItem = TransferItem::createTransferItem(house); player->transferContainer.__addThing(NULL, transferItem); player->transferContainer.setParent(player); if(!g_game.internalStartTrade(player, tradePartner, transferItem)) transferItem->onTradeEvent(ON_TRADE_CANCEL, player, NULL); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); return false; } bool TalkAction::houseKick(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player) return false; Player* targetPlayer = NULL; if(g_game.getPlayerByNameWildcard(param, targetPlayer) != RET_NOERROR) targetPlayer = player; House* house = Houses::getInstance()->getHouseByPlayer(targetPlayer); if(!house || !house->kickPlayer(player, targetPlayer)) { g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); player->sendCancelMessage(RET_NOTPOSSIBLE); } else g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); return false; } bool TalkAction::houseDoorList(Creature* creature, const std::string&, const std::string&) { Player* player = creature->getPlayer(); if(!player) return false; House* house = Houses::getInstance()->getHouseByPlayer(player); if(!house) { player->sendCancelMessage(RET_NOTPOSSIBLE); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return false; } Door* door = house->getDoorByPosition(getNextPosition(player->getDirection(), player->getPosition())); if(door && house->canEditAccessList(door->getDoorId(), player)) { player->setEditHouse(house, door->getDoorId()); player->sendHouseWindow(house, door->getDoorId()); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); } else { player->sendCancelMessage(RET_NOTPOSSIBLE); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); } return false; } bool TalkAction::houseGuestList(Creature* creature, const std::string&, const std::string&) { Player* player = creature->getPlayer(); if(!player) return false; House* house = Houses::getInstance()->getHouseByPlayer(player); if(house && house->canEditAccessList(GUEST_LIST, player)) { player->setEditHouse(house, GUEST_LIST); player->sendHouseWindow(house, GUEST_LIST); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); } else { player->sendCancelMessage(RET_NOTPOSSIBLE); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); } return false; } bool TalkAction::houseSubOwnerList(Creature* creature, const std::string&, const std::string&) { Player* player = creature->getPlayer(); if(!player) return false; House* house = Houses::getInstance()->getHouseByPlayer(player); if(house && house->canEditAccessList(SUBOWNER_LIST, player)) { player->setEditHouse(house, SUBOWNER_LIST); player->sendHouseWindow(house, SUBOWNER_LIST); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE); } else { player->sendCancelMessage(RET_NOTPOSSIBLE); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); } return false; } bool TalkAction::guildJoin(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player || !g_config.getBool(ConfigManager::INGAME_GUILD_MANAGEMENT)) return false; std::string param_ = param; trimString(param_); if(!player->getGuildId()) { uint32_t guildId; if(IOGuild::getInstance()->getGuildId(guildId, param_)) { if(player->isGuildInvited(guildId)) { IOGuild::getInstance()->joinGuild(player, guildId); player->sendTextMessage(MSG_EVENT_GUILD, "You have joined the guild."); char buffer[80]; sprintf(buffer, "%s has joined the guild.", player->getName().c_str()); if(ChatChannel* guildChannel = g_chat.getChannel(player, CHANNEL_GUILD)) guildChannel->talk("", MSG_CHANNEL_HIGHLIGHT, buffer); } else player->sendCancel("You are not invited to that guild."); } else player->sendCancel("There's no guild with that name."); } else player->sendCancel("You are already in a guild."); return true; } bool TalkAction::guildCreate(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player || !g_config.getBool(ConfigManager::INGAME_GUILD_MANAGEMENT)) return false; if(player->getGuildId()) { player->sendCancel("You are already in a guild."); return true; } std::string param_ = param; trimString(param_); if(!isValidName(param_)) { player->sendCancel("That guild name contains illegal characters, please choose another name."); return true; } uint32_t minLength = g_config.getNumber(ConfigManager::MIN_GUILDNAME), maxLength = g_config.getNumber(ConfigManager::MAX_GUILDNAME); if(param_.length() < minLength) { player->sendCancel("That guild name is too short, please select a longer name."); return true; } if(param_.length() > maxLength) { player->sendCancel("That guild name is too long, please select a shorter name."); return true; } uint32_t guildId; if(IOGuild::getInstance()->getGuildId(guildId, param_)) { player->sendCancel("There is already a guild with that name."); return true; } const uint32_t levelToFormGuild = g_config.getNumber(ConfigManager::LEVEL_TO_FORM_GUILD); if(player->getLevel() < levelToFormGuild) { std::stringstream stream; stream << "You have to be at least Level " << levelToFormGuild << " to form a guild."; player->sendCancel(stream.str().c_str()); return true; } const int32_t premiumDays = g_config.getNumber(ConfigManager::GUILD_PREMIUM_DAYS); if(player->getPremiumDays() < premiumDays && !g_config.getBool(ConfigManager::FREE_PREMIUM)) { std::stringstream stream; stream << "You need to have at least " << premiumDays << " premium days to form a guild."; player->sendCancel(stream.str().c_str()); return true; } player->setGuildName(param_); IOGuild::getInstance()->createGuild(player); std::stringstream stream; stream << "You have formed guild \"" << param.c_str() << "\"!"; player->sendTextMessage(MSG_EVENT_GUILD, stream.str().c_str()); return true; } bool TalkAction::thingProporties(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player) return false; const Position& pos = getNextPosition(player->getDirection(), player->getPosition()); Tile* tile = g_game.getTile(pos); if(!tile) { player->sendTextMessage(MSG_STATUS_SMALL, "No tile found."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return true; } Thing* thing = tile->getTopVisibleThing(creature); if(!thing) { player->sendTextMessage(MSG_STATUS_SMALL, "No object found."); g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); return true; } boost::char_separator<char> sep(" "); tokenizer tokens(param, sep); std::string invalid; for(tokenizer::iterator it = tokens.begin(); it != tokens.end();) { std::string action = parseParams(it, tokens.end()); toLowerCaseString(action); if(Item* item = thing->getItem()) { if(action == "set" || action == "add" || action == "new") { std::string type = parseParams(it, tokens.end()), key = parseParams(it, tokens.end()), value = parseParams(it, tokens.end()); if(type == "integer" || type == "number" || type == "int" || type == "num") item->setAttribute(key.c_str(), atoi(value.c_str())); else if(type == "float" || type == "double") item->setAttribute(key.c_str(), (float)atof(value.c_str())); else if(type == "bool" || type == "boolean") item->setAttribute(key.c_str(), booleanString(value)); else item->setAttribute(key.c_str(), value); } else if(action == "erase" || action == "remove" || action == "delete") item->eraseAttribute(parseParams(it, tokens.end()).c_str()); else if(action == "action" || action == "actionid" || action == "aid") { int32_t tmp = atoi(parseParams(it, tokens.end()).c_str()); if(tmp > 0) item->setActionId(tmp); else item->resetActionId(); } else if(action == "unique" || action == "uniqueid" || action == "uid") { int32_t tmp = atoi(parseParams(it, tokens.end()).c_str()); if(tmp >= 1000 || tmp <= 0xFFFF) item->setUniqueId(tmp); } else if(action == "destination" || action == "position" || action == "pos" || action == "dest" || action == "location" || action == "loc") //TODO: doesn't work { if(Teleport* teleport = item->getTeleport()) teleport->setDestination(Position(atoi(parseParams(it, tokens.end()).c_str()), atoi( parseParams(it, tokens.end()).c_str()), atoi(parseParams(it, tokens.end()).c_str()))); } else { std::stringstream s; s << action << " (" << parseParams(it, tokens.end()) << ")"; invalid += s.str(); break; } } else if(Creature* _creature = thing->getCreature()) { if(action == "health") _creature->changeHealth(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "maxhealth") _creature->changeMaxHealth(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "mana") _creature->changeMana(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "maxmana") _creature->changeMaxMana(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "basespeed") _creature->setBaseSpeed(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "droploot") _creature->setDropLoot((lootDrop_t)atoi(parseParams(it, tokens.end()).c_str())); else if(action == "lossskill") _creature->setLossSkill(booleanString(parseParams(it, tokens.end()))); else if(action == "storage") _creature->setStorage(parseParams(it, tokens.end()), parseParams(it, tokens.end())); else if(action == "cannotmove") { _creature->setNoMove(booleanString(parseParams(it, tokens.end()))); _creature->onWalkAborted(); } else if(action == "skull") { _creature->setSkull(getSkulls(parseParams(it, tokens.end()))); g_game.updateCreatureSkull(_creature); } else if(action == "shield") { _creature->setShield(getShields(parseParams(it, tokens.end()))); g_game.updateCreatureShield(_creature); } else if(action == "emblem") { _creature->setEmblem(getEmblems(parseParams(it, tokens.end()))); g_game.updateCreatureEmblem(_creature); } else if(action == "speaktype") _creature->setSpeakType((MessageClasses)atoi(parseParams(it, tokens.end()).c_str())); else if(Player* _player = _creature->getPlayer()) { if(action == "fyi") _player->sendFYIBox(parseParams(it, tokens.end()).c_str()); else if(action == "tutorial") _player->sendTutorial(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "guildlevel") _player->setGuildLevel((GuildLevel_t)atoi(parseParams(it, tokens.end()).c_str())); else if(action == "guildrank") _player->setRankId(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "guildnick") _player->setGuildNick(parseParams(it, tokens.end()).c_str()); else if(action == "group") { uint16_t tmp = atoi(parseParams(it, tokens.end()).c_str()); if(tmp >= player->getGroupId()) { invalid = "security failure - you can set only lower group than your own!"; break; } else _player->setGroupId(tmp); } else if(action == "vocation") _player->setVocation(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "sex" || action == "gender") _player->setSex(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "town" || action == "temple") { if(Town* town = Towns::getInstance()->getTown(parseParams(it, tokens.end()))) { _player->setMasterPosition(town->getPosition()); _player->setTown(town->getID()); } } else if(action == "marriage" || action == "partner") _player->marriage = atoi(parseParams(it, tokens.end()).c_str()); else if(action == "balance") _player->balance = atoi(parseParams(it, tokens.end()).c_str()); else if(action == "rates") _player->rates[atoi(parseParams(it, tokens.end()).c_str())] = atof( parseParams(it, tokens.end()).c_str()); else if(action == "idle") _player->setIdleTime(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "stamina") _player->setStaminaMinutes(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "capacity" || action == "cap") _player->setCapacity(atoi(parseParams(it, tokens.end()).c_str())); else if(action == "execute") g_talkActions->onPlayerSay(_player, atoi(parseParams(it, tokens.end()).c_str()), parseParams(it, tokens.end()), booleanString(parseParams(it, tokens.end()))); else if(action == "saving" || action == "save") _player->switchSaving(); else { std::stringstream s; s << action << " (" << parseParams(it, tokens.end()) << ")"; invalid += s.str(); break; } } /*else if(Npc* _npc = _creature->getNpc()) { } else if(Monster* _monster = _creature->getMonster()) { }*/ else { std::stringstream s; s << action << " (" << parseParams(it, tokens.end()) << ")"; invalid += s.str(); break; } } } if(invalid.empty()) { const SpectatorVec& list = g_game.getSpectators(pos); SpectatorVec::const_iterator it; Player* tmpPlayer = NULL; for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer())) tmpPlayer->sendUpdateTile(tile, pos); } for(it = list.begin(); it != list.end(); ++it) (*it)->onUpdateTile(tile, pos); } else { std::string tmp = "Following action was invalid: " + invalid; player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, tmp.c_str()); } g_game.addMagicEffect(pos, MAGIC_EFFECT_WRAPS_GREEN); return true; } bool TalkAction::banishmentInfo(Creature* creature, const std::string&, const std::string& param) { Player* player = creature->getPlayer(); if(!player) return false; StringVec params = explodeString(param, ","); std::string what = "Account"; trimString(params[0]); Ban ban; ban.type = BAN_ACCOUNT; if(params.size() > 1) { trimString(params[1]); if(params[0].substr(0, 1) == "p") { what = "Character"; ban.type = BAN_PLAYER; ban.param = PLAYERBAN_BANISHMENT; ban.value = atoi(params[1].c_str()); if(!ban.value) { IOLoginData::getInstance()->getGuidByName(ban.value, params[1], true); if(!ban.value) ban.value = IOLoginData::getInstance()->getAccountIdByName(params[1]); } } else { ban.value = atoi(params[1].c_str()); if(!ban.value) { IOLoginData::getInstance()->getAccountId(params[1], ban.value); if(!ban.value) ban.value = IOLoginData::getInstance()->getAccountIdByName(params[1]); } } } else { ban.value = atoi(params[0].c_str()); if(!ban.value) { IOLoginData::getInstance()->getAccountId(params[0], ban.value); if(!ban.value) ban.value = IOLoginData::getInstance()->getAccountIdByName(params[0]); } } if(!ban.value) { toLowerCaseString(what); player->sendCancel("Invalid " + what + (std::string)" name or id."); return true; } if(!IOBan::getInstance()->getData(ban)) { player->sendCancel("That player or account is not banished or deleted."); return true; } bool deletion = ban.expires <= 0; std::string admin = "Automatic "; if(!ban.adminId) admin += (deletion ? "deletion" : "banishment"); else IOLoginData::getInstance()->getNameByGuid(ban.adminId, admin, true); std::string end = "Banishment will be lifted at:\n"; if(deletion) end = what + (std::string)" won't be undeleted"; std::stringstream ss; ss << what.c_str() << " has been " << (deletion ? "deleted" : "banished") << " at:\n" << formatDateEx(ban.added, "%d %b %Y").c_str() << " by: " << admin.c_str() << ".\nThe comment given was:\n" << ban.comment.c_str() << ".\n" << end.c_str() << (deletion ? "." : formatDateEx(ban.expires).c_str()) << "."; player->sendFYIBox(ss.str().c_str()); return true; } bool TalkAction::diagnostics(Creature* creature, const std::string&, const std::string&) { Player* player = creature->getPlayer(); if(!player) return false; #ifdef __ENABLE_SERVER_DIAGNOSTIC__ std::stringstream s; s << "Server diagonostic:" << std::endl; player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, s.str()); s.str(""); s << "World:" << std::endl << "--------------------" << std::endl << "Player: " << g_game.getPlayersOnline() << " (" << Player::playerCount << ")" << std::endl << "Npc: " << g_game.getNpcsOnline() << " (" << Npc::npcCount << ")" << std::endl << "Monster: " << g_game.getMonstersOnline() << " (" << Monster::monsterCount << ")" << std::endl << std::endl; player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, s.str()); s.str(""); s << "Protocols:" << std::endl << "--------------------" << std::endl << "ProtocolGame: " << ProtocolGame::protocolGameCount << std::endl << "ProtocolLogin: " << ProtocolLogin::protocolLoginCount << std::endl #ifdef __OTADMIN__ << "ProtocolAdmin: " << ProtocolAdmin::protocolAdminCount << std::endl #endif << "ProtocolManager: " << ProtocolManager::protocolManagerCount << std::endl << "ProtocolStatus: " << ProtocolStatus::protocolStatusCount << std::endl << "ProtocolOld: " << ProtocolOld::protocolOldCount << std::endl << std::endl; player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, s.str()); s.str(""); s << "Connections:" << std::endl << "--------------------" << std::endl << "Active connections: " << Connection::connectionCount << std::endl << "Total message pool: " << OutputMessagePool::getInstance()->getTotalMessageCount() << std::endl << "Auto message pool: " << OutputMessagePool::getInstance()->getAutoMessageCount() << std::endl << "Queued message pool: " << OutputMessagePool::getInstance()->getQueuedMessageCount() << std::endl << "Free message pool: " << OutputMessagePool::getInstance()->getAvailableMessageCount() << std::endl; player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, s.str()); #else player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "Command not available, please rebuild your software with -D__ENABLE_SERVER_DIAG__"); #endif return true; } bool TalkAction::ghost(Creature* creature, const std::string&, const std::string&) { Player* player = creature->getPlayer(); if(!player) return false; if(player->hasFlag(PlayerFlag_CannotBeSeen)) { player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "Command disabled for players with special, invisibility flag."); return true; } SpectatorVec::iterator it; SpectatorVec list = g_game.getSpectators(player->getPosition()); Player* tmpPlayer = NULL; Condition* condition = NULL; if((condition = player->getCondition(CONDITION_GAMEMASTER, CONDITIONID_DEFAULT, GAMEMASTER_INVISIBLE))) { player->sendTextMessage(MSG_INFO_DESCR, "You are visible again."); IOLoginData::getInstance()->updateOnlineStatus(player->getGUID(), true); for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if((tmpPlayer = pit->second) && !tmpPlayer->canSeeCreature(player)) tmpPlayer->notifyLogIn(player); } for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player)) tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_TELEPORT); } player->removeCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_APPEAR); } else if((condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_GAMEMASTER, -1, 0, false, GAMEMASTER_INVISIBLE))) { player->addCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_DISAPPEAR); for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player)) tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); } for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if((tmpPlayer = pit->second) && !tmpPlayer->canSeeCreature(player)) tmpPlayer->notifyLogOut(player); } IOLoginData::getInstance()->updateOnlineStatus(player->getGUID(), false); if(player->isTrading()) g_game.internalCloseTrade(player); player->clearPartyInvitations(); if(player->getParty()) player->getParty()->leave(player); player->sendTextMessage(MSG_INFO_DESCR, "You are now invisible."); } return true; } bool TalkAction::software(Creature* creature, const std::string&, const std::string&) { Player* player = creature->getPlayer(); if(!player) return false; std::stringstream s; s << "The " << SOFTWARE_NAME << " Version: (" << SOFTWARE_VERSION << "." << MINOR_VERSION << "." << PATCH_VERSION << ")" << std::endl; s << REVISION_VERSION << std::endl; s << "Codename: (" << SOFTWARE_CODENAME << ")" << std::endl << std::endl; s << "Server Developers: " << SOFTWARE_DEVELOPERS << "." << std::endl; player->sendTextMessage(MSG_EVENT_ADVANCE, s.str()); s.str(""); s << "Libraries:" << std::endl << "--------------------" << std::endl << "Platform: " << BOOST_PLATFORM << " for arch " #if defined(__amd64__) || defined(_M_X64) "64 Bits" #elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) "32 Bits" #else "unk" #endif << std::endl << "Compiler: " << BOOST_COMPILER << std::endl << "Boost: " << BOOST_VERSION << std::endl << "ASIO: " << BOOST_ASIO_VERSION << std::endl << "XML: " << XML_DEFAULT_VERSION << std::endl << "Lua: " << LUA_VERSION << std::endl << "Tibia Client Version: " << CLIENT_VERSION_STRING << std::endl; player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, s.str()); return true; }
  19. @frankdias As que eu uso são as gramas claras, que tem no cliente de tibia versão alta (10x),essa da print é um recolor e é mais escura.
  20. https://tibiaking.com/forums/topic/47275-direção-de-ataque/
  21. Crypter postou uma resposta no tópico em Suporte Tibia OTServer
    Está faltando as actions basicas do tibia, baixa uma base e compara o actions.xml dessa outra base com o teu.
  22. Posta a script tpsystem.lua para que possamos achar o erro.
  23. local config = { removeOnUse = "no", usableOnTarget = "yes", -- can be used on target? (fe. healing friend) splashable = "yes", range = -1, area = {1, 1} -- if not set correctly, the message will be sent only to user of the item } local multiplier = { health = 1.0, mana = 1.0 } local potion_exhaustion = 123212 local POTIONS = { [8704] = {empty = 7636, splash = 42, rate = 0.5,exhaustion = 2.5}, vocations = {4, 8}, -- small health potion [7618] = {empty = 7636, splash = 42, rate = 0.5,exhaustion = 3.5}, vocations = {4, 8}, -- health potion [7588] = {empty = 7634, splash = 42, rate = 1.5,exhaustion = 4.5 ,level = 50, vocations = {4, 8}, vocStr = "knights and paladins"}, -- strong health potion [7591] = {empty = 7635, splash = 42, rate = 2.5,exhaustion = 5.5, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion [8473] = {empty = 7635, splash = 42, rate = 3.0,exhaustion = 6.5, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion [7620] = {empty = 7636, splash = 47, rateMana = 1.5,exhaustion = 6.5}, -- mana potion [7589] = {empty = 7634, splash = 47, rateMana = 2.5,exhaustion = 6.5, level = 50, vocations = {1, 2, 5, 6}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion [7590] = {empty = 7635, splash = 47, rateMana = 3.5,exhaustion = 6.5, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion [8472] = {empty = 7635, splash = 43, rate = 1, rateMana = 1.5,exhaustion = 6.5, level = 80, vocations = {3, 7}, vocStr = "paladins"} -- great spirit potion } for index, potion in pairs(POTIONS) do if(type(index) == 'number')then for k, v in pairs(config) do if(not potion[k]) then potion[k] = v end end if(potion.removeOnUse) then potion.removeOnUse = getBooleanFromString(potion.removeOnUse) end if(potion.usableOnTarget) then potion.usableOnTarget = getBooleanFromString(potion.usableOnTarget) end if(potion.splashable) then potion.splashable = getBooleanFromString(potion.splashable) end if(type(potion.health) == 'table' and table.maxn(potion.health) > 1) then potion.health[1] = math.ceil(potion.health[1] * multiplier.health) potion.health[2] = math.ceil(potion.health[2] * multiplier.health) else potion.health = nil end if(type(potion.mana) == 'table' and table.maxn(potion.mana) > 1) then potion.mana[1] = math.ceil(potion.mana[1] * multiplier.mana) potion.mana[2] = math.ceil(potion.mana[2] * multiplier.mana) else potion.mana = nil end POTIONS[index] = potion end end function onUse(cid, item, fromPosition, itemEx, toPosition) local potion = POTIONS[item.itemid] if(not potion) then return false end if(not isPlayer(itemEx.uid) or (not potion.usableOnTarget and cid ~= itemEx.uid)) then if(not potion.splashable or not potion.splash) then return false end if(toPosition.x == CONTAINER_POSITION) then toPosition = getThingPosition(item.uid) end return true end if(((potion.level and getPlayerLevel(itemEx.uid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(itemEx.uid)))) and not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES)) then doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_MONSTER, false, cid) return true end if exhaustion.check(potion_exhaustion) then return doPlayerSendCancel(cid,"Wait "..exhaustion.get(potion_exhaustion).." seconds.") end if(potion.range > 0 and cid ~= itemEx.uid and getDistanceBetween(getThingPosition(cid), getThingPosition(itemEx.uid)) > potion.range and not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_CANUSEFAR)) then doPlayerSendDefaultCancel(cid, RETURNVALUE_TOOFARAWAY) return true end local playerlevel = getPlayerLevel(itemEx.uid) if(potion.rateMana and not doTargetCombatMana(0, itemEx.uid, playerlevel*potion.rateMana, playerlevel*potion.rateMana, CONST_ME_MAGIC_BLUE)) then return false end if(potion.rate and not doTargetCombatHealth(0, itemEx.uid, COMBAT_HEALING, playerlevel*potion.rate, playerlevel*potion.rate, CONST_ME_MAGIC_BLUE)) then return false end if(type(potion.area) == 'table' and table.maxn(potion.area) > 1) then for i, tid in ipairs(getSpectators(getThingPosition(itemEx.uid), potion.area[1], potion.area[2])) do if(isPlayer(tid)) then doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_MONSTER, false, tid) end end else doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_MONSTER, false, itemEx.uid) if(itemEx.uid ~= cid) then doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_MONSTER, false, cid) end end exhaustion.set(potion_exhaustion,potion.exhaustion) return true end
  24. Aperta ctrl+t ( Pra abri o terminal ) e vê te mostra algum erro, recomendo você sempre usar a ultima versão do otc

Informação Importante

Confirmação de Termo