• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Feature [CreatureEvent] Regestire all monster and players in creatureevent.xml

You can use 'onSpawn' function and register the 'spawn' event on monster.cpp on the function 'onCreatureAppear', and now you can play with all the monsters that will be spawned, this do not work onStartUp, you should add on your source code the function 'getMonstersOnline' and create a 'onStartUp' globalevent function.
 
CreatureEvent* getEventByName(std::vector<CreatureEvent*>getAllCreatureEvents(){return m_creatureEvents;} const std::string& name, bool forceLoaded = true);

75 D:\0.3.6pl1.r96\creatureevent.h expected `,' or `...' before '{' token

What is wrong?
 
well it isnt for 0.3.6 and I donno what is this thing quoted in your post it makes no sense.
 
this isn't good do in a server with more than 150 players. To run a lua code use like 50x more ram and 5x more your CPU than same code in c++

if your server got like 5000k+ monsters and you register one onThink by monster of course you will get high cpu usage
 
Huh, any chance someone could compile it for me? I make no further changes in the engine probably after that. TFS 0.3.6, I will be greatful, I absolutely suck at compiling.
 
for version 0.3.6 ...

# goto creatureevent.cpp :

search for this:

Code:
bool CreatureEvents::playerLogin(Player* player)

and in the block of this function search for:

Code:
return result;

then paste this before it:

Code:
if (result)
	{
		for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it)
		{
			CreatureEvent* event = it->second;
			if(event->isLoaded() && ( event->getRegister() == "player" || event->getRegister() == "all") )
				player->registerCreatureEvent(event->getName());
		}

	}

after this:

Code:
std::string tmpStr = asLowerCaseString(str);

paste this:

Code:
std::string strr;
	if(!readXMLString(p, "registerTo", strr) || strr.empty() ){
		if((tmpStr != "login") && (tmpStr != "logout"))
			std::clog << "[Warning - CreatureEvent::configureEvent] : You havn't register event '" << m_eventName <<"'"<< std::endl;
	}
	else
		m_eventRegister = strr;

------------------------------------------------------------------------------------------------------------------------------------

# goto creatureevent.h :

after this:

