Ir para conteúdo

Jovial

Campones
  • Total de itens

    22
  • Registro em

  • Última visita

Tudo que Jovial postou

  1. Pelo erro o seu server não possui a função getCreatureTarget, ou ela tem outro nome.
  2. Ou você muda o nome do tópico avisando que isto é um Bug, ou o mesmo será fechado. Isto que você fez não desliga o server, faz ele cair.
  3. Jovial

    Tibia Multiconfig Mod

    .:Tibia MultiConfig Mod:. Olá pessoal, creio que alguns de você já se depararam com o seguinte problema: "Ao abrir o cliente 8.2, todas as configurações do 8.11 são perdidas e vice versa". Isso ocorre pois os últimos clientes usam a mesma pasta para salvar o arquivo tibia.cfg, que armazena todas as suas configurações (hotkeys, opções de gráfico, etc). Esse Mod se consiste em mudar o nome do arquivo de configuração do tibia para que um cliente não remova as configurações do outro. -Oque preciso para fazer isto? Você apenas precisará de um editor Hexadecimal. Eu utilizei o próprio Notepad++ que pode ser baixado Aqui. -Fazendo a modificação: 1° Passo: Abra o tibia.exe com o Notepad++ ou com o seu editor Hexadecimal. 2° Passo: Se você estiver usando o Notepad++ abra o editor Hexadecimal dele clicando no H na barra de ferramentas (circulado em vermelho). 3º Passo: Vá em localizar (Ctrl + F) e procure "Tibia.cfg" (sem as aspas), certifique-se que no campo "Data Type" esteja "Unicode String". 4º Passo: Altere o nome do arquivo para Tibia81.cfg por exemplo. OBS: Se não me engano você só pode adicionar no máximo dois caracteres novos no nome. -Resultado: Agora cada um dos meus clientes, fiz esse procedimento nos dois que uso, possui um arquivo que armazene suas configurações. Espero ter ajudado. cya;
  4. Primeiro a lib funciona, 2 como posso saber que erro esta dando ai se vcs não colam a msg do erro o erro pode não passar de mal instalação/configuração e ou por faltar alguma função no server que vc deseja usa-la
  5. Obrigado pela sujestão assim que eu tiver tempo eu organizo o tutorial.
  6. Frozen poderia ser mais especifico para que eu possa ver isto?
  7. .:Easy Annihilator Tutorial:. Olá, para quem não sabe o Easy Annihilator é um sistema que criei para facilitar a criação de quests no estilo da anihilator, ou até mesmo arenas de lutas. Para adquirir o script clique aqui. Para melhor entender como é configurado este sistema, aconselho a procurarem Tutorial sobre Array (Tabelas), pois a configuração de uma annihilator, para utilizar o Easy Annihilator System, é feita dentro de Arrays. Configurando: Todas as informações sobre a sua annihilator deverá ser organizada em um Array, no caso vamos nomeá-la Annihilator Irei colocar abaixo a configuração de uma annihilator para 4 players e 6 monstros, igual a global, você só precisará mudar as posições para as do seu mapa. local Annihilator = { --Aqui iniciamos uma Array, coloquei 'local' para que ela existir somente neste arquivo. ANNIHILATOR_LEVER_UNIQUEID = 5000, --Aqui você coloca o uniqueid da sua alavanca ( o uso da virgula no fim é obrigatório, pois estamos dentro de uma Array, a Annihilator_config). MIN_LEVEL = 100, --Aqui você coloca o level minimo para fazer a quest. STORAGE = 5000, --Aqui você coloca o numero do Storage que deseja usar para salvar as informações da quest (para marcar/verificar se o player ja fez a quest). CHECK_INVISIBLE_ACCESS = 1, --Aqui você poe o access minimo para ser ignorado, na verificação se a sala está vazia. (para não contar gms como players). CHESTS = { --Aqui estamos abrindo uma array chamada CHESTS dentro da Array Annihilator_config. {uniqueid = 5001, prize = 2494, count = 1}, --Aqui você configura o uniqueid de cada baú, o item que ira receber (prize) e a quantidade. {uniqueid = 5002, prize = 2400, count = 1}, --Note que como estamos dentro da Array CHESTS usamos virgula para separar os valores, o uso é obrigado, somente no ultimo valor que não se deve colocar virgula. {uniqueid = 5003, prize = 2431, count = 1}, {uniqueid = 5004, prize = 2421, count = 1} --Aqui não existe virgula, é o ultimo valor da array CHESTS },-- Fechamos a Array CHESTS PLAYER_POS = { {x = 500, y = 755, z = 9, stackpos = 253}, --Aqui você irá por as posições dos players, você pode colocar quantas quiser para aumentar o numero de players ou diminuir, mas obedecendo a sintaxe correta, sempre o ultimo valor sem virgula {x = 499, y = 755, z = 9, stackpos = 253}, {x = 498, y = 755, z = 9, stackpos = 253}, {x = 497, y = 755, z = 9, stackpos = 253} }, PLAYER_TOPOS = { {x = 500, y = 755, z = 10}, --Posições para aonde os players devem ser levados, deve ter a mesma quantidade de valores do que a Array PLAYER_POS. {x = 499, y = 755, z = 10}, {x = 498, y = 755, z = 10}, {x = 497, y = 755, z = 10} }, MONSTERS = { {name = "Demon", pos = {x = 500, y = 753, z = 10}}, --Aqui configuramos os monstros, qual deve ser sumonado e qual sua posição, você pode colocar mais ou menos que isto. {name = "Demon", pos = {x = 498, y = 753, z = 10}}, {name = "Demon", pos = {x = 497, y = 757, z = 10}}, {name = "Demon", pos = {x = 499, y = 757, z = 10}}, {name = "Demon", pos = {x = 501, y = 755, z = 10}}, {name = "Demon", pos = {x = 502, y = 755, z = 10}} }, TOP_LEFT_POS = {x = 494, y = 749, z = 10}, --Irei explicar logo abaixo. BOTTOM_RIGHT_POS = {x = 517, y = 760, z = 10}, --Irei explicar logo abaixo. TRASH_POS = {x = 528, y = 754, z = 10}, --Posição de um lugar escondido no mapa para onde os demons antigos serão levados IS_FORGOTTEN_SERVER = TRUE --Se você usa o Forgotten Server ou servers mais recentes troque o FALSE por TRUE, pois a função de teleport de alguns servers é diferente, de qualquer maneira se os player não forem teleportados troque de FALSE para TRUE ou vice-versa, aqui não colocamos virgula, pois é o ultimo valor da Array Annihilator_config. } --Fechamos a Array Annihilator_config --Agora vamos transformar essas informações para uma variavel que conterá o sistema para que essa annihilator funcione Annihilator_ID = AnnihilatorSys:new(Annihilator) Bem, agora vou explicar oque são as variaveis TOP_LEFT_POS e BOTTOM_RIGHT_POS. TOP_LEFT_POS é a posição acima e a esquerda da Annihilator, usada na verificaçao se a sala está vazia ou não.(veja na SS abaixo em azul) BOTTOM_RIGHT_POS é a posição abaixo e a direita da Annihilator, usada na verificaçao se a sala está vazia ou não.(veja na SS abaixo em verde) A annihilator verifica entre elas formando um retangulo, cujos dois de seus vértices são estes pontos, tudo dentro dele será verificado. Tome cuidado para não pegar nenhum lugar fora da annihilator onde possa ter players, pois se tiver alguém la ele será considerado como dentro da annihilator. Bem, está quase tudo pronto. Agora iremos colocar isto em um arquivo. Crie um arquivo chamado Annihilator.lua, e nele coloque a Annihilator configurada para seu server, ficando: local Annihilator_config = { ANNIHILATOR_LEVER_UNIQUEID = 5000, MIN_LEVEL = 100, STORAGE = 5000, CHECK_INVISIBLE_ACCESS = 1, CHESTS = { {uniqueid = 5001, prize = 2494, count = 1}, {uniqueid = 5002, prize = 2400, count = 1}, {uniqueid = 5003, prize = 2431, count = 1}, {uniqueid = 5004, prize = 2421, count = 1} }, PLAYER_POS = { {x = 500, y = 755, z = 9, stackpos = 253}, {x = 499, y = 755, z = 9, stackpos = 253}, {x = 498, y = 755, z = 9, stackpos = 253}, {x = 497, y = 755, z = 9, stackpos = 253} }, PLAYER_TOPOS = { {x = 500, y = 755, z = 10}, {x = 499, y = 755, z = 10}, {x = 498, y = 755, z = 10}, {x = 497, y = 755, z = 10} }, MONSTERS = { {name = "Demon", pos = {x = 500, y = 753, z = 10}}, {name = "Demon", pos = {x = 498, y = 753, z = 10}}, {name = "Demon", pos = {x = 497, y = 757, z = 10}}, {name = "Demon", pos = {x = 499, y = 757, z = 10}}, {name = "Demon", pos = {x = 501, y = 755, z = 10}}, {name = "Demon", pos = {x = 502, y = 755, z = 10}} }, TOP_LEFT_POS = {x = 494, y = 749, z = 10}, BOTTOM_RIGHT_POS = {x = 517, y = 760, z = 10}, TRASH_POS = {x = 528, y = 754, z = 10}, IS_FORGOTTEN_SERVER = TRUE } Annihilator_ID = AnnihilatorSys:new(Annihilator) function onUse(cid, item, frompos, item2, topos) Annihilator_ID:onUse(cid, item) --Essa função verifica faz com que o sistema seja acionado quand oo player der use na alavanca ou no baú return TRUE end Não se esqueça de criar as tags... No caso para este arquivo ficaria: <action uniqueid="5000" script="annihilator.lua"/> <action uniqueid="5001" script="annihilator.lua"/> <action uniqueid="5002" script="annihilator.lua"/> <action uniqueid="5003" script="annihilator.lua"/> <action uniqueid="5004" script="annihilator.lua"/> OBS:Se voçe não for querer monstros não precisa colocar a parte MONSTERS na Array que você for configurar, o mesmo server para os baús. Se não tiver level minimo também não precisa por a parte de level minimo. (Bom para fazer arenas de batalhas ou outro tipo de coisas) Exemplo de 3 annihilators em um único arquivo No exemplo usei os mesmo premios nos baús mas você pode mudá-los, adicionar mais baús ou remover alguns. O mapa foi feito pelo Lambix, eu só fiz a entrada das annihilators(a parte feia =D) Download Espero que vocês tenham entendido, qualquer dúvida é só perguntar. cya; Jovial
  8. .:Easy Annihilator System:. Olá, a um tempo atras fiz um sistema para facilitar a criação de quests como a annihilator, hoje decidi refaze-lo e postar aqui. Como eu não pude testar todas as funções que refiz, pesso a vocês para testar-lo, e , se encontrar bugs reportar-me. Features: Aceita quantidade de players que você desejar. Aceita quantidade de monstros que você desejar. Aceita quantidade de baús que você desejar (Mas é possivel pegar somente um dos itens). Verifica se existe alguem na sala, impossibilitando entrar 2 times juntos. Quando um time entra na sala, os monstros são renovados. Como Instalar: Copie o código abaixo e coloque-o no fim do arquivo "data/actions/lib/actions.lua". --[[ Easy Annihilator by Jovial Version: 2.0 ]] AnnihilatorSys = {} AnnihilatorSys_MT = {__index = AnnihilatorSys} function AnnihilatorSys:new(CONFIG) local ret = CONFIG ret.VERSION = "2.0" setmetatable(ret, AnnihilatorSys_MT) return ret end function AnnihilatorSys:getVersion() return self.VERSION end function AnnihilatorSys:onUse(cid, item) local tmp if (item.uid == self.ANNIHILATOR_LEVER_UNIQUEID) then if (item.itemid == 1945) then if (self:CheckPlayersPositions() == TRUE) then if (self:CheckPlayersLevels() == TRUE) then for tmp = 1, #self.PLAYER_POS do if (self.IS_FORGOTTEN_SERVER == TRUE) then doTeleportThing(getThingfromPos(self.PLAYER_POS[tmp]).uid, self.PLAYER_TOPOS[tmp], FALSE) else doTeleportThing(getThingfromPos(self.PLAYER_POS[tmp]).uid, self.PLAYER_TOPOS[tmp]) end doSendMagicEffect(self.PLAYER_POS[tmp], CONST_ME_POFF) doSendMagicEffect(self.PLAYER_TOPOS[tmp], CONST_ME_ENERGYAREA) end if (self.MONSTERS ~= nil) then for tmp = 1, #self.MONSTERS do doSummonCreature(self.MONSTERS[tmp].name, self.MONSTERS[tmp].pos) end end doTransformItem(item.uid, 1946) else doPlayerSendCancel(cid, "All player need be level " .. (self.MIN_LEVEL or 0) .. " or higher.") end else doPlayerSendCancel(cid, "You need " .. #self.PLAYER_POS .. " players in your team.") end elseif (item.itemid == 1946) then if (self:Check() == TRUE) then doTransformItem(item.uid, 1945) end else return FALSE end else if ((self.CHESTS ~= nil) and (self.STORAGE ~= nil)) then for tmp = 1, #self.CHESTS do if (item.uid == self.CHESTS[tmp].uniqueid) then if (getPlayerStorageValue(cid, self.STORAGE) == -1) then doPlayerAddItem(cid, self.CHESTS[tmp].prize, self.CHESTS[tmp].count) setPlayerStorageValue(cid, self.STORAGE, 1) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have found " .. self:getArticle(getItemName(self.CHESTS[tmp].prize)) .. " " .. getItemName(self.CHESTS[tmp].prize) .. ".") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is empty.") end end end end end return TRUE end function AnnihilatorSys:CheckPlayersPositions() local tmp for tmp = 1, #self.PLAYER_POS do if (getThingfromPos(self.PLAYER_POS[tmp]).uid <= 0) then return FALSE end end return TRUE end function AnnihilatorSys:CheckPlayersLevels() local tmp for tmp = 1, #self.PLAYER_POS do if (getPlayerLevel(getThingfromPos(self.PLAYER_POS[tmp]).uid) < (self.MIN_LEVEL or 0)) then return FALSE end end return TRUE end function AnnihilatorSys:Check() local players = 0 local monsters = {} local X,Y,tmp for X = self.TOP_LEFT_POS.x, self.BOTTOM_RIGHT_POS.x do for Y = self.TOP_LEFT_POS.y, self.BOTTOM_RIGHT_POS.y do local creature = getThingfromPos({x = X, y = Y, z = self.TOP_LEFT_POS.z, stackpos = 253}) if (creature.uid > 0) then if (isPlayer(creature.uid) == TRUE) then if (getPlayerAccess(creature.uid) < (self.CHECK_INVISIBLE_ACCESS or 1)) then players = players + 1 end else table.insert(monsters,creature.uid) end end end end if (players == 0) then for tmp = 1, #monsters do if (doRemoveCreature ~= nil) then doRemoveCreature(monsters[tmp]) else if (self.IS_FORGOTTEN_SERVER == TRUE) then doTeleportThing(monsters[tmp], self.TRASH_POS, FALSE) else doTeleportThing(monsters[tmp], self.TRASH_POS) end end end return TRUE else return FALSE end end function AnnihilatorSys:getArticle(str) if (string.find(string.lower(string.sub(str,1,1)), "[aeiouy]")) then return "an" else return "a" end end O forum geralmente retira os Tabs, sugiro que vocês recoloque-os. Tutorial: Para aprender como usá-lo entre aqui. Espero que sejá util, e que vocês gostem. cya; Jovial.
  9. O uso da getGlobalStorageValue está errado tant oai quanto no tutorial original. Lab Ora não sabe nem oque é não corrige de teimoso, eu já o avisei
  10. Ela esta bem legal, gostei da cor e do banner
  11. Me mande ele que eu atualizo aki, eu deletei ele sem ekrer =D
  12. Este erro na linah 57 é na função doSendDistanceShoot que , creio eu, só tem no forgotten server
  13. Olá para todos; Essa magia faz cair meteoros aleatoriamente em uma determinada area em volta do player, se cair na terra ira pegar fogo e se cair na agua ira afundar. OBS: Ela provavelmente só funciona no Forgotten Server, ou outro server que possui as mesmas funções. Vamos ao script: --Spell by Jovial local water = {490, 491, 492, 493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625} local combat = createCombatObject() local meteor = createCombatObject() setCombatParam(meteor, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(meteor, COMBAT_PARAM_EFFECT, CONST_ME_EXPLOSIONAREA) setCombatFormula(meteor, COMBAT_FORMULA_LEVELMAGIC, -4.6, -200, -4.2, -200) setCombatParam(meteor, COMBAT_PARAM_CREATEITEM, 1492) local stun = createConditionObject(CONDITION_PARALYZE) setConditionParam(stun, CONDITION_PARAM_TICKS, 5000) setConditionFormula(stun, -0.8, 0, -0.9, 0) setCombatCondition(meteor, stun) local meteor_water = createCombatObject() setCombatParam(meteor_water, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(meteor_water, COMBAT_PARAM_EFFECT, CONST_ME_LOSEENERGY) setCombatFormula(meteor_water, COMBAT_FORMULA_LEVELMAGIC, -4.6, -200, -4.2, -200) combat_arr = { {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} } local combat_area = createCombatArea(combat_arr) setCombatArea(combat, combat_area) local function meteorCast(p) doCombat(p.cid, p.combat, positionToVariant(p.pos)) end local function stunEffect(cid) doSendMagicEffect(getThingPos(cid), CONST_ME_STUN) end function onTargetTile(cid, pos) if (math.random(0, 1) == 1) then local ground = getThingfromPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}) if (isInArray(water, ground.itemid) == TRUE) then local newpos = {x = pos.x - 7, y = pos.y - 6, z = pos.z} doSendDistanceShoot(newpos, pos, CONST_ANI_FIRE) addEvent(meteorCast, 200, {cid = cid, pos = pos, combat = meteor_water}) else local newpos = {x = pos.x - 7, y = pos.y - 6, z = pos.z} doSendDistanceShoot(newpos, pos, CONST_ANI_FIRE) addEvent(meteorCast, 200, {cid = cid,pos = pos, combat = meteor}) end end end setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") function onCastSpell(cid, var) return doCombat(cid, combat, var) end SSs: http://img517.imageshack.us/img517/5780/meteor1cn3.jpg http://img517.imageshack.us/img517/2100/meteor2vz4.jpg Espero que gostem... cya; Jovial
  14. @KingCPI Eu não troco o tradicional mysql pelo sqlite, acho o mysql muito bom e mais prático, posso fazer oque eu quiser de qualquer lugar do mundo =D
  15. Fou falar pro Dragonheart aparecer por aki =D
  16. Parabens.. ficou muito bom, mas hoje em dia eu prefiro o lusasql. =D
  17. Tutorial de LuaSQL Créditos: Jovial Olá pessoal, estou aqui para ensinar um pouco de LuaSQL para vocês. Este tutorial foi feito por mim, Palmares me deu uma mão no fim, procurando erros. Espero que eu consiga explicar bem, para entender melhor o tutorial leia um tutorial ensinando os comandos de SQL(INSERT, CREATE, UPDATE, etc.). Não são todos os servers que possuem o LuaSQL, você pode usar o Forgotten Server. Para ver este tutorial em forma de imagem clique aqui. O que é LuaSQL? LuaSQL é uma interface simples entre Lua e um sistema gerenciador de banco de dados (DBMS). Ela permite que um programa Lua: * Conecte-se aos bancos de dados ODBC, ADO, Oracle, MySQL, SQLite, JDBC e PostgreSQL; * Execute comandos arbritários do SQL; * Recupere resultados no modo linha-a-linha de um cursor SQL. LuaSQL é um software livre e utiliza a mesma licença do Lua 5.0. Manual: http://www.keplerproject.org/luasql/br/manual.html Conexão Antes de você adicionar/modificar informações no seu banco de dados, você precisa se conectar a ele, primeiro tempos que criar o 'ambiente' de conexão, onde você ira definir que tipo de banco de dados está usando, Exemplo. assert(luasql.mysql()) para MySQL assert(luasql.sqlite3()) para SQLite Para fazer a conecção temos que salvar esse 'ambiente' em uma variável, Exemplo. environment = assert(luasql.mysql()) ou environment = assert(luasql.sqlite3()) A função para se conectar com o banco de dados tem a seguinte sintaxe: connection = assert(environment:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) para MySQL ou connection = assert(environment:connect(sqliteDatabase)) para SQLite Como vocês podem ver, no exemplo acima eu 'guardei' a conexão em uma variável chamada 'connection', para poder executar os comandos depois. Variáveis da conexão em Mysql Como vocês podem ver na conexão com MySQL Precisamos saber 5 coisas mysqlDatabase, mysqlUser, mysqlPass, mysqlHost e mysqlPort. mysqlDatabase é o Banco o nome do Banco de Dados que você deseja usar, Exemplo: o Forgotten Server usa o 'theforgottenserver'(se você não alterou). mysqlUser é o usuário usado para se conectar com o MySQL, geralmente é 'root'. mysqlPass é a senha usada para a conexão com o Mysql. mysqlHost é o ip de onde se encontra o servidor de MySQL, como ele deverá estar no seu computador deixe como 'localhost'. mysqlPort é a porta usada para a conexão com o MySQL, use a porta '3306'. Ficando: connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306)) Variáveis da conexão em SQLite Para criar uma conexão só é preciso saber o sqliteDatabase, que no forgotten server é 'forgottenserver.s3db', como podem ver, é o nome do arquivo que ira abrigar o banco de dados. Ficando: connection = assert(environment:connect('forgottenserver.s3db')) Finalizando uma conexão Para finalizar uma conexão você precisa usar os seguintes comandos: connection:close() para fechar sua conexão(troque connection pela variável que você armazenou sua conexão) e environment:close() para fechar seu 'ambiente' de conexão(troque environment pela variável que você armazenou seu 'ambiente') Executando comandos Para executar algum comando SQL em lua usamos uma função com a seguinte sintaxe: assert(connection:execute('Comando SQL')) Exemplo: assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ('222222', 'tibia', '1', '365');")) Isto irá criar uma conta 222222/tibia do tipo 1(conta normal) com 365 dias de premium. Pegando informações Para pegar alguma informação de seu banco de dados você precisará salvar seu comando em uma variável, Exemplo: cursor = assert(connection:execute("SELECT `password` FROM `accounts` WHERE `id` = '222222';")) Nesse caso coloquei um comando que ira pegar o valor de 'password' na tabela accounts onde o id(numero da conta) for 222222. Agora para pegar informações dessa variável, no caso 'cursor', você ira ter que usar algumas funções como: numrows() Retorna: o número de registros no resultado da busca. fetch() Recupera o próximo registro do resultado. Você ira ver como usá-los logo abaixo nos exemplos. Exemplos TalkAction que cria account. Tag: <talkaction words="/createacc" script="account.lua"/> Modo de usar: Dizer '/createacc "222222/tibia' isso irá criar uma conta 222222/tibia function onSay(cid, words, param) --TalkAction by Jovial if (getPlayerAccess(cid) > 3) then tmp,tmp2,acc,pass = string.find(param,'(%d*)/(%w*)') --Esta linha acima pega os valores digitados na fala do player e separa eles em account e senha. --Tutorial de patterns em ingles: http://lua-users.org/wiki/PatternsTutorial if (acc ~= nil and pass ~= nil) then environment = assert(luasql.mysql()) --Criamos um ambiente de conexão connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306)) --Agora nos conectamso com o MySQL (não esqueça de colocar sua senha acima) ccursor = assert(connection:execute("SELECT * FROM `accounts` WHERE `id` = `"..acc.."`;")) --Esta linha seleciona os valores da tabela accounts onde o id(numero da conta) for igual ao que você digitou, para verificar se a conta existe. if (cursor:numrows() == 0) then --cursor:numrows() retorna a quantidade de resultados, neste caso se eel retornar mais de 0 é porque a conta ja existe, se retornar 0 ela não existe. assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ("..acc..", "..pass..", 1, 0);")) --Aqui ele ira criar a nova conta. doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Account created.)') else doPlayerSendCancel(cid,'This account already exists.') doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (This account already exists.)') end connection:close() --Fechando a conexão environment:close() --Fechando o ambiente de conexão else doPlayerSendCancel(cid,'Invalid account or password.') doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Invalid account or password.)') end else doPlayerSendCancel(cid,'You can not use this command.') end return FALSE end Rank por action. Tag: <action itemid="id do item desejado" script="Rank.lua"/> function onUse(cid,item,frompos,item2,topos) --Action by Jovial local nomes = {} local level = {} environment = assert(luasql.mysql()) --Criamos um ambiente de conexão connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306)) --Agora nos conectamos com o MySQL (não esqueça de colocar sua senha acima) cursor = assert(connection:execute("SELECT `name`,`level` FROM `players` ORDER BY `level` DESC LIMIT `0`, `10`;")) --Aqui peguei os valores 'name' e 'level' dos 10 players com maior level, agora tenho que passar esse valor para uma tabela para que eu possa usá-los --By Palmares row = cursor:fetch ({}, "a") --A variável 'row' virou uma tabela contendo os valores do primeiro player(o com level mais alto) while row do --Irá repetir enquanto existir valores em 'row' table.insert(nomes, row.name) --Irá adicionar o valor contido em 'row.name' que é o nome de um player na tabela nomes table.insert(level, row.level) --Irá adicionar o valor contido em 'row.level' que é o level de um player na tabela level row = cursor:fetch(row, "a") --Irá pegar os valores do próximo player end --/By Palmares connection:close() --Fechando a conexão environment:close() --Fechando o ambiente de conexão msg = tableToList(nomes,level) --Função criada por mim para passar os valores coletados para uma lista doPlayerPopupFYI(cid, msg) --Irá abri uma janela para o player, que irá mostrar o rank return TRUE end function tableToList(nomes,level) --Function by Jovial local tmp local str = '' for tmp = 1,#nomes do if (str == '') then str = nomes[tmp]..'['..level[tmp]..']' else str = str .. '\n'..nomes[tmp]..'['..level[tmp]..']' end end return str end Espero que vocês gostem! Qualquer dúvidas poste aqui. Se achar algum erro no tutorial me avise, pois ele é bem grande e pode ter passado algo despercebido. Abraço; Jovial.
  18. Bem eu na osabia onde postar por favor algum moderador mova para o lugar certo, como voçes pode mver eu sou novo aki. Obrigado por avisar
  19. Voçe esta cançado dos players que criam acc no seu OT pvp-enforced, e quando eles morrem criam outro e mais outro char? Esta cançado dos players lvl mais alto ficarem pedindo para voçe por skill neles pq o deles abaixou de tanto morrer? Seus problemas acabaram!1!!!1 Este script funciona somente nas novas SVN. Aqui vai... function onStepIn(cid, item, pos) ---Action by Jovial--- --Config-- kinalevel = 100 kinaaxe = 100 kinasword = 100 kinaclub = 100 kinadef = 100 pallylevel = 100 pallydist = 100 pallydef = 100 druidlevel = 100 sorcererlevel = 100 efeito = 14 --numero do efeito desejado --End Config-- topos = getPlayerPosition(cid) fkinalevel = kinalevel - 1 fkinaaxe = kinaaxe - 1 fkinasword = kinasword - 1 fkinaclub = kinaclub - 1 fkinadef = kinadef - 1 fpallylevel = pallylevel - 1 fpallydist = pallydist -1 fpallydef = pallydef - 1 fdruidlevel = druidlevel - 1 fsorcererlevel = sorcererlevel - 1 if getPlayerVocation(cid) == 4 or getPlayerVocation(cid) == 8 then if getPlayerSkill(cid, 2) <= fkinasword then repeat doPlayerAddSkillTry(cid, 2, 1) until getPlayerSkill(cid, 2) == kinasword end if getPlayerSkill(cid, 1) <= fkinaclub then repeat doPlayerAddSkillTry(cid, 1, 1) until getPlayerSkill(cid, 1) == kinaclub end if getPlayerSkill(cid, 3) <= fkinaaxe then repeat doPlayerAddSkillTry(cid, 3, 1) until getPlayerSkill(cid, 3) == kinaaxe end if getPlayerSkill(cid, 5) <= fkinadef then repeat doPlayerAddSkillTry(cid, 5, 1) until getPlayerSkill(cid, 5) == kinadef end if getPlayerLevel(cid) <= fkinalevel then repeat doPlayerAddExp(cid, 1000) until getPlayerLevel(cid) == kinalevel end doSendMagicEffect(topos, efeito) doPlayerSay(cid,"Voce esta novo em folha!",16) end if getPlayerVocation(cid) == 3 or getPlayerVocation(cid) == 7 then if getPlayerSkill(cid, 5) <= fpallydef then repeat doPlayerAddSkillTry(cid, 5, 1) until getPlayerSkill(cid, 5) == pallydef end if getPlayerSkill(cid, 4) <= fpallydist then repeat doPlayerAddSkillTry(cid, 4, 1) until getPlayerSkill(cid, 4) == pallydist end if getPlayerLevel(cid) <= fpallylevel then repeat doPlayerAddExp(cid, 1000) until getPlayerLevel(cid) == pallylevel end doSendMagicEffect(topos, efeito) doPlayerSay(cid,"Voce esta novo em folha!",16) end if getPlayerVocation(cid) == 2 or getPlayerVocation(cid) == 6 then if getPlayerLevel(cid) <= fdruidlevel then repeat doPlayerAddExp(cid, 1000) until getPlayerLevel(cid) == druidlevel end doSendMagicEffect(topos, efeito) doPlayerSay(cid,"Voce esta novo em folha!",16) end if getPlayerVocation(cid) == 1 or getPlayerVocation(cid) == 5 then if getPlayerLevel(cid) <= fsorcererlevel then repeat doPlayerAddExp(cid, 1000) until getPlayerLevel(cid) == sorcererlevel end doSendMagicEffect(topos, efeito) doPlayerSay(cid,"Voce esta novo em folha!",16) end return 1 end Mas como configuro??? Simples --Config-- kinalevel = 100 -- lvl desejado para os kinas kinaml = desativado -- ml desejado para os kinas kinaaxe = 100 -- skill de axe desejado para os kinas kinasword = 100 -- skill de sword desejado para os kinas kinaclub = 100 -- skill de club desejado para os kinas kinadef = 100 -- skill de defeza desejado para os kinas pallylevel = 100 -- lvl desejado para os paladins pallyml = desativado -- ml desejado para os paladins pallydist = 100 -- skill de distance desejado para os paladins pallydef = 100 -- skill de defeza desejado para os paladins druidlevel = 100 --lvl desejado para os druidas druidml = desativado --ml desejado para os duidas sorcererlevel = 100 --lvl desejado para os sorcerers sorcererml = desativado --ml desejado para os sorcerers efeito = 14 --numero do efeito desejado --End Config-- Salve o script como healer.lua ou outro nome desejado e coloque na pasta data/movements/scripts/ Adicione no movements.xml qque esta na pasta data/movements/ isto: <movevent event="StepIn" actionid="8001" script="healer.lua" /> Depois Edite se umapa pelo map editor e coloque ActionID 8001 no quadrado que o player devera pisar para ter seus skills restaurados. OBS: Os mls ainda nao sei como recupera-los, pois nao conheço nenhuma funçao para adicionar ml. Script testado no The Forgotten Server 0.1.3 Espero ques gostem!!! Atenciosamente, Jovial
  20. @Colex nao sabia q se era BR xD @script muito bom eu o uso... Observaçoes: para q ele funcione no The Forgotten Server troque doTeleportThing(cid,{x=pos[4], y=pos[5], z=pos[6]}) por doTeleportThing(cid, {x=pos[4], y=pos[5], z=pos[6]}, 0)
  21. Jovial

    No_nick_server

    parece ser bom, vou ver, essas sprites sao meo velhas, tenho elas des do 7.6
  • Quem Está Navegando   0 membros estão online

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