[C++]party_get_member_pids Problem

07/16/2016 13:50 EisTee,#1
Hallo Community,

Ich habe irgendwie das Problem das bei der Funktion party.get_member_pids mir die Pids zusammen ausgegeben werden.

BILD:
[Only registered and activated users can see links. Click Here To Register...]

Dadurch Funktionieren bei mir die Gruppen Runs nicht. Die PIDS sollten eigentlich mit ein Komma getrennt sein.

Meine party.get_member_pids Funktion
Code:
	struct FPartyPIDCollector
	{
		std::vector <DWORD> vecPIDs;
		FPartyPIDCollector()
		{
		}
		void operator () (LPCHARACTER ch)
		{
			vecPIDs.push_back(ch->GetPlayerID());
		}
	};
	int party_get_member_pids(lua_State *L)
	{
		CQuestManager & q = CQuestManager::instance();
		LPCHARACTER ch = q.GetCurrentCharacterPtr();
		LPPARTY pParty = ch->GetParty();
		if (NULL == pParty)
		{
			return 0;
		}
		FPartyPIDCollector f;
		pParty->ForEachOnMapMember(f, ch->GetMapIndex());
		
		for (std::vector <DWORD>::iterator it = f.vecPIDs.begin(); it != f.vecPIDs.end(); it++)
		{
			lua_pushnumber(L, *it);
		}
		return f.vecPIDs.size();
	}
Ich bedanke mich im Voraus für eure hilfe.
07/16/2016 16:57 info.student#2
Die Funktion gibt dir die Anzahl der PIDs zurück
Code:
return f.vecPIDs.size();
Ich nehme einfach mal an, dass
Code:
f.vecPIDs
die gewünschten PIDs sind. Innerhalb des std::vector müssten deine PIDs stehen. Sehr wahrscheinlich werden diese an einer anderen Stelle ausgelesen.
07/16/2016 19:25 EisTee,#3
Quote:
Originally Posted by info.student View Post
Die Funktion gibt dir die Anzahl der PIDs zurück
Code:
return f.vecPIDs.size();
Ich nehme einfach mal an, dass
Code:
f.vecPIDs
die gewünschten PIDs sind. Innerhalb des std::vector müssten deine PIDs stehen. Sehr wahrscheinlich werden diese an einer anderen Stelle ausgelesen.
Ja aber wie mache ich dass sie jetzt mit einem Komma getrennt werden habe ja kaum Ahnung davon.
07/17/2016 00:52 info.student#4
Hier gibt es verschiedene Möglichkeiten. Ich bezweifle stark, dass die Funktion "party_get_member_pids" die Funktion ist, die nicht richtig funktioniert. Klär könntest du sie umschreiben, dass sie nicht mehr die Größe des Arrays zurückgibt, würde aber keinen Sinn machen, da du dann die gesamte Datenstruktur ändern müsstest, weil der Rückgabewert genau EIN integer ist, was du brauchst sind 2 Integer. Idealerweise wird, dass mit pair geregelt. Ich würde lieber die Stelle im Code suchen, wo der Wert tatsächlich zurückgegeben wird, den du im Spiel brauchst und dann diese Stelle verändern. Hast du die Stelle gefunden, kann Ich dir eventuell weiterhelfen. Oder du schaust auf [Only registered and activated users can see links. Click Here To Register...]
07/17/2016 11:05 EisTee,#5
Quote:
Originally Posted by info.student View Post
Hier gibt es verschiedene Möglichkeiten. Ich bezweifle stark, dass die Funktion "party_get_member_pids" die Funktion ist, die nicht richtig funktioniert. Klär könntest du sie umschreiben, dass sie nicht mehr die Größe des Arrays zurückgibt, würde aber keinen Sinn machen, da du dann die gesamte Datenstruktur ändern müsstest, weil der Rückgabewert genau EIN integer ist, was du brauchst sind 2 Integer. Idealerweise wird, dass mit pair geregelt. Ich würde lieber die Stelle im Code suchen, wo der Wert tatsächlich zurückgegeben wird, den du im Spiel brauchst und dann diese Stelle verändern. Hast du die Stelle gefunden, kann Ich dir eventuell weiterhelfen. Oder du schaust auf [Only registered and activated users can see links. Click Here To Register...]
Die Funktion ist ja richtig.Also zu Erklärung der Funktion sie gibt alle Ids der Spieler in der jeweiligen Gruppe zurück. Das tut sie aber nicht getrennt mit einem komma
07/17/2016 12:57 He3o Crysis#6
Hab dir das mal umgeschrieben, damit dir das ganze ne Tabelle ausgibt.
Ist untested, sollte aber funktionieren ♥

Code:
	int party_get_member_pids(lua_State *L)
	{
		CQuestManager & q = CQuestManager::instance();
		LPCHARACTER ch = q.GetCurrentCharacterPtr();
		LPPARTY pParty = ch->GetParty();
		if (NULL == pParty)
		{
			return 0;
		}
		FPartyPIDCollector f;
		pParty->ForEachOnMapMember(f, ch->GetMapIndex());
		
		//erstellen einer lua Tabelle
		lua_newtable(L);
		
		//hier iterieren wir durch den vector
		for(int i = 0; i < f.vecPIDs.size(); ++i) {
			//pushen der zahl welche wir an einer stelle im array speichern wollen.
			lua_pushnumber(L, f.vecPIDs[i]);
			//Stack hat derzeit die Zahl im obersten Slot, die Tabelle ist im Slot darunter
			//Tabelle liegt dementsprechend in Slot (-2)
			//Popt das oberste Objekt und speichert es in die Tabelle mit dem Key (i)
			lua_rawseti(L, -2, i);
		}
		// du returnst 1 lua Objekt -> deshalb returnen wir 1.
		return 1;
	}
Quote:
Originally Posted by info.student View Post
Hier gibt es verschiedene Möglichkeiten. Ich bezweifle stark, dass die Funktion "party_get_member_pids" die Funktion ist, die nicht richtig funktioniert. Klär könntest du sie umschreiben, dass sie nicht mehr die Größe des Arrays zurückgibt, würde aber keinen Sinn machen, da du dann die gesamte Datenstruktur ändern müsstest, weil der Rückgabewert genau EIN integer ist, was du brauchst sind 2 Integer. Idealerweise wird, dass mit pair geregelt. Ich würde lieber die Stelle im Code suchen, wo der Wert tatsächlich zurückgegeben wird, den du im Spiel brauchst und dann diese Stelle verändern. Hast du die Stelle gefunden, kann Ich dir eventuell weiterhelfen. Oder du schaust auf [Only registered and activated users can see links. Click Here To Register...]
Muss dich da leider korrigieren.
Du solltest dich zuerst mit der lua c api außeinandersetzen bevor du hier Halbwahrheiten verbreitest. Das return am Ende der Funktion != der zurückgegebene Wert in LUA.
07/17/2016 14:31 He3o Crysis#7
Quote:
Originally Posted by Effexion View Post
brudi die funktion gibt die anzahl nur an eine andere c++ funktion weiter
an die quest werden die pids weitergegeben, jedoch nicht als table (siehe das lua_pushnumber)
deswegen nutzt man es auch so: {party.get_member_pids()}

hätten die schlitzis mal besser machen können



ehhh in der realen welt nutzt man iteratoren für container klassen
Schön dich wiederzusehen Remix.
Damit hast du Recht, könnte das i natürlich auch einfach durch it-vec.begin() ersetzen, aber mir war da gerade nich danach. ;)

(range based loops sind was tolles, aber erst ab c++11 implementiert -> großteil der leute hier <c++11)

Ahja. Klugscheißer mag keiner! ♥
07/17/2016 14:35 Effexion#8
Quote:
Originally Posted by Socialized View Post
Schön dich wiederzusehen Remix.
Damit hast du Recht, könnte das i natürlich auch einfach durch it-vec.begin() ersetzen, aber mir war da gerade nich danach. ;)

Ahja. Klugscheißer mag keiner! ♥
bin nicht remix. er hat nen anderen undercover account

[Only registered and activated users can see links. Click Here To Register...]
07/17/2016 16:35 info.student#9
eben, besser mal C++ lernen, als hier andere Leute, die wirklich Ahnung haben, korrigieren zu wollen.
07/17/2016 19:42 Effexion#10
Quote:
Originally Posted by info.student View Post
eben, besser mal C++ lernen, als hier andere Leute, die wirklich Ahnung haben, korrigieren zu wollen.
ich hoffe du meinst nicht dich
er hatte nämlich recht und in deinem post sind mehrere technische unwahrheiten

1. es ist kein array, es ist ein vector
2. müsste man nicht die datenstruktur ändern. im schlimmsten fall müsste man den rückgabetyp anpassen
3. braucht man nicht 2 integer sondern x (die anzahl der elemente im vector) integer bzw eine kette von integers (array, linked list, vector, o.ä)

std:: pair für eine pid liste?
ich bitte dich...
die klasse wird für 2 werte genutzt die zueinander gehören (z.B. zur unterschiedsberechnung oder sonst irgendne scheiße)
07/17/2016 20:47 info.student#11
ok chef
07/18/2016 01:06 EisTee,#12
Quote:
Originally Posted by Effexion View Post
ich hoffe du meinst nicht dich
er hatte nämlich recht und in deinem post sind mehrere technische unwahrheiten

1. es ist kein array, es ist ein vector
2. müsste man nicht die datenstruktur ändern. im schlimmsten fall müsste man den rückgabetyp anpassen
3. braucht man nicht 2 integer sondern x (die anzahl der elemente im vector) integer bzw eine kette von integers (array, linked list, vector, o.ä)

std:: pair für eine pid liste?
ich bitte dich...
die klasse wird für 2 werte genutzt die zueinander gehören (z.B. zur unterschiedsberechnung oder sonst irgendne scheiße)
Also wird das so nicht Funktionieren wenn ich das jetzt richtig verstehe?
07/18/2016 10:20 xGr33n#13
Quote:
Originally Posted by EisTee, View Post
Also wird das so nicht Funktionieren wenn ich das jetzt richtig verstehe?
uhm, einfach so nutzen(also mit der orginal funktion):
PHP Code:
local pids = {party.get_member_pids()} 
07/18/2016 12:59 xGr33n#14
Quote:
Originally Posted by .†αø™ View Post
Das wird so ja nicht Funktionieren wenn die pids nicht durch Komma Zeichen getrennt werden, das ist ja sein Problem, wenn du sein Screen anguckst. Dann hast du nur ein eintrag in der Tabelle.
Ok.

07/18/2016 13:03 .CreaTiioN™#15
Quote:
Originally Posted by xGr33n View Post
Ok.

[Only registered and activated users can see links. Click Here To Register...]
Hehehe.... Bester Mann! :mofo::pimp: