Zero 0 #1 Posted March 26, 2007 Olá galera, esse é mais um código do Simple Age OTServ que eu desenvolvi. Esse código foi idealizado por Vufusuf. Esses três comandos para GameMasters são bastante úteis, pois lembrar das coordenadas é complicado. Não está entendendo? Vou resumir: Você está no local que você quer gravar as coordenadas. Você dá o comando /recordpos nome_do_registro, exemplo: /recordpos OrcFortress. Feito isso o registro de teleporte estará salvo, e sempre que quiser basta utilizar o comando /tpos OrcFortress para ir até a coordenada registrada. Agora ainda temos o /delpos para deletar registros. Sem mais, vamos ao código. Em commands.h, adicione as funções junto as demais: bool recordPosition(Creature *creature, const std::string& cmd, const std::string& param); bool teleportToRecordedPosition(Creature *creature, const std::string& cmd, const std::string& param); bool deleteTeleportRecord(Creature *creature, const std::string& cmd, const std::string& param); Em commands.cpp, adicione as funções: bool Commands::deleteTeleportRecord(Creature *creature, const std::string& cmd, const std::string& param){ std::stringstream spath; spath << g_config.getString(ConfigManager::DATA_DIRECTORY) << "teleport\\" << param << ".txt"; if(fileExists(spath.str().c_str())){ remove(spath.str().c_str()); std::string sret = "Registro " + param + " apagado."; creature->getPlayer()->sendTextMessage(MSG_STATUS_SMALL, sret); creature->getPlayer()->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, sret); return true; } else{ std::string sret = "Registro " + param + " não encontrado."; creature->getPlayer()->sendTextMessage(MSG_STATUS_SMALL, sret); creature->getPlayer()->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, sret); return false; } } bool Commands::recordPosition(Creature *creature, const std::string& cmd, const std::string& param){ std::stringstream spath; spath << g_config.getString(ConfigManager::DATA_DIRECTORY) << "teleport\\" << param << ".txt"; if(fileExists(spath.str().c_str())){ std::string sret = "Registro " + param + " já existe."; creature->getPlayer()->sendTextMessage(MSG_STATUS_SMALL, sret); creature->getPlayer()->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, sret); return false; } std::ofstream recordposFile(spath.str().c_str(), std::ios_base::out); recordposFile << creature->getPosition().x << "," << creature->getPosition().y << "," << creature->getPosition().z; recordposFile.close(); std::stringstream sret; sret << "Posição " << param << " registrada."; creature->getPlayer()->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, sret.str().c_str()); return true; } bool Commands::teleportToRecordedPosition(Creature *creature, const std::string& cmd, const std::string& param){ if(!creature->getPlayer()) return false; std::string s; char c; std::stringstream spath; spath << g_config.getString(ConfigManager::DATA_DIRECTORY) << "teleport\\" << param << ".txt"; std::ifstream recordposFile(spath.str().c_str(), std::ios_base::in); if(!recordposFile){ std::string sret = "Registro " + param + " não encontrado."; creature->getPlayer()->sendTextMessage(MSG_STATUS_SMALL, sret); creature->getPlayer()->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, sret); return false; } while(!recordposFile.eof()){ recordposFile.get(c); if(!recordposFile.eof()){ s += c; }; } recordposFile.close(); boost::char_separator<char> sepc(","); tokenizer stokens(s, sepc); tokenizer::iterator sit = stokens.begin(); Position tPos; tPos.x = atoi((*sit).c_str()); sit++; tPos.y = atoi((*sit).c_str()); sit++; tPos.z = atoi((*sit).c_str()); Tile *tileToGo = game->getTile(tPos.x, tPos.y, tPos.z); if(!tileToGo || game->internalTeleport(creature, tileToGo->getTilePosition()) != RET_NOERROR){ creature->getPlayer()->sendTextMessage(MSG_STATUS_SMALL, "Coordenada inválida"); creature->getPlayer()->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "Coordenada inválida"); return false; } else game->addMagicEffect(tileToGo->getTilePosition(), NM_ME_ENERGY_AREA); return true; } E no vetor de comandos adicione: {"/recordpos",&Commands::recordPosition}, {"/tpos",&Commands::teleportToRecordedPosition}, {"/delpos",&Commands::deleteTeleportRecord}, Para encerrarmos com o command.cpp, junto as diretivas #include. Caso ainda não exista uma igual a esta, adicione: #include <fstream> Em data\commands.xml adicione as linhas: <command cmd="/tpos" access="3" /> <command cmd="/recordpos" access="3" /> <command cmd="/delpos" access="3" /> Altere o acesso para qual você quiser, por padrão 3 é para god, 2 para GameMasters e 1 para tutor. Agora crie uma pasta chamada "teleport" dentro da pasta "data" do seu servidor. Os registros serão salvos em data\teleport\nome_do_registro.txt. Testado e aprovado na SVN 24/02 Esse e diversos outros tópicos denunciam que você pode esperar muito do Simple Age OTServ. Abraços! Share this post Link to post
bruxo 0 #2 Posted March 26, 2007 Pqp Zero, acho que esse é um dos melhores codes que eu já vi aqui o.O. Acho que a única coisa que falta pra melhorar isso é que esses records vão para um log que você pode editar por lá, entendeu? Mas mesmo assim esse code é MUITO BOM, valeu por liberar ^^. Share this post Link to post
Zero 0 #3 Posted March 26, 2007 Muito bem lembrado bruxo, vou editar o tópico. Esqueci de avisar que os registros vão para a pasta data\teleport. ^^ E é muito fácil editar os registros já que no arquivo só tem as coordenadas. Exemplo, registro teste: Originally posted by teste.txt1777,1661,7 Abraços! Share this post Link to post
Vufusuf 1 #4 Posted March 26, 2007 Eita pipoco, dei a idéia agora poco tu ja fez. Rapidin eim ^^ Só uma dúvida Zero. Exemplo: O Gm Vufusuf, da um "/recordpos DemonHell", Todos os Gms poderão dar "/tpos DemonHell"? ou cada GM tem sua lista de cordenatas gravadas? Share this post Link to post
Zero 0 #5 Posted March 26, 2007 Programei para todos os GMs utilizarem os mesmos registros, mas é fácil de fazer registros privados. Abraços! Share this post Link to post
Jackson Zani 1 #6 Posted March 26, 2007 Ótimo code Zero! Muito bom mesmo hehehe ! Abraços. Share this post Link to post
Lordfire 111 #7 Posted March 26, 2007 caramba Zero vc é, desculpe, FODAAAAA! mo bom esse code nao squeça qu tem que add no command.xml! pelo mnos aqui nao pegou! Share this post Link to post
Dr0p 0 #8 Posted March 26, 2007 Muito bom! Como sempre Zero(Strider) fazendo ótimos codes, tanto pra VB quanto pra OT, é isso ae Share this post Link to post
Zero 0 #9 Posted March 26, 2007 Obrigado galera, mas eu não fiz nada mais nada menos que codificar. Qualquer desenvolvedor faria isso, já ter essa idéia é algo mais difícil, por isso devemos parabenizar nosso amigo Vufusuf. ^^ Aqui funcionou sem adicionar no commands.xml, mas em todo caso adicionarei esse comentário ao tópico também. Abraços! Share this post Link to post
Sakz 0 #10 Posted March 26, 2007 @Zero Um Dois... eae cara... meu deus como vc faz isso O.o eu sempre quis isso na epoca q eu tinha meu ot x) eu usava o /goto "algum monstro" ateh axa o lugar x) vlw ae! (funciona em todas versoes?) flw Share this post Link to post
DuDz 0 #11 Posted March 26, 2007 Zero, inovando em cada um de seus codes! Muito bom, mesmo. Vai facilitar bastante. Podem esperar isso, e muito mais no SimpleAge OTServ, que vem aí pra revolucionar o mundo dos OTServ. Abraços, //DuD Share this post Link to post
Zero 0 #12 Posted March 26, 2007 Sanu, eu desenvolvi no SVN 24/02 que é um dos mais recentes SVNs e é para a versão 7.92 do Tibia Client, se funciona em outras versões com esse mesmo código, não estou apto a te dizer. Mas como eu não utilizei códigos restritos a versão 7.92 do Tibia Client, acho que deve funcionar em quase todas as SVNs. A menos que algum dos códigos antigos tenha sido modificado. Abraços! Share this post Link to post
Dr0p 0 #13 Posted March 26, 2007 Deu alguns erros: commands.cpp: In member function `bool Commands::recordPosition(Creature*, const std::string&, const std::string&)': commands.cpp:1698: error: variable `std::ofstream recordposFile' has initializer but incomplete type commands.cpp: In member function `bool Commands::teleportToRecordedPosition(Creature*, const std::string&, const std::string&)': commands.cpp:1712: error: variable `std::ifstream recordposFile' has initializer but incomplete type Share this post Link to post
Zero 0 #14 Posted March 26, 2007 Obrigado por reportar Dr0p. Havia me esquecido de avisa-los que se faz necessário a inclusão do header iostream. Utilize: #include <fstream> Abraços! Share this post Link to post
Arcavier 0 #15 Posted March 26, 2007 O.o eu ja tinha compilado e deu certo antes de vc posta este include EDIT a pod cre acabei d conferi aki e ja estava incluido Share this post Link to post
Dr0p 0 #16 Posted March 27, 2007 Aee, agora deu certinho =) Adicionei no meu ot :B Share this post Link to post
lews 0 #17 Posted March 27, 2007 mto boa ideia! soh uma dica: seria melhor q as posiçoes ficassem gravadas num unico arkivo xml na pasta data. Share this post Link to post
Zero 0 #18 Posted March 27, 2007 lews, pensei em colocar os registros em um unico arquivo sim. Mesmo que não fosse XML. Mas como também desenvolvi um comando para deletar registros achei mais fácil desenvolver dessa forma. Mas é provável que até o Simple Age sair já esteja programado melhor. Acontece que no começo do projeto é meio corrido. Share this post Link to post
Guest be mine #19 Posted March 27, 2007 alguem me ajuda como eu faço pra axa comands.cpp esses negocios so novo me ajudem plx :? :?: Share this post Link to post
Raphael Carnaúba 1 #20 Posted March 27, 2007 Otimo code zero, eu ja fiz igual so que diferente é um Teleport List em XML feito pra nova SVN Share this post Link to post