Jump to content

VNum Range in iMer's InitializeItemTable


Recommended Posts

  • Premium

If you want to use actuall DE Drops and want to have full working DSS system you need to apply this.

Vnum_range binds every item from range as item witch have identical parameters but changed vnum.

If you using text files you can find record like this "110000~99". It binds every vnum from 110000 to 110099 as 110000 item but with changed vnum.

 

bool CClientManager::InitializeItemTable()
{
	std::ostringstream query;
	query << "SELECT vnum, type, subtype, name, " << g_stLocaleNameColumn << ", gold, shop_buy_price, weight, size, flag, wearflag, antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, limittype0, limitvalue0, limittype1, limitvalue1, applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, value0, value1, value2, value3, value4, value5, vnum_range, socket0, socket1, socket2 FROM item_proto ORDER BY vnum";
	std::auto_ptr<SQLMsg> sqlMsg(CDBManager::instance().DirectQuery(query.str().c_str(), SQL_PLAYER));
	if (sqlMsg == NULL) {
		sys_err("ClientManagerBoot::InitializeItemTable", __LINE__, "Could not load item_proto. Query failed!");
		return false;
	}

	MYSQL_RES* pRes = sqlMsg->vec_pkResult[0]->pSQLResult;

	if (pRes == NULL) {
		sys_err("ClientManagerBoot::InitializeItemTable", __LINE__, "Could not load item_proto. No result!");
		return 0;
	}

	if (!m_vec_itemTable.empty()) {
		sys_log(__LINE__, " Reloading item_proto");
		m_vec_itemTable.clear();
	}
	MYSQL_ROW row;
	while ((row = mysql_fetch_row(pRes))) {
		//SItemTable temp = {};
		SItemTable temp;
		memset(&temp, 0, sizeof(temp));
		if (row[0]&&*row[0]) temp.dwVnum = strtoul(row[0], NULL, 10);
		if (row[1]&&*row[1]) temp.bType = strtoul(row[1], NULL, 10);
		if (row[2]&&*row[2]) temp.bSubType = strtoul(row[2], NULL, 10);
		if (row[3]&&*row[3]) snprintf(temp.szName, 25, "%s", row[3]);
		if (row[4]&&*row[4]) snprintf(temp.szLocaleName, 25, "%s", row[4]);
		if (row[5]&&*row[5]) temp.dwGold = strtoul(row[5], NULL, 10);
		if (row[6]&&*row[6]) temp.dwShopBuyPrice = strtoul(row[6], NULL, 10);
		if (row[7]&&*row[7]) temp.bWeight = strtoul(row[7], NULL, 10);
		if (row[8]&&*row[8]) temp.bSize = strtoul(row[8], NULL, 10);
		if (row[9]&&*row[9]) temp.dwFlags = strtoul(row[9], NULL, 10);
		if (row[10]&&*row[10]) temp.dwWearFlags = strtoul(row[10], NULL, 10);
		if (row[11]&&*row[11]) temp.dwAntiFlags = strtoul(row[11], NULL, 10);
		if (row[12]&&*row[12]) temp.dwImmuneFlag = strtoul(row[12], NULL, 10);
		if (row[13]&&*row[13]) temp.dwRefinedVnum = strtoul(row[13], NULL, 10);
		if (row[14]&&*row[14]) temp.wRefineSet = strtoul(row[14], NULL, 10);
		if (row[15]&&*row[15]) temp.bAlterToMagicItemPct = strtoul(row[15], NULL, 10);
		if (row[16]&&*row[16]) temp.bGainSocketPct = strtoul(row[16], NULL, 10);
		if (row[17]&&*row[17]) temp.sAddonType = strtoul(row[17], NULL, 10);
		if (row[18]&&*row[18]) temp.aLimits[0].bType = strtoul(row[18], NULL, 10);
		if (row[19]&&*row[19]) temp.aLimits[0].lValue = strtoul(row[19], NULL, 10);
		if (row[20]&&*row[20]) temp.aLimits[1].bType = strtoul(row[20], NULL, 10);
		if (row[21]&&*row[21]) temp.aLimits[1].lValue = strtoul(row[21], NULL, 10);
		if (row[22]&&*row[22]) temp.aApplies[0].bType = strtoul(row[22], NULL, 10);
		if (row[23]&&*row[23]) temp.aApplies[0].lValue = strtoul(row[23], NULL, 10);
		if (row[24]&&*row[24]) temp.aApplies[1].bType = strtoul(row[24], NULL, 10);
		if (row[25]&&*row[25]) temp.aApplies[1].lValue = strtoul(row[25], NULL, 10);
		if (row[26]&&*row[26]) temp.aApplies[2].bType = strtoul(row[26], NULL, 10);
		if (row[27]&&*row[27]) temp.aApplies[2].lValue = strtoul(row[27], NULL, 10);
		if (row[28]&&*row[28]) temp.alValues[0] = strtoul(row[28], NULL, 10);
		if (row[29]&&*row[29]) temp.alValues[1] = strtoul(row[29], NULL, 10);
		if (row[30]&&*row[30]) temp.alValues[2] = strtoul(row[30], NULL, 10);
		if (row[31]&&*row[31]) temp.alValues[3] = strtoul(row[31], NULL, 10);
		if (row[32]&&*row[32]) temp.alValues[4] = strtoul(row[32], NULL, 10);
		if (row[33]&&*row[33]) temp.alValues[5] = strtoul(row[33], NULL, 10);
		if (row[34]&&*row[34]) temp.dwVnumRange = strtoul(row[34], NULL, 10);

		temp.cLimitRealTimeFirstUseIndex = -1;
		temp.cLimitTimerBasedOnWearIndex = -1;
		for (int i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) {
			if (LIMIT_REAL_TIME_START_FIRST_USE == temp.aLimits[i].bType)
				temp.cLimitRealTimeFirstUseIndex = (char) i;

			if (LIMIT_TIMER_BASED_ON_WEAR == temp.aLimits[i].bType)
				temp.cLimitTimerBasedOnWearIndex = (char) i;
		}
		m_vec_itemTable.push_back(temp);
	}
	std::cout << "CClientManager::InitializeItemTable:: " << m_vec_itemTable.size() << " items loaded." << std::endl;
	mysql_free_result(pRes);
	m_map_itemTableByVnum.clear();

	itertype(m_vec_itemTable) it = m_vec_itemTable.begin();

	while (it != m_vec_itemTable.end()) {
		TItemTable * item_table = &(*(it++));

		sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u",
				item_table->dwVnum,
				item_table->szName,
				item_table->szLocaleName,
				item_table->alValues[0],
				item_table->alValues[1],
				item_table->alValues[2],
				item_table->alValues[3],
				item_table->alValues[4],
				item_table->alValues[5],
				item_table->dwWearFlags,
				item_table->dwAntiFlags,
				item_table->dwImmuneFlag,
				item_table->dwRefinedVnum,
				item_table->wRefineSet,
				item_table->bAlterToMagicItemPct);

		m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
	}
	sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
	return true;
}
You need add vnum_range column to player.item_proto

This is my structure of item_proto

DROP TABLE IF EXISTS `item_proto`;
CREATE TABLE `item_proto` (
  `vnum` int(11) unsigned NOT NULL DEFAULT '0',
  `type` tinyint(2) NOT NULL DEFAULT '0',
  `subtype` tinyint(2) NOT NULL DEFAULT '0',
  `name` varbinary(24) NOT NULL DEFAULT 'Noname',
  `locale_name` varbinary(24) NOT NULL DEFAULT 'Noname',
  `shop_buy_price` int(10) unsigned NOT NULL DEFAULT '0',
  `size` tinyint(3) DEFAULT '0',
  `flag` int(11) DEFAULT '0',
  `gold` int(11) DEFAULT '0',
  `wearflag` int(11) DEFAULT '0',
  `antiflag` int(11) DEFAULT '0',
  `immuneflag` set('PARA','CURSE','STUN','SLEEP','SLOW','POISON','TERROR') CHARACTER SET latin1 NOT NULL DEFAULT '',
  `refined_vnum` int(10) unsigned NOT NULL DEFAULT '0',
  `weight` tinyint(3) DEFAULT '0',
  `refine_set` smallint(11) unsigned NOT NULL DEFAULT '0',
  `magic_pct` tinyint(4) NOT NULL DEFAULT '0',
  `socket_pct` tinyint(4) NOT NULL DEFAULT '0',
  `addon_type` smallint(6) NOT NULL DEFAULT '0',
  `limittype0` tinyint(4) DEFAULT '0',
  `limitvalue0` int(11) DEFAULT '0',
  `limittype1` tinyint(4) DEFAULT '0',
  `limitvalue1` int(11) DEFAULT '0',
  `applytype0` tinyint(4) DEFAULT '0',
  `applyvalue0` int(11) DEFAULT '0',
  `applytype1` tinyint(4) DEFAULT '0',
  `applyvalue1` int(11) DEFAULT '0',
  `applytype2` tinyint(4) DEFAULT '0',
  `applyvalue2` int(11) DEFAULT '0',
  `value0` int(11) DEFAULT '0',
  `value1` int(11) DEFAULT '0',
  `value2` int(11) DEFAULT '0',
  `value3` int(11) DEFAULT '0',
  `value4` int(11) DEFAULT '0',
  `value5` int(11) DEFAULT '0',
  `socket0` tinyint(4) DEFAULT '-1',
  `socket1` tinyint(4) DEFAULT '-1',
  `socket2` tinyint(4) DEFAULT '-1',
  `socket3` tinyint(4) DEFAULT '-1',
  `specular` tinyint(4) NOT NULL DEFAULT '0',
  `vnum_range` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`vnum`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Moreover, if you have actuall item_proto in your database you need to run this queries to fix DSS system

UPDATE item_proto SET vnum_range = '99' WHERE vnum=110000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=110100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=110200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=110300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=110400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=111000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=111100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=111200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=111300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=111400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=112000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=112100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=112200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=112300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=112400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=113000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=113100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=113200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=113300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=113400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=114000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=114100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=114200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=114300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=114400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=120000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=120100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=120200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=120300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=120400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=121000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=121100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=121200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=121300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=121400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=122000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=122100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=122200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=122300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=122400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=123000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=123100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=123200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=123300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=123400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=124000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=124100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=124200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=124300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=124400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=130000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=130100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=130200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=130300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=130400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=131000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=131100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=131200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=131300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=131400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=132000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=132100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=132200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=132300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=132400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=133000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=133100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=133200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=133300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=133400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=134000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=134100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=134200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=134300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=134400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=140000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=140100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=140200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=140300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=140400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=141000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=141100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=141200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=141300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=141400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=142000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=142100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=142200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=142300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=142400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=143000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=143100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=143200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=143300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=143400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=144000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=144100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=144200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=144300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=144400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=150000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=150100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=150200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=150300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=150400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=151000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=151100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=151200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=151300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=151400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=152000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=152100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=152200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=152300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=152400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=153000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=153100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=153200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=153300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=153400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=154000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=154100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=154200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=154300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=154400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=160000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=160100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=160200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=160300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=160400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=161000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=161100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=161200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=161300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=161400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=162000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=162100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=162200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=162300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=162400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=163000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=163100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=163200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=163300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=163400;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=164000;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=164100;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=164200;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=164300;

UPDATE item_proto SET vnum_range = '99' WHERE vnum=164400;

  • Love 8
Link to comment
Share on other sites

  • Premium

Thanks, but it's for people using sql protos ? Explain a little bit more please, and, what we have to do with the cpp code please ?

 

iMer posted on ePvP code from his lib. It can be used in 40k without many modifications.

 

It replacing functions responsible for loading item_proto. As we know since 34k we must using text protos. I don't like text protos so i edited function to work in 40k (when YMIR start using vnum range for DSS) and load vnum_range from database.

 

I can't explain this better, really xd

Link to comment
Share on other sites

  • 1 year later...
  • 6 months later...

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.