Ir para conteúdo

Projeto Tutores de Scripting


Killua

Posts Recomendados

Entendi tua ideia, da para fazer sim, mas nao aconselho onThink, usa o onStartup()

Porem, podem ser varios tiles né, então se for usar storage, lembre-se que storages tem apenas 255 caracteres disponiveis, dependendo da quantidade de tiles alterados, pode dar problema na hora de salvar

Leitura no hd é um pouco mais lento que database, mas te daria um controle melhor, pode-se usar uma estrutura binaria para executar esse save, algo assim:

[2] -- dois bytes(uint16): player id

[2] -- dois bytes(uint16): que salvaria o numero de tiles modificados

 

[2] -- dois bytes(uint16): posição x

[2] -- dois bytes(uint16): posição y

[2] -- dois bytes(uint16): posição z

[1] -- um byte(uint8): stackpos

[2] -- dois bytes(uint16): itemid ao qual será transformado

 

Ou seja, para cada tile alterado, tu usaria 11 bytes + os 2 do player_id + 2 do numero de tiles [ 2 + 2 + 11 * numero de tiles alterados ]

 

a leitura faria algo assim:

local customTileHouse = {}
 
local player_id = file:getU16
local number_of_tiles = file:getU16
 
customTileHouse[player_id] = {}
local tiles = customTileHouse[player_id]
local insert = table.insert
 
for tile = 1, number_of_tiles do
   local x = file:getU16
   local y = file:getU16
   local z = file:getU16
   local stackPos = file:getU8
   local itemTransform = file:getU16
   insert(tiles, { pos = {x = x, y = y, z = z, stackPos = stackPos}, itemTransform = itemTransform})
end

Obs.: sei que não tem os metodos getU16 e etc em lua, mas ja fiz algo semelhante nesse script: http://www.xtibia.com/forum/topic/186169-spr-extractor/?hl=%2Bspr+%2Bextractor

A lib so carrega o que esta escrito nos arquivos, ela nao faz save da memoria dinamica

Teria que escrever em algum arquivo de la para ser lido no startup

 

 

Tá certo dalvo =S

 

Mas o Omega me deu uma outra idéia: Criar uma tabela na db com as colunas x, y, z e tile_id daí usa o startup para ler ela e transformar o tile

Boa tarde,

Ambas as ideias são otimas! Mas acho que ficarei com a do Omega/Killua. Me parece mais facil e de mais rapida execução.

Porem adorei a ideia do Dalvorsn tambem.

Obrigado aos dois por exporem as suas ideias e REP + para ambos.

Muito boa a ideia de criação desse topico, a interetividade de diversos modos de pensamentos está muito boa!

Grande abraço a todos e obrigado pela ajuda ;]

Link para o comentário
Compartilhar em outros sites

Galera poderiam min dizer uma função para alterar o peso de um item e qual função utilizo para verificar o peso de um item?

Lembrando que a função de "setar" peso no item deve ser através do cid do item.

Ex: Player da use em um item, então altera o peso desse item que foi usado.

 

 

Outra coisa: já que esse post é para ensinar/ajudar a criar um script, por que vocês, pessoas que sabem, num fazem um tutorial de como criar scripts em MODs, pois é bem mais vantajoso criar em MOD, quando se utiliza vários scripts. Poderia ser um tutorial/MOD base explicando os comandos de cada área (Actions, Talkactions, Creaturescripts, Globalevents, Movements).

 

Exemplo:

ComandoX -- Utilizado para actions
      Comandos à serem executados
FimComandoX

ComandoY -- Utilizado para talkactions
      Comandos à serem executados
FimComandoX

ComandoZ -- Utilizado para creaturescripts
      Comandos à serem executados
FimComandoZ
Editado por Mazynho
Link para o comentário
Compartilhar em outros sites

 

Eu to criando uma script so que eu queria sabe umas coisa

 

Como faço para usa a posição do player como base e teleporta ele ah digamos 5 sqm a frente ou pros lados e talz.

