Por
L3K0T
TUTORIAL BY L3K0T
EXPLICAÇÃO/RESUMO:
Bom galera esse sistema foi fixado por mim e resolvi trazer pra vocês o UPDATE contendo 2 moveitem pra funcionar perfeitamente ao seu jogo, esses sistemas tem a obrigação de parar players que jogam lixo na porta da sua casa, em cima do seu depot, em teleportes, e aonde você não queira. "somente dono, sub, e convidados podem jogar lixo ou mover items da sua casa" é um pacotão completo e revisado que vai evitar engraçadinhos bugar seu server.
lixo no dp vídeo spoiler;;
lixo house vídeo spoiler;;
Tutorial:
1° abra seu creatureevents.cpp com o editor de sua preferencia. "eu uso notepad++"
Ache o TERCEIRO CREATURE_EVENT_PREPAREDEATH;
case CREATURE_EVENT_PREPAREDEATH:
return "cid, deathList";
em baixo coloca:
case CREATURE_EVENT_MOVEITEM:
return "moveItem, frompos, topos, cid";
case CREATURE_EVENT_MOVEITEM2:
return "cid, item, count, toContainer, fromContainer, fromPos, toPos";
ache o SEGUNDO CREATURE_EVENT_PREPAREDEATH:
case CREATURE_EVENT_PREPAREDEATH:
return "onPrepareDeath";
em baixo coloca:
case CREATURE_EVENT_MOVEITEM:
return "onMoveItem";
case CREATURE_EVENT_MOVEITEM2:
return "onMoveItem2";
ache o PRIMEIRO CREATURE_EVENT_PREPAREDEATH:
else if(tmpStr == "preparedeath")
m_type = CREATURE_EVENT_PREPAREDEATH;
em baixo coloca:
else if(tmpStr == "moveitem")
m_type = CREATURE_EVENT_MOVEITEM;
else if(tmpStr == "moveitem2")
m_type = CREATURE_EVENT_MOVEITEM2;
ache:
bool CreatureEvents::playerLogout(Player* player, bool forceLogout)
{
//fire global event if is registered
bool result = true;
for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it)
{
if((*it)->getEventType() == CREATURE_EVENT_LOGOUT && (*it)->isLoaded()
&& !(*it)->executeLogout(player, forceLogout) && result)
result = false;
}
return result;
}
em baixo coloca: ATENÇÃO PRA TFS 0.4 USE ESSE ABAIXO
uint32_t CreatureEvent::executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack)
{
//onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos)
if(m_interface->reserveEnv())
{
ScriptEnviroment* env = m_interface->getEnv();
if(m_scripted == EVENT_SCRIPT_BUFFER)
{
env->setRealPos(player->getPosition());
std::stringstream scriptstream;
scriptstream << "local cid = " << env->addThing(player) << std::endl;
env->streamThing(scriptstream, "item", item, env->addThing(item));
scriptstream << "local count = " << count << std::endl;
env->streamThing(scriptstream, "toContainer", toContainer, env->addThing(toContainer));
env->streamThing(scriptstream, "fromContainer", fromContainer, env->addThing(fromContainer));
env->streamPosition(scriptstream, "fromPos", fromPos, fstack);
env->streamPosition(scriptstream, "toPos", toPos, 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", player->getName().c_str());
env->setEvent(desc);
#endif
env->setScriptId(m_scriptId, m_interface);
env->setRealPos(player->getPosition());
lua_State* L = m_interface->getState();
m_interface->pushFunction(m_scriptId);
lua_pushnumber(L, env->addThing(player));
LuaInterface::pushThing(L, item, env->addThing(item));
lua_pushnumber(L, count);
LuaInterface::pushThing(L, toContainer, env->addThing(toContainer));
LuaInterface::pushThing(L, fromContainer, env->addThing(fromContainer));
LuaInterface::pushPosition(L, fromPos, fstack);
LuaInterface::pushPosition(L, toPos, 0);
bool result = m_interface->callFunction(7);
m_interface->releaseEnv();
return result;
}
}
else
{
std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl;
return 0;
}
}
uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it)
{
if((*it)->getEventType() == CREATURE_EVENT_MOVEITEM)
{
if(!(*it)->executeMoveItem(actor, item, frompos, pos))
return 0;
}
}
return 1;
}
uint32_t CreatureEvent::executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
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);
LuaInterface::pushThing(L, item, env->addThing(item));
LuaInterface::pushPosition(L, frompos, 0);
LuaInterface::pushPosition(L, pos, 0);
lua_pushnumber(L, env->addThing(actor));
bool result = m_interface->callFunction(4);
m_interface->releaseEnv();
return result;
}
}
else
{
std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl;
return 0;
}
}
ATENÇÃO PRA TFS 0.3.6 USE ESSE ABAIXO
uint32_t CreatureEvent::executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack)
{
//onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos)
if(m_interface->reserveEnv())
{
ScriptEnviroment* env = m_interface->getEnv();
if(m_scripted == EVENT_SCRIPT_BUFFER)
{
env->setRealPos(player->getPosition());
std::stringstream scriptstream;
scriptstream << "local cid = " << env->addThing(player) << std::endl;
env->streamThing(scriptstream, "item", item, env->addThing(item));
scriptstream << "local count = " << count << std::endl;
env->streamThing(scriptstream, "toContainer", toContainer, env->addThing(toContainer));
env->streamThing(scriptstream, "fromContainer", fromContainer, env->addThing(fromContainer));
env->streamPosition(scriptstream, "fromPos", fromPos, fstack);
env->streamPosition(scriptstream, "toPos", toPos, 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", player->getName().c_str());
env->setEvent(desc);
#endif
env->setScriptId(m_scriptId, m_interface);
env->setRealPos(player->getPosition());
lua_State* L = m_interface->getState();
m_interface->pushFunction(m_scriptId);
lua_pushnumber(L, env->addThing(player));
LuaScriptInterface::pushThing(L, item, env->addThing(item));
lua_pushnumber(L, count);
LuaScriptInterface::pushThing(L, toContainer, env->addThing(toContainer));
LuaScriptInterface::pushThing(L, fromContainer, env->addThing(fromContainer));
LuaScriptInterface::pushPosition(L, fromPos, fstack);
LuaScriptInterface::pushPosition(L, toPos, 0);
bool result = m_interface->callFunction(7);
m_interface->releaseEnv();
return result;
}
}
else
{
std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl;
return 0;
}
}
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;
}
uint32_t CreatureEvent::executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos)
{
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::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl;
return 0;
}
}
2° agora em creatureevetns.h
Ache:
CREATURE_EVENT_PREPAREDEATH,
em baixo coloca:
CREATURE_EVENT_MOVEITEM,
CREATURE_EVENT_MOVEITEM2,
ache:
uint32_t executePrepareDeath(Creature* creature, DeathList deathList);
em baixo coloca:
uint32_t executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos);
uint32_t executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack);
ache:
bool playerLogout(Player* player, bool forceLogout);
em baixo coloca:
uint32_t executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos);
3° agora em game.cpp
ache:
if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere))
{
player->sendCancelMessage(RET_CANNOTTHROW);
return false;
}
ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL);
if(ret == RET_NOERROR)
return true;
player->sendCancelMessage(ret);
return false;
}
troque por:
if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere))
{
player->sendCancelMessage(RET_CANNOTTHROW);
return false;
}
bool success = true;
CreatureEventList moveitemEvents = player->getCreatureEvents(CREATURE_EVENT_MOVEITEM2);
for(CreatureEventList::iterator it = moveitemEvents.begin(); it != moveitemEvents.end(); ++it)
{
Item* toContainer = toCylinder->getItem();
Item* fromContainer = fromCylinder->getItem();
if(!(*it)->executeMoveItem2(player, item, count, fromPos, toPos, (toContainer ? toContainer : 0), (fromContainer ? fromContainer : 0), fromStackpos) && success)
success = false;
}
if(!success)
return false;
if(!g_creatureEvents->executeMoveItems(player, item, mapFromPos, mapToPos))
return false;
ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL);
if(ret == RET_NOERROR)
return true;
player->sendCancelMessage(ret);
return false;
}
Feito isso é só compilar sua source no modo REDUILD pra que as funções funcione.
NO SERVIDOR:
Agora no seu otserv vai em creturescripts, vai no arquivo login.lua e registra e event:
registerCreatureEvent(cid, "MoveItem")
registerCreatureEvent(cid, "MoveItem2")
em creaturescript .xml
<event type="moveitem" name="MoveItem" event="script" value="houseprotecao.lua"/>
<event type="moveitem2" name="MoveItem2" event="script" value="moveitem2.lua"/>
script do houseprotecao.lua "move item1
function onMoveItem(moveItem, frompos, position, cid)
if position.x == CONTAINER_POSITION then
return true
end
local house = getHouseFromPos(frompos) or getHouseFromPos(position) --correção 100%
if type(house) == "number" then
local owner = getHouseOwner(house)
if owner == 0 then
return false, doPlayerSendCancel(cid, "Isso não é Possível.")
end
if owner ~= getPlayerGUID(cid) then
local sub = getHouseAccessList(house, 0x101):explode("\n")
local guest = getHouseAccessList(house, 0x100):explode("\n")
local isInvited = false
if (#sub > 0) and isInArray(sub, getCreatureName(cid)) then
isInvited = true
end
if (#guest > 0) and isInArray(guest, getCreatureName(cid)) then
isInvited = true
end
if not isInvited then
return false, doPlayerSendCancel(cid, "Desculpe, você não está invitado.")
end
end
end
return true
end
script do moveitem2.lua "moveitem2
local depottiles = {} --piso pra n jogar
local depots = {2589} --id dos dps
local group = 3 --id dos group 6 é todos.
local function checkIfThrow(pos,topos)
if topos.x == 0xffff then
return false
end
local thing = getThingFromPos(pos)
if isInArray(depottiles,thing.itemid) then
if not isInArea(topos,{x=pos.x-1,y=pos.y-1,z=pos.z},{x=pos.x+1,y=pos.y+1, z=pos.z}) then
return true
end
else
for i = 1, #depots do
if depots[i] == getTileItemById(topos,depots[i]).itemid or getTileInfo(topos).actionid == 7483 then
return true
end
end
end
return false
end
function onMoveItem2(cid, item, count, toContainer, fromContainer, fromPos, toPos)
if isPlayer(cid) then
local pos = getThingPos(cid)
if getPlayerGroupId(cid) > group then
return true
end
if checkIfThrow({x=pos.x,y=pos.y,z=pos.z,stackpos=0},toPos) then
doPlayerSendCancel(cid,"Não jogue item ai!!")
doSendMagicEffect(getThingPos(cid),CONST_ME_POFF)
return false
end
end
return true
end
OUTROS:
bloquear item usando moveitem2
if moveItem.itemid == IDDOITEM then
doPlayerSendTextMessage(cid,25,'você bloqueou um item para não move no jogo!')
return false
end
ajudei?? REP+
CRÉDITOS:
@L3K0T
Fir3element
Summ
Wise
GOD Wille
BUGs mesmo adicionado está jogando item em cima do depot, solta o puff de efeito mais não barra, bom isso pode ocorrer por questão de ter coisas adicionadas no game.cpp como o "push delay item" por exemplo e para resolver isso, tive que deixar assim.
if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere))
{
player->sendCancelMessage(RET_CANNOTTHROW);
return false;
}
// Anti-Push feature Prevention System by Xampy //
/* Corrigido ElfBot Anti-Push (Anti-Crash) */
if(g_config.getBool(ConfigManager::ANTI_PUSH)){ //included by Yan Liima
std::string antiPushItems = g_config.getString(ConfigManager::ANTI_PUSH_ITEMS);
IntegerVec tmpVec = vectorAtoi(explodeString(antiPushItems, ","));
if(tmpVec[0] != 0){
for(IntegerVec::iterator it = tmpVec.begin(); it != tmpVec.end(); ++it){
if(item->getID() == uint32_t(*it) && player->hasCondition(CONDITION_EXHAUST, 1)){
player->sendTextMessage(MSG_STATUS_SMALL, "Please wait a few seconds to move this item.");
return false;
}
}
}
}
int32_t delay = g_config.getNumber(ConfigManager::ANTI_PUSH_DELAY); //by Yan Liima
if(Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_EXHAUST, delay, 0, false, 1))
player->addCondition(condition);
/* end */
bool success = true;
CreatureEventList moveitemEvents = player->getCreatureEvents(CREATURE_EVENT_MOVEITEM2);
for(CreatureEventList::iterator it = moveitemEvents.begin(); it != moveitemEvents.end(); ++it)
{
Item* toContainer = toCylinder->getItem();
Item* fromContainer = fromCylinder->getItem();
if(!(*it)->executeMoveItem2(player, item, count, fromPos, toPos, (toContainer ? toContainer : 0), (fromContainer ? fromContainer : 0), fromStackpos) && success)
success = false;
}
if(!success)
return false;
if(!g_creatureEvents->executeMoveItems(player, item, mapFromPos, mapToPos))
return false;
ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL);
if(ret == RET_NOERROR)
return true;
player->setNextAction(OTSYS_TIME() + g_config.getNumber(ConfigManager::ACTIONS_DELAY_INTERVAL) - 10);
return true;
player->sendCancelMessage(ret);
return false;
}
// Anti-Push feature Prevention System by Xampy //