• 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!

Compiling onmoveitem

knightxd

Member
Joined
Feb 21, 2009
Messages
211
Reaction score
16
Location
Rio de Janeiro
im trying to compile trunk 3676 tfs 0.4.. i tryed to add mock's function onmoveitem..

this one: onmoveitem

when i was using it on 0.3.6 pl 1 it returns me no error, but now, when i tryed to add it on 0.4 it replyes me a lot of errors, first they were 8, then i changed the 3 LuaScriptInterface to LuaInterface here:

Code:
uint32_t CreatureEvent::executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
	//onMoveItem(moveItem, frompos, position, cid)
	if(m_interface->reserveEnv())
	{
		ScriptEnviroment* env = m_interface->getEnv();
		if(m_scripted == EVENT_SCRIPT_BUFFER)
		{
			env->setRealPos(pos);
			std::stringstream scriptstream;

			env->streamThing(scriptstream, "moveItem", item, env->addThing(item));
			env->streamPosition(scriptstream, "position", frompos, 0);

			env->streamPosition(scriptstream, "position", pos, 0);
			scriptstream << "local cid = " << env->addThing(actor) << std::endl;

			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", player->getName().c_str());
			env->setEventDesc(desc);
			#endif

			env->setScriptId(m_scriptId, m_interface);
			env->setRealPos(pos);

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

			LuaScriptInterface::pushThing(L, item, env->addThing(item));
			LuaScriptInterface::pushPosition(L, frompos, 0);
			LuaScriptInterface::pushPosition(L, pos, 0);

			lua_pushnumber(L, env->addThing(actor));
			bool result = m_interface->callFunction(4);
			m_interface->releaseEnv();
			return result;
		}
	}
	else
	{
		std::cout << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl;
		return 0;
	}
}

and i get then some few other errors, after that, i changed

Code:
uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
	// fire global event if is registered
	for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it)
	{
		if(it->second->getEventType() == CREATURE_EVENT_MOVEITEM){
			if(!it->second->executeMoveItem(actor,item,frompos,pos))
				return 0;
		}
	}
	return 1;
}

to this one

Code:
uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
	// fire global event if is registered
	CreatureEventList moveItem = actor->getCreatureEvents(CREATURE_EVENT_MOVEITEM);
	for(CreatureEventList::iterator it = moveItem.begin(); it != moveItem.end(); ++it)
		if(!(*it)->executeMoveItem(actor,item,frompos,pos))
			return 0;
}

and now i'm just getting 3 errors.. this ones..

Code:
  In member function 'uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)': 

116 C:\Users\Julio\Desktop\trunk.r3676\creatureevent.cpp conversion from 'CreatureEventList' to non-scalar type 'std::vector<CreatureEvent*, std::allocator<CreatureEvent*> >' requested 

116 C:\Users\Julio\Desktop\trunk.r3676\creatureevent.cpp *** [obj//creatureevent.o] Error 1

i think the problem is here
Code:
CreatureEventList moveItem = actor->getCreatureEvents(CREATURE_EVENT_MOVEITEM);

but i dunno how to fix that, anyone can help me? thanks
 
[cpp]if(!(*it)->executeMoveItem(actor,item,frompos,pos))[/cpp]
to
[cpp]if (!it->second->executeMoveItem(actor,item,frompos,pos))[/cpp]
 
changing it i got 4 errors instead of 3... this ones..

Code:
../creatureevent.cpp: In member function 'uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:116: error: conversion from 'CreatureEventList' to non-scalar type 'std::vector<CreatureEvent*, std::allocator<CreatureEvent*> >' requested
../creatureevent.cpp:118: error: request for member 'second' in '* it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> [with _Iterator = CreatureEvent**, _Container = std::vector<CreatureEvent*, std::allocator<CreatureEvent*> >]()', which is of non-class type 'CreatureEvent*'

mingw32-make: *** [obj//creatureevent.o] Error 1

the lines that return errors are 116 and 118.. theyr content are:
116 = CreatureEventList moveItem = actor->getCreatureEvents(CREATURE_EVENT_MOVEITEM);
118 = if (!it->second->executeMoveItem(actor,item,frompos,pos))

;/
 
you don't need this:
[cpp]CreatureEventList moveItem = actor->getCreatureEvents(CREATURE_EVENT_MOVEITEM);[/cpp]
replace this:
[cpp] for(CreatureEventList::iterator it = moveItem.begin(); it != moveItem.end(); ++it)
if(!(*it)->executeMoveItem(actor,item,frompos,pos))
[/cpp]
with this:
[cpp]for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) {
if((*it)->getEventType == CREATURE_EVENT_MOVEITEM && (*it)->isLoaded() && !(*it)->executeMoveItem(actor,item,frompos,pos))
return 0;
}[/cpp]
 
i made what u said, changed this:

[CPP]uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
// fire global event if is registered
CreatureEventList moveItem = actor->getCreatureEvents(CREATURE_EVENT_MOVEITEM);
for(CreatureEventList::iterator it = moveItem.begin(); it != moveItem.end(); ++it)
if(!(*it)->executeMoveItem(actor,item,frompos,pos))
return 0;
}[/CPP]

to

[CPP]uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
// fire global event if is registered
for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) {
if((*it)->getEventType == CREATURE_EVENT_MOVEITEM && (*it)->isLoaded() && !(*it)->executeMoveItem(actor,item,frompos,pos))
return 0;
}
return 0;
}[/CPP]

i got this errors..

../creatureevent.cpp: In member function 'uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:117: error: no match for 'operator==' in 'it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::eek:perator* [with _Iterator = CreatureEvent**, _Container = std::vector<CreatureEvent*, std::allocator<CreatureEvent*> >]()->CreatureEvent::getEventType == (CreatureEventType_t)26u'

mingw32-make: *** [obj//creatureevent.o] Error 1
 
using

[cpp]uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
// fire global event if is registered
for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) {
if((*it)->getEventType() == CREATURE_EVENT_MOVEITEM && (*it)->isLoaded() && !(*it)->executeMoveItem(actor,item,frompos,pos))
return 0;
}
return 0;
}[/cpp]

it worked but now i can't move any item... i think its because the both return falses.. i'll give it a check without them, latter i edit my post.

edit; as i said, the "return 0;" was making every item impossible to move, here its the fix

[cpp]uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
// fire global event if is registered
for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) {
if((*it)->getEventType() == CREATURE_EVENT_MOVEITEM && (*it)->isLoaded() && !(*it)->executeMoveItem(actor,item,frompos,pos))
return 0;
}
}[/cpp]

solved ~ close plz
 
Last edited:
Back
Top