Ir para conteúdo

Dokmos

Campones
  • Total de itens

    81
  • Registro em

  • Última visita

Tudo que Dokmos postou

  1. Monster Sleeping Desenvolvido por Dokmos Testado em TFS 8.4+ Funciomaneto O script foi desenvolvido para simular uma espécie de soneca que os monstros podem tirar durante o jogo. Para que isso ocorra, existem zonas específicas configuradas no script e nome dos monstros que poderão tirar soneca. A soneca só ocorrerá se não houverem jogadores por perto dentro de uma distância mínima definida em SLEEP_RANGE. Caso um monstro esteja dormindo e um jogador se aproximar, ele irá imediatamente acordar e, dependendo do monstro, atacar o jogador. Portanto, esse script proporciona um mundo mais dinâmico e real ao mundo Open-Tibia Servers. Divirtam-se! Configuração A explicação detalhada do funcionamento e configuração do script estão dentro dele! Qualquer dúvida ou problema postem aqui. Script --[[-----------------Créditos--------------------- Idealizado por Ramza (Rick / Ricardo Ianelli). Desenvolvido por Dokmos (Bruno Braz). Data: 19 de Março de 2010. -----------------Funcão do Script----------------- O script foi desenvolvido para simular uma espécie de soneca que os monstros podem tirar durante o jogo. Para que isso ocorra, existem zonas específicas configuradas no script e nome dos monstros que poderão tirar soneca. A soneca só ocorrerá se não houverem jogadores por perto dentro de uma distância mínima definida em SLEEP_RANGE. Caso um monstro esteja dormindo e um jogador se aproximar, ele irá imediatamente acordar e, dependendo do monstro, atacar o jogador. Portanto, esse script proporciona um mundo mais dinâmico e real ao mundo Open-Tibia Servers. Divirtam-se! --------------Configuração do Script-------------- SLEEP_RANGE: (Recomendável - 5) Declaração da expansão de área que irá verificar se há jogador perto de um monstro dormindo para acordá-lo. Ou seja, quanto maior ele for, as criaturas acordarão com a presença de outros jogadores mais distantes. SLEEP_PERCENT: (Recomendável - 0.3) Porcentagem de monstros dentro da zona que irão tirar soneca. Ex.: 0.4 Corresponde a 40%. Condição.: 0 < SLEEP_PERCENT <= 1. MONSTERS_NAME: (Facultativo a Alteração) Tabela com o nome dos monstros que podem tirar soneca. ATENÇÃO! Os nomes dos monstros deverão obrigatoriamente estar com letras minúsculas. MONSTERS_CORPSE: (Facultativo a Alteração) Tabela com o id dos corpos dos monstros que serão apresentados como se estivessem "dormindo". Obs.: A posição do id deve ser correspondente à posição do nome do monstro em MONSTERS_NAME. Para verificar qual é o id, basta ir no diretório de monstros e abrir o arquivo .xml do monstro desejado e pegar o valor de "corpse". ZONE_MONTERS: (Obrigatório a Alteração) Armazenará tabelas para criação de zonas, onde as criaturas dentro da zona poderão tirar uma soneca aleatoriamente. A lógica dessa variável é armazenar posições centrais de zonas e a extensão das mesmas. Seguindo o padrão apresentado a seguir: {Posição X do Centro da Zona (CZ), Posição Y do CZ, Posição Z do CZ, Expansão (em sqm) da Zona} Ex.: {x = 100, y = 200, z = 7, range = 5} Neste caso, irá criar uma zona ao redor da posição x = 100, y = 200, z = 7, de expansão 5 para todas direção (norte, leste, sul e oeste). SIGNAL: (Não Alterar) É uma tabela que contém valores que serão utilizados para alterar o sinal das variáveis, a fim de checar todas posições possíveis. ---------------------------------------------------]] --------------------Configuração-------------------- SLEEP_RANGE = 5 SLEEP_PERCENT = 0.3 MONSTERS_NAME = {"bat", "globin"} MONSTERS_CORPSE = {6053, 6002} ZONE_MONSTERS = { {x = 94, y = 126, z = 7, range = 20}, {x = 92, y = 129, z = 8, range = 8}, } ---------------------------------------------------- SIGNAL = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}} ---------------------------------------------------- -- Função checkPlayers(pos) -- Verifica se existem jogadores próximos as criaturas. local function checkPlayers(pos) for i = 0, SLEEP_RANGE do for j = 0, SLEEP_RANGE do for k = 1, 4 do local PPos = {x = pos.x + (i*SIGNAL[k][1]), y = pos.y + (j*SIGNAL[k][2]), z = pos.z} local Player = getTopCreature(PPos).uid if isPlayer(Player) then return TRUE end end end end return FALSE end -- Função getMonsterByZone() -- Checagem de monstros da zona pré-definida no começo do script. local function getMonsterByZone() local Zone = ZONE_MONSTERS local Monsters = {} for i = 1, #Zone do for j = 0, Zone[i].range do for k = 0, Zone[i].range do for l = 1, 4 do local MPos = {x = Zone[i].x + (j*SIGNAL[l][1]), y = Zone[i].y + (k*SIGNAL[l][2]), z = Zone[i].z} local Monster = getTopCreature(MPos).uid if isMonster(Monster) then local Name = string.lower(getCreatureName(Monster)) local NPos = table.find(MONSTERS_NAME, Name) local Check = checkPlayers(MPos) if not Check and NPos ~= nil then table.insert(Monsters, {Monster, MONSTERS_CORPSE[NPos]}) end end end end end end return Monsters end -- Função onSleep(monster, pos, corpse, speed, time) -- Regula o estado do monstro, quer seja dormindo, quer seja para acordar. local function onSleep(monster, pos, corpse, speed, time) if isMonster(monster) then local Check = checkPlayers(pos) if not Check and (time > 0) then doSendMagicEffect(pos, 32) doSetItemOutfit(monster, corpse, 2000) addEvent(onSleep, 2000, monster, pos, corpse, speed, (time - 2)) else doSendMagicEffect(pos, 13) doChangeSpeed(monster, speed) end end end -- Função onThink(interval, lastExecution) -- Função principal que executa as demais funções e ações do script. function onThink(interval, lastExecution) local Monsters = getMonsterByZone() if #Monsters ~= 0 then for i = 1, math.floor(#Monsters*SLEEP_PERCENT) do local r = math.random(#Monsters) if isMonster(Monsters[r][1]) then local MPos = getCreaturePosition(Monsters[r][1]) local Speed = getCreatureSpeed(Monsters[r][1]) doChangeSpeed(Monsters[r][1], -Speed) onSleep(Monsters[r][1], MPos, Monsters[r][2], Speed, interval-10) table.remove(Monsters, r) end end end return TRUE end Em data/glovalevents/globalevents.xml <globalevent name="sleep" interval="300" event="script" value="sleeping.lua"/> Imagem Bom isso é tudo, qualquer dúvida postem aqui. Divirtam-se! Obs.: Vocês vão perceber que configurei apenas dois monstros para dormirem, gostaria que alguém pudesse disponibilizar uma lista mais completa para eu atualizar o tópico! Atenciosamente, Dokmos
  2. Gostei do trabalho, parabéns 4458...
  3. Na verdade não é random, nem armado. É puramente sorte, um dog começa a certa velocidade e com um random ele pode aumentar ou diminuir sua velocidade sem alguma relação com outros fatores, como posições, coelho, outros dogs, etc.
  4. O problema das graves é que realmente exagerei no contraste. Por isso aparenta estar muito escuro, além do mais Rookgaard é uma região arcaica e pouco civilizada.
  5. * "exclarecer" - esclarecer * Eu disse isso porque antes que você desmereça algum trabalho, você precisa ser superior a ele. * A assinatura dele é uma frase que eu lhe disse, e realmente pode nos ensinar que não importa o nosso nível, estamos em constante superação e desenvolvimento, o diferencial é a vontade que move cada um.
  6. @Zafor Obrigado pela atenção, se você se refere ao Skywar, ele saiu sim por motivos pessoais. Ps: Poste comentários relacionados ao tópico, obrigado!
  7. Dinastias A Sagrada Linhagem de Guerreiros Showoff de Rookgaard Templo Cidade Esgoto Fazenda Arredores Mappers Dinastias Coordenador Sundsiric Desenvolvedores Lippe Este é um pequeno conteúdo liberado do Dinastias MMORPG, com algumas áreas de Rookgaard. Link Direto dinastias.rpgdynasty.net/desenvolvimento-f1/showoff-mapa-rookgaard-t13.htm Para mais informações... Website www.dinastias.eanki.com Fórum www.dinastias.rpgdynasty.net Comunidade www.orkut.com.br/Main#Community.aspx?cmm=63982377 Dinastias MMORPG 2009 Dokmos
  8. @Zafor Como dizem "Quem não faz, ensina!" :XTibia_smile: @Wiltry Você não é a pessoa mais indicada a ter uma boa avaliação, sendo que deixou de avaliar a criatividade de uma mapa original por um semelhante ao global. "A superioridade de alguns homens é meramente local. Eles são grandes porque seus companheiros são pequenos." Samuel Johnson Parabéns ADMLippe!!!
  9. O castelo do 4458638 foi trabalhoso, mas o do Lippe ficou original, mais detalhado e desenvolvido, em questão de melhor planejamento RPG o castelo do Lippe ficou melhor. Editado Acabei de ver o CEM e realmente o 4458638 teve mérito sobre o 1º lugar, ficou muito bom parabéns! Mas no Mapper Xtibia #6 sinceramente deixou a desejar. O critério de avaliação do Mapper Xtibia #6 foi muito mal! A criatividade não é avaliada? :google_lt:
  10. Obrigado Zafor, Sim, prefiro colocar funções avançadas estimulando a busca pelo conhecimento e desenvolvimento dos progamadores lua, fazendo-os ser "criativos" por seus próprios méritos do que copiar e colar uma action em seu OT sem haja algum aprendizado.
  11. Simples e criativo. Boa Notthinghester!
  12. Bom, existe uma maneira de fazer em lua porém não é aconselhável por ser um addEvent() que poderá lagar o servidor, além de bugs, mas mesmo assim é simples e uma boa idéia. Vai na pasta data\creaturescripts\scripts e substitua o login.lua por este: local function isPlayerMoving(cid, fromPos) if (isPlayer(cid) == TRUE) then toPos = getThingPos(cid) if (fromPos.x == toPos.x) and (fromPos.y == toPos.y) and (fromPos.z == toPos.z) then doSendMagicEffect(toPos, CONST_ME_SLEEP) addEvent(isPlayerMoving, 10*1000, cid, toPos) else addEvent(isPlayerMoving, 30*1000, cid, toPos) end end end function onLogin(cid) registerCreatureEvent(cid, "PlayerDeath") addEvent(isPlayerMoving, 30*1000, cid, getThingPos(cid)) return TRUE end Espero ter ajudado! :positive:
  13. Function getDirectionBetween(fromPos, toPos[, directions]) by Dokmos ----------------------------------------------- Características Essa função verifica a direção de uma posição em relação a outra, por exemplo se eu tenho minha posição e tenho a posição de outro jogador, e gostaria de saber a direção que este jogador está em relação a mim, se ele estiver "acima" de mim retornará 0 (Norte), o último parâmetro é opcional para colocar FALSE ou TRUE, caso você coloque FALSE ele retornará apenas os pontos cardeais (norte, sul, leste e oeste - em seus respectivos números), se colocar TRUE ele poderá retornar também os pontos colaterais (nordeste, noroeste, sudeste, sudoeste - em seus respectivos números). Utilizo esta função também em magias em que eu quero empurrar uma criatura para longe de mim, por exemplo se eu colocar a posição do jogador e da criatura irá retornar a direção da criatura, se eu utilizar um doMoveCreature para aquela direção irá empurrar a criatura, e se eu quiser puxar uma criatura é só inverter os parâmetros de posição colocando da criatura primeiramente. ----------------------------------------------- Instalação Adicione essa função dentro do data\global.lua, você também pode colocá-la em outros libs, mas o global.lua já servirá para todas funções como spells, talkactions, actions, etc. Obs: Alguas versões de OT o global.lua está no data\lib\constant.lua function getDirectionBetween(fromPos, toPos, directions) -- Desenvolvido por Dokmos 30/01/2009 -- Apoio Dinastias dify = (fromPos.y-toPos.y) difx = (fromPos.x-toPos.x) local ARRAY = {} local BOOL = {0} local DIR = { {dify, -difx, -dify, difx},{dify-math.abs(difx), -difx-math.abs(dify), -dify-math.abs(difx), difx-math.abs(dify), difx-dify-math.abs(difx), -dify-math.abs(-difx)-difx, dify-math.abs(difx)+difx, dify-math.abs(-difx)-difx} } table.insert(BOOL, directions) for d = 1, #DIR[BOOL[#BOOL]+1] do table.insert(ARRAY, DIR[(BOOL[#BOOL])+1][d]) end table.sort(ARRAY) return (table.find(DIR[BOOL[#BOOL]+1], ARRAY[#ARRAY])-1) end ----------------------------------------------- Funcionamento Quando utilizar fica a seu critério, vou mostrar um exemplo básico que pega uma direção para empurrar alguma criatura do target para distante do jogador. function onSay(cid, words, param) local creature = getCreatureTarget(cid) local pos = getThingPos(cid) if isCreature(creature) == TRUE then doSendDistanceShoot(pos,getThingPos(creature),38) doSendMagicEffect(getThingPos(creature),3) doMoveCreature(creature,getDirectionBetween(pos,getThingPos(creature)) else doPlayerSendCancel(cid,"Você precisa selecionar o alvo.") end return TRUE end Este exemplo acima de uma talkaction verifica se existe alguma criatura no target e caso tenha, empurra a criatura para distante do jogador. Obs: Se em vez de "getDirectionBetween(pos,getThingPos(creature))" você colocar "getDirectionBetween(getThingPos(creature),pos)", ou seja, inverter as posições irá puxar a criatura para perto do jogador. Espero que consigam aproveitar a função em seus scripts, qualquer bug ou erro postem aqui para eu dar uma verificada, e a configuração em seus scripts fica por conta de vocês. :positive: Atenciosamente, Dokmos
  14. Obrigado, acabei de atualizar a fórmula e agora ela converte todas as posições!
  15. Sim Slinix, tem uma função que criei para isso, em breve estarei atualizando o doPushCreature() e criarei um tópico com ela.
  16. Matéria interessante para aqueles que vão começar a trabalhar com OT e ficam na dúvida entre o lua e o c++. Ambos são parecidos como toda linguagem de progamação, porém o c++ é uma linguagem mais avançada e complexa, por isso recomendo dominar a linguagem lua primeiramente e depois a linguagem c++.
  17. @TheTNT O seu problema é a versão do seu servidor, essas funções já são inseridas nas sources dos servidores recentes. Por isso não tem como eu te passar os códigos. @ShadowRock Eu passei a estrutura da função, agora inserí-la em seu script é com vocês.
  18. Obrigado, Lembrando que o vídeo é apenas um preview simples da corrida, em breve disponibilizarei ao Xtibia, a versão do Dinastias terá cada cão com uma roupa de uma cor e os nomes serão diferentes, além do status geral do cão para deixar mais fácil e emocionante aos participantes. Aguardem a liberação do script! :smile_positivo: Atenciosamente, Dokmos
  19. Corrida de Cães que os jogadores fazem suas apostas e torcem para seu cão chegar à linha de chegada primeiro! Obs: Este sistema foi desenvolvido para o concurso de scripting do xtibia, porém a competição foi cancelada por falta de participantes, contudo ele não deixa de ser um excelente trabalho. Espero que gostem, mais informações... Comunidade www.orkut.com.br/Main#Community.aspx?cmm=63982377 Website Em breve Patrocínio www.excweb.com.br Atenciosamente, Dokmos
  20. Obrigado pelo reconhecimento, melhor que ver o trabalho elogiado é vê-lo reconhecido! Isso até motiva scripters a compartilhar suas funções, actions e seus melhores trabalhos, pois além dos jogadores terem seus OT's com ótimas actions os progamadores têm seu trabalho reconhecido! Você pode colocar no MOTD Sensor System by Dokmos, é só você adicionar esta linha na linha 70 do script: doPlayerSendCancel(cid,"Sensor System by Dokmos.") Então o script ficará assim: E novamente obrigado! Em breve libero outras actions bem legais... :positive:
  21. Vi Vanderlaysk, Ele funciona sim em TFS, você tem que ver se a versão do seu TFS aceita a função doPlayerSetNoMove ou mayNotMove, aí é só trocar no script. É possível utilizá-lo onEquipe, você precisaria adaptar alguns detalhes.
  22. Preview de um pvp com magias de controle sobre a terra e o fogo. Espero que gostem, mais informações... Comunidade www.orkut.com.br/Main#Community.aspx?cmm=63982377 Website Em breve Patrocínio www.excweb.com.br Atenciosamente, Dokmos
  23. Pelo jeito vai ter gente que vai ganhar de W.O ;P
  24. Fórmula Posição & Direção by Dokmos ----------------------------------------------- Fórmula atualizada 30/01! Agora a fórmula converte todas as direções: norte, leste, sul, oeste (0, 1, 2, 3) e também as direções sudoeste, sudeste, noroeste e nordeste (4, 5, 6, 7)! Esta fórmula pode parecer ridícula e inútil, mas se você souber usá-la economizará tempo, linhas, bugs e um sistema mais rápido em seus scripts! ----------------------------------------------- Fórmula dir = { x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1))) } ----------------------------------------------- Funcionamento Você agora provavelmente deve estar perguntando se o tio Dokmos não tem mais nada para fazer do que vir aqui postar isso. Bom então vou explicar para que esses números servem. Essa fórmula é baseada nas direções padrões do global: NORTE = 0 LESTE = 1 SUL = 2 OESTE = 3 SUDOESTE = 4 SUDESTE = 5 NOROESTE = 6 NORDESTE = 7 Essa tabela resulta nas posições x e y de acordo com a posição do jogador, quando variamos a posição de algum jogador para essas direções modicamos os eixos x e y, as vezes um pode ser nulo, negativo ou positivo, por exemplo vamos andar 1 sqm para o norte: variação de x = 0 variação de y = -1 Ou seja, o x atual do jogador permanece e o y atual do jogador subtrai 1. Vou colocar aqui a variação para as direções em 1 sqm: NORTE x = 0, y = -1 LESTE x = 1, y = 0 SUL x = 0, y = 1 OESTE x = -1, y = 0 Vamos ver agora se essa fórmula funciona mesmo, vamos andar 1 sqm para a direção norte, ou seja, a tabela terá que ser {0,-1}, agora jogando na fórmula: {math.fmod(0,2)*(-(0-2)),(0-1)*(0-1-(0-1)*math.abs(0-2))} {0*2,-1*(0*2)} {0,-1*(-1-(-1*2))} {0,-1*(-1+2)} {0,-1*1} {0,-1} Good! Se você quiser testar com todas direções vai ver que todas vão sair nas posições desejadas!!! Agora você deve estar perguntando e para que eu estou lendo isso? Bom na verdade você já precisou, precisa ou precisará disso em algum script seu, por exemplo vamos mover o jogador 1 sqm a frente, fazendo do jeito normal: pos = getThingPos(cid) if getPlayerLookDir(cid) == 0 then newpos = {x=pos.x,y=pos.y-1,z=pos.z} elseif getPlayerLookDir(cid) == 1 then newpos = {x=pos.x+1,y=pos.y,z=pos.z} elseif getPlayerLookDir(cid) == 2 then newpos = {x=pos.x,y=pos.y+1,z=pos.z} elseif getPlayerLookDir(cid) == 3 then newpos = {x=pos.x-1,y=pos.y,z=pos.z} end doTeleportThing(cid,newpos,TRUE) E se usando a fórmula seria assim: pos = getThingPos(cid) d = getPlayerLookDir(cid) dir = { x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1))) } newpos = {x=pos.x+dir.x,y=pos.y+dir.y,z=pos.z} doTeleportThing(cid,newpos,TRUE} Como eu disse pode parecer inútil para alguns e bastante útil para quem sabe usá-lo. Agora é com vocês!!! E aproveitando o tópico vou colocar um mini-função para vocês baseado nessa fórmula, para instalar é só colocar dentro do seu global.lua e ela server para pegar uma posição quantos sqm's a frente você desejar. Função getPosfromSquare(pos,direction,squares) ------------------ Function getPosfromSquare(pos,direction,squares) by Dokmos ------------------ function getPosfromSquare(pos,direction,squares) d = direction dir = { x = (math.fmod(d,2)*(-(d-2))+math.floor(d/4)*math.fmod(d,2)*d-math.floor(d/4)), y = (((d-1)*(d-1-(d-1)*math.abs(d-2))*(1-math.floor(d/4)))-(math.floor(d/4)*(math.floor(d/6)*2-1))) } newpos = {x=pos.x+dir.x*squares,y=pos.y+dir.y*squares,z=pos.z} return newpos end Aqui uma talkaction como exemplo que usa a função: function onSay(cid, words, param) newpos = getPosfromSquare(getThingPos(cid),getPlayerLookDir(cid),5) doTeleportThing(cid,newpos,TRUE) return TRUE end Como vocês podem ver essa talkaction teleporta o jogador 5 sqm a frente que ele está olhando, como disse uma mini-função. Espero que aproveitem a fórmula!!! :smile_positivo: Atenciosamente, Dokmos
  25. Olá XTibia.com, Gostaria de ser colaborador do XTibia.com na área de scripting, acredito que posso auxiliar a área de scripting do fórum não só visando o crescimento do fórum, mas também incentivo e apoio aos scripters. Nome Completo: Bruno Braz Silveira. Data de Nascimento: 11/04/1992 Cidade - Estado: Goiânia - GO Área que deseja atuar: Scripting Link para uns de seus trabalhos: Função doPushCreature Função getPosfromArea Action Sensor System Vídeo Sensor System Vídeo Snake Game Vídeo Spell System
  • Quem Está Navegando   0 membros estão online

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