Ir para conteúdo

Projeto Tutores de Scripting


Killua

Posts Recomendados

Boa tarde,

SIMPLESMENTE MUITO IMPRESSIONANTE!

Como todos falaram lá no topico essa função consome muita memoria, vou tentar fazer meu codigo de outro modo.

Muito obrigado pela ajuda e um grande abraço!

REP +

Sim, consome, mas e porque ele faz o save no mapa inteiro, se fizer so das houses nao vai ser tanta nao brow

Link para o comentário
Compartilhar em outros sites

Boa tarde,

SIMPLESMENTE MUITO IMPRESSIONANTE!

Como todos falaram lá no topico essa função consome muita memoria, vou tentar fazer meu codigo de outro modo.

Muito obrigado pela ajuda e um grande abraço!

REP +

 

Usa um creaturescript com a função onThink para verificar se o item com action/unique id está com o tileID X e se já foi usado por alguém, faz isso com uma global storage, se não foi coloca para mudar. Com isso logo ao abrir o server irá mudar o tile.

Link para o comentário
Compartilhar em outros sites

Bom dia,

Negativo, os itens são salvos porem o TILE volta a ser o qual está programado no mapa.

 

Tenho essa casa que é do Player: Mateuso

Qualquer item que eu jogue dentro ela salva normalmente.

 

wcix4x.png

 

 

Eu tenho um script que ao utilizar certo item no chão, o TILE se modifica e vira outro.

O que eu sei é que, quando o server é fechado e aberto novamente são salvos os ITENS que estão acima do TILE, porem o TILE retorna a ser o que está feito no MAPA.

O que eu quero fazer é alterar a função de SAVE do server, para salvar o TILE no chão.

Quando eu uso o item no chão, o TILE se transforma em outro, como na imagem abaixo:

 

bfrqfl.png

 

Acho que agora consegui expressar o pedido em si.

Aguardando respostas.

Grande abraço a todos!

 

 

 

Outra idéia é:

Ao usar o item que transforma o chão, armazenar a posição numa tabela criada na lib. Exemplo:


function onUse(cid, item, fromPosition, itemEx, toPosition)
    table.insert(tabela, getThingPos(itemEx.uid))
    return true
end

Depois, num globalevents com callback onStartUp, vc transforma os tiles das posições da tabela para o id que vc quer. Para isso, vc pode usar minha função doTransformTile:

function doTransformTile(pos, id)
    pos.stackpos = 0
    return doTransformItem(getThingFromPos(pos).uid, id)
end

function onStartup()
    for i = 1, #tabela do
        doTransformTile(tabela[i], 216)
    end
    return true
end

Acredito que assim funcione... Dessa forma não serão necessárias alterações nas sources...

Link para o comentário
Compartilhar em outros sites

 

Usa um creaturescript com a função onThink para verificar se o item com action/unique id está com o tileID X e se já foi usado por alguém, faz isso com uma global storage, se não foi coloca para mudar. Com isso logo ao abrir o server irá mudar o tile.

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

 

Outra idéia é:

Ao usar o item que transforma o chão, armazenar a posição numa tabela criada na lib. Exemplo:

function onUse(cid, item, fromPosition, itemEx, toPosition)
    table.insert(tabela, getThingPos(itemEx.uid))
    return true
end

Depois, num globalevents com callback onStartUp, vc transforma os tiles das posições da tabela para o id que vc quer. Para isso, vc pode usar minha função doTransformTile:

function doTransformTile(pos, id)
    pos.stackpos = 0
    return doTransformItem(getThingFromPos(pos).uid, id)
end

function onStartup()
    for i = 1, #tabela do
        doTransformTile(tabela[i], 216)
    end
    return true
end

Acredito que assim funcione... Dessa forma não serão necessárias alterações nas sources...

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

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

