Ir para conteúdo
Propaganda

Posts Recomendados

  • Administrador

Opa, venho trazer uma função que pode ser usado em jogadores, monstros ou npcs, funciona quando uma criatura anda.

 

1° Passo

Spoiler

Em creatureevent.h

Em baixo de 

CREATURE_EVENT_DIRECTION,

Adicione

CREATURE_EVENT_MOVE,

Em baixo de

uint32_t executeDirection(Creature* creature, Direction old, Direction current);

Adicione

uint32_t executeMove(Creature* creature, const Position& fromPosition, const Position& toPosition);

 

2° Passo

Spoiler

Em creatureevent.cpp

Em baixo de

else if(tmpStr == "direction")
		m_type = CREATURE_EVENT_DIRECTION;

Adicione

else if(tmpStr == "move")
		m_type = CREATURE_EVENT_MOVE;

Em baixo de

case CREATURE_EVENT_DIRECTION:
			return "onDirection";

Adicione

case CREATURE_EVENT_MOVE:
			return "onMove";

Em baixo de

case CREATURE_EVENT_OUTFIT:
			return "cid, old, current";

Adicione

case CREATURE_EVENT_MOVE:
			return "cid, fromPosition, toPosition";

Em baixo da função

uint32_t CreatureEvent::executeDirection(Creature* creature, Direction old, Direction current)

Adicione a função

uint32_t CreatureEvent::executeMove(Creature* creature, const Position& fromPosition, const Position& toPosition)
{
	//onMove(cid, old, current)
	if(m_interface->reserveEnv())
	{
		ScriptEnviroment* env = m_interface->getEnv();
		if(m_scripted == EVENT_SCRIPT_BUFFER)
		{
			env->setRealPos(creature->getPosition());
			std::stringstream scriptstream;
			scriptstream << "local cid = " << env->addThing(creature) << std::endl;

                        env->streamPosition(scriptstream, "fromPosition", fromPosition, 0);
                        env->streamPosition(scriptstream, "toPosition", toPosition, 0);

			scriptstream << m_scriptData;
			bool result = true;
			if(m_interface->loadBuffer(scriptstream.str()))
			{
				lua_State* L = m_interface->getState();
				result = m_interface->getGlobalBool(L, "_result", true);
			}

			m_interface->releaseEnv();
			return result;
		}
		else
		{
			#ifdef __DEBUG_LUASCRIPTS__
			char desc[30];
			sprintf(desc, "%s", creature->getName().c_str());
			env->setEventDesc(desc);
			#endif

			env->setScriptId(m_scriptId, m_interface);
			env->setRealPos(creature->getPosition());

			lua_State* L = m_interface->getState();
			m_interface->pushFunction(m_scriptId);

			lua_pushnumber(L, env->addThing(creature));
			LuaScriptInterface::pushPosition(L, fromPosition);
			LuaScriptInterface::pushPosition(L, toPosition);

			bool result = m_interface->callFunction(3);
			m_interface->releaseEnv();
			return result;
		}
	}
	else
	{
		std::cout << "[Error - CreatureEvent::executeMove] Call stack overflow." << std::endl;
		return 0;
	}
}

 

3° Passo

Spoiler

Em game.cpp

Em baixo de

else if(currentPos.z != 7 && (!(tmpTile = map->getTile(destPos)) || (!tmpTile->ground &&
			!tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position(
			destPos.x, destPos.y, destPos.z + 1))) && tmpTile->hasHeight(3)) //try go down
		{
			flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE;
			destPos.z++;
		}
	}

Adicione

bool deny = false;
	CreatureEventList moveEvents = creature->getCreatureEvents(CREATURE_EVENT_MOVE);
	for(CreatureEventList::iterator it = moveEvents.begin(); it != moveEvents.end(); ++it)
    {
		if(!(*it)->executeMove(creature, currentPos, destPos))
		deny = true;
    }

	if(deny){
		return RET_NOTPOSSIBLE;
    }

Agora, compile a source

Como usar

Spoiler
function onMove(cid, fromPosition, toPosition)
	if(toPosition.x == 100 and toPosition.y == 100 and toPosition.z == 7) then
		doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN)
	end
	return true
end

E adicione em creaturescrips.xml

<event type="move" name="Move" event="script" value="move.lua"/>

 

 

  • Like 7
  • Thanks 2
  • Haha 1
Link para o comentário
https://tibiadevs.com/forums/topic/53-creatureevent-function-onmovecid-fromposition-toposition-tfs-036/
Compartilhar em outros sites

  • 11 meses depois...

testei ak e foi tranquilo, compilou certinho, porem por algum motivo bugou TUDO os pokemons selvagens, e n apareceu na distro um sistema d spawn q meu servidor contem, oq poderia ser?

Link para o comentário
https://tibiadevs.com/forums/topic/53-creatureevent-function-onmovecid-fromposition-toposition-tfs-036/#findComment-2768
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...