Tipologie server:Este server clean si in curs de modificare, inca nu m am gandit daca il fac pvp sau pvm.
*Resursă folosită:
*ServerFiles utilizat:by nicu de pe just4metin
*Syserr: Nu pot sa il dau acum dar am altceva, o poza.
*Poză: *Detalii suplimentare:Am incercat sa il fac sql dupa un tutorial dar as putea spune ca am dat gres,caut o explicatie mai buna a functiilor care trebuiesc modificate si ce fac , tab urile sa stiu daca se pun, oriunde este un loc liber intre cuvinte sau intre ce cifre, virgule, paranteze, etc...
Aici am continutul fisierului =>ClientManagerBoot.cpp:
// vim:ts=4 sw=4
#include <map>
#include "stdafx.h"
#include "ClientManager.h"
#include "Main.h"
#include "Monarch.h"
#include "CsvReader.h"
#include "ProtoReader.h"
using namespace std;
extern int g_test_server;
extern std::string g_stLocaleNameColumn;
bool CClientManager::InitializeTables()
{
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;
}
if (!InitializeShopTable())
{
sys_err("InitializeShopTable FAILED");
return false;
}
if (!InitializeSkillTable())
{
sys_err("InitializeSkillTable FAILED");
return false;
}
if (!InitializeRefineTable())
{
sys_err("InitializeRefineTable FAILED");
return false;
}
if (!InitializeItemAttrTable())
{
sys_err("InitializeItemAttrTable FAILED");
return false;
}
if (!InitializeItemRareTable())
{
sys_err("InitializeItemRareTable FAILED");
return false;
}
if (!InitializeBanwordTable())
{
sys_err("InitializeBanwordTable FAILED");
return false;
}
if (!InitializeLandTable())
{
sys_err("InitializeLandTable FAILED");
return false;
}
if (!InitializeObjectProto())
{
sys_err("InitializeObjectProto FAILED");
return false;
}
if (!InitializeObjectTable())
{
sys_err("InitializeObjectTable FAILED");
return false;
}
if (!InitializeMonarch())
{
sys_err("InitializeMonarch FAILED");
return false;
}
return true;
}
bool CClientManager::InitializeRefineTable()
{
char query[2048];
snprintf(query, sizeof(query),
"SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 FROM refine_proto%s",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
return true;
if (m_pRefineTable)
{
sys_log(0, "RELOAD: refine_proto");
delete [] m_pRefineTable;
m_pRefineTable = NULL;
}
m_iRefineTableSize = pRes->uiNumRows;
m_pRefineTable = new TRefineTable[m_iRefineTableSize];
memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);
TRefineTable* prt = m_pRefineTable;
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
//const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
//"vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 "
int col = 0;
//prt->src_vnum = atoi(data[col++]);
//prt->result_vnum = atoi(data[col++]);
str_to_number(prt->id, data[col++]);
str_to_number(prt->cost, data[col++]);
str_to_number(prt->prob, data[col++]);
for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
{
str_to_number(prt->materials.vnum, data[col++]);
str_to_number(prt->materials.count, data[col++]);
if (prt->materials.vnum == 0)
{
prt->material_count = i;
break;
}
}
sys_log(0, "REFINE: id %ld cost %d prob %d mat1 %lu cnt1 %d", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
prt++;
}
return true;
}
class FCompareVnum
{
public:
bool operator () (const TEntityTable & a, const TEntityTable & b) const
{
return (a.dwVnum < b.dwVnum);
}
};
bool CClientManager::InitializeMobTable()
{
char query[2048];
fprintf(stderr,"Loading mob_proto from MySQL ");
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, data[col++]);
for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
str_to_number(mob_table->cResists, 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++]);
//LÂz? vnum Aß°?
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," Complete! %d/%d Mobs loaded.\r\n",size,vnumSet.size());
sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
return true;
}
bool CClientManager::InitializeShopTable()
{
MYSQL_ROW data;
int col;
static const char * s_szQuery =
"SELECT "
"shop.vnum, "
"shop.npc_vnum, "
"shop_item.item_vnum, "
"shop_item.count "
"FROM shop LEFT JOIN shop_item "
"ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";
std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
// shopÀÇ vnumÀº Àִµ¥ shop_item ÀÌ ¾øÀ»°æ¿ì... ½ÇÆÐ·Î ó¸®µÇ´Ï ÁÖÀÇ ¿ä¸Á.
// °íó¾ßÇҺκÐ
SQLResult * pRes2 = pkMsg2->Get();
if (!pRes2->uiNumRows)
{
sys_err("InitializeShopTable : Table count is zero.");
return false;
}
std::map<int, TShopTable *> map_shop;
if (m_pShopTable)
{
delete [] (m_pShopTable);
m_pShopTable = NULL;
}
TShopTable * shop_table = m_pShopTable;
while ((data = mysql_fetch_row(pRes2->pSQLResult)))
{
col = 0;
int iShopVnum = 0;
str_to_number(iShopVnum, data[col++]);
if (map_shop.end() == map_shop.find(iShopVnum))
{
shop_table = new TShopTable;
memset(shop_table, 0, sizeof(TShopTable));
shop_table->dwVnum = iShopVnum;
map_shop[iShopVnum] = shop_table;
}
else
shop_table = map_shop[iShopVnum];
str_to_number(shop_table->dwNPCVnum, data[col++]);
if (!data[col]) // ¾ÆÀÌÅÛÀÌ Çϳªµµ ¾øÀ¸¸é NULLÀÌ ¸®ÅÏ µÇ¹Ç·Î..
continue;
TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
str_to_number(pItem->vnum, data[col++]);
str_to_number(pItem->count, data[col++]);
++shop_table->byItemCount;
}
m_pShopTable = new TShopTable[map_shop.size()];
m_iShopTableSize = map_shop.size();
typeof(map_shop.begin()) it = map_shop.begin();
int i = 0;
while (it != map_shop.end())
{
thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
++i;
}
return true;
}
bool CClientManager::InitializeQuestItemTable()
{
using namespace std;
static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";
char query[1024];
snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
{
sys_err("query error or no rows: %s", query);
return false;
}
MYSQL_ROW row;
while ((row = mysql_fetch_row(pRes->pSQLResult)))
{
int col = 0;
TItemTable tbl;
memset(&tbl, 0, sizeof(tbl));
str_to_number(tbl.dwVnum, row[col++]);
if (row[col])
strlcpy(tbl.szName, row[col], sizeof(tbl.szName));
col++;
if (row[col])
strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));
col++;
if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
{
sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
continue;
}
tbl.bType = ITEM_QUEST; // quest_item_proto Å×ÀÌºí¿¡ ÀÖ´Â °ÍµéÀº ¸ðµÎ ITEM_QUEST À¯Çü
tbl.bSize = 1;
m_vec_itemTable.push_back(tbl);
}
return true;
}
bool CClientManager::InitializeItemTable()
{
char query[2048];
fprintf(stderr,"Loading item_proto from MySQL");
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," Complete! %d Items loaded.\r\n",addNumber);
return true;
}
bool CClientManager::InitializeBanwordTable()
{
m_vec_banwordTable.clear();
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));
SQLResult * pRes = pkMsg->Get();
if (pRes->uiNumRows == 0)
return true;
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TBanwordTable t;
if (data[0])
{
strlcpy(t.szWord, data[0], sizeof(t.szWord));
m_vec_banwordTable.push_back(t);
}
}
sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
return true;
}
bool CClientManager::InitializeItemAttrTable()
{
char query[4096];
snprintf(query, sizeof(query),
"SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr%s ORDER BY apply",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr");
return false;
}
if (!m_vec_itemAttrTable.empty())
{
sys_log(0, "RELOAD: item_attr");
m_vec_itemAttrTable.clear();
}
m_vec_itemAttrTable.reserve(pRes->uiNumRows);
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TItemAttrTable t;
memset(&t, 0, sizeof(TItemAttrTable));
int col = 0;
strlcpy(t.szApply, data[col++], sizeof(t.szApply));
str_to_number(t.dwApplyIndex, data[col++]);
str_to_number(t.dwProb, data[col++]);
str_to_number(t.lValues[0], data[col++]);
str_to_number(t.lValues[1], data[col++]);
str_to_number(t.lValues[2], data[col++]);
str_to_number(t.lValues[3], data[col++]);
str_to_number(t.lValues[4], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
t.szApply,
t.dwProb,
t.lValues[0],
t.lValues[1],
t.lValues[2],
t.lValues[3],
t.lValues[4],
t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
m_vec_itemAttrTable.push_back(t);
}
return true;
}
bool CClientManager::InitializeItemRareTable()
{
char query[4096];
snprintf(query, sizeof(query),
"SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr_rare%s ORDER BY apply",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr_rare");
return false;
}
if (!m_vec_itemRareTable.empty())
{
sys_log(0, "RELOAD: item_attr_rare");
m_vec_itemRareTable.clear();
}
m_vec_itemRareTable.reserve(pRes->uiNumRows);
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TItemAttrTable t;
memset(&t, 0, sizeof(TItemAttrTable));
int col = 0;
strlcpy(t.szApply, data[col++], sizeof(t.szApply));
str_to_number(t.dwApplyIndex, data[col++]);
str_to_number(t.dwProb, data[col++]);
str_to_number(t.lValues[0], data[col++]);
str_to_number(t.lValues[1], data[col++]);
str_to_number(t.lValues[2], data[col++]);
str_to_number(t.lValues[3], data[col++]);
str_to_number(t.lValues[4], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
t.szApply,
t.dwProb,
t.lValues[0],
t.lValues[1],
t.lValues[2],
t.lValues[3],
t.lValues[4],
t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
m_vec_itemRareTable.push_back(t);
}
return true;
}
bool CClientManager::InitializeLandTable()
{
using namespace building;
char query[4096];
snprintf(query, sizeof(query),
"SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
"FROM land%s WHERE enable='YES' ORDER BY id",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!m_vec_kLandTable.empty())
{
sys_log(0, "RELOAD: land");
m_vec_kLandTable.clear();
}
m_vec_kLandTable.reserve(pRes->uiNumRows);
MYSQL_ROW data;
if (pRes->uiNumRows > 0)
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TLand t;
memset(&t, 0, sizeof(t));
int col = 0;
str_to_number(t.dwID, data[col++]);
str_to_number(t.lMapIndex, data[col++]);
str_to_number(t.x, data[col++]);
str_to_number(t.y, data[col++]);
str_to_number(t.width, data[col++]);
str_to_number(t.height, data[col++]);
str_to_number(t.dwGuildID, data[col++]);
str_to_number(t.bGuildLevelLimit, data[col++]);
str_to_number(t.dwPrice, data[col++]);
sys_log(0, "LAND: %lu map %-4ld %7ldx%-7ld w %-4ld h %-4ld", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
m_vec_kLandTable.push_back(t);
}
return true;
}
void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
{
// format: 10,1/20,3/300,50
const char * t = c_pszString;
const char * p = strchr(t, '/');
std::pair<int, int> k;
char szNum[32 + 1];
char * comma;
while (p)
{
if (isnhdigit(*t))
{
strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
comma = strchr(szNum, ',');
if (comma)
{
*comma = '\0';
str_to_number(k.second, comma+1);
}
else
k.second = 0;
str_to_number(k.first, szNum);
vec.push_back(k);
}
t = p + 1;
p = strchr(t, '/');
}
if (isnhdigit(*t))
{
strlcpy(szNum, t, sizeof(szNum));
comma = strchr(const_cast<char*>(t), ',');
if (comma)
{
*comma = '\0';
str_to_number(k.second, comma+1);
}
else
k.second = 0;
str_to_number(k.first, szNum);
vec.push_back(k);
}
}
bool CClientManager::InitializeObjectProto()
{
using namespace building;
char query[4096];
snprintf(query, sizeof(query),
"SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
"FROM object_proto%s ORDER BY vnum",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!m_vec_kObjectProto.empty())
{
sys_log(0, "RELOAD: object_proto");
m_vec_kObjectProto.clear();
}
m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));
MYSQL_ROW data;
if (pRes->uiNumRows > 0)
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TObjectProto t;
memset(&t, 0, sizeof(t));
int col = 0;
str_to_number(t.dwVnum, data[col++]);
str_to_number(t.dwPrice, data[col++]);
std::vector<std::pair<int, int> > vec;
parse_pair_number_string(data[col++], vec);
for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
{
std::pair<int, int> & r = vec;
t.kMaterials.dwItemVnum = r.first;
t.kMaterials.dwCount = r.second;
}
str_to_number(t.dwUpgradeVnum, data[col++]);
str_to_number(t.dwUpgradeLimitTime, data[col++]);
str_to_number(t.lLife, data[col++]);
str_to_number(t.lRegion[0], data[col++]);
str_to_number(t.lRegion[1], data[col++]);
str_to_number(t.lRegion[2], data[col++]);
str_to_number(t.lRegion[3], data[col++]);
// ADD_BUILDING_NPC
str_to_number(t.dwNPCVnum, data[col++]);
str_to_number(t.dwGroupVnum, data[col++]);
str_to_number(t.dwDependOnGroupVnum, data[col++]);
t.lNPCX = 0;
t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
// END_OF_ADD_BUILDING_NPC
sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
m_vec_kObjectProto.push_back(t);
}
return true;
}
bool CClientManager::InitializeObjectTable()
{
using namespace building;
char query[4096];
snprintf(query, sizeof(query), "SELECT id, land_id, vnum, map_index, x, y, x_rot, y_rot, z_rot, life FROM object%s ORDER BY id", GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!m_map_pkObjectTable.empty())
{
sys_log(0, "RELOAD: object");
m_map_pkObjectTable.clear();
}
MYSQL_ROW data;
if (pRes->uiNumRows > 0)
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TObject * k = new TObject;
memset(k, 0, sizeof(TObject));
int col = 0;
str_to_number(k->dwID, data[col++]);
str_to_number(k->dwLandID, data[col++]);
str_to_number(k->dwVnum, data[col++]);
str_to_number(k->lMapIndex, data[col++]);
str_to_number(k->x, data[col++]);
str_to_number(k->y, data[col++]);
str_to_number(k->xRot, data[col++]);
str_to_number(k->yRot, data[col++]);
str_to_number(k->zRot, data[col++]);
str_to_number(k->lLife, data[col++]);
sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
}
return true;
}
bool CClientManager::InitializeMonarch()
{
CMonarch::instance().LoadMonarch();
return true;
}
#include <map>
#include "stdafx.h"
#include "ClientManager.h"
#include "Main.h"
#include "Monarch.h"
#include "CsvReader.h"
#include "ProtoReader.h"
using namespace std;
extern int g_test_server;
extern std::string g_stLocaleNameColumn;
bool CClientManager::InitializeTables()
{
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;
}
if (!InitializeShopTable())
{
sys_err("InitializeShopTable FAILED");
return false;
}
if (!InitializeSkillTable())
{
sys_err("InitializeSkillTable FAILED");
return false;
}
if (!InitializeRefineTable())
{
sys_err("InitializeRefineTable FAILED");
return false;
}
if (!InitializeItemAttrTable())
{
sys_err("InitializeItemAttrTable FAILED");
return false;
}
if (!InitializeItemRareTable())
{
sys_err("InitializeItemRareTable FAILED");
return false;
}
if (!InitializeBanwordTable())
{
sys_err("InitializeBanwordTable FAILED");
return false;
}
if (!InitializeLandTable())
{
sys_err("InitializeLandTable FAILED");
return false;
}
if (!InitializeObjectProto())
{
sys_err("InitializeObjectProto FAILED");
return false;
}
if (!InitializeObjectTable())
{
sys_err("InitializeObjectTable FAILED");
return false;
}
if (!InitializeMonarch())
{
sys_err("InitializeMonarch FAILED");
return false;
}
return true;
}
bool CClientManager::InitializeRefineTable()
{
char query[2048];
snprintf(query, sizeof(query),
"SELECT id, cost, prob, vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 FROM refine_proto%s",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
return true;
if (m_pRefineTable)
{
sys_log(0, "RELOAD: refine_proto");
delete [] m_pRefineTable;
m_pRefineTable = NULL;
}
m_iRefineTableSize = pRes->uiNumRows;
m_pRefineTable = new TRefineTable[m_iRefineTableSize];
memset(m_pRefineTable, 0, sizeof(TRefineTable) * m_iRefineTableSize);
TRefineTable* prt = m_pRefineTable;
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
//const char* s_szQuery = "SELECT src_vnum, result_vnum, cost, prob, "
//"vnum0, count0, vnum1, count1, vnum2, count2, vnum3, count3, vnum4, count4 "
int col = 0;
//prt->src_vnum = atoi(data[col++]);
//prt->result_vnum = atoi(data[col++]);
str_to_number(prt->id, data[col++]);
str_to_number(prt->cost, data[col++]);
str_to_number(prt->prob, data[col++]);
for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++)
{
str_to_number(prt->materials.vnum, data[col++]);
str_to_number(prt->materials.count, data[col++]);
if (prt->materials.vnum == 0)
{
prt->material_count = i;
break;
}
}
sys_log(0, "REFINE: id %ld cost %d prob %d mat1 %lu cnt1 %d", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
prt++;
}
return true;
}
class FCompareVnum
{
public:
bool operator () (const TEntityTable & a, const TEntityTable & b) const
{
return (a.dwVnum < b.dwVnum);
}
};
bool CClientManager::InitializeMobTable()
{
char query[2048];
fprintf(stderr,"Loading mob_proto from MySQL ");
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, data[col++]);
for (int i = 0; i < MOB_RESISTS_MAX_NUM; ++i)
str_to_number(mob_table->cResists, 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++]);
//LÂz? vnum Aß°?
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," Complete! %d/%d Mobs loaded.\r\n",size,vnumSet.size());
sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum());
return true;
}
bool CClientManager::InitializeShopTable()
{
MYSQL_ROW data;
int col;
static const char * s_szQuery =
"SELECT "
"shop.vnum, "
"shop.npc_vnum, "
"shop_item.item_vnum, "
"shop_item.count "
"FROM shop LEFT JOIN shop_item "
"ON shop.vnum = shop_item.shop_vnum ORDER BY shop.vnum, shop_item.item_vnum";
std::auto_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
// shopÀÇ vnumÀº Àִµ¥ shop_item ÀÌ ¾øÀ»°æ¿ì... ½ÇÆÐ·Î ó¸®µÇ´Ï ÁÖÀÇ ¿ä¸Á.
// °íó¾ßÇҺκÐ
SQLResult * pRes2 = pkMsg2->Get();
if (!pRes2->uiNumRows)
{
sys_err("InitializeShopTable : Table count is zero.");
return false;
}
std::map<int, TShopTable *> map_shop;
if (m_pShopTable)
{
delete [] (m_pShopTable);
m_pShopTable = NULL;
}
TShopTable * shop_table = m_pShopTable;
while ((data = mysql_fetch_row(pRes2->pSQLResult)))
{
col = 0;
int iShopVnum = 0;
str_to_number(iShopVnum, data[col++]);
if (map_shop.end() == map_shop.find(iShopVnum))
{
shop_table = new TShopTable;
memset(shop_table, 0, sizeof(TShopTable));
shop_table->dwVnum = iShopVnum;
map_shop[iShopVnum] = shop_table;
}
else
shop_table = map_shop[iShopVnum];
str_to_number(shop_table->dwNPCVnum, data[col++]);
if (!data[col]) // ¾ÆÀÌÅÛÀÌ Çϳªµµ ¾øÀ¸¸é NULLÀÌ ¸®ÅÏ µÇ¹Ç·Î..
continue;
TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
str_to_number(pItem->vnum, data[col++]);
str_to_number(pItem->count, data[col++]);
++shop_table->byItemCount;
}
m_pShopTable = new TShopTable[map_shop.size()];
m_iShopTableSize = map_shop.size();
typeof(map_shop.begin()) it = map_shop.begin();
int i = 0;
while (it != map_shop.end())
{
thecore_memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
++i;
}
return true;
}
bool CClientManager::InitializeQuestItemTable()
{
using namespace std;
static const char * s_szQuery = "SELECT vnum, name, %s FROM quest_item_proto ORDER BY vnum";
char query[1024];
snprintf(query, sizeof(query), s_szQuery, g_stLocaleNameColumn.c_str());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
{
sys_err("query error or no rows: %s", query);
return false;
}
MYSQL_ROW row;
while ((row = mysql_fetch_row(pRes->pSQLResult)))
{
int col = 0;
TItemTable tbl;
memset(&tbl, 0, sizeof(tbl));
str_to_number(tbl.dwVnum, row[col++]);
if (row[col])
strlcpy(tbl.szName, row[col], sizeof(tbl.szName));
col++;
if (row[col])
strlcpy(tbl.szLocaleName, row[col], sizeof(tbl.szLocaleName));
col++;
if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
{
sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
continue;
}
tbl.bType = ITEM_QUEST; // quest_item_proto Å×ÀÌºí¿¡ ÀÖ´Â °ÍµéÀº ¸ðµÎ ITEM_QUEST À¯Çü
tbl.bSize = 1;
m_vec_itemTable.push_back(tbl);
}
return true;
}
bool CClientManager::InitializeItemTable()
{
char query[2048];
fprintf(stderr,"Loading item_proto from MySQL");
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," Complete! %d Items loaded.\r\n",addNumber);
return true;
}
bool CClientManager::InitializeBanwordTable()
{
m_vec_banwordTable.clear();
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery("SELECT word FROM banword"));
SQLResult * pRes = pkMsg->Get();
if (pRes->uiNumRows == 0)
return true;
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TBanwordTable t;
if (data[0])
{
strlcpy(t.szWord, data[0], sizeof(t.szWord));
m_vec_banwordTable.push_back(t);
}
}
sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
return true;
}
bool CClientManager::InitializeItemAttrTable()
{
char query[4096];
snprintf(query, sizeof(query),
"SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr%s ORDER BY apply",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr");
return false;
}
if (!m_vec_itemAttrTable.empty())
{
sys_log(0, "RELOAD: item_attr");
m_vec_itemAttrTable.clear();
}
m_vec_itemAttrTable.reserve(pRes->uiNumRows);
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TItemAttrTable t;
memset(&t, 0, sizeof(TItemAttrTable));
int col = 0;
strlcpy(t.szApply, data[col++], sizeof(t.szApply));
str_to_number(t.dwApplyIndex, data[col++]);
str_to_number(t.dwProb, data[col++]);
str_to_number(t.lValues[0], data[col++]);
str_to_number(t.lValues[1], data[col++]);
str_to_number(t.lValues[2], data[col++]);
str_to_number(t.lValues[3], data[col++]);
str_to_number(t.lValues[4], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
t.szApply,
t.dwProb,
t.lValues[0],
t.lValues[1],
t.lValues[2],
t.lValues[3],
t.lValues[4],
t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
m_vec_itemAttrTable.push_back(t);
}
return true;
}
bool CClientManager::InitializeItemRareTable()
{
char query[4096];
snprintf(query, sizeof(query),
"SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5, weapon, body, wrist, foots, neck, head, shield, ear FROM item_attr_rare%s ORDER BY apply",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr_rare");
return false;
}
if (!m_vec_itemRareTable.empty())
{
sys_log(0, "RELOAD: item_attr_rare");
m_vec_itemRareTable.clear();
}
m_vec_itemRareTable.reserve(pRes->uiNumRows);
MYSQL_ROW data;
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TItemAttrTable t;
memset(&t, 0, sizeof(TItemAttrTable));
int col = 0;
strlcpy(t.szApply, data[col++], sizeof(t.szApply));
str_to_number(t.dwApplyIndex, data[col++]);
str_to_number(t.dwProb, data[col++]);
str_to_number(t.lValues[0], data[col++]);
str_to_number(t.lValues[1], data[col++]);
str_to_number(t.lValues[2], data[col++]);
str_to_number(t.lValues[3], data[col++]);
str_to_number(t.lValues[4], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_BODY], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_NECK], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
t.szApply,
t.dwProb,
t.lValues[0],
t.lValues[1],
t.lValues[2],
t.lValues[3],
t.lValues[4],
t.bMaxLevelBySet[ATTRIBUTE_SET_WEAPON],
t.bMaxLevelBySet[ATTRIBUTE_SET_BODY],
t.bMaxLevelBySet[ATTRIBUTE_SET_WRIST],
t.bMaxLevelBySet[ATTRIBUTE_SET_FOOTS],
t.bMaxLevelBySet[ATTRIBUTE_SET_NECK],
t.bMaxLevelBySet[ATTRIBUTE_SET_HEAD],
t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD],
t.bMaxLevelBySet[ATTRIBUTE_SET_EAR]);
m_vec_itemRareTable.push_back(t);
}
return true;
}
bool CClientManager::InitializeLandTable()
{
using namespace building;
char query[4096];
snprintf(query, sizeof(query),
"SELECT id, map_index, x, y, width, height, guild_id, guild_level_limit, price "
"FROM land%s WHERE enable='YES' ORDER BY id",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!m_vec_kLandTable.empty())
{
sys_log(0, "RELOAD: land");
m_vec_kLandTable.clear();
}
m_vec_kLandTable.reserve(pRes->uiNumRows);
MYSQL_ROW data;
if (pRes->uiNumRows > 0)
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TLand t;
memset(&t, 0, sizeof(t));
int col = 0;
str_to_number(t.dwID, data[col++]);
str_to_number(t.lMapIndex, data[col++]);
str_to_number(t.x, data[col++]);
str_to_number(t.y, data[col++]);
str_to_number(t.width, data[col++]);
str_to_number(t.height, data[col++]);
str_to_number(t.dwGuildID, data[col++]);
str_to_number(t.bGuildLevelLimit, data[col++]);
str_to_number(t.dwPrice, data[col++]);
sys_log(0, "LAND: %lu map %-4ld %7ldx%-7ld w %-4ld h %-4ld", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
m_vec_kLandTable.push_back(t);
}
return true;
}
void parse_pair_number_string(const char * c_pszString, std::vector<std::pair<int, int> > & vec)
{
// format: 10,1/20,3/300,50
const char * t = c_pszString;
const char * p = strchr(t, '/');
std::pair<int, int> k;
char szNum[32 + 1];
char * comma;
while (p)
{
if (isnhdigit(*t))
{
strlcpy(szNum, t, MIN(sizeof(szNum), (p-t)+1));
comma = strchr(szNum, ',');
if (comma)
{
*comma = '\0';
str_to_number(k.second, comma+1);
}
else
k.second = 0;
str_to_number(k.first, szNum);
vec.push_back(k);
}
t = p + 1;
p = strchr(t, '/');
}
if (isnhdigit(*t))
{
strlcpy(szNum, t, sizeof(szNum));
comma = strchr(const_cast<char*>(t), ',');
if (comma)
{
*comma = '\0';
str_to_number(k.second, comma+1);
}
else
k.second = 0;
str_to_number(k.first, szNum);
vec.push_back(k);
}
}
bool CClientManager::InitializeObjectProto()
{
using namespace building;
char query[4096];
snprintf(query, sizeof(query),
"SELECT vnum, price, materials, upgrade_vnum, upgrade_limit_time, life, reg_1, reg_2, reg_3, reg_4, npc, group_vnum, dependent_group "
"FROM object_proto%s ORDER BY vnum",
GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!m_vec_kObjectProto.empty())
{
sys_log(0, "RELOAD: object_proto");
m_vec_kObjectProto.clear();
}
m_vec_kObjectProto.reserve(MAX(0, pRes->uiNumRows));
MYSQL_ROW data;
if (pRes->uiNumRows > 0)
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TObjectProto t;
memset(&t, 0, sizeof(t));
int col = 0;
str_to_number(t.dwVnum, data[col++]);
str_to_number(t.dwPrice, data[col++]);
std::vector<std::pair<int, int> > vec;
parse_pair_number_string(data[col++], vec);
for (unsigned int i = 0; i < OBJECT_MATERIAL_MAX_NUM && i < vec.size(); ++i)
{
std::pair<int, int> & r = vec;
t.kMaterials.dwItemVnum = r.first;
t.kMaterials.dwCount = r.second;
}
str_to_number(t.dwUpgradeVnum, data[col++]);
str_to_number(t.dwUpgradeLimitTime, data[col++]);
str_to_number(t.lLife, data[col++]);
str_to_number(t.lRegion[0], data[col++]);
str_to_number(t.lRegion[1], data[col++]);
str_to_number(t.lRegion[2], data[col++]);
str_to_number(t.lRegion[3], data[col++]);
// ADD_BUILDING_NPC
str_to_number(t.dwNPCVnum, data[col++]);
str_to_number(t.dwGroupVnum, data[col++]);
str_to_number(t.dwDependOnGroupVnum, data[col++]);
t.lNPCX = 0;
t.lNPCY = MAX(t.lRegion[1], t.lRegion[3])+300;
// END_OF_ADD_BUILDING_NPC
sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
m_vec_kObjectProto.push_back(t);
}
return true;
}
bool CClientManager::InitializeObjectTable()
{
using namespace building;
char query[4096];
snprintf(query, sizeof(query), "SELECT id, land_id, vnum, map_index, x, y, x_rot, y_rot, z_rot, life FROM object%s ORDER BY id", GetTablePostfix());
std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));
SQLResult * pRes = pkMsg->Get();
if (!m_map_pkObjectTable.empty())
{
sys_log(0, "RELOAD: object");
m_map_pkObjectTable.clear();
}
MYSQL_ROW data;
if (pRes->uiNumRows > 0)
while ((data = mysql_fetch_row(pRes->pSQLResult)))
{
TObject * k = new TObject;
memset(k, 0, sizeof(TObject));
int col = 0;
str_to_number(k->dwID, data[col++]);
str_to_number(k->dwLandID, data[col++]);
str_to_number(k->dwVnum, data[col++]);
str_to_number(k->lMapIndex, data[col++]);
str_to_number(k->x, data[col++]);
str_to_number(k->y, data[col++]);
str_to_number(k->xRot, data[col++]);
str_to_number(k->yRot, data[col++]);
str_to_number(k->zRot, data[col++]);
str_to_number(k->lLife, data[col++]);
sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));
}
return true;
}
bool CClientManager::InitializeMonarch()
{
CMonarch::instance().LoadMonarch();
return true;
}
[ Postat de pe Android ]



de