PS: Wenn er ab und zu ein TP aufmacht und gleich wieder zurückgeht dann dient das dem Warpen des Mercs (der soll ja nicht irgendwo killen, sondern da wo wir sind).
PPS: IdInField ist je nach freiem Inventar zu empfehlen
Wer gamblen will, muss leider eine Kleinigkeit im libs\common\NTTownManager.ntl anpassen (Zeile 14-19, ein Parameter dazu der verhindert dass immer zum Slot 0 geswitched wird):
Code:
function NTTMGR_TownManager(simple[B][COLOR="Red"], noswap[/COLOR][/B])
{
while(me.areaid == 0){
NTC_Delay(200);
}
[COLOR="Red"][B]if(!noswap) [/B][/COLOR]NTC_SwapWeapons(0);
Code:
function NTMain(){
Include("libs/common/NTCommon.ntl");
NTC_IncludeLibs();
NTC_IncludeConfig("NTBot/char_configs");
NT_LoadConfig();
NTSI_LoadNIPFiles("NTBot/item_configs");
NTA_Initialize();
if(!NTTM_CheckAct()) {
NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
return;
}
var switched = false;
if(NTConfig_Gamble && Trav_HasEdge() > 0) {
if(NTC_MyGold() > NTConfig_GambleStartGold) {
Trav_SwitchEdge();
switched = true;
}
else {
NTC_SwapWeapons(0);
}
}
NTTMGR_TownManager(false, true);
if(switched) {
NTC_SwapWeapons();
}
if(!NTTM_TownMove("waypoint")){
NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_TownMove()");
return;
}
if(!NTM_TakeWaypoint(83)){
NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeWaypoint()");
return;
}
var _wp = NTC_FindUnit(NTC_UNIT_OBJECT, 237);
if(!_wp){
NTC_SendMsgToScript("NTBotGame.ntj", "NTC_FindUnit()");
return;
}
NTP_DoPrecast(true);
NTM_MoveTo(me.areaid, _wp.x + 19, _wp.y + 5);
NTM_MoveTo(me.areaid, _wp.x + 23, _wp.y - 23);
NTM_MoveTo(me.areaid, _wp.x + 100, _wp.y - 31);
NTM_MoveTo(me.areaid, _wp.x + 99, _wp.y - 61);
NTM_MoveTo(me.areaid, _wp.x + 99, _wp.y - 75);
var firstTimeWarp = true;
while(true) {
var _monster = Trav_GetNearestCouncil(_wp);
if(_monster) {
if(Trav_isUnitInside(_monster, _wp)) {
Trav_GetInsideTemple(_wp);
}
else {
Trav_GetOutsideTemple(_wp);
}
if(firstTimeWarp && Trav_GetDistanceToMerc() > 20) {
Trav_TPWarpMerc();
firstTimeWarp = false;
continue;
}
firstTimeWarp = false;
if(GetDistance(me.x, me.y, _monster[0], _monster[1]) >= 5) {
NTM_MoveTo(me.areaid, _monster[0], _monster[1], 0);
}
Trav_StunNearByMonsters();
Trav_CheckMercAndMeInOrOutTemple(_wp, _monster);
}
else {
break;
}
NTC_Delay(750);
}
looting = true;
NTSI_PickItems();
Trav_LootCorpses(_wp);
NTTM_CheckAct(4);
NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
}
var lastRelocate = 0;
function Trav_CheckMercAndMeInOrOutTemple(_wp, _monster) {
var _merc = NTC_GetMerc();
if(!_merc) return false;
if(Trav_amInsideTemple(_wp) == Trav_isUnitInside(_monster, _wp) && Trav_amInsideTemple(_wp) != Trav_isUnitInside([_merc.x, _merc.y], _wp) && GetTickCount() - lastRelocate > 5000) {
Trav_TPWarpMerc();
lastRelocate = GetTickCount();
}
}
function Trav_GetDistanceToMerc() {
var _merc = NTC_GetMerc();
if(_merc) return GetDistance(me, _merc);
return null;
}
function Trav_LootCorpses(_wp) {
var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_corpse){
var corpses = [];
do{
if(_corpse.mode == 12 && _corpse.name != "Hydra" && GetDistance(me, _corpse) < NTConfig_SnagRange && _corpse.GetState(118) == 0 && !(_corpse.GetState(96)) && !(_corpse.GetState(104)) && !(_corpse.GetState(107)) && !(_corpse.GetState(118))) {
corpses.push([_corpse.x, _corpse.y]);
}
} while(_corpse.GetNext());
while(corpses.length > 0) {
corpses.sort(Trav_SortRoomInt);
_corpse = corpses.shift();
if(Trav_isUnitInside(_corpse, _wp)) {
Trav_GetInsideTemple(_wp);
}
else {
Trav_GetOutsideTemple(_wp);
}
if(GetDistance(me, _corpse) > 15) {
NTM_MoveTo(me.areaid, _corpse[0], _corpse[1], 0);
}
NTC_CastSkill(142, NTC_HAND_RIGHT);
NTSI_PickItems();
}
}
return false;
}
function Trav_TPWarpMerc() {
NTTM_CheckAct();
var retry = 0;
while(me.areaid != 83) {
NTM_UsePortal("BluePortal", 83);
NTC_Delay(500);
if(me.areaid != 83 && ++retry > 10) {
NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_ERROR UsePortal");
return;
}
}
}
function Trav_amInsideTemple(_wp) {
return Trav_isUnitInside([me.x, me.y], _wp);
}
function Trav_isDoorBlocked(_wp) {
var _monster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_monster){
do{
if(NTA_IsValidMonster(_monster) && _monster.IsAttackable() && GetDistance(_wp.x+98, _wp.y-84, _monster.x, _monster.y) < 5) {
return true;
}
} while(_monster.GetNext());
}
return false;
}
function Trav_GetOutsideTemple(_wp) {
if(!Trav_amInsideTemple(_wp)) return;
NTM_MoveTo(me.areaid, _wp.x+100, _wp.y-92);
if(!looting && Trav_isDoorBlocked(_wp)) {
return;
}
NTM_MoveTo(me.areaid, _wp.x+99, _wp.y-75);
}
function Trav_GetInsideTemple(_wp) {
if(Trav_amInsideTemple(_wp)) return;
NTM_MoveTo(me.areaid, _wp.x+99, _wp.y-75);
if(!looting && Trav_isDoorBlocked(_wp)) {
return;
}
NTM_MoveTo(me.areaid, _wp.x+98, _wp.y-92);
NTM_MoveTo(me.areaid, _wp.x+87, _wp.y-92);
}
function Trav_StunNearByMonsters() {
var _monster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_monster){
var casted1 = false, casted2 = false;
do{
if(NTA_IsValidMonster(_monster) && _monster.IsAttackable() && GetDistance(me, _monster) < 5 && _monster.name != "Hydra") {
if(!(_monster.spectype&0x0A) && !_monster.GetState(21)) { //bosses cant get stunned
NTC_CastSkill(154, NTC_HAND_RIGHT);
casted1 = true;
}
if(!_monster.GetState(89)) {
NTC_CastSkill(146, NTC_HAND_RIGHT);
casted2 = true;
}
if(casted1 && casted2) break;
}
} while(_monster.GetNext());
}
}
function Trav_isUnitInside(_unit, _wp) {
if(((_unit[0] >= _wp.x + 68 && _unit[0] <= _wp.x + 89) || (_unit[0] >= _wp.x + 108 && _unit[0] <= _wp.x + 129)) && _unit[1] <= _wp.y - 80) {
return true;
}
if(_unit[0] >= _wp.x + 90 && _unit[0] <= _wp.x + 107 && _unit[1] <= _wp.y - 85) {
return true;
}
return false;
}
function Trav_GetNearestCouncil() {
var _monster = NTC_FindUnit(NTC_UNIT_MONSTER);
var name1 = GetLocaleString(3139);// Council Member
var name2 = GetLocaleString(2860);// Toorc Icefist
var name3 = GetLocaleString(2862);// Geleb Flamefinger
var name4 = GetLocaleString(2863);// Ismail Vilehand
if(_monster){
var sortme = [];
do{
if(NTA_IsValidMonster(_monster) && (_monster.name == name1 || _monster.name == name2 || _monster.name == name3 || _monster.name == name4) ) {
sortme.push([_monster.x, _monster.y]);
}
} while(_monster.GetNext());
sortme.sort(Trav_SortRoomInt);
if(sortme.length == 0) return null;
return sortme.shift();
}
}
var _NTP_HaveEdge = -1;
function Trav_HasEdge()
{
if(_NTP_HaveEdge < 0) {
var _weapon;
_NTP_HaveEdge = 0;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if(_weapon[i].mode == 1 && (_weapon[i].itemflag&0x4000000) && _weapon[i].itemprefix == 20537)
{
if(_weapon[i].itemloc == 4 || _weapon[i].itemloc == 5) {
_NTP_HaveEdge = 1;
}
else {
_NTP_HaveEdge = 2;
}
break;
}
}
}
}
return _NTP_HaveEdge;
}
function Trav_SwitchEdge() {
if(Trav_HasEdge() > 0)
return NTC_SwapWeapons(_NTP_HaveEdge-1);
}
function Trav_SortRoomInt(a, b) {
if(GetDistance(me.x, me.y, a[0], a[1]) < GetDistance(me.x, me.y, b[0], b[1]))
return -1;
return 1;
}
Die Reichweite von WC und BC hab ich jetzt mal auf 5 geschätzt, scheint soweit zu funktionieren.
Ursprünglich hatte ich vor aufm Switch BO Waffen zu haben, aber jedesmal zur Truhe zu rennen und mühsam Edge zu equippen war mir dann doch zu blöd... und in NM kommts auf das bissl Leben Unterschied net an.
Probleme gibts wenn PickItems() versucht in oder aus dem Tempel zu kommen, aber die Erfolgsquote ist trotzdem gut
/ps: werde hier dann noch den durchschnittlichen Goldertrag pro Run reinschreiben...







