Ir para conteúdo
  • Cadastre-se

C++ Otimizado: AutoLoot in Sources for Otx(2 ou menor)


Posts Recomendados

  • 2 weeks later...

Opa amigo beleza, obrigado pelo sistema, ja adicionei no meu otx 2.4. Porem vale ressaltar que troquei

unsigned long lootListSize; -- > uint64_t lootListSize;

e o comando "remove" nao esta funcionado para min

 

 

void Player::removeAutoLoot(uint16_t id) {
	if(checkAutoLoot(id)) {
		return;
	}
	AutoLoot.remove(id);
}

 

tentei colocar

 

AutoLoot.erase(id);

 

mas deu erro rs.

Editado por jeanferson
corrigir (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

O erase tem q usar iterator, tente usa assim

void Player::removeAutoLoot(uint16_t id) {
	if(checkAutoLoot(id)) {
		return;
	}
	std::list<uint16_t>::iterator it = AutoLoot.begin();
    for(; it != AutoLoot.end(); ++it) {
    	if((*it) == id) {  
			AutoLoot.remove(it);
      		break;
    	}
    }
}

 

caso de erro tbm na parte do monsters.cpp olha os comentários no post da tfs 0.4 que postei a solução. 

 

@edit

Formatação saiu bugada q tô no celular mas dá uma ajeitada aí kkk

Discord: Naze#3578

 

Ter Linux Dentro de Windows com Acesso 'localhost' para testes e +

AutoLoot Otimizado Direto na Source (tfs 0.4/otx)

 

// Pirataria é crime, original é roubo, compartilhar é legal.

 

tumblr_muk78tEwDQ1qah4nko1_500.gif

Link para o post
Compartilhar em outros sites

Opa amigo, fiz uns testes aqui e percebi que o problema estava na checagem também. Mas de resto está tudo certo.

 

void Player::removeAutoLoot(uint16_t id) {
	if(!checkAutoLoot(id))
		return;
	
	for(std::list<uint16_t>::iterator it = AutoLoot.begin(); it != AutoLoot.end(); ++it) {
		if((*it) == id) {
		AutoLoot.erase(it); 
			break;
		}
	}	
}

 

 

if(params[0] == "remove") {
		std::stringstream remove, err;
		uint8_t removeCount = 0, errCount = 0;
		std::stringstream ss;
		for(StringVec::iterator it = params.begin(); it != params.end(); ++it) {
			if((*it) == "remove") {
				continue;
			}
			char name[150];
			sprintf(name, "%s", (*it).c_str());
			int len = strlen(name);
			for (int i = 0, pos = 0; i < len; i++, pos++) {
				if (name[0] == ' '){
					pos++;
				}
				name[i] = name[pos];
			}
			int32_t itemId = Item::items.getItemIdByName(name);
			if(player->checkAutoLoot(itemId)) {
				if(itemId > 0) {
					std::string str = removeCount > 0 ? ", " : "";
					++removeCount;
					remove << str << name;
					player->removeAutoLoot(itemId);
					continue;
				}
			}
			std::string str = errCount > 0 ? ", " : "";
			++errCount;
			err << str << name;
		}
		ss << "AutoLoot-> Removidos: " << ((remove.str() == "") ? "Nenhum" : remove.str()) << ". Erros: " << ((err.str() == "") ? "Nenhum" : err.str()) << ".";
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, ss.str());
		return true;
	}

 

Link para o post
Compartilhar em outros sites

boa se funciono ta blz, agr q percebi realmente erro meu, pois check retorna true se ta na lista tbm, vou corrigir no post depois. 

Discord: Naze#3578

 

Ter Linux Dentro de Windows com Acesso 'localhost' para testes e +

AutoLoot Otimizado Direto na Source (tfs 0.4/otx)

 

// Pirataria é crime, original é roubo, compartilhar é legal.

 

tumblr_muk78tEwDQ1qah4nko1_500.gif

Link para o post
Compartilhar em outros sites
  • 2 weeks later...
  • 3 weeks later...
Em 25/10/2020 em 14:56, Naze disse:

    Uns dos problemas das maiorias dos otserv casual que estão online é o autoloot, alguns com erros e defeito na checagem dos containers e sempre consumindo muito por ser em lua fazendo checagens de tile, corpo, itens e etc. Por isso decidi da uma contribuição a essa comunidade que me evoluiu bastante um autoloot diretamente na source na função que insere os itens no corpo, otimizando em 100% na hr da entrega do item, e não tendo problemas ocasionais como corpos sobre corpos ou varias bags.

 

     Esse sistema já é bem comum quando comprado, mas gratuito acredito que ainda não tinha disponível, então fiz esse totalmente do 0 na source tfs 0.4 rev 3999 (do yan) e passei para Otx corrigindo alguns erros de compatibilidade.

    

    Atenção na instalação! Qualquer problema pra compilar que envolva as linhas presente no código verifique novamente se instalou corretamente antes de pedir ajuda para evitar flood. Qualquer bug, erro ou mal funcionamento encontrado pode postar que estarei corrigindo, mas não irei customizar a seu agrado, você consegue fazer isso sozinho com atenção e calma, e se precisa de ajuda é só posta as duvidas.

 

Imagens do Sistema:

  Ocultar conteúdo

autoloot3.PNGautoloot.PNGautoloot.PNGautoloot2.PNG

 

Características: 


-> Otimizado executando apenas funções necessarias
-> Comandos simples e praticos
  -> !autoloot on/off  //Autoloot estara sempre ligado, e caso queria desliga use '!autoloot off'
  -> !autoloot bank/bag //Define para onde ira o dinheiro coletado, direto banco ou no inventario
  -> !autoloot list //Lista todos itens adicionados para coleta
  -> !autoloot clear/clean //Remove todos itens da lista
  -> !autoloot add, name item, name item, ... //Adiciona itens na lista, podendo adicionar quantos quiser de uma vez. Ele retorna um messagem dizendo os itens que foram adicionados e os que deram erro e não foram adicionados, talvez por escrito errado, ja existente na lista, na lista de bloquados, etc.
  -> !autoloot remove, item name, item name, ... //Remove itens da lista, com a mesma logica do add.
-> Opções configuravel pelo Config.lua
  -> AutoLoot_MoneyIDs //IDs dos Itens Moedas do servidor como gold coins, platinium coins, crystal coins.
  -> AutoLoot_BlockIDs //IDs dos itens bloqueados para autoloot
  -> AutoLoot_MaxItem //Quantidade maxima de itens para adicionar a lista
-> Sistema livres de bugs ou logs de erros.

 

Instalação:

Toda instalação será feita na source, exceto por 1 linha em talkactions.xml e 3 variáveis no config.lua

 

Otx :

  Mostrar conteúdo oculto

 

Localize no arquivo "configmanager.h" os enum de string:



enum string_config_t
		{
			DUMMY_STR = 0,
			CONFIG_FILE,
			MAP_NAME,
			HOUSE_RENT_PERIOD,

 

E adicione:



enum string_config_t
		{
			AUTOLOOT_BLOCKIDS, //autoloot by naze#3578
			AUTOLOOT_MONEYIDS, //autoloot by naze#3578
			DUMMY_STR = 0,
			CONFIG_FILE,
			MAP_NAME,
			HOUSE_RENT_PERIOD,

 

No mesmo arquivo localize o enum de number:



enum number_config_t
		{
			LOGIN_TRIES = 0,
			RETRY_TIMEOUT,
			LOGIN_TIMEOUT,
			LOGIN_PORT,

 

E adicione:



enum number_config_t
		{
			AUTOLOOT_MAXITEM, //autoloot by naze#3578
			LOGIN_TRIES = 0,
			RETRY_TIMEOUT,
			LOGIN_TIMEOUT,
			LOGIN_PORT,

 

Localize no arquivo "configmanager.cpp" :



	m_confString[MAP_AUTHOR] = getGlobalString("mapAuthor", "Unknown");
	m_confNumber[LOGIN_TRIES] = getGlobalNumber("loginTries", 3);

 

 

E adicione:



	m_confString[AUTOLOOT_BLOCKIDS] = getGlobalString("AutoLoot_BlockIDs", "");	//autoloot by naze#3578
	m_confString[AUTOLOOT_MONEYIDS] = getGlobalString("AutoLoot_MoneyIDs", "2148;2152;2160"); //autoloot by naze#3578
	m_confNumber[AUTOLOOT_MAXITEM] = getGlobalNumber("AutoLoot_MaxItem", 100); //autoloot by naze#3578
	m_confString[MAP_AUTHOR] = getGlobalString("mapAuthor", "Unknown");
	m_confNumber[LOGIN_TRIES] = getGlobalNumber("loginTries", 3);

 

Localize no arquivo "iologindata.cpp" :



//load storage map
	query.str("");
	query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID();
	if((result = db->storeQuery(query.str())))
	{
		do
			player->setStorage(result->getDataString("key"), result->getDataString("value"));
		while(result->next());
		result->free();
	}

 

E adicione a baixo :



	//load autoloot
	query.str("");
    query << "SELECT `autoloot_list` FROM `player_autoloot` WHERE `player_id` = " << player->getGUID();
    if ((result = db->storeQuery(query.str()))) {
        unsigned long lootListSize;
        const char* autoLootList = result->getDataStream("autoloot_list", lootListSize);
        // PropStream &propStream;
		PropStream propStream;
        propStream.init(autoLootList, lootListSize);

        uint16_t value;
        uint16_t item = propStream.getType<uint16_t>(value);
        while (item) {
            player->addAutoLoot(value);
            item = propStream.getType<uint16_t>(value);
        }
    }
	player->updateStatusAutoLoot(true);
	std::string msg = g_config.getString(ConfigManager::AUTOLOOT_MONEYIDS);
	StringVec strVector = explodeString(msg, ";");
	for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it) {
		uint16_t id = atoi((*it).c_str());
		player->addAutoLoot(id);
	}

 

ficando dessa forma:

  Mostrar conteúdo oculto











	//load storage map
	query.str("");
	query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID();
	if((result = db->storeQuery(query.str())))
	{
		do
			player->setStorage(result->getDataString("key"), result->getDataString("value"));
		while(result->next());
		result->free();
	}

	//load autoloot
	query.str("");
    query << "SELECT `autoloot_list` FROM `player_autoloot` WHERE `player_id` = " << player->getGUID();
    if ((result = db->storeQuery(query.str()))) {
        unsigned long lootListSize;
        const char* autoLootList = result->getDataStream("autoloot_list", lootListSize);
        // PropStream &propStream;
		PropStream propStream;
        propStream.init(autoLootList, lootListSize);

        uint16_t value;
        uint16_t item = propStream.getType<uint16_t>(value);
        while (item) {
            player->addAutoLoot(value);
            item = propStream.getType<uint16_t>(value);
        }
    }
	player->updateStatusAutoLoot(true);
	std::string msg = g_config.getString(ConfigManager::AUTOLOOT_MONEYIDS);
	StringVec strVector = explodeString(msg, ";");
	for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it) {
		uint16_t id = atoi((*it).c_str());
		player->addAutoLoot(id);
	}

 

 

No mesmo arquivo localize :



	query.str("");
	//save vip list
	if(!g_config.getBool(ConfigManager::VIPLIST_PER_PLAYER))
		query << "DELETE FROM `account_viplist` WHERE `account_id` = " << player->getAccount() << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID);
	else
		query << "DELETE FROM `player_viplist` WHERE `player_id` = " << player->getGUID();

	if(!db->query(query.str()))
		return false;

e acima adicione: 



//save autoloot
	query.str("");
	query << "DELETE FROM `player_autoloot` WHERE `player_id` = " << player->getGUID();
	if(!db->query(query.str()))
		return false;

	PropWriteStream PWS_AutoLoot;
	std::list<uint16_t> autoLootList = player->getAutoLoot();
    for (std::list<uint16_t>::iterator it = autoLootList.begin(); it != autoLootList.end(); ++it) {
		PWS_AutoLoot.addShort(*it);
    }

	uint32_t PWS_Size = 0;
	const char* autoLoot = PWS_AutoLoot.getStream(PWS_Size);

	query.str("");
	stmt.setQuery("INSERT INTO `player_autoloot` (`player_id`, `autoloot_list`) VALUES ");
    query << player->getGUID() << ',' << db->escapeBlob(autoLoot, PWS_Size);
    if (!stmt.addRow(query)) {
        return false;
    }
    if (!stmt.execute()) {
        return false;
    }

 

ficando dessa forma:

  Mostrar conteúdo oculto







//save autoloot
	query.str("");
	query << "DELETE FROM `player_autoloot` WHERE `player_id` = " << player->getGUID();
	if(!db->query(query.str()))
		return false;

	PropWriteStream PWS_AutoLoot;
	std::list<uint16_t> autoLootList = player->getAutoLoot();
    for (std::list<uint16_t>::iterator it = autoLootList.begin(); it != autoLootList.end(); ++it) {
		PWS_AutoLoot.addShort(*it);
    }

	uint32_t PWS_Size = 0;
	const char* autoLoot = PWS_AutoLoot.getStream(PWS_Size);

	query.str("");
	stmt.setQuery("INSERT INTO `player_autoloot` (`player_id`, `autoloot_list`) VALUES ");
    query << player->getGUID() << ',' << db->escapeBlob(autoLoot, PWS_Size);
    if (!stmt.addRow(query)) {
        return false;
    }
    if (!stmt.execute()) {
        return false;
    }
      
    query.str("");
	//save vip list
	if(!g_config.getBool(ConfigManager::VIPLIST_PER_PLAYER))
		query << "DELETE FROM `account_viplist` WHERE `account_id` = " << player->getAccount() << " AND `world_id` = " << g_config.getNumber(ConfigManager::WORLD_ID);
	else
		query << "DELETE FROM `player_viplist` WHERE `player_id` = " << player->getGUID();

	if(!db->query(query.str()))
		return false;

 

 

Agora no arquivo "monsters.cpp" localize toda a função "dropLoot" :  (ATENÇÃO: não confunda com "monster.cpp")



void MonsterType::dropLoot(Container* corpse)
{
	ItemList items;
	for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it)
	{
		items = createLoot(*it);
		if(items.empty())
			continue;

		for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit)
		{
			Item* tmpItem = *iit;
			if(Container* container = tmpItem->getContainer())
			{
				if(createChildLoot(container, *it))
					corpse->__internalAddThing(tmpItem);
				else
					delete container;
			}
			else
				corpse->__internalAddThing(tmpItem);
		}
	}

	corpse->__startDecaying();
	uint32_t ownerId = corpse->getCorpseOwner();
	if(!ownerId)
		return;

	Player* owner = g_game.getPlayerByGuid(ownerId);
	if(!owner)
		return;

	LootMessage_t message = lootMessage;
	if(message == LOOTMSG_IGNORE)
		message = (LootMessage_t)g_config.getNumber(ConfigManager::LOOT_MESSAGE);

	if(message < LOOTMSG_PLAYER)
		return;

	std::stringstream ss;
	ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << ".";
	if(owner->getParty() && message > LOOTMSG_PLAYER)
		owner->getParty()->broadcastMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
	else if(message == LOOTMSG_PLAYER || message == LOOTMSG_BOTH)
		owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
}

 

e substitua com atenção ela toda por essa:



void MonsterType::dropLoot(Container* corpse)
{	
	uint32_t money = 0;
	ItemList items;
	std::stringstream str;
	for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it)
	{
		items = createLoot(*it);
		if(items.empty())
			continue;

		for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit)
		{
			Item* tmpItem = *iit;
			if(Container* container = tmpItem->getContainer())
			{
				Player* tmpPlayer = g_game.getPlayerByGuid(corpse->getCorpseOwner());
				if(createChildLoot(container, (*it), money, str, tmpPlayer)) {
					corpse->__internalAddThing(tmpItem);
				} else {
					delete container;
				}
			}
			else {
				bool LootCatch = false;
				Player* tmpPlayer = g_game.getPlayerByGuid(corpse->getCorpseOwner());
				if(tmpPlayer) {
					if(tmpPlayer->statusAutoLoot() == "On") {
						LootCatch = tmpPlayer->checkAutoLoot(tmpItem->getID());
						if(LootCatch) {
							if(tmpPlayer->isMoneyAutoLoot(tmpItem, money)) {
								continue;
							}
							g_game.internalPlayerAddItem(NULL, tmpPlayer, tmpItem);
							str << " " << tmpItem->getNameDescription() << ",";
							continue;
						}
					}
				}
				corpse->__internalAddThing(tmpItem);
			}
		}
	}

	corpse->__startDecaying();
	uint32_t ownerId = corpse->getCorpseOwner();
	if(!ownerId)
		return;

	Player* owner = g_game.getPlayerByGuid(ownerId);
	if(!owner)
		return;

	if(money != 0) {
		if(owner->statusAutoMoneyCollect() == "Bank"){
			owner->balance += money;
		} else {
			g_game.addMoney(owner, money);
		}
		str << " " << money << "x gold coins.";
	} else {
		str << " nothing gold coins.";
	}

	LootMessage_t message = lootMessage;
	if(message == LOOTMSG_IGNORE)
		message = (LootMessage_t)g_config.getNumber(ConfigManager::LOOT_MESSAGE);

	if(message < LOOTMSG_PLAYER)
		return;

	std::stringstream ss;
	ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << ".";
	if(owner->statusAutoLoot()  == "On") {
		ss << "\nAutoLoot Colleted:" << str.str();
	}
	if(owner->getParty() && message > LOOTMSG_PLAYER)
		owner->getParty()->broadcastMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
	else if(message == LOOTMSG_PLAYER || message == LOOTMSG_BOTH)
		owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str());
}

 

No mesmo arquivo localize a função a baixo chamada "createChildLoot": 



bool MonsterType::createChildLoot(Container* parent, const LootBlock& lootBlock)
{
	LootItems::const_iterator it = lootBlock.childLoot.begin();
	if(it == lootBlock.childLoot.end())
		return true;

	ItemList items;
	for(; it != lootBlock.childLoot.end() && !parent->full(); ++it)
	{
		items = createLoot(*it);
		if(items.empty())
			continue;

		for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit)
		{
			Item* tmpItem = *iit;
			if(Container* container = tmpItem->getContainer())
			{
				if(createChildLoot(container, *it))
					parent->__internalAddThing(tmpItem);
				else
					delete container;
			}
			else
				parent->__internalAddThing(tmpItem);
		}
	}

	return !parent->empty();
}

E substitua por essa:



bool MonsterType::createChildLoot(Container* parent, const LootBlock& lootBlock, uint32_t& money, std::stringstream& str, Player* player)
{
	LootItems::const_iterator it = lootBlock.childLoot.begin();
	if(it == lootBlock.childLoot.end())
		return true;

	ItemList items;
	for(; it != lootBlock.childLoot.end() && !parent->full(); ++it)
	{
		items = createLoot(*it);
		if(items.empty())
			continue;

		for(ItemList::iterator iit = items.begin(); iit != items.end(); ++iit)
		{
			Item* tmpItem = *iit;
			if(Container* container = tmpItem->getContainer())
			{
				if(createChildLoot(container, *it, money, str, player))
					parent->__internalAddThing(tmpItem);
				else
					delete container;
			}
			else {
				bool LootCatch = false;
				if(player && (player->statusAutoLoot() == "On")) {
					LootCatch = player->checkAutoLoot(tmpItem->getID());
				}
				if(LootCatch) {
					if(player->isMoneyAutoLoot(tmpItem, money)) {
						continue;
					}
					g_game.internalPlayerAddItem(NULL, player, tmpItem);
					str << " " << tmpItem->getNameDescription() << ",";
					continue;
				}
					parent->__internalAddThing(tmpItem);
			}
		}
	}

	return !parent->empty();
}

 

Agora no arquivo "monsters.h" altera apenas uma linha:

Encontre:



bool createChildLoot(Container* parent, const LootBlock& lootBlock);

e troque por:



bool createChildLoot(Container* parent, const LootBlock& lootBlock, uint32_t& money, std::stringstream& str, Player* player);

 

Agora no arquivo "player.h" encontre nas funções public:



		void learnInstantSpell(const std::string& name);
		void unlearnInstantSpell(const std::string& name);
		bool hasLearnedInstantSpell(const std::string& name) const;

E adicione abaixo



		//Autoloot by: Naze
		std::list<uint16_t> getAutoLoot() {
			return AutoLoot;
		}
		void clearAutoLoot() {
			AutoLoot.clear();
		}
		void addAutoLoot(uint16_t id);
		void removeAutoLoot(uint16_t id);
		bool limitAutoLoot();
		bool checkAutoLoot(uint16_t id);
		bool isMoneyAutoLoot(Item* item, uint32_t& count);
		std::string statusAutoLoot() {
			return (autoLootStatus ? "On" : "Off");
		}
		void updateStatusAutoLoot(bool status){
			autoLootStatus = status;
		}
		std::string statusAutoMoneyCollect() {
			return (autoMoneyCollect ? "Bank" : "Bag");
		}
		void updateMoneyCollect(bool status) {
			autoMoneyCollect = status;
		}

 

 

Localize no mesmo arquivo as declarações private: 



	private:
		bool is_spectating;
		bool talkState[13];
		bool inventoryAbilities[SLOT_LAST];
		bool pzLocked;

e adicione 3 variáveis:



	private:
		bool autoLootStatus; //autoloot by naze
		bool autoMoneyCollect; //autoloot by naze
		std::list<uint16_t> AutoLoot; //autoloot by naze
		bool is_spectating;
		bool talkState[13];
		bool inventoryAbilities[SLOT_LAST];
		bool pzLocked;

 

Agora no arquivo "player.cpp" localize no começo a função:



Player::Player(const std::string& _name, ProtocolGame* p):
	Creature(), transferContainer(ITEM_LOCKER), name(_name), nameDescription(_name), client(p)
{
	if(client)
		client->setPlayer(this);

	pzLocked = isConnecting = addAttackSkillPoint = requestedOutfit = false;
	saving = true;

	lastAttackBlockType = BLOCK_NONE;

 

e adicione: 



Player::Player(const std::string& _name, ProtocolGame* p):
	Creature(), transferContainer(ITEM_LOCKER), name(_name), nameDescription(_name), client(p)
{
	if(client)
		client->setPlayer(this);

	pzLocked = isConnecting = addAttackSkillPoint = requestedOutfit = false;
	saving = true;
	autoLootStatus = true; //autoloot by naze
	autoMoneyCollect = true; //autoloot by naze

	lastAttackBlockType = BLOCK_NONE;

 

Ainda em "player.cpp" vá até as ultimas função: 



void Player::sendCritical() const
{
	if(g_config.getBool(ConfigManager::DISPLAY_CRITICAL_HIT))
		g_game.addAnimatedText(getPosition(), COLOR_DARKRED, "CRITICAL!");
}

void Player::setPlayerExtraAttackSpeed(uint32_t speed)
{
	extraAttackSpeed = speed;
}

 

e adicione abaixo: 



void Player::addAutoLoot(uint16_t id) {
	if(checkAutoLoot(id)) {
		return;
	}
	AutoLoot.push_back(id);
}

void Player::removeAutoLoot(uint16_t id) {
	if(checkAutoLoot(id)) {
		return;
	}
	AutoLoot.remove(id);
}

bool Player::limitAutoLoot() {
	std::list<uint16_t> list = getAutoLoot();
	if((uint16_t)list.size() >= g_config.getNumber(ConfigManager::AUTOLOOT_MAXITEM)) {
		return true;
	}
	return false;
}

bool Player::checkAutoLoot(uint16_t id) {
	if(Item::items[id].isContainer()) {
		return true;
	}
	std::string msg = g_config.getString(ConfigManager::AUTOLOOT_BLOCKIDS);
	StringVec strVector = explodeString(msg, ";");
	for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it) {
		if(atoi((*it).c_str()) == id) {
			return true;
		}
	}
	for(std::list<uint16_t>::iterator it = AutoLoot.begin(); it != AutoLoot.end(); ++it) {
		if((*it) == id) {
			return true;
		}
	}
	return false;
}

bool Player::isMoneyAutoLoot(Item* item, uint32_t& count) {
	bool isMoney = false;
	std::string msg = g_config.getString(ConfigManager::AUTOLOOT_MONEYIDS);
	StringVec strVector = explodeString(msg, ";");
	for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it) {
		if(item->getID() == atoi((*it).c_str())) {
			isMoney = true;
			break;
		}
	}
	if(!isMoney) {
		return false;
    }
  
	count += item->getWorth();
	return true;
}

 

Ficando dessa forma:

  Mostrar conteúdo oculto











void Player::sendCritical() const
{
	if(g_config.getBool(ConfigManager::DISPLAY_CRITICAL_HIT))
		g_game.addAnimatedText(getPosition(), COLOR_DARKRED, "CRITICAL!");
}

void Player::setPlayerExtraAttackSpeed(uint32_t speed)
{
	extraAttackSpeed = speed;
}

void Player::addAutoLoot(uint16_t id) {
	if(checkAutoLoot(id)) {
		return;
	}
	AutoLoot.push_back(id);
}

void Player::removeAutoLoot(uint16_t id) {
	if(checkAutoLoot(id)) {
		return;
	}
	AutoLoot.remove(id);
}

bool Player::limitAutoLoot() {
	std::list<uint16_t> list = getAutoLoot();
	if((uint16_t)list.size() >= g_config.getNumber(ConfigManager::AUTOLOOT_MAXITEM)) {
		return true;
	}
	return false;
}

bool Player::checkAutoLoot(uint16_t id) {
	if(Item::items[id].isContainer()) {
		return true;
	}
	std::string msg = g_config.getString(ConfigManager::AUTOLOOT_BLOCKIDS);
	StringVec strVector = explodeString(msg, ";");
	for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it) {
		if(atoi((*it).c_str()) == id) {
			return true;
		}
	}
	for(std::list<uint16_t>::iterator it = AutoLoot.begin(); it != AutoLoot.end(); ++it) {
		if((*it) == id) {
			return true;
		}
	}
	return false;
}

bool Player::isMoneyAutoLoot(Item* item, uint32_t& count) {
	bool isMoney = false;
	std::string msg = g_config.getString(ConfigManager::AUTOLOOT_MONEYIDS);
	StringVec strVector = explodeString(msg, ";");
	for(StringVec::iterator it = strVector.begin(); it != strVector.end(); ++it) {
		if(item->getID() == atoi((*it).c_str())) {
			isMoney = true;
			break;
		}
	}
	if(!isMoney)
		return false;
	
	count += item->getWorth();
	return true;
}

 

 

Agora quase finalizando no arquivo "talkactions.h" localize:



		static TalkFunction diagnostics;
		static TalkFunction addSkill;
		static TalkFunction ghost;
		static TalkFunction software;

 

E adicione:




		static TalkFunction diagnostics;
		static TalkFunction addSkill;
		static TalkFunction autoLoot; //autoloot by naze
		static TalkFunction ghost;
		static TalkFunction software;

 

Encontre no arquivo "talkactions.cpp" :



	else if(m_functionName == "diagnostics")
		m_function = diagnostics;
	else if(m_functionName == "addskill")
		m_function = addSkill;
	else if(m_functionName == "ghost")
		m_function = ghost;
	else if(m_functionName == "software")
		m_function = software;

 

E adicione o seguinte: 



	else if(m_functionName == "diagnostics")
		m_function = diagnostics;
	else if(m_functionName == "addskill")
		m_function = addSkill;	
	else if(m_functionName == "autoloot") //autoloot by naze
		m_function = autoLoot;	
	else if(m_functionName == "ghost")
		m_function = ghost;
	else if(m_functionName == "software")
		m_function = software;

 

Ainda em "talkactions.cpp" encontre o começo de ghost:



bool TalkAction::ghost(Creature* creature, const std::string&, const std::string&)
{
	Player* player = creature->getPlayer();
	if(!player)
		return false;

 E adicione a cima a seguinte função:



bool TalkAction::autoLoot(Creature* creature, const std::string&, const std::string& param)
{
	Player* player = creature->getPlayer();
	if(!player)
		return false;

	StringVec params = explodeString(param, ",");
	std::stringstream info;
	if(params[0] == "on" or params[0] == "off") {
		player->updateStatusAutoLoot((params[0] == "on" ? true : false));
		info << "Autoloot-> Status: " << (player->statusAutoLoot()) << ".";
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, info.str());
		return true;
	}
	if(params[0] == "clear" or params[0] == "clean") {
		player->clearAutoLoot();
		info << "Autoloot-> Todos itens removidos.";
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, info.str());
		return true;
	}
	if(params[0] == "list" or params[0] == "lista") {
		std::list<uint16_t> list = player->getAutoLoot();
		std::list<uint16_t>::iterator it = list.begin();
		std::string msg = g_config.getString(ConfigManager::AUTOLOOT_MONEYIDS);
		StringVec strVector = explodeString(msg, ";");
		for(StringVec::iterator itt = strVector.begin(); itt != strVector.end(); ++itt) {
			++it;
		}
		uint16_t i = 1;
		for(; it != list.end(); ++it) {	
			info << i << ": " << Item::items[(*it)].name << std::endl;
			++i;
		}
		player->sendFYIBox((info.str() == "" ? "Nada Adicionado." : info.str()));
		return true;
	}
	if(params.size() <= 1) {
		info << "_____Perfect AutoLoot System_____\nAutoLoot Status: " << player->statusAutoLoot() << "\nAutoMoney Mode: " << player->statusAutoMoneyCollect() << "\n\nComandos:\n!autoloot on/off\n!autoloot money, bank/bag\n!autoloot add, item name, item name, item name...\n!autoloot remove, item name, item name, item name...\n!autoloot list\n!autoloot clear\n\n\n (Sistema livre de bugs e gratuito no TibiaKing!)";
		player->sendFYIBox(info.str());
		return true;
	}

	if(params[0] == "money") {
		for(StringVec::iterator it = params.begin(); it != params.end(); ++it) {
			if((*it) == "money") {
				continue;
			}
			char param[150];
			sprintf(param, "%s", (*it).c_str());
			int len = strlen(param);
			for (int i = 0, pos = 0; i < len; i++, pos++) {
				if (param[0] == ' '){
					pos++;
				}
				param[i] = param[pos];
			}
			if((strcmp(param, "bank") == 0) or (strcmp(param, "bag") == 0)) {
				player->updateMoneyCollect((strcmp(param, "bank") == 0) ? true : false);
				info << "AutoMoney-> Collect Mode: " << (player->statusAutoMoneyCollect()) << ".";
				player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, info.str());
				return true;
			}
		}
	}

	if(params[0] == "add") {
		std::stringstream add, err;
		uint8_t addCount = 0, errCount = 0;
		std::stringstream ss;
		for(StringVec::iterator it = params.begin(); it != params.end(); ++it) {
			if((*it) == "add") {
				continue;
			}
			char name[150];
			sprintf(name, "%s", (*it).c_str());
			int len = strlen(name);
			for (int i = 0, pos = 0; i < len; i++, pos++) {
				if (name[0] == ' '){
					pos++;
				}
				name[i] = name[pos];
			}
			int32_t itemId = Item::items.getItemIdByName(name);
			if(!player->checkAutoLoot(itemId)) {
				if(itemId > 0) {
					std::string str = addCount > 0 ? ", " : "";
					++addCount;
					add << str << name;
					player->addAutoLoot(itemId);
					continue;
				}
			}
			std::string str = errCount > 0 ? ", " : "";
			++errCount;
			err << str << name;
		}
		ss << "AutoLoot-> Adicionados: " << ((add.str() == "") ? "Nenhum" : add.str()) << ". Erros: " << ((err.str() == "") ? "Nenhum" : err.str()) << ".";
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, ss.str());
		return true;
	}

	if(params[0] == "remove") {
		std::stringstream remove, err;
		uint8_t removeCount = 0, errCount = 0;
		std::stringstream ss;
		for(StringVec::iterator it = params.begin(); it != params.end(); ++it) {
			if((*it) == "remove") {
				continue;
			}
			char name[150];
			sprintf(name, "%s", (*it).c_str());
			int len = strlen(name);
			for (int i = 0, pos = 0; i < len; i++, pos++) {
				if (name[0] == ' '){
					pos++;
				}
				name[i] = name[pos];
			}
			int32_t itemId = Item::items.getItemIdByName(name);
			if(player->checkAutoLoot(itemId)) {
				if(itemId > 0) {
					std::string str = removeCount > 0 ? ", " : "";
					++removeCount;
					remove << str << name;
					player->removeAutoLoot(itemId);
					continue;
				}
			}
			std::string str = errCount > 0 ? ", " : "";
			++errCount;
			err << str << name;
		}
		ss << "AutoLoot-> Removidos: " << ((remove.str() == "") ? "Nenhum" : remove.str()) << ". Erros: " << ((err.str() == "") ? "Nenhum" : err.str()) << ".";
		player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, ss.str());
		return true;
	}
	
	return true;
}

 

 

Com isso toda parte na source está instalada, agora vá até seu config.lua e adicione onde achar melhor as seguintes linhas:



AutoLoot_BlockIDs = "" -- adicione ids separado por ; ex: "1111;2222;3333"
AutoLoot_MoneyIDs = "2148;2152;2160" -- adicione os ids dos itens moeda, caso seja os 3 normais pode retirar essa linha
AutoLoot_MaxItem = 100 --  quantidade de itens maximo na lista

 

Agora para finalizar abra o data/talkactions/talkactions.xml e adicione a seguinte tag:



	<talkaction words="/autoloot;!autoloot" event="function" value="autoloot"/>

 

E execute a seguinte query em seu banco de dados:



CREATE TABLE player_autoloot (
    id int NOT NULL AUTO_INCREMENT,
    player_id int NOT NULL,
    autoloot_list blob,
    PRIMARY KEY (id)
);


 

 

Link para TFS -> https://tibiaking.com/forums/topic/101079-otimizado-autoloot-in-sources-for-tfs-036-tfs-04/

 

Caso ocorra algum erro na compilação so mandar que ajudo a resolver, testei apenas em uma otx que tenho então nao sei se pode sugir outros problemas. Nas versões atual da Otx para servidores 10+ não ira funcionar pois algumas funções são diferente e não irei corrigir agora, em breve passo o mesmo pra tfs 1.3 e otx3.

 

Esse sistema foi totalmente feito por mim, mas dou créditos também ao @Mathias Kenfi por me ajudar muito na evolução em lua/c++ e a tabela sql é a mesma usada no quick autoloot 1.3 postado por Pedriinz

Depois que compilei a source, ao ligar o servidor a distro fecha e aparece seguimentation fail algo assim, será que fiz algo errado?

x1fCxnI.png

Link para o post
Compartilhar em outros sites
Em 30/11/2020 em 09:56, .HuRRiKaNe disse:

Depois que compilei a source, ao ligar o servidor a distro fecha e aparece seguimentation fail algo assim, será que fiz algo errado?

Ctz, tenta reinstalar o sistema, ou usa gdb para ver que função ta errada. 

Discord: Naze#3578

 

Ter Linux Dentro de Windows com Acesso 'localhost' para testes e +

AutoLoot Otimizado Direto na Source (tfs 0.4/otx)

 

// Pirataria é crime, original é roubo, compartilhar é legal.

 

tumblr_muk78tEwDQ1qah4nko1_500.gif

Link para o post
Compartilhar em outros sites

Naze é o brabooo, parabéns pelo conteúdo meu querido. Só progresso! To inativo mas sempre dou uma olhada na evolução dos companheiros aqui do forum. Seguraaa aquele Repzao maroto! <3 

════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═══╗

Te Ajudei? Rep + e ficamos Quits

166420979_logoyanliimaornight.png.33f822b8970081a5b3646e85dbfd5934.png

Precisando de ajuda?

discord.png.1ecd188791d0141f74d99db371a2e0a4.png.890d5a38d7bcde75543c72b624a65de1.pngDiscord: Yan Liima #3702

Programador Júnior de LUA, PHP e JavaScript

Juntos somos lendas, separados somos Mitos!

╚══════════════════════════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═════════════════════════════╝

Link para o post
Compartilhar em outros sites
  • 1 month later...

boa tarde naze, estou tendo esse problema na hora de compilar

/home/Baiak/sources# make
g++ -c -march=native -mtune=native -I"." -I"/usr/include/lua5.1" -I"/usr/include                                                                                        /mysql" -I"/usr/include/libxml2" -DBOOST_DISABLE_ASSERTS -DNDEBUG -Werror -Wall                                                                                         -Ofast -ggdb3 -std=c++11 -pthread -lpthread -fno-strict-aliasing -o obj/monsters                                                                                        .o monsters.cpp
monsters.cpp: In member function ‘bool MonsterType::createChildLoot(Container*,                                                                                         const LootBlock&, uint32_t&, std::stringstream&, Player*)’:
monsters.cpp:137:12: error: cannot convert ‘ItemList {aka std::__cxx11::list<Ite                                                                                        m*>}’ to ‘Item*’ in assignment
   if(items = createLoot(*it)) {
            ^
monsters.cpp: In member function ‘void MonsterType::dropLoot(Container*)’:
monsters.cpp:179:12: error: cannot convert ‘ItemList {aka std::__cxx11::list<Ite                                                                                        m*>}’ to ‘Item*’ in assignment
   if(items = createLoot(*it)) {
            ^
monsters.cpp:193:68: error: suggest parentheses around assignment used as truth                                                                                         value [-Werror=parentheses]
     if(tmpPlayer = g_game.getPlayerByGuid(corpse->getCorpseOwner())) {
                                                                    ^
monsters.cpp: At global scope:
monsters.cpp:249:3: error: ‘owner’ does not name a type
   owner->getStorage("lootch", value);
   ^
monsters.cpp:250:3: error: expected unqualified-id before ‘if’
   if (value == "-1")
   ^
monsters.cpp:252:3: error: expected unqualified-id before ‘else’
   else
   ^
monsters.cpp:254:2: error: expected declaration before ‘}’ token
  }
  ^
cc1plus: all warnings being treated as errors
Makefile:40: recipe for target 'obj/monsters.o' failed
make: *** [obj/monsters.o] Error 1
 

 

 

 

OBSV: já usei o metodo lá que vc comentou no post da TFS, ai deu esse error em cima..

poderia ajudar?

Link para o post
Compartilhar em outros sites

Me parece ser o problema que tem la no outro topico, com mais alguns de mal instalação, tenta manda seu monsters.cpp inteiro pra eu ver

Discord: Naze#3578

 

Ter Linux Dentro de Windows com Acesso 'localhost' para testes e +

AutoLoot Otimizado Direto na Source (tfs 0.4/otx)

 

// Pirataria é crime, original é roubo, compartilhar é legal.

 

tumblr_muk78tEwDQ1qah4nko1_500.gif

Link para o post
Compartilhar em outros sites
  • 2 months later...

boa tarde naze, consegui resolver a compilação mas quando vou ligar o ot, da esse problema 

 

ada95d9000-7fada95dd000 r--p 0033b000 08:01 17961                      /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20.3.20
7fada95dd000-7fada964f000 rw-p 0033f000 08:01 17961                      /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20.3.20
7fada964f000-7fada9655000 rw-p 00000000 00:00 0
7fada9655000-7fada9658000 r-xp 00000000 08:01 28811                      /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7fada9658000-7fada9857000 ---p 00003000 08:01 28811                      /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7fada9857000-7fada9858000 r--p 00002000 08:01 28811                      /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7fada9858000-7fada9859000 rw-p 00003000 08:01 28811                      /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0
7fada9859000-7fada987d000 r-xp 00000000 08:01 28833                      /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.58.0
7fada987d000-7fada9a7c000 ---p 00024000 08:01 28833                      /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.58.0
7fada9a7c000-7fada9a7e000 r--p 00023000 08:01 28833                      /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.58.0
7fada9a7e000-7fada9a7f000 rw-p 00025000 08:01 28833                      /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.58.0
7fada9a7f000-7fada9afe000 r-xp 00000000 08:01 26004                      /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fada9afe000-7fada9cfd000 ---p 0007f000 08:01 26004                      /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fada9cfd000-7fada9cfe000 r--p 0007e000 08:01 26004                      /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fada9cfe000-7fada9cff000 rw-p 0007f000 08:01 26004                      /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fada9cff000-7fada9d2a000 r-xp 00000000 08:01 62178                      /usr/lib/x86_64-linux-gnu/liblua5.1.so.0.0.0
7fada9d2a000-7fada9f2a000 ---p 0002b000 08:01 62178                      /usr/lib/x86_64-linux-gnu/liblua5.1.so.0.0.0
7fada9f2a000-7fada9f2c000 r--p 0002b000 08:01 62178                      /usr/lib/x86_64-linux-gnu/liblua5.1.so.0.0.0
7fada9f2c000-7fada9f2d000 rw-p 0002d000 08:01 62178                      /usr/lib/x86_64-linux-gnu/liblua5.1.so.0.0.0
7fada9f2d000-7fada9f53000 r-xp 00000000 08:01 2136                       /lib/x86_64-linux-gnu/ld-2.23.so
7fadaa134000-7fadaa148000 rw-p 00000000 00:00 0
7fadaa151000-7fadaa152000 rw-p 00000000 00:00 0
7fadaa152000-7fadaa153000 r--p 00025000 08:01 2136                       /lib/x86_64-linux-gnu/ld-2.23.so
7fadaa153000-7fadaa154000 rw-p 00026000 08:01 2136                       /lib/x86_64-linux-gnu/ld-2.23.so
7fadaa154000-7fadaa155000 rw-p 00000000 00:00 0
7fffa071f000-7fffa0740000 rw-p 00000000 00:00 0                          [stack]
7fffa07df000-7fffa07e1000 r--p 00000000 00:00 0                          [vvar]
7fffa07e1000-7fffa07e3000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

 

 

ai crasha e liga de novo.

Link para o post
Compartilhar em outros sites
  • 9 months later...

Consegui compilar, funciona muito bem.

 

Tenho alguns problemas e, caso alguém se dispor a ajudar posso pagar pela solução:

 

* Mesmo colocando id de dinheiro no block id, ele continua pegando. Quero que apenas crystal coins sejam coletadas

* Itens que eu coloco no Block_ID não são adicionados na lista do autoloot, mas são pegados.

* Defini no config.lua um limite de 20 slots, mas ele está permitindo ir além disso

* Preciso restringir o uso da talkaction para jogadores VIP, assim como a coleta de loot seja restrita apenas para jogadores VIP (eles podem adicionar enquanto VIP e se a VIP terminar eles não pegarem loot mais).

 

Meu sistema VIP funciona assim (inserido dentro das libs do OT)

 

VIP_ACCOUNT_STORAGE = 30009

function getAccountStorage(cid, key)
  local ret = db.getResult("SELECT `value` FROM `account_storage` WHERE `account_id` = ".. getPlayerAccountId(cid) .." AND `key` = "..key)
  if ret:getID() == -1 then
    return -1
  end
  return ret:getDataInt("value") or ret:getDataString("value")
end

function setAccountStorage(cid, key, value)
  local func = db.executeQuery or db.query
  local query = db.getResult("SELECT `value` FROM `account_storage` WHERE `key` = ".. key .." AND `account_id` = ".. getPlayerAccountId(cid))
  if query:getID() == -1 then
    return func("INSERT INTO `account_storage` (`account_id`, `key`, `value`) VALUES (".. getPlayerAccountId(cid) ..", ".. key ..", ".. value ..")")
  end
  return func("UPDATE `account_storage` SET `value` = ".. value .." WHERE `key` = ".. key .." AND `account_id` = ".. getPlayerAccountId(cid))
end

function isVIP(cid)
  return getAccountVIP(cid) > 0
end

function getAccountVIP(cid)
  return (getAccountStorage(cid, VIP_ACCOUNT_STORAGE) - os.time() > 0) and getAccountStorage(cid, VIP_ACCOUNT_STORAGE) - os.time() or 0
end

function setAccountVIP(cid, days)
  return setAccountStorage(cid, VIP_ACCOUNT_STORAGE, os.time() + (60 * 60 * 24 * days) + (getAccountVIP(cid) > 0 and  getAccountVIP(cid) or 0))
end

 

Editado por Bruno Rezende (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

@Naze Estou com um problema, ao chegar na 3/4 backpack o autoloot para de pegar os itens.

Senhoras e senhores, se alguma resposta lhe ajudou, marque-a como a melhor resposta e de ponto positivo, assim você incentiva quem lhe ajudou a continuar ajudando!!.

Link para o post
Compartilhar em outros sites
  • 9 months later...
Em 13/03/2022 em 23:05, FeeTads disse:

@Naze cara desculpa reviver o post, mas esse autoloot eh mt dahora kkkkkk, porém o autoloot remove ainda não funciona, ce tem alguma atualização 100% desse script?

descupa reviver o topico mas vc conseguio resolver esse problede remover o item aqui tbm nao remove o resto esta tudo ok 

Link para o post
Compartilhar em outros sites
2 horas atrás, mullino disse:

descupa reviver o topico mas vc conseguio resolver esse problede remover o item aqui tbm nao remove o resto esta tudo ok 

 

arrumei em um script aki no TK mesmo

Link para o post
Compartilhar em outros sites
  • 2 weeks later...

Quando vou compilar dá esse erro:
 

Spoiler

1>otpch.cpp
1>actions.cpp
1>admin.cpp
1>allocator.cpp
1>baseevents.cpp
1>beds.cpp
1>chat.cpp
1>combat.cpp
1>condition.cpp
1>configmanager.cpp
1>connection.cpp
1>container.cpp
1>creature.cpp
1>creatureevent.cpp
1>cylinder.cpp
1>database.cpp
1>databasemanager.cpp
1>databasemysql.cpp
1>databasemysqlpp.cpp
1>databasepgsql.cpp
1>databasesqlite.cpp
1>depot.cpp
1>dispatcher.cpp
1>exception.cpp
1>fileloader.cpp
1>game.cpp
1>gameservers.cpp
1>globalevent.cpp
1>group.cpp
1>house.cpp
1>housetile.cpp
1>ioban.cpp
1>ioguild.cpp
1>iologindata.cpp
1>iomap.cpp
1>iomapserialize.cpp
1>item.cpp
1>itemattributes.cpp
1>items.cpp
1>luascript.cpp
1>mailbox.cpp
1>..\iologindata.cpp(778): error C2664: 'const char *_DBResult::getDataStream(const std::string &,uint64_t &)': não é possível converter um argumento 2 de 'unsigned long' em 'uint64_t &'
1>manager.cpp
1>map.cpp
1>..\luascript.cpp(11680): warning C4319: '~': estendendo com zeros 'uint32_t' para 'lua_Number' de tamanho maior
1>monster.cpp
1>monsters.cpp
1>movement.cpp
1>networkmessage.cpp
1>npc.cpp
1>otserv.cpp
1>outfit.cpp
1>outputmessage.cpp
1>party.cpp
1>player.cpp
1>position.cpp
1>protocol.cpp
1>protocolgame.cpp
1>protocolhttp.cpp
1>protocollogin.cpp
1>protocolold.cpp
1>quests.cpp
1>raids.cpp
1>rsa.cpp
1>scheduler.cpp
1>scriptmanager.cpp
1>server.cpp
1>sha1.cpp
1>spawn.cpp
1>spectators.cpp
1>spells.cpp
1>status.cpp
1>talkaction.cpp
1>teleport.cpp
1>textlogger.cpp
1>thing.cpp
1>tile.cpp
1>..\talkaction.cpp(1250): error C2146: erro de sintaxe: ')' ausente antes do identificador 'or'
1>..\talkaction.cpp(1250): error C2065: 'or': identificador não declarado
1>..\talkaction.cpp(1250): error C2146: erro de sintaxe: ';' ausente antes do identificador 'params'
1>..\talkaction.cpp(1250): error C2059: erro de sintaxe: ')'
1>..\talkaction.cpp(1251): error C2059: erro de sintaxe: ';'
1>..\talkaction.cpp(1256): error C2059: erro de sintaxe: 'if'
1>..\talkaction.cpp(1256): error C2143: erro de sintaxe: ';' ausente antes de '{'
1>..\talkaction.cpp(1256): error C2447: '{': faltando cabeçalho de função (lista formal de estilo antigo?)
1>..\talkaction.cpp(1262): error C2059: erro de sintaxe: 'if'
1>..\talkaction.cpp(1262): error C2143: erro de sintaxe: ';' ausente antes de '{'
1>..\talkaction.cpp(1262): error C2447: '{': faltando cabeçalho de função (lista formal de estilo antigo?)
1>..\talkaction.cpp(1278): error C2059: erro de sintaxe: 'if'
1>..\talkaction.cpp(1278): error C2143: erro de sintaxe: ';' ausente antes de '{'
1>..\talkaction.cpp(1278): error C2447: '{': faltando cabeçalho de função (lista formal de estilo antigo?)
1>..\talkaction.cpp(1284): error C2059: erro de sintaxe: 'if'
1>..\talkaction.cpp(1284): error C2143: erro de sintaxe: ';' ausente antes de '{'
1>..\talkaction.cpp(1284): error C2447: '{': faltando cabeçalho de função (lista formal de estilo antigo?)
1>..\talkaction.cpp(1307): error C2059: erro de sintaxe: 'if'
1>..\talkaction.cpp(1307): error C2143: erro de sintaxe: ';' ausente antes de '{'
1>..\talkaction.cpp(1307): error C2447: '{': faltando cabeçalho de função (lista formal de estilo antigo?)
1>..\talkaction.cpp(1343): error C2059: erro de sintaxe: 'if'
1>..\talkaction.cpp(1343): error C2143: erro de sintaxe: ';' ausente antes de '{'
1>..\talkaction.cpp(1343): error C2447: '{': faltando cabeçalho de função (lista formal de estilo antigo?)
1>..\talkaction.cpp(1379): error C2059: erro de sintaxe: 'return'
1>..\talkaction.cpp(1380): error C2059: erro de sintaxe: '}'
1>..\talkaction.cpp(1380): error C2143: erro de sintaxe: ';' ausente antes de '}'
1>..\talkaction.cpp(1383): error C2143: erro de sintaxe: ';' ausente antes de '{'
1>..\talkaction.cpp(1383): error C2447: '{': faltando cabeçalho de função (lista formal de estilo antigo?)
1>tools.cpp
1>trashholder.cpp
1>vocation.cpp
1>waitlist.cpp
1>weapons.cpp
1>Projeto de compilação pronto "TheOTXServer.vcxproj" -- FALHA.
========== Compilar: 0 com êxito, 1 com falha, 0 atualizados, 0 ignorados ==========

 

aí segui a dica do @Wonsr Narutibia e em iologindata.cpp troquei  

unsigned long lootListSize; -- > uint64_t lootListSize;

 

mas nao consegui achar uma solução em talkaction.cpp

source utilizada:

https://github.com/mattyx14/otxserver/archive/otxserv2.zip

 

 

 

Consegui resolver apenas trocando ' or ' por ' || '

 

Editado por Spraiinedweb (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • 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
       
       
       
       
    • Por Doria Louro
      Olá senhores.
       
      Gostaria de uma ajuda com um script de summon que venho trabalhando no momento, gostaria que o summon andasse do lado do jogador, entretanto o mesmo sempre fica para trás ou a frente do jogador.
      Efetuei a alteração na source creature.cpp:
       
      void Creature::getPathSearchParams(const Creature* creature, FindPathParams& fpp) const { fpp.fullPathSearch = !hasFollowPath; fpp.clearSight = true; if(creature->isPlayerSummon()) { if(creature->getName() == "Summon Name") fpp.clearSight = false; } fpp.maxSearchDist = 12; fpp.minTargetDist = fpp.maxTargetDist = 1; }  
      fpp.maxTargetDist = 1;
      Porém ele sempre mantem 1 de distancia do jogador, alterando para zero o "Zero" summon nem segue o jogador.
      Resultado:

       
      Agradeço desde já.
    • Por Imperius
      O propósito é criar uma nova função em creaturescripts que será acionada toda vez que um novo report (CTRL + R) for aberto.
       
      Eu implementei para enviar uma notificação no grupo do Telegram, contendo os dados do report.
       
      Isso garantirá que os GMs tenham acesso aos reports dos jogadores mesmo quando não estiverem logados, e também evitará que algum report seja perdido caso o jogador saia do servidor.
      A parte do Telegram é apenas um exemplo. Você pode ajustar o script para executar outras ações desejadas.
       
      creatureevent.cpp:
      Dentro deste arquivo, localize a função:
       
      uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap)  
      abaixo dela, adicione:
       
      uint32_t CreatureEvent::executeOpenRuleViolation(Player* player, std::string message) { if (!m_interface->reserveEnv()) { std::clog << "[Error - CreatureEvent::executeOpenRuleViolation] Call stack overflow." << std::endl; return 0; } ScriptEnviroment* env = m_interface->getEnv(); env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushstring(L, message.c_str()); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; }  
      Após, procure por:
       
      std::string CreatureEvent::getScriptEventName() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "onLeaveChannel";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "onOpenRuleViolation";  
      Agora, procure por:
       
      std::string CreatureEvent::getScriptEventParams() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "cid, channel, users";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "cid, message";  
      Procure por:
       
      bool CreatureEvent::configureEvent(xmlNodePtr p)  
      abaixo de:
       
      else if(tmpStr == "leavechannel") m_type = CREATURE_EVENT_CHANNEL_LEAVE;  
      adicione:
       
      else if(tmpStr == "openruleviolation") m_type = CREATURE_EVENT_OPEN_RULE_VIOLATION;  
       
      creatureevent.h:
      Dentro deste arquivo, localize:
       
      enum CreatureEventType_t  
      adicione "CREATURE_EVENT_OPEN_RULE_VIOLATION" como o último item de enum CreatureEventType_t
       
      Exemplo:
       
      enum CreatureEventType_t { // ... CREATURE_EVENT_OPEN_RULE_VIOLATION };  
      Agora, procure por:
       
      uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap);  
      abaixo dela, adicione:
       
      uint32_t executeOpenRuleViolation(Player* player, std::string message);  
      game.cpp:
      Dentro deste arquivo, localize:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text)  
      e substitua por:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text) { //Do not allow reports on multiclones worlds since reports are name-based if(g_config.getNumber(ConfigManager::ALLOW_CLONES)) { player->sendTextMessage(MSG_INFO_DESCR, "Rule violation reports are disabled."); return false; } cancelRuleViolation(player); boost::shared_ptr<RuleViolation> rvr(new RuleViolation(player, text, time(NULL))); ruleViolations[player->getID()] = rvr; ChatChannel* channel = g_chat.getChannelById(CHANNEL_RVR); if(!channel) return false; for(UsersMap::const_iterator it = channel->getUsers().begin(); it != channel->getUsers().end(); ++it) it->second->sendToChannel(player, SPEAK_RVR_CHANNEL, text, CHANNEL_RVR, rvr->time); CreatureEventList joinEvents = player->getCreatureEvents(CREATURE_EVENT_OPEN_RULE_VIOLATION); for(CreatureEventList::iterator it = joinEvents.begin(); it != joinEvents.end(); ++it) (*it)->executeOpenRuleViolation(player, text); return true; }  
      Agora é só compilar a source.
       
      depois em "data > creaturescripts > creaturescripts.xml", adicione:
       
      <event type="login" name="loginNotifyRuleViolation" script="notifyRuleViolation.lua"/> <event type="openruleviolation" name="openNotifyRuleViolation" script="notifyRuleViolation.lua"/>  
      em "data > creaturescripts > scripts", crie um arquivo notifyRuleViolation.lua e adicione:
       
      function onOpenRuleViolation(cid, message) local config = { token = "", -- Token do seu BOT no Telegram chatId = "" -- ID do chat do Telegram que será enviado a notificação. } local message = "Player: "..getCreatureName(cid).."\n\nReport:\n"..message.."" message = string.gsub(message, "\n", "%%0A") local url = "https://api.telegram.org/bot"..config.token.."/sendMessage" local data = "chat_id="..config.chatId.."&text="..message.."" local curl = io.popen('curl -d "'..data..'" "'..url..'"'):read("*a") return true end function onLogin(cid) registerCreatureEvent(cid, "openNotifyRuleViolation") return true end  
       
      Demonstração:
      1. Jogador abre um novo report (CTRL + R)

      2. notifyRuleViolation.lua, definido em creaturescripts.xml, é acionado para enviar uma notificação ao grupo do Telegram.
       

       
    • Por FeeTads
      SALVE rapaziada do TK, esses dias vim pensando em novos scripts pro meu OT, e em um deles eu precisava que determinada area não contasse frag pro player que matasse outros, PORÉM eu precisava que os players que morressem nessa area ainda assim tivessem as penalidades da sua morte, procurei por ai, achei alguns scripts que apenas tiravam o SKULL e não realmente o FRAG do player.

      **script atualizado 22/10/2023** - melhorado e otimizado, levei o script pra puxar as infos por .lua / creatureScripts

      vou disponibilizar o code aqui, e o que fazer pra determinada area não contar frag.

      SOURCE OTX 2 / TFS 0.x, Funciona em TFS 1.x mudando as tags e ajeitando as sintaxes.

      vá em creatureevent.cpp

      procure por:
      else if(type == "preparedeath") _type = CREATURE_EVENT_PREPAREDEATH;
      Adiciona abaixo:
      else if(type == "nocountfrag") _type = CREATURE_EVENT_NOCOUNTFRAG;

      procure por:
      case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath";  
      Adicione abaixo: 
      case CREATURE_EVENT_NOCOUNTFRAG: return "noCountFragArea";

      procure por:
      case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList";
      Adicione abaixo:
      case CREATURE_EVENT_NOCOUNTFRAG: return "cid, target";

      agora no mesmo arquivo, vá até o final do arquivo e adicione essa função:
      uint32_t CreatureEvent::executeNoCountFragArea(Creature* creature, Creature* target) { //noCountFragArea(cid, target) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::ostringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; scriptstream << "local target = " << env->addThing(target) << std::endl; if(m_scriptData) 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__ std::ostringstream desc; desc << creature->getName(); env->setEvent(desc.str()); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); lua_pushnumber(L, env->addThing(target)); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::noCountFragArea] Call stack overflow." << std::endl; return 0; } }

      agora vá em creatureevent.h

      procure por:
      CREATURE_EVENT_PREPAREDEATH
      adicione abaixo:
      CREATURE_EVENT_NOCOUNTFRAG

      procure por:
      uint32_t executePrepareDeath(Creature* creature, DeathList deathList);
      Adicione abaixo:
      uint32_t executeNoCountFragArea(Creature* creature, Creature* target);

      agora vá em player.cpp

      procure por:
      bool Player::onKilledCreature(Creature* target, DeathEntry& entry)
      abaixo de:
      War_t enemy; if(targetPlayer->getEnemy(this, enemy)) { if(entry.isLast()) IOGuild::getInstance()->updateWar(enemy); entry.setWar(enemy); }
      Adicione o seguinte código:
      if (targetPlayer){ CreatureEventList killEvents = getCreatureEvents(CREATURE_EVENT_NOCOUNTFRAG); for (const auto &event : killEvents) { if (!event->executeNoCountFragArea(this, target)) { return true; } } }

      //

      Feito isso, tudo completo na sua source, agora é necessário adicionar o creaturescript dentro do servidor

      vá até creaturescripts/scripts
      crie um arquivo chamado, "noCountFragInArea.lua"
      e dentro dele cole o código:
       
      --[[ script feito por feetads / TibiaKing ]]-- --[[ discord: feetads / FeeTads#0246 ]]-- -- Add positions here for which you do not want to count frags local areas = { [1] = {from = {x = 91, y = 122, z = 7}, to = {x = 98, y = 127, z = 7}}, -- from = area superior esquerda / to = area inferior direita (formando um quadrado) } local onlyKillerInArea = false -- only killer need to be in area? function noCountFragArea(cid, target) if not isCreature(cid) or not isCreature(target) then return true end local posKiller = getPlayerPosition(cid) local posTarget = getPlayerPosition(target) for i = 1, #areas do local area = areas[i] if isInArea(posKiller, area.from, area.to) then if onlyKillerInArea then return false elseif isInArea(posTarget, area.from, area.to) then return false end end end return true end
      agora em creaturescripts.xml
      <event type="nocountfrag" name="fragarea" event="script" value="noCountFragInArea.lua"/>
      agora em creaturescripts/scripts/login.lua
       procure por OU semelhante a esse:
      registerCreatureEvent(cid, "AdvanceSave")
      e abaixo adicione:
      registerCreatureEvent(cid, "fragarea")

      //


      Agora tudo certo, quando quiser adiciona uma area que não pega frag, vá até o script e apenas coloque a area, igual o demonstrado no script

      Exemplo:
      local areas = { [1] = {from = {x = 91, y = 122, z = 7}, to = {x = 98, y = 127, z = 7}}, [2] = {from = {x = 1000, y = 1000, z = 7}, to = {x = 1100, y = 1100, z = 7}}, }
      assim somente colocando a area no script e abrindo o server ou dando /reload, já funcionará a area como não pegar frag.
      Esse sistema pode ser bom pra areas de pvp ativo, onde você ainda quer que o player que morrer perca os atributos, como se fosse uma morte normal, porém não conta frag pra quem matar.
      Bom pra sistemas tipo castle 48h (guild war), onde há diversas mortes e risco de pegar red, atrapalhando a war.

      Façam bom proveito dos scripts, e deixem os créditos no script rsrs

      **Eu fiz as alterações e o simples código por isso vim disponibilizar, créditos meus**
    • Por Mateus Robeerto
      Para quem deseja utilizar o 'IncreaseMagicPercent' no arquivo items.xml, que aumenta o dano mágico em porcentagem
       
       
      No arquivo game.cpp
      depois.
      Player* attackerPlayer; if (attacker) { attackerPlayer = attacker->getPlayer(); } else { attackerPlayer = nullptr; } Player* targetPlayer = target->getPlayer(); if (attackerPlayer && targetPlayer && attackerPlayer->getSkull() == SKULL_BLACK && attackerPlayer->getSkullClient(targetPlayer) == SKULL_NONE) { return false; } damage.primary.value = std::abs(damage.primary.value); damage.secondary.value = std::abs(damage.secondary.value); int32_t healthChange = damage.primary.value + damage.secondary.value; if (healthChange == 0) { return true; } adicionar
      // Inc Magic by lursky auto originList = { ORIGIN_RANGED, ORIGIN_MELEE, ORIGIN_CONDITION }; auto it = std::find(originList.begin(), originList.end(), damage.origin); if (attackerPlayer && it == originList.end()) { int32_t magicPercentBonus = 0; for (int32_t slot = CONST_SLOT_FIRST; slot <= CONST_SLOT_LAST; ++slot) { Item* item = attackerPlayer->inventory[slot]; if (item) { const ItemType& iiType = Item::items[item->getID()]; const int32_t& slotPosition = item->getSlotPosition(); if (iiType.increaseMagicPercent && (iiType.slotPosition & slotPosition)) { magicPercentBonus += iiType.increaseMagicPercent; } } } if (magicPercentBonus > 0) { damage.primary.value += damage.primary.value * (magicPercentBonus / 100.0f); } } No arquivo item.cpp
       
      post edit: Deve ter colocado duas vezes, ok? É só procurar no item.cpp essa linha e adicionar. Repita a busca pela mesma linha e adicione para exibir 'inc magic'. Pronto 

      depois.
      if (it.abilities) { for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; i++) { if (!it.abilities->skills[i]) { continue; } if (begin) { begin = false; s << " ("; } else { s << ", "; } s << getSkillName(i) << ' ' << std::showpos << it.abilities->skills[i] << std::noshowpos; } adicionar.
      if (it.increaseMagicPercent) { if (begin) { begin = false; s << " ("; } else { s << ", "; } s << "Inc.Magic " << std::showpos << it.increaseMagicPercent << '%' << std::noshowpos; } No arquivo items.cpp
      depois.
      {"worth", ITEM_PARSE_WORTH}, adicionar:
      { "increasemagicpercent", ITEM_PARSE_INCREASEMAGICPERCENT }, Novamente, no arquivo items.cpp:
      depois.
      case ITEM_PARSE_SUPPRESSCURSE: { if (valueAttribute.as_bool()) { abilities.conditionSuppressions |= CONDITION_CURSED; } break; } adicionar.
      case ITEM_PARSE_INCREASEMAGICPERCENT: { it.increaseMagicPercent = pugi::cast<int32_t>(valueAttribute.value()); break; } No arquivo items.h
      depois.
      uint64_t worth = 0; adicionar.
      int32_t increaseMagicPercent = 0; Novamente, no arquivo items.h:
      after.
      ITEM_PARSE_WORTH, adicionar:
      ITEM_PARSE_INCREASEMAGICPERCENT, FIM
      É só recompilar e testar
      Como funciona usar esses atributos? Veja aqui um exemplo
      item id="xxx" name="teste robe"> <attribute key="weight" value="7100"/> <attribute key="armor" value="18"/> <attribute key="slotType" value="body"/> <attribute key="increaseMagicPercent" value="50"/> </item>  
      Obs: Esses adições na source foram feitas por Mateus Roberto, e Lurskcy fez uma correção de erro que estava causando um .crash no arquivo games.cpp. Está funcionando bem.
       
      Espero que gostem
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo