Jump to content

[C++] Verificar itens


Aeglon
 Share

Recommended Posts

Copyright

Descobri este tutorial algures na net, mas sinceramente não me recordo onde porque apenas hoje o fui testar. Se alguém souber o forum\owner... que faça reply e eu actualizo!

 

A ideia desta função é simples. Sempre que o jogador faz login, o servidor procura todos os itens com bónus no inventário deste jogador e faz um cruzamento de valores com a base de dados. Se o item estiver com bónus inferiores\superiores ao permitido, o item irá ser automaticamente rodado para novos bonus e será enviada uma messangem para o jogador.

Tutorial

//#input_login.cpp

Spoiler
//1. Search: 
	d->SetPhase(PHASE_GAME);
//1. Add after:
	ch->CheckWrongItems();

 

// #char.cpp

Spoiler
//1. Search: 
int	CHARACTER::GetSkillPowerByLevel(int level, bool bMob) const
{
	return CTableBySkill::instance().GetSkillPowerByLevelFromType(GetJob(), GetSkillGroup(), MINMAX(0, level, SKILL_MAX_LEVEL), bMob);
}

//1. Add after:
void CHARACTER::CheckWrongItems()
{
	
	for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
	{
		LPITEM item;
		
		if (!(item = GetInventoryItem(i)))
			continue;
		
		for (int ia = 0; ia < ITEM_ATTRIBUTE_MAX_NUM; ia++)
		{
			const TPlayerItemAttribute& attr = item->GetAttribute(ia);
			const TItemAttrTable & r = g_map_itemAttr[attr.bType];
			
			if(item->GetAttributeSetIndex() != -1 && attr.sValue > r.lValues[r.bMaxLevelBySet[item->GetAttributeSetIndex()] - 1])
			{
				ChatPacket(CHAT_TYPE_INFO, "Wrong item found : %s, pos = %d, value = %d, max_value = %d", 
											item->GetName(), i, attr.sValue, r.lValues[r.bMaxLevelBySet[item->GetAttributeSetIndex()] - 1]);
				
				DBManager::instance().DirectQuery("INSERT INTO log.wrong_items(player_id, item_id, date, w_b_value) VALUES(%d, %d, NOW(), '%d|%d')", 
													GetPlayerID(), item->GetID(), attr.bType, attr.sValue);
					
				item->ChangeAttribute();
				//item->RemoveFromCharacter();
													
				break;
			}
		}
		
		continue;
	}
}

 

//#char.h

Spoiler

//1. Search: 
		int		GetSkillPowerByLevel(int level, bool bMob = false) const;
//1. Add after:
		void 	CheckWrongItems();

 

 

//#Correr isto no Navicat para criar a tabela de logs dos files alterados

Spoiler

/*
Navicat MySQL Data Transfer

Source Server         : VPS_RANSOM
Source Server Version : 50552
Source Host           : 188.212.103.221:3306
Source Database       : log

Target Server Type    : MYSQL
Target Server Version : 50552
File Encoding         : 65001

Date: 2017-08-06 09:43:37
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `wrong_items`
-- ----------------------------
DROP TABLE IF EXISTS `new_wrong_items`;
CREATE TABLE `new_wrong_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `player_id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `w_b_value` char(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of wrong_items
-- ----------------------------

 

 

//#Falhas detectadas

Apenas uma. Armas com DM são automaticamente alteradas.  Eu resolvi com uma verificação de vnum! 

Acho este sistema engraçado apenas por segurança dos jogadores. Eu pessoalmente nunca vi um bónus ser alterado derivado a algum "BUG"... mas nunca se sabe xD

 

Sistema testado e a funcionar quase na perfeição. Nota 7/10 ;P

Edited by Aeglon
  • Like 2
  • Thanks 1
Link to comment
Share on other sites

15 minutos atrás, Nukayool disse:

Boas, 

Não entendi muito a ideia do sistema ele roda para os bónus que foram mexidos no item_proto certo?

pelo que entendi é o seguinte , imagina o bonus hh, sendo o max hh 20 e o min 10, imagina que a arma fica com hh superior a 20 e inferior a 10, quando o char logar, o item com esse bonus será rodado

Link to comment
Share on other sites

8 horas atrás, LuizFernando disse:

Aeglon, você pode me mandar a correção para armas que tem dn/ds?

Eu apenas testei esse sistema ontem, e detectei outra falha.... Ao efectuar o login, os meu bónus do sash eram alterados também. Acabei por remover e apagar tudo. Quando eu voltar a adicionar o sistema eu irei actualizar com as correcções por mim detectadas.

Link to comment
Share on other sites

5 horas atrás, Aeglon disse:

Eu apenas testei esse sistema ontem, e detectei outra falha.... Ao efectuar o login, os meu bónus do sash eram alterados também. Acabei por remover e apagar tudo. Quando eu voltar a adicionar o sistema eu irei actualizar com as correcções por mim detectadas.

metias para verificar se o type do item era sash, se fosse ignorava

Link to comment
Share on other sites

5 horas atrás, GODSPEED disse:

metias para verificar se o type do item era sash, se fosse ignorava

sim sim, mas eu acabei por remover o sistema porque detectei alguns bugs e de momento resolve-los não eram a minha prioridade. E como este é um sistema fácil de adicionar\remover... optei por remover tudo e voltar a ele mais tarde.

 

Link to comment
Share on other sites

Alguém sabe como meter este sistema a verificar também os bónus 6/7 ? porque ele apenas verifica os  1/5

Desta forma são ignorados todos os itens com DM\DH, Todos os itens do tipo "Costume". e não sei de todo como meter isto a verificar os bónus 6/7

 

Spoiler
void CHARACTER::CheckWrongItems()
{
	
	for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
	{
		LPITEM item;
		if (!(item = GetInventoryItem(i)))
			continue;
		
		const int MAX_NORM_ATTR_NUM = ITEM_MANAGER::MAX_NORM_ATTR_NUM;
		for (int ia = 0; ia < MAX_NORM_ATTR_NUM; ia++)
		{
			const TPlayerItemAttribute& attr = item->GetAttribute(ia);
			const TItemAttrTable & r = g_map_itemAttr[attr.bType];
			
			if ((attr.bType == 71 ) || (attr.bType == 72) || (attr.bType == 73 ) || (attr.bType == 74) )
				break;
			if (ITEM_COSTUME == item->GetType())
				break;
			
			if(item->GetAttributeSetIndex() != -1 && attr.sValue > r.lValues[r.bMaxLevelBySet[item->GetAttributeSetIndex()] - 1])
			{
				ChatPacket(CHAT_TYPE_INFO, "Wrong item found : %s, pos = %d, value = %d, max_value = %d", item->GetName(), i, attr.sValue, r.lValues[r.bMaxLevelBySet[item->GetAttributeSetIndex()] - 1]);
				DBManager::instance().DirectQuery("INSERT INTO log.wrong_items(player_id, item_id, date, w_b_value) VALUES(%d, %d, NOW(), '%d|%d')", GetPlayerID(), item->GetID(), attr.bType, attr.sValue);

				item->ChangeRareAttribute();
				item->ChangeAttribute();
				break;
			}
		}
		continue;
	}
}

 

 

Edited by Aeglon
Link to comment
Share on other sites

  • 3 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...