ich möchte das nachfolgende CowSkript wie folgt ändern:
1. Skript:
Code:
// D2NT Cow script // Version 1.4.1 //--- CONFIG --- const _NTR_FAIL_CHECKS = 25; // Number of failed teleports before script ends. Ex. Edge of map causes a fail teleport. DEFAULT: 25 const _NTR_PRE_EVERY = 40; // Number of seconds before precasting again. -1 for never. DEFAULT: 40 const _NTR_CHEST_AND_ROCKS = true; // Open chest and rocks. DEFAULT: true //--- END --- const _NTR_STRING_PORTAL = GetLocaleString(3226); 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; } NTTMGR_TownManager(); var _wirtbody, _cube, _leg, _portal, _stash, _items, i, _npc, prearea; for (i = 0; i < 10; i++){//need to add a check for leg with me.getitems also _leg = NTC_FindUnit(NTC_UNIT_ITEM, 88); if (_leg) break; } //Checks If you already have the leg _items = me.GetItems(); for (i = 0; i < _items.length;i++){ if (_items[i].classid == 88) { Print ("Already Got Leg"); _leg = _items[i]; } } if (!_leg){ if(!NTTM_TownMove("waypoint")){ NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_TownMove()"); return; } if(!NTM_TakeWaypoint(4)){ NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeWaypoint()"); return; } NTP_DoPrecast(true); if(!NTM_MoveToPresetUnit(me.areaid, NTC_UNIT_MONSTER, 737, 10, 10)){ NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToPresetUnit()"); return; } if(NTConfig_KillRakanishuCows){ if(NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe)){ NTTMGR_VisitTown(); } if(NTA_KillMonster(GetLocaleString(2872))){ if(NTConfig_ClearPosition) NTA_ClearPosition(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } } if(!NTM_UsePortal("Portal", 38)){ NTC_SendMsgToScript("NTBotGame.ntj", "NTM_UsePortal()"); return; } if(NTConfig_TristExtension){ if(!NTA_ClearLevel()){ NTC_SendMsgToScript("NTBotGame.ntj", "NTA_ClearLevel()"); } } NTM_MoveTo(me.areaid, 25047, 5178); if(NTA_ClearPosition(10)){ if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } _wirtbody = NTC_FindUnit(NTC_UNIT_OBJECT, 268); if(!_wirtbody){ NTC_SendMsgToScript("NTBotGame.ntj", "Wirt's body not found."); return; } if(NTM_MoveTo(_wirtbody.areaid, _wirtbody.x+3, _wirtbody.y)){ if(NTC_OpenChest(_wirtbody)){ NTC_PingDelay(500); for (i = 0; i < 10; i++){ _leg = NTC_FindUnit(NTC_UNIT_ITEM, 88); if (_leg) break; } if(!NTT_CheckSpace(_leg.xsize, _leg.ysize)){ _prearea = me.areaid if(NTTM_CheckAct()){ NTTMGR_TownManager(true); NTTM_TownMove("portalspot") NTM_UsePortal("BluePortal", _prearea) } } for (i = 0; i < 20; i++){ if ((i % 5) == 0){ if (_leg.mode == 3 || _leg.mode == 5){ if (NTC_ClearCursor()) NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _leg); } } NTC_PingDelay(100); if (_leg.mode != 3 && _leg.mode != 5){ Print(COLOR_4 + "Got Leg"); NTC_PingDelay(200); break; } } } } if(!_leg){ NTC_SendMsgToScript("NTBotGame.ntj", "No leg found."); return; } NTM_MakeTP(1); //NTM_UsePortal("BluePortal"); //Print(COLOR_8 + " This is where the problem is?"); } else{ if(!NTT_CheckSpace(_leg.xsize, _leg.ysize)){ _prearea = me.areaid; if(NTTM_CheckAct()){ NTTMGR_TownManager(true); NTTM_TownMove("portalspot") NTM_UsePortal("BluePortal", _prearea) } } for (i = 0; i < 20; i++){ if ((i % 5) == 0){ if (_leg.mode == 3 || _leg.mode == 5){ if (NTC_ClearCursor()) NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _leg); } } NTC_PingDelay(100); if (_leg.mode != 3 && _leg.mode != 5){ Print(COLOR_4 + "Who caries a leg around?"); NTC_PingDelay(200); Print(COLOR_4 + "Dude, thats sick."); break; } } } if(NTCW_AlreadyTombs()){ if(!NTTM_CheckAct()){ NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()"); return; } NTTM_TownMove("akara"); for(var i = 0 ; i < 10 ; i++){ _npc = NTC_FindUnit(NTC_UNIT_NPC, NTC_NPC_ID_AKARA); if(_npc) break; } if(_npc){ if(NTT_DoInteract(_npc)){ if(NTT_DoTrade(_npc)){ _NTR_DoID = NTT_CheckUnids(); if(_NTR_DoID) NTTMGR_IDItems(_npc); NTT_FillTome(_npc, 1); NTT_FillTome(_npc, 0); NTT_SecondTomeTP(_npc, "tbk", 1); _portal = NTR_GetTP(); if(!_portal){ NTC_SendMsgToScript("NTBotGame.ntj", "No extra tome of townportal found."); return; } } } me.Cancel(1); } } else _portal = NTR_GetTP(); NTTM_TownMove("stash"); for(var i = 0 ; i < 10 ; i++){ _stash = NTC_FindUnit(NTC_UNIT_OBJECT, NTC_UNIT_STASH); if(_stash) break; } if(_stash){ if(NTM_GetCloserInt(_stash)){ if(NTT_DoInteract(_stash)){ _items = me.GetItems(NTC_UNIT_CUBE); _cube = _items[0]; if(!_cube){ NTC_SendMsgToScript("NTBotGame.ntj", "No cube found."); return; } if(NTCU_CheckCubeInventoryInt() > 0){ NTCU_OpenCubeInt(_cube) if(NTCU_ClearCubeInt() < 1){ NTC_SendMsgToScript("NTBotGame.ntj", "Cube cannot be emptied."); return; } NTCU_CloseCubeInt(); } NTCU_MoveItemToCubeInt(_cube,_leg) NTCU_MoveItemToCubeInt(_cube,_portal) NTCU_OpenCubeInt(_cube); if(Transmute()){ NTC_PingDelay(NTConfig_CubingDelaysCows); NTCU_CloseCubeInt(); NTC_PingDelay(NTConfig_CubingDelaysCows); NTC_CancelMenus();// added this for testing NTC_PingDelay(parseInt((NTConfig_CubingDelaysCows / 2), 10)); } else{ NTC_PingDelay(NTConfig_CubingDelaysCows); NTCU_CloseCubeInt(); NTC_PingDelay(NTConfig_CubingDelaysCows); NTC_CancelMenus();// added this for testing NTC_PingDelay(parseInt((NTConfig_CubingDelaysCows / 2), 10)); } } } } NTC_PingDelay(NTConfig_CubingDelaysCows); if(!NT_TakeCowPortal()){ NTC_SendMsgToScript("NTBotGame.ntj", "Failed to take Cow Portal."); return; } NTP_DoPrecast(true); NTR_ClearRooms(); NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END"); } // Internal functions function NTR_GetTP(){ var _portals = me.GetItems("tbk"); if (_portals){ for (var i = 0; i < _portals.length; i++){ if (_portals[i].mode == 0 && (_portals[i].itemloc != 0 || NTConfig_Columns[_portals[i].y][_portals[i].x] > 0)){ return _portals[i]; } } } return false; } function abs(integer){ if(integer < 0){ integer = -integer; } return integer; } function NTR_TakeCowPortal(range){ var _portal = NTC_FindUnit(NTC_UNIT_OBJECT, _NTR_STRING_PORTAL); if (_portal){ var _isClick; var _preAreaId = me.areaid; do{ if (GetDistance(me, _portal) < range && _portal.mode == 2){ for (var i = 0; i < 40; i++){ if ((i % 10) == 0){ if(NTM_GetCloserInt(_portal)) _isClick = NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _portal); } if (_isClick){ NTC_Delay(200); break; } } NTC_PingDelay(1000); var j = 0; var check = true; do{ if (me.areaid != _preAreaId){ NTC_PingDelay(500); return true; check = false; } j++; } while(j < 40 && check == true); } } while (_portal.GetNext()); } return false; } function NTR_ClearPosition(range, pickitem, safelevel, failed){ var _orgx, _orgy; var _spectype = [0x0A, 0x01, 0x01]; //var _spectype = [0x0A, 0x01]; var _skiplist; var _attackcount = 0; var _target; var _distance, _mingid, _mindistance; var _result; var _cowKing; var _test; if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1) return false; switch(arguments.length){ case 0: range = 20; case 1: pickitem = false; case 2: safelevel = 0; default: if((NTConfig_CheckSelfSafe.length < 1) && (NTConfig_CheckMercSafe.length < 1)) safelevel = 0; break; } _orgx = me.x; _orgy = me.y; for(var i = 0 ; i < _spectype.length ; i++){ _skiplist = new Array(); while(_attackcount < (i+1)*100){ _mindistance = 100000; _target = NTC_FindUnit(NTC_UNIT_MONSTER); if(_target){ do{ if(_skiplist.indexOf(_target.gid) < 0){ if(_target.IsAttackable() && (_target.spectype&_spectype[i])){ if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target)){ _distance = GetDistance(me, _target); if(_distance < _mindistance){ _mingid = _target.gid; _mindistance = _distance; } } } else _skiplist.push(_target.gid); } } while(_target.GetNext()); } if(_mindistance < 100000){ _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid); if(_target){ _cowKing = GetUnit(NTC_UNIT_MONSTER, GetLocaleString(2850)); if(_cowKing){ return true; } _result = NTA_Attack(_target, (_attackcount%30) == 0); switch(_result){ case 1: _skiplist.push(_mingid); break; case 2: case 3: _attackcount++; _sorcattack++; break; default: return false; } } } else break; } } if(me.classid == NTC_CHAR_CLASS_PALADIN){ if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP)){ if(NTC_PutSkill(124, NTC_HAND_RIGHT)) NTC_PingDelay(1000); } } _cowKing = GetUnit(NTC_UNIT_MONSTER, GetLocaleString(2850)); if(_cowKing){ return true; } if(me.classid == NTC_CHAR_CLASS_NECROMANCER){ NTA_SkeletonArmy(NTConfig_SkeletonArmy); NTA_MageArmy(NTConfig_MageArmy); NTA_ReviveArmy(NTConfig_ReviveArmy); } if(_NTR_CHEST_AND_ROCKS && failed == false){ _target = NTR_GetChest(); if(_target){ do{ if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range){ if(NTC_OpenChest(_target)){ if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } } }while(_target.GetNext()); } _target = NTR_GetObj(174); if(_target){ do{ if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range){ if(NTM_MoveTo(me.areaid, _target.x, _target.y)){ if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target)){ Delay(200); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } } } }while(_target.GetNext()); } _target = NTR_GetObj(175); if(_target){ do{ if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range){ if(NTM_MoveTo(me.areaid, _target.x, _target.y)){ if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target)){ Delay(200); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } } } }while(_target.GetNext()); } _target = NTR_GetObj(159); if(_target){ do{ if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range){ if(NTM_MoveTo(me.areaid, _target.x, _target.y)){ if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target)){ Delay(200); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } } } }while(_target.GetNext()); } _target = NTR_GetObj(155); if(_target){ do{ if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range){ if(NTM_MoveTo(me.areaid, _target.x, _target.y)){ if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target)){ Delay(200); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } } } }while(_target.GetNext()); } } if(pickitem && _attackcount > 0){ if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } NTSI_PickItems(); if(NTConfig_IdInField){ if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) { NT_FieldID(); } // id in field add } } switch(safelevel){ case 1: return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe); case 2: return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe); } return true; } function NTR_ClearRooms(){ var failcount = 0, precount = 0, x, y, offx = 0, offy = 0, goalx = 0, goaly = 0, cowoffx = 0, cowoffy = 0; var toggle = true; var _cowKing; var _faillast; x = me.x; y = me.y; //NTC_PingDelay(5000); while (failcount <= _NTR_FAIL_CHECKS){ if(toggle == true && offx == goalx){ if(goaly < 0){ goaly=(0-(goaly-20)); }else{ goaly=(0-(goaly+20)); } toggle = false; } if(toggle == false && offy == goaly){ if(goaly < 0){ goalx=(0-(goalx-20)); }else{ goalx=(0-(goalx+20)); } toggle = true; } if(offy > goaly){ offy-=20; y-=20; } if(offy < goaly){ offy+=20; y+=20; } if(offx < goalx){ offx+=20; x+=20; } if(offx > goalx){ offx-=20; x-=20; } _cowKing = GetUnit(NTC_UNIT_MONSTER, GetLocaleString(2850)); if(!_cowKing){ NTR_ClearPosition(20, true, 0, _faillast); if(((GetTickCount()-precount)/1000) >= _NTR_PRE_EVERY && _NTR_PRE_EVERY >= 0){ NTP_DoPrecast(); precount = GetTickCount(); } } if(!NTM_MoveTo(me.areaid, x, y)){ failcount++; _faillast = true; }else{ _faillast = false; } } return true; } function NTT_SecondTomeTP(npc, type, amount){ var _items; var _counter = 0; if(arguments.length < 1) return false; if(arguments.length < 2) type = 0; if(arguments.length < 0) amount = 1; if(amount == 0) return false; if(type) _items = npc.GetItems("tbk"); if(_items){ if(_items.length > 0){ for(var i = 0 ; i < amount ; i++){ if(NTT_ShopItem(_items[0], npc, 2)) _counter++; } } } return (_counter > 0); } function NTR_GetChest(){ var _chest; _chest = NTC_FindUnit(NTC_UNIT_OBJECT, "chest"); if(_chest){ return _chest; } return null; } function NTR_GetObj(num){ var _chest; _chest = NTC_FindUnit(NTC_UNIT_OBJECT, num); if(_chest){ return _chest; } return null; } function NTCW_AlreadyTombs(){ var portalbook = me.GetItems("tbk"); if(portalbook && portalbook.length <= 1) return true; else return false; } function NT_TakeCowPortal(){ var _prearea = me.areaid var _portal = NTC_GetUnit(NTC_UNIT_OBJECT, GetLocaleString(3226)); if(_portal){ do{ if(_portal.subareaid == 295 || _portal.subareaid == 39){ while(_portal.mode != 2){ Delay(500) } break; } } while(_portal.GetNext()); for(var i = 0 ; i < 40 ; i++){ if(NTM_GetCloserIntS(_portal)){ NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _portal); } if(me.areaid != _prearea){ break; } } } return (me.areaid == 39); } // need to make it check for an already open cow portal before getting leg // need to add the 2nd config option for id field in // add a quest check into cow script if king has been killed then message and skip // ^^^ pretty sure it is me.GetQuest(4, 10) for cow king dead
Problem:
Leader startet ein neues Spiel und hat WirretsLeg sowie ein Buch des Stadtportals noch im Horadrim Würfel. Er versucht in diesem neuen Spiel in Akt 5 das CowPortal zu öffnen, da er dort gestartet ist (etwas konfuses Szenario, ich hab es jedoch beobachtet). Die Folge: Nachfolgende Runs werden durchweg ohne Kuhlevel durchgeführt, da sich der Fehler Spiel für Spiel wiederholt.
Lösungsansätze:
a) Irgendwo wird dem Leader gesagt, dass er das CowPortal nur in Akt 1 aufmachen darf/kann.
b) Er wirft das Bein / das Buch des Stadtportals weg, also leert den Würfel und macht sich erneut auf den Weg nach Tristram.
Umsetzung:
Da fehlen mir die notwendigen Kenntnisse . Im Skript steht ja ziemlich am Anfang:
Code:
if (_leg) break; } //Checks If you already have the leg _items = me.GetItems();
Ich bevorzuge Variante b, würde mich aber auch mit Varinate a zufrieden geben. Grund: LeechFighter joinen das CowPortal nach einem definierten Delay. In Variante a wäre das CowPortal früher/schneller auf und der Leader würde folglich eine längere Zeit allein im Kuhlevel arbeiten.
Als weitere Information füge ich an, dass ich das Skript derzeit mit dem D2NT Etal nutze, andere Versionen des D2NT laufen bei mir momentan nicht rund .
Falls das kein großer Aufwand ist und jemand Lust hat, eine der Lösungsideen in das Skript zu integrieren, wäre ich ihm/ihr sehr dankbar. Zudem hoffe ich, dass das Unterforum "Diablo 2 Programming" die richtige Wahl war.
Besten Dank im Voraus.