Code:
CreatureEvent* getEventByName(

paste this:

Code:
CreatureEventList getAllCreatureEvents(){return m_creatureEvents;}

now in the end of file after this:

Code:
std::string m_eventName;

paste this:

Code:
std::string m_eventRegister;

after this:

Code:
const std::string& getName() const {return m_eventName;}

paste this:

Code:
const std::string getRegister() const {return m_eventRegister;}

find this:

Code:
typedef std::map<std::string, CreatureEvent*> CreatureEventList;

and then put it, /\, under:

Code:
class CreatureEvents : public BaseEvents
{

getting like this at the end:

Code:
class CreatureEvents : public BaseEvents
{
	typedef std::map<std::string, CreatureEvent*> CreatureEventList;//edited here
	public:
		CreatureEvents();
		virtual ~CreatureEvents();

		// global events
		bool playerLogin(Player* player);
		bool playerLogout(Player* player, bool forceLogout);

		CreatureEvent* getEventByName(const std::string& name, bool forceLoaded = true);
		CreatureEventList getAllCreatureEvents(){return m_creatureEvents;}//edited here

	protected:
		virtual std::string getScriptBaseName() const {return "creaturescripts";}
		virtual void clear();

		virtual Event* getEvent(const std::string& nodeName);
		virtual bool registerEvent(Event* event, xmlNodePtr p, bool override);

		virtual LuaScriptInterface& getInterface() {return m_interface;}
		LuaScriptInterface m_interface;

		//creature events
		CreatureEventList m_creatureEvents;
};
-------------------------------------------------------------------------------------------------------------------------------------

# go to monster.cpp

under this:

Code:
extern Monsters g_monsters;

paste this:

Code:
extern CreatureEvents* g_creatureEvents;

find this:

Code:
// register creature events
	for(StringVec::iterator it = mType->scriptList.begin(); it != mType->scriptList.end(); ++it)
	{
		if(!registerCreatureEvent(*it))
			std::cout << "[Warning - Monster::Monster] Unknown event name - " << *it << std::endl;
	}

under it place this:

Code:
typedef std::map<std::string, CreatureEvent*> CreatureEventList;
	// register creature events
	CreatureEventList allEvents = g_creatureEvents->getAllCreatureEvents();
	for(CreatureEventList::iterator it = allEvents.begin(); it != allEvents.end(); ++it){
		CreatureEvent* event = it->second;
		if(event->isLoaded() && ( event->getRegister() == "monster" || event->getRegister() == "all") )
			registerCreatureEvent(event->getName());
	}
----------------------------------------------------------------------------------------------------------------

i think this way isn't the best, but...
 
# goto creatureevent.cpp :

[cpp]
std::string tmpStr = asLowerCaseString(str);[/cpp]
paste this
[cpp]
std::string strr;
if(!readXMLString(p, "registerTo", strr) || strr.empty() ){
if((tmpStr != "login") && (tmpStr != "logout"))
std::clog << "[Warning - CreatureEvent::configureEvent] : You havn't register event '" << m_eventName <<"'"<< std::endl;
}
else
m_eventRegister = strr;[/cpp]

My creatureevent.cpp in that part is entirely different, I tried to adapt it but -sadly- I couldn't make it work. (Using 0.3.7~)

this isn't good do in a server with more than 150 players. To run a lua code use like 50x more ram and 5x more your CPU than same code in c++

if your server got like 5000k+ monsters and you register one onThink by monster of course you will get high cpu usage

So this isn't recommended at all :(?
 
I Have Tried this Code and compiled but the result was :Not Working.. in 0.3.7 r5963
 
Well as it says you can now register all monsters + player through creature event.xml

How to ?
You need to include "registerTo" in the xml
XML:
<event type="think" name="monsterThink" registerTo ="monster" event="script" value="look.lua"/> <!-- all monster no players-->

<event type="think" name="playerThink" registerTo ="player" event="script" value="test.lua"/><!-- players no monster-->

<event type="think" name="bothThink" registerTo ="all" event="script" value="move.lua"/><!-- both player & mon-->

You can even make it to none , so you are able to add it manually to monsters or in login
XML:
<event type="think" name="monsterThink" registerTo ="manual" event="script" value="look.lua"/> <!-- you manually register this event-->

Supports : 0.4

Setup:


# goto creatureevent.code :


search for this
Code:
bool CreatureEvents::playerLogin(Player* player)
and in the block of this function search for

Code:
return result;
then paste this before it
Code:
if (result)
    {
        for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it)
        {
            CreatureEvent* event = *it;
            if(event->isLoaded() && ( event->getRegister() == "player" || event->getRegister() == "all") )
                player->registerCreatureEvent(event->getName());
        }

    }
after this
Code:
std::string tmpStr = asLowerCaseString(str);
paste this
Code:
std::string strr;
    if(!readXMLString(p, "registerTo", strr) || strr.empty() ){
        if((tmpStr != "login") && (tmpStr != "logout"))
            std::clog << "[Warning - CreatureEvent::configureEvent] : You havn't register event '" << m_eventName <<"'"<< std::endl;
    }
    else
        m_eventRegister = strr;
------------------------------------------------------------------------------------------------------------------------------------

# goto creatureevent.h :

after this
Code:
CreatureEvent* getEventByName(
paste this
Code:
std::vector<CreatureEvent*> getAllCreatureEvents(){return m_creatureEvents;}
now in the end of file after this
Code:
std::string m_eventName;
paste this
Code:
std::string m_eventRegister;
after this
Code:
const std::string& getName() const {return m_eventName;}
paste this
Code:
const std::string getRegister() const {return m_eventRegister;}

-------------------------------------------------------------------------------------------------------------------------------------

# go to monster.code

under this
Code:
extern Monsters g_monsters;
paste this
Code:
extern CreatureEvents* g_creatureEvents;
find this
Code:
// register creature events
    for(StringVec::iterator it = mType->scriptList.begin(); it != mType->scriptList.end(); ++it)
    {
        if(!registerCreatureEvent(*it))
            std::cout << "[Warning - Monster::Monster] Unknown event name - " << *it << std::endl;
    }
under it place this
Code:
// register creature events
    std::vector<CreatureEvent*> allEvents = g_creatureEvents->getAllCreatureEvents();
    for(std::vector<CreatureEvent*>::const_iterator it = allEvents.begin(); it != allEvents.end(); ++it)
    {
        CreatureEvent* event = *it;
        if(event->isLoaded() && ( event->getRegister() == "monster" || event->getRegister() == "all") )
            registerCreatureEvent(event->getName());
    }



You are done I guess.

rewrite with tags.

( I TRY SEND MESSAGE TO ADMINS FIRST )
 
Hello i need help people, my server is a OTX server and dont have this

std::string tmpStr = asLowerCaseString(str);
if(tmpStr == "login")

i have a

CreatureEventType_t CreatureEvents::getType(const std::string& type)
{
CreatureEventType_t _type = CREATURE_EVENT_NONE;

if(type == "login")


How i can compile this part on my creatureevent? sorry for my bad english, im br.
 
Back
Top