Minha duvida e bem bobinha : (, Gostaria de fazer um dano baseado na skill

 

If getPlayerSkill(cid, 2) A Skill teria que ser >=10 para:

doCreatureRemoveHealth(target, -200)

 

elseif If getPlayerSkill(cid, 2) A Skill teria que ser >=20 para:

doCreatureRemoveHealth(target, -500)

 

Isso é para uma spell se possível atribuir uma tabela.

 

local skill = 8 then

-[skill ID], Dano

[10], 500

[20], 500

Link para o comentário
Compartilhar em outros sites

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

Pode ser, inclusive seria mais facil que meu metodo, so atentar aos tamanhos das variaveis :D

 

Minha duvida e bem bobinha : (, Gostaria de fazer um dano baseado na skill

 

If getPlayerSkill(cid, 2) A Skill teria que ser >=10 para:

doCreatureRemoveHealth(target, -200)

 

elseif If getPlayerSkill(cid, 2) A Skill teria que ser >=20 para:

doCreatureRemoveHealth(target, -500)

 

Isso é para uma spell se possível atribuir uma tabela.

 

local skill = 8 then

-[skill ID], Dano

[10], 500

[20], 500

 

local damage_table = {
    --[[
    [skill_value] = damage;
    ]]
    [10] = 500;
    [20] = 1000;
    [50] = 10000;
    -- ......
 }

 local final_damage = 0;
 local skill = getPlayerSkill(cid, 2)
 for skill_value, damage in pairs(damage_table) do

     if (skill >= skill_value) and (damage > final_damage) then
         final_damage = damage;
     end
 end

doCreatureRemoveHealth(target, final_damage)

 

Proximo disso

Link para o comentário
Compartilhar em outros sites

Pode ser, inclusive seria mais facil que meu metodo, so atentar aos tamanhos das variaveis :D

local damage_table = {    --[[    [skill_value] = damage;    ]]    [10] = 500;    [20] = 1000;    [50] = 10000;    -- ...... } local final_damage = 0; local skill = getPlayerSkill(cid, 2) for skill_value, damage in pairs(damage_table) do     if (skill >= skill_value) and (damage > final_damage) then         final_damage = damage;     end enddoCreatureRemoveHealth(target, final_damage)
Proximo disso

 

 

Vlw cara, não consegui usa-la, deu erro na linha 20 "ATTEMPT TO COMPARE NUMBER WITH BOLEEAN"

Tem como dar um exemplo.

 

Também ocorreu um erro na hora de pegar a skill do player, falando que o player não foi encontrado.

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

 

Vlw cara, não consegui usa-la, deu erro na linha 20 "ATTEMPT TO COMPARE NUMBER WITH BOLEEAN"

Tem como dar um exemplo.

 

Também ocorreu um erro na hora de pegar a skill do player, falando que o player não foi encontrado.

Posta como ficou seu script e o erro completo

Link para o comentário
Compartilhar em outros sites

Bom o script ficou bem primitivo, tentei resolver o erro mais não consegui, ainda estou tentando aprender um pouco mais.

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)

local damage_table = {
    --[[
    [skill_value] = damage;
    ]]
	[5] = 10;
    [10] = 15;
    [15] = 20;
    [30] = 30;
    -- ......
 }

 local final_damage = 0;
 local skill = getPlayerSkill(cid, 2)
 for skill_value, damage in pairs(damage_table) do

     if (skill >= skill_value) and (damage > final_damage) then
         final_damage = damage;
     end
 end

doCreatureRemoveHealth(target, final_damage)
function onCastSpell(cid, var)
	return doCombat(cid, combat, var)
end

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

Veja bem, teu erro é bem comum para os que estão iniciando.

Você está usando funções dependentes da variavel 'cid'(creatureId) fora do escopo da callback onCastSpell

O que não for dependente dessa variavel pode ficar do lado de fora do escopo, mas o que depende, precisa ficar no escopo.

Ficaria assim:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)

local damage_table = {
    --[[
    [skill_value] = damage;
    ]]
	[5] = 10;
    [10] = 15;
    [15] = 20;
    [30] = 30;
 }


function onCastSpell(cid, var)
	local final_damage = 0;
	local skill = getPlayerSkill(cid, 2)
	for skill_value, damage in pairs(damage_table) do
		if (skill >= skill_value) and (damage > final_damage) then
			final_damage = damage;
		end
	end

	doCreatureRemoveHealth(target, final_damage)
	
	return doCombat(cid, combat, var)
end
Editado por dalvorsn
Link para o comentário
Compartilhar em outros sites

 

Veja bem, teu erro é bem comum para os que estão iniciando.

Você está usando funções dependentes da variavel 'cid'(creatureId) fora do escopo da callback onCastSpell

O que não for dependente dessa variavel pode ficar do lado de fora do escopo, mas o que depende, precisa ficar no escopo.

Ficaria assim:

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA)

local damage_table = {
    --[[
    [skill_value] = damage;
    ]]
	[5] = 10;
    [10] = 15;
    [15] = 20;
    [30] = 30;
 }


function onCastSpell(cid, var)
	local final_damage = 0;
	local skill = getPlayerSkill(cid, 2)
	for skill_value, damage in pairs(damage_table) do
		if (skill >= skill_value) and (damage > final_damage) then
			final_damage = damage;
		end
	end

	doCreatureRemoveHealth(target, final_damage)
	
	return doCombat(cid, combat, var)
end

 

Haha obrigado novamente,o erro anterior sumiu, mais infelizmente ocorre um erro quando irei chamar a spell.

 

Tirei uma print para ficar mais fácil

4082d20313ac6fa4656e3214731978eb.png.

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
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...