Pesquisar na Comunidade
Mostrando resultados para as tags ''Biblioteca/Função''.
Encontrado 62 registros
-
Gerador de Outfits Automática para o Site
Olá meus senhores, tem muita gente que pede serviços em relação a Gerar Outfits Animadas do seu cliente, o que muitos não sabem é que existe esse sistema de Gerar as Outfit animadas gratuitamente na internet e ele foi desenvolvido pelo Gesior.pl (Polones), então todo o crédito deste tutorial em relações a códigos vão para ele. Primeiro de tudo, o que é esse Sistema de Gerar Outfits Animadas? Basicamente é 1 Sistema Web que vai ler o teu tibia.spr / tibia.dat e seu items.otb e gerar todas suas outfit do seu cliente em forma de frames e na hora de exibir o sistema utiliza uma script em php que fica responsável por montar 1 gif utilizando esses frames. O resultado é algo como isto: Existe 2 formas de utilizar o sistema, eu vou ensinar a mais fácil, para quem quiser vou deixar o link do código fonte e vocês podem simplesmente estar clonando o repositório e fazer suas alterações a vontade. (Sim, ele é open source e.e). Código Fonte: https://github.com/gesior/open-tibia-library Explicando como utilizar o sistema: 1° acesse o link => https://outfit-images.ots.me/generator/ Você deve visualizar algo como isto: Percebam que ele vai pedir os seguintes dados: -Client Version: -Sprite file: -Dat file: -Otb file: Antes de sair adicionando, precisamos configurar nosso cliente para que o sistema consiga reconhecer ele. Abra seu cliente no object builder. Agora vá na área de effects e apague todos os efeitos. Sim apague TODOS, agora vá até Tools->Spriter Otimizer Clique em start e você vai ter 1 retorno parecido com isto: Agora aperta CTRL+SHIFT+S, vamos salvar esse cliente em 1 pasta separada (você só vai usar ele pra esse sistema, então fique tranquilo, você não vai apagar o original). Na hora de salvar deixe desmarcado as 3 opções (Extended, Transparency, Improved Animations). Tendo feito isso, agora vamos voltar para o site. Em Client Version você vai digitar a versão de seu cliente. Exemplo: Se for 8.60 digite 860 Em sprite file você vai selecionar o tibia.spr do seu cliente que você exportou (esse sem efeitos) Em dat file você vai selecionar o tibia.dat do seu cliente que você exportou (esse sem efeitos) Em otb file você vai selecionar o items.otb do seu servidor. Agora clique em Load Files. Você deve ter 1 retorno parecido com isto: Agora clique em Generate Imagens e ele vai começar a gerar os frames das suas outfits. Ao terminar ele vai efetuar sozinho o download das outfits. Agora acesse este repositório no github e baixe os arquivos: https://github.com/gesior/open-tibia-library/tree/master/tools/colored-outfit-images-generator Tendo feito o download, você vai extrair a pasta outfits.zip que você baixo e extrair a pasta que você clonou o repositório. Ao extrair o arquivo outfits.zip você vai encontrar 1 pasta chamada outfits_anim, dentro dela você deve ter algo como isto: Cada pasta é referente a 1 looktype do seu cliente. Agora copie a pasta 'outfits_anim' que está dentro da pasta outfits que você extraiu e cole dentro da pasta do repositório que foi clonado. Ficando assim: Pronto, agora você somente precisa deixar essa pasta em 1 servidor web e utilizar a mesma via requisição. Exemplo: Se você for exibir uma outfit, você pode exibir da seguinte forma: <img src="http://seudominio.com/nomedapastaqueestaoosarquivos/animoutfit.php/?id=270"> Esse id será o looktype que você deseja. Lembrando que: Você pode colocar 1 script pra puxar a outfit de cada vocação e chamar esse diretório, ele vai exibir a imagem já com o diretório correto. Sugestão de uso: Para derivados de NTO/DBO e afins, você pode utilizar para exibir as outfits de transformações de cada Personagens, algo como isto: Outra opção é exibir na lista de Ranking no menu da direita (Normalmente Tibia Classico faz isso) A criatividade fica por conta de vocês. Créditos: Gesior.pl por todo o código e disponibilizar para a comunidade em 1 Forum Gringo A mim por disponibilizar o tutorial para a comunidade.
-
Idiomas para o jogo, português e espanhol
Estou criando um servidor com base nos scripts de TFS 1.x e voltado ao público da america latina por causa do baixo ping na VPS... Argentina, Bolívia, Brasil, Chile, entre outros, portanto sei que falamos em português e nossos vizinhos em espanhol. Todos os sistemas do meu servidor são pensados para terem traduções e venho por meio deste tópico compartilhar à vocês algumas dessas funções: Antes de qualquer coisa, você precisará adicionar a seguinte variável em alguma biblioteca: USER_LANGUAGE = 1022118443 Agora que adicionou essa variável em alguma biblioteca, poderá adicionar as seguintes funções na mesma biblioteca, porém a baixo da variável USER_LANGUAGE. A primeira função serve para retornar qual idioma o player está usando: --[[ getLanguage, how to use: player:getLanguage() ]] function Player.getLanguage(self) if self:isPlayer() then if self:getStorageValue(USER_LANGUAGE) < 1 then return "portuguese" else return "spanish" end else print("getLanguage: Only works on players..") end end Um exemplo de como usar: player:getLanguage() A segunda função serve para alterar o idioma do player. O ideal é que seja usada na primeira vez em que o player loga no servidor: --[[ setLanguage, how to use: player:setLanguage("portuguese") ]] function Player.setLanguage(self, language) local value = 0 if self:isPlayer() then if language == "portuguese" then value = 0 elseif language == "spanish" then value = 1 else print("setLanguage: Only two options available. Choose one of them: 'portuguese' or 'spanish'.") end return self:setStorageValue(USER_LANGUAGE, value) else print("setLanguage: Only works on players..") end end Exemplos de como usar: player:setLanguage("portuguese") ou player:setLanguage("spanish") A terceira e não menos importante função, serve para mandar uma mensagem de texto ao jogador, porém ele receberá no idioma em que escolheu: --[[ sendLanguageTextMessage, how to use: local portugueseMessage = "Ola, tudo bom? Isto aqui é um algoritmo!" local spanishMessage = "Hola todo bien? Esto de aqui es un algoritmo!" player:sendLanguageTextMessage(MESSAGE_EVENT_ADVANCE, portugueseMessage,spanishMessage) ]] function Player.sendLanguageTextMessage(self, type, portugueseMessage, spanishMessage) if self:isPlayer() then if self:getStorageValue(USER_LANGUAGE) < 1 then return self:sendTextMessage(type, portugueseMessage) else return self:sendTextMessage(type, spanishMessage) end else print("sendLanguageTextMessage: Only works on players..") end end Um exemplo de como usar: player:sendLanguageTextMessage(MESSAGE_EVENT_ADVANCE, portugueseMessage, spanishMessage) O primeiro parâmetro é o tipo de mensagem, o segundo parâmetro será a mensagem em português e o terceiro parâmetro será em espanhol.
-
Ball poketibia
-
Ajuda em como adicionar Source em NewClient 8.54 Poketibia
Saudações a todos, venho por meio deste tópico pedir uma ajuda no qual estou tentando fazer a muito tempo. Já vi alguns post aqui mesmo no TK, mas nenhum eu tive êxito. Por isso venho pedir um socorro de como eu consigo aumentar a quantidade de MagicEffects acima de 255 no meu NewClient OTC? Se alguém puder fortalecer ficarei muito grato!!
-
Lista completa de Monstros e Looktypes
LISTA DE LOOKTYPES 0-1283
-
[LUA] IP STORAGE
Uma função que ao invés de usar o "cid" para pegar o valor de uma storage, usa o ip do jogador. baseado neste pedido: INSTALAÇÃO: Execute essa query: CREATE TABLE `ip_storages` ( `ip` int NOT NULL default 0, `key` int NOT NULL default 0, `value` varchar(255) NOT NULL default 0 ) funções para serem adicionadas na lib: function setIpStorageValue(ip, key, value) local func = db.executeQuery or db.query local query = db.getResult("SELECT `value` FROM `ip_storages` WHERE `key` = "..key.." AND `ip` = "..ip) if query:getID() == -1 then return func("INSERT INTO `ip_storages` (`ip`, `key`, `value`) VALUES ("..ip..", "..key..", "..value..")") end return func("UPDATE `ip_storages` SET `value` = "..value.." WHERE `key` = "..key.." AND `ip` = "..ip) end function getIpStorageValue(ip, key) local ret = db.getResult("SELECT `value` FROM `ip_storages` WHERE `ip` = "..ip.." AND `key` = "..key) if ret:getID() == -1 then return -1 end return ret:getDataInt("value") or ret:getDataString("value") end exemplo de uso: pegar baú a cada X horas: function onUse(cid, item, fromPosition, itemEx, toPosition) local storage, hours = 18000, 24 local ip = getPlayerIp(cid) local item = 2160 if getIpStorageValue(ip, storage) - os.time() <= 0 then doPlayerSendTextMessage(cid,22,"Tome seu prêmio.") setIpStorageValue(ip, storage, os.time()+hours*3600) doPlayerAddItem(cid, item, 100) return true end return doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"Espere para pegar um novo item!") end ou só podendo pegar 1x: function onUse(cid, item, fromPosition, itemEx, toPosition) local storage, ip = 18000, getPlayerIp(cid) local item = 2160 if getIpStorageValue(ip, storage) > 1 then doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"voce ja pegou o item!") return true end doPlayerSendTextMessage(cid,22,"Tome seu prêmio.") setIpStorageValue(ip, storage, 1) doPlayerAddItem(cid, item, 100) return true end
-
setCreatureName(cid, name, description)
Olá pessoal, eu estava ajudando um amigo em um script de Tibia Naruto, e me deparei com a necessidade de usar uma função para trocar o nome de um summon, mas isso teria que ser inGame, e depois de procurar um pouco achei a função setCreatureName, que faz exatamente o que eu precisava. O que ela faz? Como eu expliquei acima, ela muda o nome da Creature inGame, podendo ser bastante útil (dependendo da sua criatividade). Como instalar? A instalação é feita inteiramente nas sources, então vamos lá .. 1 - No arquivo monster.h encontre esse trecho: class Monster : public Creature { private: Monster(MonsterType* _mType); public: E adicione isso abaixo de public:: std::string name, nameDescription; 2 - Ainda em monster.h procure por: virtual const std::string& getName() const {return mType->name;} E substitua por isso: virtual const std::string& getName() const {return name;} 3 - Ainda em monster.h procure por: virtual const std::string& getNameDescription() const {return mType->nameDescription;} E substitua por isso: virtual const std::string& getNameDescription() const {return nameDescription;} 4 - Ainda em monster.h procure por: virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} E substitua por isso: virtual std::string getDescription(int32_t) const {return nameDescription + ".";} 5 - Agora em monster.cpp procure por: Monster::Monster(MonsterType* _mType): Nas linhas abaixo tem a linha: raid = NULL; , adicione isso logo abaixo: name = _mType->name; nameDescription = _mType->nameDescription; 6 - Agora em luascript.h adicione isso perto das linhas semelhantes: static int32_t luaSetCreatureName(lua_State* L); 7 - Agora em luascript.cpp adicione isso perto das linhas semelhantes: //setCreatureName(cid, name, description) lua_register(m_luaState, "setCreatureName", LuaInterface::luaSetCreatureName); 8 - Ainda em luascript.cpp adicione isso perto das linhas semelhantes: int32_t LuaInterface::luaSetCreatureName(lua_State* L) { // setCreatureName(cid, newName, newDescription) std::string newDesc = popString(L); std::string newName = popString(L); ScriptEnviroment* env = getEnv(); Creature* creature; if (creature = env->getCreatureByUID(popNumber(L))) { Monster* monster = (Monster*)creature; monster->name = newName; monster->nameDescription = newDesc; lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } Pelo fato de algumas diferenças no modo de escrever a função entre as TFS, pode ocorrer erros, e então substitua as seguintes linhas dos 2 passos anteriores: Créditos: Scarlet Ayeid É isso pessoal ... um exemplo de uso dentro de alguma função é assim basicamente: local pos = {x = 10, y = 10, z = 7} local Teste = doCreateMonster("Rat", pos) setCreatureName(Teste, ""..getCreatureName(cid).."", "a "..getCreatureName(cid).."") Espero ter ajudado pessoal, até mais.
-
Algumas funções Lua
Biblioteca de funções Lua Eu me recordo que alguns anos atrás quando iniciei meus estudos em Lua, a biblioteca de funções postada pelo @xWhiteWolf me ajudou muito com a escrita de alguns scripts, me fez economizar tempo e algumas linhas de código. Ter uma biblioteca de funções uteis é uma mão na roda para qualquer desenvolvedor pois poupa tempo que teria de ser gasto desenvolvendo algo que algum outro programador provavelmente já fez. Pensando nisso, hoje eu decidi trazer algumas funções Lua, tenho certeza que poderá ser útil pra alguém algum dia. Algumas dessas funções foram feitas por mim, outras por amigos meus e algumas eu já nem lembro mais onde encontrei. Irei postar aqui o conteúdo desta biblioteca porem ela também estará no final do tópico como anexo. As funções que me recordo a origem estará com os créditos do autor. Lib Explicação das funções: Por enquanto é isso... pretendo atualizar este tópico sempre que achar necessidade de escrever algo novo ou encontrar algo que possa ser útil a biblioteca. 090-woox_functions.lua
-
Script Teleport por sacríficio de item
Um script simples (sei que existe outros parecidos/iguais, este funcionou perfeitamente pra tfs 0.4), mas que coloca todo um RPG naquela quest/hunt que você quer montar. No caso uma mystic flame fica ao lado (editável) de um empty coal basin (id: 1485) e após colocar um item (editável) em cima desta coal basin, a mystic flame passa a teleportar para um local pré destinado (Funciona exatamente igual ao de acesso as tumbas de Ankrahmun do global). Sem o item no local correto, ela é apenas uma mystic flame sem destino podendo andar em cima dela sem que nada aconteça. Para voltar, coloque outra mystic flame no destino com o AID 19383 (esta mystic flame faz o player retornar sem sacríficio). Vamos ao script ? ? créditos: Andu Em movements.xml adicione estas duas linhas: <movevent type="StepIn" actionid="19382" event="script" value="flametp.lua" /> <movevent type="StepIn" actionid="19383" event="script" value="flametp.lua" /> Em movements crie um arquivo lua com o nome flametp e adicione dentro dele: function onStepIn(cid, item, position, fromPosition) local tileActionID = 19382 -- actionid inserida na primeira mystic flame (a do sacrifício) local tileActionIDBack = 19383 -- actionid inserida na segunda mystic flame (a de retorno sem sacrifício) local coin = 8978 -- id do item que precisará estar na coal basin para que a mystic flame teleporte o player local teleportTo = {x=12687, y=3426, z=14}-- posição em que o player será teleportado ao fazer o sacrifício local teleportBack = {x=14012, y=33793, z=15}-- posição em que o player irá voltar no momento que passar pela mystic flame sem sacrifício local itemPosition = {x=14012, y=33788, z=15, stackpos=STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE} local getItem = getThingFromPos(itemPosition)-- posição em que o item de sacrifício terá que estar para ativar a primeira mystic flame if isPlayer(cid) == TRUE then if item.itemid == 1397 and item.actionid == tileActionID then if getItem.itemid == coin then doRemoveItem(getItem.uid, 1) doTeleportThing(cid, teleportTo) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) doSendMagicEffect(getThingPos(item.uid), CONST_ME_TELEPORT) doSendMagicEffect(itemPosition, 15) end elseif item.itemid == 1397 and item.actionid == tileActionIDBack then doTeleportThing(cid, teleportBack) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) doSendMagicEffect(getThingPos(item.uid), CONST_ME_TELEPORT) end end return TRUE end
-
Erro no sistema de Auto Loot
Pessoal estou com um problema no autoloot que eu adicionei no meu server. Se alguém puder por favor me ajude, estarei disponibilizando algumas prints a baixo. Como vc podem ver, quando eu uso o comando !autoloot ele aparece todas as informações normal, não da nenhum bug quando eu uso os comandos "!autoloot, !autoloot add, !autoloot gold, !autoloot power" Mas quando eu mato um mob da um erro e o dinheiro do comando "!autoloot gold" não vai para o banco, também da erro quando eu uso o comando !autoloot goldinfo. Enfim, basicamente o sistema não está coletando nada PS: Não sei se esse post esta no local correto. Se não estiver por favor movam! att O sistema que eu usei foi um que o Jnetworks postou. As prints: Quando eu uso os comandos n da erro. Quando eu mato um mob com os comandos ativo da esse erro
-
War Castle 48h
Bom estou querendo por um Castle 48h no mue otserv, porem não achei nem um topico com o sistema, eu procurei muito aqui no forum e não achei, se alguem puder por gentileza estar me ajudando agredeço !!
-
Compilando Autoloot + Modal Windows no Otclient v8
Galera, tenho um OTX 3.9 - Versão DEV Gostaria de adicionar/compilar o Autoloot + MODAL windows de autoloot no, OtClient8 Seguindo esse tutorial: Outro Forum É possível ?
-
ANTIENTROSA - Número de players e SSAMIGHT
Salve galera, Esse é meu primeiro post aqui no fórum então me desculpe caso esteja postando no lugar errado. Estou com 2 problemas na minha anti-entrosa: O primeiro é que não consigo selecionar o número de players de cada guild, ela está configurando o número de frags total para cada guild, por exemplo se colocarmos 50 frags e cada time tem 10 players quando tiver acontecido 40 mortes de 1 lado quem morrer não consegue mais voltar para citywar e a guerra acaba quando o ultimo é morto totalizando os 50 frags. (Pode entrar quantos players a guild tiver, queria que desse pra estipular o número de players de cada guild que podem entrar). O segundo é que não está bloqueando equipar SSA e Might ring, e também não bloqueia os summons. Vou colocar abaixo meus scripts. LIB Talk Actions Desde já obrigado pela atenção. Att,
-
Sistema de "fraqueza"
Pessoal estou utilizando a base Pokemon Imperium e nela não vem um sistema de "fraqueza" por categoria de pokemon. Precisava mostrar um "Lower" ou "Miss" como dano quando um pokemon tipo fogo atacasse um pokemon tipo água, ou um dano reduzido. Estou com dificuldade em pesquisar, REP++ pra quem ajudar ai. Abraços Pick chamativa
-
Wands "errando" ataque
E ai pessoal, tudo blz? To com um probleminha chato no meu otserver em que duas wands específicas erram ataques quando o target está em movimento. Essas duas wands em particular tem várias opções de efeito e só acontece com elas. Se o target ficar parado, funciona perfeitamente. Alguém saberia como me ajudar? Envio aqui anexos os scripts. Obrigado desde já!! mightystaff.lua elitestaff.lua
-
Lista completa de Magic Effects e Shoot Type
MagicEffects CONST_ME_FIRST = 1, CONST_ME_DRAWBLOOD = CONST_ME_FIRST, CONST_ME_LOSEENERGY = 2, CONST_ME_POFF = 3, CONST_ME_BLOCKHIT = 4, CONST_ME_EXPLOSIONAREA = 5, CONST_ME_EXPLOSIONHIT = 6, CONST_ME_FIREAREA = 7, CONST_ME_YELLOW_RINGS = 8, CONST_ME_GREEN_RINGS = 9, CONST_ME_HITAREA = 10, CONST_ME_TELEPORT = 11, CONST_ME_ENERGYHIT = 12, CONST_ME_MAGIC_BLUE = 13, CONST_ME_MAGIC_RED = 14, CONST_ME_MAGIC_GREEN = 15, CONST_ME_HITBYFIRE = 16, CONST_ME_HITBYPOISON = 17, CONST_ME_MORTAREA = 18, CONST_ME_SOUND_GREEN = 19, CONST_ME_SOUND_RED = 20, CONST_ME_POISONAREA = 21, CONST_ME_SOUND_YELLOW = 22, CONST_ME_SOUND_PURPLE = 23, CONST_ME_SOUND_BLUE = 24, CONST_ME_SOUND_WHITE = 25, CONST_ME_BUBBLES = 26, CONST_ME_CRAPS = 27, CONST_ME_GIFT_WRAPS = 28, CONST_ME_FIREWORK_YELLOW = 29, CONST_ME_FIREWORK_RED = 30, CONST_ME_FIREWORK_BLUE = 31, CONST_ME_STUN = 32, CONST_ME_SLEEP = 33, CONST_ME_WATERCREATURE = 34, CONST_ME_GROUNDSHAKER = 35, CONST_ME_HEARTS = 36, CONST_ME_FIREATTACK = 37, CONST_ME_ENERGYAREA = 38, CONST_ME_SMALLCLOUDS = 39, CONST_ME_HOLYDAMAGE = 40, CONST_ME_BIGCLOUDS = 41, CONST_ME_ICEAREA = 42, CONST_ME_ICETORNADO = 43, CONST_ME_ICEATTACK = 44, CONST_ME_STONES = 45, CONST_ME_SMALLPLANTS = 46, CONST_ME_CARNIPHILA = 47, CONST_ME_PURPLEENERGY = 48, CONST_ME_YELLOWENERGY = 49, CONST_ME_HOLYAREA = 50, CONST_ME_BIGPLANTS = 51, CONST_ME_CAKE = 52, CONST_ME_GIANTICE = 53, CONST_ME_WATERSPLASH = 54, CONST_ME_PLANTATTACK = 55, CONST_ME_TUTORIALARROW = 56, CONST_ME_TUTORIALSQUARE = 57, CONST_ME_MIRRORHORIZONTAL = 58, CONST_ME_MIRRORVERTICAL = 59, CONST_ME_SKULLHORIZONTAL = 60, CONST_ME_SKULLVERTICAL = 61, CONST_ME_ASSASSIN = 62, CONST_ME_STEPSHORIZONTAL = 63, CONST_ME_BLOODYSTEPS = 64, CONST_ME_STEPSVERTICAL = 65, CONST_ME_YALAHARIGHOST = 66, CONST_ME_BATS = 67, CONST_ME_SMOKE = 68, CONST_ME_INSECTS = 69, CONST_ME_DRAGONHEAD = 70, CONST_ME_ORCSHAMAN = 71, CONST_ME_ORCSHAMAN_FIRE = 72, CONST_ME_THUNDER = 73, CONST_ME_FERUMBRAS = 74, CONST_ME_CONFETTI_HORIZONTAL = 75, CONST_ME_CONFETTI_VERTICAL = 76, // 77-157 are empty CONST_ME_BLACKSMOKE = 158, CONST_ME_LAST = CONST_ME_BLACKSMOKE, // 159-166 are empty CONST_ME_REDSMOKE = 167, CONST_ME_YELLOWSMOKE = 168, CONST_ME_GREENSMOKE = 169, CONST_ME_PURPLESMOKE = 170, CONST_ME_EARLY_THUNDER = 171, CONST_ME_RAGIAZ_BONECAPSULE = 172, CONST_ME_CRITICAL_DAMAGE = 173, // 174 is empty CONST_ME_PLUNGING_FISH = 175, ShootTypes CONST_ANI_NONE = 0, CONST_ANI_FIRST = 1, CONST_ANI_SPEAR = CONST_ANI_FIRST, CONST_ANI_BOLT = 2, CONST_ANI_ARROW = 3, CONST_ANI_FIRE = 4, CONST_ANI_ENERGY = 5, CONST_ANI_POISONARROW = 6, CONST_ANI_BURSTARROW = 7, CONST_ANI_THROWINGSTAR = 8, CONST_ANI_THROWINGKNIFE = 9, CONST_ANI_SMALLSTONE = 10, CONST_ANI_DEATH = 11, CONST_ANI_LARGEROCK = 12, CONST_ANI_SNOWBALL = 13, CONST_ANI_POWERBOLT = 14, CONST_ANI_POISON = 15, CONST_ANI_INFERNALBOLT = 16, CONST_ANI_HUNTINGSPEAR = 17, CONST_ANI_ENCHANTEDSPEAR = 18, CONST_ANI_REDSTAR = 19, CONST_ANI_GREENSTAR = 20, CONST_ANI_ROYALSPEAR = 21, CONST_ANI_SNIPERARROW = 22, CONST_ANI_ONYXARROW = 23, CONST_ANI_PIERCINGBOLT = 24, CONST_ANI_WHIRLWINDSWORD = 25, CONST_ANI_WHIRLWINDAXE = 26, CONST_ANI_WHIRLWINDCLUB = 27, CONST_ANI_ETHEREALSPEAR = 28, CONST_ANI_ICE = 29, CONST_ANI_EARTH = 30, CONST_ANI_HOLY = 31, CONST_ANI_SUDDENDEATH = 32, CONST_ANI_FLASHARROW = 33, CONST_ANI_FLAMMINGARROW = 34, CONST_ANI_SHIVERARROW = 35, CONST_ANI_ENERGYBALL = 36, CONST_ANI_SMALLICE = 37, CONST_ANI_SMALLHOLY = 38, CONST_ANI_SMALLEARTH = 39, CONST_ANI_EARTHARROW = 40, CONST_ANI_EXPLOSION = 41, CONST_ANI_CAKE = 42, CONST_ANI_TARSALARROW = 44, CONST_ANI_VORTEXBOLT = 45, CONST_ANI_PRISMATICBOLT = 48, CONST_ANI_CRYSTALLINEARROW = 49, CONST_ANI_DRILLBOLT = 50, CONST_ANI_ENVENOMEDARROW = 51, CONST_ANI_GLOOTHSPEAR = 53, CONST_ANI_SIMPLEARROW = 54, fonte: https://github.com/otland/forgottenserver/blob/master/src/const.h Lista com Gif CONST_ME_DRAWBLOOD = 0 CONST_ME_LOSEENERGY = 1 CONST_ME_POFF = 2 CONST_ME_BLOCKHIT = 3 CONST_ME_EXPLOSIONAREA = 4 CONST_ME_EXPLOSIONHIT = 5 CONST_ME_FIREAREA = 6 CONST_ME_YELLOW_RINGS = 7 CONST_ME_GREEN_RINGS = 8 CONST_ME_HITAREA = 9 CONST_ME_TELEPORT = 10 CONST_ME_ENERGYHIT = 11 CONST_ME_MAGIC_BLUE = 12 CONST_ME_MAGIC_RED = 13 CONST_ME_MAGIC_GREEN = 14 CONST_ME_HITBYFIRE = 15 CONST_ME_HITBYPOISON = 16 CONST_ME_MORTAREA = 17 CONST_ME_SOUND_GREEN = 18 CONST_ME_SOUND_RED = 19 CONST_ME_POISONAREA = 20 CONST_ME_SOUND_YELLOW = 21 CONST_ME_SOUND_PURPLE = 22 CONST_ME_SOUND_BLUE = 23 CONST_ME_SOUND_WHITE = 24 CONST_ME_BUBBLES = 25 CONST_ME_CRAPS = 26 CONST_ME_GIFT_WRAPS = 27 CONST_ME_FIREWORK_YELLOW = 28 CONST_ME_FIREWORK_RED = 29 CONST_ME_FIREWORK_BLUE = 30 CONST_ME_STUN = 31 CONST_ME_SLEEP = 32 CONST_ME_WATERCREATURE = 33 CONST_ME_GROUNDSHAKER = 34 CONST_ME_HEARTS = 35 CONST_ME_FIREATTACK = 36 CONST_ME_ENERGYAREA = 37 CONST_ME_SMALLCLOUDS = 38 CONST_ME_HOLYDAMAGE = 39 CONST_ME_BIGCLOUDS = 40 (OBS: são as nuvens do exevo gran mas vis) CONST_ME_ICEAREA = 41 CONST_ME_ICETORNADO = 42 CONST_ME_ICEATTACK = 43 CONST_ME_STONES = 44 CONST_ME_SMALLPLANTS = 45 CONST_ME_CARNIPHILA = 46 CONST_ME_PURPLEENERGY = 47 CONST_ME_YELLOWENERGY = 48 CONST_ME_HOLYAREA = 49 CONST_ME_BIGPLANTS = 50 (é quase igual, só que cresce mais, não consegui gif) CONST_ME_CAKE = 51 CONST_ME_GIANTICE = 52 CONST_ME_WATERSPLASH = 53 CONST_ME_PLANTATTACK = 54 CONST_ME_TUTORIALARROW = 55 CONST_ME_TUTORIALSQUARE = 56 CONST_ME_MIRRORHORIZONTAL = 57 CONST_ME_MIRRORVERTICAL = 58 CONST_ME_SKULLHORIZONTAL = 59 CONST_ME_SKULLVERTICAL = 60 CONST_ME_ASSASSIN = 61 CONST_ME_STEPSHORIZONTAL = 62 (Ignorado) CONST_ME_BLOODYSTEPS = 63 (Ignorado) CONST_ME_STEPSVERTICAL = 64 (Ignorado) CONST_ME_YALAHARIGHOST = 65 CONST_ME_BATS = 66 CONST_ME_SMOKE = 67 CONST_ME_INSECTS = 68
-
[Function] Converter tempo
Bom, eu estava cansado de ficar fazendo os cálculos para exibir as horas, minutos ou segundos quando faço algum script com cooldown. Então, eu criei essa função simples que converte o valor em segundos para hora, minuto e segundo. Exemplos: convertTime(60) retornará "1 minuto" convertTime(61) retornará "1 minuto e 1 segundo" convertTime(3600) retornará "1 hora" convertTime(3601) retornará "1 hora e 1 segundo" convertTime(3661) retornará "1 hora, 1 minuto e 1 segundo" E como eu sou babaca perfeccionista, o português também vem correto. Enfim, aqui está a função. function convertTime(a) if(type(tonumber(a)) == "number" and a > 0) then if (a <= 3599) then local minute = math.floor(a/60) local second = a - (60 * minute) if(second == 0) then return ((minute)..((minute > 1) and " minutos" or " minuto")) else return ((minute ~= 0) and ((minute>1) and minute.." minutos e " or minute.." minuto e ").. ((second>1) and second.." segundos" or second.." segundo") or ((second>1) and second.." segundos" or second.. " segundo")) end else local hour = math.floor(a/3600) local minute = math.floor((a - (hour * 3600))/60) local second = (a - (3600 * hour) - (minute * 60)) if (minute == 0 and second > 0) then return (hour..((hour > 1) and " horas e " or " hora e "))..(second..((second > 1) and " segundos" or " segundo")) elseif (second == 0 and minute > 0) then return (hour..((hour > 1) and " horas e " or " hora e "))..(minute..((minute > 1) and " minutos" or " minuto")) elseif (second == 0 and minute == 0) then return (hour..((hour > 1) and " horas" or " hora")) end return (hour..((hour > 1) and " horas, " or " hora, "))..(minute..((minute > 1) and " minutos e " or " minuto e "))..(second..((second > 1) and " segundos" or " segundo")) end end end Obs: se der algum bug com algum número, é só postar, não testei todas possibilidades (obviamente). Por fim, sei que fazer o horário no formato 00:00:00 ou retornar o valor de horas, minutos e segundos separadamente me pouparia metade do trabalho e, no segundo caso, deixaria mais fácil para controlar os dados, mas eu queria que viesse nesse formato mesmo. Anyway, espero que seja útil e poupe o trabalho de alguém.
-
[TFS 1.2] Offline Message
Offline Message by vankk Eu estava codando um sistema de Auction para o Aura, e precisou dessa função, e gostaria de compartilhar com vocês para caso vocês precisem também. Basicamente o script irá enviar uma message para um jogador contendo uma mensagem. Execute em seu phpMyAdmin essa query: CREATE TABLE `offline_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `player_name` varchar(64) NOT NULL, `message` TEXT NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`player_name`) REFERENCES `players`(`name`) ON DELETE CASCADE ) ENGINE=MyISAM DEFAULT CHARSET=latin1 Em data/global.lua adicione function doSendOfflineMessage(targetName, message) db.query(string.format('INSERT INTO `offline_message` (player_name, message) VALUES (%s, %s)', db.escapeString(targetName), db.escapeString(message))) end function Player.checkOfflineMessage(self, playerName) local resultId = db.storeQuery(string.format('SELECT * FROM `offline_message` WHERE `player_name` = %s', db.escapeString(playerName))) if resultId ~= false then local message = result.getDataString(resultId, "message") local id = result.getDataString(resultId, "id") self:sendTextMessage(MESSAGE_INFO_DESCR, string.format('Offline Message:\n%s', message)) db.query(string.format('DELETE FROM `offline_message` WHERE `id` = %d', id)) end end Em data/creaturescripts/login.lua adicione essa linha em qualquer parte do código antes do return true: player:checkOfflineMessage(player:getName()) Para enviar uma mensagem para algum jogador é doSendOfflineMessage(playerName, message). Por exemplo: doSendOfflineMessage('Vankk', 'Aura é o melhor servidor baiak de todos os tempos. Parabéns.') Até a próxima . vankk.
-
Função print_r
Nos últimos dias tive problemas para ler os dados de funções que retornam tabelas (não tinha acesso a source da função no momento para ir checar quais eram os dados presentes) então resolvi fazer essa função bem simples para printar os dados das tabelas no console. Ela faz basicamente a mesma coisa que a função print_r do PHP só que é um pouquinho menos organizada. Enfim, se souber a estrutura de uma tabela, vai entender o output dessa função e vai ser bem útil. function print_r(tabela) if type(tabela) ~= "table" then return tabela end local result = "{" for ind, x in pairs(tabela) do x = (type(x) == "table") and print_r(x) or x..(ind==#tabela and "\n" or ",\n ") result = result..'['..ind..'] = '..x end return result.."}" end Um exemplo de uso aleatório seria: - Tu está trabalhando com uma função que retorna um array e ele é assim: {7, 6, 5, 4, 3, {"hi", "bye"}, "great"} (só que tu não sabes, óbvio), então tu usa a função print_r na função que retorna esse array e o resultado será assim no console:
-
Lib 000-Const
Olá pessoal, venho mais uma vez trazer um tutorial simples, e tentar explicar tudo claramente, esse tutorial pode ficar grande dependendo do desenrolar dele, pois é um pack de tutoriais, então vou usar spoilers para ajudar na formatação do tópico. Nota: as informações usadas abaixo, podem ser tanto usadas com o nome, quanto com o número, e podem ser encontradas na pasta lib no arquivo 000-const https://pastebin.com/0FfPcg7y line4 Coordenadas: Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas. Explicando: doMoveCreature(cid, direction): Serve para mover tanto o player quanto o monstro. Combate: Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas. Parâmetros de condição: Condições: Slots: Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas. Participação: xWhiteWolf Bom, é só isso o tutorial pessoal, espero que tenham gostado, e o que prego nesses tutoriais é a essência da simplicidade, às vezes, uma coisa que parece ser boba para você, pode atormentar uma outra pessoa. Const_ani e Const_me: Tutorial feito e formatado por Caronte o + gato do fórum, avaliações do perfil são bem-vindas. Talktypes and message types: [title][/title] Tutoriais concluídos por ordem de formatação (podem ser alterados assim mesmo): Coordenadas, e suas direções. Combat (ainda há coisas a serem adicionadas). Slots. CONST_ME and CONST_ANI Os assuntos do tópico poderão se diminuídos ou aumentados de acordo com o desenrolar do tempo, gostaria de apoio, e não me incomodaria se alguém se propusesse fazer algum tutorial, eles serão supervisionados por mim e formatados por mim, para serem postados neste tópico. Esse tópico demorou e vai demorar muito para fazer cada tutorial, então eu não me importo com um obrigado e REP+, OBS.: Um obrigado vale bem mais do que um REP+
-
Script init.lua (arrumando bug da store dos servers OTX)
Acabei de ver que postei no lugar errado, alguém pode por favor, mover para a área certa? E aí galera, blz? Então, aí vai o script do init.lua, da store in-game do OTX3, que está bugado nas versões que vocês encontrarem por aí, bugado como? Se o player não tiver cap, remove os coins, não entrega o item, e não devolve o coin depoois e se você liberar o cap também não dá o item... Ou seja, você perde os coins. O que foi alterado? Foi adicionada uma função que verifica se houve erro no script e retorna antes de retirar os coins. Fixado bug nos items agrupáveis também. Há um pequeno erro, se for adicionado mais de 1 item (não agrupável) e não houver cap (por exemplo, 10 blesseds shields, e o player só tem cap para 5, irá entregar os 5 e não vai retirar os coins) Então, não aconselho adicionar mais de 1 item não agrupável (não acontece com items agrupáveis, pois são entregados em um parcel) Acredito que para arrumar este erro, basta colocar os items para irem dentro de um parcel assim como os items agrupáveis, mas acho desnecessário, caso alguém queira, é uma modificação simples de se fazer, então faça por si só. Aí vai Foi útil? Rep+ (foi difícil arrumar, apesar de parecer simples) Foto
-
getNumberVector(k)
Uma função que pode ser útil de varias maneiras: Como funciona? Bom... Ela retorna uma tabela contendo os números do vector, da mesma forma que no XML. Exemplo: "1-50;60;80" ele retornaria uma tabela contendo os números de 1 a 50 e também o 60 e 80. Ainda não entendeu? Então aqui vai alguns scripts de exemplo: Exemplo 1: Exemplo 2: Já da pra ter uma noção de como funciona.
-
Lua Function Library {:No Metamethods:}
Notei que ainda não haviam feito uma lista dessa versão, então eu a fiz. Eis todas as funções, sem metamétodos e em ordem alfabética, do The Forgotten Server 1.2 broadcastMessage(message, messageType) canPlayerLearnInstantSpell(cid, name) canPlayerWearOutfit(cid, lookType, addons) doAddCondition(cid, conditionId) doAddContainerItemEx(uid, virtualId) doAddMapMark(cid, pos, type, description) doChangeSpeed(cid, delta) doChangeTypeItem(uid, newType) doCombat(cid, combat, var) doConvinceCreature(cid, target) doCreateNpc(name, pos, ...) doCreateTeleport(itemId, destination, position) doCreatureAddHealth(cid, health) doCreatureChangeOutfit(cid, outfit) doCreatureSay(cid, text, type, ...) doCreatureSetLookDir(cid, direction) doDecayItem(uid) doMonsterChangeTarget(cid) doPlayeJoinParty(cid, leaderId) doPlayerAddBlessing(cid, blessing) doPlayerAddExp(cid, exp, useMult, ...) doPlayerAddItemEx(cid, uid, ...) doPlayerAddMana(cid, mana, ...) doPlayerAddManaSpent(cid, mana) doPlayerAddMoney(cid, money) doPlayerAddMount(cid, mountId) doPlayerAddOutfit(cid, lookType, addons) doPlayerAddPremiumDays(cid, days) doPlayerAddSkillTry(cid, skillId, n) doPlayerAddSoul(cid, soul) doPlayerFeed(cid, food) doPlayerPopupFYI(cid, message) doPlayerRemOutfit(cid, lookType, addons) doPlayerRemoveItem(cid, itemId, count, ...) doPlayerRemoveMoney(cid, money) doPlayerRemoveMount(cid, mountId) doPlayerRemovePremiumDays(cid, days) doPlayerSendCancel(cid, text) doPlayerSendTextMessage(cid, type, text, ...) doPlayerSetBalance(cid, balance) doPlayerSetGuildLevel(cid, level) doPlayerSetGuildNick(cid, nick) doPlayerSetOfflineTrainingSkill(cid, skillId) doPlayerSetSex(cid, sex) doPlayerSetTown(cid, town) doPlayerSetVocation(cid, vocation) doRelocate(fromPos, toPos) doRemoveCondition(cid, conditionType, subId) doRemoveCreature(cid) doRemoveItem(uid, ...) doSendDistanceShoot(fromPos, toPos, distanceEffect, ...) doSendMagicEffect(pos, magicEffect, ...) doSendTutorial(cid, tutorialId) doSetCreatureDropLoot(cid, doDrop) doSetItemActionId(uid, actionId) doSetItemSpecialDescription(uid, desc) doSetItemText(uid, text) doSetMonsterTarget(cid, target) doShowTextDialog(cid, itemId, text) doSummonCreature(name, pos ...) doTeleportThing(uid, dest, pushMovement) doTransformItem(uid, newItemId, ...) getAccountNumberByPlayerName(name) getConfigInfo(info) getContainerCap(uid) getContainerCapById(itemId) getContainerItem(uid, slot) getContainerSize(uid) getCreatureBaseSpeed(cid) getCreatureHealth(cid) getCreatureMaster(cid) getCreatureMaxHealth(cid) getCreatureName(cid) getCreatureOutfit(cid) getCreaturePosition(cid) getCreatureSpeed(cid) getCreatureSummons(cid) getCreatureTarget(cid) getFluidSourceType(itemId) getGlobalStorageValue(key) getGuildId(guildName) getHouseAccessList(id, listId) getHouseByPlayerGUID(playerGUID) getHouseEntry(houseId) getHouseName(houseId) getHouseOwner(houseId) getHouseRent(id) getHouseTilesSize(houseId) getHouseTown(houseId) getIPByPlayerName(name) getItemDescriptions(itemId) getItemIdByName(name) getItemName(itemId) getItemRWInfo(uid) getItemWeight(itemId, ...) getItemWeightByUID(uid, ...) getMonsterFriendList(cid) getMonsterTargetList(cid) getOnlinePlayers() getPartyMembers(cid) getPlayerAccess(cid) getPlayerAccountType(cid) getPlayerBalance(cid) getPlayerBlessing(cid, blessing) getPlayerByIPAddress(ip, mask) getPlayerByName(name) getPlayerDepotItems(cid, depotId) getPlayerFood(cid) getPlayerFreeCap(cid) getPlayerGroupId(cid) getPlayerGUID(cid) getPlayerGUIDByName(name) getPlayerGuildId(cid) getPlayerGuildLevel(cid) getPlayerGuildName(cid) getPlayerGuildNick(cid) getPlayerGuildRank(cid) getPlayerIp(cid) getPlayerItemById(cid, deepSearch, itemId, ...) getPlayerItemCount(cid, itemId, ...) getPlayerLastLoginSaved(cid) getPlayerLearnedInstantSpell(cid, name) getPlayerLevel(cid) getPlayerLight(cid) getPlayerLookDir(cid) getPlayerLossPercent(cid) getPlayerMagLevel(cid) getPlayerMana(cid) getPlayerMasterPos(cid) getPlayerMaxMana(cid) getPlayerMoney(cid) getPlayerMount(cid, mountId) getPlayerName(cid) getPlayerParty(cid) getPlayerPosition(cid) getPlayerPremiumDays(cid) getPlayersByAccountNumber(accountNumber) getPlayerSex(cid) getPlayerSkill(cid, skillId) getPlayerSkullType(cid) getPlayerSlotItem(cid, slot) getPlayerSoul(cid) getPlayerStorageValue(cid, key) getPlayerTown(cid) getPlayerVocation(cid) getPromotedVocation(vocationId) getSpectators(centerPos, rangex, rangey, multiFloor, onlyPlayers) getThing(uid) getThingFromPos(pos) getThingPos(uid) getTileHouseInfo(pos) getTileInfo(position) getTileItemById(position, itemId, ...) getTileItemByType(position, itemType) getTilePzInfo(position) getTileThingByPos(position) getTileThingByTopOrder(position, topOrder) getTopCreature(position) getTownId(townName) getTownName(townId) getTownTemplePosition(townId) getWorldCreatures(type) Guild.addMember(self, player) Guild.removeMember(self, player) hasProperty(uid, prop) isContainer(uid) isCorpse(uid) isCreature(cid) isItem(uid) isItemContainer(itemId) isItemDoor(itemId) isItemFluidContainer(itemId) isItemMovable(itemId) isItemRune(itemId) isItemStackable(itemId) isMonster(cid) isNpc(cid) isPlayer(cid) isPlayerGhost(cid) isPlayerPzLocked(cid) isPremium(cid) isSightClear(fromPos, toPos, floorCheck) isSummon(cid) playerLearnInstantSpell(cid, name) pushThing(thing) queryTileAddThing(thing, position, ...) registerCreatureEvent(cid, name) setGlobalStorageValue(key, value) setHouseAccessList(id, listId, listText) setHouseOwner(id, guid) setPlayerGroupId(cid, groupId) setPlayerStorageValue(cid, key, value) targetPositionToVariant(position) unregisterCreatureEvent(cid, name) Já que fui eu quem listei e organizei a biblioteca por conta própria, se você for disponibilizar em outro meio, ao menos deixe o meu nick nos créditos. Bom uso ;]
-
Get player Reset
function getPlayerReset(cid) local query = db.getResult("SELECT `reset` FROM `players` WHERE `id`= "..getPlayerGUID(cid)) return query:getDataInt("reset") <= 0 and 0 or query:getDataInt("reset") end function getPlayerReset(cid) return db.getResult("SELECT `reset` FROM `players` WHERE `id = "..getPlayerGUID(cid)):getDataInt("resets") end Ambas são funcionais. Exemplo: function onSay(cid, words, param, channel) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You already reset : "..getPlayerReset(cid).." times.") return true end Adicione uma das duas primeiras funções no arquivo 050-function (Data->lib->050-function) Créditos: @Vodkart pela função @Xafixav
-
[TFS 1.X] getExperienceForLevel
E aí galera do TK.... Estou passando meu OT para TFS 1.2 (OTXSERVER) e estou criando algumas funções para suprir a necessidade de alguns scripts.... Segue a função function getExperienceForLevel(level) level = level - 1 return ((50 * level * level * level) - (150 * level * level) + (400 * level)) / 3 end