Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 10/31/13 em %
-
Monster Level Boa noite, Você deve ter visto este tópico e ficado interessado na feature, afinal, seria legal monstros terem também level, não é? O sistema que desenvolvi é bem funcional, o monstro passa a ter level e ganha mais HP, dá mais dano, tem mais defesa, dependendo dele. Como é feito em C++, a configuração é feita totalmente no XML do monstro, ficando tudo mais organizado. Há um extra no código, onde você pode manipular o level do summon do jogador, alterando o valor do storage 'monster_level'. Bom, é isso aí, para instalar, siga os passos a seguir atentamente. O sistema foi desenvolvido com base no The Forgotten Server 0.4_SVN r3777, não testei na versão 0.3.6, você tem a total liberdade para fazer isso. monsters.h Procure por: bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth; Substitua por: bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel; Procure por: int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance; Substitua por: int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax; monsters.cpp Procure por: canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false; Substitua por: canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false; Procure por: baseSpeed = 200; Logo abaixo, adicione: levelMin = levelMax = 1; Localize: bool Monsters::loadMonster Dentro da função, procure por: for(xmlNodePtr p = root->children; p; p = p->next) { if(p->type != XML_ELEMENT_NODE) continue; if(!xmlStrcmp(p->name, (const xmlChar*)"health")) { if(!readXMLInteger(p, "max", intValue)) { SHOW_XML_ERROR("Missing health.max"); monsterLoad = false; break; } mType->healthMax = intValue; if(!readXMLInteger(p, "now", intValue)) mType->health = mType->healthMax; else mType->health = intValue; } Logo abaixo, adicione: else if(!xmlStrcmp(p->name, (const xmlChar*)"level")) { if(!readXMLInteger(p, "max", intValue)) mType->levelMax = 1; else mType->levelMax = intValue; if(!readXMLInteger(p, "min", intValue)) mType->levelMin = mType->levelMax; else mType->levelMin = intValue; } Procure por: if(readXMLString(tmpNode, "emblem", strValue)) mType->guildEmblem = getEmblems(strValue); Logo abaixo, adicione: if(readXMLString(tmpNode, "hidelevel", strValue)) mType->hideLevel = booleanString(strValue); monster.h Localize: class Monster : public Creature { Logo abaixo de: public: #ifdef __ENABLE_SERVER_DIAGNOSTIC__ static uint32_t monsterCount; #endif virtual ~Monster(); Adicione: std::string name, nameDescription; int32_t level; double bonusAttack, bonusDefense; Substitua: virtual const std::string& getName() const {return mType->name;} virtual const std::string& getNameDescription() const {return mType->nameDescription;} virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} Por: virtual const std::string& getName() const {return name;} virtual const std::string& getNameDescription() const {return nameDescription;} virtual std::string getDescription(int32_t) const {return nameDescription + ".";} monster.cpp Procure por: Monster::Monster(MonsterType* _mType): Logo abaixo de: isIdle = true; Adicione: name = _mType->name; nameDescription = _mType->nameDescription; level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL); bonusAttack = 1.0; bonusDefense = 1.0; Procure por: Monster::onCreatureAppear Substitua toda a função por: void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) { std::string value; this->master->getStorage((std::string)"monster_level", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; isMasterInRange = canSee(master->getPosition()); } if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1)))); this->health = this->healthMax; this->bonusAttack += (0.01 * (level - 1)); this->bonusDefense += (0.005 * (level - 1)); } updateTargetList(); updateIdleStatus(); } else onCreatureEnter(const_cast<Creature*>(creature)); } Substitua todos: g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) Por: g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense Substitua todos: g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) Por: g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack map.cpp Procure por: #include "game.h" Adicione: #include "configmanager.h" Procure por: extern Game g_game; Adicione abaixo: extern ConfigManager g_config; Procure pela função: bool Map::placeCreature { Adicione logo depois: Monster* monster = creature->getMonster(); if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { uint8_t level; if(!monster->getMonsterType()->hideLevel) { if(monster->isSummon()) { std::string value; monster->getMaster()->getStorage((std::string)"monster_level", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; } else level = monster->level; char buffer [10]; monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]"; } } configmanager.h Procure por: MONSTER_SPAWN_WALKBACK, E adicione abaixo: MONSTER_HAS_LEVEL, configmanager.cpp Procure por: m_loaded = true; Adicione um pouco antes: m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true); config.lua monsterHasLevel = true Acabou, ufa, né? São muitas modificações para fazer, mas o resultado é garantido e é uma funcionalidade a mais para seu servidor. Como está programado, a cada level, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa. Para configurar level mínimo e máximo, é só adicionar no XML do monstro: <level min="1" max="10"/> E alterar a seu gosto. trunk.r3777 (com Monster Level) Espero que gostem, qualquer erro, só postar no tópico. Grande abraço.9 pontos
-
Oi, eu sou o Goku! -sqn Introdução Sobre o projeto Objetivos Andamento Contribuição para o fórum INTRODUÇÃO "Khorem" é um projeto de um novo jogo com base no OTClient. Ele vem sendo desenvolvido unicamente por mim (Krex) desde 2012. A princípio, a intenção era de colocar em prática conteúdo visto na faculdade e reunir a paixão por RPG. Queria agradecer ao Etchebeur e ao Insaend pelas doações de sprites. Ajuda bastante! =) SOBRE O PROJETO O projeto tem como inspiração histórias medievais como Crônicas de Gelo e Fogo e Senhor dos Anéis. Serão 4 "grandes" cidades, cada uma com suas características próprias: clima, liderança, situação econômica e até mesmo religião. Além disso, dezenas de pequenos vilarejos, pousadas e fazendas poderão ser encontradas espalhadas pelo mapa (normalmente com uma só família vivendo). Cada NPC tem uma família ou história pra contar. Caso você pergunte a ele seu "name" ele vai te responder o nome e sobrenome. Isso significa que se você perguntar sobre outro NPC da mesma família, ele poderá te dizer algo: que gosta dele, que não gosta, que não se conhecem muito bem... ou quem sabe que tem uma quest com algo pra você entregar pra ele... Isso também vale pra NPCs que moram na mesma região. Afinal, como podem dois moradores de uma mesma vila não terem o que falar um sobre o outro? O jogo vai ter algumas "diferenças" pra outros jogos no mesmo padrão. Os monstros terão um sistema de leveis, e sua força/vida/loots e experiência vão aumentando a cada nível. Um rato no nível 1, por exemplo, tem 10 de vida, dá 5 pontos de experiência e pode dropar até 5 moedas de prata. No nível 2, ele tem 20 de vida e dá 10 de experiência e pode dropar até 10 moedas de prata, além de um pedaço de queijo, que no nível 1 não é parte do loot.. No nível 3, ele tem 30 de vida, 15 de experiência, 15 moedas de prata e por aí vai... O sistema de dinheiro também vai ser um pouco diferente: a moeda mais baixa é a de prata, depois ouro e por último diamante. Em alguns lugares, itens poderão ser utilizados como "moeda alternativa" ou ter um valor mais alto do que o geral: no deserto por exemplo, NPCs podem preferir negociar por comida do que moedas de ouro. Couro é bem visto na área gelada. A princípio não vão haver vocações específicas. Você pode treinar corpo-a-corpo e arco e flecha, se quiser. Isso é algo a ser decidido mais pra frente... Khorem - Genesis History of Lauthern Ruins Mainport A maior cidade de Khorem. Conhecida pelo movimentado comércio e pelos grandes portos, tem a maior população do continente. É possível fazer ótimos negócios com preços abaixo do valor encontrado nas outras cidades, e ocasionalmente pode-se conseguir mercadorias raras nos comerciantes da cidade. A maioria absoluta da população é devota da deusa Ari, e existem algumas estatuas e pequenos templos dedicados a ela . A cidade também sofre com uma grande desigualdade social, principalmente depois da destruição da cidade de Lauthern, quando grande parte dos plebeus desabrigados migraram pra Mainport. Atualmente, é dividida em 3 partes: os nobres (grandes mercadores, donos dos maiores pontos comerciais e dos melhores barcos), os plebeus (mercadores donos das pequenas lojas e os pescadores) e os miseráveis(famílias desabrigadas no desastre de Lauthern). Oakhem A menor e mais nova cidade de Khorem. Nasceu em meio as temidas florestas no sul do continente, formada por famílias que não se adaptavam ao estilo de vida de Mainport e Lauthern. A maioria de sua população acredita nos deuses da floresta e não é devota de Ari, e muitos também não acreditam na história da criação de Khorem. Nas outras cidades, muitos acreditam que Oakhem será a próxima cidade a ser atacada (por centauros, ents, elfos e criaturas da floresta). Sandstone É um conjunto de tendas de nômades que antigamente vagavam pelo deserto, mas se aconchegaram nas margens do continente e hoje vivem em harmonia.Diferente das demais, não é bem uma cidade: não tem grandes muros ao redor, e nem ao menos um rei ou líder. Apesar disso, é um dos lugares mais seguros pra se viver. Alguns moradores afirmam que costumam ver dragões sobrevoando as distantes montanhas à leste da cidade Snowden "A cidade congelada". Fica localizada em uma ilha conhecida como Blizzard Island, no extremo norte de Khorem. A ilha tem esse nome porque sofre com uma estranha nevasca o tempo todo. Acreditam na deusa Ari mas temem os deuses antigos da floresta e principalmente do gelo. Seus moradores são em grande parte bárbaros e guerreiros, que lutam com grandes machados. Desde a destruição de Lauthern, tem uma certa dificuldade pra encontrar armas de qualidade. OBJETIVOS A intenção é de tornar o Khorem um jogo com todo o aspecto de um livro, onde o jogador pode contribuir para o resultado final. Soms diferentes em cada região Monstros diferentes e com leveis Jogabilidade diferente - puzzles como plataformas voadoras e etc Possibilidade de jogadores criarem suas próprias casas Variedade de livros, histórias, NPCs e etc ANDAMENTO Completo até então: Região "inicial" (primeira vila e seus arredores) com mapa completo. Monstros com level Primeiros NPCs e quests completos. 8 monstros completos 2 outfits Focando atualmente: Lauthern Ruins (80%) Criação de mais monstros Criação de mais outfits CONTRIBUIÇÃO PARA O FÓRUM Para contribuir com o fórum, me comprometo com: Tutoriais de Spriting Tutoriais de RPG (interpretação de texto, criação de personagem e etc). Pack de sprites free-for-use (mais adiante) Pra começar: http://www.xtibia.com/forum/topic/223323-entendendo-o-que-e-rpg/ É isso aí!5 pontos
-
Entendendo o que é: #RPG# Role Playing Game Oiq! Visto que tem muita gente buscando servidores alternativos de Tibia com uma história que foge ao que vemos normalmente, resolvi fazer esse artigo/tutorial. Em alguns tópicos pessoas buscam opiniões diferentes sobre como adicionar RPG e outras criticam o mesmo. Mexer com RPG normalmente é algo complicado, que engloba um assunto enorme. Existem diversos modelos diferentes de RPG, vou tentar abordar o básico aqui, mostrando exemplos de como criar personagens (e como caracterizar os mesmos), citarei alguns exemplos de RPGs que são bons como base e claro, como adequar isso ao que vemos no clima do Tibia. Let's go! Indíce: #1 Introdução ao RPG #2 Entendendo a importância dos NPCs #3 Caracterizando os NPCs #4 Criando sua história #5 Roleplay "Forfun" #6 Importância do Mapping #7 Importância do Scripting #8 Ligando sua história à criação de seus personagens #9 Referências #10 Finalizando -------------------- #1 Introdução ao RPG -------------------- Nos dias atuais é cada vez mais fácil abrir um otserver: diferentes opções permitem que um iniciante baixe um servidor pronto e não tenha que mexer em absolutamente nada pra começar o jogo. Entretanto, uma minoria de servidores vem se destacando por abordar um tema que até então era quase que exclusividade do Tibia Global: o Roleplaying! Segundo o Wikipédia, RPG (Role-Playing Game) é "um tipo de jogo em que os jogadores assumem os papéis de personagens e criam narrativas colaborativamente. O progresso de um jogo se dá de acordo com um sistema de regras predeterminado, dentro das quais os jogadores podem improvisar livremente. As escolhas dos jogadores determinam a direção que o jogo irá tomar". No Tibia, temos um MMORPG, que seria um RPG online massivo para múltiplos jogadores. Enjoado dos servers sempre iguais, os jogadores tem buscado opções que saiam do mesmo feijão com arroz. Um bom exemplo é o sucesso do Pokémon Online (SVKE). O jogo não tem uma história hiper-detalhada por trás (até porque pega a história já pronta do jogo/anime) mas também não segue o que costumamos ver por ai. Os NPCs são todos editados (inclusive outfits) e passam diferentes missões/quests: Note que o jogo aposta em NPCs com alusões a pessoas reais. Vou utilizar esse mesmo exemplo em breve pra mostrar que não é apenas o outfit editado. O problema em torno disso é que muita² gente pensa que adicionar RPG se limita em adicionar um novo NPC que passe uma missão e pronto. Errados! -------------------- #2 Entendendo a importância dos NPCs -------------------- Novamente pegando a ajuda do Wikipédia, veja o que tem a dizer sobre NPC: "Um personagem não-jogável/manipulável (do inglês, Non-player Character ou NPC) é um personagem de qualquer jogo eletrônico que não pode ser controlado por um jogador mas se envolve de alguma forma no enredo de um jogo. Ele exerce um papel específico cuja finalidade é a simples interatividade com o jogador". Note que o NPC não pode ser controlado pelo jogador, mas se envolve no enredo do jogo. Ou seja, se você for quer realmente adicionar o RolePlay ao seu servidor, o modo mais fácil é através dos NPCs. Eles que levam as informações do enredo (história) do jogo pra os jogadores. Eles devem fazer parte desse enredo, devem ter uma história - as vezes complexas (detalhadas) e em outras simples (objetivas). Basicamente, os NPCs Tibianos se dividem em 3 grupos com base na sua importância in-game: Mercadores, Missões e Suporte. Mercadores: são os responsáveis pela compra e venda de bens ou pela prestação de serviços. Estão presentes em todas cidades Tibianas e são indispensaveis pro andamento do comércio. Também considero como Mercador NPCs que vendem bless, por exemplo. Missões: Os NPCs típicos das quests. São eles que te passam as missões e te dão as recompensas depois. Suporte: Os NPCs que ajudam os das missões. As vezes aparecem no meio das quests apenas pra um papo rápido, quando dão alguma dica sobre o que você deve fazer. Também considero como suporte NPCs do templo, por exemplo. Agora a pergunta: qual desses grupos se adequam ao RPG? A resposta é: Todos! Não pense que só porque um NPC trabalha numa loja ele não pode ter uma ou mais histórias. Um bom exemplo pra isso é o NPC Sam, de Thais. Ele é o mercador da cidade, isso todo mundo sabe. Mas tem uma história por trás (suporte) e te passa missão numa quest também: SPOILER Ele troca uma An Old And Used Backpack por uma Dwarven Armor. Perto do Sam temos o NPC Frodo , que embora não passe missões também vende itens (poucos) mas pode te dar um suporte enorme quanto a história do jogo. Veja aqui: http://www.tibiawiki.com.br/wiki/Frodo/Transcrições O mais interessante desse NPC é a quantidade de respostas que ele dá pra diferentes assuntos. -------------------- #3 Caracterizando os NPCs -------------------- Existem alguns detalhes nas características dos NPCs que indicam quem eles são e como vivem. Separei 3 detalhes básicos: Físicas: O outfit que o NPC usa diz muito sobre ele. Cor do cabelo pode indicar idade, cor da roupa pode definir uma religião e o outfit pode definir situação financeira (já imaginou beggar rico ou king pobre? estranho ). Comunicação: O modo de falar também influencia muito sobre ele. O uso de gírias, palavrões ou carinhos pode mudar sua impressão sobre alguém, não é? Localização: o lugar onde vive é o terceiro ponto e chega pra dar ênfase ao clima que você criou com os outros dois detalhes: imagine um mendingo, que fala com gírias e xinga muito, vivendo num castelo. É estranho, certo? Então, o mapping é sim necessário pra uma boa interpretação de personagem! Lembra que falei do Pokémon Online? Note todos esses detalhes presentes: Os NPCs tem o outfit personalizado e dentro do personagem. Falam com gírias, gangsta! E sua localização, numa esquina, fecha o quadro. Quem pensou nisso no PO teve uma noção de RPG! É isso. Em resumo dessa parte: Os NPCs não devem ser apenas um boneco parado no meio do nada: utilize eles e seus detalhes pra ligar os jogadores a história do seu jogo. -------------------- #4 Criando sua história -------------------- Tá ai a parte que a galera tem mais dificuldade. Nem todo mundo nasce com criatividade pra virar escritor de roteiros de cinema, logo criar uma história vira um desafio enorme. O que mais surge é aquela velha história: o heroi amava uma princesa que foi sequestrada por um vilão demoniaco e blablabla... chega! Isso já é clichê a 20 anos nos jogos do Mário. Que tal mudar isso? essanaopodiafaltar O melhor modo de criar uma história é buscar referências em outras. Pode parecer algo feio, mas te garanto, é MUITO comum. As alusões mais simples por exemplo são uma boa pedida (e o Tibia está cheio, veja clicando aqui). Você faz uma brincadeira com alguém de outra história, já te ajuda a compor o personagem. Mas o melhor mesmo é buscar coisas que você vive. Seus amigos, parentes, professores... todas essas pessoas podem interferir um pouco na história. Os personagens de Harry Potter, por exemplo, são baseados nos amigos da escritora J.K Rowling na infância. Claro que isso não precisa ficar exposto, basta você mesmo saber. Aquele sua prima gostosa pode dar nome à atendente de uma taverna, por exemplo. Ela é loira? Põe no Outfit. Ela usa decote? Também... e por ai vai. Outro ponto legal é utilizar histórias que acontecem com você e transformar em coisas in-game. Uma história engraçada que você viva pode virar uma quest por diversão no jogo. Um exemplo disso é a série de jogos do Mario . Os inimigos Chain Chomps (aquelas bolas de ferro com uma corrente amarrada numa madeira) remetem a uma história que o criador do jogo viveu. Quando era mais novo foi atacado por um cachorro, mas ao fugir o canino ficou preso pelo tamanho da sua coleira. Veja mais aqui: http://www.reinodocogumelo.com/2010/09/o-feroz-dossie-dos-chain-chomps.html Também é interessante essa materia que fala sobre os Dry Bones (inimigo frequente da série). Talvez tenha sido criado com alusão a bíblia sagrada: http://www.reinodocogumelo.com/2010/03/os-dry-bones-sao-uma-alusao-biblia.html Notou como os grandes escritores e gamers imitam a vida pra utilizar na arte? -------------------- #5 Roleplay "Forfun" -------------------- Eu nem ia adicionar isso nesse artigo/tutorial, mas no fim achei interessante. Essa é uma modalidade que tem crescido no Tibia Global, que são as missões mais por diversão. Normalmente dão recompensas no final, mas não é nada tão significativo como um item de full set. Esse tipo de RPG é ótimo pra quebrar a rotina conhecida dos MMORPGs - level level level venderloot level level quest level level. Um exemplo é essa quest: http://www.tibiawiki.com.br/Troll_Sabotage_Quest/Spoiler Eu nunca fiz ela no global(até porque não é do meu tempo), mas lendo o spoiler da pra ver a Cip pensando em coisas legais como pegar distância pra dar um salto. Nessa classe entram os Achievements. -------------------- #6 Importância do Mapping -------------------- Eu disse acima que o mapping é importante pra compor o personagem. Aqui vou explicar melhor o motivo! Quando se trata de entrar no clima do personagem, o número dedetalhes na região que ele estiver aumenta as chances de você se sentir parte viva daquela história. Veja o exemplo abaixo: Em qual das duas imagens parece mais que você realmente está num cemitério? A primeira, certo? (sempretemumtrollpradizerqueasegundaimagempassamai sessaideia) Logo, se você deseja deixar seu server com o clima de RPG, procure um bom mapper. Ele vai saber passar o clima que você precisa pra o jogo. Entretanto, um ponto que acho bom ressaltar: o mapa overdetailed (com excesso de detalhes) é interessante quando se trata de caracterizar um personagem... mas é péssimo quando usado em todo mapa. Em alguns lugares, o melhor mesmo é ser simples e objetivo. Até porque assim o jogador tem mais espaço pra andar e tal. Então, fica a dica Outro ponto interessante quanto ao mapping é o shape (formato) do mesmo. Caso você vá fazer uma ilha com um clima demoniaco, não faz sentido ser em formato de coração, certo? Mas ficaria legal em formato de caveira. Pouca gente repara nessas coisas, mas é bom analisar o mapping/RPG desde o começo - a base da área que você vai criar descreve um pouco sobre ela -------------------- #7 Importância do Scripting -------------------- Agora que já disse porque o uso de mapas bem feitos, vou explicar o motivo dos scripts O Tibia em si te dá uma série de coisas já pronta que podem ser interessantes in-game. Entretanto, quando se trata de sair da rotina, é sempre interessante uma novidade que te prenda aquilo: é ai que entram os scripts Atualmente, nos OTs ervers mais influentes é possível fazer dezenas de coisas que não são do Tibia Original. Quem já se aventurou pela cidade de Ankrahmun e se imaginava voando de verdade no tapete? Pois é, com os scripts e o conhecimento que se tem hoje isso já é possível. Logo, se você deseja deixar seu server com o roleplay mais prático (sem ser apenas conversa) um bom nível de scripting é importante Um bom exemplo que ilustra tanto o mapping quanto o scripting é o jogo Kingdom Age. Assista o trailer e diga o que sente: -------------------- #8 Ligando sua história à criação de seus personagens -------------------- Agora que você já sabe como caracterizar o seu NPC ou o personagem de sua história, vamos a um passo a passo rápido sobre como criar ele. O primeiro ponto, pra mim, é ter um esboço da história em mente. Quando você tem uma noção do que quer fazer fica mais fácil do que querer criar uma história sem nenhum pré-planejamento. Vou dar um exemplos aqui de algumas características interessantes na criação: Note que só por essa base eu já tenho material pra criar duas áreas: a vila de Wyzzor (semi-abandonada) e a cidade de Chooz. Junto com essas áreas vem os personagens: as pessoas que ainda vivem em Wyzzor, as que foram pra Chooz, as que lutaram e ainda lutam nessa batalha e claro: os minotauros! Não dá pra criar uma história mostrando apenas um dos lados... é injusto! Alias, eu acho até mais interessante apostar na criação de uma bela cidade de minotaurs no subsolo estilo Mintwallin. IMPORTANTE Algo que não pode de forma alguma deixar passar: as histórias paralelas! Quando se fala de roleplay, não pense que deve ter apenas uma história principal. Nesse exemplo que dei da pra notar que o foco é na batalha entre minotaurs e humanos, mas quem disse que não podem ter histórias menores? Elas que dão motivação a procurar segredos. Alguns exemplos: Paixão entre um certo Minotaur e uma Humana (zoofilia tibiana? ahueaheua) Familias separadas entre cidades Reféns capturados pelos Minotaurs Familias não sabem se seus parentes estão vivos ou mortos Enfim, em 20 segundos pensei em 4 coisas que podem ser úteis como quests e histórias. E pra finalizar, algo importantíssimo: os NPCs devem responder sobre os outros! Não faz sentido dois NPCs morarem na mesma casa (um no térreo e o outro no primeiro andar, por exemplo) e ao perguntar o nome do outro eles não falarem nada. Não deu pra entender? Vou explicar: Note que usei a personalidade dos dois memes da internet nas suas respostas. O Cool mais gentil e safado enquanto o Fuu é mais stressado. Tá, não foi um bom exemplo, mas deu pra entender DHUSADHU Novamente vou usar o exemplo do Frodo, NPC de Thais, pra você ver a quantidade de histórias paralelas que ele se relaciona: http://www.tibiawiki.com.br/wiki/Frodo/Transcrições Nessa parte é legal o uso de referências a coisas reais... é o que vai ver no próximo tópico: -------------------- #9 Referências -------------------- Já falei de algumas até aqui: Mário, Harry Potter, Biblía, Pokémon, etc. O mais importante quanto as referências é saber procurar. A vida te mostra várias coisas que podem servir como referência: seja jogos, filmes livros e etc. Que tal a partir de agora, ao ver um outro jogo, pensar se aquilo não pode ser levado pro ar Tibiano? Sem sair do próprio Tibia, já tentou analisar o jogo pelo lado roleplay? O artigo da Cipsoft desse mês, sobre as rotworms, deixa o RPG beeeeeem claro. Leia você mesmo aqui: http://forums.tibiabr.com/showthread.php?t=399797 Aposto que nunca mais vai ver uma Rotworm do mesmo jeito :3 Um exemplo externo agora: Castlevania! O jogo tem um bestiario enorme, com várias criaturas iguais ao Tibia. A história também anda pelo mesmo clima medieval-mistico. Se você começar a jogar e pensar no Tibia, verá como dá pra fazer uma coisa legal Ainda no ar medieval, temos a série Final Fanttasy (principalmente os antigos). Mas essa nem vou comentar muito, já que tem um ATS em desenvolvimento baseado na série - melhor ser original =P Caso queira fugir do Tibia e buscar algo mais moderno, também tem bons RPGs. Um exemplo é o jogo Earthbound: lá você não encontra dragões nem cavaleiros, os inimigos vão de punks a hippies, passando por satanistas de uma seita. -------------------- #10 Finalizando -------------------- Como disse no começo, essa área do Roleplaying é bem ampla. Escrevi um pouco aqui no tutorial, mas sempre sobra áreas pra comentar. Caso tenha alguma sugestão de como incrementar o tutorial, comente! Caso tenha dúvida sobre alguma área, também comente. Eu sei que no geral deve ter ficado até chato o tuto. Mas, caso você realmente queira deixar seu server com RPG, não se deixe levar pela preguiça: você acaba levando mais pra sua vida do que os R$ que o server pode faturar: de uma forma ou de outra, você cria histórias que parecem livros sem notar Utilizar a criatividade é sempre bom Créditos pra TibiaWiki, os respectivos donos dos jogos Pokémon Online e Kingdom Age e todas as referências que usei aqui (Mario, Harry Potter, etc). Espero que gostem, gastei algumas horas pra fazer isso =) Se gostou agradeça Isso motiva a fazer novos tutoriais e não te custa nada5 pontos
-
[Arquivado]Pokemon Omega Ω O seu Projeto
Soulviling e um outro reagiu a SmiX por um tópico no fórum
Olá, pessoal! Muito de vocês devem estar achando que estou na área errada, mas não estou. Hoje venho debater e pedir opiniões de todos vocês. Simples, vocês vão dar ideias para o mais novo projeto, que todos iram poder ter. Primeiro: Qual ou quais is sistemas você quer nesse projeto? Lembre só irei aceitar 5 ideias, para a versão 1.0 do servidor. Segundo: Qual a versão que você prefere, 8.54 ou 9.+? Caso queira a versão 9.+, poste um link no qual eu possa ter acesso ao referido servidor. Poste sua Ideia, com as seguintes tags: Vale ressaltar outra vez que; o servidor será postado para download, de modo que todos tenham acesso. Espero que gostem da iniciativa, pois quero acabar com a hierarquia de sistemas. Todos poderão ter qualquer sistema. Pack 1.0 servlog: Versão o servidor: 9.602 pontos -
Abre o mapa e aperta ctrl+p e bota 9.83 ou abre um novo mapa na versão 9.83 e importa o seu 9.62 pontos
-
Coisas Que o Tempo Muda (Charlie's Adventure) - Vamos! Vem logo... ele vai contar a história! - Tem certeza que não é perigoso? - Claro que não... agora fala baixo e disfarça essa cara de medo, estamos chegando perto. - Hmm tudo bem. - Bom dia senhor. Pode nos contar aquela história novamente? - Ohh *abre os olhos para enxergar melhor*... c-claro que sim. Onde que começa mesmo... ah ok, lembrei *cof cof* Tudo começou em terra distante... muito tempo atrás. Carlin já era governada pela Rainha Eloise. Seria uma manhã normal se não fosse pelo boato de que 3 jovens aventureiros estavam desaparecidos e a causa era nada mais nada menos que o tenebroso Yeti. Imediatamente outros aventureiros começaram a se amontoar na praça central da cidade: decidiram tentar encontrar o pé grande. Entre eles estava um jovem cavaleiro morador de Thais chamado Charlie. Cansado da rotina que vivia no sul quente do continente, resolveu se aventurar nas ilhas geladas. Mal sabia que estava fazendo a maior bobagem de sua vida! E assim que o sol se firmou no céu a rainha deu a ordem de que os aventureiros podiam partir. Svenson teve trabalho para transportar todas aquelas pessoas até Folda. Por sorte (ou azar, talvez) Charlie estava no primeiro barco. Chegou primeiro na ilha e logo partiu para desbravar aquela nova área. Sozinho, acabou se perdendo dos outros aventureiros vagando muito para o oeste. Não conseguia ver muito pois caia uma forte nevasca. O frio era cada vez mais intenso e sua tocha estava congelada. Derrotava Trolls enquanto gastava sua mana alternando entre vários “utevo lux” e “exura”. De repente um som muito alto fez gelar ainda mais a espinha de Charlie. “Yooodelaaahooohooo”? O que seria isso? Ele não sabia. Mas tinha certeza de que ali não era seu lugar, e então partiu em disparada de volta. Sem poder ver muita coisa, acabou tropeçando em um Wooden Shield que ele mesmo tinha jogado no chão. Saiu rolando na neve até se debater em algo que parecia ser uma montanha. Com o impacto, mais neve rolou por cima do pobre coitado. Estava preso. No frio. E com certeza ninguém poderia tira-lo dali. Ele sentiu seu corpo congelar. Das pontas dos dedos até seu tronco, tudo foi ficando paralisado. Antes de perder completamente os sentidos, ouviu novamente um “Yooodelaaahooohooo”, mas dessa vez não parecia tão alto. A criatura estava perdendo as forças, tal como o próprio Charlie. Alguns segundos depois veio outro grito ”Conseguimos!”. Naquele momento teve certeza de que o Yeti já era. Poderia comemorar, se não fosse o sono. “BunnnySlippers!” foi a última coisa que ouviu antes de adormecer. - Será que está vivo? - Claro que sim, não da pra morrer congelado no Tibia. - Vamos ver o que tem na backpack e depois jogamos ele pros trolls. - Olha, tá acordando. Charlie estada deitado no gelo ao lado de uma fogueira. Dois jovens olhavam seu corpo, que já não estava congelado. Com dificuldade, ele se sentou e observou as roupas estranhas dos dois curiosos. Nunca tinha visto alguém se vestindo daquela forma antes. Percebeu nesse momento que tinha ficado adormecido no gelo por algum tempo. - Em que ano estamos? Perguntou Charlie. - 874 depois de Uman Zathroth - respondeu o primeiro dos jovens. - Tiozão maluco hein! Vamo deixar ele aí e procurar alguns achievements! – comentou o segundo. - Achie o quê? - Perguntou Charlie, mas já era tarde: os jovens já partiam. Então ele levantou. Se sacudiu e percebeu que estava na mesma ilha de gelo de quando adormeceu. O dia estava quente e a ilha parecia um pouco menor. Talvez fosse o tal aquecimento global, pensou ele. Não havia mais sinal de Yeti, entretanto, uma criatura diferente podia ser vista no topo de uma montanha próxima. “Shriiiek” era o som que ela emitia. Decidiu então procurar o barco para ir de volta para casa. Alguns passos depois pode enxergar um vulto vindo na neve. Pode ver de longe que era um mago: mas usava um chapéu diferente e um bastão. Charlie não sabia onde ele tinha encontrado aquilo, mas viu que a moda mudou durante esses anos. Alguns passos a mais e ele pode ver o pequeno barco... e para sua surpresa, Svenson continuava lá! Depois de uma pequena negociação (não, eu não lembro de você, vai ter que pagar! – disse Svenson) decidiram voltar para Carlin. Mas uma surpresa: ao olhar em direção ao norte nosso já não tão jovem aventureiro pode ver uma ilha nova. Svenson estranhou, mas explicou que era Okolnir. Charlie desistiu de tentar entender tudo que estava acontecendo, apenas queria voltar para sua casa, em Thais. Desembarcou de volta no continente; agora era só seguir para o sul e tudo ficaria certo. Estranhou quando derrotou um troll e encontrou um maço de seu cabelo. Falta de vitaminas, talvez. Continuou sua caminhada até avistar a cidade de Carlin. Estava muito bonita, sinal de que a rainha estava trabalhando bem. O depot parecia a mesma bagunça de sempre! Charlie abasteceu sua mochila com UHs e saiu novamente. Alguns passos fora da zona de proteção e uma surpresa: uma caveira voadora vinha em velocidade enorme e acertou Charlie em cheio pelas costas... uma runa de SD, pensou. Por sorte, não tirou tanto dano como as outras que já tinha visto em guerras. Entrou no bueiro e resolveu se esconder. Um jovem chamado Nelson Gomes estava matando os insetos da caverna, mas não respondia as mensagens de forma alguma. Continuava a caçar sem dar a mínima importância. “Eu só queria saber onde podia me esconder” - pensou Charlie - “Essa juventude de hoje não tem educação”. Achando que estava seguro, o cavaleiro saiu do esconderijo. Pegou o caminho da saída leste e voltou a sua jornada. Depois de alguns passos, pode avistar Ab’dendriel. A cidade também parecia muito mais bonita: “Talvez uma rainha elfa dominando aquilo?”. Fez a volta ao redor de Femur Hills em meio a lembranças: “será que já descobriram todos segredos daí? E aquela grama estranha... ainda acho que é preciso que usar uma paralize rune antes da grama crescer e... UAI”. O pensamento de Charlie foi abafado depois de encontrar um estranho Goblin que usava equipamentos parecidos com o de um humano. Por sorte, ele era quase tão fraco quanto os outros. Continuando rumo ao sul e mais lembranças. Quantas vezes fugiu de PKs ali perto de Kazordoon? E será que o Kruzak ainda governava? Passou pela montanha rumo a Dwarf Bridge e decidiu pensar nisso depois. Não era bom andar distraído, porque ali começava a zona de perigo. Talvez alguém tivesse lurado Giant Spiders . Embora tivesse força, Charlie achou melhor não arriscar um duelo com uma GS naquele momento. Talvez se fosse melhor um dragã... “É isso!” disse ele. E lá partiu nosso aventureiro rumo ao dragão mais próximo dali. Entrou rapidamente na caverna e lá estava ele do outro lado. Já podia ouvir o “FCHHHH”. O primeiro dragão nunca esquecemos, ainda mais depois de séculos congelado. Rapidamente a criatura entrou em seu campo de visão, atacando com suas rajadas de fogo. Desviando-se dos ataques, Charlie sentia seu sangue mais quente do que nunca! Depois de uma investida mais forte, viu que o dragão tinha conseguido deixar sua energia no amarelo. Era hora de se curar... mas peraí... “Exura”, “Exura”, “EXURAAA”. Não estava dando certo. Pela primeira vez, a magia mais utilizada por aquele guerreiro tinha falhado. Era hora de fugir. Enquanto corria, ia abrindo suas mochilas procurando por UHs. Tentava se desviar das bolas de fogo mandadas pelo dragão, mas era inútil. Finalmente encontrou a mochila correta e pegou uma runa... estava prestes a usar, quando olhou para o buraco de onde tinha vindo e viu que tinha mais problemas do que nunca. Lá estava o mesmo mago que outrora atacou Charlie com uma SD em Carlin. E não estava sozinho, ao seu lado outro feiticeiro ainda mais assustador estava... MONTADO EM UMA PANTERA? Não dava para acreditar naquilo: o de Carlin tinha uma caveira vermelha e o outro uma caveira negra. Desde quando era possível obter uma Black Skull? Não dava tempo para pensar. Lá vinha uma SD em sua direção, mas o agíl cavaleiro desviou. Conseguiu entrar na caverna passando em meio aos dois. Era a hora de se curar antes de continuar fugindo. Encostou a UH em seu peito e sentiu um leve alívio. Estava revigorado! Tinha curado... 60 pontos de vida? Charlie não entendia o que aconteceu. Nunca tinha curado menos que 500 pontos com uma UH. Tudo bem que algo errado aconteceu com o Exura, mas a UH era sagrada. Estava cercado entre um dragão e dois assassinos e não podia correr. Era o fim. “EXEVO GRAN MAS VIS” gritou o primeiro mago. Dessa vez não foram bolas de fogo, vários raios acertaram o nosso cavaleiro. Sem forças, caiu no chão. Acordou num lugar que conhecia bem. Quentin estava lá com a mesma roupa de sempre, abençoando os jogadores. Charlie se recostou em uma daquelas belas pilastras do templo de Thais enquanto observava as pessoas passando. Trajavam roupas estranhas, com equipamentos que ele não conhecia. Alguns chegavam a falar coisas que ele não pode entender, como “Vamos ir na Pits of Inferno?”; até onde sabia era impossível chegar lá. Que diabos era Inquisition? Tudo estava muito mudado. E toda aquela confusão? Será que os GMs entraram de férias? Não dava para continuar. O tempo passou, as coisas mudaram. Era melhor se aposentar, decidiu Charlie. Já estava de volta a sua cidade natal, agora era só relaxar. Melhor deixar a vida de aventuras para os novatos... - E assim acaba a história do primeiro cavaleiro que viajou através do tempo. - E por onde ele anda agora? - Ah... err... ouvi dizer que por Venore. Parece que ele gostou dos pântanos. - Viu Joanie! Eu disse que a história era legal. Obrigado por nos contar senhor! - Oh, não foi nada. É sempre bom um pouco de companhia. E assim as duas pequenas garotas se afastaram. Saiam pulando enquanto comentavam o que acabaram de ouvir. - Hehe... se elas soubessem da verdade... Simon, o mendigo? Ótimo disfarce - disse Charlie. Consulta: http://www.tibiawiki.com.br/Fibula (acesso em 15 de maio de 2011) http://www.tibiawiki.com.br/Folda (acesso em 15 de maio de 2011) http://www.tibiawiki.com.br/Femur_Hills (acesso em 15 de maio de 2011) http://www.tibiawiki.com.br/Carlin (acesso em 15 de maio de 2011) http://forums.tibiabr.com/showthread.php?t=72018 (acesso em 15 de maio de 2011)2 pontos
-
Aqui mano, espero que ajude! Global Full 9.6 Ot-Soft DHA Server2 pontos
-
Sistema de Critical REAL
Omega e um outro reagiu a markindoot por uma questão
ai eu nao sei, peguei esse de outro forum para lhe ajudar. Se ajudei REP+ =D2 pontos -
Global Map 9.83
NERTOM reagiu a alissonfgp por um tópico no fórum
Global Server não é 100% full pq praticamente nao existe é raro achar sao poucos os que tem. Credits: Denner altero até a versao 8.6 o resto eu que alterei... TFS Team Cipsoft Alissonfgp -- 8.6+ O distro esta junto e as Sources eu nao vou poder postar por enquanto. =/ Pedido nao copiem e postem em outro forum, pq eu ja vo fazer isso . Link: http://www.4shared.com/rar/sJ-VeQJQ/Global_98.html SCAN[15/03/14]: VIRUS TOTAL Sources + DB: http://www.4shared.com/rar/Z5mZuL5C/03r_983.html SCAN[15/03/14]: VIRUS TOTAL ADICIONADO AS SOURCES.... TFS Roda em win 32 bits e 64 bits, Usando LaaTiDoo com windows 64bits ele abre mapa de até 115 mb que pelo- eu pude testar, agr se abre com mais eu nao sei. Disse que iria postar sources e RME mas nao vou postar mais, depois que praticamente copiaram meu topico nao vou postar mais nada no forum, esse é meu ultimo post... Qualquer bug me avisa que arrumo. UPDATE FEITO ADICIONADOS ALGUMAS NOVAS AREAS 9.8X+ E REMOVIDOS OS BUGS ENCONTRADOS....1 ponto -
Caderno de raphaelpdc
EdMignari reagiu a raphaelpdc por um tópico no fórum
Fala ae pessoal, trago aqui pra vocês umas sprites antigas, e novas, todas que eu fui guardando no photobucket: Desculpem a bagunça, amanha eu ajeito, ja estou indo dormir, foi mal kkkk1 ponto -
Fist Fighting/Attackspeed
Renan Morais reagiu a Oneshot por um tópico no fórum
Nome: Fist Fighting/Attackspeed Tipo: C++ Autor: Oneshot Já vi alguns pedidos no fórum sobre a skill Fist Fighting, onde quanto mais você treinasse ela, mais rápido você atacaria no jogo, e parece que isto é um feature do Tibia. Como é uma modificação muito fácil nas sources, resolvi passar aí para a galera. Por padrão, o intervalo entre ataques do Tibia é 2000ms, ou seja, um ataque físico a cada dois segundos. Eu fiz uma pequena modificação nas sources onde o Fist Fighting seria inversamente proporcional ao tal intervalo, ou seja, quanto maior o valor da skill, menor seria o intervalo. Fiz de um modo que um jogador com Fist Fighting de nível 200, então, teria uma redução de 75% no intervalo de ataque, ou seja, um ataque a cada meio segundo ou dois ataques por segundo Leve em consideração que ele pega como base o attackspeed da vocação ou da arma usada, ou seja, se seu servidor já tem o tal chamado "fast attack", de nada adianta adicionar esse código C++. Abra seu player.cpp, procure por isso: Player::getAttackSpeed() Substitua toda a função, dependendo da versão de seu servidor: 0.3.6 uint32_t Player::getAttackSpeed() { Item* weapon = getWeapon(); if(weapon && weapon->getAttackSpeed() != 0) return std::ceil(weapon->getAttackSpeed() * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375))); return std::ceil(vocation->getAttackSpeed() * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375))); } 0.4 uint32_t Player::getAttackSpeed() const { return std::ceil(((weapon && weapon->getAttackSpeed() != 0) ? weapon->getAttackSpeed() * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375)) : (vocation->getAttackSpeed() / std::max((size_t)1, getWeapons().size()) * (1 - (getSkill(SKILL_FIST, SKILL_LEVEL) * 0.00375))))); } Isso adiciona uma utilidade para a skill Fist Fighting que em muitos dos servidores é algo deixado de lado e inútil. Abraços.1 ponto -
Global Full + Zao
Lordfireot reagiu a Animal Pak por um tópico no fórum
GLOBAL FULL 8.60 V 0.0.1 - TFS estável - Mapa global 100% full (CipSoft). - Todos os NPCS!. - Servidor sem bugs!!. - Scripts únicos. - Sistema de Montaria!. - Entre outros... ~Cidades~ - Yalahar - Carlin - Ab'Dendriel - Kazordon - Thais - Venore - Darashia - Ankramun - Edron - Port Hope - Liberty Bay - Svargrond - Cormaya - Zao - Farmine - 2 cidades VIP's (Ethno y Gengia) ~Quests~ - Arena Quest - Demon Oak - Demon Helmet - Inquisition Quest - Anihileator Quest - POI - HOTA Quest - Sistemas de Tasks - Crown Quest - Behemonth Quest - Blue Legs - BK - Bright Sword - Naginata - Vamp Shield - Fire Axe - Mermaid Comb - Orc Fortress - Medusa Shield - Dark Shield - Noble Armor - Desert Quest - Stealth Ring - Mad Mage Room - Entre outras... Imagens Download http://www.4shared.com/file/CSu7EYQI/Global_Full__Zao_860_ByToridox.html Scan http://www.virustotal.com/pt/analisis/ab636c077cc6a3c6238d5f6ce373ec3fd277866c5727cc92e95c6321899d4005-1279001617 Créditos Toridox1 ponto -
Sprite Editor
TcharlesGM666 reagiu a EdMignari por um tópico no fórum
1 ponto -
A pedido de um membro, vou postar esse evento que eu fiz aqui há bastante tempo já. Dei umas boas testadas na época, mas peço que postem os erros caso os encontrem. Informações A cada intervalo de tempo definido, o servidor escolhe automaticamente um alvo entre os jogadores online e anuncia (broadcast). Esse jogador se manterá como alvo por um período também configurável de tempo e, quando for morto, o jogador que o matar receberá itens definidos na configuração. O level mínimo e o grupo a que pode pertencer podem ser configurados. As opções incluem desabilitar o logout do alvo e forçar a escolha de um novo alvo caso o outro morra ou dê logout. Códigos data/lib/targetlib.lua data/creaturescripts/scripts/targetcreature.lua data/globalevents/scripts/targetglobal.lua Tags creaturescripts.xml <event type="kill" name="Target_Kill" event="script" value="targetcreature.lua"/> <event type="login" name="TargetLogin" event="script" value="targetcreature.lua"/> <event type="logout" name="TargetLogout" event="script" value="targetcreature.lua"/> globalevents.xml <globalevent name="Target System" interval="3600000" event="script" value="targetglobal.lua"/> Configuração Bom, ela é feita provavelmente só no arquivo targetlib.lua, mais precisamente nessa parte: A outra parte é que você pode restringir o dia e a hora em que o evento ocorrerá no arquivo targetglobal.lua: local dia = false -- Número do dia que o script será ativado [0-6 = doming-sábado] deixe false se quiser desativado local hora = false -- Hora de cada dia que esse script será ativado [0-23] Novamente, caso encontrem erros, digam qual é o erro e postem o que apareceu no executável ou apontem a parte do código que está dando erro.1 ponto
-
Oneshot Spell Lib Boa tarde, meus queridos. Como eu disse no último post do tópico do Spell Forge, sim, ele estava ficando funcional o bastante, mas uma coisa não me agradava, o nível de dificuldade de configuração do sistema estava aumentando, e uma hora, não teria como OT-admins usarem meu sistema, pois não saberiam configurar. Então resolvi parar o desenvolvimento dele por enquanto, mas segue minha biblioteca que estava usando para desenvolvimento do sistema. Uma biblioteca completa para desenvolvimento de magias, orientada a objetos, torna a coisa bem mais interessante. Para utilizar minha biblioteca, basta criar arquivo com qualquer nome na pasta data/lib do seu servidor e colar o seguinte conteúdo abaixo: -- This library is part of Oneshot Spell System -- Copyright (C) 2013 Oneshot -- -- 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/>. -- constant CONST_SPELL_AREA = 0 -- area spells, like exevo gran mas vis CONST_SPELL_DIRECTION = 1 -- wave spells, like exevo flam hur CONST_SPELL_TARGETORDIRECTION = 2 -- mix between area and wave spells WEAPON_SKILLS = { [WEAPON_SWORD] = SKILL_SWORD, [WEAPON_CLUB] = SKILL_CLUB, [WEAPON_AXE] = SKILL_AXE, } -- class for combats (spell instances) Combat = { type = 0, me = 0, ani = 0, formula = { type = 0, values = {}, }, condition = nil, delay = 0, id = 0, } function Combat:New(_type, me, ani, delay, id) local new_spellinstance = { type = _type or COMBAT_NONE, me = me or CONST_ME_NONE, ani = ani or CONST_ANI_NONE, formula = { type = COMBAT_FORMULA_UNDEFINED, values = {0, 0, 0, 0, 0, 0, 0, 0}, }, condition = nil, delay = delay or -1, id = id or 1, } return setmetatable(new_spellinstance, {__index = self}) end function Combat:SetType(_type) self.type = (tonumber(_type) and _type or COMBAT_NONE) end function Combat:SetEffect(me) self.me = (tonumber(me) and me or CONST_ME_NONE) end function Combat:SetDistanceEffect(ani) self.ani = (tonumber(ani) and ani or CONST_ANI_NONE) end function Combat:SetFormula(_type, ...) local args = select("#", ...) self.formula.type = (tonumber(_type and _type or COMBAT_FORMULA_UNDEFINED)) local minc, maxc if args > 8 then minc, maxc = select(9, ...) end local minm, maxm = getConfigValue("formulaMagic") or 1 maxm = minm local minl, maxl = getConfigValue("formulaLevel") or 5 maxl = minl if args > 6 then minm, maxm = select(7, ...) end if args > 4 then minl, maxl = select(5, ...) end local mina, minb, maxa, maxb = select(1, ...) self.formula.values = {mina, minb, maxa, maxb, minl, maxl, minm, maxm, minc, maxc} end function Combat:SetCondition(condition) -- condition needs to be a createConditionObject(), e.g -- local condition = createConditionObject(CONDITION_FIRE) -- setConditionParam(condition, CONDITION_PARAM_TICKS, 1 * 1000) self.condition = condition end function Combat:GetDelay() return self.delay end function Combat:SetDelay(delay) self.delay = (tonumber(delay) and delay or -1) end function Combat:GetId() return self.id end function Combat:SetId(id) self.id = (tonumber(id) and id or 1) end function Combat:getMinMaxValues(cid, ex) local min, max = 0, 0 local n = self.formula.values if not isCreature(cid) then return false end if not isPlayer(cid) then self.formula.type = COMBAT_FORMULA_DAMAGE end if self.formula.type == COMBAT_FORMULA_LEVELMAGIC then min = (getPlayerLevel(cid) / n[5] + getPlayerMagLevel(cid) * n[7]) * n[1] + n[2] max = (getPlayerLevel(cid) / n[6] + getPlayerMagLevel(cid) * n[8]) * n[3] + n[4] if n[9] then min = math.max(n[9], min) end if n[10] then max = math.max(n[10], max) end elseif self.formula.type == COMBAT_FORMULA_SKILL then local weapon = getPlayerWeapon(cid) if weapon.uid > 0 then max = getPlayerWeaponDamage(cid, weapon) * n[3] + n[4] else max = n[4] end if n[10] then max = math.max(n[10], max) end elseif self.formula.type == COMBAT_FORMULA_DAMAGE then min = n[2] max = n[4] end return min, max end function Combat:Callback(position, cid, ex) if not isCreature(cid) then return false end local min, max = self:getMinMaxValues(cid, ex) doCombatAreaHealth(cid, self.type, position, 0, min, max, self.me) if self.condition then doCombatAreaCondition(cid, position, 0, self.condition, CONST_ME_NONE) end return true end -- class for spells Spell = { type = 0, level = 0, maglevel = 0, mana = 0, needtarget = false, target_or_direction = false, range = 0, needweapon = false, selftarget = false, vocations = {}, combats = {}, } function Spell:New(_type, level, maglevel, mana, needtarget, range, needweapon, selftarget, ...) local new_spell = { type = _type or CONST_SPELL_AREA, level = level or 1, maglevel = maglevel or 0, mana = mana or 0, needtarget = needtarget or false, range = range or 1, needweapon = needweapon or false, selftarget = selftarget or false, vocations = {...}, combat = {}, area = {{3}}, } return setmetatable(new_spell, {__index = self}) end function Spell:SetType(_type) self.type = (tonumber(_type) and _type or CONST_SPELLarea) end function Spell:SetLevel(level) self.level = (tonumber(level) and level or 1) end function Spell:SetMagLevel(maglevel) self.maglevel = (tonumber(maglevel) and maglevel or 0) end function Spell:SetMana(mana) self.mana = (tonumber(mana) and mana or 0) end function Spell:SetNeedTarget(needtarget) self.needtarget = (type(needtarget) == "boolean" and needtarget or false) end function Spell:SetRange(range) self.range = (tonumber(range) and range or 1) end function Spell:SetNeedWeapon(needweapon) self.needweapon = (type(needweapon) == "boolean" and needweapon or false) end function Spell:SetSelfTarget(selftarget) self.selftarget = (type(selftarget) == "boolean" and selftarget or false) end function Spell:SetVocations(...) self.vocations = {...} end function Spell:Append(...) local t = {...} for i = 1, #t do self.combat[t[i]:GetId()] = t[i] end end function Spell:SetArea(area) self.area = area end function Spell:Cast(cid) if not isCreature(cid) then return false end if #self.combat == 0 then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end if isPlayer(cid) then if not getPlayerFlagValue(cid, PLAYERFLAG_IGNORESPELLCHECK) then if getPlayerLevel(cid) < self.level then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHLEVEL) return false end if getCreatureMana(cid) < self.mana then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHMANA) return false end if getPlayerMagLevel(cid) < self.maglevel then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHMAGICLEVEL) return false end if self.needweapon and (getPlayerWeapon(cid).uid == 0) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUNEEDAWEAPONTOUSETHISSPELL) return false end local vocation = getPlayerVocation(cid) if #self.vocations > 0 and not (table.find(self.vocations, vocation) or table.find(self.vocations, getVocationInfo(vocation).fromVocation)) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOURVOCATIONCANNOTUSETHISSPELL) return false end end end local target = getCreatureTarget(cid) if self.needtarget == true then if self.type == CONST_SPELL_DIRECTION then self.type = CONST_SPELL_TARGETORDIRECTION elseif self.type == CONST_SPELL_AREA and not isCreature(target) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUCANONLYUSEITONCREATURES) return false end end if self.range and isCreature(target) then if getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(target)) > self.range then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendDefaultCancel(cid, RETURNVALUE_TOOFARAWAY) return false end end local area = self.area if self.type == CONST_SPELL_DIRECTION or (self.type == CONST_SPELL_TARGETORDIRECTION and not isCreature(target)) then area = getAreaByDir(area, getCreatureLookDirection(cid)) end local centre = getCreaturePosition(cid) local target = getCreatureTarget(cid) if self.type == CONST_SPELL_DIRECTION then centre = getPosByDir(getCreaturePosition(cid), getCreatureLookDirection(cid), 1) elseif self.type == CONST_SPELL_TARGETORDIRECTION then centre = (isCreature(target) and getCreaturePosition(target) or getPosByDir(getCreaturePosition(cid), getCreatureLookDirection(cid), 1)) elseif self.type == CONST_SPELL_AREA then if self.needtarget and isCreature(target) then centre = getCreaturePosition(target) end end local positions = getAreaPositions(area, centre) for i = 1, #area do for j = 1, #area[i] do local tmp = area[i][j] if tmp == 3 then for k = 1, #self.combat do local combat = self.combat[k] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end end elseif type(tmp) == "number" and self.combat[tmp] then local combat = self.combat[tmp] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end elseif type(tmp) == "table" then for k = 1, #tmp do local tile = tmp[k] local combat = self.combat[tile] if combat then addEvent(function() if self.selftarget then combat:Callback(positions[i][j], 0) else combat:Callback(positions[i][j], cid) end doSendDistanceShoot(getCreaturePosition(cid), centre, combat.ani) end, combat:GetDelay()) end end end end end if self.mana > 0 then doCreatureAddMana(cid, -self.mana, 0) end return true end function rotate(area) local ret = {} for i = 1, #area do for j = 1, #area[i] do if not ret[#area[i]-j+1] then ret[#area[i]-j+1] = {} end ret[#area[i]-j+1][i] = area[i][j] end end return ret end function getAreaByDir(area, direction) local ret = area if direction > NORTH then local n = (4 - direction) repeat ret = rotate(ret) n = n - 1 until n == 0 end return ret end function getAreaCentre(area) local x, y = 0, 0 for i = 1, #area do for j = 1, #area[i] do if area[i][j] == 3 then x = j y = i break end end end return x, y end function getAreaPositions(area, centre) local ret = {} local x, y = getAreaCentre(area) for i = 1, #area do for j = 1, #area[i] do if not ret[i] then ret[i] = {} end ret[i][j] = {x = centre.x + (j - x), y = centre.y + (i - y), z = centre.z} end end return ret end function getPlayerMeleeDamage(cid, item) local skill, attack if item.uid > 0 then local info = getItemInfo(item.itemid) skill = getPlayerSkillLevel(cid, WEAPON_SKILLS[getItemWeaponType(item.uid)]) attack = ((getItemAttribute(item.uid, "attack") or info.attack) + (getItemAttribute(item.uid, "extraAttack") or info.extraAttack) - info.abilities.elementDamage) else skill = getPlayerSkillLevel(cid, SKILL_FIST) attack = 0 end local damage = math.ceil((2 * (attack * (skill + 5.8) / 25 + (getPlayerLevel(cid) - 1) / 10.)) / getPlayerAttackFactor(cid)) return -math.random(0, damage) end function getPlayerAttackFactor(cid) local switch = { 1.0, 1.2, 2.0, } return switch[(getPlayerModes(cid).fight + 1)] end dofile(getDataDir() .."/spells/lib/spells.lua") É uma biblioteca orientada a objetos que facilita o desenvolvimento de magias. Comparando a forma dos scripts de magias, com a minha biblioteca e sem, podemos ver a diferença. Sem a biblioteca: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4.5, 9) local area = createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Com a biblioteca: local combat = Combat:New(COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA, CONST_ANI_ENERGY) combat:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 4.5, 9) local spell = Spell:New(CONST_SPELL_DIRECTION) spell:Append(combat) spell:SetArea(AREA_WAVE4) function onCastSpell(cid, var) return spell:Cast(cid) end Mas o melhor mesmo é notado quando você quer desenvolver as magias com mais de uma variável combat. Aquelas magias de múltiplos hits e efeitos. Vou pegar uma magia de 3 efeitos e danos diferentes. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setAttackFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4.5, 9) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE) setAttackFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 1, 2) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_SMALLPLANTS) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) setAttackFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 3.5, 7) local area = createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5) setCombatArea(combat1, area) setCombatArea(combat2, area) setCombatArea(combat3, area) function onCastSpell1(cid, var) doCombat(cid, combat1, var) end function onCastSpell2(cid, var) doCombat(cid, combat2, var) end function onCastSpell3(cid, var) doCombat(cid, combat3, var) end function onCastSpell(cid, var) onCastSpell1(cid, var) addEvent(onCastSpell2, 300, cid, var) addEvent(onCastSpell3, 600, cid, var) return true end Com o uso da minha biblioteca, podemos notar a redução de linhas, e a limpeza do código: local combat1 = Combat:New(COMBAT_ENERGYDAMAGE, CONST_ME_ENERGYAREA, CONST_ANI_ENERGY) combat1:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 4.5, 9) local combat2 = Combat:New(COMBAT_ICEDAMAGE, CONST_ME_ICEAREA, CONST_ANI_ICE) combat2:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 1, 2) combat2:SetId(2) combat2:SetDelay(300) local combat3 = Combat:New(COMBAT_EARTHDAMAGE, CONST_ME_SMALLPLANTS, CONST_ANI_EARTH) combat3:SetFormula(COMBAT_FORMULA_LEVELMAGIC, -1, 0, -1, 0, 5, 5, 3.5, 7) combat3:SetId(4) combat3:SetDelay(600) local T = {1, 2, 4} local area = { {T, T, T}, {T, T, T}, {T, T, T}, {0, T, 0}, {0, 3, 0}, } local spell = Spell:New(CONST_SPELL_DIRECTION) spell:SetArea(area) spell:Append(combat1, combat2, combat3) function onCastSpell(cid, var) return spell:Cast(cid) end Qualquer dúvida quanto ao uso da biblioteca no desenvolvimento de magias, basta postar neste tópico que estarei esclarecendo. Grande Abraço, Oneshot.1 ponto
-
[spoile]City Saffron: http://imageshack.us/a/img29/4636/6p8t.png http://imageshack.us/a/img833/5241/dn5d.png http://imageshack.us/a/img30/1807/2ny.bmp http://imageshack.us/a/img203/6584/xohn.png Espero que tenham gostado...1 ponto
-
[USA] PStrategic Battle - Custom Map - Custom Client (1.0)
murluka reagiu a Jakewilliams por um tópico no fórum
General Information: IP: PSBattle.com PORT: 7171 Client: Custom Client, download link: http://psbattle.com/eng/downloads.php Uptime: 24/7 Hosted IN: USA Website: PSBattle.com Exp Rate: STAGES Map: Custom (PAdventures Remake) Loot: x1 Server Type: PVP ENFORCED The server: History Quote: Currently there are 5 organizations ruling on each continent, you can choose any of these organizations, they come with different quests, missions, respawn areas and a custom history based on the history line: * Rocket - Kanto * Aqua / Magma - Hoenn * Galaxy - Sinnoh * Plasma - Unova And the "Good Side": * PSWO - Johto. There are only two organizations available: Rocket: Pokémon Police (PWSO): Which one are you going to join?.... Our systems: We have a lot of new systems to this branch of the OpenTibia, as some notable systems we have: Rank Points System (PERSONAL) We have a special rank system, used to have a thousands of new ranks at this server, called as the military ranks... What ranks we have?:Classic Recruit Recruit Recruit Chief Basic Sergeant Sergeant Sergeant Major Basic Lieutenant Lieutenant Lieutenant Major Basic Captain Captain Captain Major Basic Major Major Boss Major Basic Colonel Colonel Colonel Major Basic General General (Highest RANK) If you got a rank, you will have some benefits, like:More Catch RateAnd a title on your name, showing your rank (IS JUST A TAG SYSTEM): How you will win rank points? - Just leveling, doing tasks for your team and much more.... Global Rank System: - As a PVP Game World, we've a special point system, based on the strongest companies, they will have some special things... That will be used and achieved in the special PvP battles which will come in the future (Defeating your enemies)... With that, from 1st to 7th of each month, they will have "special things", like Extra Exp, Extra Catch Rate, More Power, ETC. And you will see it at our website: How the team will win points? Just gain some points yourself and do tasks. Boost system: There are a lot of boosts system around the Pokemon ATS, but we have a new custom system at our server, and how it works? Keep reading!: - You will need some boosts items: With the items you will need to upgrade your Pokémon based on percents (1% to 10%), and the needed amount works based on the desired percent of what you want to reach (2 bottles of any boost to get 2% at the Skill), the limit of the skill boost are 10%. How it looks ingame?: And it works with our special bonus system of the pokemon, its a good way to power UP the pokemon, but how you can find it? At the diamond shop, as we know what this special item works as a power-up to all pokemon, its going to cost 1 Diamond in-game per bottle of any skill of which you want to upgrade. Perfect Balance: - The current problem of all pokémon ATS is the non-balanced attacks, pokemon, and systems... We are going to follow and fix everything, and all necessary things to get that GBA perfect balance, you will feel like your playing on your GBA or DS, but online, and with more features... That means: * If you catch a Bulbasaur at LVL 15, and you evolve it at level 16, it will remain the same stats as a Savage Ivysaur 16, this is the end of those Unbalanced ATS with OverPowered Pokémon!!! Yeah, so, why i should go level up a pokemon from a low level? - We know that our perfect balance system can't go as is, so, your pokemon will be gaining some special bonuses when you are leveling it: There is a small change in the offense, you will be gaining a special percent per level, based on the special bonus system of GBA, (1% of ATK, DEF, SP.ATK, ETC)... HM SYSTEM: - We have a HM system based on GBA, where you just teach the CD to the Pokémon and it keeps learned forever: We currently have:HM 1 - CUT HM 2 - FLY HM 3 - RIDE HM 4 - SURF HM 5 - DIG HM 6 - FLASH HM 7 - WATERFALL HM 8 - ROCK SMASH HM 9 - TELEPORT HM 10 - DIVE HM 11 - STRENGHT HM 12 - FIND HOLE HM 13 - DEFOG HM 14 - MINING HM 15 - CONTROL MIND HM 16 - ROCK CLIMB And, just the older premium older habilities will be sold at our premium shop (ride, fly, surf, teleport). As long the pokemon have learned that HM you will not need any another charge like premium, you can be free acc. Clan Power: The organizations will have more power on the elements what they own:Rocket (Normal and Fighting Type). Magma (Fuego and Dragon Type). Aqua (Water and Ice Type) Galaxy (Psychic and Dark Type) Plasma (Poison and Ghost Type) Pokemon Security Squad (Rock and Ground Type) The other elements may be free to use by any other organization, but that does not mean that you, as a player, will have to use it or want anything else, just mean your percentages of power that belong to an organization, besides that each parent... The first element of any organization above will be more powerful than the second element. Stats Systems (SKILLS): Your character will have it's own unique stats, never seen in any current pokémon fan based game: * Intelligence: It will be necessary to have a variety of Pokemon attacks, unlock pokemon skills, pokemon of varying regions, player skills, and more! * Leadership: "Every pokemon needs to feel safe...", With this skill, the pokemon will know how to cast it's attacks correctly, and you can inflict more damage, gain more Pokémon stats, and more! * Dexterity: With this skill,you can perform various tasks while you advance through the game, it helps you gain better rewards from natural abilities such as; woodcutting, mining, etc. * Luck: A skill which is used in your career as a Pokemon Trainer! various things in the Pokemon World will be based off of pure luck, the quests you will find, will require luck for major rewards or several items, Catch rate also lies with-in luck, among several things. * Vitality: Your player life... while you've more health, you will have more chances to survive, in a high-end pokemon battle! * Pokemon Friendship: The most important skill of the Pokémon side... With this skill, you will be granted the abilities to evolve pokemon throughout the world! * Cooking: In the pokémon environment, you will need to know how to feed your friends and pokemon, with this skill, you will know how to make some special food, with special attributes, and more! * Extra Skills: We got tons more hidden skills for you guys to figure out in the pokemon world of PBR! And how will one upgrade these skills? We are going to use the known "Attribute System", used on some popular and good servers such as; Kingdom Age, games As SAO, and other projects, you will be gaining points depending on your level, and you can use it depending on your abilities (TABLE BASED ON KINGDOM AGE): By level of player, you will win: - From 1 to 49, you gain 4 attribute point. - From 50 to 100, you gain 3 point attribute. - From 100 to 150, you gain 2 attribute points. - From 150 to infinity, yoy gain 1 point per level attribute. (Credits to Kingdom Age, they have a good attribute system, and we're just copying their method as it works really well!) Cassino System: Tired of those cassinos of the dash distro? No more!, we have a unique cassino system! Here you will have a lot types of games, like the PVP Jackpot, survival mode or just the old machine game, we work as GBA, with the CCoins System at the game... ¿How the PVP Jackpot Works? - At the 30th of each month, we've a special battle between users, where you just need to win with your team (As long you are Rocket or Police). ¿How the Survival Mode Works? - Each 15, you will send into the battlefield as in the Jackpot, but, this is just survive or die, there aren't chance to hide. ¿How works the old machine system? - You just need to buy the CCoins at the NPC Shino and start to play, it cost just 15 CCoins and the highest prize are 1000 CCoins. Prizes: - Just like GBA, you need to get the required CCoins to get a Pokémon. Join into our official discusion thread: - http://otland.net/threads/pokemon-battle-revolution-new-pokemon-ats-official-progress-thread.199588 Greetings [/color]1 ponto -
Unmatched WODBO - 999x, PvP-E, Senzu Infinita
LudosGamer reagiu a The Babidy por um tópico no fórum
Otimo servidor jogo e recomendo Se precisarem de ajuda estarei la pra ajudar Procurem por mim in-game: Babidy ou Babiloko1 ponto -
1 ponto
-
[Arquivado]Pokemon Omega Ω O seu Projeto
LekoDS reagiu a StyloMaldoso por um tópico no fórum
huauha, falou tudo mano ! @Esse Smix e suas manias, eche os "ot-admin" do fórum de alegria e depois de 2 semanas desisti, é sempre assim, e pelo jeito, sempre sera !1 ponto -
1 ponto
-
No script que eu passei vc n precisa mudar nada. Vc tem mudar o item que vc vai dar use, o item que esta na tag do actions.xml.1 ponto
-
Possível, é, mas é muito trabalhoso e totalmente feito nas sources do servidor. Abraços.1 ponto
-
Plaster Tile
Folspa reagiu a ScythePhantom por uma questão
RME, suporta até versão 9.83; http://www.xtibia.com/forum/topic/173891-983-remeres-map-editor/ Uma dica, para encontrar algum item através do id ou nome, aperte "J" e digite o id ou nome do item desejado, espero ter ajudado.1 ponto -
/mkpoke Nome do pokemon e /mkitem nome do item1 ponto
-
[SPELL] Trap Configuração
wesleybeek reagiu a Maenilse por uma questão
esquenta pra esses comentarios nao lek, pode fazer qnt pedidos quiser, nao tem regras q mostre qnts pedido pode fazer no maximo, e vamos parar de falar no topico, antes que sejamos alertado.1 ponto -
Outland completa para POKÉMON - Ilhas para POKÉMON
Drk Shadow reagiu a murluka por um tópico no fórum
Download do server: http://www.4shared.com/rar/6Cf8HVVd/pokmon_by_murluka.html? Mas está sem as novas Outlands, e mapa ruim também, mas já que você gostava, aí está o download. Server StyloMaldoso.1 ponto -
Actions / Rank Storage
RodriigoRobson reagiu a Omega por uma questão
function onUse(cid, item) local query = db.executeQuery or db.query query = query("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = 19999 ORDER BY `value` DESC") if query:getId() > -1 then local str = "RANK" local i = 0 repeat local guid, stg = query:getDataInt("player_id"), query:getDataInt("value") local name = getPlayerNameByGUID(guid) str = "\n"..name.." - "..stg i = i + 1 until i == 10 or not query:next() return doShowTextDialog(cid, item.itemid, str) end return doPlayerSendCancel(cid, "Rank cannot be displayed.") end Aí é só criar a action pra um determinado item e apontar pra esse script.1 ponto -
http://www.xtibia.com/forum/topic/151636-simple-task-30/ Já tentou usar esse aqui, mas configurar um monstro só? A quantidade de monstros é totalmente configurável, pode usar 1 só.1 ponto
-
Se deixar com os sistemas básicos 'perfeitos', será de ÓTIMO tamanho. Se quebrasse o limite de sprs/effects então, vish1 ponto
-
Nova Outland (Fly) Prints: Download: http://www.4shared.com/rar/DhmX127W/MAPA_29102013.html? Dei uma arrumada na Outland Normal e também arrumei alguns bugs do configuration.1 ponto
-
[Encerrado]Procurando equipe
Teasure reagiu a markindoot por um tópico no fórum
estou com um projeto em andamento, irei le adicionar no skype. Minha equipe é bem simples: Eu: Mapper, Meu Irmão: Spriter.1 ponto -
[Encerrado]Procurando equipe
Teasure reagiu a mkbrabsolute por um tópico no fórum
Legal e interessante, boa sorte que logo você acha um parceiro para trocar idéias e desenvolver um projeto. Sinceros votos de boa sorte!1 ponto -
O FPS ta muito baixo. Lá em Advanced, ajusta o ultimo controle até que o current frame rate fique no minimo em 30. O atalho Alt + F8, se eu não estiver enganado, mostra o FPS na tela.1 ponto
-
Edit/Find... A imagem esta errada, mas é apenas para vc saber onde fica o edit. O Find é a opção acima da que fora escolhida nesta imagem. O PVP escolhido esta no 2 /1 /0?1 ponto
-
New SUJA'SHOW OFF
Desnecessario reagiu a Nu77 por um tópico no fórum
Como ultimamente estou ocupado, eu vou postar umas outlines que eu fiz e provavelmente depois eu termine xD metal greymon: Cenario:1 ponto -
Global Server 10.10
Jackgoku reagiu a alissonfgp por um tópico no fórum
TFS sempre tem virus fraco, uns antivirus acusa e outros nao, esse virus nao faz nd, pelo menos eu nunca vi atrapalha alguem... E bom, nao é eu que desenvolvi as sources qualquer coisa fala com TFS Team sobre isso, só fiz update 10.10.1 ponto -
Tibia Config Manager
ChockerrGamer reagiu a Blazingfire por um tópico no fórum
Fiz esse programa pra salvar minhas hotkeys e configurações de cada char e versão do jogo, já que muitos servers não tem client próprio e todas as versões do client do Tibia usam o mesmo arquivo CFG para armazenar as configurações do jogo. Tibia CM.rar Scan: clique aqui Senha para extrair: xtibia1 ponto -
1 ponto
-
Novos Pokemons
JonPiress reagiu a Faelzdanil por um tópico no fórum
Ola povo lindo ! Estou trazendo outro conteúdo pra vocês... Agora são os novos Pokemons que a PXG lançou. Não são exatamente novos, e sim com um design diferente e melhorado. Esses pokemons são: Arcanine / Shiny Arcanine; - Contendo Ride Blastoise / Shiny Blastoise; - Contendo Surf Charizard / Shiny Charizard; - Contendo Fly Venusaur / Shiny Venusaur; - Contendo Ride Kabutops; - Contendo Surf Ancient Blastoise; Ancient Charizard; Uma imagem mostrando como eles estão: Bom como podem ter notado, estão bem diferentes e mais bonitos. ( amei o arcanine ) Então é isso ai, espero que tenham gostado. Downloads: Formatos .IDC Link 1 ( SpeedyShare ) Link 2 ( MediaFire ) Link 3 ( 4Shared ) Scan Download: Formatos .bmp Link 1 ( SpeedyShare ) Scan Corpse Kabutops Link 1 ( SpeedyShare ) Créditos: PokeXGames @FlamesAdmin1 ponto -
Olá galera do XTibia, venho postar o Jail System, mas Atualizado!!! Já vi muitos Jail System por ai, mas vi que alguns tem erros, outros não aparece mensagem nenhuma para quando o player vai para a cadeia e quanto tempo ficará, ou outros que é impossível ajustar o tempo... É um script perfeito para GODs que odeiam players enchendo o saco, ai é só escrever !prender NOME, que se livrará do tal player chato! Vamos as informações do script: Nome: Jail System Atualizado Créditos: 100% CoGames Função: Um player enchendo seu saco? Mete !prender PLAYER e livre-se dele! Automaticamente ele irá para a cadeia e em tanto tempo ele sairá de lá! É como um castigo para o jogador! BUGS ou ERROS: Não, testei em meu servidor 8.4, em um Slayer Yurots 8.54 e em um Styller Yurots Editado 8.6 e funcionou perfeitamente nos 3! Versão apropriada: 8.4 Vamos ao trabalho!!! Primeiro vá em data/talkactions/scripts, copie e cole um arquivo.lua e renomeie-o para Prisao.lua, dentro cole: O que eu escrevi em vermelho, são as palavras que você pode editar!!! O que eu escrevi em azul, é o tempo de prisão!!! Agora vamos em data/talkactions/talkactions.xml, e em alguma linha cole: Acima você pode editar o comando e o nome do arquivo.lua para funcionar perfeitamente! Eu sei que puis alguns comandos a mais, mas é só para complementar, ou seja, para não dar erro no script! Como Usar: No jogo, escreva !prender NOME DO PLAYER, para prender o jogador, e para tirar da cadeia fale !desprender NOME DO PLAYER. E então terminamos o script, obrigado galera, qualquer coisa só comentar!!! Não se esqueça do REP+ se Gostou ;D!1 ponto