Ir para conteúdo

Obter o nome da Ultima Spell usada pelo onCastSpell


Mateusoo

Posts Recomendados

Olá amigos, boa tarde!

Estou com uma pequena duvida, gostaria de saber se tem como eu obter o nome da magia que acabou de ser utilizada na função onCastSpell, no caso no script da propria spell. Vou tentar explicar melhor:

--Esse é o script da magia intense healing.
--O que eu preciso é basicamente que ela retorne o nome da magia que acabou de ser usado, ou seja o nome intense healing.
local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE)
setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false)
setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE)
setHealingFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 5, 6)

--local nome

function onCastSpell(cid, var)
        --nome = função que retorna o nome dessa habilidade.
	return doCombat(cid, combat, var)
        --doCreatureSay(cid, "Voce usou "..nome.."!") 
        --O output seria: Você usou Intense Healing!
end

Consegui ser claro? Existe algum modo de fazer isso sem editar as sources? Não teria problemas ele me retornar a palavra de conjuração da spell no caso(exura gran). Pra mim tanto faz.
Muito obrigado!
Abraços.

up

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

Oi, acredito que não tenha como sem alterar as sources, pois os únicos parâmetros que são passados pelo onCastSpell são o id do player e o var, sendo que o var (em C++) é uma struct:

struct LuaVariant {
LuaVariant() {
type = VARIANT_NONE;
number = 0;
}

LuaVariantType_t type;
std::string text;
Position pos;
uint32_t number;
};

 

Basicamente serve pra saber o target da spell, podendo ser por nome, posição, id do player...

 

Dei uma pesquisada aqui nas sources e não achei nada para resolver o teu problema por lua, mas talvez alguém saiba de algum jeito.

Link para o comentário
Compartilhar em outros sites

Oi, acredito que não tenha como sem alterar as sources, pois os únicos parâmetros que são passados pelo onCastSpell são o id do player e o var, sendo que o var (em C++) é uma struct:

 

struct LuaVariant {

LuaVariant() {

type = VARIANT_NONE;

number = 0;

}

 

LuaVariantType_t type;

std::string text;

Position pos;

uint32_t number;

};

 

Basicamente serve pra saber o target da spell, podendo ser por nome, posição, id do player...

 

Dei uma pesquisada aqui nas sources e não achei nada para resolver o teu problema por lua, mas talvez alguém saiba de algum jeito.

Olá,

Muito obrigado pela atenção. Você vê a possibilidade dessa alteração nas sources? Eu não sei muito, mas acredito que usando a mesma forma que as talkactions utilizam para obter o parâmetro WORDS funcione...

Obrigado, abraços.

Link para o comentário
Compartilhar em outros sites

Olá,

Muito obrigado pela atenção. Você vê a possibilidade dessa alteração nas sources? Eu não sei muito, mas acredito que usando a mesma forma que as talkactions utilizam para obter o parâmetro WORDS funcione...

Obrigado, abraços.

 

Sim, acho que é mais ou menos por ai. Eu não estou muito acostumado a mexer nas sources, mas se quiser podemos tentar.

 

Obs: antes de começar, faça um backup de tudo!

 

Você está usando tfs 1.0? Se sim, vai em spells.cpp, procura por:

 

InstantSpell::executeCastSpell

 

Nessa função, procura por:

 

LuaScriptInterface::pushVariant(L, var);

 

Abaixo dessa linha, coloque:

 

LuaScriptInterface::pushString(L, getWords());

 

E por último, troque isto:

 

return m_scriptInterface->callFunction(2);

Por isto:

 

return m_scriptInterface->callFunction(3);

Se a compilação der certo, tenta usar uma spell assim:

 

function onCastSpell(cid, var, words)

 

Senão, posta o erro. Não tenho um ambiente de testes aqui, por isso não pude testar.

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

