Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 10/14/15 em todas áreas

  1. Bluester

    [MÓDULO] Tutorial In-Game

    Eae galera do xtibia, hoje venho apresentar à vocês meu primeiro post, um módulo de Tutorial no OTC, parecido com o da PXG que você pode usar e customizar, basta ter um pouco de conhecimento ! (Se estiver em área errada peço que movam) Print: Bom, o script está pronto, mas se quiser editar, mexa apenas em configs_pt e em configs_en, nesses 2 arquivos, vocês editem o que quiserem e na pasta imgs vocês colocam as imagens (caso editem) na mesma resolução ! Link de download do módulo: Scan: Arquivos estão ocultos, para conseguir habilitar no Windows 7: Arquivos estão ocultos, para conseguir habilitar no Windows 8: Bom é só isso, até a próxima ! Créditos: Pokémon Waterfall por algumas partes dos scripts e imagens. WOP por algumas partes dos scripts e imagens. PXG por algumas imagens.
    2 pontos
  2. Refe

    [Encerrado]Pokemon Rubrum -Kanto Full-

    Acompanhe Updates na nossa Fan Page ou no nosso Blog Algumas Novidades: [1] Será Feito com Sprites de Game Boy, Nintendo DS e Nintendo 3DS [2] O Mapa será BASEADO em jogos e nos Animes [3] Alguns sistemas Básicos do TIBIA irão permanecer (Houses, Guilds, Etc) [4] Será Adicionado TODAS Gerações, TODOS continentes. [5] Haverá Quests com Personagens do ANIME (Programado: Ash, Misty, May, Dawn, Brock), dos JOGOS (Programado: Red, Jimmy, Diamond) [6] Iremos focar em coisas pedidas pelo pelos jogadores. [7]Sistema de TM/HM [8]Sistema de IV/EVs FLY, RIDE & SURF Vagas: Mapper Spriter Scripter Programador Ficha de inscrição: Nome: Contato: Skype, Whatsapp, Facebook. (Somente um) Vaga Desejada: (Veja em Vagas) Idade: Equipe: Contato: <script data-cfhash='f9e31' type="text/javascript"> /* */</script> Imagens: Pallet: , Viridian (em Desenvolvimento) Update do dia (12/10/2015) Update dos dias 12/10 e 13/20 Ultra Update 24/10/2015
    2 pontos
  3. local outfit = xxx --ID da outfit. doSetCreatureOutfit(cid, {lookType = outfit}, 10000) doCreatureSetNoMove(cid, true) addEvent(function() if not isPlayer(cid) then return true end doCreatureSetNoMove(cid, false) end, 10000)
    2 pontos
  4. Talkaction.XML <talkaction words="/doubleexp" access="5" event="script" value="exp.lua"/> Taltaction/script/exp.lua function onSay(cid, words, param, channel) local config = { storage = 102590, } if(param == 'cancel') then if getGlobalStorageValue(config.storage) > 0 then setGlobalStorageValue(config.storage, -1) doBroadcastMessage("Double Exp cancelado") end return true end param = tonumber(param) if(not param or param < 0) then doPlayerSendCancel(cid, "Apenas maiores que 0.") return true end if getGlobalStorageValue(config.storage) - os.time() <= 0 then setGlobalStorageValue(config.storage, os.time()+param*60*60) doBroadcastMessage("Exp bonus ativado 50% + EXP por "..param.." horas! Aproveite.") end return true end Creature.XML <event type="kill" name="ExpBonus" event="script" value="exp.lua"/> Creature/script/exp.lua function onKill(cid, target) if isPlayer(cid) and isMonster(target) then if getGlobalStorageValue(102590) - os.time() >= 1 then local exp = getExperienceStage(getPlayerLevel(cid), getVocationInfo(getPlayerVocation(cid)).experienceMultiplier) local count = ((getMonsterInfo(string.lower(getCreatureName(target))).experience*1.5*exp)/2) doPlayerAddExperience(cid, count) addEvent(doSendAnimatedText, 500, getCreaturePosition(cid), '+'..count, math.random(50,60)) end else return TRUE end return TRUE end Creature/script/login.LUA registerCreatureEvent(cid, "ExpBonus") Movido para resolvidos
    2 pontos
  5. Bluester

    Pokémon x

    Obrigado pela referência, o que resta é aguardar os moderadores.
    2 pontos
  6. Eai galera, blz? Bom, vim trazer pra vcs a versão 1.0 do mod de pokedex que eu desenvolvi mês passado visando aprendizado no mundo de OTC, com o objetivo também de mostrar que o otclient é flexível suficiente para se fazer muitas coisas sem a necessidade das sources nem do servidor e nem do client... Para aqueles que não conhecem, vejam o Show Off desse trabalho. Atualizações: 1. Adicionado um pack com 276 imagens de pokemons (16,1MB); 2. Pokemons shiny tem a exibição da imagem de pokemons normais (para alterar, basta remover a linha 75 do arquivo game_pokedex.lua, na pasta modules/game_pokedex de seu client); 3. Pokedex fecha ao se deslogar do char com ela aberta [créditos a @@Soulviling pela ideia]; Bom, sem mais delongas; Instalação fácil: Passo 1. Faça o download do arquivo RAR (download no final do tópico); Passo 2. Copie a pasta modules pro seu client; Passo 3. "Deseja substituir?" [X]Sim [ ]Não Passo 4. Só vai até o passo 3; Bom, segue uma imagem ATUALIZADA Download e Scan
    1 ponto
  7. Baiak Extreme OTProjects 0.7 - O MELHOR BAIAK! (8.60) Servidor feito pela Otprojects. Fala galera estou aqui para apresentar o novo Baiak Extreme, A OTProjects trabalhou muito tempo neste servidor. Ele custava cerca de 35 Reais na loja da OTprojects, mas foi liberado de graça e eu estou repassando pra vocês. Este servidor é um dos Mapas Baiak mais completos, possui WoE, Dota, Coliseum, Zombie e outros Eventos. Tá esperando o que? Confira logo! Cidades: ├ Baiak City ├ Desert City ├ Hydraland ├ Yalahar (Cidade VIP) └ Thais Imagem #1: Templo - Baiak City Imagem #2: Glacial Area Imagem #3: Baiak City O Que Contêm no Servidor: ├ Eventos Exclusivos : ├DotA ├ WoE ├ Coliseum ├ Zombie Event ├ Yalahar como City VIP ├ City do Baiak Totalmente Reformulada. ├ Novos Teleports e Quests ├ War Castle ├ Novos NPC'S ├ War System. └ TFS 0.4 DEV Rev: 3777 Já Compilado. Lista Das Principais Quests (Todas Funcionando 100%): ├ The Annihilator Quest ├ Demon Helmet Quest ├ Firewalker Boots Quest ├ The Inquisition Quest ├ The Pits of Inferno Quest ├ The Demon Oak Quest └ In Service of Yalahar Quest Update 0.7: - Sem o Bug dos Stages - Com TFS 0.4 REV 3884 - O MELHOR PARA WINDOWS - Crashes no Console Removidos - Agora em MYSQL, Recomendo que usem o Xampp e o Gesior para fazer o Site. Senha do God: god/god Como Abrir o Mapa Caso dê Erro: Vai no RME Aperta em File>New>Import Map e Selecione o Mapa do Baiak Extreme. Download & Scan ATENÇÃO: UTILIZE MYSQL para Melhor Resultado! Download Os vírus acusados estão no Distro, o Servidor está Limpo! ATENÇÃO! Para o MELHOR FUNCIONAMENTO DO OT, Recomendo que USEM MYSQL! Créditos:
    1 ponto
  8. Eae XTibianos, não sei se essa é a área correta, se estiver na área incorreta, peço que movam. Hoje venho apresentar a base de um sistema de Profissões/Craft, bem parecido com o da PokeXGames e que talvez eu libere pro pessoal. Ainda tenho que aperfeiçoar, trocar sprites e mais algumas coisas. Hospedei o vídeo no YouTube e espero que vejam ! Link: Créditos também ao Zipter98 que ajudou no sistema respondendo meu tópico anteriormente ! @ Uma atualizada no tópico, com um novo vídeo com 3 sistemas que andei mexendo Ainda irei mexer no sistema de Mega Evolução e de Addon, e irei terminar outras profissões to com pouco tempo... Créditos ao Zipter novamente, GabrielTxu e Overllord @edit 13/12/15 Bom, andei mexendo novamente, e agora venho mostrar o sistema de HMs... Creio que todos saibam como funciona, então já irei mostrar o vídeo: Créditos ao Zipter por ter feito o sistema que usei de base e GabrielTxu por me ajudar com algumas dúvidas. Espero que gostem.
    1 ponto
  9. Bluester

    Base Otpokemon V1

    Aqui está, só extrair e renomear ! Não esquece de olhar o login e senha do GOD no SQLite/MySQL ^^
    1 ponto
  10. zipter98

    Spell de revidar ataque

    Na spell, troque: setPlayerStorageValue(cid, config.storage, 1) por: setPlayerStorageValue(cid, config.storage, os.time() + 10) No creatureevent, troque: if getPlayerStorageValue(cid,config.storage) == 1 and isCreature(attacker) then por: if getPlayerStorageValue(cid, config.storage) > os.time() and isCreature(attacker) then E remova a linha: setPlayerStorageValue(cid,config.storage, 0)
    1 ponto
  11. Refe

    [Encerrado]Pokemon Rubrum -Kanto Full-

    Claro meu amigo :v Atualização do dia: -- Começei a refazer o Catch System -- Começei a adicionar os pokémons no client -- Atualizado o mapa -- Auto-Stacking adicionado -- Transparência Adicionada -- Old Client Adicionado -- Temos cerca de 600Sprites ao total (Atualizações de ontem, e algumas hoje) @Adicionado Interior do Poké Lab @Atualização: Alterado design do client (OTC) @Atualização: Refeito a base do Launcher Adicionado Persian Fly
    1 ponto
  12. Allangod

    Spell que sobe

    Bom, eu tenho o Fly system (Mock) no meu servidor e gostaria de uma spell que ao usá-la, o jogador "voaria para o andar de cima" (Igual ao fly system mesmo) e explodisse um efeito em área no lugar onde ele estava, e em seguida voltar ao andar de baixo. Seria como se ele taca-se fogo no chão e voa-se para não ser atingido. Obrigado.
    1 ponto
  13. local config = { pos = {x=174, y=116, z=12}, stoneid = 1353, time = 30 -- time in seconds to remove the stone } function onUse(cid, item, fromPosition, itemEx, toPosition) local stone = getTileItemById(config.pos,config.stoneid).uid if(stone > 0) then doRemoveItem(stone,1) doPlayerSendTextMessage(cid,22,"A pedra foi removida") doSendMagicEffect(config.pos, CONST_ME_MAGIC_RED) addEvent(doCreateItem, config.time * 1000, config.stoneid, 1, config.pos) doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945) else doPlayerSendCancel(cid, "A pedra ja foi removida, aguarde 30 segundos para abrir novamente.") end return true end
    1 ponto
  14. @Mini atualização; - Resovi todos os bugs; - Efeitos nas sources extendidos; - Vou começar a editar um website para o servidor com ajuda do Cetros <3. - Finalizando sistema de linguagem *Pt, Eng e Espanhol* - Fim de semana libero o servidor; :3 - Nova distro, limpa e com varias modificações; - Novo fishing;
    1 ponto
  15. Primeiramente, instale esse creatureevent nas suas sources. Depois, crie um arquivo em data/creatureevents/scripts com extensão .lua e coloque o seguinte conteúdo: local poke_items = {} for _, poke in pairs(poke_item_table) do for level, itemid in pairs(poke) do table.insert(poke_items, itemid) end end function onMoveItem(cid, item) return not isInArray(poke_items, item.itemid) end Tag (não se esqueça de registrar o evento em login.lua): <event type="move" name="blockPokeItem" event="script" value="nome_do_arquivo.lua"/> Em qualquer arquivo da lib, coloque a seguinte tabela: poke_item_table = { ["Charmander"] = { --[level] = itemid, [1] = xxx, [5] = yyy, [8] = zzz, --etc }, } Em goback de actions, abaixo de: doSummonMonster(cid, i) coloque: local poke_item = poke_item_table[i] if poke_item then for level, itemid in pairs(poke_item) do if getPlayerLevel(cid) > level then doPlayerAddItem(cid, itemid, 1) end end end No mesmo arquivo, acima de: doRemoveCreature(z) coloque: local poke_item = poke_item_table[pokename] if poke_item then for level, itemid in pairs(poke_item) do if getPlayerItemCount(cid, itemid) > 0 then doPlayerRemoveItem(cid, itemid, 1) end end end Agora, em goback de creaturescripts, abaixo de: if #getCreatureSummons(cid) == 1 then coloque: local poke_item = poke_item_table[getCreatureName(getCreatureSummons(cid)[1])] if poke_item then for level, itemid in pairs(poke_item) do if getPlayerItemCount(cid, itemid) > 0 then doPlayerRemoveItem(cid, itemid, 1) end end end Finalmente, abaixo de: function onDeath(cid, deathList) coloque: local poke_item = poke_item_table[getCreatureName(cid)] if poke_item then for level, itemid in pairs(poke_item) do if getPlayerItemCount(cid, itemid) > 0 then doPlayerRemoveItem(cid, itemid, 1) end end end
    1 ponto
  16. Lucas CP

    Dano por porcentagem

    Você pode editar em Game.cpp, procura a parte responsável pela mensagem do dano e no lugar do damage você coloca uma pequena formula que pega a porcentagem, exemplo: damage*100/vida da criatura
    1 ponto
  17. Bluester

    [MÓDULO] Tutorial In-Game

    Obrigado. É do Client do Pokémon Waterfall.Pra deixar o jogo full, aperte CTRL + . (ponto).
    1 ponto
  18. Imperatriz

    Pokémon x

    1° a base é cyan e já tinha ícone 2° você não editou absolutamente NADA, pegou do grupo do Facebook e postou aqui 3° o verdadeiro dono da base é o Bluester (Matheus Soares) 4° denunciado 5° a base é PokèStage 6° Arruma o português, né?
    1 ponto
  19. Lucas CP

    script de gm

    Se for TFS 1.x você pode colocar na parte de player.lua da pasta events. Player:onMoveItem(item, count, fromPosition, toPosition) Antes do último return coloca isso: if self:getGroup():getId() > 1 then self:sendCancelMessage("Sorry, not possible.") self:getPosition():sendMagicEffect(CONST_ME_POFF) return false end Em outras versões só mudar na src: em game.cpp e editar essa parte: Game::playerMoveItem Se não me engano
    1 ponto
  20. fortation

    [RE-UPADO] Wodbo Hunter

    VENHO TRAZER O MEU SERVER ARRUMADO E SEM BUGS NAO QUIS MAIS ABRIR MEU SV ENTAO VO POSTA OQ TEM NELE: Kame Vocation Raditz Vocation C16 Vocation & Muito Mais... Shenron Novas Transforms Novas Spells Fusoes melhoradas (Todos, Escrever: fusion) Escreva "Transform" Ou Escrever: transformar. Taxa de equilibrio (Aproximadamente 90% dos Skill) Monstros Dividido com "nivel" Armas Melhoradas e Com porcentagem de leveL ARRUMEI TODOS OS BUGS MENOS DO BOL (AOL) QUE EU N CONSEGUI E TAMBEM TODOS OS BUGS DO SITE. SS DO SITE : DEPOIS EU COLOCO SS's DO SERVER ! DOWNLOAD's : Cliente: https://www.mediafire.com/?gob4q7ksfj0w39h Server : http://www.mediafire...klkkxzgbwl9am0n Site : http://www.mediafire...b6f4eks2qlf8bsi Creditos : CRAZZY (PELO MAPA) EU (POR ARRUMAR OS BUGS MAPA E SITE) MEU IRMAO (POR ME AJUDAR NO SERVIDOR) MATHEUSVIDALOKA (PELO CLINTE) TE AJUDEI ME DA 1 REP++ AEW CUSTA NADA! * 11/02/2014 - CLIENTE RE-UPADO. NEM SABIA QUE TINHA QUEBRADO O LINK MALS.
    1 ponto
  21. tibiaa4e

    Pasta Data - A Magia Do Npcs

    Pasta Enciclopédia com todos os links de outros tutoriais ! Lista de Tutoriais Tutorial de NPCs Bem depois de um tempinho sem fazer nada de otserver devido a falta de tempo (dinheiro, paciencia e felicidade) resolvi dar uma apertada para terminar o que ja era para ter sido feito a tempos... Então devido a pedidos de amigos no MSN, resolvi sair da ordem inicial dos tutoriais, até porque vejo mais necessario um tutorial de npc do que outros. Esse tutorial irá servir para quem gostar de fazer certo NPCs mais complexos com storages, varias missões e tudo mais. Usando como base o Jiddo system apenas para comprar e vender itens, pois não gosto de usar sistemas que facilitam Pois não criam scripters e sim preguiçosos, ainda mais quando o sistema é abandonado ai você se lasca O npc é dividido em duas partes : - Arquivo XML : Responsavel pelo visual e algumas propriedades dele (pelo jiddo system) - Arquivo Lua : Responvasel pelas falas e vendas (Lua puro) Visual do Npc Bem primeiro vamos explicar o visual de um npc, <npc name="Bonifacius" script="data/npc/scripts/default.lua" walkinterval="25" floorchange="0" access="5" level="1" maglevel="1"><health now="150" max="150"/><look type="128" head="97" body="100" legs="115" feet="114" corpse="2212"/></npc> Explicando parte a parte Name : Nome dele que aparecerá para todos. script: Arquivo lua do script dele walkinterval: De quanto em quanto milessegundos ele irá caminhar. floorchange: Se ele irá subir escadas ou cair em buracos. access: O valor de acesso dele, caso ele tenha um acesso 5 poderá usar todo os comandos de GODS. level,maglevel: É tosco, você pode fazer ele soltar magias (nunca tentei) e no caso isso contaria. Health Now: Sangue que terá max: Maximo de health (ja fizeram npc com life media) look type: Tipo de roupa dele, Caso queira ele como objeto use look typeex. head,body,legs,feet: Cor da cabeça,corpo,calça e pé do npc. corpse: Corpo caso ele morra (LOL não dá...) Esse é a base do arquivo xml do npc. Caso você queirá enfiar tosquisses pelo Jiddo System fica mais ou menos assim: <?xml version="1.0" encoding="UTF-8"?><npc name="Bonifacius" script="data/npc/scripts/default.lua" walkinterval="25" floorchange="0" access="5" level="1" maglevel="1"><health now="150" max="150"/><look type="128" head="97" body="100" legs="115" feet="114" corpse="2212"/><parameters><parameter key="module_shop" value="1"/><parameter key="shop_buyable" value="banana,2676,2;grapes,2681,3;melon,2682,8;orange,2675,5;pumpkin,2683,10;cheese,2696,5;egg,2695,2;cookie,2678,2;meat,2266,5"/><parameter key="message_greet" value="What you doing soldier ? Take your weapon and go war!"/><parameter key="message_walkaway" value="Hey Hey, where you go ?"/><parameter key="message_farewell" value="Bye bye brave soldier. Remember, peoples without head, don't transform in undeads."/><parameter key="message_alreadyfocused" value="You are drunked ? You talk really talk to me ?"/></parameters></npc> <parameters><parameter key="module_shop" value="1"/><parameter key="shop_buyable" value="banana,2676,2;grapes,2681,3;melon,2682,8;orange,2675,5;pumpkin,2683,10;cheese,2696,5;egg,2695,2;cookie,2678,2;meat,2266,5"/><parameter key="message_greet" value="What you doing soldier ? Take your weapon and go war!"/><parameter key="message_walkaway" value="Hey Hey, where you go ?"/><parameter key="message_farewell" value="Bye bye brave soldier. Remember, peoples without head, don't transform in undeads."/><parameter key="message_alreadyfocused" value="You are drunked ? You talk really talk to me ?"/></parameters> Esse é um exemplo basico de npc vendedor, que não faz muita coisa. module_shop : Quer dizer que ao falar trade ele irá abrir a janela tosca de venda de itens. shop_buyable : Isso faz tudo que tiver ai ele vender sendo a sintaxe parameter key="shop_buyable" value="nome inutil (inutil mesmo não serve para nada),id do produto,preço; Podendo você adicionar milhares e milhares, unico porém de você adicionar pelo XML é que não há possibilidade de fazer a venda por backpack (pelo menos até a versão que testei) message_farewell Mensagem de despedida Essas message tem alguns tipos explicados abaixo : greet - mensagem de boas vindasfarewell - Mensagem de despedidabuy - Mensagem de confirmação de compraonbuy - Sei la o0bought - Mensagem de compra confirmadasell - Mensagem de confirmação de vendaonsell - sei la o0sold - Mensagem venda confirmadamissingmoney - Que você ta liso (sem nada)needmoney - Que você não tem dinheiro suficientemissingitem - Falta o item necessarioneeditem - Que você não te o item ou não tem a qtd suficienteneedspace - Que falta espaço na bp para o itemneedmorespace - Que prescisa de mais alguns espaçosidletimeout - Que você demoro e perdeu a vezwalkaway - Saiu da visão deledecline - Que desistiu da açãosendtrade - Quando abre a janela de tradenoshop - Que ele não tem janela de trade para mostraroncloseshop - Que você fechou a janela de tradealreadyfocused - Que tu deu um tapa na pantera, ou seja, ele já está falando com vocêplacedinqueque - Para você ter paciencia que já será atendido Tudo isso acima deverá estar depois de message_ e as mensagens em default você poderá encontrar em npc/lib/npcsystem/npchandler.lua Se você fazer asneira lá os npcs não funfam cuidado o0 Ainda há o npc de barco, muito simples : <parameter key="travel_destinations" value="desert,1594,835,5,180;edron,931,825,6,90;"/> Sintaxe value="nome da cidade ,coordenada x,coordenada y,coordenada z ,valor;" Da para você fazer tudo do LUA no XML, porém eu acho estranho e apenas frescura do Jiddo e dos Developers do TFS (não sei developer em Português) Caso seja curioso olhe nos arquivos bankmax.xml, merchant.xml e postman.xml que estão em npc/lib Bem a parte XML já acabo, ou seja, ela é muito simples. NPCS EM LUA Aqui é a parte legal do npc na qual até certos scripters novos fazem coisas desnecessarias ou que pioram... A base do arquivo usando Jiddo System é local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endnpcHandler:addModule(FocusModule:new()) Ou seja npcs, que aquilo que mostrei no xml é suficiente você pode direcionar para o default.lua Eu disse que npcs feitos no XML, a opção de compra por backpack não é possivel Então para faze-la em um npc Lua ficará assim : local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endlocal shopModule = ShopModule:new()npcHandler:addModule(shopModule)shopModule:addBuyableItem({'health potion'}, 7618, 45, 1, 'health potion')shopModule:addBuyableItem({'mana potion'}, 7620, 50, 1, 'mana potion')shopModule:addBuyableItemContainer({'bp hp'}, 2000, 7618, 900, 1, 'backpack of health potions')shopModule:addBuyableItemContainer({'bp mp'}, 2001, 7620, 1000, 1, 'backpack of mana potions')npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new()) Nesse exemplo o npc vende health potion,mana potion e bp dos respectivos. Sendo a sintaxe shopModule:addBuyableItem({'nome inutil'}, id preço, quantidade ou sub tipo, 'nome inutil') Esse nome só serve para você não se perder, pois ao dizer trade ele aparecerá o nome do item pelo items.xml e não o que voce falou Sintaxe da backpack shopModule:addBuyableItemContainer({'nome'}, id da backpack, id, preço, sub tipo ou quantidade (caso seja agrupavel), 'nome inutil') Ai sempre virá uma bp cheia dos item especificado. Caso não saiba ao clicar com o direito no TRADE e usar buy with backpack virá com isso ai Essa é a parte facil até agora tentarei pensar aqui 25 minutos um jeito de explicar muita coisa xD NPCS de Missões Bem aqui ensinarei a fazer npcs de missões, isso mesmo até mesmo aqueles de post office, paradox (que eu até ja fiz) Como sempre ensinarei a logica, ou seja, darei conhecimento não ideias local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'rainbow') or msgcontains (msg, 'perch') thenif getPlayerStorageValue(cid,30013) == 8 thenselfSay('Yeah. But peguins, stoled my last crate of this. Please go lair of this plague and take again my itens. You go ?', cid)talkState[talkUser] = 1elseselfSay('You are a lier. Leave here!', cid)endelseif msgcontains(msg, 'mission') thenif doPlayerRemoveItem(cid,7707,1) == 1 thenselfSay('Congratulations. Give this for Willard.', cid)setPlayerStorageValue(cid,30013,10)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)endelseif talkState[talkUser] == 1 thenif msgcontains(msg, 'yes') thenselfSay('Great. Later report me asking mission.', cid)setPlayerStorageValue(cid,30013,9)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)endendreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new()) Esse npc ai é um simples de quest, você pode se basear nele para seu primeiro npc Vamos explicar umas coisas importantissimas talkState = Isso ai é a genialidade, a cada passo você pode mandar o player para um estagio. Se você leu meus tutos percebeu que ele é um vetor, mais por que ? Porque, ao ser uma variavel ele é armazenada no servidor certo ? Então se não fosse um vetor, o npc falando com dois ao mesmo tempo poderia se confudir e ferrar tudo literalmente Se você dominar o talkState dominará 50% de npcs de missões Storages = Isso também é indispensavel nos npcs, é sempre bom reservar uns para cada missão Para se ela tiver varias etapas você não se confudir, Ou usar o mesmo value para poder aproveitar no questlog (explicado no tutorial SUper Quests) O npc acima ele é 4º npc da minha quest global do meu otserver de testes. Ignore os erros de Inglês. if msgcontains(msg, 'rainbow') or msgcontains (msg, 'perch') thenif getPlayerStorageValue(cid,30013) == 8 thenselfSay('Yeah. But peguins, stoled my last crate of this. Please go lair of this plague and take again my itens. You go ?', cid)talkState[talkUser] = 1elseselfSay('You are a lier. Leave here!', cid)end Aqui ao você falar rainbow ou perch ele começa a girar essa parte do script. Ou seja no caso eh msgcontains se você falar Sou gay rainbow e você é bobo,feio e chato Ele irá entender normalmente, e rodará o script. Caso fosse msg ai sim teria quer ser certinho (até maiscula e miniscula acho que ele duvidaria) No caso ele checa o storage 30013 se tem o valor 8, caso tenha ele fala aquela frase enorme e muda seu talkstate para 1 Se não tiver o storage com valor 8, ele te ofende. Esse storage 8 é adicionado no npc anterior. Se você tiver tudo certo ele tem pergunto algo, porém isso só será checado no talkstate 1 elseif talkState[talkUser] == 1 thenif msgcontains(msg, 'yes') thenselfSay('Great. Later report me asking {mission}.', cid)setPlayerStorageValue(cid,30013,9)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)end Se você falar yes, ele manda você ir no penguim hell para você pegar os treco para ele. E te coloca o storage 30013 com valor 9 O valor do storage é fico importante depois da criação do quest log, pois nele os avanços da mesma missãoSó pode ser feito pelo mesmo storage. Lembrando que depois do tfs 0.3.0 beta 1 , é possivel adicionar palavras no valorPodendo ser :setPlayerStorageValue(cid,30013,"estagio 1") E veja que ele manda você falar mission quando completar Palavras entre { } de npcs fazem ele falar em palavras negriras Vamos supor (não supositorio), que você completou ela e falo mission para ele. O que iria checar ? elseif msgcontains(msg, 'mission') thenif doPlayerRemoveItem(cid,7707,1) == 1 thenselfSay('Congratulations. Give this for Willard.', cid)setPlayerStorageValue(cid,30013,10)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)end Se você fala mission, ele automaticamente remoe o item 7707 (dado na quest) e parabeniza você. Dando o storage 30013 com valor 10 O valor necessario para o npc anterior voltar a falar com você. Caso você seja caloteiro ele já te desmente. Bem simples, não ? Claro que esse npc é minisculo. Porém ja da para seguir como base. OLhe a evolução dele Assim já para ter uma ideia de um npc maior... É só seguir essa base... Vamos criar um passo a passo para que não compreendeu. NPCs tutoriais Situação : O npc Valdemar quer que você entregue uma carta a irmã dele chamada Clarice. Pense. Ele irá dar uma carta, e algo que controle se você ja recebeu a carta. Porque se você deu calote uma vez Que não se repita, ou seja, um storage value. Que será o 2411 (bem masculo) local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'mission') thenif getPlayerStorageValue(cid,2411) == -1 thenselfSay('Entregue essa carta a minha irmã Clarice.', cid)setPlayerStorageValue(cid,2411,1)doPlayerAddItem(cid,8370,1)elseselfSay('Eu ja te dei a carta, aguardo resposta', cid)endendreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new()) Ai checamos se ele já fez a quest. No caso se tiver -1 (que nunca fez) ele poderá começa-la. E dará a carta ao player (item 8370 nem sei o que é) Ok. Essa parte ta montada, ele dá a carta. Situação : A NPC Clarice está cantarolando em sua casa, quando você chega com uma carta de seu irmão. Ela recebe de bom grado porém prescisa provar que recebeu. Porém seu jogador não sabe que existe storage value, então Você poderá enviar outra carta ou inventar que ela irá falar com ele. local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'letter') thenif getPlayerStorageValue(cid,2411) == 1 thenselfSay('Ah você relmente tem a carta de meu amado irmão?', cid)talkState[talkUser] = 1elseselfSay('Ah seu fanfarao saia daqui', cid)endelseif talkState[talkUser] == 1 thenif msgcontains(msg, 'yes') thenif doPlayerRemoveItem(cid,8013,1) == 1 thensetPlayerStorageValue(cid,2411,2)selfSay('Obrigada. Agora eu irei falar com ele sobre o assunto', cid)talkState[talkUser] = 0elseselfSay('Você não tem a carta dele', cid)endelseselfSay('Então porque veio aqui ?', cid)endendreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new()) Veja que ela é a prova de erros. Primeiro ao falar letter ela checa se você tem o storage com valor 1 (Ou seja, se você falo com ele) Se não falou ela já te manda pescar, se houver, ela já mete pergunta se você tem a carta Caso não já te manda pescar Caso sim ela tenta pergunta se voce tem a carta Caso diga não ela te manda pescar também, Caso fale sim ela tenta tirar sua carta, caso você tenha ela te agradece e coloca o storage com valor 2 Caso não tenha ela diz que você não tem a carta Manda pescar é um jeito delicado de mandar você ir tomar suco no orificio... Vamos suport, que você aceitou e entregou a carta tudo certinho Você deve voltar ao Valdemar para ele te dar algo não ? Situação : Você ja deu uma de carteiro e agora quer receber sua recompensa, então ao Oscar, Porém ele não é trouxa E como ele sabe se você ja fez tudo ? Uma dica começa com S e termina com orage... local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'mission') thenif getPlayerStorageValue(cid,2411) == -1 thenselfSay('Entregue essa carta a minha irmã Clarice.', cid)setPlayerStorageValue(cid,2411,1)doPlayerAddItem(cid,8370,1)elseselfSay('Eu ja te dei a carta, aguardo resposta', cid)endelseif getPlayerStorageValue(cid,2411) == 2 thenselfSay('Parabens. Você fez o pedido certinho! Receba sua recompensa!!!', cid)setPlayerStorageValue(cid,2411,3)doPlayerAddItem(cid,2160,1)elseselfSay('Termine o serviço!', cid)endreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new()) Vejam que eu usei a mesma palavra missão e adicionei um else. Se ele tiver o storage com valor 2 e falar missão, obviamente ele fez tudo e como é a ultima missão Não necessita fazer perguntas retoricas (sem resposta), então ele já da sua recompensa e ja fecha seu storage com 3 Caso você não tenha storage -1 e nem 2 só pode ser 1 (no caso dessa quest) então ele manda você termina o serviço PELO AMOR DE DEUS, SEMPRE ESTRUTURE SEU SCRIPT, SE NÃO VOCÊ IRÁ SE CONFUDIR COM ESSE SHOW DE ELSE E IF. Isso é a vantagem de se usar o Jiddo System, pois diminuiu a confusão. Porém como ja disse, é coisa de preguiçoso Mais cada um com o seu né... Aqui acaba o npc de missões. Eu expliquei apenas a parte dos ifs e elseifs. Isso é simples, agora depende de sua capacidade e criatividade. Melhor maneira de aperfeiçoar ? fazendo varios!!! Eu odeio npcs, quase morri de raiva de ter que fazer esses (serio ) Espero que aproveitem xD Funções de NPcs Se você leu esse tuto até aqui, é porque não entendeu nada, ou seu interesso muito, por npcs. Lembra dos npc base ? local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endnpcHandler:addModule(FocusModule:new()) Se você observar ele tem 4 funções ai que nem foram usadas. onCreatureAppear(cid) : Ela faz uma ação quando o player entrar em seu raio de ação onCreatureDisappear(cid) : Ela faz uma ação quando o player sai do seu raio de ação. onCreaturesay(cid) : Quando o player fala algo. onThink(cid) : Seria ao pensar ao achar, não tenho certeza do que faz, porém é uma função muito usada. onCreatureMove(creature, oldPos, newPos) : Quando a criatura se move de um lugar para outro. Pelo que você ja perceberam eu odeio npcs, então não usei muitas dessas funções. No tfs tem o npc cityguard que ataca todos os red skull que aparecem em seu raio. local target = 0local prevTarget = 0local maxChaseDistance = 20local origPos = 0local origDir = NORTHlocal lastAttack = 0local followTimeout = 10local function isSkulled(cid)local skullType = getPlayerSkullType(cid)if(skullType >= 3) thenreturn trueendreturn falseendlocal function goToOrigPos()target = 0lastAttack = 0selfFollow(0)doTeleportThing(getNpcCid(), origPos)endlocal function updateTarget()if(isPlayer(target) == FALSE) thengoToOrigPos()elseif(not isSkulled(target)) thentarget = 0selfSay("Now, behave in the future.")endif(target == 0) thenlocal list = getSpectators(getNpcPos(), 8, 8, false)for i=1, table.getn(list) dolocal _target = list[i]if(_target ~= 0) thenif(isPlayer(_target) == TRUE and isSkulled(_target)) thenif(selfFollow(_target)) thentarget = _targetif(target ~= prevTarget) thenselfSay("We do not tolerate people like you here!")endprevTarget = targetbreakendendendendendendfunction onCreatureAppear(cid)if(cid == getNpcCid()) then--Wake up callorigPos = getNpcPos()--origLook = getCreatureDir(cid)endendfunction onCreatureDisappear(cid)if(target == cid) thengoToOrigPos()endendfunction onCreatureMove(creature, oldPos, newPos)--endfunction onThink()updateTarget()if(target == 0) thenreturnendlocal playerPos = getCreaturePosition(target)local myPos = getNpcPos()if(myPos.z ~= playerPos.z) thengoToOrigPos()returnendif(math.abs(myPos.x - origPos.x) > maxChaseDistance or math.abs(myPos.y - origPos.y) > maxChaseDistance) thenselfSay("I'll catch you next time.")goToOrigPos()returnendif(lastAttack == 0) thenlastAttack = os.clock()endif(os.clock() - lastAttack > followTimeout) then--To prevent bugging the npc by going to a place where he can't reachselfSay("You got me this time, but just wait.")goToOrigPos()returnendif( (math.abs(playerPos.x - myPos.x) <= 1) and (math.abs(playerPos.y - myPos.y) <= 1)) thendoTargetCombatHealth(getNpcCid(), target, COMBAT_LIFEDRAIN, -200, -300, CONST_ME_BLOCKHIT)lastAttack = os.clock()endend Vamos estuda-lo e aprender juntos!!! function onCreatureAppear(cid)if(cid == getNpcCid()) then--Wake up callorigPos = getNpcPos()--origLook = getCreatureDir(cid)endend Quando a criatura aparece ele chama a função getNpcCid que checa o player que o npc está focado. Ai a variavel origPos vira a coordenada que ele está no momento function onCreatureDisappear(cid)if(target == cid) thengoToOrigPos()endend Quando o player sai da tela, ele verifica se o target (player que ele está focado também!?) é um player Se for ele volta para a posição anterior local function isSkulled(cid)local skullType = getPlayerSkullType(cid)if(skullType >= 3) thenreturn trueendreturn falseend Essa função seria a base do npc, ele segue apenas players com skull. Poderiamos mudar essa função para ele seguir apenas player druids ? Claro!!! Como é um tutorial mudar o nome da função iriamos que remodelar todo o script (enche o saco) vamos apenas mudar dentro da função local function isSkulled(cid)local vocType = getPlayerVocation(cid)if(vocType== 2) or (vocType == 6) thenreturn trueendreturn falseend Mudando só isso os druid iriam sofrer na mão desses npcs xD Da para fazer ele atacar apenas monstros ? (acho que sim) local function isSkulled(cid)local idType = isPlayer(cid)if (idType ~= 1) thenreturn trueendreturn falseend No caso se for diferente de 1 ele arrebenta de magia. Teste essas modificações. Porém a ideia base é entender as funções e não só modifica-las. Bem a função updateTarget faz ele apenas fixar a target (alvo) players com skull white ou red. Então deixe ela para outro dia. Vamos verificar a onThink function onThink()updateTarget()if(target == 0) thenreturnendlocal playerPos = getCreaturePosition(target)local myPos = getNpcPos()if(myPos.z ~= playerPos.z) thengoToOrigPos()returnendif(math.abs(myPos.x - origPos.x) > maxChaseDistance or math.abs(myPos.y - origPos.y) > maxChaseDistance) thenselfSay("I'll catch you next time.")goToOrigPos()returnendif(lastAttack == 0) thenlastAttack = os.clock()endif(os.clock() - lastAttack > followTimeout) then--To prevent bugging the npc by going to a place where he can't reachselfSay("You got me this time, but just wait.")goToOrigPos()returnendif( (math.abs(playerPos.x - myPos.x) <= 1) and (math.abs(playerPos.y - myPos.y) <= 1)) thendoTargetCombatHealth(getNpcCid(), target, COMBAT_LIFEDRAIN, -200, -300, CONST_ME_BLOCKHIT)lastAttack = os.clock()end Explicando cada if. - Primeiro ele checa se ele tem target, se não tiver recomeça o ontarget - Segundo se ele verifica se o player está no mesmo andar que ele (coordenada z) se não tiver volta pro começo - Terceiro ele verifica se o player está muito longe (distancia maxima especificada acima), caso esteja ele fala mais ou menos "te pego na proxima" e volta pro seu respawn. - Quarto Ele muda seu ultima attack para o tempo atual do servidor - Quinto Ele verifica se ja passou o "tempo de descanso dele) - Se o tiver na posição certa de ataque, ele mete o sabugo no player espacando ele. Até o player morrer ou fugir. Entederam a logica ? Não !? Tudo bem. Vai treinando... Sinceramente esse npc é o mais complexo que ja vi. Eu entendi ele, porém não tenho animo de refaze-lo xD Espero que tenham gostado do tutorial, eu usei esse ultimo npc para vocês conseguirem entender que npc é complicado E pegar outros como exemplo é normal e muito util. Porém nunca levem creditos por aquilo que não fizeram. Duvidas, ofensas, reclamações ou elogios postem sem medo. Eu disse o que quis aqui e ouvirei tudo também Terminei isso as 01 e 07 minutos (ou Seja 02 e 07 ) acabo o horario de verão tenho + 1 hora pra dormir. Bom proveito!! E esperem os proximos que virão
    1 ponto
  22. Olá abiguinhos, venho aqui mais uma vez dar uma aula para meus grandes amigos ♥. Variáveis O que são variáveis? Para o que elas servem? Como usa-las? Quais os tipos de variáveis? O que são variáveis? Vamos imaginar variáveis como um lugar onde você pode armazenar qualquer valor e mudar isso quando quiser. Isso é o conceito básico de variáveis. Mas para o que isso serve? Suponhamos que você precise pegar o level do player: getPlayerLevel(cid) várias vezes no código. E para evitar isso, você gostaria de ter uma maneira mais simples e eficaz de salvar esse level. Para isso servem as variáveis. Como usa-las? Vamos continuar o exemplo a cima. if getPlayerLevel(cid) < 65 then print("O player tem o level menor que 65") elseif getPlayerLevel(cid) == 65 then print("O Player tem level 65") elseif getPlayerLevel(cid) > 65 then print("O player tem level menor que 65") end Isso seria um código sem variáveis. Podem ver que eu usei várias vezes a função "getPlayerLevel(cid)". Vamos tentar fazer usando variáveis. local level = getPlayerLevel(cid) if level < 65 then print("O player tem o level menor que 65") elseif level == 65 then print("O Player tem level 65") elseif level > 65 then print("O player tem level maior que 65") end Viram como ficou um pouco mais simples? Ok, agora vamos entender o que eu fiz. Toda vez que você for criar uma variável, você tem que declarar o valor dela. Mas como fazer isso? Simples, faça isso: local var = value Onde var seria o nome da variável e value o valor da variável. Mas dai você me pergunta: "O que é esse local?". Já chego lá amigo, aguente um pouco xD Porem o nome das variáveis tem algumas regras: 1º - As seguintes palavras não podem ser utilizadas: and break do else elseif end false for function if in local nil not or repeat return then true until while 2º - Não se pode começar um nome com um numero. exemplo: 1variavel = valor (Mas pode conter números) 3º - Não podem conter esses símbolos: + - * / % ^ # == ~= <= >= < > = ( ) { } [ ] ; : , . .. ... Quais valores elas podem conter? (Tipos de Dados) Existem alguns "tipos" de valóres que elas podem conter: String = Texto Number = Numero Bool = True/False Function = Funções (Sim, pode conter funções) Tables = Sim, podem conter tabelas. Userdata = Ponteiros em C (Não iremos usar isso) Thread = Escopo de processamento (Não iremos usar isso também) Nil = Valor nulo, sem valor ou vazio. Mas e aquele "local", o que significa? Bom, esse local significa que a variável é local desse arquivo. Isso é um tanto quanto irrelevante em otserver, já que ele não consegue pegar variáveis de outros scripts (Só em libs, que se você declarar uma variável como local em alguma lib, ela não será lida em outros códigos). Finalizações Bom, qualquer duvida ou sugestão. Postar abaixo. E se lembrarem de algo que eu esqueci, me avisem (Estou fazendo isso as 8 da manhã e estou sem dormir, meio obvio que deixarei algo passar.
    1 ponto
  23. frerety

    Tutorial Movements

    HiHo! Como prometido, escrevi o tutorial de Movements =) Bom... demorei 5 horas pra escrever isso. Eu sei que o número de pessoas que vai ler isso com intusiasmo e interesse eh quase nulo mas se eu conseguir ajudar uma pessoa apenas já estou feliz =) Provavelmente você não vai intender tudo da primeira vez que você ler (talvez nem da segunda) pois eh muita coisa para aprender. Leia com atenção, com calma, com carinho ( =p ), analise vários scripts/movements (todos que ver na frente de preferência \o/) e o mais importante: tenha persistência Tentei facilitar ao máximo, tentei organizar mais porém se eu sintetizasse mais iria perder conteúdo =x... Se você ainda tiver alguma dúvida me mande uma pm ou poste aki mesmo =p Ficarei feliz em te ajudar a resolver seu problema. Se você não souber programar em lua ou não conhecer direito as funções do SVN(antigo CVS) dê uma olhadinha no tutorial de actions do colex primeiro. Olhar aqui antes de ter experiência com actions provavelmente não irá adiantar muita coisa =) PS .: Faço apenas um pedido, se você for postar esse tutorial em outro lugar me mande uma pm me contando onde que eu mando o tópico até com o BBC pra não precisar reformatar tudo =) Pergunta ~> Tá... Vou ler um tutorial de Movements, mais o que isso faz?!? Resposta ~> Toda vez que você movimentar alguma coisa (itens, você mesmo, outros players - enfim, todo tipo de movimento) ou criar itens em algum lugar (ex. criar firefields) poderá acontecer alguma coisa. Podemos configurar BoH, rings com movements, adicionar damage nos fields, configurar traps e muuuito mais =) Começaremos analizando o movements.xml (data/movements/) Vamos estudá-lo um pouco: Para cada event você vai usar um argumento < (...) >. Por isso vamos estudar movements divididos em seções - events. EVENTS: <movevent event="StepIn" (...) /> Usada quando o player mover para alguma coisa. Corresponde à antiga função de actions OnWalkIn Argumentos: itemid/uniqueid/actionid ~> use apenas um deles, nunca mais de um (se usar itemid não use uniqueid, se usar actionid não use itemid, etc). Quando o player andar em cima de um item com itemid/uniqueid/actionid X, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player pisa em algum item de itemid/uniqueid/actionid X Exemplo: <movevent event="StepIn" itemid="1487" script="arquivo.lua" /> <movevent event="StepOut" (...) /> Usada quando o player mover para fora (sair de cima) de um item X. Corresponde à antiga função para actions OnWalkOut Argumentos: itemid/uniqueid/actionid ~> use apenas um deles, nunca mais de um (se usar itemid não use uniqueid, se usar actionid não use itemid, etc). Quando o player mover pra fora de um item com itemid/uniqueid/actionid X, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player "sai" de cima de algum item de itemid/uniqueid/actionid X Exemplo: <movevent event="StepOut" itemid="1487" script="arquivo.lua" /> <movevent event="Equip" (...) /> Usada quando o player colocar um equipamento no corpo(pro corpo, não para a bp =p) em algum slot Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player mover um item de itemid/uniqueid/actionid X para o corpo, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde, não se preocupe =). Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player "veste" algum item de itemid/uniqueid/actionid X. slot ~> o slot (mão, pé, corpo, etc) que o item deverá ficar pra executar a ação. Pode ser: .: head ~> cabeça .: necklace ~> colar .: backpack ~> slot da backpack .: armor ~> armadura .: right-hand ~> mão direita .: left-hand ~> mão esquerda .: legs ~> calça .: feet ~> pé .: ring ~> rings (anéis) Exemplo: <movevent event="Equip" itemid="2168" slot="ring" script="arquivo.lua" /> <movevent event="deEquip" (...) /> Usada quando o player retirar um equipamento de um certo slot do corpo Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player mover um item de itemid/uniqueid/actionid X para fora do corpo, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player tira algum item de itemid/uniqueid/actionid X do corpo. slot ~> o slot (mão, pé, corpo, etc) que o item deverá ficar pra executar a ação. Pode ser: .: head ~> cabeça .: necklace ~> colar .: backpack ~> slot da backpack .: armor ~> armadura .: right-hand ~> mão direita .: left-hand ~> mão esquerda .: legs ~> calça .: feet ~> pé .: ring ~> rings (anéis) Exemplo: <movevent event="DeEquip" itemid="2168" slot="ring" script="arquivo.lua" /> <movevent event="AddItem" (...) /> Usada quando o player adicionar um item x em algum tile (mover de um tile pro outro, quando o player taca uma runa de field ofensiva em alguém) Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player "criar" um item de itemid/uniqueid/actionid X, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player adiciona/move alguma coisa pro tile. tileitem ~> pode ser 0(false - desativado) ou 1(true - ativado). Se for 0, o script é executado assim que você move/cria o item no chão. Se for 1, o script só é adicionado quando você taca outro item em cima do item de itemid/uniqueid/actionid X Exemplo: <movevent event="AddItem" tileitem="0" itemid="2424" script="script.lua" /> <movevent event="RemoveItem" (...) /> Usada quando o player remover um item x (mover de um tile pro outro, usar destroy field) Argumentos: itemid/uniqueid/actionid ~> use apenas um deles (se usar itemid não use uniqueid ou actionid). Quando o player "remover/tirar" um item de itemid/uniqueid/actionid X de um tile, executar o movement. script/function ~> use (também) apenas um deles (se usar script não usar function). Function vai ser explicado mais tarde. Script é o caminho do arquivo lua(onde ele está) a ser executado quando o player tira algum item de itemid/uniqueid/actionid X do corpo. tileitem ~> pode ser 0(false - desativado) ou 1(true - ativado). Se for 0, o script é executado assim que você move/cria o item no chão. Se for 1, o script só é adicionado quando você tira outro item de cima do item de itemid/uniqueid/actionid X Exemplo: <movevent event="RemoveItem" tileitem="0" itemid="2424" script="script.lua" /> ARQUIVOS.LUA: Nas actions o modelo básico é: Porém em movements o modelo depende do Event adicionado no xml. Cada event tem seu modelo básico... Irei explicar um por um. StepIn Seu modelo básico é: Argumentos: .: cid ~> o UID do player que andou em cima de item; .: item ~> o item que o player cid pisou. Possui: item.uid, item.itemid, item.type, item.actionid .: pos ~> a posição do item que o player cid pisou StepOut Seu modelo básico é: Argumentos: .: cid ~> o UID do player que saiu de cima de item; .: item ~> o item que o player cid saiu. Possui: item.uid, item.itemid, item.type, item.actionid .: pos ~> a posição do item que o player cid saiu Equip Seu modelo básico é: Argumentos: .: cid ~> o UID do player que "vestiu" o item; .: item ~> o item que o player cid "vestiu". Possui: item.uid, item.itemid, item.type, item.actionid .: slot ~> o lugar do corpo que o item foi colocado. Pode ser: .:. 1 ~> cabeça .:. 2 ~> colar .:. 3 ~> slot da backpack .:. 4 ~> armadura .:. 5 ~> mão direita .:. 6 ~> mão esquerda .:. 7 ~> calça .:. 8 ~> pé .:. 9 ~> anel DeEquip Seu modelo básico é: Argumentos: .: cid ~> o UID do player que tirou o item do corpo; .: item ~> o item que o player cid tirou do corpo. Possui: item.uid, item.itemid, item.type, item.actionid .: slot ~> o lugar do corpo que o item foi retirado. Pode ser: .:. 1 ~> cabeça .:. 2 ~> colar .:. 3 ~> slot da backpack .:. 4 ~> armadura .:. 5 ~> mão direita .:. 6 ~> mão esquerda .:. 7 ~> calça .:. 8 ~> pé .:. 9 ~> anel AddItem Seu modelo básico é: Argumentos: .: moveitem ~> O item que está sendo movido. Tem os seguintes atributos: moveitem.uid, moveitem.itemid, moveitem.type, moveitem.actionid. OBSERVAÇÃO: se você marcou tileitem="1" o item que está no xml não vai ser moveitem e sim tileitem. Moveitem será o item que você arrastou em cima do item que está no xml!!! (dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo .: tileitem ~> você irá usar isso apenas se marcou tileitem="1" no xml. tileitem é o item que você colocou no xml, o item que os players irão mover outros items em cima (se precisar dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo). OBSERVAÇÃO: Por mais que esteja escrito tileitem, o tileitem não precisa ser necessáriamente um tile =) pode ser qualquer item que você possa mover coisas em cima dele. .: pos ~> a posição que o o moveitem foi movido/criado. (posição depois de mover) RemoveItem Seu modelo básico é: Argumentos: .: moveitem ~> O item que está sendo movido. Tem os seguintes atributos: moveitem.uid, moveitem.itemid, moveitem.type, moveitem.actionid. OBSERVAÇÃO: se você marcou tileitem="1" o item que está no xml não vai ser moveitem e sim tileitem. Moveitem será o item que você arrastou de cima do item que está no xml!!! (dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo .: tileitem ~> você irá usar isso apenas se marcou tileitem="1" no xml. tileitem é o item que você colocou no xml, o item que os players irão mover outros items em cima (se precisar dêem outra olhada no xml do event AddItem na parte do tileitem para intenderem melhor. Se precisar olhem os exemplos mais em baixo). OBSERVAÇÃO: Por mais que esteja escrito tileitem, o tileitem não precisa ser necessáriamente um tile =) pode ser qualquer item que você possa mover coisas em cima dele. .: pos ~> a posição que o o moveitem foi removido (posição antes de mover). FUNCTIONS vs SCRIPTS: Bom... Quando eu estava explicando os xmls eu falei que você pode usar script ou function. Provavelmente você já está acostumado a usar script. script="arquivo.lua" etc etc =) Mas... pra que serve function e porque eu não uso script quando uso function?!? Em movements você tem algumas funções especiais para fazer seu trabalho "andar mais rápido". Você não precisa criar nenhum aruqivo.lua! Basta saber quais são as funções especiais e como/quando usá-las OBS: Os items que serão usados nas funções especiais precisam estar configurados em data/items/items.xml!!! 1ª função ~> onStepInField Como o próprio nome já diz ela deve ser usada com o event StepIn =p Serve para adicionar damage em fields... Você não precisa de um arquivo.lua, apenas coloque: <movevent event="StepIn" itemid="ID_DO_FIELD" function="onStepInField" /> e seu field já estará dando damage assim que alguém pisa em cima dele =p 2ª função ~> onAddField Usada com o event AddItem =p Serve para adicionar damage quando o player está em um tile e outro player taca um firefield em baixo do player. <movevent event="AddItem" tileitem="0" itemid="ID_DO_FIELD" function="onAddField" /> OBS: Aconselho sempre que você usar onStepInField (1ª função) adicionar onAddField com o mesmo id para dar um ar mais real ao server. 3ª função ~> onEquipItem Usada com o event Equip. Serve para configurar rings, amuletos, etc etc... <movevent event="Equip" itemid="ID_DO_ITEM" slot="ring" function="onEquipItem" /> OBS: é bom você colocar 2 tags, uma com o ID_DO_ITEM não usado e outra com o ID_DO_ITEM usando, gastando tempo. 4ª função ~> onDeEquipItem Usada com o event DeEquip. Serve para quando o player tirar o ekip especial cancelar os efeitos desse equipamento. <movevent event="DeEquip" itemid="ID_DO_ITEM_ATIVO" slot="ring" function="onDeEquipItem" /> OBS: ID_DO_ITEM_ATIVO é o id do item sendo usado... EXEMPLOS: Bom... depois de toooooda essa teoria vamos ao que interessa o/ exemplos =) (tem poucos - até mesmo porque existem vários exemplos na pasta scripts dos ots - mais se eu achar que precisa com o tempo vou adicionando novos exemplos) Exemplo 01 .:. Configurando Stealth Ring Exemplo 02 .:. Como usar tileitem ÚLTIMAS PALAVRAS: Difícil? Talvez =p Se você tiver chegado até aqui e intendido, o que está esperando? vá fazer seus próprios movements \o/ Se você não tiver intendido, levante do pc, dê uma andadinha básica pela casa de uns 10 minutinhos para assimilar as informações e volte para reler o/ Boa sorte =) FlW CyA!
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...