Config Parser durch Vector iterieren
-
heyho,
ich hab nen Problem dabei durch einen Vector zu iterieren.
und zwar hab ich einen Config Parser der meine Config ausliest und die einzelnen variablen in einem Vector speichert.
so weit so gut
hier mal ein bisschen Code:
Config.cpp#include "stdafx.h" #include "Config.h" vector<Config::TeleportItem_struct>::iterator TeleitemIt; vector<Config::TeleportItem_struct> TeleportItem; void Config::ReadConfig() { Server::Console::WriteBlue("Reading [LunaConfig] . . ."); KServer Server; IKalConfig * Config = new IKalConfig; TeleportItem_struct teleitem; Config->Load("LunaConfig","./Config/LunaConfig.txt"); if(Config->IsLoaded("LunaConfig")) { IKalDBSection * MainSection = &Config->Get("LunaConfig"); for(unsigned int i = 0; i < MainSection->ChildSize(); i++) { IKalDBSection * FirstChild = MainSection->Get(i); if(!FirstChild->GetValue(0).compare("TeleportItem")) { for(unsigned int childs = 0; childs < FirstChild->ChildSize(); childs++) { IKalDBSection * ChildOfChild = FirstChild->Get(childs); if(!ChildOfChild->GetValue(0).compare("Index")) { string TeleportItemIndexValue = ChildOfChild->GetValue(1); teleitem.MainIndex = atoi(TeleportItemIndexValue.c_str()); } else if(!ChildOfChild->GetValue(0).compare("Level")) { string TeleportItemLevelValue = ChildOfChild->GetValue(1); int requiredlevel = atoi(TeleportItemLevelValue.c_str()); teleitem.RequiredLevel = requiredlevel; } else if(!ChildOfChild->GetValue(0).compare("RequiredItem")) { string TeleportItemIndexOutValue = ChildOfChild->GetValue(1); string TeleportItemAmountOutValue = ChildOfChild->GetValue(2); teleitem.RequiredItemIndex = atoi(TeleportItemIndexOutValue.c_str()); teleitem.RequiredItemAmount = atoi(TeleportItemAmountOutValue.c_str()); } else if(!ChildOfChild->GetValue(0).compare("Coordinates")) { string TeleportItemMapValue = ChildOfChild->GetValue(1); string TeleportItemXValue = ChildOfChild->GetValue(2); string TeleportItemYValue = ChildOfChild->GetValue(3); teleitem.Map = atoi(TeleportItemMapValue.c_str()); teleitem.X = atoi(TeleportItemXValue.c_str()); teleitem.Y = atoi(TeleportItemYValue.c_str()); } else if(!ChildOfChild->GetValue(0).compare("AssasinMessage")) { string TeleportItemAssasinMessageValue = ChildOfChild->GetValue(1); teleitem.AssasinMessage = Server.string_to_char(TeleportItemAssasinMessageValue); } else if(!ChildOfChild->GetValue(0).compare("FailMessage")) { string TeleportItemFailMessageValue = ChildOfChild->GetValue(1); teleitem.FailMessage = Server.string_to_char(TeleportItemFailMessageValue); } TeleportItem.push_back(teleitem); } } } } delete Config; }
Config.h
#undef UNICODE #pragma comment(lib, "KosaLib.lib") #include "stdafx.h" #include <vector> #include <KConfig.h> #include <KServer.h> using namespace std; class Config { public: struct TeleportItem_struct { int MainIndex, RequiredLevel, RequiredItemIndex, RequiredItemAmount, Map, X, Y; char* AssasinMessage; char* FailMessage; }; void ReadConfig(); }; extern vector<Config::TeleportItem_struct>::iterator TeleitemIt; extern vector<Config::TeleportItem_struct> TeleportItem;
so wenn ich jetzt auf den Vector zugreifen will zb. in dieser funktion
signed int __fastcall Hooked_UseItem(void *ItemPointer, void *_edx, int PlayerPointer) { int result = Server::CItem::UseItem(ItemPointer, PlayerPointer); KPlayer Player((int*)PlayerPointer); int ItemIndex = *(DWORD *)(*(DWORD *)((int)ItemPointer + 40) + 64); int PlayerGstate = Player.GetGstate(); int PlayerLevel = Player.GetLevel(); for ( TeleitemIt = TeleportItem.begin(); TeleitemIt != TeleportItem.end(); TeleitemIt++ ) { if(ItemIndex == TeleitemIt->MainIndex) { Server::Console::WriteBlue("index = %i", TeleitemIt->MainIndex); if(Player.GetGstate() != 256) { if(TeleitemIt->RequiredItemIndex == 0 && PlayerLevel >= TeleitemIt->RequiredLevel) { Player.Teleport(TeleitemIt->Map, TeleitemIt->X, TeleitemIt->Y); Player.DeleteItem(TeleitemIt->MainIndex, 1); } else if(TeleitemIt->RequiredItemIndex > 0 && Player.GetLevel() >= TeleitemIt->RequiredLevel) { if(Player.FindItem(TeleitemIt->RequiredItemIndex, TeleitemIt->RequiredItemAmount)) { Player.Teleport(TeleitemIt->Map, TeleitemIt->X, TeleitemIt->Y); Player.DeleteItem(TeleitemIt->MainIndex, 1); } else if(!Player.FindItem(TeleitemIt->RequiredItemIndex, TeleitemIt->RequiredItemAmount)) { Player.Notice(TeleitemIt->FailMessage); } } } else if(Player.GetGstate() == 256) { Player.Notice(TeleitemIt->AssasinMessage); } } } return result; }
wird sobald if(ItemIndex == TeleitemIt->MainIndex) übereinstimmt das ganze 6x ausgeführt anstatt 1x
vielleicht kann mir ja jemand helfen meinen Fehler zu finden.
-
Äh guck doch einfach mit dem Debugger?!
ItemIndex bleibt ja gleich, dann ist scheinbar TeleitemIt->MainIndex auch immer gleich. Warum? Dort debuggen, wo du es setzt und die Antwort finden.Oller Teleporthaxxor
-
problem gelöst, der fehler war das ich den push_back in meiner (child) schleife hatte.