Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////////////////////////////////////////////////////////////////////////
- // 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 <boost/config.hpp>
- #include <boost/version.hpp>
- #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 "configmanager.h"
- #include "game.h"
- #include "chat.h"
- #include "tools.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();
- }
- TalkActions::~TalkActions()
- {
- clear();
- }
- void TalkActions::clear()
- {
- for(TalkActionsMap::iterator it = talksMap.begin(); it != talksMap.end(); ++it)
- delete it->second;
- talksMap.clear();
- m_interface.reInitState();
- }
- 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 sep;
- if(!readXMLString(p, "separator", sep) || sep.empty())
- sep = ";";
- StringVec strVector = explodeString(talkAction->getWords(), sep);
- for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it)
- {
- trimString(*it);
- talkAction->setWords(*it);
- if(talksMap.find(*it) != talksMap.end())
- {
- if(!override)
- {
- std::cout << "[Warning - TalkAction::configureEvent] Duplicate registered talkaction with words: " << (*it) << std::endl;
- continue;
- }
- else
- 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 cmdstring[TALKFILTER_LAST] = words, paramstring[TALKFILTER_LAST] = "";
- size_t loc = words.find('"', 0);
- if(loc != std::string::npos && loc >= 0)
- {
- cmdstring[TALKFILTER_QUOTATION] = std::string(words, 0, loc);
- paramstring[TALKFILTER_QUOTATION] = std::string(words, (loc + 1), (words.size() - (loc - 1)));
- trimString(cmdstring[TALKFILTER_QUOTATION]);
- }
- loc = words.find(" ", 0);
- if(loc != std::string::npos && loc >= 0)
- {
- cmdstring[TALKFILTER_WORD] = std::string(words, 0, loc);
- paramstring[TALKFILTER_WORD] = std::string(words, (loc + 1), (words.size() - (loc - 1)));
- size_t sloc = words.find(" ", ++loc);
- if(sloc != std::string::npos && sloc >= 0)
- {
- cmdstring[TALKFILTER_WORD_SPACED] = std::string(words, 0, sloc);
- paramstring[TALKFILTER_WORD_SPACED] = std::string(words, (sloc + 1), (words.size() - (sloc - 1)));
- }
- }
- TalkAction* talkAction = NULL;
- for(TalkActionsMap::iterator it = talksMap.begin(); it != talksMap.end(); ++it)
- {
- if(it->first == cmdstring[it->second->getFilter()] || (!it->second->isSensitive() &&
- !strcasecmp(it->first.c_str(), cmdstring[it->second->getFilter()].c_str())))
- {
- talkAction = it->second;
- break;
- }
- }
- if(!talkAction || (talkAction->getChannel() != -1 && talkAction->getChannel() != channelId))
- return false;
- Player* player = creature->getPlayer();
- StringVec exceptions = talkAction->getExceptions();
- if(player && ((!ignoreAccess && std::find(exceptions.begin(), exceptions.end(), asLowerCaseString(
- player->getName())) == exceptions.end() && talkAction->getAccess() > player->getAccess())
- || player->isAccountManager()))
- {
- if(player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges))
- {
- player->sendTextMessage(MSG_STATUS_SMALL, "You cannot execute this talkaction.");
- return true;
- }
- return false;
- }
- if(talkAction->isLogged())
- {
- if(player)
- player->sendTextMessage(MSG_STATUS_CONSOLE_RED, words.c_str());
- Logger::getInstance()->eFile("talkactions/" + creature->getName() + ".log", words, true);
- }
- if(talkAction->isScripted())
- return talkAction->executeSay(creature, cmdstring[talkAction->getFilter()], paramstring[talkAction->getFilter()], channelId);
- if(TalkFunction* function = talkAction->getFunction())
- return function(creature, cmdstring[talkAction->getFilter()], paramstring[talkAction->getFilter()]);
- return false;
- }
- TalkAction::TalkAction(LuaScriptInterface* _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;
- }
- bool TalkAction::configureEvent(xmlNodePtr p)
- {
- std::string strValue;
- if(readXMLString(p, "words", strValue))
- m_words = strValue;
- else
- {
- std::cout << "[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::cout << "[Warning - TalkAction::configureEvent] Unknown filter for TalkAction: " << strValue << ", using default." << std::endl;
- }
- int32_t intValue;
- if(readXMLInteger(p, "access", intValue))
- m_access = intValue;
- if(readXMLInteger(p, "channel", intValue))
- m_channel = intValue;
- if(readXMLString(p, "log", strValue) || readXMLString(p, "logged", strValue))
- m_logged = booleanString(strValue);
- if(readXMLString(p, "hide", strValue) || readXMLString(p, "hidden", 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)
- {
- std::string tmpFunctionName = asLowerCaseString(functionName);
- if(tmpFunctionName == "housebuy")
- m_function = houseBuy;
- else if(tmpFunctionName == "housesell")
- m_function = houseSell;
- else if(tmpFunctionName == "housekick")
- m_function = houseKick;
- else if(tmpFunctionName == "housedoorlist")
- m_function = houseDoorList;
- else if(tmpFunctionName == "houseguestlist")
- m_function = houseGuestList;
- else if(tmpFunctionName == "housesubownerlist")
- m_function = houseSubOwnerList;
- else if(tmpFunctionName == "thingproporties")
- m_function = thingProporties;
- else if(tmpFunctionName == "banishmentinfo")
- m_function = banishmentInfo;
- else if(tmpFunctionName == "diagnostics")
- m_function = diagnostics;
- else if(tmpFunctionName == "addskill")
- m_function = addSkill;
- else if(tmpFunctionName == "ghost")
- m_function = ghost;
- else if(tmpFunctionName == "addloot")
- m_function = lootAdd;
- else if(tmpFunctionName == "removeloot")
- m_function = lootRemove;
- else if(tmpFunctionName == "visionloot")
- m_function = lootVision;
- else if(tmpFunctionName == "autoheal")
- m_function = autoHeal;
- else
- {
- std::cout << "[Warning - TalkAction::loadFunction] Function \"" << 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;
- 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
- {
- 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::cout << "[Error - TalkAction::executeSay] Call stack overflow." << std::endl;
- return 0;
- }
- }
- bool TalkAction::houseBuy(Creature* creature, const std::string& cmd, const std::string& param)
- {
- 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;
- }
- HouseTile* houseTile = tile->getHouseTile();
- if(!houseTile)
- {
- 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 = houseTile->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->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(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);
- 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& cmd, 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;
- }
- 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(!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(!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& cmd, 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& cmd, const std::string& param)
- {
- 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& cmd, const std::string& param)
- {
- 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& cmd, const std::string& param)
- {
- 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::thingProporties(Creature* creature, const std::string& cmd, 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")
- {
- std::string key = parseParams(it, tokens.end()), value = parseParams(it, tokens.end());
- if(atoi(value.c_str()) || value == "0")
- item->setAttribute(key, atoi(value.c_str()));
- else
- item->setAttribute(key, value);
- }
- else if(action == "erase" || action == "remove")
- item->eraseAttribute(parseParams(it, tokens.end()));
- 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") //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 == "cannotmove")
- _creature->setNoMove(booleanString(parseParams(it, tokens.end())));
- else if(action == "skull")
- {
- _creature->setSkull(getSkull(parseParams(it, tokens.end())));
- g_game.updateCreatureSkull(_creature);
- }
- else if(action == "speaktype")
- _creature->setSpeakType((SpeakClasses)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")
- _player->setGroupId(atoi(parseParams(it, tokens.end()).c_str()));
- 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 == "stamina")
- _player->setStaminaMinutes(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 == "balance")
- _player->balance = atoi(parseParams(it, tokens.end()).c_str());
- else if(action == "marriage" || action == "partner")
- _player->marriage = 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 == "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
- {
- std::stringstream s;
- s << action << " (" << parseParams(it, tokens.end()) << ")";
- invalid += s.str();
- break;
- }
- }
- }
- 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);
- g_game.addMagicEffect(pos, MAGIC_EFFECT_WRAPS_GREEN);
- if(invalid.empty())
- return true;
- std::string tmp = "Following action was invalid: " + invalid;
- player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, tmp.c_str());
- return true;
- }
- bool TalkAction::banishmentInfo(Creature* creature, const std::string& cmd, 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";
- char buffer[500 + ban.comment.length()];
- sprintf(buffer, "%s has been %s at:\n%s by: %s,\nfor the following reason:\n%s.\nThe action taken was:\n%s.\nThe comment given was:\n%s.\n%s%s.",
- what.c_str(), (deletion ? "deleted" : "banished"), formatDateShort(ban.added).c_str(), admin.c_str(), getReason(ban.reason).c_str(),
- getAction(ban.action, false).c_str(), ban.comment.c_str(), end.c_str(), (deletion ? "." : formatDateShort(ban.expires, true).c_str()));
- player->sendFYIBox(buffer);
- return true;
- }
- bool TalkAction::diagnostics(Creature* creature, const std::string& cmd, const std::string& param)
- {
- Player* player = creature->getPlayer();
- if(!player)
- return false;
- return true;
- }
- bool TalkAction::addSkill(Creature* creature, const std::string& cmd, const std::string& param)
- {
- Player* player = creature->getPlayer();
- if(!player)
- return false;
- StringVec params = explodeString(param, ",");
- if(params.size() < 2)
- {
- player->sendTextMessage(MSG_STATUS_SMALL, "Command requires at least 2 parameters.");
- return true;
- }
- uint32_t amount = 1;
- if(params.size() > 2)
- {
- std::string tmp = params[2];
- trimString(tmp);
- amount = (uint32_t)std::max(1, atoi(tmp.c_str()));
- }
- std::string name = params[0], skill = params[1];
- trimString(name);
- trimString(skill);
- Player* target = NULL;
- ReturnValue ret = g_game.getPlayerByNameWildcard(name, target);
- if(ret != RET_NOERROR)
- {
- player->sendCancelMessage(ret);
- return true;
- }
- if(skill[0] == 'l' || skill[0] == 'e')
- target->addExperience(uint64_t(Player::getExpForLevel(target->getLevel() + amount) - target->getExperience()));
- else if(skill[0] == 'm')
- target->addManaSpent((uint64_t)(target->getVocation()->getReqMana(target->getMagicLevel() +
- amount) - target->getSpentMana()), false);
- else
- {
- skills_t skillId = getSkillId(skill);
- target->addSkillAdvance(skillId, (uint32_t)(target->getVocation()->getReqSkillTries(skillId, target->getSkill(skillId,
- SKILL_LEVEL) + amount) - target->getSkill(skillId, SKILL_TRIES)), false);
- }
- return true;
- }
- bool TalkAction::ghost(Creature* creature, const std::string& cmd, const std::string& param)
- {
- Player* player = creature->getPlayer();
- if(!player)
- return false;
- if(player->hasFlag(PlayerFlag_CannotBeSeen))
- {
- player->sendTextMessage(MSG_INFO_DESCR, "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(!pit->second->canSeeCreature(player))
- pit->second->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(!pit->second->canSeeCreature(player))
- pit->second->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::lootAdd(Creature* creature, const std::string& cmd, const std::string& param)
- {
- if(param.empty())
- return true;
- assert(creature);
- Player* player = creature->getPlayer();
- if(!player || player->isRemoved())
- return true;
- if(!player->isPremium())
- {
- player->sendTextMessage(MSG_INFO_DESCR, "Only players with premium account can use this command.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- int32_t itemId = Item::items.getItemIdByName(param);
- const ItemType* item = Item::items.getElement(itemId);
- if(!item)
- {
- player->sendTextMessage(MSG_INFO_DESCR, "This item are not exist.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- std::string itemList;
- player->getStorage(AUTOLOOT_STORAGE, itemList);
- if(itemList == "-1")
- itemList.clear();
- if(!itemList.empty())
- {
- StringVec itemsList = explodeString(itemList, ";");
- if(itemsList.size() >= (player->isPremium() ? 20 : 5))
- {
- player->sendTextMessage(MSG_INFO_DESCR, "You can't add more items to list.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- for(uint16_t i = 0; i < itemsList.size(); ++i)
- {
- if(atoi(itemsList[i].c_str()) == itemId)
- {
- player->sendTextMessage(MSG_INFO_DESCR, "You already have this item in your auto loot list.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- }
- }
- std::ostringstream itemVector;
- itemVector << itemList << (itemList.empty() ? "" : ";") << itemId;
- player->sendTextMessage(MSG_INFO_DESCR, "Your list are updated.");
- player->setStorage(AUTOLOOT_STORAGE, itemVector.str());
- return true;
- }
- bool TalkAction::lootRemove(Creature* creature, const std::string& cmd, const std::string& param)
- {
- if(param.empty())
- return true;
- assert(creature);
- Player* player = creature->getPlayer();
- if(!player || player->isRemoved())
- return true;
- if(!player->isPremium())
- {
- player->sendTextMessage(MSG_INFO_DESCR, "Only players with premium account can use this command.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- if(param == "all")
- {
- player->setStorage(AUTOLOOT_STORAGE, "-1");
- player->sendTextMessage(MSG_INFO_DESCR, "Your is cleared.");
- }
- else
- {
- int32_t itemId = Item::items.getItemIdByName(param);
- const ItemType* item = Item::items.getElement(itemId);
- if(!item)
- {
- player->sendTextMessage(MSG_INFO_DESCR, "This item is not exist.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- std::string itemList, newItemList;
- player->getStorage(AUTOLOOT_STORAGE, itemList);
- if(itemList == "-1")
- itemList.clear();
- if(itemList.empty())
- {
- player->sendTextMessage(MSG_INFO_DESCR, "Your list is empty.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- StringVec itemsList = explodeString(itemList, ";");
- bool foundItem = false;
- for(uint16_t i = 0; i < itemsList.size(); ++i)
- {
- if(atoi(itemsList[i].c_str()) == itemId)
- {
- foundItem = true;
- continue;
- }
- newItemList += (newItemList.empty() ? "" : ";") + itemsList[i];
- }
- if(foundItem)
- player->sendTextMessage(MSG_INFO_DESCR, "Your list is updated.");
- else
- player->sendTextMessage(MSG_INFO_DESCR, "You no have this item in your list.");
- player->setStorage(AUTOLOOT_STORAGE, newItemList);
- }
- return true;
- }
- bool TalkAction::lootVision(Creature* creature, const std::string& cmd, const std::string& param)
- {
- assert(creature);
- Player* player = creature->getPlayer();
- if(!player || player->isRemoved())
- return true;
- if(!player->isPremium())
- {
- player->sendTextMessage(MSG_INFO_DESCR, "Only players with premium account can use this command.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- std::string itemList;
- player->getStorage(AUTOLOOT_STORAGE, itemList);
- if(itemList == "-1")
- itemList.clear();
- if(itemList.empty())
- {
- player->sendTextMessage(MSG_INFO_DESCR, "Your list are empty.");
- g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF);
- return true;
- }
- std::ostringstream message;
- StringVec itemsList = explodeString(itemList, ";");
- for(uint16_t i = 0; i < itemsList.size(); ++i)
- {
- const ItemType* item = Item::items.getElement(atoi(itemsList[i].c_str()));
- if(!item)
- continue;
- message << (message.str().empty() ? "" : "\n") << item->name;
- }
- player->sendFYIBox(message.str());
- return true;
- }
- bool TalkAction::autoHeal(Creature* creature, const std::string& cmd, const std::string& param)
- {
- Player* player = creature->getPlayer();
- if(!player)
- return false;
- if(param.empty())
- return false;
- StringVec autoHeal = explodeString(param, ",");
- if(autoHeal.size() < 3)
- return false;
- std::string name = asLowerCaseString(autoHeal[0]);
- uint16_t id = 0;
- AutoHealPriority_t priority = PRIORITY_STATUS_NONE;
- if(name == "herowater")
- {
- id = 11372;
- priority = PRIORITY_STATUS_LOW;
- }
- else if(name == "premiumherowater")
- {
- id = 11373;
- priority = PRIORITY_STATUS_MEDIUM;
- }
- else if(name == "pill")
- {
- id = 11394;
- priority = PRIORITY_STATUS_HIGH;
- }
- else if(name == "sake")
- {
- id = 11393;
- priority = PRIORITY_STATUS_TOP;
- }
- if(id == 0)
- return false;
- std::string type = autoHeal[1];
- AutoHealMode_t mode = HEAL_STATUS_NONE;
- if(type == "health" || type == "hp")
- mode = HEAL_STATUS_HEALTH;
- else if(type == "mana" || type == "mp")
- mode = HEAL_STATUS_MANA;
- if(mode == HEAL_STATUS_NONE)
- return false;
- uint16_t value = atoi(autoHeal[2].c_str());
- if(value > 100)
- value = 100;
- AutoHealVector autoHealVector = player->getAutoHealVector();
- if(autoHealVector.empty())
- autoHealVector.push_back(AutoHeal_t(id, value, priority, mode));
- else
- {
- bool found = false;
- for(AutoHealVector::iterator it = autoHealVector.begin(); it != autoHealVector.end(); ++it)
- {
- if((*it).id == id)
- {
- (*it).health = value;
- (*it).status = mode;
- found = true;
- break;
- }
- }
- if(!found)
- autoHealVector.push_back(AutoHeal_t(id, value, priority, mode));
- }
- std::ostringstream stringValue;
- for(AutoHealVector::iterator it = autoHealVector.begin(); it != autoHealVector.end(); ++it)
- {
- if(!stringValue.str().empty())
- stringValue << ",";
- stringValue << (*it).id << "," << (*it).health << "," << (*it).priority << "," << (*it).status;
- }
- player->setStorage(AUTO_HEAL_STORAGE, stringValue.str());
- player->setAutoHealVector(autoHealVector);
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment