Ir para conteúdo
Propaganda

[CreatureEvent] function onMove(cid, fromPosition, toPosition) [TFS 0.3.6]


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
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
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

×
  • Criar Novo...