Register for your free account! | Forgot your password?

Go Back   elitepvpers > Other Online Games > Diablo 2 > Diablo 2 Programming
You last visited: Today at 09:37

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[D2NT] Log erweitern: Was war gedroppt?

Discussion on [D2NT] Log erweitern: Was war gedroppt? within the Diablo 2 Programming forum part of the Diablo 2 category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jan 2011
Posts: 60
Received Thanks: 19
[D2NT] Log erweitern: Was war gedroppt?

Hiho,
möchte gerne den Log erweitern und zwar soll er alle Unique und Set Items loggen, die gedroppt wurden. Es wäre für mich nämlich sehr interessant zu wissen, was denn so alles droppt bzw. in welchem Umfang.

In welcher Datei müsste ich den nachsuchen (Sternenloopers) bzw. wo finde ich eine Funktion, die das Gebiet nach items (uniques, sets) absucht?
Eichenlaub is offline  
Old 01/02/2011, 16:00   #2
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Quote:
Originally Posted by Eichenlaub View Post
Hiho,
möchte gerne den Log erweitern und zwar soll er alle Unique und Set Items loggen, die gedroppt wurden. Es wäre für mich nämlich sehr interessant zu wissen, was denn so alles droppt bzw. in welchem Umfang.

In welcher Datei müsste ich den nachsuchen (Sternenloopers) bzw. wo finde ich eine Funktion, die das Gebiet nach items (uniques, sets) absucht?
Grundsätzlich:
Von dem "Gebiet" musst du dich gedanklich verabschieden, alle Objekte, die keine Preset Units (Treppen, Superuniques, Superchests und jede Menge mehr) sind, sind nur innerhalb eines gewissen Radius um den Char definiert.

Beispiel: Der Char stehst am Siegel bei De Seis und am Eingang des CS wird ein Soj abgelegt.
Der Char hätte nun keine Möglichkeit, festzustellen, dass dort etwas liegt, ohne sich näher dort hinzubewegen. Das ItemObjekt könnte erst instantiiert werden, wenn der Char einen Abstand von maximal ~65-70 zum Item hat. Aus diesem Grund macht es übrigens auch keinen Sinn, die SnagRange in der Config höher zu setzen.

Der Char sucht also immer nur seine nähere Umgebung nach Items ab, nie aber ganze Gebiete/Ebenen.

Verstehe ich es richtig, dass du nicht Items loggen willst, die dein Char in irgendeiner Form aufsammelt, sondern solche, die einfach nur am Boden liegen aber eine bestimmte Qualität haben?

Ansetzen müsstest du in jedem Fall in der NTSI_SnagIt() Funktion innerhalb der SnagIt library.

Zur Vorgehensweise kann ich erst was sagen, wenn ich genauer weiss was eigentlich geloggt werden soll.

Lg
Muddy
Muddy Waters is offline  
Old 01/02/2011, 16:20   #3
 
elite*gold: 0
Join Date: Jan 2011
Posts: 60
Received Thanks: 19
Ja die SnagIt habe ich schon einmal durchgeschaut. Grundsätzlich möchte ich sämtliche Uniques und Set items mitloggen, die "vor die Füsse des Bots" fallen. Könnte mir jedoch vorstellen, dass dieser Scan nur alle paar Intervalle auszuführen wäre, das sonst eventuell ein items öfters gescannt würde (wenn der Bot z.b. wieder am Item vorbekommt).

Es soll dann im Itemlog erscheinen: Full Helm dropped.

edit;
Code:
				// Zeige gedroppte Unique und Set Items
			if(_item.quality == 5 || _item.quality == 7)
			{
				var area;
				area = GetArea();

				Print ("[ " + NTC_ItemQualityToD2Color[_item.quality] + _item.name.split("\ n") [0]);
				NTC_SendLogToOOG(NTC_LOG_ITEM,"Seen: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + "\n Area: " + area.name);

			}
Für obigen Code suche ich nun die korrekte Stelle in der SnagIt aber ich finde es einfach nicht! Habe schon gehabt, dass items mehrfach angezeigt werden oder nur die Items die auch aufgenommen wurden.

Es müsste die Stelle sein, wo das Programm nach neuen Items sucht und diese dann anhand den NIP files überprüft ob einsammeln ja/nein.
Eichenlaub is offline  
Old 01/02/2011, 20:02   #4
 
elite*gold: 0
Join Date: Jul 2006
Posts: 469
Received Thanks: 235
Ich denke das Problem vom "doppel Loggen" ist rel. schwer zu beheben, weil wenn du mehrmals den Boden Scannst, dann überlappen sich die "Suchkreise" und so kommt's, dass Items mehrfach aufgeführt werden. (Muss nicht der Grund sein, aber würd ich Mal annehmen.

Evtl. kannst du den geloggten Items noch die Koordinaten befügen (weiss nicht ob die verfügbar sind) und dann halt jeweils überprüfen, ob das Item schon geloggt wurde.
ldevil is offline  
Old 01/04/2011, 21:27   #5
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Quote:
Originally Posted by ldevil View Post
Ich denke das Problem vom "doppel Loggen" ist rel. schwer zu beheben, weil wenn du mehrmals den Boden Scannst, dann überlappen sich die "Suchkreise" und so kommt's, dass Items mehrfach aufgeführt werden. (Muss nicht der Grund sein, aber würd ich Mal annehmen.

Evtl. kannst du den geloggten Items noch die Koordinaten befügen (weiss nicht ob die verfügbar sind) und dann halt jeweils überprüfen, ob das Item schon geloggt wurde.
Schonmal was von der Eigenschaft gid gehört, welche für so ziemlich jedes Objekt innerhalb eines Spieles definiert ist?
Eigentlich müsste dir das mittlerweile mal über den Weg gelaufen sein. :P

@topic
Es gibt eigentlich zwei Ansätze, wobei der eine deutlich einfacher, aber eingeschränkter nutzbar ist.

Obwohl das "eingeschränkt" mehr aus Programmierersicht zu sehen ist. Man kann damit falsche Ausgaben erzeugen, die Lösung ist nicht optimal.
In der Praxis aber unproblematisch, weil erst dann Fehler entstehen können, wenn dein Char NTSI_PickItems() in einer Ebene aufruft, in der er vorher schonmal Items geloggt hat. In der Praxis kommt das aber selten vor, darum sollte der Ansatz reichen. Ansonsten müsste man mit Filehandles arbeiten, etwas komplizierter und von der Laufzeit her schlechter.

Da ich etwas Zweifel habe, dass du weisst, wie die Änderungen umzusetzen sind, wenn ich sie nenne, würde ich dich bitten, mal deine komplette NTSI_SnagIt() Funktion zu posten, dann füge ich dir schnell die nötigen Änderungen ein.
Wirklich schwierig ist es nicht, man muss nur wissen, wie Item Objekte ticken.

Lg
Muddy

@Eichenlaub
Was mir gerade noch in deinem Code Beispiel auffällt:
Du rufst GetArea() auf und gehst dann blind davon aus, dass das Objekt auch definiert ist.
Das ist gefährlich, denn wenn das nicht der Fall ist und das Objekt nicht definiert ist, führt Zugriff auf dessen Eigenschaften und Methoden zu einer Exception, die letztenendes zu einem Restart führt.
Darum immer Prüfen, ob die Objektinstanz auch existiert.

GetArea() ist übrigens ohnehin gefährlich, da die Funktion auch allergisch auf falsche Parameter reagiert. Bei mir habe ich die Funktion deshalb mittlerweile in eine common library Funktion verlegt, bei der zunächst die Richtigkeit der übergebenen Parameter sichergestellt wird.
Muddy Waters is offline  
Old 01/05/2011, 16:09   #6
 
elite*gold: 0
Join Date: Jan 2011
Posts: 60
Received Thanks: 19
Code:
function NTSI_SnagIt()
{
	var i;
	var _item;
	var _checkeditem, _checkeditems;
	var _value;
	var _minindex, _mindistance;
	Include("libs/common/NTCommon.ntl");
	var _location;

	_item = NTC_FindUnit(NTC_UNIT_ITEM);

	if(!_item)
		return;

	_checkeditems = new Array();
	

	do
	{
		if(_item.mode == 3 || _item.mode == 5)
		{
			if(NTSI_IsIgnoredItemInt(_item.classid))
				continue;

			if(GetDistance(me, _item) <= NTConfig_SnagRange)
			{
				_value = NTSI_CheckItem(_item);
				


				if(_value)
					_checkeditems.push(new NTSI_ItemInt(_item, _value));
			}
		}
	} while(_item.GetNext());

	while(_checkeditems.length > 0)
	{
		_mindistance = 100000;

		for(i = 0 ; i < _checkeditems.length ; i++)
		{
			_value = GetDistance(me.x, me.y, _checkeditems[i].x, _checkeditems[i].y);

			if(_value < _mindistance)
			{
				_minindex = i;
				_mindistance = _value;
			}
		}

		_checkeditem = _checkeditems.splice(_minindex, 1)[0];

		_item = NTC_FindUnit(NTC_UNIT_ITEM, _checkeditem.GID);


		if(_item)
		{

[COLOR="Red"]			// START
			// Zeige gedroppte Unique und Set Items
			if(_item.quality == 5 || _item.quality == 7)
			{
				var area;
				area = GetArea();

				Print ("[ " + NTC_ItemQualityToD2Color[_item.quality] + _item.name.split("\ n") [0]);
				NTC_SendLogToOOG(NTC_LOG_ITEM,"Seen: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + "\n Area: " + area.name);

			}
			// ENDE
[/COLOR]			
			if(!NTSI_IsLimitedItemInt(_item))
			{
				if(NTT_CheckSpace(_item.xsize, _item.ysize))
				{
					if(NTSI_PickUpItemInt(_item))
					{

						var _area;
						_area = GetArea();
						if(_checkeditem.ClassID == 523)
							Print("Picked up " + GetLocaleString(2215));
						else
							if(_item != undefined && !(_item.itemtype == 76 || _item.itemtype == 77 || _item.itemtype == 78)) 
							{
							Print ("Picked up " + NTC_ItemQualityToD2Color [_item.quality] + _item.name.split ("\ n") [0]);
							if(_item.itemlevel > 1 && _item.classid < 647)
							{
							for(var r = 0; r < NTConfig_LogSoldItems.length; r++) 
							if(_item.quality == NTConfig_LogPickItems[r]) 
								NTC_SendLogToOOG(NTC_LOG_ITEM, "(" + _area.name + ")" + " Picked up " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
							}
							}

						if(_area != undefined && _item.quality < 4 && _checkeditem.Status < 2 && _item.itemtype != 4 && (_item.itemtype < 76 || _item.itemtype > 81))
						{

						var _area;
						_area = GetArea();
							var _isEthereal = (_item.itemflag & 0x400000) ? 1 : 0;
							if(NTConfig_UseXMLItemlog)
							{
								if(NTI_WriteLog(_item, me, _isEthereal, 0))
								NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
							}
							else
								NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
						}
					}
				}
				else
				{
					if(!_checkeditem.Retry)
					{
						_checkeditem.Retry = true;

						if(!NTTMGR_VisitTown())
							return;

						_checkeditems.push(_checkeditem);
					}
				}
			}
		}
	}
}
dies ist die NTSI_SnagIt vom Sternenloopers + in Rot gekennzeichnet der neue code. Jedoch weiß ich nicht wo der code am besten hingehört, bzw. ob dieser so ganz korrekt ist

Mit fällt es noch schwer mich in dem Quellcode zurecht zu finden, allgemeiner Programmcode ist mir schon geläufig, aber nicht die Funktionen des Bots
Eichenlaub is offline  
Old 01/05/2011, 19:13   #7
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Ist nicht korrekt, da du a. items mehrfach loggst, b. mit einem Area Objekt arbeitest, was undefiniert sein könnte und c. den Code an einer Stelle eingefügt hast, an der das Item definitiv aufgehoben wird, was ja nicht mehr der eigentlichen Problemstellung entspricht.

Versuch es mal in etwa so:
Code:
var _NTSI_Logged_Items = new Array();

function NTSI_SnagIt()
{
    var i;
    var _item;
    var _checkeditem, _checkeditems;
    var _value;
    var _minindex, _mindistance;
    Include("libs/common/NTCommon.ntl");
    var _location;

    _item = NTC_FindUnit(NTC_UNIT_ITEM);

    if(!_item)
        return;

    _checkeditems = new Array();
    
    do
    {
        if(_item.mode == 3 || _item.mode == 5)
        {
            if(NTSI_IsIgnoredItemInt(_item.classid))
                continue;

            if(GetDistance(me, _item) <= NTConfig_SnagRange)
            {
                _value = NTSI_CheckItem(_item);

                if(_value)
                    _checkeditems.push(new NTSI_ItemInt(_item, _value));
                else if((_item.quality == 5 || _item.quality == 7) && _NTSI_Logged_Items.indexOf(_item.gid) == -1)
                {
                    var _area;
                    _area = GetArea();
                    
                    if(_area)        
                    {
                        NTC_SendLogToOOG(NTC_LOG_ITEM, "Seen: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + "\n Area: " + _area.name);
                            
                        _NTSI_Logged_Items.push(_item.gid);    
                    }
                }
            }
        }
    } while(_item.GetNext());

    while(_checkeditems.length > 0)
    {
        _mindistance = 100000;

        for(i = 0 ; i < _checkeditems.length ; i++)
        {
            _value = GetDistance(me.x, me.y, _checkeditems[i].x, _checkeditems[i].y);

            if(_value < _mindistance)
            {
                _minindex = i;
                _mindistance = _value;
            }
        }

        _checkeditem = _checkeditems.splice(_minindex, 1)[0];

        _item = NTC_FindUnit(NTC_UNIT_ITEM, _checkeditem.GID);


        if(_item)
        {
            if(!NTSI_IsLimitedItemInt(_item))
            {
                if(NTT_CheckSpace(_item.xsize, _item.ysize))
                {
                    if(NTSI_PickUpItemInt(_item))
                    {

                        var _area;
                        _area = GetArea();
                        if(_checkeditem.ClassID == 523)
                            Print("Picked up " + GetLocaleString(2215));
                        else
                            if(_item != undefined && !(_item.itemtype == 76 || _item.itemtype == 77 || _item.itemtype == 78)) 
                            {
                            Print ("Picked up " + NTC_ItemQualityToD2Color [_item.quality] + _item.name.split ("\ n") [0]);
                            if(_item.itemlevel > 1 && _item.classid < 647)
                            {
                            for(var r = 0; r < NTConfig_LogSoldItems.length; r++) 
                            if(_item.quality == NTConfig_LogPickItems[r]) 
                                NTC_SendLogToOOG(NTC_LOG_ITEM, "(" + _area.name + ")" + " Picked up " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
                            }
                            }

                        if(_area != undefined && _item.quality < 4 && _checkeditem.Status < 2 && _item.itemtype != 4 && (_item.itemtype < 76 || _item.itemtype > 81))
                        {

                        var _area;
                        _area = GetArea();
                            var _isEthereal = (_item.itemflag & 0x400000) ? 1 : 0;
                            if(NTConfig_UseXMLItemlog)
                            {
                                if(NTI_WriteLog(_item, me, _isEthereal, 0))
                                NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
                            }
                            else
                                NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
                        }
                    }
                }
                else
                {
                    if(!_checkeditem.Retry)
                    {
                        _checkeditem.Retry = true;

                        if(!NTTMGR_VisitTown())
                            return;

                        _checkeditems.push(_checkeditem);
                    }
                }
            }
        }
    }
}
Sollte deine snag range kleiner 70 sein, sollte der Teil ausserdem noch vor die if-Anweisung gesetzt werden, die diese eingrenzt.

Lg
Muddy

P.S.: Lange keinen Quelltext von Sterni gesehen, hatte schon vergessen wie wüst das geschrieben ist.
Muddy Waters is offline  
Thanks
1 User
Old 01/05/2011, 19:53   #8
 
elite*gold: 0
Join Date: Jan 2011
Posts: 60
Received Thanks: 19
Habe deinen Code nun eingepflegt und kann sagen: es funktioniert wunderbar!

Meine Snag Range ist auf 80. Weil du was geschrieben hast von 70. Würde es bei <70 nicht funktionieren?
Eichenlaub is offline  
Old 01/06/2011, 18:14   #9
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Quote:
Originally Posted by Eichenlaub View Post
Habe deinen Code nun eingepflegt und kann sagen: es funktioniert wunderbar!

Meine Snag Range ist auf 80. Weil du was geschrieben hast von 70. Würde es bei <70 nicht funktionieren?
Doch doch, das war nur als Anmerkunggedacht, da bei einer kleinen snag range natürlich nur die am Boden liegenden Items beachtet werden, die innerhalb dieser snag range liegen - jedenfalls bei der von mir geposteten Version.

Wäre deine snag range winzig, würden auch nur gedroppte items innerhalb dieses Radius beachtet, was natürlich blöd wäre.

Aber mit 80 liegst du ohnehin schon über der systembedingten Maximalreichweite, insofern sollte das so problemlos funktionieren.

Aber freut mich dass es klappt, hatte es nicht getestet.

Lg
Muddy
Muddy Waters is offline  
Old 01/07/2011, 14:08   #10
 
elite*gold: 0
Join Date: Jan 2011
Posts: 60
Received Thanks: 19
Zum Abschluss noch mal die komplette SnagIt vom Sternenloopers 3.8:
Code:
var _NTSI_IgnoredList = new Array(
526, // Arrows quiver
528, // Bolts quiver
543, // Keys
518, // Tome of Town Portal
519, // Tome of Identify
529, // Scroll of Town Portal
530, // Scroll of Identify
514, // Antidote potion
513, // Stamina potion
517, // Thawing potion
80, // Rancid Gas Pot
81, // Oil Potion
82, // Choking Gas Pot
83, // Exploding Pot
84, // Strangling Gas
85); // Fulminating Pot

var _NTSI_BeltSize;
var _NTSI_Logged_Items = new Array();


function NTSI_LoadNIPFiles(filepath)
{
	for(var i = 0 ; i < NTConfig_NIPFilePath.length ; i++)
		NTIPOpenFile(filepath + "/" + NTConfig_NIPFilePath[i]);

	_NTSI_BeltSize = NTC_GetBeltSize();
}

function NTSI_PickItems()
{
	var i, _mode;

	for(i = 0 ; i < 25 ; i++)
	{
		_mode = me.mode;

		if((_mode >= 1 && _mode <= 3) || _mode == 5 || _mode == 6)
			break;

		NTC_Delay(NTC_DELAY_FRAME);
	}

	if(i < parseInt(NTConfig_SnagDelay/NTC_DELAY_FRAME))
		NTC_PingDelay(NTConfig_SnagDelay-(i*NTC_DELAY_FRAME));
	Include("libs/common/NTItemlogger.ntl");
	NTSI_SnagIt();
}

function NTSI_SnagIt()
{
	var i;
	var _item;
	var _checkeditem, _checkeditems;
	var _value;
	var _minindex, _mindistance;
	Include("libs/common/NTCommon.ntl");
	var _location;

	_item = NTC_FindUnit(NTC_UNIT_ITEM);

	if(!_item)
		return;

	_checkeditems = new Array();
	

	do
	{
		if(_item.mode == 3 || _item.mode == 5)
		{
			if(NTSI_IsIgnoredItemInt(_item.classid))
				continue;

			if(GetDistance(me, _item) <= NTConfig_SnagRange)
			{
				_value = NTSI_CheckItem(_item);
				
				if(_value)
					_checkeditems.push(new NTSI_ItemInt(_item, _value));
				else if((_item.quality == 5 || _item.quality == 7) && _NTSI_Logged_Items.indexOf(_item.gid) == -1)
                {
                    var _area;
                    _area = GetArea();
                    
                    if(_area)        
                    {
                        NTC_SendLogToOOG(NTC_LOG_ITEM, "ÿc8War gedroppt: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + "\n ÿc2Area: " + _area.name);
						Print ("ÿc8War gedroppt: " + NTC_ItemQualityToD2Color[_item.quality] + _item.name.split("\ n") [0]);

                        _NTSI_Logged_Items.push(_item.gid);    
                    }
                }
			}
		}
	} while(_item.GetNext());

	while(_checkeditems.length > 0)
	{
		_mindistance = 100000;

		for(i = 0 ; i < _checkeditems.length ; i++)
		{
			_value = GetDistance(me.x, me.y, _checkeditems[i].x, _checkeditems[i].y);

			if(_value < _mindistance)
			{
				_minindex = i;
				_mindistance = _value;
			}
		}

		_checkeditem = _checkeditems.splice(_minindex, 1)[0];

		_item = NTC_FindUnit(NTC_UNIT_ITEM, _checkeditem.GID);


		if(_item)
		{
			if(!NTSI_IsLimitedItemInt(_item))
			{
				if(NTT_CheckSpace(_item.xsize, _item.ysize))
				{
					if(NTSI_PickUpItemInt(_item))
					{

						var _area;
						_area = GetArea();
						if(_checkeditem.ClassID == 523)
							Print("Picked up " + GetLocaleString(2215));
						else
							if(_item != undefined && !(_item.itemtype == 76 || _item.itemtype == 77 || _item.itemtype == 78)) 
							{
							Print ("Picked up " + NTC_ItemQualityToD2Color [_item.quality] + _item.name.split ("\ n") [0]);
							if(_item.itemlevel > 1 && _item.classid < 647)
							{
							for(var r = 0; r < NTConfig_LogSoldItems.length; r++) 
							if(_item.quality == NTConfig_LogPickItems[r]) 
								NTC_SendLogToOOG(NTC_LOG_ITEM, "(" + _area.name + ")" + " Picked up " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
							}
							}

						if(_area != undefined && _item.quality < 4 && _checkeditem.Status < 2 && _item.itemtype != 4 && (_item.itemtype < 76 || _item.itemtype > 81))
						{

						var _area;
						_area = GetArea();
							var _isEthereal = (_item.itemflag & 0x400000) ? 1 : 0;
							if(NTConfig_UseXMLItemlog)
							{
								if(NTI_WriteLog(_item, me, _isEthereal, 0))
								NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
							}
							else
								NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
						}
					}
				}
				else
				{
					if(!_checkeditem.Retry)
					{
						_checkeditem.Retry = true;

						if(!NTTMGR_VisitTown())
							return;

						_checkeditems.push(_checkeditem);
					}
				}
			}
		}
	}
}

function NTSI_CheckItem(item)
{
	var _result;

	switch(item.quality)
	{
	case 5:
	case 8:
		_result = NTIPCheckItem(item);
		break;
	default:
		_result = NTIPCheckItem(item);

		if(NTCU_CheckItem(item, _result))
			_result = 2;

		break;
	}
	

	return _result;
}

// Internal function
function NTSI_ItemInt(item, checkedstatus)
{
	this.ClassID = item.classid;
	this.GID = item.gid;
	this.x = item.x;
	this.y = item.y;
	this.Status = checkedstatus;
	this.Retry = false;
	

}

function NTSI_PickUpItemInt(snagitem)
{
	var i;
	var _classid;

	_classid = snagitem.classid;

	for(i = 0 ; i < 40 ; i++)
	{
		if((i % 10) == 0 && (snagitem.mode == 3 || snagitem.mode == 5))
		{
			if(GetDistance(me, snagitem) > 3)
				NTM_MoveTo(snagitem.areaid, snagitem.x, snagitem.y);

			if(NTC_ClearCursor())
				NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, snagitem);
		}

		NTC_Delay(NTC_DELAY_FRAME);

		if(_classid == 523 || (snagitem.mode != 3 && snagitem.mode != 5))
		{
			NTC_PingDelay(100);
			return true;
		}
	}

	return false;
}

function NTSI_IsIgnoredItemInt(classid)
{
	for(var i = 0 ; i < _NTSI_IgnoredList.length ; i++)
	{
		if(classid == _NTSI_IgnoredList[i])
			return true;
	}

	return false;
}

function NTSI_IsLimitedItemInt(item)
{
	var i;
	var _items;

	if(item.itemtype >= 76 && item.itemtype <= 78)
	{
		var _code, _type;
		var _potnum = 0;

		_code = item.code;
		_type = item.itemtype;

		for(i = 0 ; i < 4 ; i++)
		{
			if(_code.indexOf(NTConfig_BeltColType[i]) != -1)
				_potnum += _NTSI_BeltSize;
		}

		_items = me.GetItems();

		if(_items)
		{
			for(i = 0 ; i < _items.length ; i++)
			{
				if(_items[i].mode == 2 && _items[i].itemtype == _type)
					_potnum--;
			}

  			  if(_potnum < 1) {
         		   //if you find a Full Rejuv
        		    if(_type == 78 && _code == "rvl" ) {
          		     for(i = 0 ; i < _items.length ; i++)
          		     {
            		      //look for a small rejuv
              		    if(_items[i].mode == 2 && _items[i].code == "rvs") {
                		     //if found drop the small rejuv
               		      SetUIState(0x1F, true);
               		      if(NTT_DropItem(_items[i]))
                 		    NTC_PingDelay(200);
                 		    me.Cancel(1);
                		     return false;  //return not full now after dropping a juv
                  }
               }
            }
        		    if(_type == 76 && (_code == "hp4" || _code == "hp5")) {
          		     for(i = 0 ; i < _items.length ; i++)
          		     {
            		      //look for a small healpotions
              		    if(_items[i].mode == 2 && (_items[i].code == "hp1" || _items[i].code == "hp2" || _items[i].code == "hp3")) {
                		     //if found drop the small hp
               		      SetUIState(0x1F, true);
               		      if(NTT_DropItem(_items[i]))
                 		    NTC_PingDelay(200);
                 		    me.Cancel(1);
                		     return false;  //return not full now after dropping a hp
                  }
               }
            }
        		    if(_type == 77 && (_code == "mp4" || _code == "mp5")) {
          		     for(i = 0 ; i < _items.length ; i++)
          		     {
            		      //look for a small manapotion
              		    if(_items[i].mode == 2 && (_items[i].code == "mp1" || _items[i].code == "mp2" || _items[i].code == "mp3")) {
                		     //if found drop the small mp
               		      SetUIState(0x1F, true);
               		      if(NTT_DropItem(_items[i]))
                 		    NTC_PingDelay(200);
                 		    me.Cancel(1);
                		     return false;  //return not full now after dropping a mp
                  }
               }
            }
        		    if(_type == 76 && _code == "hp5") {
          		     for(i = 0 ; i < _items.length ; i++)
          		     {
            		      //look for a small healpotions
              		    if(_items[i].mode == 2 && (_items[i].code == "hp1" || _items[i].code == "hp2" || _items[i].code == "hp3" || _items[i].code == "hp4")) {
                		     //if found drop the small hp
               		      SetUIState(0x1F, true);
               		      if(NTT_DropItem(_items[i]))
                 		    NTC_PingDelay(200);
                 		    me.Cancel(1);
                		     return false;  //return not full now after dropping a hp
                  }
               }
            }
        		    if(_type == 77 && _code == "mp5") {
          		     for(i = 0 ; i < _items.length ; i++)
          		     {
            		      //look for a small manapotion
              		    if(_items[i].mode == 2 && (_items[i].code == "mp1" || _items[i].code == "mp2" || _items[i].code == "mp3" || _items[i].code == "mp4")) {
                		     //if found drop the small mp
               		      SetUIState(0x1F, true);
               		      if(NTT_DropItem(_items[i]))
                 		    NTC_PingDelay(200);
                 		    me.Cancel(1);
                		     return false;  //return not full now after dropping a mp
                  }
               }
            }
            return true;
         } 
		}
	}
	else if(item.quality == 7 && item.classid >= 603 && item.classid <= 605)
	{
		_items = me.GetItems(item.classid);

		if(_items)
		{
			for(i = 0 ; i < _items.length ; i++)
			{
				if(_items[i].quality == 7)
					return true;
			}
		}
	}

	return false;
}
function NTC_GetItemColorInt(itemunit)
{
	if(!itemunit)
		return 0;
	if(itemunit.itemtype == 74 || (itemunit.classid >= 531 && itemunit.classid <= 555) || (itemunit.classid >= 644 && itemunit.classid <= 657))
		return 8;
	else
		return itemunit.quality;
	
}
Hier wird einem angezeigt, ob ein Unique oder Set Item gedroppt ist (ingame und auch im Item log).
Speziell bei Mephisto kann es vorkommen, dass items ein paar mal geloggt werden, da die öfters im Scan Radius liegen können, wenn man die Ratsmitglieder tötet und dabei öfters herum-telt.
Eichenlaub is offline  
Old 01/07/2011, 14:26   #11
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Quote:
Originally Posted by Eichenlaub View Post
Zum Abschluss noch mal die komplette SnagIt vom Sternenloopers 3.8:
Code:
var _NTSI_IgnoredList = new Array(
526, // Arrows quiver
528, // Bolts quiver
543, // Keys
518, // Tome of Town Portal
519, // Tome of Identify
529, // Scroll of Town Portal
530, // Scroll of Identify
514, // Antidote potion
513, // Stamina potion
517, // Thawing potion
80, // Rancid Gas Pot
81, // Oil Potion
82, // Choking Gas Pot
83, // Exploding Pot
84, // Strangling Gas
85); // Fulminating Pot

var _NTSI_BeltSize;
var _NTSI_Logged_Items = new Array();


function NTSI_LoadNIPFiles(filepath)
{
    for(var i = 0 ; i < NTConfig_NIPFilePath.length ; i++)
        NTIPOpenFile(filepath + "/" + NTConfig_NIPFilePath[i]);

    _NTSI_BeltSize = NTC_GetBeltSize();
}

function NTSI_PickItems()
{
    var i, _mode;

    for(i = 0 ; i < 25 ; i++)
    {
        _mode = me.mode;

        if((_mode >= 1 && _mode <= 3) || _mode == 5 || _mode == 6)
            break;

        NTC_Delay(NTC_DELAY_FRAME);
    }

    if(i < parseInt(NTConfig_SnagDelay/NTC_DELAY_FRAME))
        NTC_PingDelay(NTConfig_SnagDelay-(i*NTC_DELAY_FRAME));
    Include("libs/common/NTItemlogger.ntl");
    NTSI_SnagIt();
}

function NTSI_SnagIt()
{
    var i;
    var _item;
    var _checkeditem, _checkeditems;
    var _value;
    var _minindex, _mindistance;
    Include("libs/common/NTCommon.ntl");
    var _location;

    _item = NTC_FindUnit(NTC_UNIT_ITEM);

    if(!_item)
        return;

    _checkeditems = new Array();
    

    do
    {
        if(_item.mode == 3 || _item.mode == 5)
        {
            if(NTSI_IsIgnoredItemInt(_item.classid))
                continue;

            if(GetDistance(me, _item) <= NTConfig_SnagRange)
            {
                _value = NTSI_CheckItem(_item);
                
                if(_value)
                    _checkeditems.push(new NTSI_ItemInt(_item, _value));
                else if((_item.quality == 5 || _item.quality == 7) && _NTSI_Logged_Items.indexOf(_item.gid) == -1)
                {
                    var _area;
                    _area = GetArea();
                    
                    if(_area)        
                    {
                        NTC_SendLogToOOG(NTC_LOG_ITEM, "ÿc8War gedroppt: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + "\n ÿc2Area: " + _area.name);
                        Print ("ÿc8War gedroppt: " + NTC_ItemQualityToD2Color[_item.quality] + _item.name.split("\ n") [0]);

                        _NTSI_Logged_Items.push(_item.gid);    
                    }
                }
            }
        }
    } while(_item.GetNext());

    while(_checkeditems.length > 0)
    {
        _mindistance = 100000;

        for(i = 0 ; i < _checkeditems.length ; i++)
        {
            _value = GetDistance(me.x, me.y, _checkeditems[i].x, _checkeditems[i].y);

            if(_value < _mindistance)
            {
                _minindex = i;
                _mindistance = _value;
            }
        }

        _checkeditem = _checkeditems.splice(_minindex, 1)[0];

        _item = NTC_FindUnit(NTC_UNIT_ITEM, _checkeditem.GID);


        if(_item)
        {
            if(!NTSI_IsLimitedItemInt(_item))
            {
                if(NTT_CheckSpace(_item.xsize, _item.ysize))
                {
                    if(NTSI_PickUpItemInt(_item))
                    {

                        var _area;
                        _area = GetArea();
                        if(_checkeditem.ClassID == 523)
                            Print("Picked up " + GetLocaleString(2215));
                        else
                            if(_item != undefined && !(_item.itemtype == 76 || _item.itemtype == 77 || _item.itemtype == 78)) 
                            {
                            Print ("Picked up " + NTC_ItemQualityToD2Color [_item.quality] + _item.name.split ("\ n") [0]);
                            if(_item.itemlevel > 1 && _item.classid < 647)
                            {
                            for(var r = 0; r < NTConfig_LogSoldItems.length; r++) 
                            if(_item.quality == NTConfig_LogPickItems[r]) 
                                NTC_SendLogToOOG(NTC_LOG_ITEM, "(" + _area.name + ")" + " Picked up " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
                            }
                            }

                        if(_area != undefined && _item.quality < 4 && _checkeditem.Status < 2 && _item.itemtype != 4 && (_item.itemtype < 76 || _item.itemtype > 81))
                        {

                        var _area;
                        _area = GetArea();
                            var _isEthereal = (_item.itemflag & 0x400000) ? 1 : 0;
                            if(NTConfig_UseXMLItemlog)
                            {
                                if(NTI_WriteLog(_item, me, _isEthereal, 0))
                                NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
                            }
                            else
                                NTC_SendLogToOOG(NTC_LOG_ITEM,"ÿc2Kept: " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0]+ ";" + _item.itemdesc + "\n ÿc2iLvl: " + _item.itemlevel + "\n ÿc2Area: " + _area.name);
                        }
                    }
                }
                else
                {
                    if(!_checkeditem.Retry)
                    {
                        _checkeditem.Retry = true;

                        if(!NTTMGR_VisitTown())
                            return;

                        _checkeditems.push(_checkeditem);
                    }
                }
            }
        }
    }
}

function NTSI_CheckItem(item)
{
    var _result;

    switch(item.quality)
    {
    case 5:
    case 8:
        _result = NTIPCheckItem(item);
        break;
    default:
        _result = NTIPCheckItem(item);

        if(NTCU_CheckItem(item, _result))
            _result = 2;

        break;
    }
    

    return _result;
}

// Internal function
function NTSI_ItemInt(item, checkedstatus)
{
    this.ClassID = item.classid;
    this.GID = item.gid;
    this.x = item.x;
    this.y = item.y;
    this.Status = checkedstatus;
    this.Retry = false;
    

}

function NTSI_PickUpItemInt(snagitem)
{
    var i;
    var _classid;

    _classid = snagitem.classid;

    for(i = 0 ; i < 40 ; i++)
    {
        if((i % 10) == 0 && (snagitem.mode == 3 || snagitem.mode == 5))
        {
            if(GetDistance(me, snagitem) > 3)
                NTM_MoveTo(snagitem.areaid, snagitem.x, snagitem.y);

            if(NTC_ClearCursor())
                NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, snagitem);
        }

        NTC_Delay(NTC_DELAY_FRAME);

        if(_classid == 523 || (snagitem.mode != 3 && snagitem.mode != 5))
        {
            NTC_PingDelay(100);
            return true;
        }
    }

    return false;
}

function NTSI_IsIgnoredItemInt(classid)
{
    for(var i = 0 ; i < _NTSI_IgnoredList.length ; i++)
    {
        if(classid == _NTSI_IgnoredList[i])
            return true;
    }

    return false;
}

function NTSI_IsLimitedItemInt(item)
{
    var i;
    var _items;

    if(item.itemtype >= 76 && item.itemtype <= 78)
    {
        var _code, _type;
        var _potnum = 0;

        _code = item.code;
        _type = item.itemtype;

        for(i = 0 ; i < 4 ; i++)
        {
            if(_code.indexOf(NTConfig_BeltColType[i]) != -1)
                _potnum += _NTSI_BeltSize;
        }

        _items = me.GetItems();

        if(_items)
        {
            for(i = 0 ; i < _items.length ; i++)
            {
                if(_items[i].mode == 2 && _items[i].itemtype == _type)
                    _potnum--;
            }

                if(_potnum < 1) {
                    //if you find a Full Rejuv
                    if(_type == 78 && _code == "rvl" ) {
                       for(i = 0 ; i < _items.length ; i++)
                       {
                          //look for a small rejuv
                          if(_items[i].mode == 2 && _items[i].code == "rvs") {
                             //if found drop the small rejuv
                             SetUIState(0x1F, true);
                             if(NTT_DropItem(_items[i]))
                             NTC_PingDelay(200);
                             me.Cancel(1);
                             return false;  //return not full now after dropping a juv
                  }
               }
            }
                    if(_type == 76 && (_code == "hp4" || _code == "hp5")) {
                       for(i = 0 ; i < _items.length ; i++)
                       {
                          //look for a small healpotions
                          if(_items[i].mode == 2 && (_items[i].code == "hp1" || _items[i].code == "hp2" || _items[i].code == "hp3")) {
                             //if found drop the small hp
                             SetUIState(0x1F, true);
                             if(NTT_DropItem(_items[i]))
                             NTC_PingDelay(200);
                             me.Cancel(1);
                             return false;  //return not full now after dropping a hp
                  }
               }
            }
                    if(_type == 77 && (_code == "mp4" || _code == "mp5")) {
                       for(i = 0 ; i < _items.length ; i++)
                       {
                          //look for a small manapotion
                          if(_items[i].mode == 2 && (_items[i].code == "mp1" || _items[i].code == "mp2" || _items[i].code == "mp3")) {
                             //if found drop the small mp
                             SetUIState(0x1F, true);
                             if(NTT_DropItem(_items[i]))
                             NTC_PingDelay(200);
                             me.Cancel(1);
                             return false;  //return not full now after dropping a mp
                  }
               }
            }
                    if(_type == 76 && _code == "hp5") {
                       for(i = 0 ; i < _items.length ; i++)
                       {
                          //look for a small healpotions
                          if(_items[i].mode == 2 && (_items[i].code == "hp1" || _items[i].code == "hp2" || _items[i].code == "hp3" || _items[i].code == "hp4")) {
                             //if found drop the small hp
                             SetUIState(0x1F, true);
                             if(NTT_DropItem(_items[i]))
                             NTC_PingDelay(200);
                             me.Cancel(1);
                             return false;  //return not full now after dropping a hp
                  }
               }
            }
                    if(_type == 77 && _code == "mp5") {
                       for(i = 0 ; i < _items.length ; i++)
                       {
                          //look for a small manapotion
                          if(_items[i].mode == 2 && (_items[i].code == "mp1" || _items[i].code == "mp2" || _items[i].code == "mp3" || _items[i].code == "mp4")) {
                             //if found drop the small mp
                             SetUIState(0x1F, true);
                             if(NTT_DropItem(_items[i]))
                             NTC_PingDelay(200);
                             me.Cancel(1);
                             return false;  //return not full now after dropping a mp
                  }
               }
            }
            return true;
         } 
        }
    }
    else if(item.quality == 7 && item.classid >= 603 && item.classid <= 605)
    {
        _items = me.GetItems(item.classid);

        if(_items)
        {
            for(i = 0 ; i < _items.length ; i++)
            {
                if(_items[i].quality == 7)
                    return true;
            }
        }
    }

    return false;
}
function NTC_GetItemColorInt(itemunit)
{
    if(!itemunit)
        return 0;
    if(itemunit.itemtype == 74 || (itemunit.classid >= 531 && itemunit.classid <= 555) || (itemunit.classid >= 644 && itemunit.classid <= 657))
        return 8;
    else
        return itemunit.quality;
    
}
Hier wird einem angezeigt, ob ein Unique oder Set Item gedroppt ist (ingame und auch im Item log).
Speziell bei Mephisto kann es vorkommen, dass items ein paar mal geloggt werden, da die öfters im Scan Radius liegen können, wenn man die Ratsmitglieder tötet und dabei öfters herum-telt.
Per Definition kann letzteres nicht passieren.

Ein Item wird nur dann geloggt, wenn dessen gid noch nicht im Array enthalten ist. Die gid ist für jedes Item Objekt innerhalb eines Spiels einzigartig, sowie konstant.
Darum kann das was du beschreibst, mit obigem Code nicht eintreten, da in dem Moment, in dem der Eintrag ins Log erfolgt, auch die gid im Array gespeichert wird.
Ich würde eher davon ausgehen, dass Items tatsächlich mehrfach gedroppt sind.
Kannst ja mal Testweise die gid mit ausgeben lassen, das würde meine Aussage belegen.

Lg
Muddy
Muddy Waters is offline  
Reply


Similar Threads Similar Threads
Schon mal einer gedroppt?
02/19/2010 - Metin2 - 0 Replies
Hallo. Wollte euch mal fragen, ob einer schon mal Seeli ausm leichten Affenboss bekommen hat, weil der is ja Stufe Boss und im Wiki steht auch man bekommt seeli von ihm? MfG
Loooool segi gedroppt
09/09/2009 - Metin2 Private Server - 14 Replies
loool endlich segi
habe ihn korea lotto zahl gedroppt?
08/09/2009 - Metin2 - 13 Replies
habe ihn korea lotto zahl gedroppt was bringt das und wo muss ich damit hin?
wo hat jemand schon stichi gedroppt?
07/09/2009 - Metin2 Private Server - 8 Replies
Der titel sagt alles^^
Werden die G-waffen noch gedroppt?
05/06/2008 - Flyff - 11 Replies
also es gibt ne menge leute die in dflyff sagen dass man sich die g-waffen nurnoch basteln kann. stimmt dass oder werden die noch gedroppt. habe lange zeit nich t gespielt deshalb weis ich das nich



All times are GMT +2. The time now is 09:37.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.