Ir para conteúdo
  • Cadastre-se

Action Aprendendo sobre funções LUA


Posts Recomendados

Olá,participo do tibiaking faz muito tempo e nunca tive vontade de aprender LUA até alguns dias atrás.

começei a estudar 2 - 4 horas,assisto videos, leio artigos do lua.org, leio tutoriais aqui do tibiaking, em outros lugarem também.

porém fico com bastante duvidas, até tenho uma amigo muito bom mesmo com os LUA e outros estilos de linguagem,porém nem toda hora ele pode me ajudar.

se alguém puder me ajudar com as duvidas que tenho ficarei muito muito grato mesmo!!

 

1 -  como posso últilizar tabelas?

vejo muitos script aqui no tibiaking que possuem tabelas mas não últilizam da função

table.insert, ou de outra função table

alguém poderia me dar exemplos explicando?

não precisa ser muito grande,só preciso saber o basico,o resto corro atrás;

 

2 - como últilizar o return true / return false

vejo bastante script usando essas funçoes, e apenas sei que essas funções

true e false são para boolean, mas quando eu sei que retorne boolean?

pode me dar um exemplo dessas duas funções?

e da função sozinha (return)

 

3 - funções or e and

eu sei um pouco dessas funções, sei seu principio teórico mas não sei aplica-los.

irei tentar aplicar logo abaixo.

 

if level <= 99 and level <= 149 or level == 151 then

  doSendTextMessage(cid, 21, "você é level menor que 100")

  doSendTextMessage(cid, 21, "você é level menor que 150")

  doSendTextMessage(cid, 21, "você é level 151,pode passar")

end

----------

 

alguém pode me explicar se isso está certo,ou se dá para deixar o code mais curto?

 

 

 

Obrigado pela ajuda!

 

 

O rei de seu proprio destino é aquele que luta pela gloria do amanhã!
Discord : ZoR#9373


 

Link para o post
Compartilhar em outros sites

Opa meu querido, que bom que se interessou pela linguagem LUA, tenho certeza que irá gostar bastante daqui pra frente ao decorrer de seu aprendizado.
Então, vamos lá! Irei tentar resumir algumas coisas para você..

2 horas atrás, ZikaLord disse:

1 -  como posso últilizar tabelas?

Bom, tabelas são meio que containers, dentro, você pode agrupar tanto variáveis, funções/métodos, valores e até mesmo outras tabelas, veja bem:
local tabela = {
aqui é o interior da tabela, que fica entre as chaves 
}
 

aqui está um script de exemplo:

local tabela = {
	
	variavel = 0
}

tabela.variavel = 5
print(tabela.variavel)

 como você pode ver, eu declarei uma tabela com uma variável dentro, inicializando com o valor 0. Após a declaração, alterei o valor dessa variável para 5 e depois imprimi este valor no console. Este é o básico de tabelas, você pode fazer um monte de coisa, também pode acessar valores soltos baseado nos índices, por exemplo :

local tabela = {5, 3, 10}
print(tabela[2])

Neste caso, imprimi o segundo índice da tabela, que é o valor 3, em lua, índices começam por 1 diferente de C++ por exemplo que começa com 0.
 

2 horas atrás, ZikaLord disse:

2 - como últilizar o return true / return false

Como você já sabe, true e false são boleanos que se auto-explica; verdadeiro ou falso. Um exemplo que irá lhe esclarecer com facilidade é uma função de validação, veja só:

function isPremium(player)
	if player:getPremiumDays() > 0 then
		return true
	end
	
	return false
end

Simplesmente se a quantidade de dias premium do jogador for maior que zero, retorna verdadeiro, senão retorna falso, assim, você pode pôr verificações em partes de seu código, dando acesso ao conteúdo após o if somente se o jogador for premium, veja:

if isPremium(player) then
	print('você é premium.')
else
	print('você não é premium, sinto muito.')
end

E return com boleanos se resume a isso. Ah, funções podem retornar outras estruturas também, como valores, strings, tabelas, outras funções, etc.. isso você vai entender mais pra frente.

2 horas atrás, ZikaLord disse:

3 - funções or e and

or e and você pode os chamar de operadores lógicos, são eles que lhe darão controle da situação durante a execução de seu código. Além deles, também existe o not, veja um exemplo, não é complicado:

if isPremium(player) and getName(player) == "Jorge" then
	print('você é premium.')
else
	print('você não é premium, sinto muito.')
end

Neste exemplo, utilizei o operador and. Agora só irá printar "você é premium" se o jogador for premium e se ele se chamar Jorge. Olha que legal, eu praticamente traduzi a condição para português hahah.

E se eu utilizar o operador or no lugar do and nessa condição? Neste caso, ele irá printar "você é premium" caso o jogador seja premium ou possua o nome Jorge, ele sendo o Jorge, não é obrigatório ser premium para validar essa informação, já que utilizamos OR.

 

Espero que tenha entendido, não deu pra explicar melhor porque já ta tarde, preciso dormir, mas se quiser ajuda com alguns conceitos, pode me chamar no Discord que eu dou uma força. Abraços amigão! Boas aulas! ?

Link para o post
Compartilhar em outros sites
1 minuto atrás, Lyu disse:

Opa meu querido, que bom que se interessou pela linguagem LUA, tenho certeza que irá gostar bastante daqui pra frente ao decorrer de seu aprendizado.
Então, vamos lá! Irei tentar resumir algumas coisas para você..

Bom, tabelas são meio que containers, dentro, você pode agrupar tanto variáveis, funções/métodos, valores e até mesmo outras tabelas, veja bem:
local tabela = {
aqui é o interior da tabela, que fica entre as chaves 
}
 

aqui está um script de exemplo:


local tabela = {
	
	variavel = 0
}

tabela.variavel = 5
print(tabela.variavel)

 como você pode ver, eu declarei uma tabela com uma variável dentro, inicializando com o valor 0. Após a declaração, alterei o valor dessa variável para 5 e depois imprimi este valor no console. Este é o básico de tabelas, você pode fazer um monte de coisa, também pode acessar valores soltos baseado nos índices, por exemplo :


local tabela = {5, 3, 10}
print(tabela[2])

Neste caso, imprimi o segundo índice da tabela, que é o valor 3, em lua, índices começam por 1 diferente de C++ por exemplo que começa com 0.
 

Como você já sabe, true e false são boleanos que se auto-explica; verdadeiro ou falso. Um exemplo que irá lhe esclarecer com facilidade é uma função de validação, veja só:


function isPremium(player)
	if player:getPremiumDays() > 0 then
		return true
	end
	
	return false
end

Simplesmente se a quantidade de dias premium do jogador for maior que zero, retorna verdadeiro, senão retorna falso, assim, você pode pôr verificações em partes de seu código, dando acesso ao conteúdo após o if somente se o jogador for premium, veja:


if isPremium(player) then
	print('você é premium.')
else
	print('você não é premium, sinto muito.')
end

E return com boleanos se resume a isso. Ah, funções podem retornar outras estruturas também, como valores, strings, tabelas, outras funções, etc.. isso você vai entender mais pra frente.

or e and você pode os chamar de operadores lógicos, são eles que lhe darão controle da situação durante a execução de seu código. Além deles, também existe o not, veja um exemplo, não é complicado:


if isPremium(player) and getName(player) == "Jorge" then
	print('você é premium.')
else
	print('você não é premium, sinto muito.')
end

Neste exemplo, utilizei o operador and. Agora só irá printar "você é premium" se o jogador for premium e se ele se chamar Jorge. Olha que legal, eu praticamente traduzi a condição para português hahah.

E se eu utilizar o operador or no lugar do and nessa condição? Neste caso, ele irá printar "você é premium" caso o jogador seja premium ou possua o nome Jorge, ele sendo o Jorge, não é obrigatório ser premium para validar essa informação, já que utilizamos OR.

 

Espero que tenha entendido, não deu pra explicar melhor porque já ta tarde, preciso dormir, mas se quiser ajuda com alguns conceitos, pode me chamar no Discord que eu dou uma força. Abraços amigão! Boas aulas! ?

 

vou estudar isso agora!!!
fiz um script com meus conhecimentos

MUITO MAS MUITO OBRIGADO MESMO <3

storage = 211100 -- storage checada 
local level = 100 -- level desejado
local item = [2545]-- coloque o id do item

function onUse(cid, item) -- função e parametros
if level == 100 or level ~= 100 then -- level que ira verificar
	doPlayerSendTextMessage(cid, "msg") -- mensagem caso não tenha o level necessario
elseif item == 2545 then -- verificando o item
	doCreatureAddHealth(cid, 1000 * 1000) -- vida adicionda
	doCreatureAddMana(cid, 1000 * 1000) -- mana adicionada
	doPlayerSendTextMessage(cid, "msg") -- se não querer que essa msg apareca apague
elseif storage == 211100 then -- checando a storage
	doPlayerSendTextMessage(cid, "msg")	-- mensagem caso tenha a storage x
	  end -- finaliza if
 return true -- retornando verdadeiro 
end -- finaliza function

 

O rei de seu proprio destino é aquele que luta pela gloria do amanhã!
Discord : ZoR#9373


 

Link para o post
Compartilhar em outros sites

Muito bem amigo, continue assim, se esforce e pratique bastante que isso é o que dar resultado no aprendizado. 
O seu script está ficando interessante, porém possui alguns probleminhas, mas é NORMAL, não se assuste.

O refiz para você estudá-lo e entender algumas coisas, enchi de descrições rsrs
 

-- variáveis locais (só são acessíveis dentro de escopos ou arquivos caso estejam soltas)
local needStorage = 211100
local needLevel = 100
local needItemId = 2545

function onUse(cid, item) -- função/evento com dois argumentos: cid = ID do jogador, item = userdata do Item

	-- esta verificação abaixo, seria útil para funcionar somente com o itemID informado na variável local ali em cima.
	if item.itemid == needItemId then -- verifica se o ID do item que está dando USE é igual ao itemId que está na variável local lá em cima.
		return false -- o script retorna falso e interrompe a execução do restante abaixo, ou seja, para por aqui mesmo. Lembre-se disso.
	end
	
	if getPlayerLevel(cid) < needLevel then -- se o level for menor que o necessário
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Você não possui level suficiente.')
		return false
	end
	
	if getPlayerStorageValue(cid, needStorage) == -1 then -- VERIFICA se o jogador possui a storage informada lá em cima na variável local, no caso, -1 é o valor padrão para storages e significa que não tem caso realmente seja igual a -1.
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Você não possui a storage necessária.')
		return false
	end
	
	-- ACIMA, você ver que há 3 condições, verifica o item se é o correto, o level e a storage.
	-- Se passar dessas 3 condições, o código abaixo será executado e validado, neste caso, executando abaixo, significa que o jogador possui todos os requisitos acima.
	
	doCreatureAddHealth(cid, 1000 * 1000) -- vida adicionda
	doCreatureAddMana(cid, 1000 * 1000) -- mana adicionada
	doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'Parabéns, você recebeu uma porrada de HP e MANA.')
	return true
end

 

Irei lhe indicar alguns editores de textos legais para lhe ajudar a organizar e entender melhor os seus códigos
Notepad++
Sublime Text 3
Atom

Utilizo os 3 e são ótimos, não é bom utilizar notepad normal porque ele não é apropriado para programação, somente texto SHAHUSAHUAS

Link para o post
Compartilhar em outros sites

@Lyu

Muito obrigado, você me deu muita ajuda mesmo, compreendi muito do que foi explicado, porém tenho algumas duvidas.

só pra ver se entendi mesmo as funçoes and or.

if isPremium(player) and getName(player) == "Jorge" then -- caso player for vip e tiver o nome de "jorge" então execute abaixo
	print('você é premium.') -- mensagem para o CONSOLE

if isPremium(player) or getName(player) == "Jorge" then -- caso player for premium ira executar abaixo; se ele não for vip e tiver o nome == jorge então vai executar
	print('você é premium.') -- mensagem para o CONSOLE

está certo? coloquei esses "textos" para melhorar meu compreendimento.

 

agora sobre o script refeito por você, gostei muito e é muito mais legal que o meu, porém não entendi em partes.

 

	if item.itemid == needItemId then -- porque item.itemid ? porque foi necessario esse (".") entre os items?
		return false
	end
	
	if getPlayerLevel(cid) < needLevel then -- se o level for menor que o necessário
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Você não possui level suficiente.')
		return false -- false retorna pois se o player tiver level abaixo, se ele tiver level 99 então ira aparecer o texto acima
	end -- eu coloquei ali oque eu acho que o "return false" ira executar, está certo?
	
	if getPlayerStorageValue(cid, needStorage) == -1 then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Você não possui a storage necessária.')
		return false -- false retorna pois se o player não tiver a storage == 211100 então ira executar a cima
	end

e percebi que você não últilizou elseifporque você não ultilizou elseif?

 

 

igual as tabelas lá encima não entendi o porque do uso desse (".") entre as variaveis.

tabela.variavel = 5
print(tabela.variavel)

OBRIGADO MAIS UMA VEZ CARA <3

Editado por ZikaLord (veja o histórico de edições)
O rei de seu proprio destino é aquele que luta pela gloria do amanhã!
Discord : ZoR#9373


 

Link para o post
Compartilhar em outros sites
5 horas atrás, ZikaLord disse:

if isPremium(player) and getName(player) == "Jorge" then -- caso player for vip e tiver o nome de "jorge" então execute abaixo
	print('você é premium.') -- mensagem para o CONSOLE

if isPremium(player) or getName(player) == "Jorge" then -- caso player for premium ira executar abaixo; se ele não for vip e tiver o nome == jorge então vai executar
	print('você é premium.') -- mensagem para o CONSOLE

está certo? coloquei esses "textos" para melhorar meu compreendimento.

Está certo sim, você só esqueceu de fechar o escopo com um end. Sempre que você declarar um if, terá que fechá-lo em algum momento, escopo é o espaço que fica entre o if e o end.

 

5 horas atrás, ZikaLord disse:

if item.itemid == needItemId then -- porque item.itemid ? porque foi necessario esse (".") entre os items? return false end

o ponto foi necessário para acessar a variável itemid que fica dentro de item, no caso, o argumento item não é um inteiro(número), é tipo uma tabela.

 

5 horas atrás, ZikaLord disse:

e percebi que você não últilizou elseifporque você não ultilizou elseif?

Neste caso, não é necessário utilizar elseif a ponto de manter as 3 verificações independentes, digamos que, separadinhas facilitando a leitura. Mas dependendo, dar pra utilizar elseif sim.

 

5 horas atrás, ZikaLord disse:

igual as tabelas lá encima não entendi o porque do uso desse (".") entre as variaveis.

o ponto é para você acessar variáveis dentro de uma tabela, porque se usar somente variavel = 5, estará declarando uma variável global e não terá relação alguma com a variável que está dentro da tabela.

Link para o post
Compartilhar em outros sites

