• 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 Creaturescript: onMoveItem(moveItem, frompos, position, cid)

Mock

Mock the bear (MTB)
Joined
Jul 29, 2008
Messages
619
Reaction score
106
Location
Brazil
Worked for TFS 0.3.6

Add it on creaturescripts:

Before:
Code:
bool CreatureEvents::playerLogout(Player* player, bool forceLogout)
Add:
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;
}
Before:
Code:
else if(tmpStr == "kill")
		m_type = CREATURE_EVENT_KILL;
Add:
Code:
else if(tmpStr == "moveitem")
		m_type = CREATURE_EVENT_MOVEITEM;
Before:
Code:
case CREATURE_EVENT_DEATH:
			return "onDeath";
Add:
Code:
case CREATURE_EVENT_MOVEITEM:
    	    return "onMoveItem";
before:
Code:
case CREATURE_EVENT_KILL:
			return "cid, target, lastHit";
add:
Code:
case CREATURE_EVENT_MOVEITEM:
            return "moveItem, frompos, topos, cid";
Before:
uint32_t CreatureEvent::executeLogout(Player* player, bool forceLogout)
add:
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;
	}
}
Now on creaturescript.h

Before:
Code:
uint32_t executePrepareDeath(Creature* creature, DeathList deathList);
Add:
Code:
uint32_t executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos);
Before:
Code:
bool playerLogout(Player* player, bool forceLogout);
Add:
Code:
uint32_t executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos);
Now on game.cpp

Find function bool Game::playerMoveItem(uint32_t playerId, const Position& fromPos,...
Inside it find this:
Code:
if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere))
	{
		player->sendCancelMessage(RET_CANNOTTHROW);
		return false;
	}
And next add it:
Code:
Item* tileItem = NULL;
	if(!g_creatureEvents->executeMoveItems(player,item,mapFromPos, mapToPos)){
  return false;
    }

Done ;)

You can do it:
Lua:
function onMoveItem(moveItem, frompos, position, cid)
     if moveitem.itemid == 6500 then
          doPlayerSendTextMessage(cid,25,'This item is blocked! you cannot move it!')
          return false   
     end
end
Remenber, you cant do it:
if frompos == {x=100,y=100,z=100} then
because frompos return a stackpos, so you have to do it:
if frompos == {x=100,y=100,z=100,stackpos=255} then
 
This work only if item is on map?? I need code from depo To backpack, from bp To depo

Thx for this, rep
 
Last edited:
@Dominik ms
it work to map AND to backack ;D
but. idk about DP and player :S
you never will do it if you never try
@Cybershot
if i, only version 1.0 not 2.0
 
@makr0
a bit
i am better using LUA PHP and GML, c++ is not my best language but i know a bit
 
this works when moving equipped items too?
 
@Cybershot
yes.
@Dominik ms
Do not use doRemoveItem.
doRemove will remove item i old pos.
so return false and do not remove nothing
 
I get 12 errors when trying to compile with latest rev;

g++.exe -c ../creatureevent.cpp -o obj//creatureevent.o -I"include" -D__USE_MYSQL__ -D__USE_SQLITE__ -D__ENABLE_SERVER_DIAGNOSTIC__ -fexpensive-optimizations -O1

../creatureevent.cpp: In member function `uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:118: error: request for member `second' in `*(&it)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::eek:perator-> [with _Iterator = CreatureEvent**, _Container = std::vector<CreatureEvent*, std::allocator<CreatureEvent*> >]()', which is of non-class type `CreatureEvent*'
../creatureevent.cpp:118: error: `CREATURE_EVENT_MOVEITEM' was not declared in this scope
../creatureevent.cpp:119: error: request for member `second' in `*(&it)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::eek:perator-> [with _Iterator = CreatureEvent**, _Container = std::vector<CreatureEvent*, std::allocator<CreatureEvent*> >]()', which is of non-class type `CreatureEvent*'