Olá @Demonbholder,
Muito obrigado pela atenção.
Atualmente, eu utilizo uma source 0.3.7. Que foi a que veio junto com o servidor base. Eu procurei por sources 9.6 0.3.6 ou 0.4, porem não encontrei nenhuma que funcionasse com o meu servidor. Então não pude fazer seu teste. Você saberia me informar onde eu consigo sources do TFS 0.3.6 ou 0.4 para 9.6? Desculpe, não sei muito como SOURCES funcionam.
Obrigado.

Link para o comentário
Compartilhar em outros sites

Consegue fazer o upload das sources ou mandar o link de onde você baixou?

 

ps: tá conseguindo compilar certinho?

Olá @Demonbholder,

Consigo fazer o upload das sources sim. Porem eu não quero usar souces 0.3.7(algumas funções que achei não consegui incluir nelas), eu gostaria de saber:

Se eu pegar sources TFS 0.4 ou 0.3.6 eu consigo usar elas em qualquer versão do tibia? Ou é algo tipo TFS 0.4 para tibia 8.6 é diferente de TFS 0.4 para tibia 9.6.

Não entendo direito como funciona sources, nunca mexi com essa parte... Quanto ao código que você mandou, eu não testei por que não tenho sources 1.0(e não queria utiliza-las).

Algo interessante é: Ao compilar minhas sources 0.3.7 eu percebi que LADDER e BUEIROS não funcionam. Não tem como eu subir. Se eu criar uma ladder com o /i ESSA LADDER FUNCIONA. E algumas ladders funcionam e outras não. Ambas tem o mesmo ID. Alguma ideia? (Não é tão importante, pois como falei não pretendo usar sources 0.3.7, so curiosidade mesmo.)

Obrigado pela atenção.

Abraço.

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

Eu também não sei muito, eu entendo a linguagem, mas não sei como funciona a integração com as versões dos clients e tal. Meu chute é que cada versão do tfs seja para uma versão determinada do tibia, até porque a cada versão são adicionadas novas funcionalidades no jogo, logo as sources tem que ser alteradas. Outra coisa, se você mudar as sources, vários códigos em lua podem apresentar problemas, já que algumas funções mudam de uma versão para outra.

 

Quanto ao outro problema, você cria uma ladder com o /i e ela funciona mas uma ladder com esse mesmo id que foi colocada pelo map editor não funciona? Se for isso, tem que ver o que o /i ta fazendo para fazer a ladder funcionar.

Link para o comentário
Compartilhar em outros sites

Eu também não sei muito, eu entendo a linguagem, mas não sei como funciona a integração com as versões dos clients e tal. Meu chute é que cada versão do tfs seja para uma versão determinada do tibia, até porque a cada versão são adicionadas novas funcionalidades no jogo, logo as sources tem que ser alteradas. Outra coisa, se você mudar as sources, vários códigos em lua podem apresentar problemas, já que algumas funções mudam de uma versão para outra.

 

Quanto ao outro problema, você cria uma ladder com o /i e ela funciona mas uma ladder com esse mesmo id que foi colocada pelo map editor não funciona? Se for isso, tem que ver o que o /i ta fazendo para fazer a ladder funcionar.

Olá @Demonbholder,

Entendi. Essa questão da ladder me intrigou MUITO ai comecei a fazer uns teste e percebi: O erro está no script teleport.lua. No script é feito o calculo do local para onde o player vai apos usar uma escada, buraco e etc. E tem uma checagem para descobrir se o local para onde o player vai ser teletransportado é um tile que permita movimentação(chão, piso) e não (parede, cerca, poste, pedra, coisas que não são permitidos o movimento), porem essa checagem faz com que só possa subir escada se for pra um lugar que não pode andar. Então, o script bloqueia subir para lugares que deveria ser possível subir e permite subir para lugares que não deveria ser possível. Fiz vários testes para descobrir isso... Acredito que o problema seja na função: doTileQueryAdd(cid, POSIÇÃO para verificar, INT(não sei o que significa), false[Essa opção só esta disponível para a verão 0.4 do TFS, que é um parâmetro BOOL]), inclusive achei que atualizando essa função e recompilando as sources 0.3.7 que possuo o problema estaria sanado, porem não houve mudança. Vou postar o teleport.lua para você dar uma olhada, se quiser posso postar a função doTileQueryAdd que está nas minhas sources também.

Quanto a questão original do topico, você saberia onde conseguir uma source 9.6 0.4 do TFS?

Obrigado pela atenção, abraços.

Segue o codigo do teleport.lua:

local UP_FLOORS = {1386, 3678, 5543, 8599, 10035}
local FIELDS = {1497, 1499, 11095, 11096}
local DRAW_WELL = 1369
 
function onUse(cid, item, fromPosition, itemEx, toPosition)
if(item.itemid == DRAW_WELL and item.actionid ~= 100) then
return false
end
 
local check = false
fromPosition.stackpos = STACKPOS_GROUND
if(isInArray(UP_FLOORS, item.itemid)) then
fromPosition.z = fromPosition.z - 1
fromPosition.y = fromPosition.y + 1
if(doTileQueryAdd(cid, fromPosition, 38, false) ~= RETURNVALUE_NOERROR) then
local field = getTileItemByType(fromPosition, ITEM_TYPE_MAGICFIELD)
if(field.uid == 0 or not isInArray(FIELDS, field.itemid)) then
fromPosition.y = fromPosition.y - 2
else
check = true
end
end
else
fromPosition.z = fromPosition.z + 1
end
 
if(not check and doTileQueryAdd(cid, fromPosition, 38, false) ~= RETURNVALUE_NOERROR) then
local field = getTileItemByType(fromPosition, ITEM_TYPE_MAGICFIELD)
if(field.uid == 0 or not isInArray(FIELDS, field.itemid)) then
return false
end
end
 
local pos, dir = getCreaturePosition(cid), SOUTH
if(pos.x < fromPosition.x) then
dir = EAST
elseif(pos.x == fromPosition.x) then
if(pos.y == fromPosition.y) then
dir = getCreatureLookDirection(cid)
elseif(pos.y > fromPosition.y) then
dir = NORTH
end
elseif(pos.x > fromPosition.x) then
dir = WEST
end
 
doTeleportThing(cid, fromPosition, false)
doCreatureSetLookDirection(cid, dir)
return true
end
Link para o comentário
Compartilhar em outros sites

Nunca tinha visto essa função doTileQueryAdd... Onde você baixou esse servidor? Tem o link dele?

Olá @Demonbholder,

Não tenho mais o link, mas tenho as sources dele aqui. É TFS 0.3.7 SVN Crying Damson, vou mandar a função em C++ para você da uma olhada...

Obrigado pela atenção.

Abraço

Segue o codigo:

int32_t LuaInterface::luaDoTileQueryAdd(lua_State* L)
{
	//doTileQueryAdd(uid, pos[, flags])
	uint32_t flags = 0, params = lua_gettop(L);
	if(params > 2)
		flags = popNumber(L);

	PositionEx pos;
	popPosition(L, pos);
	uint32_t uid = popNumber(L);

	ScriptEnviroment* env = getEnv();
	Tile* tile = g_game.getTile(pos);
	if(!tile)
	{
		errorEx(getError(LUA_ERROR_TILE_NOT_FOUND));
		lua_pushnumber(L, (uint32_t)RET_NOTPOSSIBLE);
		return 1;
	}

	Thing* thing = env->getThingByUID(uid);
	if(!thing)
	{
		errorEx(getError(LUA_ERROR_THING_NOT_FOUND));
		lua_pushnumber(L, (uint32_t)RET_NOTPOSSIBLE);
		return 1;
	}

	lua_pushnumber(L, (uint32_t)tile->__queryAdd(0, thing, 1, flags));
	return 1;
} 
Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...

O tópico foi fechado e movido para lixeira por estar inativo a mais de 10 dias. Caso seja preciso reabrir o mesmo, favor entrar em contato com a equipe.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...