Ir para conteúdo

kaiquegabriel

Membro
  • Registro em

  • Última visita

Tudo que kaiquegabriel postou

  1. Olá, to criando um projeto 8.0 mas to tendo uns problemas com as tables do Znote. Meu problema é o seguinte: Acredito eu, que o site esteja inteiro configurado a alguma coisa que faz com que as minhas tabelas tenham um tamanho fixo independente da informação contida dentro dela, pode ser duas letras ou um texto, por exemplo: eu consigo alterar o tamanho das primeiras, mas quando altero o tamanho da última, ela se redimensiona automaticamente, deixando todas do mesmo tamanho: o code que estou usando: <?php require_once 'engine/init.php'; include 'layout/overall/header.php'; ?> <h1>Server Information</h1> <h4>Experience:</h4> <?php $path = '/home/pedrola2/global/'; echo '<table border="1" cellpadding="0"><tr class="yellow"><td style="width: 100px"><center>From level:</center></td><td style="width: 100px"><center>To level:</center></td><td style="width: 100px"><center>Exp:</center></td></tr>'; if (is_dir($path)) { $xml1 = simplexml_load_file($path."data/XML/stages.xml"); foreach ($xml1->world->children() as $stage1) { if ($stage1['maxlevel'] == '') { $stage1['maxlevel'] = 'higher than 181'; } echo '<tr><td><center>'.$stage1['minlevel'].'</center></td><td><center>'.$stage1['maxlevel'].'</center></td><td><center>'.$stage1['multiplier'].'</center></td></tr>'; } $word = 'a'; $loadconfig = file($path.'/config.lua'); $key = 'rateMagic'; $key2 = 'rateLoot'; $key3 = 'rateSkill'; $found = false; foreach ($loadconfig as $lineNumber => $e) { if (strpos($e,$key) !== false) { $found = true; break; } } foreach ($loadconfig as $lineNumberr => $ee) { if (strpos($ee,$key2) !== false) { $found = true; break; } } foreach ($loadconfig as $lineNumberrr => $eee) { if (strpos($eee,$key3) !== false) { $found = true; break; } } echo '<table><h4>Skills:</h1></tr>'; if ($found) { echo '<table border="1" cellpadding="0"><tr class="yellow"><td style="width: 100px"><center>Magic:</center></td><td><center>Skills:</center></td><td><center>Loot:</center></td></tr>'; echo '<tr><td><center>2x</center></td><td><center>3x</center></td><td><center>1x custom</center></td></tr>'; } $getallplayers = mysql_query("SELECT COUNT(*) as MAX FROM players"); $parseallplayers = mysql_fetch_assoc($getallplayers); $getallaccounts = mysql_query("SELECT COUNT(*) as MEX FROM accounts"); $parseallaccounts = mysql_fetch_assoc($getallaccounts); $getallguilds = mysql_query("SELECT COUNT(*) as MOX FROM guilds"); $parseallguilds = mysql_fetch_assoc($getallguilds); echo '</table></tr>'; echo '<table cellpadding="0"><tr class="yellow"><td><center>Total accounts</center></td><td><center>Total players</center></td><td><center>Total guilds</center></td></tr>'; echo '<tr><td><center>'.$parseallplayers['MAX'].'</center></td><td><center>'.$parseallaccounts['MEX'].'</center></td><td><center>'.$parseallguilds['MOX'].'</center></td></tr>'; echo '</table></tr>'; $talkactions = simplexml_load_file($path.'/data/talkactions/talkactions.xml'); echo '<table cellpadding="0"><tr class="yellow"><td><center>Player commands</center></td></center></tr>'; foreach ($talkactions as $commands) { if (empty($commands['access'])) { echo '<center><tr><td><center>'.$commands['words'].'</center></td></tr></center>'; } } echo '</table></tr>'; } else { echo '<br><b>Invalid path!</b>'; } ?> <?php include 'layout/overall/footer.php'; ?>
  2. .Qual servidor ou website você utiliza como base? TFS 04 Qual o motivo deste tópico? Preciso de um OTclient do ZERO e não manjo nada. Galera, to pra abrir um servidor OLD e preciso criar um OTclient do zero mas não manjo absolutamente nada (não é pra nada absurdo, é só pra evitar uso de bots)
  3. Cara, não vale a pena comprar códigos e outras coisas de OTserver na internet e nem de ninguém com a quantidade de material que a gente tem disponível na internet. Sobre a segunda pergunta eu também não recomendo, acredito ser dois trabalhos já que você quer que o servidor lote (e mesmo se não lotasse). Abrir servidor em Windows hoje é furada, o servidor não responde bem, nada responde bem. A única coisa que da pra você fazer no windows que não altera (muito difícil) migrando pra linux é mexer em scripts, talkactions, creaturescripts. Então da sim pra você arrumar um servidor na sua casa, abrir ele num VPS Linux depois, testar durante um tempo pra ver se ta respondendo bem e aí sim, lançar. A opção do Google Cloud te ajudaria MUITO já que é um VPS do google gratuito no período de três meses.
  4. Tive um problema recentemente ao tentar compilar com dev-c++ no meu computador onde ele nem se quer abria as opções do painel (alt+p). Porém, consegui solucionar ele e to aqui exatamente pra ajudar quem tiver passando por esse problema. Pesquisei MUITO em todos os forums de OTserver, no site do DEV e não encontrei nada, porém encontrei pela microsoft. Vamos lá, primeiro abriremos: painel de controle > sistema > configurações avançadas do sistema Na aba "avançado" clicaremos em "configurações" no menu "desempenho". Feito isso, iremos até a aba "Prevenção de Execução de Dados" marcaremos a segunda caixinha (Ativar a DEP para todos os programas e serviçoes, exceto os que eu selecionar:) e depois adicionaremos o Executável do DEV nesse menu. Clica em Aplicar e em seguida em OK. Creditos: Microsoft.
  5. Galera, to criando um client próprio e já peguei base de diversos clients que não acusam vírus. Megatibia, underwar, o próprio Tibia e tudo mais, fui fazendo alguns testes pra ver o porque o meu acusava vírus... Ele começa a acusar assim que eu troco os IPs do executável com Notepad++ pra poder logar no meu servidor sem IP changer, alguém consegue solucionar? Ou vender a solução?
  6. Olá, gostaria de uma ajudinha pra conseguir colocar um fundo ali no centro onde fica o characters, igual ao fundo do menu lateral. Onde mexo no css? Se alguém quiser me ajudar com site inteiro posso ajudar com algo simbólico.
  7. kaiquegabriel postou uma resposta no tópico em Formação de Equipe
    Procuro quem manje de tudo de Znote, desde layout quanto configuração.
  8. Diga em poucas palavras a base utilizada (Nome do servidor ou nome do website). TFS 0.4 Qual erro está surgindo/O que você procura? Tempo do frag não está correto, queria que o frag caisse a cada 12 horas mas não to conseguindo alterar.
  9. @Brunds já testei de todas as formas pelo config lua :s Natanael disse que um globalevents talvez resolvesse
  10. Galera, é o seguinte.. meu servidor já esta online e estou tendo problemas com stamina. Atualmente ela se encontra assim TFS 0.4 rateStaminaLoss = 1 rateStaminaGain = 3 rateStaminaThresholdGain = 12 staminaRatingLimitTop = 40 * 60 staminaRatingLimitBottom = 14 * 60 staminaLootLimit = 14 * 60 rateStaminaAboveNormal = 2.0 rateStaminaUnderNormal = 0.5 staminaThresholdOnlyPremium = true O problema é que ela ta levando muito tempo pra subir, já tentei fazer por globalevents mas não consegui resultado. Quando coloquei uma multiplicação, deixei rateStaminaLoss = 60*1000 a stamina pulou do 41:50 pra 7h50, esse teste foi pra ver se tava respeitando o config lua e realmente está. O tempo de perca ta normal, 1 por minuto. Mas ninguém ganha 1 minuto quando fica offline 3 minutos. Posso pagar se o problema for sanado.
  11. Olá, utilizo TFS 0.4 e queria que minhas spells de conjurar runas não pudessem ser utilizadas dentro da área PZ. Tem jogador runando de dentro da house.
  12. Se for utilizar o mesmo que o meu, não vai funcionar do mesmo jeito..
  13. galera, meu pagseguro ta enviando os pontos automaticamente, porém independente do valor da compra, ele só envia 1 ponto.. Como resolvo isso?
  14. Galera, bolei tudo o que consegui da minha inquisition que resolvi implementar no servidor mas não to conseguindo por nada criar o sistema de teleports assim que morrem os bosses. Alguém consegue me ajudar? Funciona da seguinte forma: existem algumas salas de bosses que quando eles morrem, cria um teleport X em um lugar pra ir pro lugar Y e ele dura 3 minutos no mapa Preciso de uma função que crie o teleport pra ir pra tal lugar, espere um tempo e remova ele, criando um outro teleport em cima pra ir pro main room da quest (caso outro time esteja indo fazer nao passar direto sem matar o boss) tenho uma certa urgência, meu servidor lança amanhã, rs
  15. Galera, como eu subo esse número de inauguração? Ele ta pelo latestnews.php
  16. o problema do char ser free, deslogar e ir pro templo foi resolvido, só que quando acaba a premium ele não loga @EDIT Consegui resolver o erro acima, mas agora quando o char acaba a premium e fica free, ele sempre loga no templo.
  17. Eu achei que já existisse uma storage desse tipo internamente no servidor, tipo nas sources ou algo do tipo.. Encontrei mais erros e editei o tópico
  18. Bom galera, to com um probleminha no meu script de fimpremium, ele vai funcionar da seguinte forma: Assim que acabar a premium do player, ele vai ser teleportado pro templo de Thais, vai ser colocado o outfit citizen com as cores padrões nele, CHECAR se tem house ou guildhouse, remover CASO TENHA house ou guildhouse avisar que a premium dele acabou com uma mensagem em branco na tela. O que ta acontecendo no script que eu tenho, é que todos os players free account que logam, são teleportados pro templo e recebem a mensagem. Não tem uma verificação de que ele era premium e não é mais, se um free acc deslogar e logar ele vai parar no templo. O outfit também não esta mudando. Ele não verifica se tem house, então sempre tenta tirar a house do player dando um errozinho no log. Segue script: function onLogin(cid) local house = getHouseByPlayerGUID(getPlayerGUID(cid)) local pos = {x=32369, y=32241, z=7} -- pos onde será teleportado local outfit = getCreatureOutfit(cid) if not isPremium(cid) then doPlayerSendTextMessage(cid, 22, "mensagem aqui.") doPlayerAddOutfit(cid, outfit, 1) setHouseOwner(house, 0) doTeleportThing(cid, pos) end return true end
  19. @KotZletY //////////////////////////////////////////////////////////////////////// // 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(!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&, 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; }
  20. Olá amigos! Estou com um problema no meu sistema de sellhouse e queria saber se alguém pode me ajudar.. eu uso a função por talkaction e a função é "houseSell", não é um arquivo .lua acontece que no meu servidor apenas jogadores premium podem comprar house e até ai tudo bem, porém se for uma negociação entre players, um player free acaba podendo comprar house de um player premium porque não existe a verificação do comprador ser ou não premium nessa função houseSell. Acredito que seja algo nas sources mas não to conseguindo encontrar solução...
  21. kaiquegabriel postou uma resposta no tópico em Suporte Tibia OTServer
    Cês conseguem me guiar até uma solução?
  22. kaiquegabriel postou uma resposta no tópico em Suporte Tibia OTServer
    Diga em poucas palavras a base utilizada (Nome do servidor ou nome do website). Ex. TFS 1.3; Base: TFS 0.4 Qual erro está surgindo/O que você procura? Galera, maioria dos itens que da USE não estão funcionando aqui no meu servidor, lampadas nao apagam/acendem, alavancas não mexem, itens como magic lightwand também não.. 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.
  23. kaiquegabriel postou uma resposta no tópico em Suporte Tibia OTServer
    na verdade ele é em XML por enquanto, mas o LUA dele só faz ele ficar alterando o próprio outfit. local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local interval = 2 -- in seconds function onThink() local npc = getNpcCid() addEvent(function() if isCreature(npc) then doCreatureChangeOutfit(npc, {lookType = (getCreatureOutfit(npc).lookType == 80 and 51 or 80)}) end end, interval*1000) npcHandler:onThink() end npcHandler:addModule(FocusModule:new())
  24. kaiquegabriel postou uma resposta no tópico em Suporte Tibia OTServer
    E ai galera, tudo bem? Há muito tempo que não apareço pelo fórum mas ainda considero que seja o melhor servidor de ATS da atualidade. Precisava fazer um pedido. Seguinte, tenho um NPC que compra todos os itens a um preço X, mas preciso que esse mesmo NPC verifique se é um player premmium account, se for, ele compra os itens a um preço maior do que free accounts. não preciso do XML, apenas o LUA
  25. Olá a todos, meu nome é Kaique e to procurando uma boa equipe pra iniciar um projeto global sério. Ideia: Fazer um projeto global full com algumas missões, missões de outfit, imbuement, prey, tibia coins e store. Eu sou um investidor e vou pagar um VPS pra testar e trabalhar em cima do projeto, depois de tudo pronto contrato um bom dedicado pra abrir o servidor. TODA PARTE FINANCEIRA é de minha responsabilidade, só preciso de alguém que saiba mexer com site, alguém que compile tudo pra linux e um scripter pra me ajudar a fixar alguns bugs. O lucro do servidor vai ser dividido entre todos. Eu vou começar com os investimentos. Renda atual pra investimento: R$ 1.800,00 Já comprei um ano de domínio e tá funcionando, só direcionar pro IP do dedicado quando contratado. Ideia de exp stages: 1-8 = 10x (rookstayers, able to start in free cityes) 9-30 = 35x 31-50 = 30x 51-80 = 25x 81-100 = 20x 101-140 = 17x 141-170 = 14x 171-200 = 12x 201-240 = 10x 241-270 = 5x 271-300 = 3x 301-350 = 2x 351+ = 1,5x _____________________________________________________________ O servidor não vai possuir itens e nem cidades vip, o lucro virá de acordo com itens que se podem conseguir ingame, outfits, xp boost e montarias. Claro que uma conta vip vai ter um pouco mais de benefício que uma free (venda de item mais caro, redução de morte menor, mais ganho de xp, etc) Quem tiver interesse da um reply aqui em baixo ou manda mensagem direta!

Informação Importante

Confirmação de Termo