Lucrăm la îmbunătățirea site-ului! Este posibil ca unele module să nu funcționeze corect!
1 mesaj
Avatar utilizator
Administrator
  • Administrator

    Autor subiect

  • Mesaje: 2,607
  • Reacții: 29006
  • Mesaje utile: 17
  • Status: Pierd vremea ^.^
  • Server: Saga2 - Soon
  • Regat: Jinno
  • Discord: [Vezi ID]
  • Contact:
    Avatar utilizator
    Administrator

    Autor subiect

    Administrator
    *Descriere:

    Cu acest tutorial ai posibilitatea sa alegi ce tip de citire vrei pentru item_proto si mob_proto - SQL sau TXT.

    Dupa ce vei face pasii de mai jos, vei putea modifica din fisierul conf.txt daca sa iti citeasca SQL sau TXT baza de date. (NoTXT + DB)

    *Link download / Code:

    Deschidem db/src/Main.cpp adaugam sub includes:
    Code:
    // NOTXT_STARTUP_BEGIN
    BOOL g_noTXT = false;
    // NOTXT_STARTUP_END

    Acum cautam: int iDisableHotBackup; si adaugam sub:
    Code:
    	// NOTXT_STARTUP_BEGIN
    	int iNoTXT;
    	if (CConfig::instance().GetValue("NO_TXT", &iNoTXT))
    	{
    		if (iNoTXT)
    		{
    			sys_log(0, "CONFIG: NO_TXT");
    			g_noTXT = true;
    		}
    	}
    	// NOTXT_STARTUP_END

    Deschidem db/src/ClientManager.h si inlocuim:
    Code:
    	bool		InitializeMobTable();
    	bool		InitializeItemTable();
    Cu asta:
    Code:
    		// NOTXT_STARTUP_BEGIN
    		bool		InitializeMobTableTXT();
    		bool		InitializeItemTableTXT();
    		bool		InitializeMobTableSQL();
    		bool		InitializeItemTableSQL();
    		// NOTXT_STARTUP_END

    Deschidem db/src/ClientManagerBoot.cpp si punem asta sus in fisier:
    Code:
    // NOTXT_STARTUP_BEGIN
    extern int g_noTXT;
    // NOTXT_STARTUP_END
    Cautam:
    Code:
    bool CClientManager::InitializeMobTable()
    Inlocuim cu:
    Code:
    bool CClientManager::InitializeMobTableTXT()
    Si facem acelasi lucru cu ItemProto(::InitializeItemTable).

    Cautam: bool CClientManager::InitializeTables() si mai jos gasim:
    Code:
    	if (!InitializeMobTable())
    	{
    		sys_err("InitializeMobTable FAILED");
    		return false;
    	}
    	if (!MirrorMobTableIntoDB())
    	{
    		sys_err("MirrorMobTableIntoDB FAILED");
    		return false; 
    	}
    
    	if (!InitializeItemTable())
    	{
    		sys_err("InitializeItemTable FAILED");
    		return false; 
    	}
    
    	if (!MirrorItemTableIntoDB())
    	{
    		sys_err("MirrorItemTableIntoDB FAILED");
    		return false; 
    	}
    Inlocuim cu:
    Code:
    	// NOTXT_STARTUP_BEGIN
    	if (g_noTXT) // item and mob proto
    	{
    		if (!InitializeMobTableSQL())
    		{
    			sys_err("InitializeMobTableSQL FAILED");
    			return false;
    		}
    		if (!InitializeItemTableSQL())
    		{
    			sys_err("InitializeItemTableSQL FAILED");
    			return false;
    		}
    	}
    	else
    	{
    		if (!InitializeMobTableTXT())
    		{
    			sys_err("InitializeMobTableTXT FAILED");
    			return false;
    		}
    
    		if (!MirrorMobTableIntoDB())
    		{
    			sys_err("MirrorMobTableIntoDB FAILED");
    			return false;
    		}
    
    		if (!InitializeItemTableTXT())
    		{
    			sys_err("InitializeItemTableTXT FAILED");
    			return false;
    		}
    
    		if (!MirrorItemTableIntoDB())
    		{
    			sys_err("MirrorItemTableIntoDB FAILED");
    			return false;
    		}
    	}
    	// NOTXT_STARTUP_END
    Adaugam functiile astea in fisier, la sfarsit:
    Code:
    // NOTXT_STARTUP_BEGIN
    bool CClientManager::InitializeMobTableSQL()
    {
    	char query[4096];
    	snprintf(query, sizeof(query),
    		"SELECT vnum, name, %s, type, rank, battle_type, level, "
    		"size+0, ai_flag+0, setRaceFlag+0, setImmuneFlag+0, "
    		"on_click, empire, drop_item, resurrection_vnum, folder, "
    		"st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, "
    		"gold_min, gold_max, def, attack_speed, move_speed, "
    		"aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, "
    		"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, "
    		"skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2,"
    		"skill_vnum3, skill_level3, skill_vnum4, skill_level4 , sp_berserk, sp_stoneskin, "
    		"sp_godspeed, sp_deathblow, sp_revive "
    		"FROM mob_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)
    	{
    		sys_err("Could not load mob_proto. No results!");
    		return false;
    	}
    
    	sys_log(0, "MOB_PROTO loading...");
    
    	if (!m_vec_mobTable.empty())
    	{
    		sys_log(0, "RELOAD: mob_proto");
    		m_vec_mobTable.clear();
    	}
    
    	m_vec_mobTable.resize(pRes->uiNumRows);
    	memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
    	TMobTable * mob_table = &m_vec_mobTable[0];
    
    	MYSQL_ROW data;
    	int col;
    	while ((data = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		col = 0;
    		str_to_number(mob_table->dwVnum, data[col++]);
    		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->bType, data[col++]);
    		str_to_number(mob_table->bRank, 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++]);
    		str_to_number(mob_table->dwAIFlag, data[col++]);
    		str_to_number(mob_table->dwRaceFlag, data[col++]);
    		str_to_number(mob_table->dwImmuneFlag, data[col++]);
    		str_to_number(mob_table->bOnClickType, data[col++]);
    		str_to_number(mob_table->bEmpire, data[col++]);
    		str_to_number(mob_table->dwDropItemVnum, data[col++]);
    		str_to_number(mob_table->dwResurrectionVnum, data[col++]);
    		strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder));
    		str_to_number(mob_table->bStr, data[col++]);
    		str_to_number(mob_table->bDex, data[col++]);
    		str_to_number(mob_table->bCon, data[col++]);
    		str_to_number(mob_table->bInt, data[col++]);
    		str_to_number(mob_table->dwDamageRange[0], data[col++]);
    		str_to_number(mob_table->dwDamageRange[1], data[col++]);
    		str_to_number(mob_table->dwMaxHP, data[col++]);
    		str_to_number(mob_table->bRegenCycle, data[col++]);
    		str_to_number(mob_table->bRegenPercent, data[col++]);
    		str_to_number(mob_table->dwExp, data[col++]);
    		str_to_number(mob_table->dwGoldMin, data[col++]);
    		str_to_number(mob_table->dwGoldMax, data[col++]);
    		str_to_number(mob_table->wDef, data[col++]);
    		str_to_number(mob_table->sAttackSpeed, data[col++]);
    		str_to_number(mob_table->sMovingSpeed, data[col++]);
    		str_to_number(mob_table->bAggresiveHPPct, data[col++]);
    		str_to_number(mob_table->wAggressiveSight, data[col++]);
    		str_to_number(mob_table->wAttackRange, data[col++]);
    		str_to_number(mob_table->dwPolymorphItemVnum, data[col++]);
    
    		int i;
    		for (i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i)
    			str_to_number(mob_table->cEnchants[i], data[col++]);
    
    		for (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++]);
    
    		for (i = 0; i < MOB_SKILL_MAX_NUM; ++i)
    		{
    			str_to_number(mob_table->Skills[i].dwVnum, data[col++]);
    			str_to_number(mob_table->Skills[i].bLevel, 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++]);
    
    		sys_log(1, "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;
    	}
    
    	sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
    	sys_log(0, "CClientManager::InitializeMobTable:: %d mobs loaded.n", m_vec_mobTable.size());
    	return true;
    }
    
    bool CClientManager::InitializeItemTableSQL()
    {
    	char query[4096];
    	snprintf(query, sizeof(query),
    		"SELECT vnum, vnum_range, name, %s, type, subtype, 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 "
    		"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)
    	{
    		sys_err("Could not load item_proto. No results!");
    		return false;
    	}
    
    	sys_log(0, "ITEM_PROTO loading...");
    
    	if (!m_vec_itemTable.empty())
    	{
    		sys_log(0, "RELOAD: item_proto");
    		m_vec_itemTable.clear();
    		m_map_itemTableByVnum.clear();
    	}
    
    	m_vec_itemTable.resize(pRes->uiNumRows);
    	memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
    	TItemTable * item_table = &m_vec_itemTable[0];
    
    	MYSQL_ROW data;
    	int col;
    
    	while ((data = mysql_fetch_row(pRes->pSQLResult)))
    	{
    		col = 0;
    
    		str_to_number(item_table->dwVnum, data[col++]);
    		str_to_number(item_table->dwVnumRange, data[col++]);
    		strlcpy(item_table->szName, data[col++], sizeof(item_table->szName));
    		strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName));
    		str_to_number(item_table->bType, data[col++]);
    		str_to_number(item_table->bSubType, data[col++]);
    		str_to_number(item_table->dwGold, data[col++]);
    		str_to_number(item_table->dwShopBuyPrice, data[col++]);
    		str_to_number(item_table->bWeight, data[col++]);
    		str_to_number(item_table->bSize, data[col++]);
    		str_to_number(item_table->dwFlags, data[col++]);
    		str_to_number(item_table->dwWearFlags, data[col++]);
    		str_to_number(item_table->dwAntiFlags, data[col++]);
    		str_to_number(item_table->dwImmuneFlag, data[col++]);
    		str_to_number(item_table->dwRefinedVnum, data[col++]);
    		str_to_number(item_table->wRefineSet, data[col++]);
    		str_to_number(item_table->bAlterToMagicItemPct, data[col++]);
    		str_to_number(item_table->bGainSocketPct, data[col++]);
    		str_to_number(item_table->sAddonType, data[col++]);
    
    		item_table->cLimitRealTimeFirstUseIndex = -1;
    		item_table->cLimitTimerBasedOnWearIndex = -1;
    
    		int i;
    		for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i)
    		{
    			str_to_number(item_table->aLimits[i].bType, data[col++]);
    			str_to_number(item_table->aLimits[i].lValue, data[col++]);
    
    			if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType)
    				item_table->cLimitRealTimeFirstUseIndex = (char)i;
    
    			if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType)
    				item_table->cLimitTimerBasedOnWearIndex = (char)i;
    		}
    
    		for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i)
    		{
    			str_to_number(item_table->aApplies[i].bType, data[col++]);
    			str_to_number(item_table->aApplies[i].lValue, data[col++]);
    		}
    
    		for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i)
    			str_to_number(item_table->alValues[i], data[col++]);
    
    		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));
    		++item_table;
    	}
    
    	sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum());
    	sys_log(0, "CClientManager::InitializeMobTable:: %d items loaded.n", m_vec_itemTable.size());
    	return true;
    }
    // NOTXT_STARTUP_END
    Deschidem Navicat, mergem in player -> item_proto -> Design Table si creeam o coloana noua, pe care o mutam dupa coloana "vnum"
    Code:
      `vnum_range` int(11) unsigned NOT NULL DEFAULT '0',
    Acum, in serverul nostru (/usr/../game/server/db) adaugam in fisierul conf.txt ce tip de citire vrem la baza de date:

    NO_TXT = 1 inseamna ca citeste din Navicat (sql)
    NO_TXT = 0 inseamna ca citeste din Server (txt)

    Spor :)

    Cum descarc de pe TeraBox?

    • Este asemănător cu Mega.nz
    • Instalați-vă clientul lor de Download de aici
    • Faceți-vă un cont (vă puteți loga cu Facebook / Google / etc)
    • Dacă nu vreți să descărcați clientul de Download, folosiți acest site
    • Gata! Acum puteți descărca resursele

    De ce folosim TeraBox?

    • Este gratuit
    • Primești 1TB de spațiu gratuit la orice cont creat!
    • Este ușor de folosit și varianta premium este foarte ieftină
    • Fișierele nu sunt șterse niciodată
    TeraBox logo
    Te asteptam si pe serverul de Discord :p - aici ne-am strans toata comunitatea de Metin2 din Romania.
    Link: https://discord.gg/Kr9nUpWa4X

    Suntem aproape 1000 membri! - Avem chat activ zilnic, support, cereri, resurse.



    See full signature
    Tag-uri:

    🔥 Hai pe Discord! - Chat activ și support direct

    Te așteptăm și pe serverul de Discord - aici ne-am strâns toată comunitatea de Metin2 din România.

    Alătură-te acum!
    1300+ de membri activi!
    Robot Discord
    Roboțelu'
    Anunț

    Creează-ți un cont sau autentifică-te pentru a participa la discuție

    Trebuie să fii membru pentru a răspunde

    Creează-ți un cont

    Înregistrează-te și alătură-te comunității noastre

    Membrii pot crea subiecte noi și pot descărca resurse Metin2 Gratuit!


    Te poți înregistra rapid utilizând contul tău de Discord sau Github

    Înregistrare

    Autentifică-te

    • Subiecte similare

      • de [HF]White » » în Tutoriale
        0
        Răspunsuri
        467
        Vizualizări
        de [HF]White
      • de KintaRoyala69 » » în Arhivă probleme
        1
        Răspunsuri
        809
        Vizualizări
        de ZuZuR
      • de annoyed__ » » în Îmbunătățiri
        0
        Răspunsuri
        171
        Vizualizări
        de annoyed__
      • de [HF]White » » în Programe Utile
        0
        Răspunsuri
        274
        Vizualizări
        de [HF]White
      • de [HF]White » » în Îmbunătățiri
        1
        Răspunsuri
        1551
        Vizualizări
        de phzin2

    Înapoi la “Tutoriale”

    Informații

    Utilizatori ce navighează pe acest forum: Niciun utilizator înregistrat și 2 vizitatori