Nach einem Volltest des Scripts, welches mit/durch Muddy geschrieben wurde, kann ich mit Freude verkünden: Es ist betriebsbereit!
Funktionsweise:
Das Script für Muddys D2NT Version macht folgendes:
Es schaut im Umkreis um die Truhe nach Craftbaren Items, sofern welche rumliegen, wird geschaut was wie zusammenpasst.
Der Bot hebt die passenden Gegenstände für die Craftrezepte auf die ihr in den Globalsettings eingestellt habt und baut sie im Cube zusammen.
Danach prüft er die Eigenschaften der Ringe in der CraftNip, wie gehabt.
Crapcrafts kommen auf den Boden, der Rest in die Truhe.
Umfang des Tests:
Der Umfang meines Test sind 88x Jools/Rubys/Sols/Ringe gewesen. (Quasi 88 Bloodcraftpacks)
Keine Fehler oder sonstige Bugs.
Nichts desto trotz bitte ich euch, dieses Script auch mal zu testen und euer Feedback zu posten
Ich bin der Meinung das es einiges leichter macht, denn: Craftpacks bekommen is eine Sache, die Zeit fürs Craften zu haben eine Andere :P
Und wunde Finger wünsche ich keinem EPvper
Ein riesen Dank an Muddy, denn ohne Ihn wäre das Script für mich net realisierbar gewesen.
Ich bin kein großer JavaTexter, aber massig Ideen hab ich
Installation:
Macht euch am Besten einen Ordner "MWCraft" im Scripts Ordner
Dort kommt die MWCraftGame.ntj rein.
Die MWCraftEntry.ntj kommt in den Scriptsordner.
Die MWCraft.ntj File kommt in den NTBot/Bots Ordner
Dann müsst ihr einfach nur im D2NT Manager MWCraftEntry.ntj anstatt NTBot.ntj auswählen und euch manuell in das Game einloggen wo ihr die Craftpacks gedroppt habt.
Voila!
NTTMGR_TownManager() würde ich nur einmal zur Initialisierung der Funktion aufrufen, NTTMGR_VisitStash(cubing) bietet sich tatsächlich eher an, wobei für den Parameter cubing einfach konstant true übergeben wird.
Das Aufheben ist etwas komplizierter, mit SnagIt kommst du da nicht weit, mit MWC_GetItems() schon gar nicht, denn die Funktion macht etwas völlig anderes.
Ob ein Item benötigt wird oder nicht, lässt sich durch Aufruf von NTSI_CheckItem(item, checkQuantity) ermitteln. Wird das Item zum Cuben benötigt, liefert die Funktion den Wert 2 zurück.
Soweit so gut, doch musst du sämtliche Items am Boden vor dem eigentlichen Aufheben erstmal sinnvoll gruppieren, damit du volle Craft Sets priorisiert aufheben kannst. Ich hatte es ja schon vorher angedeutet, es kann sonst passieren, dass dein Char sein komplettes Inventar nur mit Gems oder Runen füllt, sodass du keinen Platz mehr hast, aber eben auch nicht craften kannst.
Wie oben schon erwähnt liegt die Schwierigkeit hier in der Implementierung der Funktion MWCR_PickIngredients(), ich werde mir dazu mal Gedanken machen und eventuell nachher mal einen Entwurf posten, du kannst dir ja selber auch mal eine Umsetzung ausdenken.
Wie man unschwer erkennt, hat die Endlosschleife derzeit keine Abbruchbedingung, hierzu sollte man eventuell den Game Thread erweitern und Key Events abfangen und das Script dann über den Pointer auf das dazugehörige Script Objekt stoppen.
const _MWCR_PICKUP_RANGE = 15;
function NTMain()
{
Include("libs/common/NTCommon.ntl");
NTC_IncludeLibs();
NTC_IncludeConfig("NTBot/char_configs");
NT_LoadConfig();
NTSI_LoadNIPFiles("NTBot/item_configs");
MWC_Initialize();
if(!NTTM_CheckAct(1, true))
{
NTC_SendMsgToScript("MWBotGame.ntj", NTTM_CheckAct, 18, me.act, true);
return;
}
NTTMGR_TownManager();
while(true)
{
NTCU_InitCubing();
MWCR_PickIngredients();
if(NTCU_CheckCubing())
NTTMGR_VisitStash(true);
NTC_Delay(1000);
}
NTC_SendMsgToScript("MWBotGame.ntj", "SCRIPT_END");
}
function MWCR_PickIngredients()
{
var _item, _craftSets, _index;
var i, j;
_craftSets = new Array();
_item = NTC_FindUnit(NTC_UNIT_ITEM);
if(!_item)
return;
// _craftSets structure: [requiredIngredients[], runegid, gemgid, jewelgid, basegid]
// requiredIngredients[] structure: [ilvl, runeclassid, gemclassid, jewelclassid, baseclassid]
for(i = 0; i < NTConfig_CubingItem.length; i++)
{
_craftSets.push([_NTCU_CraftRecipe[NTConfig_CubingItem[i][0] - NTCU_CRAFT_HITPOWER_HELM], null, null, null]);
_craftSets[_craftSets.length - 1][0].push(MWCU_JEWEL, NTConfig_CubingItem[i][1]);
}
do
{
if(GetDistance(me, _item) < _MWCR_PICKUP_RANGE && NTSI_CheckItem(_item) == 2)
{
for(i = 0; i < _craftSets.length; i++)
{
_index = _craftSets[i][0].indexOf(_item.classid); // Returns a valid array index if the item is required for the current recipe (1: rune; 2: perfect gem; 3: base item)
if(_index > 0)
{
if(_craftSets[i][_index] == null)
{
_craftSets[i][_index] = _item.gid;
break;
}
}
}
}
} while(_item.GetNext());
for(i = 0; i < _craftSets.length; i++)
{
for(j = 0; j < _craftSets[i].length; j++)
{
if(_craftSets[i][j] == null)
break;
}
if(j >= _craftSets[i].length)
{
for(j = 1; j < _craftSets[i].length; j++)
MWSI_PickupItem(_craftSets[i][j]);
}
}
}
Das ist nur ein relativ simpler und wenig intelligenter Ansatz, wobei nur soviele Sets aufgehoben werden, wie entsprechende Rezepte aktiviert sind. Ausserdem werden nur vollständige Sets aufgehoben.
Kannst es ja mal ausprobieren, ich habe es nicht getestet, sollte aber funktionieren, sofern ich mich nicht vertippt habe.
const _MWCR_PICKUP_RANGE = 15;
function NTMain()
{
Include("libs/common/NTCommon.ntl");
NTC_IncludeLibs();
NTC_IncludeConfig("NTBot/char_configs");
NT_LoadConfig();
NTSI_LoadNIPFiles("NTBot/item_configs");
MWC_Initialize();
if(!NTTM_CheckAct(1, true))
{
NTC_SendMsgToScript("MWBotGame.ntj", NTTM_CheckAct, 18, me.act, true);
return;
}
NTTMGR_TownManager();
while(true)
{
NTCU_InitCubing();
MWCR_PickIngredients();
if(NTCU_CheckCubing())
NTTMGR_VisitStash(true);
NTC_Delay(1000);
}
NTC_SendMsgToScript("MWBotGame.ntj", "SCRIPT_END");
}
function MWCR_PickIngredients()
{
var _item, _craftSets, _index;
var i, j;
_craftSets = new Array();
_item = NTC_FindUnit(NTC_UNIT_ITEM);
if(!_item)
return;
// _craftSets structure: [requiredIngredients[], runegid, gemgid, jewelgid, basegid]
// requiredIngredients[] structure: [ilvl, runeclassid, gemclassid, jewelclassid, baseclassid]
for(i = 0; i < NTConfig_CubingItem.length; i++)
{
_craftSets.push([_NTCU_CraftRecipe[NTConfig_CubingItem[i][0] - NTCU_CRAFT_HITPOWER_HELM], null, null, null]);
_craftSets[_craftSets.length - 1][0].push(MWCU_JEWEL, NTConfig_CubingItem[i][1]);
}
do
{
if(GetDistance(me, _item) < _MWCR_PICKUP_RANGE && NTSI_CheckItem(_item) == 2)
{
for(i = 0; i < _craftSets.length; i++)
{
_index = _craftSets[i][0].indexOf(_item.classid); // Returns a valid array index if the item is required for the current recipe (1: rune; 2: perfect gem; 3: base item)
if(_index > 0)
{
if(_craftSets[i][_index] == null)
{
_craftSets[i][_index] = _item.gid;
break;
}
}
}
}
} while(_item.GetNext());
for(i = 0; i < _craftSets.length; i++)
{
for(j = 0; j < _craftSets[i].length; j++)
{
if(_craftSets[i][j] == null)
break;
}
if(j >= _craftSets[i].length)
{
for(j = 1; j < _craftSets[i].length; j++)
MWSI_PickupItem(_craftSets[i][j]);
}
}
}
Das ist nur ein relativ simpler und wenig intelligenter Ansatz, wobei nur soviele Sets aufgehoben werden, wie entsprechende Rezepte aktiviert sind. Ausserdem werden nur vollständige Sets aufgehoben.
Kannst es ja mal ausprobieren, ich habe es nicht getestet, sollte aber funktionieren, sofern ich mich nicht vertippt habe.
LG
Muddy
Ah okay, ich hatte mir überlegt das ma vllt. direkt aus der Cubing.ntj die Rezepte verwenden kann, weil dort steht ja eig. schon drin welches Set ist und was dazu gehört, aber dann würde der Cubing Algorithmus glaub nicht mehr stimmen :/
Bevor ichs ausprobieren kann, fehlt mir noch ne sinnvolle Schleife in der MwCraftGame.
Code:
/**
* This file was modified by
* Check the programming section for updates and further scripts
* Last Update: 02/19/2011
*/
function NTMain()
{
SetStatusText("ÿc8Initializing...");
Include("libs/common/NTCommon.ntl");
NTC_IncludeLibs();
NTC_IncludeConfig("NTBot/char_configs");
NT_LoadConfig();
NTSI_LoadNIPFiles("NTBot/item_configs");
if(NTConfig_StartDelay > 0);
NTC_Delay(NTConfig_StartDelay);
NTT_GetCorpses();
if(Load("NTBot/bots/MWCraft.ntj"))
Print("ÿc8Running MWCraft.ntj");
ExitGame();
}
Er lädt das Script und geht dann direkt ausm Game, was ja logisch is.
wie genau kann ich jetz hier ne sinnvolle Schleife einbaun?
Da ich meinen Pc neu aufgesetzt habe und entsprechende Probleme eingetreten sind, die eine typische Windowsneuinstallation so mit sich bringt - Ein Dankeschön an Mr. Gates nebenbei - hat es dementsprechend länger gedauert.
EDIT:
Also Habs ausprobiert, klappt wunderbar.
Hab 88x Craftpacks gedroppt. Bin mit dem Entry ins Game und er hat auch direkt angefangen zu craften. Unwichtige hat er einfach bei der Truhe gedroppt und Wichtige gestashed.
Ich habe, als er dann fertig war, alle 2Sek. heftige Lags bemerkt die wohl vom Scannen kommen.
Da man das Script aber eh einsetzt wenn die Craftpacks aufm Boden rumliegen und rausgeht wenn er fertig is, geht das