Jump to content

Recommended Posts



Hello to all,
The title says everything about my problem, I would like to understand how to connect my txt 
files to Mysql. many tell me not to use txt files for work ... as Mysql is better! What are you thinking? 
and would you tell me how to get the files to read Mysql?

(The server started successfully, but it looks like a file read .txt

both methods are proper, txt proto files can be faster for loading db at startup

If you want protos at mysql you must edit your DB source file ClientManagerBoot.cpp

CClientManager::InitializeMobTable() {...}

CClientManager::InitializeItemTable() {...}

Spoiler

bool CClientManager::InitializeMobTable()
{
	char query[2048];
	snprintf(query, sizeof(query),
			"SELECT vnum,name,%s,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag,"
"empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min,"
"gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item,"
"resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate,"
"resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect,"
"resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0,"
"skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2,"
"skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s"
,g_stLocaleNameColumn.c_str(),
			GetTablePostfix());

	std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
	SQLResult * pRes = pkMsg->Get();

	if (!pRes->uiNumRows)
		return false;

	if (!m_vec_mobTable.empty())
	{
		sys_log(0, "RELOAD: mob_proto");
		m_vec_mobTable.clear();
	}
	int size = pRes->uiNumRows;
	m_vec_mobTable.resize(size);
	memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
	TMobTable * mob_table = &m_vec_mobTable[0];
	
	MYSQL_ROW data;
	//return true;
	set<int> vnumSet;
	while ((data = mysql_fetch_row(pRes->pSQLResult)))
	{
		
		/*
		"SELECT vnum,name,locale_name,rank,type,battle_type,level,size,ai_flag,mount_capacity,setRaceFlag,setImmuneFlag,"
"empire,folder,on_click,st,dx,ht,iq,damage_min,damage_max,max_hp,regen_cycle,regen_percent,gold_min,"
"gold_max,exp,def,attack_speed,move_speed,aggressive_hp_pct,aggressive_sight,attack_range,drop_item,"
"resurrection_vnum,enchant_curse,enchant_slow,enchant_poison,enchant_stun,enchant_critical,enchant_penetrate,"
"resist_sword,resist_twohand,resist_dagger,resist_bell,resist_fan,resist_bow,resist_fire,resist_elect,"
"resist_magic,resist_wind,resist_poison,dam_multiply,summon,drain_sp,mob_color,polymorph_item,skill_level0,"
"skill_vnum0,skill_level1,skill_vnum1,sp_berserk,sp_stoneskin,sp_godspeed,sp_deathblow,sp_revive,skill_level2,"
"skill_vnum2,skill_level3,skill_vnum3,skill_level4,skill_vnum4 FROM mob_proto%s */
		int col = 0;
		str_to_number(mob_table->dwVnum, data[col++]);
		if(mob_table->dwVnum ==0) continue;
		strlcpy(mob_table->szName,data[col++] , sizeof(mob_table->szName));
		strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName));
		str_to_number(mob_table->bRank,data[col++]);
		str_to_number(mob_table->bType,data[col++]);
		str_to_number(mob_table->bBattleType,data[col++]);
		str_to_number(mob_table->bLevel,data[col++]);
		str_to_number(mob_table->bSize,data[col++]);
		//AI_FLAG
		mob_table->dwAIFlag = get_Mob_AIFlag_Value(data[col++]);
		//mount_capacity;
		col++;
		//RACE_FLAG
		mob_table->dwRaceFlag = get_Mob_RaceFlag_Value(data[col++]);
		//IMMUNE_FLAG
		mob_table->dwImmuneFlag = get_Mob_ImmuneFlag_Value(data[col++]);
		mob_table->bEmpire = atoi(data[col++]);
		strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));
		mob_table->bOnClickType = atoi(data[col++]);
		mob_table->bStr = atoi(data[col++]);
		mob_table->bDex = atoi(data[col++]);
		mob_table->bCon = atoi(data[col++]);
		mob_table->bInt = atoi(data[col++]);
		mob_table->dwDamageRange[0] = atoi(data[col++]);
		mob_table->dwDamageRange[1] = atoi(data[col++]);
		mob_table->dwMaxHP = atoi(data[col++]);
		mob_table->bRegenCycle = atoi(data[col++]);
		mob_table->bRegenPercent = atoi(data[col++]);
		mob_table->dwGoldMin = atoi(data[col++]);
		mob_table->dwGoldMax = atoi(data[col++]);
		mob_table->dwExp = atoi(data[col++]);
		mob_table->wDef = atoi(data[col++]);
		mob_table->sAttackSpeed = atoi(data[col++]);
		mob_table->sMovingSpeed = atoi(data[col++]);
		mob_table->bAggresiveHPPct = atoi(data[col++]);
		mob_table->wAggressiveSight = atoi(data[col++]);
		mob_table->wAttackRange = atoi(data[col++]);	
		str_to_number(mob_table->dwDropItemVnum, data[col++]);	//32
		str_to_number(mob_table->dwResurrectionVnum, data[col++]);
		for (int i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
			str_to_number(mob_table->cEnchants[i], data[col++]);

		for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
			str_to_number(mob_table->cResists[i], data[col++]);

		str_to_number(mob_table->fDamMultiply, data[col++]);
		str_to_number(mob_table->dwSummonVnum, data[col++]);
		str_to_number(mob_table->dwDrainSP, data[col++]);

		//Mob_Color
		++col;

		str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);

		str_to_number(mob_table->Skills[0].bLevel, data[col++]);
		str_to_number(mob_table->Skills[0].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[1].bLevel, data[col++]);
		str_to_number(mob_table->Skills[1].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[2].bLevel, data[col++]);
		str_to_number(mob_table->Skills[2].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[3].bLevel, data[col++]);
		str_to_number(mob_table->Skills[3].dwVnum, data[col++]);
		str_to_number(mob_table->Skills[4].bLevel, data[col++]);
		str_to_number(mob_table->Skills[4].dwVnum, data[col++]);

		str_to_number(mob_table->bBerserkPoint, data[col++]);
		str_to_number(mob_table->bStoneSkinPoint, data[col++]);
		str_to_number(mob_table->bGodSpeedPoint, data[col++]);
		str_to_number(mob_table->bDeathBlowPoint, data[col++]);
		str_to_number(mob_table->bRevivePoint, data[col++]);

		//ĽÂżˇ vnum Ăß°ˇ
		vnumSet.insert(mob_table->dwVnum);
		
		
		//fprintf(stderr, "MOB #%d %s %s level: %u rank: %u empire: %d\n", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
		//sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
		++mob_table;
	}
	fprintf(stderr,"\e[32mMOB_PROTO: %d/%d mobs loaded.\r\n\e[39m",size,vnumSet.size());
	sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
	return true;

}

 

 

Spoiler


bool CClientManager::InitializeItemTable()
{
            char query[2048];
            snprintf(query, sizeof(query),
            "SELECT vnum,name,%s,type,subtype,weight,size,antiflag,flag,wearflag,immuneflag+0,gold,shop_buy_price,refined_vnum,"
            "refine_set,magic_pct,limittype0,limitvalue0,limittype1,limitvalue1,applytype0,applyvalue0,"
            "applytype1,applyvalue1,applytype2,applyvalue2,value0,value1,value2,value3,value4,value5,socket_pct,addon_type FROM item_proto%s  ORDER BY vnum",
            g_stLocaleNameColumn.c_str(),
            GetTablePostfix());
     
            std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
            SQLResult * pRes = pkMsg->Get();
     
            if (!pRes->uiNumRows)
                    return false;
            int addNumber = pRes->uiNumRows;
            if (!m_vec_itemTable.empty())
            {
                    sys_log(0, "RELOAD: item_proto");
                    m_vec_itemTable.clear();
                    m_map_itemTableByVnum.clear();
            }
     
            m_vec_itemTable.resize(addNumber-1);
            memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
            TItemTable * item_table = &m_vec_itemTable[0];
     
            MYSQL_ROW data;
            //return true;
            set<int> vnumSet;
            while ((data = mysql_fetch_row(pRes->pSQLResult)))
            {
                    str_to_number(item_table->dwVnum, data[0]);
                    strlcpy(item_table->szName,data[1] , sizeof(item_table->szName));
                    strlcpy(item_table->szLocaleName, data[2], sizeof(item_table->szLocaleName));
                    str_to_number(item_table->bType, data[3]);
                    str_to_number(item_table->bSubType, data[4]);
                    str_to_number(item_table->bWeight, data[5]);
                    str_to_number(item_table->bSize, data[6]);
                    str_to_number(item_table->dwAntiFlags, data[7]);
                    str_to_number(item_table->dwFlags, data[8]);
                    str_to_number(item_table->dwWearFlags, data[9]);
                    str_to_number(item_table->dwImmuneFlag, data[10]);
                    str_to_number(item_table->dwGold, data[11]);
                    str_to_number(item_table->dwShopBuyPrice, data[12]);
                    str_to_number(item_table->dwRefinedVnum, data[13]);
                    str_to_number(item_table->wRefineSet, data[14]);
                    str_to_number(item_table->bAlterToMagicItemPct, data[15]);
                    item_table->cLimitRealTimeFirstUseIndex = -1;
                    item_table->cLimitTimerBasedOnWearIndex = -1;
                   
                    str_to_number(item_table->aLimits[0].bType, data[16]);
                    str_to_number(item_table->aLimits[0].lValue, data[17]);
                    if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[0].bType)
                            item_table->cLimitRealTimeFirstUseIndex = (char)0;
                    if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[0].bType)
                            item_table->cLimitTimerBasedOnWearIndex = (char)0;
                           
                    str_to_number(item_table->aLimits[1].bType, data[18]);
                    str_to_number(item_table->aLimits[1].lValue, data[19]);
                    if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[1].bType)
                            item_table->cLimitRealTimeFirstUseIndex = (char)1;
                    if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[1].bType)
                            item_table->cLimitTimerBasedOnWearIndex = (char)1;
                   
     
                    str_to_number(item_table->aApplies[0].bType, data[20]);
                    str_to_number(item_table->aApplies[0].lValue, data[21]);
                   
                    str_to_number(item_table->aApplies[1].bType, data[22]);
                    str_to_number(item_table->aApplies[1].lValue, data[23]);
                   
                    str_to_number(item_table->aApplies[2].bType, data[24]);
                    str_to_number(item_table->aApplies[2].lValue, data[25]);
                   
     
                    str_to_number(item_table->alValues[0], data[26]);
                    str_to_number(item_table->alValues[1], data[27]);
                    str_to_number(item_table->alValues[2], data[28]);
                    str_to_number(item_table->alValues[3], data[29]);
                    str_to_number(item_table->alValues[4], data[30]);
			str_to_number(item_table->alValues[5], data[31]);
                           
                    str_to_number(item_table->bGainSocketPct, data[32]);
                    str_to_number(item_table->sAddonType, data[33]);
			
     
                    vnumSet.insert(item_table->dwVnum);
                    m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table));
                    /*sys_log(0, "ITEM: #%-5lu %-24s %-24s VAL: %d %ld %d %d %d %d WEAR %d ANTI %d IMMUNE %d 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);*/
     
                    item_table++;
            }
			fprintf(stderr," \e[32mITEM_PROTO: %d/%d items loaded.\r\n\e[39m",addNumber,vnumSet.size());
            return true;
     
}

 

And delete or comment

 

if (!MirrorMobTableIntoDB())

{...}

if (!MirrorItemTableIntoDB())

{...}

 

  • Premium

Personally i hated .txt, until i made a batch script to download them from my server, execute the dump_proto and copy them to my locale.

So i would now say, .txt ftw.

  • Love 1

Don't use any images from : imgur, turkmmop, freakgamers, inforge, hizliresim... Or your content will be deleted without notice...
Use : https://metin2.download/media/add/

Please use https://metin2.download/ when uploading files smaller than 100MB, otherwise the approval will take longer due to manual upload.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • 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.