Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. @SkyDarkyes Aproveitando que estou online, qual é esse script mesmo? Irei refazer.
  2. Eu não entendi, foi nada, desse seu pedido. No caso, vamos dizer que um jogador level 8 entra no servidor, mata um Rotworm, aí ele não ganha um level com a experiência dada, no caso, é para ele ganhar esse level mesmo assim? Enfim, se for isso mesmo, prefiro nem deslogar o jogador. function onKill(cid, target) if getMonsterInfo(getCreatureName(target)) then if getPlayerExperience(cid) < getExperienceForLevel(getPlayerLevel(cid) + 1) then doPlayerAddExperience(cid, getExperienceForLevel(getPlayerLevel(cid) + 1) - getPlayerExperience(cid)) end end return true end
  3. Bom, o LuckOake deixou o pupilo dele, no caso, eu, atender pedidos aqui na fábrica, para ganhar experiência. Eu tomei a liberdade de refazer o script de task automático, pedido por @0BoM. MONSTER_TASKS = { -- ["NOME"] = {count = QUANTIDADE, reward = {{ITEM1, QUANTIDADE1}, {ITEM2, QUANTIDADE2}}}, -- Para dar experiência de prêmio, coloque "experience" ["Troll"] = {count = 10, reward = {{2160, 10}, {"experience", 10}}}, } function onKill(cid, target) local tmp = MONSTER_TASKS[getCreatureName(target)] if tmp then local name = getCreatureName(target):lower() local status_storage = name .."_status" if getCreatureStorage(cid, status_storage) == -1 then local count_storage = name .."_count" doCreatureSetStorage(cid, count_storage, math.max(getCreatureStorage(cid, count_storage), 0) + 1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, getCreatureName(target) .." killed: ".. getCreatureStorage(cid, count_storage) .."/".. tmp.count ..".") if getCreatureStorage(cid, count_storage) >= tmp.count then for i=1,#tmp.reward do if tmp.reward[i][1] == "experience" then doPlayerAddExperience(cid, tmp.reward[i][2]) doSendAnimatedText(getCreaturePosition(cid), tmp.reward[i][2], COLOR_WHITE) else doPlayerAddItem(cid, tmp.reward[i][1], tmp.reward[i][2]) end end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You have killed ".. tmp.count .." of ".. getCreatureName(target) ..". You have completed the task.") doCreatureSetStorage(cid, status_storage, 1) end end end return true end Ficou bem legal, permite múltiplas recompensas, você não precisa configurar storages. Abraços.
  4. Oneshot

    Pips

    Monitorador, eu ri.
  5. É mesmo. Obrigado, magnânimo lordbug99, consertei esse erro apontado por vossa ilustríssima pessoa. Parabéns, irei falar do seu grande feito para toda minha família, vizinhos e colegas de trabalho, aposto que eles irão ficar muito estupefatos por causa desse seu grande feito. Acredito que dentro de alguns dias, teremos faixas aqui na rua, homenageando esse seu grande feito. Haddad já confirmou um evento especial para celebrar esse grande feito de vossa pessoa. Chris Hadfield, da Estação Espacial Internacional, notou que sua descoberta é essencial para novos patamares da ciência, e já disponibilizou um vídeo no Youtube, comentando seu grande feito. A NSA tem medo de você, te espiona todos os dias, porque você é uma ameaça aos EUA. E por fim, a presidente Dilma já confirmou que pedirá impeachment, se, apenas se, você liderar a nação a uma nova era. Obrigado por existir.
  6. Eu acho que eu merecia a de Herói, já fui colaborador, moderador, e coordenador, fiz muitas coisas na seção de Scripting, apresentei projetos para revitalizar a área e não deveria ser desmerecido pelos problemas do começo desse ano rsrsr
  7. function onAddItem(moveItem, tileItem, position, cid) local tmp = moveItem.type if moveItem.itemid == 5880 then if moveItem.type < 2 then doPlayerSendCancel(cid, "Sorry, you need at least 2 pieces of iron.") doSendMagicEffect(position, CONST_ME_POFF) return false end doTransformItem(moveItem.uid, 5889, math.floor(tmp/2)) if tmp % 2 ~= 0 then doCreateItem(5880, (tmp % 2), position) end doSendMagicEffect(position, CONST_ME_MAGIC_GREEN) end return true end <movevent type="AddItem" tileitem="1" uniqueid="12333" event="script" value="script.lua"/> Coloque a uniqueid 12333 no chão que transforma os itens. Abraços.
  8. Bom trabalho, meu garoto. Obrigado pela dedicatória, apesar que quem merece tudo é você por ter sido um pupilo excepcional e ter levado o aprendizado tão a sério, se tornando um grande scriptwriter em Lua. Parabéns.
  9. A função os.clock() retorna o tempo de execução de um programa Lua. Aplicado a um servidor de Open Tibia, a função retorna o tempo em segundos desde que o servidor foi executado e iniciado.
  10. Queria ver todos esses 6 anos de experiência com Lua e C++. E, impressionante, você trabalha com OtClient desde que ele foi lançado.
  11. Começarei a desenvolver novos e incríveis sistemas para 10.10 ou The Forgotten Server 1.0
  12. Para o primeiro lugar, Tonynh. Não votarei para o terceiro lugar.
  13. Você descreveu muito bem os servidores da atualidade. E realmente todos os servidores ATS são assim, com exceção de grandes projetos que se consolidaram na base do Open Tibia atual, como o PokeXGames, todos são extremamente relaxados. Conheço um amigo que trabalha bastante para manter o servidor de Narutibia dele atualizado, ele sempre traz novas features para o servidor, novos personagens, eventos, jutsus, não é a toa que é um dos maiores servidores brasileiros do gênero, NTOUltimate. Mas uma coisa não deixa de pecar no servidor, os gráficos miniaturizados e em 90º. Gostei do artigo, obrigado pela contribuição.
  14. Acredito que a chance de gerar um stack overflow é muito baixa mesmo. Ah sei lá, estou enferrujado.
  15. Meu Deus, use pelo menos um português sem internetês na hora de compartilhar conteúdo. E isso não vai funcionar, no fim das contas, se o jogador morrer, ele volta para o level 1.
  16. Eu ainda prefiro fazer com duas posições apenas, já que o objetivo do script é teleportar para posições totalmente aleatórias. local fromPosition = {x=100,y=100,z=7} local toPosition = {x=200, y=200, z=7} function getRandomPosition(fromPosition, toPosition) local tmp = { x = math.random(fromPosition.x, toPosition.x), y = math.random(fromPosition.y, toPosition.y), z = math.random(fromPosition.z, toPosition.z), } if getTileInfo(tmp).house == false and getTopCreature(tmp).uid == 0 and doTileQueryAdd(cid, tmp, 7) == RETURNVALUE_NOERROR then return tmp end return getRandomPosition(fromPosition, toPosition) end function onStepIn(cid) return doTeleportThing(cid, getRandomPosition(fromPosition, toPosition)) end Com recursividade, se a primeira posição não for "boa", ele sorteia uma segunda dentro da área delimitada e por aí vai.
  17. Seu erro está aqui: <movevent type="Equip" itemid="7463" slot="head" event="function" value="onEquipItem"> </movevent> Você colocou slot igual a head, coloque armor.
  18. Meus sinceros parabéns, afinal o bom scripter não é aquele que desenvolve códigos complexos, mas sim aquele que desenvolve códigos com criatividade. Tome meu like e compre tudo de doce.
  19. Eu coloquei 15 milissegundos por colocar, não sei se vai funcionar nesse curto espaço de tempo. rsrsr
  20. Então, fazer um sistema de colisão de magias não tem muito segredo. O omega acertou ao dizer que as magias são executadas instantaneamente, mas errou ao dizer que não tem como verificar se o alvo planeja usar a magia também. Eu fiz baseado na magia Flame Strike, do Tibia. local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) function onCastSpell(cid, var) doCreatureSetStorage(cid, 87600, 1) addEvent(function() local target = variantToNumber(var) if isPlayer(target) then local fromPosition, toPosition = getCreaturePosition(cid), getCreaturePosition(target) if getCreatureStorage(target, 87600) == 1 and getCreatureTarget(target) == cid then doCreatureSetStorage(cid, 87600, 2) doCreatureSetStorage(target, 87600, 2) local midPosition = { x = (fromPosition.x > toPosition.x and (fromPosition.x - ((fromPosition.x - toPosition.x) * 0.5)) or (toPosition.x - ((toPosition.x - fromPosition.x) * 0.5))), y = (fromPosition.y > toPosition.y and (fromPosition.y - ((fromPosition.y - toPosition.y) * 0.5)) or (toPosition.y - ((toPosition.y - fromPosition.y) * 0.5))), z = fromPosition.z, } doSendDistanceShoot(fromPosition, midPosition, CONST_ANI_FIRE) doSendDistanceShoot(toPosition, midPosition, CONST_ANI_FIRE) doSendMagicEffect(midPosition, CONST_ME_FIREAREA) end end if getCreatureStorage(cid, 87600) < 2 then doCreatureSetStorage(cid, 87600, -1) doCombat(cid, combat, var) end end, 15) end Abraços
  21. Isso é impossível, porque no tibia as magias acontecem instantaneamente, portanto, quando o jogador1 usar a primeira magia, vai acertar imediatamente o jogador2 e não tem como checar se o jogador2 planeja usar a mesma magia. Ou seja, não tem como fazer porque as magias NUNCA serão jogadas ao MESMO tempo, nem que a variação entre elas seja em alguns poucos milissegundos. Posso fazer?
  22. Boa iniciativa, omega blueheaven. Só uma dica, amigo, no seu primeiro script que você atribui uma string em uma storage, não esqueça que o tamanho da string é limitado. Abraços.
  23. Ué, fácil... local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) function onTarget(cid, target) return doChallengeCreature(cid, target) end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTarget") function onCastSpell(cid, var) return doCombat(cid, combat, var) end E não esqueça de modificar o spells.xml, colocando needtarget="1" Tchau.
  24. Eu tinha a medalha de Membro Honorário, a de Herói, bem já fui coordenador no modelo antigo do fórum, se isso vale alguma coisa rsrsr
  25. Login Server com Vários Mundos 1. Introdução Olá, pessoal. Já vi diversas vezes, sendo uma delas muito recente, uma dúvida bastante pertinente sobre a configuração do sistema de vários mundos para um único IP de servidor. Sim, tem muita gente que não sabe fazer isso e acaba tendo que criar vários IPs, por exemplo: sv1.fulanoot.com.br sv2.fulanoot.com.br Sim, é mais fácil fazer isso, mas perde toda a graça, pois o Tibia oficial, é dividido em mundos e com um único servidor de login. 1.1 Servidor de Login? Sim, existe um servidor responsável por aceitar o login dos jogadores e distribuir o login nos servidores secundários, ou mundos, a ele damos o nome de servidor de login. Para entender como funciona, olhe a seguinte imagem: O jogador conecta no servidor de login, pode ir para o Mundo 1 que é o próprio servidor de login, ou ir para outros mundos como na imagem, já que conectado no primeiro servidor, ele pode ser direcionado para lá. 2. Como configurar A configuração desse sistema é muito simples, primeiro tenha em mente que você irá precisar separar seus vários servidores, que se comportarão como mundos, em pastas diferentes. Cada executável com sua própria pasta, config.lua, pasta data/ e afins. O primeiro servidor, que será o nosso login server, precisará ser compilado com um parâmetro a mais, OU SEJA, você precisa ter acesso as sources do seu servidor. O parâmetro que você deverá adicionar é: -D__LOGIN_SERVER__ ATENÇÃO, você só deve compilar o primeiro executável, o primeiro servidor, com esse parâmetro, os outros não devem ser compilados assim. Servidores compilados, organizados em suas pastas, configure os servidores para acessar o banco de dados MySQL (não testei com SQLite, acredito que não funciona.) Abra o servers.xml no diretório data/XML do nosso login server, ele vai estar assim, provavelmente: <?xml version="1.0" encoding="UTF-8"?> <servers> <server id="0" name="Example" versionMin="860" versionMax="860" address="127.0.0.1" port="7171"/> </servers> Configure seus servidores aqui, por exemplo: <?xml version="1.0" encoding="UTF-8"?> <servers> <server id="1" name="Caramelo" versionMin="860" versionMax="860" address="127.0.0.1" port="7172"/> <server id="2" name="Biscoito" versionMin="860" versionMax="860" address="127.0.0.1" port="7173"/> <server id="3" name="Chocolate" versionMin="860" versionMax="860" address="127.0.0.1" port="7174"/> </servers> No campo address, você irá colocar o IP do servidor (Não testei com redirecionamento, IP fixo), e no campo port, todas as portas diferentes de 7171, ou seja vá aumentando de 1 em 1 para cada servidor/mundo. Depois de configurado, vamos ao config.lua. É mais simples, no config.lua de cada servidor, você vai mudar o campo: worldId = 0 Para cada valor que você colocou no servers.xml. Nosso login server pode ter o valor 1 por exemplo e os outros os valores 2 e 3. Você vai mudar também: gamePort = 7172 Para todas as portas que usou no servers.xml, ou seja, 7172 para o primeiro servidor, 7173 para o segundo e assim em diante. Em todos os outros servidores, com exceção do login server, você vai mudar: loginOnlyWithLoginServer = false Para: loginOnlyWithLoginServer = true Lembrando, com exceção do login server. Depois é só desbloquear as portas 7171 e 7172 e, outras que você usar, abrir todos os executáveis (não esquecendo do que compilamos como login server) e correr para o abraço. Não vou ensinar como configurar Account Manager para selecionar o mundo do personagem, pois são edições trabalhosas, talvez isso fique para outro release. Há também edições C++ que você pode fazer para poder deixar todos servidores em uma única pasta. Abraços, Oneshot
  • Quem Está Navegando   0 membros estão online

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