Ir para conteúdo

UPDATE 3: Moveitem + Antipush + Anti-Crash Elf Bot - Bug Fixes - TFS 0.4 11/04/2024

Featured Replies

Postado
  • Diretor
  • Este é um post popular.

huepix9_10_111551.png.88526652870dc8bec26af7285b9566ba.png.b10f8027f16d174ed30e52adda1dda38.png

 

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

 

 

 

 

  • Respostas 48
  • Visualizações 6.6k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • 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çõe

  • Spooky Ghost
    Spooky Ghost

    Opa, já vou deixando meu rep porque parece bem interessante, hehe.

  • Muito bom! Tá inspirado em mano kkk 

Posted Images

Postado
26 minutos atrás, L3K0T disse:

EXPLICAÇÃO/RESUMO

Bom galera esse sistema foi fixado por mim e resolvi trazer pra vocês o UPDATE dele pra funcionar perfeitamente ao seu jogo, esse sistema tem a obrigação de parar players que jogam lixo na porta da sua casa. "somente dono, sub, e convidados podem jogar lixo ou mover items."

 

 

C++ SuperCoder 1.3 Baixar APK para Android - Aptoide

TUTORIAL BY L3K0T

1° abra seu creatureevents.cpp com o editor de sua preferencia. "eu uso notepad++"

 

ache:


case CREATURE_EVENT_PREPAREDEATH:
			return "cid, deathList";

em baixo coloca:


case CREATURE_EVENT_MOVEITEM:
			return "moveItem, frompos, topos, cid";

 

 

ache:


case CREATURE_EVENT_PREPAREDEATH:
			return "onPrepareDeath";

em baixo coloca:


case CREATURE_EVENT_MOVEITEM:
           return "onMoveItem";

 

ache:


else if(tmpStr == "preparedeath")
		m_type = CREATURE_EVENT_PREPAREDEATH;

em baixo coloca:


else if(tmpStr == "moveitem")
		m_type = CREATURE_EVENT_MOVEITEM;

 

 

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 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 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);

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

 

 

 agora em creatureevetns.h

 

Ache:


CREATURE_EVENT_PREPAREDEATH,

em baixo coloca:


CREATURE_EVENT_MOVEITEM,

 

ache:


uint32_t executePrepareDeath(Creature* creature, DeathList deathList);

em baixo coloca:


uint32_t executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos);

 

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;
	}
  
	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.

 

Agora no seu otserv vai em creturescripts, vai no arquivo login.lua e registra e event:


registerCreatureEvent(cid, "MoveItem")

em creaturescript .xml


<event type="moveitem" name="MoveItem" event="script" value="houseprotecao.lua"/>

script do houseprotecao.lua

 


function onMoveItem(moveItem, frompos, position, cid)
    if position.x == CONTAINER_POSITION then
        return true
    end

    local house = getHouseFromPos(position)
    if type(house) == 'number' then
        local owner = getHouseOwner(house)   
        if owner == 0 then
            return false, doPlayerSendCancel(cid, 'Desculpe, isso não é possivel.')
        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, isso não é possivel, pois você não está convidado')
            end
        end
    end
    return true
end

CRÉDITOS:

@L3K0T

Fir3element

Summ

 

 

 

 

 

 

Muito bom! Tá inspirado em mano kkk 

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo