⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 effects.cpp

📁 wowmodelview魔兽世界的模型查看工具。下了看看吧
💻 CPP
字号:

#include "effects.h"
#include "itemselection.h"

enum {
	ID_ENCHANTSFRAME = 3600,
	ID_ENCHANTSOK,
	ID_ENCHANTSCANCEL
};


wxArrayString spelleffects;
SpellEffectsDB spelleffectsdb;

void GetSpellEffects(){
	for (SpellEffectsDB::Iterator it=spelleffectsdb.begin(); it!=spelleffectsdb.end(); ++it) {
		wxString temp = it->getString(SpellEffectsDB::EffectName);
		if (temp.Mid(0, 5) != "zzOLD")
			spelleffects.Insert(temp, 0);
	}

	spelleffects.Sort();
}

// 10 for rhand, 11 for lhand)
void SelectCreatureItem(int slot, int current, CharControl *cc, wxWindow *parent)
{
	cc->ClearItemDialog();
	cc->numbers.clear();
	cc->choices.Clear();

	// collect all items for this slot, making note of the occurring subclasses
	set<pair<int,int> > subclassesFound;

	int sel=0, ord=0;
	for (std::vector<ItemRecord>::iterator it = cc->items.items.begin();  it != cc->items.items.end();  ++it) {
		if (correctType(it->type, slot)) {
			cc->choices.Add(wxString(it->name, *wxConvCurrent));
			cc->numbers.push_back(it->id);
			if (it->id == (unsigned int)current)
				sel = ord;

			ord++;

			if (it->itemclass > 0) 
				subclassesFound.insert(pair<int,int>(it->itemclass, it->subclass));
		}
	}

	// make category list
	cc->cats.clear();
	cc->catnames.clear();

	map<pair<int,int>, int> subclasslookup;
	for (ItemSubClassDB::Iterator it=cc->subclassdb.begin(); it != cc->subclassdb.end(); ++it) {
		int cl = it->getInt(ItemSubClassDB::ClassID);
		int scl = it->getInt(ItemSubClassDB::SubClassID);

		// only add the subclass if it was found in the itemlist
		if (cl>0 && subclassesFound.find(pair<int,int>(cl, scl)) != subclassesFound.end()) {
			
			// Used to go through the 'string fields' looking for the one with data.
			wxString str;
			for (int i = ItemSubClassDB::Name; i<18; i++)
			{
				str = wxString(it->getString(i), *wxConvCurrent);
				if (!str.IsEmpty()) {
					//p.name = str.fn_str();
					break;
				}
			}
			//string str = it->getString(ItemSubClassDB::Name);

			int hands = it->getInt(ItemSubClassDB::Hands);
			if (hands > 0) {
				str << " (" << hands << "-handed)";

				//char buf[16];
				//sprintf(buf, " (%d-handed)", hands);
				//str.append(buf);
			}
			cc->catnames.Add(str.c_str());
			subclasslookup[pair<int,int>(cl,scl)] = (int)cc->catnames.size()-1;
		}
	}

	if (subclassesFound.size() > 1) {
		// build category list
		for (size_t i=0; i<cc->numbers.size(); i++) {
			ItemRecord r = cc->items.get(cc->numbers[i]);
			cc->cats.push_back(subclasslookup[pair<int,int>(r.itemclass, r.subclass)]);
		}

		cc->itemDialog = new CategoryChoiceDialog(cc, UPDATE_CREATURE_ITEM, parent, _T("Choose an item"), _("Select a Weapon"), cc->choices, cc->cats, cc->catnames);
	} else {
		cc->itemDialog = new FilteredChoiceDialog(cc, UPDATE_CREATURE_ITEM, parent, _T("Choose an item"), _("Select a Weapon"), cc->choices);
	}

	cc->itemDialog->SetSelection(sel);

	wxSize s = cc->itemDialog->GetSize();
	const int w = 250;
	if (s.GetWidth() > w) {
		cc->itemDialog->SetSizeHints(w,-1,-1,-1,-1,-1);
		cc->itemDialog->SetSize(w, -1);
	}

	cc->itemDialog->Move(parent->GetPosition() + wxPoint(4,64));
	cc->itemDialog->Show();
	cc->choosingSlot = slot;
}

// Enchants Dialog

BEGIN_EVENT_TABLE(EnchantsDialog, wxDialog)	EVT_BUTTON(ID_ENCHANTSOK, EnchantsDialog::OnClick)
	EVT_BUTTON(ID_ENCHANTSCANCEL, EnchantsDialog::OnClick)END_EVENT_TABLE()EnchantsDialog::EnchantsDialog(wxWindow *parent, CharControl *cc){	charControl = cc;	effectdb = &cc->effectdb;	Initiated = false;	EnchantsInitiated = false;	LHandEnchant = -1;	RHandEnchant = -1;	slot = NULL;	effectsListbox = NULL;	Create(parent, -1, _T("Weapon Enchants"), wxDefaultPosition, wxSize(200,350), wxDEFAULT_DIALOG_STYLE);	Show(false);}void EnchantsDialog::OnClick(wxCommandEvent &event)
{
	if (event.GetId() == ID_ENCHANTSOK) {
		wxString sel(effectsListbox->GetStringSelection());

		if (sel == "") {
			Show(false);
			return;
		}

		if (sel=="NONE" || sel=="None") {
			if (slot->GetSelection() == 0)
				RHandEnchant = -1;
			else
				LHandEnchant = -1;
			Show(false);
			return;
		}
		
		for (std::vector<EnchantsRec>::iterator it=enchants.begin();  it!=enchants.end();  ++it) {
			if (it->name.c_str() == sel) {
				int s = slot->GetSelection();
				s += 10;

				if (!charControl->model)
					return;

				if (!slotHasModel(s))
					return;
				
				if (slot->GetSelection() == 0)
					RHandEnchant = it->id;
				else
					LHandEnchant = it->id;

				// children:
				for (size_t i=0; i < charControl->charAtt->children.size(); i++) {
					if (charControl->charAtt->children[i]->slot == s) {
						Attachment *att = charControl->charAtt->children[i];
						if (att->children.size() > 0)
							att->delChildren();

						Model *m = static_cast<Model*>(att->model);

						for (int k=0; k<5; k++) {
							if ((it->index[k] > 0) && (m->attLookup[k]>=0)) {
								ItemVisualEffectDB::Record rec = effectdb->getById(it->index[k]);
								att->addChild(rec.getString(ItemVisualEffectDB::Model), k, -1);
							}
						}
						break;
					}
				}

				Show(false);
				return;
			}
		}
		
	} else if (event.GetId() == ID_ENCHANTSCANCEL)
		this->Show(false);
}

void EnchantsDialog::InitObjects()
{
	wxString slots[2] = {_T("Right Hand"), _T("Left Hand")};

	slot = new wxRadioBox(this, -1, _T("Apply effects to:"), wxPoint(10,10), wxSize(180, 80), 2, slots, 4, wxRA_SPECIFY_ROWS, wxDefaultValidator, "radioBox");

	wxStaticText *text1 = new wxStaticText(this, -1, _T("Enchantments:"), wxPoint(10, 110), wxDefaultSize);
	effectsListbox = new wxListBox(this, -1, wxPoint(10,130), wxSize(180,160), choices, wxLB_SINGLE);
	
	wxButton *btnOK = new wxButton(this, ID_ENCHANTSOK, _("OK"), wxPoint(90,295), wxSize(50,22));
	wxButton *btnCancel = new wxButton(this, ID_ENCHANTSCANCEL, _("Cancel"), wxPoint(140,295), wxSize(50,22));

	Initiated = true;
}

void EnchantsDialog::InitEnchants()
{
	EnchantsRec temp;
	ifstream fin("enchants.csv");
	char line[512];
	while (fin.getline(line,512)) {
		temp.id = 0;
		temp.index[0] = 0;
		temp.index[1] = 0;
		temp.index[2] = 0;
		temp.index[3] = 0;
		temp.index[4] = 0;
		temp.name = "nil";

		sscanf(line, "%u,%u,%u,%u,%u,%u", &temp.id, &temp.index[0], &temp.index[1], &temp.index[2], &temp.index[3], &temp.index[4]);
		for (size_t i=strlen(line)-2; i>1; i--) {
			if (line[i]==',') {
				temp.name = (line + i + 1);
				break;
			}
		}
		enchants.push_back(temp);
	}
	fin.close();

	//std::sort(enchants.begin(), enchants.end());
	choices.Clear();
	for (std::vector<EnchantsRec>::iterator it=enchants.begin();  it!=enchants.end();  ++it)
		choices.Add(wxString(it->name.c_str(), *wxConvCurrent));

	EnchantsInitiated = true;
}

void EnchantsDialog::Display()
{
	if (!EnchantsInitiated)
		InitEnchants();	if (!Initiated)		InitObjects();	if (Initiated) {		Center();		Show(true);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -