Ir para conteúdo

Night Wolf

Herói
  • Total de itens

    341
  • Registro em

  • Última visita

  • Dias Ganhos

    18

Tudo que Night Wolf postou

  1. @@ricardoberg, aquela parte que está for _, pid in ipairs(getPlayersOnline()) do if getTileInfo(getCreaturePosition(pid)).actionid == action then table.insert(tab, pid) end end tem que ficar asim: for _, pid in ipairs(getPlayersOnline()) do if getTileInfo(getCreaturePosition(pid)).actionid == action then table.insert(tab, pid) end if getCreatureSummons(pid) > 0 then for _, sid in pairs (getCreatureSummons(pid)) do if getTileInfo(getCreaturePosition(sid)).actionid == action then table.insert(tab, sid) end end end end
  2. relaxa amigão, faz sem medo de errar que eu te corrijo qlqer coisa.. você ainda é o mais eficiente aqui desse site :lolz:
  3. não sei oque é Necronia, mas se eles fizeram assim devem ter tirado a inspiração dos mesmos jogos -> Skyrim, Dragon's Age e principalmente Kingdom of Amalur
  4. nunca tive servidor PDA, o pokemon é um summon do player?
  5. esse erro dá quando vc entra na porta e já sai, andando mais rápido do que dura o processo de abrir a porta. Aí ele invoca tanto o stepIn qnt o stepOut e eles se sobrepõe, dando esse erro. Tenta assim local porta = {13680, 13679, 13678, 13677} -- porta fechada, porta pouco aberta, porta meio aberta, porta aberta local pos = {x = 1056, y = 1054, z = 7} -- local onde vai fica a porta local delay = 200 -- ela vai demorar 0.1 segundos para fica totalmente aberta ou totalmente fechada local action = 2701 -- action que ta no .xml, se muda la vai ter que muda aqui também function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if getTileItemById(pos, porta[1]).uid > 0 then for i = 1, (#porta - 1) do addEvent(function() if getTileItemById(pos, porta[i]).uid ~= 0 then doTransformItem(getTileItemById(pos, porta[i]).uid, porta[i + 1]) end end, i * delay) end end return true end function onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor) local tab = {} for _, pid in ipairs(getPlayersOnline()) do if getTileInfo(getCreaturePosition(pid)).actionid == action then table.insert(tab, pid) end end if #tab == 0 then if getTileItemById(pos, porta[#porta]).uid > 0 then for i = 1, (#porta - 1) do addEvent(function() if getTileItemById(pos, porta[(#porta - i) + 1]).uid ~= 0 then doTransformItem(getTileItemById(pos, porta[(#porta - i) + 1]).uid, porta[(#porta - i)]) end end, i * delay) end end end return true end
  6. Night Wolf

    aura system

    só trocar onde tá if isPlayer(cid) then pra if isPlayer(cid) and isPremium(cid) then
  7. O melhor jogo q já joguei nessa vida possuia 3 vocações - Might - Mage - Rogue Might vc usava Hammer, Longsword, GiantSword ou Axe Mage usava Scepter, Wand, Staff ou Chakram Rogue usava Dagger, Faeblades ou Bow. Ter mais vocações não significa ser melhor, ter mais RPG significa.
  8. @@ricardoberg, perdão.. ainda não dormi e acabei deixando passar 1 detalhe. A linha que está como if getTileItemById(pos, porta[(#porta - 1)]).uid > 0 then deveria ser if getTileItemById(pos, porta[#porta]).uid > 0 then
  9. É tranquilo porém tem limitações. Primeiramente vamos diferenciar oque são flags e oque são custom flags pra não nos confundirmos> Flags: Códigos binários que definem privilégios e limitações de gamemasters. Começou no TFS 0.2 Custom Flags: códigos binários que definem privilégios e limitações de players em geral. Começou no TFS 0.3 Oque isso nos diz sobre as custom flags? Elas vieram depois então possuem um grau de sofisticação maior, elas definem coisas que só as flags não deram conta e acredito q ela seja uma ferramente extremamente poderosa. Um outro link que achei para flags é esse daqui Você disse que eram as custom flags, estou certo? Então nem essa lista acima e nem a do @@felzan vão te ajudar. Tem algo lá q define quem pode usar callbacks e oque resta saber é se é uma configuração própria "Pode usar callbacks", ou algo mais geral que incluiram no OTC e que eles escolheram pois é a prova definitiva que alguém é GOD, como "Tem controle total do servidor". Se for o segundo caso, é um problema pois vc nao pode setar todo mundo como tendo acesso direto. "Tá, mas e se for o primeiro?" Bom, noticia boa.. agora a parte dificil: Qual é a configuração? Qual é o check que devo dar para garantir só essa pequena mudança nos meus players e permitir que eles usem callback? Infelizmente todo mundo usava o mesmo link para configurar as custom flags, que além de ser um link antigo (TFS 0.3) e desatualizado, ele não está mais disponível Eu juro q eu fui aos confins da terra pra procurar isso e não tive resultado, precisaria de alguém com MUITO conhecimento em source pra me apontar exatamente fica a configuração e fazer um site semelhante aos que já foram apresentados aqui, mas atualizado e com as customflags. "Ok, mas cadê a noticia boa disso?" bem, a noticia boa é que eles seguem um padrão muito simples de bases binárias, 2^n com n>= 3 & n E N. Você só tem que testar 8, 16, 32, 64, 128... 1 por 1 até achar um que funcione. Ok, parece simples.. com alguns resets no servidor você consegueria achar (supondo que é achável). "Epa, como assim 'supondo que é achável'?" Como não temos a lista nem o numero de customflags existentes, podemos chegar em 1 momento em que estaríamos repetindo combinações de numeros anteriores sem saber, e essas combinações PODEM ou NÃO ser válidas. Se não forem válidas vai retornar erro no groups.xml e saberemos qnd chegou ao fim, se forem válidas fodeu. Outra questão a ser levantada é se a configuração é de fato na source ou se não é algo no próprio module do OTC, nesse caso eles podem ter feito como eles bem entenderem e ao invés de ser uma numeração isolada podem ser conjuntos de combinações, ex: "Se o customflags for maior ou igual a 2199023255551 então libera o module". Nesse caso foderia muito pois este numero é referente à todas as opções assinaladas (é uma suposição).. oque tornaria isso inviável. Mas use isso como um ponto de partida.. teste todos isoladamente, se der certo GG izi WP. Se não der, vamos atrás da source, se mesmo assim não der vamos atrás da configuração do OTC. Eu não dou a mínima se eu tiver que reformular toda a forma de se fazerem OTC's só pra que isso funcione e espero que você esteja na mesma pegada que eu. PS: Ao final disso quero uma lista completa de flags e customflags e oque fazem cada uma. EDIT: Você já experimentou ir atrás de como o /cliport funciona? De alguma forma o client passa a posição que foi clicada pra source, daria pra direcionar isso pra Lua através de alguma função e formar um callback onClick com a posição que o mouse clicou como parâmetro. EDIT2: Aqui tem a lista completa do customflags pra versão 8.7, deve ajudar em algo. Os que nao tem número são apenas multiplos de 2 do anterior.
  10. sim :lolz: sim :smile_positivo: essa é a idéia, ele quer fazer um OT de League of Legends :biggrin:
  11. Só um adendo: como vc tá chamando uma função no addEvent e passando parametros do callback (cid) vc tem que re-checar se o cid ainda existe. Bota um if isCreature(cid) na function function undoTransform(cid, itemid1, itemid2) if isCreature(cid) then if getPlayerItemCount(cid, itemid1) > 0 then local item = getPlayerItemById(cid, true, itemid1) doTransformItem(item.uid, itemid2) end end end
  12. Você tem o callback onMoveItem compilado na sua source? se sim, pode me mandar o link de onde vc pegou ele? Se não, vc acha que consegue compilar ele? Eu consigo fazer esse sistema mas precisa ter esse callback (posso tentar sem, mas com ele fica 100x mais fácil)
  13. Só tem que conferir se seu interval no xml do globalevents é segundos ou milisegundos.. aqui é segundos então seria 60, mas isso é fácil (só ver como está os outros de server save e clean por ex). A diferença é que vc tem no seu constant.lua escrito TRUE = true e FALSE = false, pq antigamente o povo era idiota e não sabia a diferença entre TRUE (variavel) e true (booleano verdadeiro). Se vc testa num sv q não tem isso escrito em nenhum lugar da lib, nem na source ele vai retornar 'unable to call global TRUE' e o script vai zoar seu servidor. Mesmo possuindo isso, não é uma boa prática pois seu servidor tem que fazer duas checagens na memória -> retorna TRUE -> vê oque TRUE significa ao invés de retornar diretamente verdadeiro. Pode parecer besteira mas num globalevent que roda o tempo todo e juntamente com outros sistemas que vc tem pode acabar lagando algum dia. @@Danihcv, não é uma string.. é uma variável. String tem aspas simples, dupla (strings de uma linha) ou colchete duplo (string de várias linhas)
  14. Assim vai funcionar pra 2, 3, 4, 5, 800 portas, só q sugiro vc mudar o delay pra ser a quantidade de tempo q vc quer q demore dividido pelo numero de ids q vai trocar, assim independente de ser 3 ou 500 o tempo pra abrir fechar será o mesmo. script: -- Do not remove the credits -- -- [MOVEMENT] Porta que abre automáticamente -- -- Developed by Rigby (João Vitor) -- -- Xtibia.com -- local porta = {13680, 13679, ID DA POUCO ABERTA, 13677} -- porta fechada, porta pouco aberta, porta meio aberta, porta aberta local pos = {x = 1056, y = 1054, z = 7} -- local onde vai fica a porta local delay = 150 -- ela vai demorar 0.1 segundos para fica totalmente aberta ou totalmente fechada local action = 2701 -- action que ta no .xml, se muda la vai ter que muda aqui também function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if getTileItemById(pos, porta[1]).uid > 0 then for i = 1, (#porta - 1) do addEvent(function() doTransformItem(getTileItemById(pos, porta[i]).uid, porta[i + 1]) end, i * delay) end end return true end function onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor) local tab = {} for _, pid in ipairs(getPlayersOnline()) do if getTileInfo(getCreaturePosition(pid)).actionid == action then table.insert(tab, pid) end end if #tab == 0 then if getTileItemById(pos, porta[#porta]).uid > 0 then for i = 1, (#porta - 1) do addEvent(function() doTransformItem(getTileItemById(pos, porta[(#porta - i) + 1]).uid, porta[(#porta - i)]) end, i * delay) end end end return true end dava pra fazer mais simples mas não quis mudar os fors pra vc não perder a lógica e aquele action ali era desnecessário já que vc podia usar item.actionid pra pegar o actionid do movements.xml
  15. Primeiro de tudo: O callback correto é onAdvance(cid, skill, oldLevel, newLevel) Segundo: getLevel(cid) == 8 Isso aqui vai dar erro porque em 0.4 não existe getLevel... mas não precisa usar função pra pegar o level, vc tá avançando e um dos parametros é o level novo. Fica assim: local pos = {x=100, y=100, z=7} local msg = "Parabéns! Você alcançou o level 8. Fale com o NPC para prosseguir sua caminhada" --vc pode editar essa mensagem, só precisa deixar ela dentro das aspas duplas! local stor = 27182 function onAdvance(cid, skill, oldLevel, newLevel) if (newLevel == 8 and skill == SKILL__LEVEL and oldLevel < newLevel) and getPlayerStorageValue(cid, stor) < 1 then doTeleportThing(cid, pos) doPlayerSendTextMessage(cid, 18, msg) setPlayerStorageValue(cid, stor, 1) end return true end Essa segunda checagem é pra garantir que o player não morra em main, upe e seja enviado novamente pra posição do oracle (por ex); As primeiras são pra garantir integridade -> tem que ser nv 8, tem q ser a skill level (onAdvance serve pra todas as skills) e o nível anterior tem que ser menor que o novo (tem casos em q morrer ativa o callback onAdvance, n sei pq e só acontece em algumas sources)
  16. Night Wolf

    output.log erro

    todos os erros são iguais: "MYSQL ERROR: Cannot add or update a child row: a foreign key constraint fails" Não é possivel adicionar ou atualizar uma linha filha> a regra de possuir uma chave estrangeira falhou. Isso acontece quando você adiciona uma linha em uma tabela que possui a restrição de FG (Foreign Key) (Chave estrangeira), isso quer dizer que uma coluna dessa tabela é uma espécie de ID único capaz de identificar a linha inteira entre as outras linhas só por esse numero (chave da tabela) e ela é herdada de outra tabela (por isso estrangeira), vc tem que estudar banco de dados pra entender como resolver isso mas nenhum servidor decente vai dar esse tipo de erro... oque quer dizer q vc fez alguma merda muito grande. Se você lembrar quando isso começou e nos falar as coisas que vc fez sem saber talvez a gente possa tentar te ajudar mais.
  17. Olha, é meio que um tiro no escuro mas acredito q isso tenha a ver com a permissão pra executar a função de executar talkactions.. não sei se tem a ver com o acess do player ou com alguma flag/customflag mas isso é fácil descobrir (deixa o id q vc testou de gm com 0 em flag e customflag, só com o acess) e testa. Se der certo mude esse group para ser o group padrão, se der errado tente achar qual é a permissão (ID via source) de flag/customflag e deixe só essa disponível para os players em groups.xml. Mas reforço, não tenho muito conhecimento com OTC, pode ter algo a ver com o próprio OTC diferenciar gamemasters ou estar associado com alguma flag já conhecida (capacidade de ficar invisivel por exemplo) e aí seria inviável botar isso pra todos os players. Contudo não custa tentar qlqer coisa me chama skype e me dá uma breve introdução à OTC q eu vejo se consigo te ajudar mais
  18. OTC trás de fato uma infinidade de novas possibilidades, quero pegar pra estudar quando eu tiver um tempo também. Parabéns pelo sistema, se quiser me chamar qlqer dia pra gente trabalhar em algo de OTC junto, fico no aguarde!
  19. @@gmstrikker, sim.. só coloca return true porque return TRUE não "existe"
  20. posta o erro amigão.. ajude a gente a te ajudar.
  21. function onCastSpell(cid, var) if getPlayerStorageValue(cid, 8) >= 1 then return true end doCreatureSay(cid, "Poison Gas", TALKTYPE_MONSTER) if getPlayerStorageValue(cid, 3) >= 1 then doSendAnimatedText(getThingPos(cid), "MISS", 215) setPlayerStorageValue(cid, 3, -1) return true nesses casos que a spell não sai, coloque return false se não o cara vai gastar mana e tomar exhaust como se tivesse lançado a spell. Sobre o cd.. não sei como vc fez no xml mas aí está tudo correto... geralmente é a falta de um return true ao soltar o combat que faz com que fique sem cd mas vc lembrou de colocar. Se nao tiver jeito, faz o cd via código. É só salvar um storage com 'os.time() + exhaust' e comparar o valor do 'storage - os.time()' < 0 pra soltar a magia novamente.
  22. ao invés de fazer o teleport normalmente via map editor, faça por um script em movements com actionid e coloque a actionid no teleport. Você separa um globalstorage e aí qnd alguém entrar vc seta ele pra 1, qnd sairem vc seta pra 0. E se tiver menor ou igual a 0 vc não teleporta.
  23. é bem simples, abre o login.lua num editor próprio pra editar código(não usa o bloco de notas que buga a porra toda e vai deixar tudo numa linha só). Recomendo o Notepad++. Aí vc vai descer o arquivo até o final, na ultima linha vai ter um end e na penultima linha vai ter um return true. Acima desse return true vc cola aquilo q ele manda colar no login.lua.
  • Quem Está Navegando   0 membros estão online

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