Ir para conteúdo

[CreatureEvent] onTalk(cid, type, text, position)


meubk

Posts Recomendados

onTalk(cid, type, text, position)

Estava de boa no meu serviço, sem nada pra fazer, então resolvi criar essa função ai, não sei se vai ter utilidade para alguém, mais ta ae, ela retorna tudo aquilo que foi dito pela criatura, o tipo, e a posição.

 

Vamos as códigos:

 

em creatureevent.h :

 

depois de:
CREATURE_EVENT_DIRECTION,
adicione:
CREATURE_EVENT_TALK,
--
depois de:
uint32_t executeDirection(Creature* creature, Direction old, Direction current);
adicione:
uint32_t executeTalk(Creature* creature, MessageClasses type, const std::string& text, const Position& position);

em creatureevent.cpp :

 

depois de:

else if(type == "direction")
_type = CREATURE_EVENT_DIRECTION;
adicione:
else if(type == "talk")
_type = CREATURE_EVENT_TALK; 
--
depois de:
case CREATURE_EVENT_DIRECTION:
return "onDirection";
adicione:
case CREATURE_EVENT_TALK:
return "onTalk";
--
depois de:
case CREATURE_EVENT_DIRECTION:
adicione:
case CREATURE_EVENT_TALK:
return "cid, type, text, position";

--

 

procure pela função :

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

depois que a função terminar adicione esta função:

uint32_t CreatureEvent::executeTalk(Creature* creature, MessageClasses type, const std::string& text, const Position& position)
{
	//onTalk(cid, type, text, pos)
	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;
			scriptstream << "local type = " << (uint32_t)type << std::endl;
			scriptstream << "local text = " << text << std::endl;
			env->streamPosition(scriptstream, "position", position, 0);

			if(m_scriptData)
				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[35];
			sprintf(desc, "%s", creature->getName().c_str());
			env->setEvent(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));
			lua_pushnumber(L, (uint32_t)type);
			lua_pushstring(L, text.c_str());
			LuaInterface::pushPosition(L, position, 0);

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

em game.cpp :

 

procure a função:

bool Game::internalCreatureSay(Creature* creature, MessageClasses type, const std::string& text, bool ghostMode, SpectatorVec* spectators/* = NULL*/, Position* pos/* = NULL*/, uint32_t statementId/* = 0*/)

e depois de:

Player* player = creature->getPlayer();
	if(player && player->isAccountManager() && !ghostMode)
	{
		player->manageAccount(text);
		return true;
	}

adicione isto:

bool deny = false;
	CreatureEventList talkEvents = creature->getCreatureEvents(CREATURE_EVENT_TALK);
	for(CreatureEventList::iterator it = talkEvents.begin(); it != talkEvents.end(); ++it)
	{
		if(!(*it)->executeTalk(creature, type, text, creature->getPosition()))
			deny = true;
	}

	if(deny)
		return false;

e pronto ja vai estar funcionando !

 

uma das utilidades dessa função é não permitir divulgação de outros server, mais pra qm tem criatividade da pra fazer mtas outras coisas, o exemplo de divulgação:

local linkProibidos = {"no-ip.com", "servergame.com", "sytes.net"}

function onTalk(cid, type, text, position)
	for _, link in pairs(linkProibidos) do
		if text:find(link) then
			return false
		end
	end
	return true
end

a tag pro xml fica:

<event type="talk" name="AntiDivulga" event="script" value="antidivulga.lua"/>

bom, não sei se alguém ja fez essa função mais eu sei q essa é 100% de minha autoria, e eu não permito que ela seja postada em outro forum a não ser o xtibia !

 

eu testei em um tfs 0.4

 

obrigado a todos, xotservx (miillerdomingues)

 

bj

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Qualquer conteúdo feito do zero é lucro chapa, e o que pode ser inútil para alguns pode ser útil para outros. Gostei, depois vou da uma lida no código.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...