青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Codejie's C++ Space

Using C++

M2過程:修改DBCField對象,更新WOW.Dev Wiki

    在分析M2文件時,其中GlobalModelFlags是指向CreateureModelData.dbc的,這樣不可避免的要先分析這個表。使用wxDeMPQ的查看DBC功能,發現wiki已經有些過時了,隨便就更新了,參見這里
    下圖是wxDeMPQ分析DBC文件的圖片,配合DBC的Field配置說明,查看DBC還是滿方便的。


    這里是DBC的Field配置文件,XML格式的,好理解的,不解釋了:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <DBCFile version="1.0">
 3     <File name="GameTables.dbc" version="1.0">
 4         <Note>GameTables</Note>
 5         <Fields>
 6             <Field position="0" type="string" size="0">FieldA</Field>
 7             <Field position="1" type="integer" size="4">FieldB</Field>
 8             <Field position="2" type="integer" size="4">FieldC</Field>
 9         </Fields>
10     </File>
11   <File name="CreatureModelData.dbc" version="1.0">
12     <Note></Note>
13     <Fields>
14       <Field position="0" type="integer" size="4">ID</Field>
15       <Field position="1" type="integer" size="4">UnknownA</Field>
16       <Field position="2" type="string">ModulePath</Field>
17       <Field position="3" type="integer" size="4">UnknownB</Field>
18       <Field position="4" type="integer">UnknownC</Field>
19       <Field position="5" type="float">AnimationSpeed</Field>
20       <Field position="6" type="integer">UnknownD</Field>
21       <Field position="7" type="integer">UnknownE</Field>
22       <Field position="8" type="float">UnknownF</Field>
23       <Field position="9" type="float">UnknownG</Field>
24       <Field position="10" type="float">Unknown?</Field>
25       <Field position="11" type="integer">UnknownH</Field>
26       <Field position="12" type="integer">UnknownI</Field>
27       <Field position="13" type="integer">Unknown?1</Field>
28       <Field position="14" type="integer">GroupID</Field>
29       <Field position="15" type="float">Collision</Field>
30       <Field position="16" type="float">UnknownK</Field>
31       <Field position="17" type="float">UnknownL</Field>
32       <Field position="18" type="float">UnknownM</Field>
33       <Field position="19" type="float">UnknownN</Field>
34       <Field position="20" type="float">UnknownO</Field>
35       <Field position="21" type="float">UnknownP</Field>
36       <Field position="22" type="float">UnknownQ</Field>
37       <Field position="23" type="float">UnknownR</Field>
38       <Field position="24" type="float">UnknownS</Field>
39       <Field position="25" type="float">UnknownT</Field>      
40     </Fields>
41   </File>  
42     <File name="b.dbc" version="1.0">
43         <Note>this is a sample.</Note>
44         <Fields>
45             <Field position="0" type="string" size="0">FieldA</Field>
46             <Field position="1" type="integer" size="4">FieldB</Field>
47             <Field position="2" type="refid" size="4" refdbc="ref.dbc" reffield="0">FieldC</Field>
48             <Field position="3" type="array of integer" size="4" number="10">FieldD</Field>
49         </Fields>
50     </File>
51 </DBCFile>

    下面是分析上面XML的代碼,當前僅支持integer,string,float類型的Field,分析使用的是tinyxml,有興趣的可以看看。
    MPQDBCFieldObject.h
 1 #ifndef __MPQDBCFIELDOBJECT_H__
 2 #define __MPQDBCFIELDOBJECT_H__
 3 
 4 #include <string>
 5 #include <map>
 6 
 7 #include "FileBuffer.h"
 8 
 9 namespace DBCField
10 {
11     class CField;
12 }
13 
14 class CMPQDBCFieldManager
15 {
16 public:
17     typedef std::map<int, DBCField::CField*> TFieldMap;
18     typedef std::map<std::string, TFieldMap> TDBCMap;
19     struct FieldAttr_t
20     {
21         std::string m_strTitle;
22         int m_iPos;
23         std::string m_strType;
24         int m_iSize;
25         std::string m_strRefDBC;
26         int m_iRefPos;
27         int m_iNumber;
28     };
29 public:
30     CMPQDBCFieldManager();
31     virtual ~CMPQDBCFieldManager();
32 
33     int Load(const std::string& xml, bool reload = false);
34     const TFieldMap* FindDBCFields(const std::string& dbc) const;
35 private:
36     int ParseXML(const std::string& xml);
37     DBCField::CField* MakeDBCField(const FieldAttr_t& attr) const;
38     void Destory();
39 private:
40     TDBCMap _mapDBC;
41 };
42                                
43 
44 namespace DBCField
45 {
46 
47 enum FieldType { FT_INTEGER, FT_STRING, FT_FLOAT };
48 
49 class CField
50 {
51 public:
52     CField(FieldType type, const std::string& title, int pos, int size)
53         : m_strTitle(title), m_iPos(pos), m_eType(type), m_iSize(size)
54     {
55     }
56     virtual ~CField() {}
57 
58     virtual int Data2String(std::string& str, CFileBuffer& fb, int offset, int strpos = -1const;
59 public:
60     FieldType m_eType;
61     std::string m_strTitle;
62     int m_iPos;
63     int m_iSize;
64 };
65 
66 class CIntegerField : public CField
67 {
68 public:
69     CIntegerField(const std::string& title, int pos, int size)
70         : CField(FT_INTEGER, title, pos, size)
71     {
72     }
73 };
74 
75 class CStringField : public CField
76 {
77 public:
78     CStringField(const std::string& title, int pos, int size)
79         : CField(FT_STRING, title, pos, size)
80     {
81     }
82     virtual int Data2String(std::string& str, CFileBuffer& fb, int offset, int strpos = -1const;
83 };
84 
85 class CFloatField : public CField
86 {
87 public:
88     CFloatField(const std::string& title, int pos, int size)
89         : CField(FT_FLOAT, title, pos, size)
90     {
91     }
92     virtual int Data2String(std::string& str, CFileBuffer& fb, int offset, int strpos = -1const;
93 };
94 
95 }
96 #endif

  MPQDBCFieldObject.cpp
  1 #include "tinyxml.h"
  2 
  3 #include "Toolkit.h"
  4 
  5 #include "MPQDBCFieldObject.h"
  6 
  7 CMPQDBCFieldManager::CMPQDBCFieldManager()
  8 {
  9 }
 10 
 11 CMPQDBCFieldManager::~CMPQDBCFieldManager()
 12 {
 13     Destory();
 14 }
 15 
 16 void CMPQDBCFieldManager::Destory()
 17 {
 18     TDBCMap::iterator it = _mapDBC.begin();
 19     while(it != _mapDBC.end())
 20     {
 21         TFieldMap::iterator i = it->second.begin();
 22         while(i != it->second.end())
 23         {
 24             delete i->second;
 25             it->second.erase(i++);
 26         }
 27         _mapDBC.erase(it ++);
 28     }
 29 }
 30 
 31 int CMPQDBCFieldManager::Load(const std::string &xml, bool reload)
 32 {
 33     if(reload)
 34     {
 35         Destory();
 36     }
 37     return ParseXML(xml);        
 38 }
 39 
 40 const CMPQDBCFieldManager::TFieldMap* CMPQDBCFieldManager::FindDBCFields(const std::string& dbc) const
 41 {
 42     TDBCMap::const_iterator it = _mapDBC.find(dbc);
 43     if(it == _mapDBC.end())
 44         return NULL;
 45     return &it->second;
 46 }
 47 
 48 int CMPQDBCFieldManager::ParseXML(const std::string &xml)
 49 {
 50     TiXmlDocument doc;
 51     if(!doc.LoadFile(xml.c_str()))
 52         return -1;
 53 
 54     std::string name;
 55 
 56     const TiXmlElement* root = doc.RootElement();
 57     if(root->ValueStr() != "DBCFile")
 58         return -1;
 59     const TiXmlElement* file = root->FirstChildElement();
 60     while(file != NULL)
 61     {
 62         //File Attribute
 63         name.clear();
 64         const TiXmlAttribute* attr = file->FirstAttribute();
 65         while(attr != NULL)
 66         {
 67             if(attr->NameTStr() == "name")
 68                 name = attr->ValueStr();
 69             attr = attr->Next();
 70         }
 71         if(!name.empty())
 72         {
 73             TDBCMap::iterator it = _mapDBC.insert(std::make_pair(name, TFieldMap())).first;
 74             if(it == _mapDBC.end())
 75                 return -1;
 76 
 77             const TiXmlElement* fields = file->FirstChildElement("Fields");
 78             if(fields != NULL)
 79             {
 80                 const TiXmlElement * field = fields->FirstChildElement("Field");
 81                 while(field != NULL)
 82                 {
 83                     FieldAttr_t data;
 84                     data.m_iPos = -1;
 85                     data.m_strType.clear();
 86                     data.m_strTitle = field->GetText();
 87                     data.m_iSize = 4;
 88                     attr = field->FirstAttribute();
 89                     while(attr != NULL)
 90                     {
 91                         if(attr->NameTStr() == "position")
 92                             data.m_iPos = attr->IntValue();
 93                         else if(attr->NameTStr() == "type")
 94                             data.m_strType = attr->ValueStr();
 95                         else if(attr->NameTStr() == "size")
 96                             data.m_iSize = attr->IntValue();
 97                         else if(attr->NameTStr() == "refdbc")
 98                             data.m_strRefDBC = attr->ValueStr();
 99                         else if(attr->NameTStr() == "reffield")
100                             data.m_iRefPos = attr->IntValue();
101                         else if(attr->NameTStr() == "number")
102                             data.m_iNumber = attr->IntValue();
103 
104                         attr = attr->Next();
105                     }
106                     DBCField::CField* dbcfield = MakeDBCField(data);
107                     if(dbcfield != NULL)
108                     {
109                         TFieldMap::iterator i = it->second.find(data.m_iPos);
110                         if(i == it->second.end())
111                         {
112                             it->second.insert(std::make_pair(dbcfield->m_iPos, dbcfield));
113                         }
114                         else
115                         {
116                             delete i->second;
117                             i->second = dbcfield;
118                         }
119                     }
120 
121                     field = field->NextSiblingElement();
122                 }
123             }
124         }
125         file = file->NextSiblingElement();
126     }
127 
128     return 0;
129 }
130 
131 DBCField::CField* CMPQDBCFieldManager::MakeDBCField(const CMPQDBCFieldManager::FieldAttr_t &attr) const
132 {
133     if(attr.m_iPos == -1 || attr.m_strType.empty())
134         return NULL;
135     if(attr.m_strType == "integer")
136         return new DBCField::CIntegerField(attr.m_strTitle, attr.m_iPos, attr.m_iSize);
137     else if(attr.m_strType == "string")
138         return new DBCField::CStringField(attr.m_strTitle, attr.m_iPos, attr.m_iSize);
139     else if(attr.m_strType == "float")
140         return new DBCField::CFloatField(attr.m_strTitle, attr.m_iPos, attr.m_iSize);
141     return NULL;
142 }
143 
144 //////
145 namespace DBCField
146 {
147 
148 int CField::Data2String(std::string& str, CFileBuffer &fb, int offset, int strpos) const
149 {
150     int data = 0;
151     fb.Seek(offset);
152     fb.Read(data);
153 
154     Toolkit::StringOf<int>(data, str);
155 
156     return fb.Good() ? 0 : -1;
157 }
158 
159 //
160 int CStringField::Data2String(std::string& str, CFileBuffer &fb, int offset, int strpos) const
161 {
162     int data = 0;
163     fb.Seek(offset);
164     fb.Read(data);
165     
166     fb.Seek(data + strpos);
167     fb.Read(str);
168 
169     return fb.Good() ? 0 : -1;
170 }
171 
172 //
173 int CFloatField::Data2String(std::string& str, CFileBuffer &fb, int offset, int strpos) const
174 {
175     float data = 0.0f;
176     fb.Seek(offset);
177     fb.Read(data);
178     
179     Toolkit::StringOf<float>(data, str);
180 
181     return fb.Good() ? 0 : -1;
182 }
183 
184 }
185 

posted on 2009-03-31 16:50 codejie 閱讀(452) 評論(0)  編輯 收藏 引用 所屬分類: C++MPQ - WOW

公告

Using C++

導航

統計

留言簿(73)

隨筆分類(513)

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲特黄一级片| 久久er精品视频| 一区二区三区av| 91久久在线| 亚洲激情校园春色| 一区二区三区三区在线| 亚洲永久视频| 欧美一区二区免费| 久久精品五月| 亚洲高清精品中出| 亚洲国产视频一区二区| 亚洲午夜久久久久久久久电影网| 欧美一区二区视频网站| 欧美成人激情在线| 国产精品一区久久| 亚洲国产高清在线| 亚洲摸下面视频| 欧美激情五月| 欧美亚洲自偷自偷| 欧美精品在线视频| 国产性色一区二区| 99精品国产在热久久下载| 欧美一区深夜视频| 亚洲激情中文1区| 亚久久调教视频| 欧美理论电影网| 国内精品一区二区三区| 在线亚洲国产精品网站| 久久亚洲综合色| 亚洲午夜在线视频| 欧美人交a欧美精品| 激情小说亚洲一区| 亚洲欧美日韩精品久久奇米色影视 | 久久免费视频网| 亚洲狼人综合| 噜噜噜在线观看免费视频日韩| 国产精品成人一区二区艾草| 亚洲激情一区二区| 久久综合狠狠综合久久激情| 亚洲综合大片69999| 欧美日韩亚洲91| 日韩一区二区精品视频| 欧美成人一区二区三区在线观看| 亚洲免费在线视频| 国产精品美女久久久浪潮软件| 亚洲精品视频中文字幕| 欧美国产国产综合| 久久国产一区二区| 国产在线欧美日韩| 久久久国产精品一区二区中文| 亚洲午夜视频| 国产精品久久看| 久久亚洲国产精品一区二区| 免费在线成人av| 久久精品视频网| 国产亚洲成精品久久| 西瓜成人精品人成网站| 亚洲午夜免费视频| 国产伦精品一区二区| 午夜一区不卡| 午夜免费在线观看精品视频| 国产精品一区久久久久| 欧美在线free| 久久成人精品电影| 亚洲缚视频在线观看| 麻豆精品视频| 欧美不卡高清| 在线午夜精品| 欧美一级专区| 在线观看欧美黄色| 亚洲国产日韩一区| 欧美性色视频在线| 久久成年人视频| 久久久在线视频| 亚洲精品综合精品自拍| 亚洲精品美女在线观看| 欧美性久久久| 久久精品中文字幕免费mv| 久久免费视频在线观看| 99综合电影在线视频| 亚洲免费在线观看视频| 激情文学一区| 99在线热播精品免费| 国产欧美va欧美va香蕉在| 老司机精品久久| 欧美日韩视频在线| 久久久视频精品| 欧美精品日韩综合在线| 午夜精品久久久久久久久久久久| 欧美一级大片在线观看| 亚洲成人在线| 一区二区三区国产在线| 国精品一区二区| 亚洲精品免费在线播放| 国产亚洲精品久| 亚洲精品久久久久久久久久久久 | av不卡在线看| 欧美在线不卡视频| 亚洲深夜激情| 久久婷婷国产麻豆91天堂| 一二三区精品| 久久频这里精品99香蕉| 亚洲一区二区四区| 久久夜色精品国产噜噜av| 亚洲一区二区影院| 免费久久99精品国产自| 久久成人精品| 欧美午夜宅男影院| 亚洲国产视频a| 国语精品一区| 亚洲欧美久久| 中文av字幕一区| 你懂的国产精品| 99综合电影在线视频| 国产视频一区免费看| 亚洲国产一区二区三区在线播| 国产日韩精品一区二区| 一本色道久久综合亚洲精品小说| 樱桃视频在线观看一区| 欧美一级久久久久久久大片| 亚洲影视在线播放| 欧美高清视频在线| 欧美高清视频| 亚洲欧洲精品天堂一级| 看片网站欧美日韩| 美女精品国产| 一区二区三区亚洲| 久久精品综合一区| 久久人人爽人人爽| 国产一区二区三区四区在线观看| 亚洲午夜在线观看| 香蕉久久夜色精品| 国产欧美在线| 性亚洲最疯狂xxxx高清| 久久国产精品一区二区三区四区| 国产精品久久久久久久第一福利| 亚洲免费av电影| 亚洲网站在线| 国产精品另类一区| 午夜精品福利在线| 久久米奇亚洲| 在线免费观看日韩欧美| 噜噜噜久久亚洲精品国产品小说| 欧美成人午夜激情| 亚洲美女尤物影院| 欧美视频一区在线| 亚洲欧美三级伦理| 久久久欧美精品| 亚洲日本一区二区三区| 欧美精品在线免费观看| 这里只有精品丝袜| 久久精品色图| 最新日韩中文字幕| 欧美日韩一区二区三区在线| 亚洲深夜av| 巨胸喷奶水www久久久免费动漫| 在线免费不卡视频| 欧美日韩国产一级| 午夜精彩国产免费不卡不顿大片| 六月婷婷久久| av成人毛片| 国产日韩一区| 欧美福利一区| 午夜激情亚洲| 最新国产精品拍自在线播放| 亚洲欧美日韩精品在线| 国产日韩在线亚洲字幕中文| 久久琪琪电影院| 中文一区在线| 欧美激情第10页| 欧美一级专区免费大片| 怡红院av一区二区三区| 欧美日韩中国免费专区在线看| 亚洲欧美成人一区二区在线电影 | 久久久久女教师免费一区| 亚洲欧洲一区二区天堂久久| 欧美亚洲综合另类| 亚洲精品一区二区三区婷婷月| 国产精品久久久| 免费视频一区二区三区在线观看| 一区二区三区四区蜜桃| 久久9热精品视频| 亚洲人体1000| 久久午夜精品一区二区| 亚洲一区二区三区在线播放| 在线观看视频一区二区| 国产精品欧美一区二区三区奶水| 久久米奇亚洲| 性欧美精品高清| 一本久道久久综合狠狠爱| 米奇777超碰欧美日韩亚洲| 亚洲欧美在线看| 一区二区三区久久精品| 亚洲欧洲精品一区二区精品久久久| 国产欧美日韩综合一区在线观看| 欧美激情小视频| 久久影视精品| 久久精品视频在线免费观看| 亚洲欧美日韩国产中文| 夜夜夜久久久|