Por
L3K0T
TUTORIAL BY L3K0T PT~EN
Olá pessoal, trago a vocês uma atualização que fiz no sistema, contendo 3 novas funcionalidades de movimentação de itens e uma proteção contra Elf Bot. Estas adições foram cuidadosamente implementadas para aperfeiçoar a experiência de jogo e manter a integridade do seu servidor.
As novas funcionalidades têm a função vital de impedir que jogadores deixem itens indesejados em locais inapropriados, como na entrada de sua casa, em cima de seus depósitos ou em teleportes. Agora, apenas proprietários, subproprietários e convidados têm permissão para manipular itens nesses locais.
Este pacote de atualização foi meticulosamente revisado para evitar abusos por parte de jogadores mal-intencionados e garantir um ambiente de jogo justo e equilibrado para todos os usuários.
Iniciando o Tutorial
1Abra o arquivo "creatureevents.cpp" com o editor de sua preferência. Eu pessoalmente recomendo o Notepad++.
Em creatureevents.cpp:
return "onPrepareDeath";
Adicione abaixo:
case CREATURE_EVENT_MOVEITEM:
return "onMoveItem";
case CREATURE_EVENT_MOVEITEM2:
return "onMoveItem2";
Em:
return "cid, deathList";
Adicione abaixo:
case CREATURE_EVENT_MOVEITEM:
return "moveItem, frompos, topos, cid";
case CREATURE_EVENT_MOVEITEM2:
return "cid, item, count, toContainer, fromContainer, fromPos, toPos";
Em:
m_type = CREATURE_EVENT_PREPAREDEATH;
Adicione abaixo:
else if(tmpStr == "moveitem")
m_type = CREATURE_EVENT_MOVEITEM;
else if(tmpStr == "moveitem2")
m_type = CREATURE_EVENT_MOVEITEM2;
Procure por:
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;
}
Adicione abaixo:
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)
{
if(!(*it)->executeMoveItem(actor, item, frompos, pos))
return 0;
}
}
return 1;
}
Em:
bool CreatureEvents::playerLogin(Player* player)
{
//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_LOGIN && (*it)->isLoaded()
&& !(*it)->executeLogin(player) && result)
result = false;
}
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());
}
}
return result;
}
Adicione Abaixo:
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);
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;
}
}
uint32_t CreatureEvent::executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack)
{
//onMoveItem2(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);
//lua_pushnumber(L, env->addThing(actor));
bool result = m_interface->callFunction(7);
m_interface->releaseEnv();
return result;
}
}
else
{
std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl;
return 0;
}
}
Agora em em creatureevents.h:
CREATURE_EVENT_PREPAREDEATH,
Adicione abaixo:
CREATURE_EVENT_MOVEITEM,
CREATURE_EVENT_MOVEITEM2
Em:
uint32_t executePrepareDeath(Creature* creature, DeathList deathList);
Adicione abaixo:
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);
Em:
bool playerLogout(Player* player, bool forceLogout);
Abaixo adicone também
uint32_t executeMoveItems(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);
Agora em em game.cpp:
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;
}
Altere para:
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_config.getBool(ConfigManager::ANTI_PUSH)) {
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);
if (Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_EXHAUST, delay, 0, false, 1))
player->addCondition(condition);
if (!g_creatureEvents->executeMoveItems(player, item, mapFromPos, mapToPos))
return false;
ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL);
if (ret != RET_NOERROR) {
player->sendCancelMessage(ret);
return false;
}
player->setNextAction(OTSYS_TIME() + g_config.getNumber(ConfigManager::ACTIONS_DELAY_INTERVAL) - 10);
return true;
}
Agora em configmanager.h
ADMIN_ENCRYPTION_DATA
Adicione abaixo:
ANTI_PUSH_ITEMS,
em:
STAMINA_DESTROY_LOOT,
Adicione abaixo:
ANTI_PUSH_DELAY,
em:
ADDONS_PREMIUM,
Adicione abaixo:
ANTI_PUSH
Agora você pode compilar a Source.
Configurando no servidor:
Abra seu config.lua do servidor e adicione isso dentro qualquer lugar:
-- Anti-Push
useAntiPush = true
antiPushItems = "2148,2152,2160,3976"
antiPushDelay = 500
Navegue até o diretório 'creaturescripts' e localize o arquivo 'login.lua'.
em resgistros de eventos adicione:
login.lua
registerCreatureEvent(cid, "MoveItem")
registerCreatureEvent(cid, "MoveItem2")
Agora abra o aquivo creaturescript .xml
<event type="moveitem" name="MoveItem" event="script" value="houseprotecao.lua"/>
<event type="moveitem2" name="MoveItem2" event="script" value="moveitem2.lua"/>
Crie um novo arquivo lua em scripts com o nome houseprotecao.lua e adicione isso:
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
Crie um novo arquivo lua em scripts com o nome moveitem2.lua e adicione isso abaixo:
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
ajudei?? REP+
CRÉDITOS:
@L3K0T
Fir3element
Summ
Wise
GOD Wille
Yan Lima
Posts Recomendados
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.