[Project] Baal Wave 2 Party Leaver

12/20/2011 23:19 eXoo~#1
Da keiner der Leecher, die meinen Public Baal Runs folgen, auf die Idee kommt bei der zweiten Baalwelle die Party zuverlassen um den Expbug zu vermeiden, muss ich dieses Problem wohl nun selber in die Hand nehmen.
Umsetzbar ist das Ganze meiner Meinung nach schon, nur habe ich noch nicht mit dem Schreiben begonnen :P

Folgenden Funktionen sollen erfüllt werden:
Following Leecher, aktiv sowie passiv, soll bei einer Partygrösse von 8 Spielern bei der zweiten Baalwelle die Party verlassen und erst zum Spawn der dritten Welle wieder der Party beitreten.
Der Effekt von einem Autopartyplugin aus Redvex soll negiert werden während der zweiten Welle.

Ideen etc sind willkommen :D

Ich halte euch auf dem Laufenden :)
12/21/2011 03:16 Talltree#2
Den EXP-Bug gibt es schon seid Jahren nichtmehr!
12/21/2011 07:16 eXoo~#3
Quote:
Originally Posted by Talltree View Post
Den EXP-Bug gibt es schon seid Jahren nichtmehr!
Deshalb bekommen meine Chars 10 Exp bei der zweiten Wave :rolleyes:
12/21/2011 08:37 TheCrazy11#4
Muss er die Party unbedingt verlassen oder reicht es, wenn er Town geht? Wäre um einiges einfacher zu realisieren... ;)

Den Leecher, der in die Town geht, muss man vorher in der Config festlegen, wenn man das dynamisch macht, kann es sein, dass dann eben einer der Leecher ausgewählt wird, die nicht darauf reagieren!

Hier mal meine schnelle Lösung, ich habe es mal so gelöst, dass der Leecher das Leaderportal verwendet, man kann es aber einfach umschreiben, dass ein eigenes gemacht wird):

In der NTConfig.ntl eine neue Variable definieren:
Code:
var MWConfig_BaalLeavePartyWave2;
In der Config des Leechers, der in die Stadt soll:
Code:
	MWConfig_Script.push(["NTBaalLeechFight.ntj", 10]); NTConfig_KillBaal = true; MWConfig_DoBaalPreAttack = true; MWConfig_EnterUnsafeTP = true; NTConfig_Leader = "LeaderNameGoesHere"; [B]MWConfig_BaalLeavePartyWave2 = true;[/B]
In der NTBaalLeechFight.ntj:
Code:
		switch(_wave)
		{
			case 1:
				NTA_ClearPosition(40, true, 1);
				break;
			[B]case 2:
				if(MWConfig_BaalLeavePartyWave2 && CountPartyMembers() == 8)
				{
					NTM_UsePortal("BluePortal", 109, NTConfig_Leader);
					Delay(10000);	// Wait in town
					NTM_UsePortal("BluePortal", 131, NTConfig_Leader);
				}
				else
					NTA_ClearPosition(40, true, 1);
				break;[/B]
			case 3:
				NTA_ClearPosition(40, true, 2);
				NT_CheckHydraInt();
				break;
			case 4:
				NTA_ClearPosition(40, true, 2);
				break;
			case 5:
				NTA_ClearPosition(40, true);
				break;
			default:
				NTA_ClearPosition(40, true, 1);
				break;
		}
und die neue Funktion CountPartyMembers() am Ende der NTBaalLeechFight.ntj einfügen (schöner wäre es natürlich die Funktion mit entsprechender Namensanpassung in die NTCommon.ntl einzufügen...):
Code:
function CountPartyMembers()
{
	var _player, _count;
	
	_player = GetPlayerUnit();
	
	_count = 0;
	
	if(_player)
	{
		do
		{
			if(NTC_InMyParty(_player.name))
				_count++;
		} while(_player.GetNext());
		
		print("ÿc3Current party members: ÿc2" + _count); // Testausgabe
		
		return _count;
	}
	
	return false;
}
PS: Da ich heute keine Möglichkeit zum Testen habe und die Funktion GetPlayerUnit() nicht kenne, bitte die Testausgabe hier posten, damit ich weiß, ob bei einer vollen Party 7, 8 oder gar mehr Werte ausgelesen werden.
12/21/2011 12:25 Muddy Waters#5
Die Funktion passt fast, du solltest nur zwei Punkte beachten:
  1. GetPlayerUnit() gibt eine einfach verkettete Liste von Party Objekten zurück, wobei der Pointer zunächst immer auf ein Objekt zeigt, welches sich auf den gesteuerten Charakter bezieht. Darum sollte statt einer do...while- eine while-Schleife eingesetzt werden, damit dieses Objekt gar nicht erst in die Betrachtung mit einfließt.
  2. Deine Funktion gibt keine konsistenten Typen zurück. Nicht dass das in JS grundsätzlich ein Problem wäre, irgendwo sind schließlich alle Typen dynamische Objekte, aber es macht für diese Funktion eigentlich keinen Sinn, der Rückgabewert sollte immer vom Typ Number sein.

Sähe dann also so aus:
Code:
function CountPartyMembers()
{
	var _player, _count;
	
	_player = GetPlayerUnit();
	
	_count = 0;
	
	if(_player)
	{
		while(_player.GetNext())
		{
			if(NTC_InMyParty(_player.name))
				_count++;
		}
	}
	
	print("ÿc3Current party members: ÿc2" + _count); // Testausgabe
		
	return _count;
}
Achja, die Sache mit dem Party verlassen klappt meines Wissens nach mit D2NT nicht, die Core Funktionen werfen bei entsprechenden Parametern reproduzierbar Exceptions und D2 schmiert ab. Somit ist dieser Workaround zumindest auf D2NT bezogen die einzige Alternative.
12/21/2011 13:44 TheCrazy11#6
Danke für dein Feedback, ich bin halt doch kein Programmierer! :cool:
  1. Achso, ich bin davon ausgegangen, dass mit dem Aufruf GetPlayerUnit() gleich das 1. Party Objekt ausgewählt wird und nicht erst die "Übersicht" der Party Objekte.
    Diese Vermutung habe ich durch das Durchlesen der Funktion NTC_InMyParty(playerName) aufgestellt.
    Deswegen habe ich extra die do..while-Schleife gewählt, dass dieses 1. Objekt nicht übersprungen wird.
  2. Stimmt, da war ich schlampig, was auf meinen Zeitdruck zurückzuführen ist, hatte eine Besprechung und musste dafür noch was fertig machen... :(
    (Sieht man auch an der jetzt richtigen Position der Testausgabe in deiner Variante! ;))

An das Verlassen der Party habe ich jetzt gar nicht gedacht, da er ja Redvex Autoparty erwähnt hat und ich damit gar keine Erfahrung habe.
12/21/2011 13:57 eXoo~#7
Jezz muss ich ja noch nichmal mehr damit anfangen :D

Habs mal reingeschmissen und mir ist aufgefallen, dass der Bot sich selber nicht als Partymember mitzählt...
also entweder:

Code:
case 2:
				if(MWConfig_BaalLeavePartyWave2 && CountPartyMembers() == [COLOR="Red"]7[/COLOR])
				{
					NTM_UsePortal("BluePortal", 109, NTConfig_Leader);
					Delay(10000);	// Wait in town
					NTM_UsePortal("BluePortal", 131, NTConfig_Leader);
				}
oder noch ein +1 in die Function einbauen :)
12/21/2011 14:42 TheCrazy11#8
Genau deswegen habe ich in meinem Beitrag ganz unten das dazugeschrieben:
Quote:
Originally Posted by TheCrazy11 View Post
PS: Da ich heute keine Möglichkeit zum Testen habe und die Funktion GetPlayerUnit() nicht kenne, bitte die Testausgabe hier posten, damit ich weiß, ob bei einer vollen Party 7, 8 oder gar mehr Werte ausgelesen werden.
Funktioniert es sonst?
12/21/2011 15:13 eXoo~#9
Quote:
Originally Posted by TheCrazy11 View Post
Genau deswegen habe ich in meinem Beitrag ganz unten das dazugeschrieben:


Funktioniert es sonst?
Jop, tut es :)
Nur das mit dem Towndelay werd ich noch ändern, jenachdem wielang die zweite Welle dauert ist der Leecher manchmal zuschnell/zulangsam.
Werds wohl auf ein extra Leaderaccouncement umstellen sobald ich Zeit finde :)