Jump to content

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


Recommended Posts

  • 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.

Edited by jeanferson
corrigir (see edit history)
Link to post
Share on other sites

  • Assistente

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 to post
Share on other 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 to post
Share on other sites

  • Assistente

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 to post
Share on other sites

  • 2 weeks later...
  • 3 weeks later...
  • Assistente
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 to post
Share on other sites

  • Assistente
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 to post
Share on other 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 

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

ALGUNS DOS MEUS TRABALHOS:

Spoiler

WODBOHS[DOWNLOAD DISPONIVEL EM OUTRO FÓRUM]

Newstory dbo+nto+bleach[DOWNLOAD DISPONIVEL EM OUTRO FÓRUM]

 

- Projetos lançados também feitos por mim {

DBO SKY

POKE SKY

WODBOWARS

Tic-tac-War

Dbo Universe(em desenvolvimento)

}

universe.png.579c2e3c78f88666e1ffda5e74db4516.png

 

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 to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By Roy
      Bem eu não sei nem por onde começar já que. Acredito eu que faz uns 2 anos mais ou menos que não me envolvo com Tíbia então hoje vim trazer algo novo para todos nós.
       Bem o que è Discord RPC? Nada mais nada menos que, aquela janelinha que mostra qual jogo você está jogando no Discord. E ao passar o mouse em cima do úsuario você pode checar os detalhes.

       
      Bem o Tíbia em sí já tem o Discord RPC por padrão mas o que eu trouxe a vocês o Discord-RPC que você pode editar como você quiser.
      Por exemplo.
       

       
      Talvez seja uma contribuição bem clichê. Mas para aqueles que deseja que os players mostre para os outros que está jogando seu otserv é uma boa, que possa ajudar a divulgar também. Acredito eu. Enfim vamos lá.
       
      Bem primeiro de tudo você precisa criar sua aplicação no Discord.
      Vá até o site de Desenvolvimentos de Aplicações do Discord e crie o seu canal clicando em New Aplication.
       
      Após Criar seu canal com o nome do seu Otserv, Descrição e ter colocado sua logo ou sei lá. Seu Canal Está quase completo. (Lembrando que as imagens precisam ser ou 512x512 ou 1024x1024)
      Vá até Rich Presence: Escolha sua logo e também clique em Add Image(s) e adicione uma imagem para sua Logo do Discord-RPC. Para quando o cara passar o mouse por cima do úsuario enxergar ela.
      Ok até aqui tudo OK. Só precisa aguardar o Discord carregar sua logo e enquanto isso vamos fazer o restante.
       
      Baixe a source do Discord-RPC.
      Tibia-RPC.rar
       
      Após baixar e abrir. Vá até o Discord.Cpp

       
      e vai aparecer assim pra você.
      Primeiro precisamos definir o ID do nosso Canal que criamos no Discord.
      Quando criamos o canal ele já nos da o ID do nosso canal. 
       

       
      Você cópia o ID e cola em cima do outro que está no Discord.CPP.
      Após isso vamos ver os detalhes.
       
      Em Rich Presence conseguimos visualizar a imagem que adicionamos Ok.
      Abaixo de Rich Presence tem o Art Assets que é onde adicionamos as imagens de logo e tal. Vamos em Visualizer Clicamos nele e então vamos editar nosso Dircord RPC da forma que desejarmos.

       
      Após Editar a direita veremos como ele vai ficar quando alguém passar o mouse em cima do úsuario.
       
      Vamos em Show Code e vemos como ficou o código nele. certo!

       
      bem de alguns não necessitamos necessáriamente a não ser que você queira adicionar mais alguma coisa. recomendo não mexer nessas linhas.
       
       
      DiscordRichPresence discordPresence; memset(&discordPresence, 0, sizeof(discordPresence)); discordPresence.startTimestamp = starttime; Discord_UpdatePresence(&discordPresence);  
      Tudo ok.
      Então vá até o Discord.cpp e edite-as como quiser. E vemos tudo lindo assim:

       
      Após isso só compilar e importar a dll no seu cliente tibia.
      Se você não tem nenhum importador de .dll eu vou disponibilizar pra você o link do Stud_PE
      Com ele você pode importa sua dll no seu cliente e ser feliz.
       
      Para importar a dll ao seu cliente, instale o Stud_PE no seu computador, após instalar. Abra.
      Importe o Tibia ou arraste o Tibia pra dentro do Stud_PE 
      Vá em Functions > Clique com o botão direito dentro da janela de Fuctions.

       
      Cliqu em Add New Import > Dll Select > Selecione a dll do Discord-RPC > Após isso Clique em > Select func. > Selecione a função > Após Clique em > Add to List e clique em ADD.
       

       
      Então só da Ok e abrir o seu Cliente.
       
      Bem eu vou mandar a versão que mostra o Nome e Level pra vocês assim:
       

       
      Essa versão mostra o Nome do personagem quando loga e o level. OBS: a dll faz um update de checagem a cada 5 segundos então precisa aguardar até seu nome aparecer.
       

       
      Em Discord.h você pode determinar o level máximo do seu servidor. fazendo cada linha por level.
       
      Você precisa procurar os endereços com o Cheat Engine.
      Se caso for procurar pelo Check Login pesquisa por 1 se o char estiver logado. E 0 quando estiver deslogado, vai procurando até encontar qual endereço muda quando logar e deslogar.
       
      Em questão do nome procura pro string e o nome do seu personagem. Na maioria das vezes é quase sempre o primeiro mas você pode mudar o nome no Cheat pra ter certeza.
      Em questão do Level Procura pelo valor do level por exemplo: 211, da um addskill pra level o level 212 e da um Next Scan na pesquisa com o valor novo pra ter certeza. e vai adicionando mais um pouco até ter a certeza.
      Supostamente eu encontrei na primeira pesquisa e só precisei upar 1 level mas vocês podem demorar um pouco.
      único coisa que não consegui identificar foi a vocação do personagem que eu queria muito mas com isso acho que já é o suficiente.
       
      Tibia-RPC N.L.rar✔️

      perdõe se eu não fui autoexplicativo e se postei na sessão errada. Corrijam-me se eu falei algo errado ou fiz algo de errado. Essa Source não fui eu quem criei.
      Eu usei o VS 2019. Qualquer dúvida por favor sinta-se a vontade.
       
      Meu obtjetivo é trazer algo novo pra comunidade e que possa ajudar outras pessoas.
      Esse lançamento pode ser inútil pra alguns mas para outros pode servidor de grande favor. Para aqueles que jogam usando Discord e tal.
       
       
       
    • By Erimyth
      Galerinha, muitas vezes vocês possuem items.otb editados ou de outras versões, porém o server não aceita ele e acaba dando erro na hora de abrir seu distro, leia esse fácil tutorial e seus problemas irão acabar!

      Eu usei o Crystal Server e TFS 0.4 para fazer este tutorial, porém acho que ele funciona em outras versões do TFS, bom, vamos lá!

      Vá nas sources do seu servidor, abra seu items.cpp e procure por:
       
      if(Items::dwMajorVersion == 0xFFFFFFFF) std::clog << "[Warning - Items::loadFromOtb] items.otb using generic client version." << std::endl; else if(Items::dwMajorVersion < 3) { std::clog << "[Error - Items::loadFromOtb] Old version detected, a newer version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(Items::dwMajorVersion > 3) { std::clog << "[Error - Items::loadFromOtb] New version detected, an older version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(!g_config.getBool(ConfigManager::SKIP_ITEMS_VERSION) && Items::dwMinorVersion != CLIENT_VERSION_920) { std::clog << "[Error - Items::loadFromOtb] Another (client) version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; }
      Agora substitua isso tudo por isso:
       
       
       
      /*if(Items::dwMajorVersion == 0xFFFFFFFF) std::clog << "[Warning - Items::loadFromOtb] items.otb using generic client version." << std::endl; else if(Items::dwMajorVersion < 3) { std::clog << "[Error - Items::loadFromOtb] Old version detected, a newer version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(Items::dwMajorVersion > 3) { std::clog << "[Error - Items::loadFromOtb] New version detected, an older version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; } else if(!g_config.getBool(ConfigManager::SKIP_ITEMS_VERSION) && Items::dwMinorVersion != CLIENT_VERSION_920) { std::clog << "[Error - Items::loadFromOtb] Another (client) version of items.otb is required." << std::endl; return ERROR_INVALID_FORMAT; }*/  

      Agora compile seu server e seja feliz!
      A única alteração que eu fiz na code é adicionar as tags de comentário /* */ para que o servidor não revise o otb.

      Tutorial feito por mim com exclusividade ao TibiaKing.com!
       
       

        Você gostou deste conteúdo!? Este conteúdo te ajudou!? Isso será realmente útil pra você!? Então, se possível, faça uma doação (de qualquer valor) que estará me ajudando também!  
    • By Ackerzin
      Mana e Life 100/100


       
      Salve galerinha, estive procurando em vários tópicos, algum codigo de life e mana 100/100, e nenhum deles funcionava perfeito para oque eu precisava, todos eles paravam de funcionar quando o player atingia o level 715835 ou mana/life "21474847" o numero 100 da vida virava 65750 ou da mana, de qual você atingisse primeiro "21474847" e pra quem quer por high XP isso é um problema, mas depois de muito, MUITO,MUITO,muito esforço de um amigo, @Rusherzin, ele conseguiu burla isso, e agora você pode pegar quantos de level/mana/life quiser que não vai sair de 100/100, então é isso vamos ao que interessa.
      TFS 0.4 foi testado !
      Nas SOURCES arquivo protocolgame.cpp procure por:
      void ProtocolGame::AddPlayerStats(NetworkMessage_ptr msg) e substitua por isso:
       
       
      Imagem mostrando certinho a life/mana 
      Créditos:
      99% @Rusherzin  Por fazer tudo !
      1% @Zzyzx Por ficar incomodando até ele fazer !
       
       
    • By Cat
      1 - Downloads Necessários:
      - Visual Studio 2019 Community: 
      https://visualstudio.microsoft.com/pt-br/thank-you-downloading-visual-studio/?sku=Community&rel=16
      - Microsoft Visual C++ 2015-2019 Redistributable: 
      (32-bit download, 64-bit download)
      - Git: 
      https://git-scm.com/download/win
       
       
      2 - Visual Studio 2019:
      - Na tela inicial do Visual Studio, no produto Visual Studio Community 2019 clique no botão Instalar.
      - Na próxima tela, selecione Desenvolvimento para Desktop com C++.
      - Na mesma tela em Detalhes da Instalação, selecione:
       
       
       
      - Depois em Pacotes de Idiomas, selecione:
       
       
       
      3 - Instale os softwares necessários:
      - Instale o Git:
       
       
      4 - VCPKG:
      - Utilize o Prompt de Comando ou Windows Powershell no diretório C:
      Prompt de Comando: cd C:\
      Windows Powershell: cd C:\
      - Para fazer a instalação completa do VCPKG, execute os comandos abaixo no Prompt de Comando ou Windows Powershell:
       
      5 - Sources OTServBR-Global:
      - Faça o download das sources do OTServBR-Global com o comando abaixo no Prompt de Comando ou Windows Powershell.
       
      6 - Instalação das bibliotecas VCPKG:
      - Escolha um dos conjuntos de bibliotecas abaixo de acordo com o seu sistema operacional.
      - Execute o comando com o Prompt de Comando ou Windows Powershell.
       
      - Para compilação em 64-bit:
      .\vcpkg install --triplet x64-windows boost-asio boost-filesystem boost-iostreams boost-lockfree boost-system boost-variant cryptopp libmariadb luajit mpir pugixml - Para compilação em 32-bit:
      .\vcpkg install boost-asio boost-filesystem boost-iostreams boost-lockfree boost-system boost-variant cryptopp libmariadb luajit mpir pugixml  
      - Após a escolha e a instalação de um dos conjuntos de bibliotecas, utilize o comando abaixo para integrar a instalação ao Visual Studio:
      .\vcpkg integrate install  
       
      7 - Compilando as Sources do OTServBR-Global:
      - Encontre o diretório vc14 do OTServBR-Global (C:\vcpkg\otservbr-global\vc14) e abra o arquivo otservbr-global.vcxproj. Isso irá abrir o Visual Studio e você estará apto a compilar as sources.
      - No Visual Studio, escolha a opção Release e a solução "Win32" ou "x64".
      - Para compilar as sources, clica em Build no menu e depois em Build Solution.
      - As sources serão compiladas com sucesso.
       
      7.1 - Observação:
      - Se o seu processador é antigo para melhor otimização, compile o servidor com a instrução abaixo:
      - No Visual Studio, edite as propriedades do projeto e troque 'Enhanced Instruction Set' para 'SSE2'.
       
       
       
      8 - DLL's Necessárias:
      Para compilação em 64-bit:
      - Copie as DLLs da pasta (C:\vcpkg\otservbr-global\vc14\x64\Release).
      - Copie o executável da pasta (C:\vcpkg\otservbr-global\vc14\x64\Release).
      - E cole na pasta raiz do servidor.
      Obs: a pasta do servidor pode ser salva em outro diretório de sua preferência e que tenha permissão para os arquivos.
       
      Para compilação em 32-bit:
      - Copie as DLLs da pasta (C:\vcpkg\otservbr-global\vc14\Release).
      - Copie o executável da pasta (C:\vcpkg\otservbr-global\vc14\Release). - E cole na pasta raiz do servidor.   Obs: a pasta do servidor pode ser salva em outro diretório de sua preferência e que tenha permissão para os arquivos.   9 - Abrindo o Servidor:
      - Para abrir o servidor OTServBR-Global, siga 1 (uma) das opções abaixo:
      [MySQL] OTServBR-Global + XAMPP + MyAAC:
       
      [MySQL] OTServBR-Global + Uniform Server + MyAAC:
       
      [MySQL] OTServBR-Global + Uniform Server + GesiorAAC2012:
       
      [MySQL] OTServBR-Global + Uniform Server + ZnoteAAC:
       
       
       
      10 - Créditos:
      Desenvolvedores TFS: https://github.com/otland/forgottenserver/wiki/Compiling-on-Windows-(vcpkg)
      Majesty (Tutorial de compilação do OTServBR-Global no VS2019)
      Microsoft - VCPKG: https://github.com/Microsoft/vcpkg
       
       
       
    • By Cat
      Atenção! Os arquivos disponibilizados abaixo são da versão 12.51!
      Para obter otserv 12.60 atualizado com novas áreas e novos gráficos acesse o github oficial do projeto: https://github.com/opentibiabr/otservbr-global
       
       
      ◄DATAPACK + DLLS►
      » OTX OtservBR Global 12.51 MediaFire (Scan)
                             » OtservBR Dlls & Executável (Windows 64x) MediaFire (Scan)
      »Correções e Atualizações Constantes GitHub

       
       
      ◄CLIENTS►
      » Tibia Client 12.51 MediaFire (Scan)
      (Para conectar ao cliente 12 (localhost), acesse usando 127.0.0.1_client.exe, localizado na pasta bin.)

       
       
      ◄WEB►
      » [GesiorAAC] Login.php para Tibia 12.51 MediaFire (Scan)
      (Salve o arquivo login.php na pasta do GesiorAAC e ws_login.php dentro na pasta pages.)
       
      » [MyAAC] Login.php para Tibia 12.51 MediaFire (Scan)
      (No Painel de Adm. do MyAAC, selecione Plugins e myaac-tibia12-login-v1.7.zip e clique em upload.
       
      » Tibia Store Images para 12.51
      https://tibiaking.com/topic/101207-gesioraac-znoteaac-myaac-tibia-store-1251/

       
      ◄IMAGENS►

       

       

       


       
      ◄INFORMAÇÕES►
       
       
       
      ◄Créditos►
      Desenvolvedores TFS
      Desenvolvedores OTX (Martyx)
      Desenvolvedores OTSERVBR
      Majesty
      GPedro
      Costallat
      Eduardo Dantas
      Gabriel Pedro
      Mateus
      Ibaah
      FakeShinoda
      marcosvf132
      HeberPcL
      Raphaellb
      Debone
      AndersonFaaria
      Oualid6496
      EPuncker
      Granoob
      Westwol
      Olimpotibia
      Newacc12
      Hygorrasec
      Fear Lucien
      Slavi Dodo
       
  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...

Important Information

Confirmação de Termo