Tipo: ele ta na posição x=1000 y=1000 z=7 ai ele ativa a script vai para umas das posições radomicas ex:x=1005 y=1005 y=7.

e também como checar se a posição para onde ele sera teleportado e andavel.Caso não ele use a outra posição.

 

Qaundo tava escrevendo isso eu acabei pensando se assim funciona(e uma gambiara que eu fiz)

function onUse(cid, item, frompos, item2, topos)
     pos = getCreaturePosition(cid)
     location = {
     {x=(pos.x)+1, y=(pos.y)+1, z=pos.z},
     {x=(pos.x)+2, y=(pos.y)+2, z=pos.z},
     {x=(pos.x)+3, y=(pos.y)+3, z=pos.z}
}
 
          doTeleportThing(cid, location[math.random(#location)])
     return true
end

 

Assim funciona sim, RigBy.

Para vc checar se o tile está livre, existem duas funções: isWalkable(pos), criada pelo Nord e getClosestFreeTile(cid,targetpos[,extended=false[,ignoreHouse=true]]) que já vem no TFS.

A primeira simplesmente checa se tile escolhido é "andável" e a segunda pode ser usada dentro do doTeleportThing, pois ela procura o tile livre mais próximo dos que vc escolheu.

 

No teu acho acho melhor usar a isWalkable, pq com ela vc pode definir um segundo tile com else caso o primeiro esteja ocupado...

function isWalkable(pos)-- by Nord / editado por Omega
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then
        return false
    elseif getTopCreature(pos).uid > 0 then
        return false
    elseif isCreature(getTopCreature(pos).uid) then
        return false
    elseif getTileInfo(pos).protection then
        return false
    elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
        return false
    end
    return true
end
Link para o comentário
Compartilhar em outros sites

 

Galera poderiam min dizer uma função para alterar o peso de um item e qual função utilizo para verificar o peso de um item?

 

Lembrando que a função de "setar" peso no item deve ser através do cid do item.

 

Ex: Player da use em um item, então altera o peso desse item que foi usado.

 

 

Outra coisa: já que esse post é para ensinar/ajudar a criar um script, por que vocês, pessoas que sabem, num fazem um tutorial de como criar scripts em MODs, pois é bem mais vantajoso criar em MOD, quando se utiliza vários scripts. Poderia ser um tutorial/MOD base explicando os comandos de cada área (Actions, Talkactions, Creaturescripts, Globalevents, Movements).

 

Exemplo:

ComandoX -- Utilizado para actions
      Comandos à serem executados
FimComandoX

ComandoY -- Utilizado para talkactions
      Comandos à serem executados
FimComandoX

ComandoZ -- Utilizado para creaturescripts
      Comandos à serem executados
FimComandoZ

Peso é um atributo, para atributos se usam as funções:

 

doItemSetAttribute(uid, key, value)
getItemAttribute(uid, key)

A key é "weight"

 

Quanto a sua sugestão, eu discordo completamente, um tutorial generalizado ficaria enorme, alem de trabalhoso para se fazer ainda teria pouca aceitação, é melhor duvidas pois você sabe que o que está explicando é do interesse do usuario

De mais a mais, tem diversos topicos espalhados com tutorial, scripts pronto(da pra aprender vendo como sao feitos) e etc

Link para o comentário
Compartilhar em outros sites

Dalvorsn, tem como me ajudar aqui ?

 

o script está funcionando mas quero ponhar uma segunda area mas não estou conseguindo também queria que ele fizesse uma condition que seria CONDITION_PARALYZE pode me dizer como faço ?

 

aqui o scritp:

 

local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, 41)

local glacier = {
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{1, 0, 2, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0}
}

local area = createCombatArea(glacier)
setCombatArea(combat1, area)

function onGetFormulaValues()
return -200, -200, -200, -200
end

setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

local chance = 10

function onStatsChange(cid, attacker, type, combat, value)

if value >= 5 and type == 1 then
if getPlayerSlotItem(cid, CONST_SLOT_ARMOR).itemid == 7897 then
local random = math.random(100)
if random >= chance then
doCombat( cid, combat1, numberToVariant(cid) )
return TRUE
end
end
end
return TRUE
end

 

tentei como ali colocando outro nome e mudando os 1 para 0 e os 0 para 1 mais não deu certo apenas 1 aparece...

Editado por vagnho
Link para o comentário
Compartilhar em outros sites

Boa tarde,
Olá pessoal, tenho mais uma duvida e gostaria da ajuda de vocês:
A um tempo atrás eu resolvi fazer um servidor BEM diferente, muito voltado para o RPG. Com isso eu pensei no seguinte sistema:
Eu tenho Light Healing que heala em media 20. Ao usar certo item, eu ganho Light Healing tier 2 que heala 30.
A ideia é simples, spells com tiers. Fazer o sistema é muito simples tambem, e já está feito. O unico problema que encontrei é: Ter 2 ou mais magias registradas com a mesma spell word.
No script eu fiz para que: Se eu possuir a spell tier 1, eu ESQUEÇO a tier 1 e aprendo a tier 2.
Mas o servidor não chega a abrir pois tenho 2 spells words registradas com o mesmo valor: "Exura" no caso.
Eu sei que posso retirar isso das Sources e fazer o servidor abrir, e com o sistema do modo que está feito acredito que não haja problemas, porem eu não sei mecher em Sources, então gostaria de saber o que me indicam a fazer. Eu possuo as Sources do server.
Grande abraço a todos!

Link para o comentário
Compartilhar em outros sites

Boa tarde,

Olá pessoal, tenho mais uma duvida e gostaria da ajuda de vocês:

A um tempo atrás eu resolvi fazer um servidor BEM diferente, muito voltado para o RPG. Com isso eu pensei no seguinte sistema:

Eu tenho Light Healing que heala em media 20. Ao usar certo item, eu ganho Light Healing tier 2 que heala 30.

A ideia é simples, spells com tiers. Fazer o sistema é muito simples tambem, e já está feito. O unico problema que encontrei é: Ter 2 ou mais magias registradas com a mesma spell word.

No script eu fiz para que: Se eu possuir a spell tier 1, eu ESQUEÇO a tier 1 e aprendo a tier 2.

Mas o servidor não chega a abrir pois tenho 2 spells words registradas com o mesmo valor: "Exura" no caso.

Eu sei que posso retirar isso das Sources e fazer o servidor abrir, e com o sistema do modo que está feito acredito que não haja problemas, porem eu não sei mecher em Sources, então gostaria de saber o que me indicam a fazer. Eu possuo as Sources do server.

Grande abraço a todos!

Mas nao precisa de duas oras, ja que a magia e a mesma coisa, so muda os valores, faça um script onde o dano e configurado de acordo com uma tabela onde o index e referenciado pelo tier

Link para o comentário
Compartilhar em outros sites

Mas nao precisa de duas oras, ja que a magia e a mesma coisa, so muda os valores, faça um script onde o dano e configurado de acordo com uma tabela onde o index e referenciado pelo tier

Olá,
Realmente, é uma boa ideia. A parte de dano e heal ja vejo como pode ser feito, mas e a parte dos buffs?
Exemplos:
Exevo pan
Utamo vita
Exeta res
Utito tempo

Link para o comentário
Compartilhar em outros sites

 

Olá,

Realmente, é uma boa ideia. A parte de dano e heal ja vejo como pode ser feito, mas e a parte dos buffs?

Exemplos:

Exevo pan

Utamo vita

Exeta res

Utito tempo

 

tu pode pegar o tier por lua?

se sim, so vai precisar de fazer alguns ifs ou fors para trabalhar com cada tipo

eu nao conheço muito de tibia em si, mas por exemplo esse exevo pan faz food ne? ai o tier evoluiria o tipos de food correto?

tu faz a mesma coisa

 

local foods = {
    --[tier] = {possiblefoods}
     
}
local tier = getTierfunction()
local possibleFoods = foods[tier]
local sortedFood = possibleFoods[math.random(#possibleFoods)]
-- obs.: isso e um pseudo-code

Simples assim

Link para o comentário
Compartilhar em outros sites

tu pode pegar o tier por lua?

se sim, so vai precisar de fazer alguns ifs ou fors para trabalhar com cada tipo

eu nao conheço muito de tibia em si, mas por exemplo esse exevo pan faz food ne? ai o tier evoluiria o tipos de food correto?

tu faz a mesma coisa

local foods = {
    --[tier] = {possiblefoods}
     
}
local tier = getTierfunction()
local possibleFoods = foods[tier]
local sortedFood = possibleFoods[math.random(#possibleFoods)]
-- obs.: isso e um pseudo-code

Simples assim

Posso pegar os Tiers facilmente.

A questão é, em qual script esse codigo vai entrar?

No proprio .lua da magia?

Poderia fazer assim né?

 

local atributos = {
[1] = {atk = 15, heal = 20},
[2] = {atk = 20, heal = 30}
}
local tier = gettierfunction()

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE)
setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, atributos[tier].atk, e os outros paramentros)

function onCastSpell(cid, var)
        
	return doCombat(cid, combat, var)
end

Poderia?

Link para o comentário
Compartilhar em outros sites

Posso pegar os Tiers facilmente.

A questão é, em qual script esse codigo vai entrar?

No proprio .lua da magia?

Poderia fazer assim né?

 

local atributos = {
[1] = {atk = 15, heal = 20},
[2] = {atk = 20, heal = 30}
}


function onCastSpell(cid, var)
        
	return doCombat(cid, combat, var)
end

Poderia?

Nao, porque provavelmente essa funçao tier depende do cid(creatureid) e ele so existe dentro do escopo da callback(onCastSpell)

Pode tentar duas coisas, usar o setAttackFormula dentro do onCastSpell, mas nao acredito que funcione, ou entao usar o callback onGetFormulaValues

local atributos = {
[1] = {atk = 15, heal = 20},
[2] = {atk = 20, heal = 30}
}
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE)



function onGetFormulaValues(cid, level, skill, attack, factor)
	local tier = gettierfunction()
	return -atributos[tier].atk
end

setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

function onCastSpell(cid, var)
        
	return doCombat(cid, combat, var)
end

Dalvorsn, tem como me ajudar aqui ?

 

o script está funcionando mas quero ponhar uma segunda area mas não estou conseguindo também queria que ele fizesse uma condition que seria CONDITION_PARALYZE pode me dizer como faço ?

 

aqui o scritp:

 

local combat1 = createCombatObject()

setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)

setCombatParam(combat1, COMBAT_PARAM_EFFECT, 41)

 

local glacier = {

{0, 1, 1, 1, 0},

{1, 0, 0, 0, 1},

{1, 0, 2, 0, 1},

{1, 0, 0, 0, 1},

{0, 1, 1, 1, 0}

}

 

local area = createCombatArea(glacier)

setCombatArea(combat1, area)

 

function onGetFormulaValues()

return -200, -200, -200, -200

end

 

setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

 

local chance = 10

 

function onStatsChange(cid, attacker, type, combat, value)

 

if value >= 5 and type == 1 then

if getPlayerSlotItem(cid, CONST_SLOT_ARMOR).itemid == 7897 then

local random = math.random(100)

if random >= chance then

doCombat( cid, combat1, numberToVariant(cid) )

return TRUE

end

end

end

return TRUE

end

 

tentei como ali colocando outro nome e mudando os 1 para 0 e os 0 para 1 mais não deu certo apenas 1 aparece...

A segunda area necessita de um segundo combat, a condition basta setar o parametro pro combat

 

Editado por dalvorsn
Link para o comentário
Compartilhar em outros sites

Obrigado Dalvo, deu uma clareada aqui nas ideias. Vou tentar e posto o resultado aqui depois.

Agora uma pequena duvida, qual a diferença em:
doCreateItem x doCreateItemEx ?
Obrigado desde já.

Link para o comentário
Compartilhar em outros sites

Obrigado Dalvo, deu uma clareada aqui nas ideias. Vou tentar e posto o resultado aqui depois.

Agora uma pequena duvida, qual a diferença em:

doCreateItem x doCreateItemEx ?

Obrigado desde já.

1 :: doCreateItem(itemid, type/count, pos)

Cria 'count' item(s) de id 'itemid' na posição 'pos'

 

2 :: doCreateItemEx(itemid[, count/subtype])

Cria um item virtual de id 'itemid' e quantidade 'count', essa função retorna um thing do item criado caso seja bem sucedida

 

Em relação a uso, bem a primeira é bem obvio, a segunda tu usa quando quer editar os atributos do item, ou adicionar ele a algum outro lugar, por exemplo se eu quero criar um machado, mas quero alterar o attack dele, eu não preciso criar ele numa posição, pega-lo pela posição criada e depois alterá-lo, eu posso criá-lo virtualmente, alterar o que quero e só depois adicioná-lo na posição

Porem para adicioná-lo são necessario funçoes especificas:

 

doAddContainerItemEx(uid, virtuid) -- para adicionar em containers
doTileAddItemEx(pos, uid) -- em tiles
doPlayerAddItemEx(cid, uid[, canDropOnMap = false]) -- em players
Link para o comentário
Compartilhar em outros sites

 

1 :: doCreateItem(itemid, type/count, pos)

Cria 'count' item(s) de id 'itemid' na posição 'pos'

 

2 :: doCreateItemEx(itemid[, count/subtype])

Cria um item virtual de id 'itemid' e quantidade 'count', essa função retorna um thing do item criado caso seja bem sucedida

 

Em relação a uso, bem a primeira é bem obvio, a segunda tu usa quando quer editar os atributos do item, ou adicionar ele a algum outro lugar, por exemplo se eu quero criar um machado, mas quero alterar o attack dele, eu não preciso criar ele numa posição, pega-lo pela posição criada e depois alterá-lo, eu posso criá-lo virtualmente, alterar o que quero e só depois adicioná-lo na posição

Porem para adicioná-lo são necessario funçoes especificas:

doAddContainerItemEx(uid, virtuid) -- para adicionar em containers
doTileAddItemEx(pos, uid) -- em tiles
doPlayerAddItemEx(cid, uid[, canDropOnMap = false]) -- em players

Muito bem explicado, Obrigado.

Reputado.

Abraços.

Link para o comentário
Compartilhar em outros sites

local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, 41)

local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, 41)

local condition = createConditionObject(CONDITION_PARALYZE)
setConditionParam(condition, CONDITION_PARAM_TICKS, 20000)
setConditionFormula(condition, -0.7, 0, -0.7, 0)
setCombatCondition(combat, combat2, condition)

local glacier = {
{0, 1, 1, 1, 0},
{1, 0, 0, 0, 1},
{1, 0, 2, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0}
}

local glacier2 = {
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 0},
{0, 1, 2, 1, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 0, 0}
}

local area = createCombatArea(glacier)
setCombatArea(combat1, area)

local area2 = createCombatArea(glacier2)
setCombatArea(combat2, area2)

function onGetFormulaValues()
return -200, -200, -200, -200
end

setCombatCallback(combat1, combat2, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues")

local chance = 10

function onStatsChange(cid, attacker, type, combat, value)

if value >= 5 and type == 1 then
if getPlayerSlotItem(cid, CONST_SLOT_ARMOR).itemid == 7897 then
local random = math.random(100)
if random >= chance then
doCombat( cid, combat1, combat2, numberToVariant(cid) )
return TRUE
end
end
end
return TRUE
end

 

 

ficando assim ? mais dai da erro diz que não existe combat pode me falar como coloco o combat2 para ser executado primeiro ?

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...