../creatureevent.cpp: In member function `virtual bool CreatureEvent::configureEvent(xmlNode*)':
../creatureevent.cpp:213: error: `CREATURE_EVENT_MOVEITEM' was not declared in this scope

../creatureevent.cpp: In member function `virtual std::string CreatureEvent::getScriptEventName() const':
../creatureevent.cpp:282: error: `CREATURE_EVENT_MOVEITEM' was not declared in this scope

../creatureevent.cpp: In member function `virtual std::string CreatureEvent::getScriptEventParams() const':
../creatureevent.cpp:338: error: `CREATURE_EVENT_MOVEITEM' was not declared in this scope

../creatureevent.cpp: In member function `uint32_t CreatureEvent::executeMoveItem(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:466: error: `LuaScriptInterface' has not been declared
../creatureevent.cpp:466: error: `pushThing' was not declared in this scope
../creatureevent.cpp:467: error: `LuaScriptInterface' has not been declared

../creatureevent.cpp:467: error: `pushPosition' was not declared in this scope

../creatureevent.cpp:468: error: `LuaScriptInterface' has not been declared

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

Execution terminated
 
Mock you forgot to post this (Also is the help for Grehy)

creatureevent.h

After:
Lua:
CREATURE_EVENT_DEATH,

Paste:
Lua:
CREATURE_EVENT_MOVEITEM,
 
Code:
../creatureevent.cpp: In member function 'uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:117: 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*'

../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*'

../creatureevent.cpp: In member function 'uint32_t CreatureEvent::executeMoveItem(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:465: error: 'LuaScriptInterface' has not been declared

../creatureevent.cpp:466: error: 'LuaScriptInterface' has not been declared
../creatureevent.cpp:467: error: 'LuaScriptInterface' has not been declared

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

Execution terminated

Still getting 8 errors instead of 15(?) after your fix
 
Lua:
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->second->getEventType() == CREATURE_EVENT_MOVEITEM){
			if(!(*it)->second->executeMoveItem(actor,item,frompos,pos))
				return 0;
		}
	}
	return 1;
}

Lua:
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", actor->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;
	}
}
 
8

Code:
../creatureevent.cpp: In member function 'uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:117: 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*'

../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*'

../creatureevent.cpp: In member function 'uint32_t CreatureEvent::executeMoveItem(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:465: error: 'LuaScriptInterface' has not been declared

../creatureevent.cpp:466: error: 'LuaScriptInterface' has not been declared
../creatureevent.cpp:467: error: 'LuaScriptInterface' has not been declared

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

Execution terminated
 
Try this

Lua:
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;
}
 
Nicee And Mock Plis Release Fly System I Loved It And I ReaLY wANT iT ): And Im Sure Im Not The Only One So Please we dont care witch one it is just release it ):

ooh sry for spam xd can someone tell me how to rep? i dont see where D:!

Never Mind I FOund IT D:!
 
Last edited by a moderator:
Try this

Lua:
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;
}

Down to 7 errors :) I appreciate the help so far a lot

Code:
../creatureevent.cpp: In member function 'uint32_t CreatureEvents::executeMoveItems(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:115: error: conversion from 'CreatureEventList' to non-scalar type 'std::vector<CreatureEvent*, std::allocator<CreatureEvent*> >' requested

../creatureevent.cpp: In member function 'uint32_t CreatureEvent::executeMoveItem(Creature*, Item*, const Position&, const Position&)':
../creatureevent.cpp:461: error: 'LuaScriptInterface' has not been declared

../creatureevent.cpp:462: error: 'LuaScriptInterface' has not been declared

../creatureevent.cpp:463: error: 'LuaScriptInterface' has not been declared

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

Execution terminated
 
LuaScriptInterface -> LuaInterface

also that would be 2 errors, not 7. Each line of error report is not necessarily a single error.
 
55ja12.png
 
Back
Top