sobre o if eu que não fechei mesmo,era só pra ver se estava certo,mas obrigado por lembrar.

 

eu tentei fazer um script com tabela mas não sei se foi muito certo

 

item = 3124
itemtable = {
	[1] = { -- index 1 //  não mudar

	health = 50,
	stamina = 100,
	forca = 10,
},
	[2] = { -- index 2 // não mudar

	health = 100, -- pode ser alterado
	stamina = 200, -- pode ser alterado
	forca = 20 -- pode ser alterado

	}

}

function OnUse(cid, item)
	if getPlayerLevel(cid) == 100 then
		setCreatureMaxHealth(cid, itemtable[1].health)
		setCreatureMaxMana(cid, itemtable[1].stamina)
		setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, itemtable[1].forca) -- mude SWORD para uma dessas = AXE,CLUB,DISTANCE,FIST,SHIELD
	else
		doPlayerSendMessage(cid, 21, "Você não tem level 100 para usar esse item") -- mensagem que ira retornar caso não tenha level
	end

	if getPlayerLevel(cid) == 200 then
		setCreatureMaxHealth(cid, itemtable[2].health)
		setCreatureMaxMana(cid, itemtable[2].stamina)
		setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, itemtable[2].forca) -- não troque CONDITION_PARAM_SKILL // apenas oque foi dito a cima!!!!!
	else
		doPlayerSendMessage(cid, 21, "Você não tem level 200 para usar esse item") -- mensagem que ira retornar caso não tenha level
	end
	---------------- mensagem carinhosa para o retardado que queira usar isso depois do level necessario ----------------------------

	if getPlayerLevel(cid) == 101 then
	   doPlayerSendMessage(cid, 21, "TROUXA NÃO VOU DEIXAR VOCÊ QUERER USAR NO LEVEL 101")

	elseif getPlayerLevel(cid) == 201 then
	   doPlayerSendMessage(cid, 21, "TROUXA NÃO VOU DEIXAR VOCÊ QUERER USAR NO LEVEL 201")
	end

	-------------- apenas para checar se não foi outro item que deu essas skills em um possivel bug ----------------------------

	if item ~= 3214 then
		print("checar item 3214")
		end
	return true 
end

@Lyu

Editado por ZikaLord (veja o histórico de edições)
O rei de seu proprio destino é aquele que luta pela gloria do amanhã!
Discord : ZoR#9373


 

Link para o post
Compartilhar em outros sites
  • 4 weeks later...

Alguém sabe se existe um tutorial que ensinar a usar funções do LUA do zero?? porque eu não sei muita como como cid, setConditionParam() e outras funções

eu só sei que cid referece ao player/jogador mais não entendi o real sentido de usar cid

Link para o post
Compartilhar em outros sites
1 hora atrás, hallanehallex disse:

Alguém sabe se existe um tutorial que ensinar a usar funções do LUA do zero?? porque eu não sei muita como como cid, setConditionParam() e outras funções

eu só sei que cid referece ao player/jogador mais não entendi o real sentido de usar cid

 

Primeiro aprende a LUA mesmo, depois aplique as funçoes de tibia.

O rei de seu proprio destino é aquele que luta pela gloria do amanhã!
Discord : ZoR#9373


 

Link para o post
Compartilhar em outros sites
6 horas atrás, hallanehallex disse:

Alguém sabe se existe um tutorial que ensinar a usar funções do LUA do zero?? porque eu não sei muita como como cid, setConditionParam() e outras funções

eu só sei que cid referece ao player/jogador mais não entendi o real sentido de usar cid

 

Vou tentar explicar essa parte do CID de uma forma mais prática, demonstrando diferenças entre C e C++ e você pode tirar suas conclusões.

 

Considere o pedaço de código abaixo, escrito na linguagem C (usaremos short em vez de bool, porque é C)

struct Player {
  	int id;
	short isPremmium;
};

Nesse caso temos um tipo de dado Player, com um id e uma flag indicando se o jogador possui premmium.

Vamos agora declarar uma variável de tipo player:

struct Player jogador;
jogador.id = 0;
jogador.isPremmium = 0;

Agora, uma função que verificaria se esse jogador possui premmium ou não, ficaria mais ou menos assim:

short isPremmium(struct Player jogador) {
	return jogador.isPremmium;
}

Por que o jogador foi passado como parâmetro? Oras, porque a função precisa dele para ter o acesso, variáveis globais não são uma boa prática!

 

 

Agora, vamos levar para um caso que não precisaria, na linguagem C++

Considere o código abaixo, correspondente ao anterior:

class Player {
private:
  int id;
  bool isPremmium;  
public:
  Player(int id, bool isPremmy);
  bool isPremmium() {
	return this->isPremmium;
  }
};

Nesse caso, para criar um jogador e verificar se ele tem premmium, teriamos o seguinte pedaço de código:

// Criando jogador de id=0 e não tem premmy
Player* player = new Player(0, false);

if (player->isPremmy()) {
	// Código
}

Note que, apesar de isPremmy não ter parâmetro, ainda temos a referência do objeto player criado na linha 2, anterior ao "isPremmy".

 

