📄 charcontrol.cpp
字号:
} catch (NPCDB::NotFound) {}
// Equip our npc
try {
cd.equipment[CS_HEAD] = items.getItemNum(npcrec.getUInt(NPCDB::HelmID));
cd.equipment[CS_SHOULDER] = items.getItemNum(npcrec.getUInt(NPCDB::ShoulderID));
cd.equipment[CS_SHIRT] = items.getItemNum(npcrec.getUInt(NPCDB::ShirtID));
cd.equipment[CS_CHEST] = items.getItemNum(npcrec.getUInt(NPCDB::ChestID));
cd.equipment[CS_BELT] = items.getItemNum(npcrec.getUInt(NPCDB::BeltID));
cd.equipment[CS_PANTS] = items.getItemNum(npcrec.getUInt(NPCDB::PantsID));
cd.equipment[CS_BOOTS] = items.getItemNum(npcrec.getUInt(NPCDB::BootsID));
cd.equipment[CS_BRACERS] = items.getItemNum(npcrec.getUInt(NPCDB::BracersID));
cd.equipment[CS_GLOVES] = items.getItemNum(npcrec.getUInt(NPCDB::GlovesID));
cd.equipment[CS_TABARD] = items.getItemNum(npcrec.getUInt(NPCDB::TabardID));
if (cd.equipment[CS_TABARD] != 0)
cd.geosets[12] = 2;
} catch (...) {}
if (cd.maxFaceType==0) cd.maxFaceType = 1;
if (cd.maxSkinColor==0) cd.maxSkinColor = 1;
if (cd.maxHairColor==0) cd.maxHairColor = 1;
if (cd.maxHairStyle==0) cd.maxHairStyle = 1;
if (cd.maxFacialHair==0) cd.maxFacialHair = 1;
spins[0]->SetRange(0, cd.maxSkinColor-1);
spins[1]->SetRange(0, cd.maxFaceType-1);
spins[2]->SetRange(0, cd.maxHairColor-1);
spins[3]->SetRange(0, cd.maxHairStyle-1);
spins[4]->SetRange(0, cd.maxFacialHair-1);
spins[5]->SetRange(0, cd.maxHairColor-1);
spins[SPIN_SKIN_COLOR]->SetValue(cd.skinColor);
spins[SPIN_FACE_TYPE]->SetValue(cd.faceType);
spins[SPIN_HAIR_COLOR]->SetValue(cd.hairColor);
spins[SPIN_HAIR_STYLE]->SetValue(cd.hairStyle);
spins[SPIN_FACIAL_HAIR]->SetValue(cd.facialHair);
spins[SPIN_FACIAL_COLOR]->SetValue(cd.facialColor);
tabardSpins[SPIN_TABARD_ICON]->SetValue(td.Icon);
tabardSpins[SPIN_TABARD_ICONCOLOR]->SetValue(td.IconColor);
tabardSpins[SPIN_TABARD_BORDER]->SetValue(td.Border);
tabardSpins[SPIN_TABARD_BORDERCOLOR]->SetValue(td.BorderColor);
tabardSpins[SPIN_TABARD_BACKGROUND]->SetValue(td.Background);
tabardSpins[SPIN_TABARD_ICON]->SetRange(0, td.maxIcon);
tabardSpins[SPIN_TABARD_ICONCOLOR]->SetRange(0, td.maxIconColor);
tabardSpins[SPIN_TABARD_BORDER]->SetRange(0, td.maxBorder);
tabardSpins[SPIN_TABARD_BORDERCOLOR]->SetRange(0, td.maxBorderColor);
tabardSpins[SPIN_TABARD_BACKGROUND]->SetRange(0, td.maxBackground);
for (int i=0; i<NUM_SPIN_BTNS; i++) spins[i]->Refresh(false);
for (int i=0; i<NUM_TABARD_BTNS; i++) tabardSpins[i]->Refresh(false);
for (int i=0; i<NUM_CHAR_SLOTS; i++) {
if (labels[i]) labels[i]->SetLabel(_T("---- None ----"));
}
if (gobtex)
texturemanager.del(gobtex);
gobtex = 0;
}
void CharControl::OnSpin(wxSpinEvent &event)
{
if (canvas->modelType == MT_NPC)
return;
if (event.GetId()==ID_SKIN_COLOR) cd.skinColor = event.GetPosition();
if (event.GetId()==ID_FACE_TYPE) cd.faceType = event.GetPosition();
if (event.GetId()==ID_HAIR_COLOR) {
cd.hairColor = event.GetPosition();
cd.facialColor = event.GetPosition();
}
if (event.GetId()==ID_HAIR_STYLE) cd.hairStyle = event.GetPosition();
if (event.GetId()==ID_FACIAL_HAIR) cd.facialHair = event.GetPosition();
if (event.GetId()==ID_FACIAL_COLOR) cd.facialColor = event.GetPosition();
RefreshModel();
}
void CharControl::OnCheck(wxCommandEvent &event)
{
if (event.GetId()==ID_SHOW_UNDERWEAR) cd.showUnderwear = event.IsChecked();
if (event.GetId()==ID_SHOW_HAIR) cd.showHair = event.IsChecked();
if (event.GetId()==ID_SHOW_FACIALHAIR) cd.showFacialHair = event.IsChecked();
if (event.GetId()==ID_SHOW_EARS) cd.showEars = event.IsChecked();
if (event.GetId()==ID_SHEATHE) bSheathe = event.IsChecked();
if (event.GetId()==ID_USENPCSKINS) cd.useNPC = event.IsChecked();
RefreshEquipment();
RefreshModel();
}
bool slotHasModel(int i)
{
return (i==CS_HEAD || i==CS_SHOULDER || i==CS_HAND_LEFT || i==CS_HAND_RIGHT);
}
void CharControl::RefreshEquipment()
{
for (int i=0; i<NUM_CHAR_SLOTS; i++) {
if (slotHasModel(i))
RefreshItem(i);
if (labels[i])
labels[i]->SetLabel(wxString(items.get(cd.equipment[i]).name.c_str(), *wxConvCurrent));
}
}
void CharControl::OnButton(wxCommandEvent &event)
{
bool needRefresh = true;
if (event.GetId()==ID_SAVE_EQUIPMENT) {
needRefresh = false;
wxFileDialog dialog(this, _("Save equipment"), wxEmptyString, wxEmptyString, _T("Equipment files (*.eq)|*.eq"), wxSAVE|wxOVERWRITE_PROMPT);
dialog.SetDirectory(".");
if (dialog.ShowModal()==wxID_OK) {
wxString s(dialog.GetPath());
cd.save(s, &td);
}
}
else if (event.GetId()==ID_LOAD_EQUIPMENT) {
wxFileDialog dialog(this, _("Load equipment"), wxEmptyString, wxEmptyString, _T("Equipment files (*.eq)|*.eq"), wxOPEN|wxFILE_MUST_EXIST);
dialog.SetDirectory(".");
if (dialog.ShowModal()==wxID_OK) {
for (int i=0; i<NUM_CHAR_SLOTS; i++) cd.equipment[i] = 0;
wxString s(dialog.GetPath());
if (cd.load(s, &td)) {
spins[SPIN_SKIN_COLOR]->SetValue(cd.skinColor);
spins[SPIN_FACE_TYPE]->SetValue(cd.faceType);
spins[SPIN_HAIR_COLOR]->SetValue(cd.hairColor);
spins[SPIN_HAIR_STYLE]->SetValue(cd.hairStyle);
spins[SPIN_FACIAL_HAIR]->SetValue(cd.facialHair);
spins[SPIN_FACIAL_COLOR]->SetValue(cd.hairColor);
for (int i=0; i<NUM_SPIN_BTNS; i++) spins[i]->Refresh(false);
}
RefreshEquipment();
}
}
else if (event.GetId()==ID_CLEAR_EQUIPMENT) {
for (int i=0; i<NUM_CHAR_SLOTS; i++) cd.equipment[i] = 0;
RefreshEquipment();
}
else if (event.GetId()==ID_LOAD_SET) {
selectSet();
}
else if (event.GetId()==ID_LOAD_START) {
selectStart();
}
else if (event.GetId()==ID_MOUNT) {
selectMount();
}
else {
needRefresh = false;
for (int i=0; i<NUM_CHAR_SLOTS; i++) {
if (buttons[i] && (wxButton*)event.GetEventObject()==buttons[i]) {
selectItem(i, cd.equipment[i], buttons[i]->GetLabel().GetData());
break;
}
}
}
if (canvas->modelType == MT_NPC)
RefreshNPCModel();
else
RefreshModel();
}
const char* regionPaths[NUM_REGIONS] =
{
"",
"Item\\TextureComponents\\ArmUpperTexture\\",
"Item\\TextureComponents\\ArmLowerTexture\\",
"Item\\TextureComponents\\HandTexture\\",
"",
"",
"Item\\TextureComponents\\TorsoUpperTexture\\",
"Item\\TextureComponents\\TorsoLowerTexture\\",
"Item\\TextureComponents\\LegUpperTexture\\",
"Item\\TextureComponents\\LegLowerTexture\\",
"Item\\TextureComponents\\FootTexture\\"
};
int slotOrder[] = {
CS_SHIRT,
CS_HEAD,
CS_NECK,
CS_SHOULDER,
CS_PANTS,
CS_BOOTS,
CS_CHEST,
CS_TABARD,
CS_BELT,
CS_BRACERS,
CS_GLOVES,
CS_HAND_RIGHT,
CS_HAND_LEFT,
CS_CAPE
};
int slotOrderWithRobe[] = {
CS_SHIRT,
CS_HEAD,
CS_NECK,
CS_SHOULDER,
CS_BOOTS,
CS_PANTS,
CS_CHEST,
CS_TABARD,
CS_BELT,
CS_BRACERS,
CS_GLOVES,
CS_HAND_RIGHT,
CS_HAND_LEFT,
CS_CAPE
};
void CharControl::RefreshModel()
{
//cd.maxSkinColor = chardb.getColorsFor(race, gender, CharSectionsDB::SkinType, 0, cd.useNPC);
//cd.maxFaceType = chardb.getSectionsFor(race, gender, CharSectionsDB::FaceType, 0, cd.useNPC);
//spins[0]->SetRange(0, cd.maxSkinColor-1);
//spins[1]->SetRange(0, cd.maxFaceType-1);
if (hairtex != 0) {
texturemanager.del(hairtex);
hairtex = 0;
}
if (furtex != 0) {
texturemanager.del(furtex);
furtex = 0;
}
if (capetex != 0) {
texturemanager.del(capetex);
capetex = 0;
}
// facial hair decorations
for (int i=0; i<16; i++) cd.geosets[i] = 1;
cd.geosets[1] = cd.geosets[2] = cd.geosets[3] = 0;
// ears
if (cd.showEars) cd.geosets[7] = 2;
CharTexture tex;
// base layer
CharSectionsDB::Record rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::SkinType, 0, cd.skinColor, cd.useNPC);
tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_BASE, 0);
// Tauren fur
const char *furtexname = rec.getString(CharSectionsDB::Tex2);
if (strlen(furtexname)) furtex = texturemanager.add(furtexname);
if (cd.showUnderwear) {
try {
rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::UnderwearType, 0, cd.skinColor, cd.useNPC);
tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_PELVIS_UPPER, 1); // panties
tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_TORSO_UPPER, 1); // bra
} catch (CharSectionsDB::NotFound) {}
}
// face
try {
rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::FaceType, cd.faceType, cd.skinColor, cd.useNPC);
tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_FACE_LOWER, 1);
tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_FACE_UPPER, 1);
} catch (CharSectionsDB::NotFound) {}
// facial hair
try {
rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::FacialHairType, cd.facialHair, cd.facialColor, 0);
tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_FACE_LOWER, 2);
tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_FACE_UPPER, 2);
} catch (CharSectionsDB::NotFound) {}
// facial hair geosets
try {
CharFacialHairDB::Record frec = facialhairdb.getByParams(cd.race, cd.gender, cd.facialHair);
cd.geosets[1] = frec.getUInt(CharFacialHairDB::Geoset100);
cd.geosets[2] = frec.getUInt(CharFacialHairDB::Geoset200);
cd.geosets[3] = frec.getUInt(CharFacialHairDB::Geoset300);
} catch (CharFacialHairDB::NotFound) {}
// hair + hair on face
try {
rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::HairType, cd.hairStyle, cd.hairColor, 0);
const char* hairtexfn = rec.getString(CharSectionsDB::Tex1);
if (strlen(hairtexfn))
hairtex = texturemanager.add(hairtexfn);
else {
// oops, looks like we're missing a hair texture. Let's try with hair style #1.
// (only a problem for orcs with no hair but some beard
try {
rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::HairType, 1, cd.hairColor, cd.useNPC);
hairtexfn = rec.getString(CharSectionsDB::Tex1);
if (strlen(hairtexfn))
hairtex = texturemanager.add(hairtexfn);
else
hairtex = 0;
} catch (CharSectionsDB::NotFound) {
// oh well, give up.
hairtex = 0; // or chartex?
}
}
tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_FACE_LOWER, 3);
tex.addLayer(rec.getString(CharSectionsDB::Tex3), CR_FACE_UPPER, 3);
} catch (CharSectionsDB::NotFound) {
hairtex = 0;
}
bool bald = false;
bool showHair = cd.showHair;
bool showFacialHair = cd.showFacialHair;
/*
// Temporary work-around - need to do more research.
// Check to see if we are wearing a helmet - if so, we need to hide our hair
if (cd.equipment[CS_HEAD] != 0) {
try {
const ItemRecord &item = items.get(cd.equipment[CS_HEAD]);
int type = item.type;
if (type==IT_HEAD) {
ItemDisplayDB::Record r = itemdb.getById(item.model);
int geoID;
if(cd.gender == 0)
geoID = r.getUInt(ItemDisplayDB::GeosetF);
else
geoID = r.getUInt(ItemDisplayDB::GeosetG);
HelmGeosetDB::Record rec = helmetdb.getById(geoID);
char c1 = rec.getByte(HelmGeosetDB::Field1);
char c2 = rec.getByte(HelmGeosetDB::Field2);
char c3 = rec.getByte(HelmGeosetDB::Field3);
unsigned char c4 = rec.getByte(HelmGeosetDB::Field4);
unsigned char c5 = rec.getByte(HelmGeosetDB::Field5);
//TODO: Work out what exactly these geosets mean and act accordingly.
// These values point to records in HelmetGeosetVisData.dbc
// Still not sure if the 2 columns are for male / female or
// for facial hair / normal hair
std::cout << "----------\n" << r.getUInt(ItemDisplayDB::GeosetF) << "\t" << r.getUInt(ItemDisplayDB::GeosetG) << "\n";
std::cout << (unsigned int)rec.getByte(HelmGeosetDB::Field1) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field2) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field3) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field4) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field5) << "\n";
rec = helmetdb.getById(r.getUInt(ItemDisplayDB::GeosetG));
std::cout << (unsigned int)rec.getByte(HelmGeosetDB::Field1) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field2) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field3) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field4) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field5) << "\n";
//std::cout << (int)c1 << " " << (int)c2 << " " << (int)c3 << " " << (unsigned int)c4 << " " << (unsigned int)c5 << "\n";
if(c1 == 1)
showHair = false;
if(c5 == 1)
showFacialHair = false;
//if(r.getUInt(ItemDisplayDB::GeosetG) > 265)
// showFacialHair = false;
}
} catch (...) {}
}
*/
// facial hair geosets
try {
CharFacialHairDB::Record frec = facialhairdb.getByParams(cd.race, cd.gender, cd.facialHair);
cd.geosets[1] = frec.getUInt(CharFacialHairDB::Geoset100);
cd.geosets[2] = frec.getUInt(CharFacialHairDB::Geoset200);
cd.geosets[3] = frec.getUInt(CharFacialHairDB::Geoset300);
} catch (CharFacialHairDB::NotFound) {}
if (showFacialHair == false) {
/*
cd.geosets[1] = 1;
cd.geosets[2] = 1;
cd.geosets[3] = 1;
*/
CharRacesDB::Record race = racedb.getById(cd.race);
string tmp = race.getString(CharRacesDB::GeoType1);
if (tmp == "NORMAL") {
cd.geosets[1] = 1;
cd.geosets[2] = 1;
cd.geosets[3] = 1;
}
}
// select hairstyle geoset(s)
for (CharHairGeosetsDB::Iterator it = hairdb.begin(); it != hairdb.end(); ++it) {
if (it->getUInt(CharHairGeosetsDB::Race)==cd.race && it->getUInt(CharHairGeosetsDB::Gender)==cd.gender) {
unsigned int id = it->getUInt(CharHairGeosetsDB::Geoset);
unsigned int section = it->getUInt(CharHairGeosetsDB::Section);
if (id!=0) {
for (size_t j=0; j<model->geosets.size(); j++) {
if (model->geosets[j].id == id) {
//std::cout << "Hair:\t" << id << "\t" << section << "\t" << ((cd.hairStyle==section) && cd.showHair) << "\n";
model->showGeosets[j] = (cd.hairStyle==section) && showHair;
}
}
} else if (cd.hairStyle==section)
bald = true;
}
}
if (!showHair)
bald = true;
// check if we have a robe on
bool hadRobe = false;
if (cd.equipment[CS_CHEST] != 0) {
try {
const ItemRecord &item = items.get(cd.equipment[CS_CHEST]);
int type = item.type;
if (type==IT_ROBE) {
ItemDisplayDB::Record r = itemdb.getById(item.model);
if (r.getUInt(ItemDisplayDB::GeosetC)==1) hadRobe = true;
}
} catch (...) {}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -