Ir para conteúdo

Docreaturecastspell


iunix

Posts Recomendados

Introdução:



divisor.png

Basicamente é uma função que força uma criatura a usar uma spell. Ignorando mana, vocação, level e tudo mais.

Ela é uma função meio antiga, estou com MUITA preguiça de refazer ela. E ela tem um erro que eu realmente não consigo me lembrar.(Acho que criaturas não podem hitar com a magia se o monster já não for target)

Explicação:



divisor.png

 

Testado em: TFS 0.4 rev 3777

Autor: iuniX

Function name: doCreatureCastSpell(cid, spellname)

 

 

Instalando:



divisor.png

Abra o teu Arquivo luascript.cpp e procure por:

 

//getCreatureHealth(cid)
lua_register(m_luaState, "getCreatureHealth", LuaInterface::luaGetCreatureHealth);

 

abaixo disso coloque:

    //doCreatureCastSpell(cid, spellname)
lua_register(m_luaState, "doCreatureCastSpell", LuaInterface::luaDoCreatureCastSpell);

 

Agora procure por:

int32_t LuaInterface::luaDoPlayerJoinParty(lua_State* L)
{
//doPlayerJoinParty(cid, lid)
ScriptEnviroment* env = getEnv();

Player* leader = env->getPlayerByUID(popNumber(L));
if(!leader)
{
	errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
	lua_pushboolean(L, false);
}

Player* player = env->getPlayerByUID(popNumber(L));
if(!player)
{
	errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
	lua_pushboolean(L, false);
}

g_game.playerJoinParty(player->getID(), leader->getID());
lua_pushboolean(L, true);
return 1;
}

 

E coloque isso antes (pule umas duas linhas de espaço para não confundir e deixar organizado)

int32_t LuaInterface::luaDoCreatureCastSpell(lua_State * L) 
{ 
//DoCreatureCastSpell (uid, spell) 
std::string spell_name = popString(L); 

ScriptEnviroment* env = getEnv();
Creature * creature = env-> getCreatureByUID (popNumber (L)); 
if (! creature) 
	{ 
		errorEx (getError (LUA_ERROR_CREATURE_NOT_FOUND)); 
		lua_pushboolean (L, false); 
		return 1; 
	} 
	InstantSpell* spell = g_spells->getInstantSpellByName (spell_name);
	if(spell)
	{ 
		if (spell-> castSpell(creature)) 
			{ 
				lua_pushboolean (L, true); 
				return 1; 
		} 
	} 
lua_pushboolean (L, false); 
return 1; 
}

 

Agora vá em luascript.h e procure por:

static int32_t luaDoPlayerAddMoney(lua_State* L);

 

e coloque isso abaixo:

static int32_t luaDoCreatureCastSpell(lua_State* L);

 

 

Utilização:



divisor.png

 

function onSay(cid, words, param, channel)
local su = getCreatureSummons(cid)[1]
doCreatureCastSpell(su, param)
doPlayerSay(cid, getCreatureName(su) .. ", use " .. param .. "!")
doSendAnimatedText(getCreaturePosition(su), param, math.random(255))
return true
end

 

 

Agradecimentos:



divisor.png

 

Obrigado ao Kydrai pela ajuda com alguns erros.

Link para o comentário
Compartilhar em outros sites

Funciona direitinho? Não sabia que tinha esse método em spells.cpp, se não tinha programado algo parecido antes.

 

Muito bom mesmo, iuniX.

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

Eu testei aqui ontem, só pra ver qual era o bug. Ele não hita o que não estiver como "target". Se for uma criatura no caso, ela só vai hitar a magia se você já tiver atacado algo. Eu já pensei em como arrumar, assim que eu tiver um pouco mais tempo, eu arrumo e posto aqui uma versão 2.0

 

Eu tinha feito para um servidor de pokemon, ia forçar os pokes a usar a spell por talkaction. Easy-and-clean.

Link para o comentário
Compartilhar em outros sites

  • 2 years later...

Boa noite,

 

Será que consegue converter esta função para 0.4 rev 3884?

 

Seria de muita ajuda para mim.

 

Obrigado.

Por acaso você tentou compilar o código? Se não, tente que deve ir normal.

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

é um código interessante, ajuda no aprendizado de c++ e sources open tibia, porém...

 

não é interessante de se usar um poketibia, por exemplo, pois o dano se baseia no level e magic level do player, se você colocar um monster pra usar uma spell ele nao tem ml nem lvl. (é possível corrigir isso, mas aí vai precisar de outras alterações)

Link para o comentário
Compartilhar em outros sites

  • 3 weeks later...

Por acaso você tentou compilar o código? Se não, tente que deve ir normal.

Na verdade, tentei sim...

Mas o problema estava no windows 10, está muito falho...

No win7 eu consegui, porém a função não funciona como o esperado.

 

Obs:

1. Qualquer vocação executa qualquer magia,

2. Não upa Magic Level ao usar a magia com a função

 

 

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...