De uma forma ou outra, você precisa especificar qual é o jogador em questão, isso vem das próprias linguagens de programação!

Caso não tenha entendido muito bem algumas expressões utilizadas, recomendo dar uma estudada no básico de algumas linguagens como C/C++/LUA e ver outras partes teóricas como Programação Orientada a Objetos (é um conceito bem fácil de ser compreendido, depois que você entendeu o básico).

Editado por marcot (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.


  • Conteúdo Similar

    • Por Imperius
      Olá, pessoal! Acabei encontrando um script que tinha feito a um tempo atrás. Estou compartilhando aqui para quem quiser usar ou melhorar.
       
      É bem parecido com os outros sistemas de roleta, igual deste tópico: https://tibiaking.com/forums/topic/101557-action-cassino-roleta-de-items/
       
      Como funciona?
       
      O "Treasure Chest" é um item custom, onde o jogador têm a possibilidade de ganhar itens raros ou bem meia boca. Tudo dependerá da sorte.
       
      O jogador precisa tacar o treasure chest na bancada e acionar a alavanca. O treasure chest irá se transformar em vários itens de forma randômica no qual o jogador poderá ou não ganhar. No final, apenas um item é entregue ao jogador.
       
      Para entender melhor o seu funcionamento, segue o GIF abaixo:
       

       
       
      em data > actions > actions.xml
       
       
      em data > actions > scripts > crie um arquivo chamado leverTreasureChest.lua
       
       
      no banco de dados do servidor, adicione o seguinte código em "SQL":
       
       
       

      Também estou disponibilizando uma página PHP, para quem quiser usar no site do servidor. Na página tem informações sobre o funcionamento, quais são os possíveis prêmios e a lista de jogadores que ganharam os itens raros.
       

       
       
      Espero ter ajudado de alguma forma! : )
       
      treasure_chest.php
    • Por amoxicilina
      Action: Remover skull
       
       
    • Por Skyligh
      Olá pessoal, venho hoje aqui para postar um sistema de pokemon muito procurado, o famoso, Tm System. Siga o tutorial a risca ou seu trabalho será invão.
      Quote
      Seu Funcionameto: Basícamente funciona assim; ele adiciona um "Attack" novo a um pokemon ou substitui um existente, dependendo da vontado do player.
      Versões testadas: Qualquer derivado do PDA
      http://www.havencrest.co.uk/images/page-divider 2.jpg
      Vamos ao que interessa, vá em actions.xml e cole a seguinte tag:
        <action itemid="id do item que será usado" event="script" value="tmSystem.lua"/> Atenção o item que será usado no system, não deve ter o attributo "Usable" ou você terá erros. Agora crie um arquivo em {data/actions/scripts} chamado tmSystem.lua e cole o seguinte script dentro:
        function onUse(cid, item, frompos, item2, topos) local tm = tmabilities local pokemon = getCreatureSummons(cid)[1] local slotball = getPlayerSlotItem(cid, 8).uid local tmname = getItemNameById(item2.itemid) local i = item2.itemid if #getCreatureSummons(cid) == 0 then return doPlayerSendCancel(cid, "Need pokemon to learn a "..tmname..".") end if getItemAttribute(slotball, "TM") == tmname then return doPlayerSendCancel(cid, "Your pokemon was learned this TM.") end if isInArray(tm[""..tmname..""], getPokemonName(pokemon)) then doPlayerSetVocation(cid, 49) openChannelDialog(cid) else doPlayerSendCancel(cid, "This TM not compatible in your pokemon.") end return true end http://www.havencrest.co.uk/images/page-divider 2.jpg Agora vamos em {creaturescripts.xml} e colaremos a seguinte tag:
        <event type="joinchannel" name="TmChoose" event="script" value="tmsys.lua"/> Agora crie o arquivo tmsys.lua em {creaturescripts/scripts} e cole isso dentro:
        [CODE] function onJoinChannel(cid, channelId, users, isTv) if getPlayerVocation(cid) == 49 then else return true end local summon = getCreatureSummons(cid)[1] local moves = movestable[getCreatureName(summon)] local n = 1 for a = 1, 12 do local b = getNewMoveTable(moves, a) if b then n = n + 1 end end for b = 13, 23 do if channelId == b then local tm = tmabilities local pokemon = getCreatureSummons(cid)[1] local slotball = getPlayerSlotItem(cid, 8).uid local slotm = getPlayerSlotItem(cid, 9) local tmname = getItemNameById(slotm.itemid) if n >= channelId - 11 then doPlayerSendTextMessage(cid, 27, "Congralutions! Your "..getPokemonName(pokemon).." learn a new TM ("..tmname..").") doItemSetAttribute(slotball, "TM", tmname) doItemSetAttribute(slotball, "TMN", channelId - 11) doSendMagicEffect(getThingPosition(pokemon), 28) doSendMagicEffect(getThingPosition(pokemon), 29) doRemoveItem(slotm.uid) if useKpdoDlls then doUpdateMoves(cid) end else doPlayerSendCancel(cid, "Put tm on at last empty slot.") end return false end end return true end http://www.havencrest.co.uk/images/page-divider 2.jpgNesta parte você precisa de muita atenção, você terá que criar 10 channels como no modelo abaixo:
        <channel id="13" name="[Put on M1]"> <vocation id="49"/> </channel>   <channel id="14" name="[Put on M2]"> <vocation id="49"/> </channel> Em channel id você seguira a ordem 13 a 23, em vocations id pode deixar do jeito que esta. Agora crie uma vocation com o id 49 ou cole a seguinte tag no vocations.xml:
        <vocation id="49" name="TM" description="pokemon trainer" needpremium="0" gaincap="0" gainhp="55" gainmana="0" gainhpticks="0" gainhpamount="0" gainmanaticks="0" gainmanaamount="0" manamultiplier="1.1" attackspeed="-1" soulmax="251" gainsoulticks="-1" fromvoc="1" lessloss="0"> <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> <skill fist="2" club="2" sword="2" axe="2" distance="2" shielding="2" fishing="2" experience="1.1"/> </vocation> Imagem Postada http://www.havencrest.co.uk/images/page-divider 2.jpgAgora vamos em {data/lib} e crie um arquivo chamado tmSystem.lua e cole as seguintes linhas nele:
        tmabilities = { ["Solar Beam"] = {"Blastoise", "Venusaur", "Charizard"}, ["Fire Blast"] = {"Blastoise", "Venusaur", "Charizard"}, } Nesta parte você edita, para cada magia[""] = nome dos pokemons que poderam ter essa magia por tm. Tipo do jeito que esta ai, se você for tentar colocar um fire blast em um bulba não vai pegar.. Para adicionar mais magias, basta copiar a linha e colocar o nome da magia nova e seus respectivos pokemons. http://www.havencrest.co.uk/images/page-divider 2.jpg Preste atenção, para cada magia feita, terá que haver um item com o nome da magia. E o id deste item deve ser colocado na tag da actions. ou seja(exemplo): abra o item.xml pegue o item que deseje usar e coloque o nome "Solar Beam"(do mesmo jeito da lib), pegue o id dele e cole na tag da actions. Espero que tenham intendido está parte. http://www.havencrest.co.uk/images/page-divider 2.jpg A ultima parte da instalção, vamos em {data/talkactions/scripts} e abra o arquivo move1.lua e substitua a parte de "if it = 1" até o ultimo "end" antes da parte "if not move then":
        local msgs = {"use ", ""} function doAlertReady(cid, id, movename, n, cd) if not isCreature(cid) then return true end local myball = getPlayerSlotItem(cid, 8) if myball.itemid > 0 and getItemAttribute(myball.uid, cd) == "cd:"..id.."" then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, getPokeballName(myball.uid).." - "..movename.." (m"..n..") is ready!") return true end local p = getPokeballsInContainer(getPlayerSlotItem(cid, 3).uid) if not p or #p <= 0 then return true end for a = 1, #p do if getItemAttribute(p[a], cd) == "cd:"..id.."" then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, getPokeballName(p[a]).." - "..movename.." (m"..n..") is ready!") return true end end end function onSay(cid, words, param, channel) if param ~= "" then return true end if string.len(words) > 3 then return true end if #getCreatureSummons(cid) == 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need a pokemon to use moves.") return 0 end --alterado v1.5 local mypoke = getCreatureSummons(cid)[1] if getCreatureCondition(cid, CONDITION_EXHAUST) then return true end if getCreatureName(mypoke) == "Evolution" then return true end if getCreatureName(mypoke) == "Ditto" or getCreatureName(mypoke) == "Shiny Ditto" then name = getPlayerStorageValue(mypoke, 1010) --edited else name = getCreatureName(mypoke) end --local name = getCreatureName(mypoke) == "Ditto" and getPlayerStorageValue(mypoke, 1010) or getCreatureName(mypoke) local it = string.sub(words, 2, 3) local move = movestable[name].move1 local cdzin = "move"..it.."" local slotball = getPlayerSlotItem(cid, 8).uid local tmname = getItemAttribute(slotball, "TM") if it == "2" then if getItemAttribute(slotball, "TMN") == 2 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move2 end elseif it == "3" then if getItemAttribute(slotball, "TMN") == 3 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move3 end elseif it == "4" then if getItemAttribute(slotball, "TMN") == 4 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move4 end elseif it == "5" then if getItemAttribute(slotball, "TMN") == 5 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move5 end elseif it == "6" then if getItemAttribute(slotball, "TMN") == 6 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move6 end elseif it == "7" then if getItemAttribute(slotball, "TMN") == 7 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move7 end elseif it == "8" then if getItemAttribute(slotball, "TMN") == 8 then move = {name = ""..tmname.."", level = 0, cd =15, dist = 0, target = 0} else move = movestable[name].move8 end elseif it == "9" then if getItemAttribute(slotball, "TMN") == 9 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move9 end elseif it == "10" then if getItemAttribute(slotball, "TMN") == 10 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move10 end elseif it == "11" then if getItemAttribute(slotball, "TMN") == 11 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move11 end elseif it == "12" then if getItemAttribute(slotball, "TMN") == 12 then move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0} else move = movestable[name].move12 end end if not move then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return true end if getPlayerLevel(cid) < move.level then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need be atleast level "..move.level.." to use this move.") return true end if getCD(getPlayerSlotItem(cid, 8).uid, cdzin) > 0 and getCD(getPlayerSlotItem(cid, 8).uid, cdzin) < (move.cd + 2) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have to wait "..getCD(getPlayerSlotItem(cid, 8).uid, cdzin).." seconds to use "..move.name.." again.") return true end if getTileInfo(getThingPos(mypoke)).protection then doPlayerSendCancel(cid, "Your pokemon cannot use moves while in protection zone.") return true end if getPlayerStorageValue(mypoke, 3894) >= 1 then return doPlayerSendCancel(cid, "You can't attack because you is with fear") --alterado v1.3 end --alterado v1.6 if (move.name == "Team Slice" or move.name == "Team Claw") and #getCreatureSummons(cid) < 2 then doPlayerSendCancel(cid, "Your pokemon need be in a team for use this move!") return true end --alterado v1.6 if isCreature(getCreatureTarget(cid)) and isInArray(specialabilities["evasion"], getCreatureName(getCreatureTarget(cid))) and math.random(1, 100) <= 10 then local target = getCreatureTarget(cid) if isCreature(getMasterTarget(target)) then --alterado v1.6 doSendMagicEffect(getThingPos(target), 211) doSendAnimatedText(getThingPos(target), "TOO BAD", 215) doTeleportThing(target, getClosestFreeTile(target, getThingPos(mypoke)), false) doSendMagicEffect(getThingPos(target), 211) doFaceCreature(target, getThingPos(mypoke)) return true --alterado v1.6 end end if move.target == 1 then if not isCreature(getCreatureTarget(cid)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don\'t have any targets.") return 0 end if getCreatureCondition(getCreatureTarget(cid), CONDITION_INVISIBLE) then return 0 end if getCreatureHealth(getCreatureTarget(cid)) <= 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your have already defeated your target.") return 0 end if not isCreature(getCreatureSummons(cid)[1]) then return true end if getDistanceBetween(getThingPos(getCreatureSummons(cid)[1]), getThingPos(getCreatureTarget(cid))) > move.dist then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Get closer to the target to use this move.") return 0 end if not isSightClear(getThingPos(getCreatureSummons(cid)[1]), getThingPos(getCreatureTarget(cid)), false) then return 0 end end local newid = 0 if isSleeping(mypoke) or isSilence(mypoke) then --alterado v1.5 doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry you can't do that right now.") return 0 else newid = setCD(getPlayerSlotItem(cid, 8).uid, cdzin, move.cd) end doCreatureSay(cid, ""..getPokeName(mypoke)..", "..msgs[math.random(#msgs)]..""..move.name.."!", TALKTYPE_SAY) local summons = getCreatureSummons(cid) --alterado v1.6 addEvent(doAlertReady, move.cd * 1000, cid, newid, move.name, it, cdzin) for i = 2, #summons do if isCreature(summons[i]) and getPlayerStorageValue(cid, 637501) >= 1 then docastspell(summons[i], move.name) --alterado v1.6 end end docastspell(mypoke, move.name) doCreatureAddCondition(cid, playerexhaust) if useKpdoDlls then doUpdateCooldowns(cid) end return 0 end Até que enfim.. Se fizeram tudo certo o sistema vai funcionar se não.... Caso não itendam alguma parte da explicação podem me perguntar por aqui...
      Creditos
      Smix
    • Por tataboy67
      Dungeon System v1.1

      A pedido de um usuário em meu Discord, resolvi ajuda-lo e desenvolver um sistema totalmente interativo e de qualidade aqui para vocês.
      Bom, o sistema se baseia em uma ActionID que ao clicar, podemos ai entrar em uma dungeon, tendo tempo para finaliza-la e até um cooldown, caso queira entrar novamente.

      Imagens do sistema:
       

      Vamos ao Código:

      Em actions, crie um arquivo com o nome de: Dungeon Actions.lua
       
      Em creaturescripts, crie um arquivo com o nome de: Dungeon Creaturescript.lua
       
      Ainda em creaturescripts, crie outro arquivo com o nome de: Type Dungeon Creaturescript.lua
       
       Na LIB, crie um arquivo com o nome de Dungeon System Lib.lua, e adicione:
       
      Em creaturescripts.xml, adicione:
       
       
      Em actions.xml, adicione:
       Em libs.lua, adicione:
      dofile('data/lib/Dungeon System Lib.lua')  
      v1.1 (Nova atualização, agora pode spawnar mobs dentro da DG, e ao sair, eles são removidos)

      (CREDITOS TOTAIS A MIM: @tataboy67)

      Essa é a primeira versão. Ainda pretendo colocar para nascer mobs, remover mobs ao entrar, etc etc...
       
    • Por tataboy67
      Opa boa noite rapaziada, tudo bom?
       
      Eu estou treinando um pouco scripts e acabei que tendo a ideia de fazer algo relacionado com as Guilds.
      Então resolvi trazer 1 sistema de Guild Dungeon Lever para mim treinar  

      Estou em fase de treinamento, então por favor, deem dicas e criticas ao sistema ! Obrigado ...

      Como o sistema funciona?

      Terá uma alavanca com local para os jogadores de sua Guild ficarem... O jogador que estiver na posição principal e próxima a alavanca irá clicar na alavanca que fará com que todos entrem na Dungeon. Os jogadores terão um tempo "x" para terminar, porém se o tempo acabar, o jogador será teleportado de volta para a posição principal da alavanca (Aonde o jogador clicou).



      Como configurar o script?
      local config = { time = 10, -- 1 Second. (1*60 To Minutes) level = 100, -- Level Necessary. dungeonPos = Position(1454, 909, 7), -- Dungeon Pos. needPos = { [1] = Position(1447, 915, 7), -- Position (where the player will click on the lever) and back position. [2] = Position(1449, 914, 7) }, fromPos = {x = 1449, y = 904, z = 7}, -- Position /\ < from the dungeon toPos = {x = 1456, y = 911, z = 7}, -- Position \/ > from the dungeon Storagetime = 39320, -- Storage Time. StorageDay = 39321, -- Storage Day. Timer = 24*60*60 -- To re-enter in the dungeon. (24hours) } time ------------------ Tempo que os jogadores ficarão dentro da Dungeon.
      level ----------------- Nível que todos precisam ser para entrar.
      dungeonPos ------ Posição que todos os jogadores serão teleportados.
      needPos ------------ Posição que os jogadores devem estar para serem teleportados.
      fromPos ------------- Posição SUPERIOR ESQUERDO da sala.
      toPos ----------------- Posição INFERIOR DIREITO da sala.
      Storagetime -------- Não mexer se não souber.
      StorageDay ----------- Não mexer se não souber.
      Timer ------------------ Tempo que o jogador terá que esperar para entrar novamente na Dungeon.
       
       

      Sem mais delongas, vamos ao script:
      Adicione a linha em:
      (data/actions/actions.xml)
      <!-- Script GUILD --> <action actionid="29305" script="Dungeon_Guild.lua" />  
      Adicione a linha em:
      (data/actions/scripts/Dungeon_Guild.lua)
      local config = { time = 5, -- 1 Second. (1*60 To Minutes) inside the dungeon. level = 100, -- Level Necessary. dungeonPos = Position(1454, 909, 7), -- Dungeon Pos. needPos = { [1] = Position(1447, 915, 7), -- Position (where the player will click on the lever) and back position. [2] = Position(1449, 914, 7) }, fromPos = {x = 1449, y = 904, z = 7}, -- Position /\ < from the dungeon toPos = {x = 1456, y = 911, z = 7}, -- Position \/ > from the dungeon Storagetime = 39320, -- Storage Time. StorageDay = 39321, -- Storage Day. Timer = 24*60*60 -- To re-enter in the dungeon. (24hrs) } function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) local guild = player:getGuild() for i = 1, #config.needPos do local playerTile = Tile(config.needPos[i]):getTopCreature() if not playerTile or not playerTile:isPlayer() then player:getPosition():sendMagicEffect(CONST_ME_POFF) player:sendTextMessage(MESSAGE_STATUS_DEFAULT, "You need 2 players and stay on the orange floor.") return true end if not playerTile:getGuild() and not player:getGuild() then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "One of the members does not have guild.") end if playerTile:getLevel() < config.level then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "All the players need to be level "..config.level.." or higher.") end if player:getGuild():getId() ~= playerTile:getGuild():getId() then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "Only players in your guild can join you.") end if player:getStorageValue(config.Storagetime) - os.time() > 0 and playerTile:getStorageValue(config.Storagetime) - os.time() > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end if player:getStorageValue(config.StorageDay) - os.time() > 0 and playerTile:getStorageValue(config.StorageDay) - os.time() > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("You're in cooldown to enter in a dungeon again. Cooldown: %s.", string.diff(player:getStorageValue(config.StorageDay)-os.time()))) return false end local players = {} for x = config.fromPos.x, config.toPos.x do for y = config.fromPos.y, config.toPos.y do for z = config.fromPos.z, config.toPos.z do local tile = Tile(x, y, z) local creature = tile:getTopCreature() if creature and creature:isPlayer() then players[#players+1] = creature end end end end if #players > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "Already has a guild inside.") end player:teleportTo(config.dungeonPos) playerTile:teleportTo(config.dungeonPos) playerTile:getPosition():sendMagicEffect(50) addEvent(function() player:teleportTo(config.needPos[i]) playerTile:teleportTo(config.needPos[i]) player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) playerTile:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) player:setStorageValue(config.StorageDay, os.time() + config.Timer) playerTile:setStorageValue(config.StorageDay, os.time() + config.Timer) end, config.time*1000) return false end return true end
      Créditos:
      @KotZletY
      E eu  

      Espero que gostem ? ...

      Edit* Adicionado Tempo para que você possa entrar novamente na Dungeon:


      Rep+
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo