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

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>
            亚洲一区二区三区色| 日韩亚洲在线观看| 久久欧美肥婆一二区| 亚洲视频欧美在线| 欧美日韩亚洲综合一区| 亚洲一区二区在线免费观看视频 | 亚洲高清av| 欧美激情按摩| 亚洲精品美女在线观看| 亚洲最快最全在线视频| 亚洲一区二区免费看| 久久av二区| 欧美激情第9页| 国产精品视频内| 怡红院av一区二区三区| 日韩亚洲欧美成人| 久久久久久久一区二区三区| 欧美激情第3页| 亚洲一区二区三区午夜| 久久久久久久综合色一本| 欧美日韩第一区| 国产亚洲精品久久久久久| 日韩视频在线免费| 久久成人精品视频| 亚洲精品在线一区二区| 欧美在线综合视频| 欧美日韩亚洲91| 黄色亚洲在线| 亚洲伊人伊色伊影伊综合网| 鲁大师影院一区二区三区| 一本一道久久综合狠狠老精东影业 | 国产伦精品一区二区三区高清版 | 亚洲人午夜精品免费| 欧美自拍丝袜亚洲| 欧美午夜视频在线| 99热这里只有成人精品国产| 久久久天天操| 亚洲欧美日韩中文视频| 欧美日韩视频| 亚洲片在线资源| 美女尤物久久精品| 欧美一级久久| 国产伦精品一区二区三区免费| 亚洲精品欧美日韩专区| 久久精品国产清自在天天线| 一本色道久久综合亚洲精品不卡| 欧美sm视频| 亚洲高清中文字幕| 久久五月天婷婷| 欧美一区二区三区成人| 国产精品一区二区久久国产| 一区二区三区色| 国产精品青草久久| 亚洲精品老司机| 午夜在线一区| 一区二区三区日韩在线观看| 欧美激情1区2区3区| 亚洲盗摄视频| 蜜桃av一区| 久久中文精品| 亚洲成色精品| 欧美h视频在线| 久久一日本道色综合久久| 激情久久综合| 奶水喷射视频一区| 欧美xx视频| 日韩视频在线观看| 亚洲乱码国产乱码精品精天堂| 欧美好吊妞视频| 日韩一级黄色片| 99精品欧美一区二区三区综合在线| 欧美伦理91i| 亚洲网站在线| 亚洲欧美一区二区原创| 国内精品一区二区| 欧美激情偷拍| 国产精品超碰97尤物18| 欧美一区二区在线看| 午夜免费在线观看精品视频| 国产在线观看精品一区二区三区| 另类图片国产| 欧美激情一区二区三区在线视频观看 | 亚洲国产二区| 91久久久亚洲精品| 国产精品久久久久久久久久尿| 欧美一区二区大片| 老司机67194精品线观看| 一区二区国产日产| 欧美影视一区| 一本一本久久| 久久超碰97中文字幕| 亚洲乱码国产乱码精品精可以看| 99xxxx成人网| 黄色成人在线观看| 亚洲深夜av| 亚洲黄色一区| 午夜宅男欧美| 99热这里只有精品8| 亚洲欧美视频一区| 99日韩精品| 久久色中文字幕| 销魂美女一区二区三区视频在线| 美日韩在线观看| 久久成人羞羞网站| 欧美日韩国产成人在线91| 久久亚洲国产精品一区二区 | 亚洲美女福利视频网站| 欧美二区在线| 亚洲国产成人精品久久| 亚洲精品欧美一区二区三区| 亚洲一级特黄| 亚洲三级国产| 久久激情中文| 小黄鸭精品aⅴ导航网站入口| 欧美黑人在线播放| 久久久夜色精品亚洲| 国产精品美女久久久| 91久久精品视频| 亚洲国产欧美在线人成| 久久gogo国模啪啪人体图| 亚洲专区在线| 国产精品mm| 一本色道久久99精品综合| 亚洲人精品午夜在线观看| 久久久久.com| 久久久久**毛片大全| 国产欧美日韩综合一区在线观看| 99精品欧美一区二区三区综合在线 | 国产精品久线观看视频| 亚洲激情成人| 亚洲伦理在线观看| 欧美成人精品不卡视频在线观看| 蜜臀a∨国产成人精品| 狠狠久久亚洲欧美专区| 久久精品成人欧美大片古装| 久久精品成人| 在线观看成人av| 久久久久久亚洲综合影院红桃| 久久免费黄色| 亚洲高清不卡一区| 欧美高清一区| 亚洲免费观看视频| 亚洲一区亚洲| 国产偷自视频区视频一区二区| 亚洲综合精品四区| 久久美女性网| 亚洲国产二区| 欧美体内she精视频| 亚洲视频综合| 久久精品官网| 亚洲国产日韩在线一区模特| 欧美黄污视频| 亚洲一区国产精品| 另类欧美日韩国产在线| 亚洲欧洲一区二区三区在线观看| 欧美伦理91i| 性高湖久久久久久久久| 欧美国产激情| 亚洲视频碰碰| 国内外成人在线| 欧美国产精品日韩| 亚洲欧美国产精品专区久久| 麻豆精品在线视频| 亚洲图片欧洲图片日韩av| 国产亚洲精品高潮| 欧美日产在线观看| 欧美在线国产| 日韩一级在线| 久久久久免费视频| 一区二区精品在线| 在线免费观看视频一区| 欧美三区免费完整视频在线观看| 亚洲一区二区三区激情| 在线视频国内自拍亚洲视频| 欧美大片国产精品| 午夜精品成人在线| 最新成人av网站| 久久亚洲午夜电影| 亚洲影院色在线观看免费| 尤妮丝一区二区裸体视频| 国产精品h在线观看| 久久中文字幕一区| 亚洲免费网址| 亚洲日本电影| 另类成人小视频在线| 亚洲欧美日韩在线播放| 亚洲国语精品自产拍在线观看| 国产精品日韩欧美一区二区| 免费观看日韩| 久久久久久穴| 欧美一二三区精品| 一本色道久久精品| 亚洲欧洲日韩综合二区| 模特精品在线| 久久综合99re88久久爱| 欧美自拍偷拍| 欧美在线亚洲综合一区| 亚洲综合日韩| 亚洲免费视频网站| 亚洲少妇在线|