Ir para conteúdo

honux

Campones
  • Total de itens

    71
  • Registro em

  • Última visita

Tudo que honux postou

  1. Bom, agora vamos começar a trabalhar com espaço e argumentos. Lembra na aula passada quando eu expliquei instance ( ou objeto )? Bom, agora então vamos começar a falar de espaço, e como conseqüência, espaço da Instance. Espaço ( scope ), é basicamente o local que ele se situa. Eu separo um programa em 2 scopes, o Global e o Local. Scopes Globais são inicializados fora de funções e eles só são destruidos ( executa o destructor ) apenas o final de main ( já executou todas as funções necessárias ), um exemplo de um Scope Global seria o nosso "Planeta Terra;" da lição anterior, ele é executado antes da função main e somente é destruido após do término da mesma. Scopes Globais são aqueles que duram somente o tempo da função ou do bloco de condição que ele se encontra. #include <iostream>class Planeta {public: Planeta (int i) { std::cout << "Ola de " << i << ".\n"; } ~Planeta () { std::cout << "Tchau.\n"; }};Planeta Terra (1);int main(){ Planeta Marte (2); std::cout << "Ola de Main!\n";} Vamos novamente ver o nosso programa de baixo para cima. Função Main Lembra de como eu ensinei vocês a declarar um Instance ( Objeto )? eu enganei vocês, pois na verdade é : Classe Nome_do_Objeto ( Variáveis ); Sendo cada variável separada por uma Vírgula, Ex.: Humano Adriano ( 16, 67 ); Agora, porque enganei vocês? Simples, porque caso eu falasse isso vocês iriam fazer um "( )", então o programa não funcionaria. Existem alguns casos no qual você não pode utilizar os parênteses em branco ( vazio ), um desses casos é esse. agora vamos olhar para nosso instance já indentificado e compreendido. Planeta Marte (2); Planeta, chama a classe no qual ele vai utilizar. Marte, o nome escolhido. (2), variável a ser enviada ao constructor. Toda vez que um instance é declarado com alguma variável, essa variável vai para o constructor, e não para alguma variável declarada dentro do constructor ou da classe. Nesse caso, Marte é um Scope local, pois logo em seguida que a função acaba ele é destruído. std::cout << "Ola de Main!\n"; uma simples chamada da função cout para escrever a mensagem na tela. Scope Global Existe somente um, o " Planeta Terra (1); ", que já foi explicado. Lembre que este instance será destruido somente após o término da função main. Class Aparece somente 2 coisas novas, o " int i " dentro dos parênteses do nosso constructor e o " << i << ". O " int i " é a declaração de uma variável, ainda não vamos aprofundar nisso, somente vou dar uma explicação básica. Int é como se declara uma variável, int é um ' declarador ' cujo mesmo só aceita variáveis inteiras, e o conceito de scopes continua ativo nas variáveis, somente é válida no scope no qual ela se situa, basicamente isso. Não se confunda pensando que utilizamos " int main () " significa obrigatóriamente que só aceita valores inteiros, veremos isso mais para frente quando vermos funções. Então pelo que já sabemos, o nosso constructor espera uma variável ( pois ele declarou uma! ), então ele utiliza a mesma para imprimi-la na tela depois. O " << i << " é uma forma de imprimir uma variável na tela, é só pensar, se " inicia um texto ( string ) e foi utilizado " << " antes de começar uma string, se vc fechar as aspas e colocar << vc estará inicando outro bloco de string, porém para pular linha vc necessita do "\n". Agora ao você compilar esse programa, você receberá a seguinte mensagem : Bom, nosso programa está funcionando, porém quem enviou o 1° Tchau e quem enviou o segundo ? Nós sabemos graça a explicação de scopes que eu passei ao começo da aula, mas e se nós estivessemos trabalhando com um programa mais complexo, como saberíamos? Então antes de arrumar essa falha vou voltar nos instances. Uma classe não é nada sem um instance, o instance então se torna a identidade de um novo instance em relação a classe. Não estou dizendo que a classe não é nada, mas sim que o instance não é nada sem a classe. Infelizmente o nosso destructor não é que nem o nosso constructor, quer dizer que pode ser declarado variáveis, ele infelizmente não pode. Se você tentar declarar alguma variável lá retornará um erro, pois destructors não podem haver argumentos. Então, como vamos fazer para mostrar ao Tchau a quem ele pertence já que não podemos declarar nada no destructor e não podemos utilizar a variável i que foi declarada no constructor, então só funcionará para o mesmo. Então vamos dar um pouco de memória ao programa da seguinte forma, adicionando uma segunda variável e trabalhando com ela. Dando memória a ele, ele ficará dessa maneira : #include <iostream>class Planeta {public: Planeta (int i) : _identidade (i) { std::cout << "Ola de " << i << ".\n"; } ~Planeta () { std::cout << "Tchau de " << _identidade << ".\n"; }private: const int _identidade;};Planeta Terra (1);int main(){ Planeta Marte (2); std::cout << "Ola de Main!\n";} Apareceu 3 novas coisas, 1° Private, isso significa que somente a classe em si poderá modificar esta variável; 2° const, isso significa que o valor da variável é constante, quer dizer após inicializado o valor permanecerá o mesmo até o término no programa; 3° " : _identidade (i) ", significa que o valor de _identidade será igual ao valor de i. Reparem também que eu utilizei um underline antes da variável, isso é simplismente por uma questão de entendimento, todas as variáveis que serão private virão com um underline antes do mesmo ( se você quiser pode utilizar sem, porém lembre da declaração que deve ser igual, pois o C++ é Case Sensitive, quer dizer "ab" é diferente de "aB" que é diferente de "Ab", assim sucessivamente ). Essa parte após os dois pontos, também é conhecida como " preamble ". Simples não? Para continuar, vou ensinar-lhes um loop. Ele funciona da seguinte maneira : for (função 1; função 2; função 3){ } sendo: função 1, a declaração de uma variável ( através do int, somente o que aprendemos até agora ); função 2, condição para continuar ( depois veremos todas as condições ); função 3, o que acontece caso for verdadeiro e o bloco de código for executado com sucesso. Caso não deseja utilizar uma das expressões necessárias apenas adicione o ; como se obtivesse uma. Ex.: for(int id = 3; id < 6;){ } Ex. 2: for(int id = 3; id < 6; id++){ } Lembrando que o for cria um scope local, quer dizer quando ele termina todas as variáveis utilizadas nele são destruidas. Vamos a um programa simples utilizando o for : #include <iostream>class Planeta {public: Planeta (int i) : _identidade (i) { std::cout << "Ola de " << i << ".\n"; } ~Planeta () { std::cout << "Tchau de " << _identidade << ".\n"; }private: const int _identidade;};Planeta Terra (1);int main(){ Planeta Marte (2); for (int i = 3; i < 6; ++i) { Planeta MeuMundo (i); } std::cout << "Ola de Main!\n";} Lembre-se sempre dos scopes, pois somente foi possível utilizar "Planeta MeuMundo (i)" pois após o término do loop do for ele checa se pode continuar, e nesse check é destruido o loop anterior e criado num novo loop, caso vc tentasse criar uma instance com um nome já apresentado anteriormente e o mesmo não foi destruído ( Ex.: Planeta Terra (i); sendo que i pode ser qualquer número inteiro ) irá retornar um erro dizendo que ele já foi declarado anteriormente. Por uma questão de estética e entedimento do programa, sempre utilize corretamente as chaves, nunca faça isso : for (int i = 3; i < 6; ++i) { // Não Faça isso! Planeta UmMundo(i);} Repare sempre como está organizado o pograma que eu repasso a vocês. Última coisa a aprender hoje : Há 2 formas de se comentar, uma é utilizando 2 barras transversais ( // ) que pegará todo o resto da linha, e será ignorado pelo compilador na hora de compilar, ou utilizando /* e */ respectivamente para o início e o fim do bloco comentado, excelente para utilizar no meio de bloco de códigos que somente é para lembrar algo, Ex.: for (int i = 3; i < 6 /* se i for menor que 6 continua */; ++i) { Planeta UmMundo(i);} Por hoje é só ^^ Lembrando... </span>
  2. honux

    Aulas De C++

    ~> Original em inglês (no qual essas aulas são baseadas): http://www.relisoft.com/book/ Todas as dúvidas deverão ser tiradas por MSN ou PM. Esse tutorial não segue normalmente as aulas " clássicas " de C++, onde simplismente apareceria uma mensagem " Olá Mundo ", mas aqui, vamos criar um mundo e fazer com que ele consiga responder a esse chamado, nos retornar uma resposta ( a longo prazo ). #include <iostream>class Planeta{public: Planeta () { std::cout << "Oi!\n"; } ~Planeta () { std::cout << "Tchau!\n"; }};Planeta Terra;int main() { } Esse programa é dividido em 4 partes, sendo elas : * Include; * Class; * Objeto; * Função Main; Include Este atributo serve para incluir alguma biblioteca ( lib ) ao programa. No caso do nosso programa, inclue o <iostream> que seria a lib utilizada para escrever na tela do programa. O include é chamado da seguinte maneira : #include <arquivo> Ex : #include <stdlib.h> Class Agora é um pouco mais complexo. Eu imagino da seguinte maneira, existe várias pessoas no planeta terra e todos contém características em comum, criando uma classe, a dos Humanos, dentro dessa classe vamos conter todas as características dos seres humanos, Nome, pele, altura, peso, idade, etc.. Objeto O Objeto que irá mostrar as diferenças entre as classes. Lembra daquela nossa classe, a dos Humanos? Então, pelo menos eu não sou igual a minha mãe, então é 2 instânceas diferentes, porém da mesma classe, então eu sou uma instância da classe dos Humanos. Um Objeto ( ou instância ) pode ser declarado da seguinte maneira: Classe Nome_do_Objeto; Ex: Planeta Marte; Função Main Bom, se você mostar somente a função main do nosso programa para algum programador ele irá falar que o nosso programa não faz nada. A função main é a função principal do programa, ela é a única função realmente obrigatória em qualquer programa. As funções contém um limite, e esse limite no caso é demarcado pelas chaves ( { e } ), no futuro estudaremos a fundo as funções. Agora vamos trabalhar com o que aprendemos até agora no nosso programa, vamos vê-lo de trás para frente, pois assim será mais fácil. int main() { } Essa é a função pricipal, mesmo sem nada dentro dela ( repare que as chaves estão vazias ) é obrigatória a sua presença no programa. Planeta Terra; Esse é o Objeto que foi declarado, que no nosso caso é a Terra. Repare como é feito, pegamos uma classe ( Planeta ), e declaramos um nome ( instância ) para fazê-lo diferente. Repare também que ele está fora de uma função, quer dizer ele é Global. Um termo ser Global significa que ele está fora de qualquer função, fora das chaves de limitação de uma função. class Planeta{public: Planeta () { std::cout << "Oi!\n"; } ~Planeta () { std::cout << "Tchau!\n"; }}; Agora vamos ver a classe Planeta, vamos ver linha por linha. class Planeta Cria uma classe e suas características, se você desejar também pode criar a classe dos humanos, vamos aprender a mecher com variáveis no futuro, para então realmente criar uma classe. Repare logo em seguida o " { " demarcando que existe um limite dessa função. public: Fala que o que vamos mecher é público. Imagine da seguinte maneira, uma conta de banco, Conta, depósitos, Retiradas, Saldo, etc., nenhum atributo da conta pode ser público, pois se não iríamos ver a conta do nosso amigo e rouba-lo . Vamos ver isso a fundo no Futuro também. Planeta () { std::cout << "Oi!\n"; } Isso é um 'constructor', vamos dizer, toda vez que um objeto dessa classe é criado será executado esse bloco de código. O constructor obrigatóriamente tem que ter o mesmo nome da classe, se a classe fosse Humano, o constructor também seria Humano. O constructor seria uma mini função, podendo conter atributos. std::cout << "Oi!\n"; É uma função que contém na lib iostream, se nós não tivessemos incluido a lib no começo do projeto não iriamos conseguir utilizar essa função, a função é simples de se usar : std::cout << "Mensagem"; Este pequeno bloco de código imprime a mensagem Oi! na tela, o " \n " seria uma nova linha. ~Planeta () { std::cout << "Tchau!\n"; } Isso é um 'destructor', quer dizer, esse code será executado toda vez que uma classe for destruída ( provavelmente quando fechar o programa ). O destructor é demarcado pelo ~ ( Til ) antes do constructor, e como já vimos ele envia a mensagem Tchau! a tela. #include <iostream> e nosso querido include que já falamos a respeito dele. Bom... Logo após compilar, vocês irão rodar o programa, e vcs perceberão que uma coisa preta abrirá, ficará por uma fração de segundo e depois sumirá. Por isso eu utilizo o command ( cmd ), para abri-lo vá em Iniciar, Executar, então digite " cmd " e abrirá uma janela do MS-DOS. Chegue até local do projeto e execute o arquivo .exe então vc poderá ver o que ocorreu. Utilizando os comandos : cd diretório vai até um diretório cd .. volta uma pasta dir lista todos os arquivos presentes no local que vc está. você deverá ver da seguinte maneira ( somente os diretórios diferentes ) Bem... Isso é tudo pessoal!~ </span> Então significa que não há o que postar, pois cada aula será seguida de um Post...
  3. sim... é só vc ler o code..
  4. @Bruxo não dá lag, é menor que uma fração de segundo por player...
  5. @frerety e colex eu tenho já com o decay, porém não vou publicar. @frerety faça um addEvent e uma função para o retornar o ID anterior...
  6. @kamusss dentro das sources. TODOS os codes nesta seção é necessário das sources, então caso vc não saiba o que é procure um tutorial. @GM_Trevor quando chegar em casa eu faço isso~
  7. Como do mesmo modo resolvi postar algumas funções para NPC's resolvi postar Spells q eu julgo necessário ( porém algumas inúteis ). Todas as funções são baseadas no CVS de 10/03/06 luaSetPlayerLight Muda o Light level do Player ( Falta o Decay ) int SpellScript::luaSetPlayerLight(lua_State *L){ unsigned char lvl = (unsigned char)lua_tonumber(L, -1); lua_pop(L,1); Spell* spell = getSpell(L); Creature* creature = spell->game->getCreatureByID((unsigned long)lua_tonumber(L, -1)); lua_pop(L,1); Player* player = dynamic_cast<Player*>(creature); if(player){ MagicEffectTargetClass magicTarget; magicTarget.offensive = false; magicTarget.drawblood = false; magicTarget.animationEffect = 0; magicTarget.attackType = ATTACK_NONE; magicTarget.hitEffect = 255; //NM_ME_NONE magicTarget.animationColor = 19; //GREEN if(player->getMana() < spell->getMana()){ magicTarget.damageEffect = 2; //NM_ME_PUFF magicTarget.manaCost = player->getPlayerInfo(PLAYERINFO_MAXMANA) + 1; //force not enough mana } else{ magicTarget.manaCost = spell->getMana(); magicTarget.damageEffect = 12; //NM_ME_MAGIC_ENERGIE = 12 } bool isSuccess = spell->game->creatureThrowRune(player, player->getPosition(), magicTarget); if(isSuccess) { LightInfo lightInfo; lightInfo.level = lvl; lightInfo.color = 215; player->setCreatureLight(lightInfo); spell->game->changeLight(player); } lua_pushnumber(L, 1); return 1; } lua_pushnumber(L, 0); return 1;}
  8. @GM Trevor me passe como está declarado nas sources se o player é PA ou não que eu faço esta parte do code para vc.
  9. @Zen confundi codes~ esse code ai tá bem feito sim.... eu vo começar a fazer o meu agora ~ :***
  10. confundi codes~
  11. @Survive não adiantaria descomentar o exp se não tem uma utilização ao mesmo hmm... se possível então confirme para mim se a função que rege mesmo o lost d exp é essa mesma, se não procure e faça as modificações... pq não é nada complexo...
  12. é isso mesmo. vc poderia agora verificar se junto aos outros declarados do Creature existe experience? se não existir mude essa função para o player.cpp ou procure a outra no qual corresponde a mesma.
  13. @survive você poderia me mandar como está a sua função 'getlostexp~' ?? pois está retornando um erro dizendo que não foi encontrada a experiência do player, caso vc saiba algo em C++ porque não vê como está declarado o player e adicione -> para pegar a exp do mesmo?
  14. @Addict kem dera kra hj eu já sei fz esse code umas 3 vezes menor hahaha.... e isso td eh code q qualker um consegue fazer, se fosse algo difícil... mais sab como eh neh kra, melhor libera do q alguem faça antes de vc
  15. Bom, como eu sai da equipe que eu tava, resolvi começar a liberar alguns codes que eu havia feito para a mesma. Infelizmente não darei suporte ao code, pois não é nada tão difícil de fazer e compreender mesmo. Ahhh.... : Opnião Própria -> Code útil para servidores de RPG, onde realmente tem que se procurar coisas, descobrir passagens e tudo mais. Créditos : Honux ( ou Kyo ). NÃO PERMITO O POST DESTE CÓDIGO EM NENHUM OUTRO FÓRUM ALÉM DO OTFANS. QUER DIZER, ESTE CODE NÃO PODERÁ SER POSTADO NO OTN00BBR. Esse code está faltando apenas o 'decay' dos grounds modificados pelo code, que eu havia começado a fazer mas como eu sai da equipe eu parei de fazer. O que o code faz: Você sabe que nem em filme quando um cara chega na frente da estante e fala " Abra Cadabra " e abre uma passagem secreta? A mesma coisa, porém como está incompleto a passagem não fecha. Também é possível criar items, sumonar npcs e monstros além da passagem. Protocol: 7.6 na função : bool Game::internalCreatureSay(Creature* creature, SpeakClasses type, const std::string& text) abaixo de : //First, check if this was a command for(int i = 0; i < commandTags.size(); i++){ if(commandTags[i] == text.substr(0,1)){ return commands.exeCommand(creature, text); } } adicione : Player *player = dynamic_cast<Player *>(creature);Tile* tile = player->getTile();if(tile->isSpecialArea() && IsSpecialWords(text, creature)){ player->sendTextMessage(MSG_BLUE_TEXT, "A Secret Passage has been open!");} agora no final adicione : void Game::doSpecialAreaList(int x, int y, int z, int id, std::string words, std::string files){specialarea[id][0] = x;specialarea[id][1] = y;specialarea[id][2] = z;word[id] = words;file[id] = files;}bool Game::IsSpecialWords(const std::string& text, Creature* creature){Position pos = creature->getPosition();for(int specialarea_list = 0; specialarea_list < 100; specialarea_list++){ if(pos.x == specialarea[specialarea_list][0] && pos.y == specialarea[specialarea_list][1] && pos.z == specialarea[specialarea_list][2] && word[specialarea_list] == text){ ReturnFileName(specialarea_list); return true; }}return false; }bool Game::loadSpecialAreas() { std::string file="data/Special Areas/Special_Areas.xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc) { xmlNodePtr root, tmp; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"SpecialAreas")) { xmlFreeDoc(doc); return -1; } tmp = root->children; while(tmp) { if (strcmp((const char*) tmp->name, "area")==0){ unsigned int id = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id")); unsigned int x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); unsigned int y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); unsigned char z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); std::string text = (const char*)xmlGetProp(tmp, (const xmlChar *) "words");; std::string file = (const char*)xmlGetProp(tmp, (const xmlChar *) "file");; doSpecialAreaList(x, y, z, id, text, file); Tile* tile = map->getTile(x, y, z); if (tile){ tile->setFlag(TILESTATE_SPECIALAREA); } } tmp=tmp->next; } xmlFreeDoc(doc); return 0; } return -1;}int Game::ReturnFileName(int id){loadSpecialID(file[id], id);}bool Game::loadSpecialID(std::string safile, int id) { std::string file="data/Special Areas/"+safile+".xml"; xmlDocPtr doc; doc = xmlParseFile(file.c_str()); if (doc) { xmlNodePtr root, tmp, tmw; root = xmlDocGetRootElement(doc); if (xmlStrcmp(root->name, (const xmlChar*)"SpecialAreas")) { xmlFreeDoc(doc); return -1; } tmp = root->children; while(tmp) { //well... lets add an Item if (strcmp((const char*) tmp->name, "item")==0){ unsigned int item_id = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id")); unsigned int item_count = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "count")); unsigned int item_oldid = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "oldid")); unsigned int item_x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); unsigned int item_y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); unsigned int item_z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); unsigned int item_time = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "time")); AddnewItem(id, item_id, item_count, item_oldid, item_x, item_y, item_z, item_time); } // well, the ground should be the same but... i like to make the things bigger hahaha if (strcmp((const char*) tmp->name, "ground")==0){ unsigned int item_id = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "id")); unsigned int item_oldid = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "oldid")); unsigned int item_x = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); unsigned int item_y = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); unsigned int item_z = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); unsigned int item_time = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "time")); AddnewItem(id, item_id, 0, item_oldid, item_x, item_y, item_z, item_time); } if (strcmp((const char*) tmp->name, "monster")==0){ std::string npc_name = (const char*) xmlGetProp(tmp, (const xmlChar*) "name"); unsigned int posx = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); unsigned int posy = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); unsigned int posz = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); SummonNPC(npc_name, posx, posy, posz, 1); } if (strcmp((const char*) tmp->name, "npc")==0){ std::string npc_name = (const char*) xmlGetProp(tmp, (const xmlChar*) "name"); unsigned int posx = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "x")); unsigned int posy = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "y")); unsigned int posz = atoi((const char*) xmlGetProp(tmp, (const xmlChar*) "z")); SummonNPC(npc_name, posx, posy, posz, 0); } tmp=tmp->next; } xmlFreeDoc(doc); return 0; } return -1;}void Game::AddnewItem(int area_id, int id, int count, int oldid, int x, int y, int z, int time){if(donotdothat[area_id] == 0){ Tile* tile = map->getTile(x, y, z);if(count != 0){ Item* item = Item::CreateItem(id); internalAddItem(tile, item); addEvent(makeTask(1000, boost::bind(&Game::AddnewItem, this, area_id, id, 0, oldid, x, y, z, time))); donotdothat[area_id] = 1;}else{ Item* item = Item::CreateItem(id, count); internalAddItem(tile, item);}}else if(donotdothat[area_id] == 1){ Tile* tile = map->getTile(x, y, z); Item* newground = Item::CreateItem(oldid); internalAddItem(tile, newground); donotdothat[area_id] = 0;}} void Game::SummonNPC(std::string name, int x, int y, int z, int kind){Position pos;pos.x = x;pos.y = y;pos.z = z;if(kind == 0){Npc* npc = new Npc(name); if(!npc->isLoaded()) delete npc; if(!placeCreature(pos, npc)) delete npc;}else{Monster* npc = Monster::createMonster(name);if(!npc)delete npc;if(!placeCreature(pos, npc))delete npc;}} game.h Em baixo de "Public" adicione : bool IsSpecialWords(const std::string& text, Creature* creature); void doSpecialAreaList(int x, int y, int z, int id, std::string words, std::string files); void AddnewItem(int area_id, int id, int count, int oldid, int x, int y, int z, int time); void SummonNPC(std::string name, int x, int y, int z, int kind); bool loadSpecialID(std::string file, int id); int ReturnFileName(int id); bool loadSpecialAreas(); int specialarea[100][3]; std::string word[100]; std::string file[100]; int donotdothat[100]; tile.cpp procure por : void Tile::setPz(){ setFlag(TILESTATE_PROTECTIONZONE);} adicione após : bool Tile::isSpecialArea() const{ return hasFlag(TILESTATE_SPECIALAREA);} tile.h após : TILESTATE_HOUSE = 2 adicione uma vírgula no final do 2 e isto no final: TILESTATE_SPECIALAREA = 3 ficando assim : enum tileflags_t{ TILESTATE_NONE = 0, TILESTATE_PROTECTIONZONE = 1, TILESTATE_HOUSE = 2, TILESTATE_SPECIALAREA = 3}; após: void setPz(); adicione : bool isSpecialArea() const; otserv.cpp procure por: std::pair<unsigned long, unsigned long> IpNetMask; IpNetMask.first = inet_addr("127.0.0.1"); IpNetMask.second = 0xFFFFFFFF; serverIPs.push_back(IpNetMask); antes adicione : std::cout << ":: Loading Special Areas ... "; if(g_game.loadSpecialAreas()){ ErrorMessage("Could not load Special_Areas.xml ...!"); return -1; } std::cout << "[done]" << std::endl; acho que postei todas as funções. Agora crie uma pasta dentro da sua pasta data com o nome de "Special Areas", dentro dela um arquivo XML chamado "Special_Areas". um exemplo de arquivo Special_Areas.xml Special_Areas.xml <?xml version="1.0"?><SpecialAreas><area id="1" x="30" y="36" z="7" words="test" file="1"/><area id="2" x="31" y="36" z="7" words="testa" file="2"/></SpecialAreas> os arquivos a serem lidos serão respectivamente o "file" escrito. exemplo da área 1 ( anterior ): 1.xml <?xml version="1.0"?><SpecialAreas><ground id="405" oldid="407" x="32" y="39" z="7" time="100"/></SpecialAreas> Existe 4 funções para você utilizar no XML da Area Respectiva : <ground id="ID_NO_QUAL_VAI_MUDAR" oldid="NÃO_FUNFA" x="POSIÇÃO_X" y="POSIÇÃO_Y" z="POSIÇÃO_Z" time="NÃO_FUNFA"/> <item id="ID_NO_QUAL_VAI_MUDAR" count="QUANTIDADE_OU_TIPO_DO_ITEM" oldid="NÃO_FUNFA" x="POSIÇÃO_X" y="POSIÇÃO_Y" z="POSIÇÃO_Z" time="NÃO_FUNFA"/> <monster name="NOME_DO_MONSTRO" x="POSIÇÃO_X" y="POSIÇÃO_Y" z="POSIÇÃO_Z"/> <npc name="NOME_DO_NPC" x="POSIÇÃO_X" y="POSIÇÃO_Y" z="POSIÇÃO_Z"/> E como configurar o Special_Areas.xml : <area id="ID_DA_AREA" x="POSIÇÃO_X" y="POSIÇÃO_Y" z="POSIÇÃO_Z" words="PALAVRAS QUE TEM QUE FALAR NAQUELE TILE" file="ARQUIVO DA ÁREA"/> Lembrando : NÃO Oferecerei suporte a perguntas do tipo : O que são Sources? Onde fica o Game.cpp? O que esse code faz? e qualquer outra pergunta idiota do típico de pessoas que não lêem o inteiro. Kyo ~*
  16. @Zoreia Para fazer as blesses do Tibia.
  17. @Mechas o meu code não está bugado, foi algo adicionado por vc em algum lugar errado. @Guri Sim, porém tem um jeito de fazer para não diminuir, mais seria mais complicado ( A vcs Newbies ).
  18. é que simplismente esse code é mais de noob do que tdo, quem não consegue adicionar um codes desse pode desistir de otserv ¬¬' e simplismente tem perguntas que não são relacionadas ao tópico então eu não respondo Kyo ~*
  19. arg eu só axo triste ter que despedir do 7.1 assim, desta maneira... pois se não fosse por ele, quem sabe o OtServer não tinha nem começado... bom, eu já tive um 7.1 estável, era questão de 4~6 horas online sem cair, e quando caia era por causa dos malditos 'Memory Leaks' que acabavam consumindo toda a minha memória... porém tudo que é bom dura o tempo o suficiente para tornar inesquecível, como o Universal X... Foi bom enquanto durou Kyo~*
  20. Link~* Nos headers, existem algumas 'classes'... elas são Privates, Publics e Protected... então debaixo da classe Public vc deve adicionar esta declaração... Kyo ~**
  21. dei reply para vc ler o post inteiro, tem onde colocar ¬¬'
  22. bom.... parabéns a nova equipe né eu tava nela, só pq tive um problema no pc e resolvi fla simplismente me tiraram da equipe.... bom vcs devem ter tido o motivo de vcs, não irei questionar. Parabéns ao Xtbia que já faz mais de 5 meses online e com 1k+ de users online por dia.... Kyo ~*
  23. olá Jayson queria te informar que o erro encontrado não foi no meu code, e sim nas suas sources. Kyo ~*
  24. fabriciot o q vc tentou testar mas retornou bug?? sobre essa ultima parte ai sua... sim tem, mais vc teria que criar uma função na source onde ele pegava o square da porta da house e verificava se tinha dono, se não tivesse retornava uma coisa se tivesse retornava outra. belo code Kyo ~*
  25. hauihauihaihaia eu reportei esse site ai u.u bom... como o gus disse, o xtibia nunca irá perguntar sua account nem a senha em momento algum... mas queria dizer que não somente o Xtibia mais nenhum site deverá perguntar, se perguntar pode ter certeza, o objetivo é para te hackiar. outra coisa, NEM SEMPRE SERÁ UM VÍRUS, muitas vezes pode ser um Keylogger ( KL ), podemos classificalo para novatos nesse assunto que é uma 'variação' do vírus, mas na realidade não é. O objetivo dos KLs é pegar tudo que você digita e enviar a um servidor para utilizar as informações captadas. O KL mais famoso é o Backpack Perfect Keylogger, os KLs também são utilizados para pegar contas de bancos. então cuidado, sempre andem protegidos, com um bom anti-virus, e alguns programas extras ( anti-spy, anti-ad... ) Kyo ~*
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...