Скрипт под стелс. Весь не тестировал. Для запуска нужен установленный интерпретатор питона (3.2 х86
тут вся инфа). Скрипт должен быть в файле с расширение
.py.
Скрипт готов для использования в Yew. Единственное, что надо настроить - прописать id контейнеров для всякого хлама.
ResourcesContainer = 0x4004AACB; ItemsContainer = 0x4004AAC8; ToolsContainer = 0x4004AACE
Для работы в другом месте - надо настраивать ItemAnything, ItemVendor. Если в другом месте есть шахта, лучше убрать из скрипта вот эти строки
Code:
#Поиск кочек в лесу.
for i in [240, 241, 242, 243]:
for t, x, y, z in GetLandTilesArray(GetX(Self()) - 75, GetY(Self()) - 75, GetX(Self()) + 75, GetY(Self()) + 75, WorldNum(), i):
TilesCache.append((t, x, y, z, 'Ingots'))
и запускать стоя в шахте.
для первого старта без глюков, нужно закинуть в пак персонажа парочку тинкер тулс, две-три кирки и 2-3 топора. В дальнейшем инструменты чар будет делать сам.
ColorCanUse = ('Iron', 'Copper', 'Bronze', 'Standart', 'Willow', 'Cedar') - все цвета в этом списке будут использоваться для крафта. Остальное будет накапливаться в банке.
Скрипт качает крафта медленно и навар с продаж продукции минимален.
Code:
# -*- coding: cp1251 -*-
from datetime import datetime as dt
import time
import random
#Id контейнеров для ресурсов, предметов, которые не удалось продать, инструментов.
ResourcesContainer = 0x4004AACB; ItemsContainer = 0x4004AAC8; ToolsContainer = 0x4004AACE
#Цвета, из которых можно крафтить. Задержка на перемещение предметов.
ColorCanUse = ('Iron', 'Copper', 'Bronze', 'Standart', 'Willow', 'Cedar'); MoveDelay = 1100
#Id и координаты форжи, банкира, и гейт оф лайф.
ItemAnything = {'Forge': {'Serial': 0x40005E0C, 'X': 522, 'Y': 994}, 'Bank': {'Serial': 0x00086286, 'X': 549, 'Y': 991}, 'Gate of Life': {'Serial': 0x40005E1B, 'X': 535, 'Y': 991}}
#Скилл и его значение, требуемое для крафта из какого-либо цвета. Название цвета, его значение в hex'e, и материал, к которому относится этот цвет. Кнопки в гампе крафта.
#Необходимое кол-во ресурсов, требуемое для крафта одной штуки какого-либо предмета. Контейнер, куда предмет складывается. Имя инструмента, который используется при крафте предмета.
#Тип предмета. Вендор, которому продавать предмет, его координаты, имя и id. Материал, который указывается таргетом при крафте предмета. Какое количество держать в банке. Скилл и предмет на выходе.
#Типы руды. Нужна ли форжа для крафта.
ItemColorSkill = {'Iron': {'Need': 20, 'Skill': ['Blacksmithing']}, 'Copper': {'Need': 50, 'Skill': ['Blacksmithing']}, 'Bronze': {'Need': 70, 'Skill': ['Blacksmithing']}, 'Steel': {'Need': 90, 'Skill': ['Blacksmithing']}, 'Black Steel': {'Need': 110, 'Skill': ['Blacksmithing']}, 'Standart': {'Need': 20, 'Skill': ['Bowcraft', 'Carpentry']}, 'Willow': {'Need': 50, 'Skill': ['Bowcraft', 'Carpentry']}, 'Cedar': {'Need': 70, 'Skill': ['Bowcraft', 'Carpentry']}, 'Walnut': {'Need': 90, 'Skill': ['Bowcraft', 'Carpentry']}, 'Oak': {'Need': 110, 'Skill': ['Bowcraft', 'Carpentry']}}
ItemColor = {'Iron': {'Color': 0x0000, 'Material': 'Ingots'}, 'Copper': {'Color': 0x0AB2, 'Material': 'Ingots'}, 'Bronze': {'Color': 0x0488, 'Material': 'Ingots'}, 'Steel': {'Color': 0x042C, 'Material': 'Ingots'}, 'Black Steel': {'Color': 0x0AA3, 'Material': 'Ingots'}, 'Standart': {'Color': 0x0000, 'Material': 'Logs'}, 'Willow': {'Color': 0x08F1, 'Material': 'Logs'}, 'Cedar': {'Color': 0x08A5, 'Material': 'Logs'}, 'Walnut': {'Color': 0x02F4, 'Material': 'Logs'}, 'Oak': {'Color': 0x0000, 'Material': 'Logs'}, 'any': {'Color': -1}}
ItemGumpButtons = {'Tinker Tools': {'Category': 1, 'Choice': 601}, 'Hatchet': {'Category': 1, 'Choice': 607}, 'Pickaxe': {'Category': 1, 'Choice': 608}, 'Saw': {'Category': 1, 'Choice': 605}, 'Smith Hammer': {'Category': 1, 'Choice': 602}, 'Bowcraft Dagger': {'Category': 1, 'Choice': 603}, 'Viking Sword': {'Category': 5, 'Choice': 603}, 'Club': {'Category': 1, 'Choice': 601}, 'Bow': {'Category': 3, 'Choice': 601}}
ItemPrice = {'Tinker Tools': {'Ingots': 25, 'Logs': 5}, 'Hatchet': {'Ingots': 20, 'Logs': 10}, 'Pickaxe': {'Ingots': 20, 'Logs': 10}, 'Saw': {'Ingots': 20, 'Logs': 0}, 'Smith Hammer': {'Ingots': 20, 'Logs': 0}, 'Bowcraft Dagger': {'Ingots': 12, 'Logs': 0}, 'Viking Sword': {'Ingots': 30, 'Logs': 0}, 'Club': {'Ingots': 0, 'Logs': 20}, 'Bow': {'Ingots': 0, 'Logs': 20}}
ItemContainer = {'Tinker Tools': ToolsContainer, 'Hatchet': ToolsContainer, 'Pickaxe': ToolsContainer, 'Logs': ResourcesContainer, 'Ingots': ResourcesContainer, 'Saw': ToolsContainer, 'Smith Hammer': ToolsContainer,'Bowcraft Dagger': ToolsContainer, 'Viking Sword': ItemsContainer, 'Club': ItemsContainer, 'Bow': ItemsContainer, 'Gold': ObjAtLayer(BankLayer())}
ItemTool = {'Tinker Tools': 'Tinker Tools', 'Hatchet': 'Tinker Tools', 'Pickaxe': 'Tinker Tools', 'Logs': 'Hatchet', 'Ingots': 'Pickaxe', 'Saw': 'Tinker Tools', 'Smith Hammer': 'Tinker Tools', 'Bowcraft Dagger': 'Tinker Tools', 'Viking Sword': 'Smith Hammer', 'Club': 'Saw', 'Bow': 'Bowcraft Dagger'}
ItemType = {'Tinker Tools': 0x1EBC, 'Hatchet': 0x0F43, 'Pickaxe': 0x0E85, 'Logs': 0x1BDD, 'Ingots': 0x1BEF, 'Saw': 0x1034, 'Smith Hammer': 0x13E3, 'Bowcraft Dagger': 0x0F51, 'Viking Sword': 0x13B9, 'Club': 0x13B3, 'Bow': 0x13B1, 'Gold': 0x0EED}
ItemVendor = {'Viking Sword': {'Name': 'Weaponsmith', 'Serial': 0x000880D3, 'X': 480, 'Y': 858}, 'Club': {'Name': 'Carpenter', 'Serial': 0x00086271, 'X': 563, 'Y': 1018}, 'Bow': {'Name': 'Bowyer', 'Serial': 0x00086292, 'X': 567, 'Y': 978}}
ItemMaterial = {'Tinker Tools': 'Ingots', 'Hatchet': 'Ingots', 'Pickaxe': 'Ingots', 'Saw': 'Ingots', 'Smith Hammer': 'Ingots', 'Bowcraft Dagger': 'Ingots', 'Viking Sword': 'Ingots', 'Club': 'Logs', 'Bow': 'Logs'}
ItemStore = {'Tinker Tools': 2, 'Hatchet': 7, 'Pickaxe': 7, 'Logs': 500, 'Ingots': 500, 'Saw': 4, 'Smith Hammer': 4, 'Bowcraft Dagger': 4}
ItemSkill = {'Blacksmithing': 'Viking Sword', 'Carpentry': 'Club', 'Bowcraft': 'Bow'}
OreType = (0x19B9, 0x19B8, 0x19BA, 0x19B7); ItemAnvilNeed = ('Viking Sword')
#Поиск всех тайлов, пригодных для добычи.
def FindResources():
TilesCache = []
global ResourceTiles
#Поиск деревьев.
for i in [3274, 3275, 3276, 3277, 3280, 3283, 3286, 3289, 3291, 3292, 3294, 3295, 3296, 3299, 3302, 3394, 3395, 3417, 3440, 3461, 4792, 4793, 4794, 4795]:
for t, x, y, z in GetStaticTilesArray(GetX(Self()) - 75, GetY(Self()) - 75, GetX(Self()) + 75, GetY(Self()) + 75, WorldNum(), i):
TilesCache.append((t, x, y, z, 'Logs'))
#Поиск тайлов, образующих пол шахты.
for i in range(1339, 1359):
for t, x, y, z in GetStaticTilesArray(GetX(Self()) - 75, GetY(Self()) - 75, GetX(Self()) + 75, GetY(Self()) + 75, WorldNum(), i):
TilesCache.append((t, x, y, z, 'Ingots'))
#Поиск кочек в лесу.
for i in [240, 241, 242, 243]:
for t, x, y, z in GetLandTilesArray(GetX(Self()) - 75, GetY(Self()) - 75, GetX(Self()) + 75, GetY(Self()) + 75, WorldNum(), i):
TilesCache.append((t, x, y, z, 'Ingots'))
#Добавление к уже найденым тайлам. Не дублирует.
ResourceTiles |= set(TilesCache)
#Разбивает маршрут на отрежки по 300 тайлов.
def FindRoute(x, y, prec):
#Словарь, содержащий все возможные ответы функции CacDir().
Direction = {'0': ('y'), '1': ('y', 'x'), '2': ('x'), '3': ('y', 'x'), '4': ('y'), '5': ('y', 'x'), '6': ('x'), '7': ('y', 'x'), '100': ()}
#Начало отсчета - позиция персонажа.
while not Connected():
pass
while Dist(GetX(Self()), GetY(Self()), x, y) > 50:
nx, ny = GetX(Self()), GetY(Self())
for i in range(199):
while not Connected():
pass
#Разность координат. Вычисляется заного, при каждом шаге.
dx, dy = (x - nx), (y - ny)
#Приращение по координатам, если в словаре есть соответствующая запись.
if 'y' in Direction[str(CalcDir(nx, ny, x, y))]:
ny += Sign(dy)
if 'x' in Direction[str(CalcDir(nx, ny, x, y))]:
nx += Sign(dx)
newMoveXY(nx, ny, 0, 50, 0)
newMoveXY(x, y, 0, prec, 0)
#Поиск ближайшего, указанного ресурса. В параметр можно закинуть 'any', тогда будет искать любой ближайший тайл, пригодный для добычи.
def FindNearestResource(Resource = 'all'):
Distance = 100500
#Перебор всех тайлов.
for t, x, y, z, r in ResourceTiles:
#Если ресурс указан.
if Resource in ('Logs', 'Ingots') and r == Resource and Dist(GetX(Self()), GetY(Self()), x, y) < Distance:
if not GetGlobal('stealth', str(x) + ',' + str(y)) or int(GetGlobal('stealth', str(x) + ',' + str(y))[:-4]) + 1200 <= time.time():
Distance, Tile = (Dist(GetX(Self()), GetY(Self()), x, y)), (t, x, y, r)
#Если указано 'any'.
elif Resource == 'any' and Dist(GetX(Self()), GetY(Self()), x, y) < Distance:
if not GetGlobal('stealth', str(x) + ',' + str(y)) or int(GetGlobal('stealth', str(x) + ',' + str(y))[:-4]) + 1200 <= time.time():
Distance, Tile = (Dist(GetX(Self()), GetY(Self()), x, y)), (t, x, y, r)
return Tile
#Поиск по типу и цвету в рюкзаке и руках персонажа. Вернёт суммарное кол-во найденного.
def myCount(Type, Color):
ItemCount = 0
#Поиск по слоям.
for layer in RhandLayer(), LhandLayer():
#Если в слое есть предмет и его тип == переданному в функцию, то...
if ObjAtLayer(layer) != 0 and GetType(ObjAtLayer(layer)) == Type:
#...если цвет, переданный в функцию == -1 (любой цвет), прибавляет к значению ItemCount + 1.
if Color < 0:
ItemCount += 1
#Или если цвет указан, и цвет предмета в слое == переданному в функцию, тоже прибавляет.
elif Color >= 0 and GetColor(ObjAtLayer(layer)) == Color:
ItemCount += 1
#Поиск в рюкзаке персонажа.
FindTypeEx(Type, Color, Backpack(), False)
return ItemCount + FindCount()
#Поиск по типу и цвету в рюкзаке и руках персонажа. Вернёт id найденного.
def myFindType(Type, Color):
#Всё тоже самое, что и в myCount(), только вместо прибавлений, сразу возвращает id найденного.
for layer in RhandLayer(), LhandLayer():
if ObjAtLayer(layer) != 0 and GetType(ObjAtLayer(layer)) == Type:
if Color < 0:
return ObjAtLayer(layer)
elif Color >= 0 and GetColor(ObjAtLayer(layer)) == Color:
return ObjAtLayer(layer)
return FindTypeEx(Type, Color, Backpack(), False)
#Рубилка-Копалка :Р. Самая обыная.
def GetResource(Tile = ()):
msg_t, msg_e = 'put|loosen some rocks|fail|destroyed', 'There is no|far away|mining|so close|line of sight|t use|appears immune|nothing|reach this|far away|lumberjacking|decide'
TileNum, x, y, Resource = Tile
SetGlobal('stealth', str(x) + ',' + str(y), str(time.time()))
while Dist(GetX(Self()), GetY(Self()), x, y) > 1:
FindRoute(x, y, 1)
FindResources()
Now, TryCount = dt.now(), 0
while InJournalBetweenTimes(msg_e, Now, dt.now()) < 0 and not Dead() and TryCount < 10 and myCount(ItemType[ItemTool[Resource]], ItemColor['Iron']['Color']) > 0 and Weight() < Str() * 3.5 -20:
TryCount += 1
if TargetPresent():
CancelTarget()
WaitTargetTile(TileNum, x, y, GetZ(Self()))
UseType(ItemType[ItemTool[Resource]], -1)
WaitJournalLine(dt.now(), msg_t + '|' + msg_e, 10000)
#Переплавка руды в слитки. Почему тут 5 типов я хз... Забыл...
def Smelt():
for i in OreType:
while Count(i) > 0:
WaitTargetType(i)
UseObject(ItemAnything['Forge']['Serial'])
Wait(100)
#Открывает банк и все остальные контейнеры.
def OpenContainers():
print('Иду к банку')
#Подход к банкиру.
FindRoute(ItemAnything['Bank']['X'], ItemAnything['Bank']['Y'], 1)
FindRoute(GetX(ItemAnything['Bank']['Serial']), GetY(ItemAnything['Bank']['Serial']), 1)
FindResources()
#Сказать bank. Повторение строк нужно, иначе может зависнуть.
UOSay('bank')
Wait(500)
while LastContainer() != ObjAtLayer(BankLayer()):
UOSay('bank')
Wait(500)
#Открывание всего остального с проверкой на открытие. Важно: если контер будет пуст, то LastContainer() не обновится.
for Container in (ToolsContainer, ResourcesContainer, ItemsContainer):
while LastContainer() != Container:
UseObject(Container)
Wait(500)
#Разгрузка всего в банк. Распихивает по контейнерам, указанных в ItemContainer.
def Unload():
print('Разгрузка')
for Item in ItemType:
while myCount(ItemType[Item], ItemColor['any']['Color']) > 0:
MoveItem(myFindType(ItemType[Item], ItemColor['any']['Color']), 0, ItemContainer[Item], 0, 0, 0)
Wait(MoveDelay)
#Дозагрузка. Добирает предметы в пак, по типу, цвету и кол-ву.
def Reload(Item = 'Tinker Tools', ColorName = 'Iron', CountNeed = 2):
if CountNeed > 0:
print('Беру из банка ' + str(CountNeed) + ' ' + Item + ' цвет ' + ColorName)
while CountEx(ItemType[Item], ItemColor[ColorName]['Color'], Backpack()) < CountNeed and CountEx(ItemType[Item], ItemColor[ColorName]['Color'], ItemContainer[Item]) > 0 and Weight() < Str() * 3.5 - 20:
MoveItem(FindTypeEx(ItemType[Item], ItemColor[ColorName]['Color'], ItemContainer[Item], False), CountNeed, Backpack(), 0, 0, 0)
Wait(MoveDelay)
#Крафт. Чтобы все корректно крафтилось, надо отключить повторение крафта при неудачной попытке.
def Craft(Item = 'Tinker Tools', CountNeed = 1):
print('Крафт ' + Item + ' количество ' + str(CountNeed))
msg = 'destroyed|fail|put'
#Подход к форже, если она нужна для крафта.
if Item in ItemAnvilNeed:
FindRoute(ItemAnything['Forge']['X'], ItemAnything['Forge']['Y'], 1)
FindRoute(GetX(ItemAnything['Forge']['Serial']), GetY(ItemAnything['Forge']['Serial']), 1)
ItemCount = Count(ItemType[Item])
#Будет крафтить пока есть инструмент, необходимое кол-во ресурсов и пока не скрафтит сколько нужно. Или если чар не подохнет...
while Count(ItemType[Item]) - ItemCount < CountNeed and ItemPrice[Item]['Logs'] <= Count(ItemType['Logs']) and ItemPrice[Item]['Ingots'] <= Count(ItemType['Ingots']) and myCount(ItemType[ItemTool[Item]], ItemColor['any']['Color']) > 0 and Weight() < Str() * 3.5 - 20:
GumpsCount = GetGumpsCount()
#Если стелс ждет ловушку на таргет, отменяет её.
if TargetPresent():
CancelTarget()
#Ставит ловушку на таргет и использует инструмент.
WaitTargetType(ItemType[ItemMaterial[Item]])
UseType(ItemType[ItemTool[Item]], ItemColor['any']['Color'])
#Будет ждать, пока не появится новый гамп, или если нет коннекта к серверу.
Now = time.time()
while not Connected():
pass
while GumpsCount == GetGumpsCount() and Now + 10 >= time.time():
pass
#Обработка гампа. Вбивается кол-во предметов (1), жмутся кнопки категории и выбора.
NumGumpTextEntry(GetGumpsCount() - 1, 1, '1')
NumGumpButton(GetGumpsCount() - 1, ItemGumpButtons[Item]['Category'])
Wait(500)
NumGumpButton(GetGumpsCount() - 1, ItemGumpButtons[Item]['Choice'])
#Ждет 15 секунд, или появление в журнале сообщений о том, что крафт удался\не удался.
WaitJournalLine(dt.now(), msg, 15000)
#Если предмет есть в ItemVendor(), пойжет и продаст все =).
if Item in ItemVendor and Count(ItemType[Item]) > 0:
SellItem(Item)
#Продажа.
def SellItem(Item = 'Bow'):
print('Продажа ' + Item)
#Подход к вендору.
FindRoute(ItemVendor[Item]['X'], ItemVendor[Item]['Y'], 1)
FindRoute(GetX(ItemVendor[Item]['Serial']), GetY(ItemVendor[Item]['Serial']), 1)
#Настройка всякой шляпы...
SetAutoSellDelay(int(Count(ItemType[Item]) // 2.5))
AutoSell(ItemType[Item], ItemColor['any']['Color'], Count(ItemType[Item]))
#Скажет имя вендора и sell.
UOSay(ItemVendor[Item]['Name'] + ' sell')
Now = time.time()
#Будет ждать, пока не продаст, или не пройдёт одна минута. Кол-во стопок предметов при таком раскладе не должно превышать 179.
#Во время ожидания будет ползать за вендором.
while Count(ItemType[Item]) > 0 and Now + 60 >= time.time():
while GetDistance(ItemVendor[Item]['Serial']) > 1:
FindRoute(GetX(ItemVendor[Item]['Serial']), GetY(ItemVendor[Item]['Serial']), 1)
pass
#Мозги. Решают, что делать дальше.
def Check():
global Stack
#Подход к банку, открывание контейнеров, разгрузка.
OpenContainers()
Unload()
Wantage = False
#Первыми в стек попадают указания крафтить инструменты и добывать ресурсы. Приоритет у тинкер тулз, кирок и топоров.
#После них идет добыча ресурсов, а потом все остальные инструменты.
for Item in ('Saw', 'Smith Hammer', 'Bowcraft Dagger', 'Logs', 'Ingots', 'Hatchet', 'Pickaxe', 'Tinker Tools'):
if CountEx(ItemType[Item], ItemColor['Iron']['Color'], ItemContainer[Item]) < ItemStore[Item]:
#Запоминание, что чего-то не хватает.
Wantage = True
if Item not in ('Logs', 'Ingots') and CountEx(ItemType['Logs'], ItemColor['Standart']['Color'], ItemContainer['Logs']) >= ItemPrice[Item]['Logs'] and CountEx(ItemType['Ingots'], ItemColor['Iron']['Color'], ItemContainer['Ingots']) >= ItemPrice[Item]['Ingots']:
Stack += [{'Craft': Item, 'Count': ItemStore[Item] - CountEx(ItemType[Item], ItemColor['any']['Color'], ItemContainer[Item]), 'Color': 'Iron'}]
elif Item in ('Logs', 'Ingots') and CountEx(ItemType[ItemTool[Item]], ItemColor['any']['Color'], ItemContainer[ItemTool[Item]]) > 0:
Stack += [{'GetResource': Item, 'Count': ItemStore[Item] - CountEx(ItemType[Item], ItemColor['Iron']['Color'], ItemContainer[Item])}]
#Если всего хватает, то в стек попадают указания крафтить что-либо.
#Тут идет проверка на цвет, значения скилла и прочая шляпа.
if not Wantage:
for Color in ItemColor:
if Color != 'any':
Skill = random.choice(ItemColorSkill[Color]['Skill'])
if Color in ColorCanUse and GetSkillValue(Skill) >= ItemColorSkill[Color]['Need'] and CountEx(ItemType[ItemColor[Color]['Material']], ItemColor[Color]['Color'], ItemContainer[ItemColor[Color]['Material']]) >= ItemStore[ItemColor[Color]['Material']]:
Stack += [{'Craft': ItemSkill[Skill], 'Color': Color, 'Count': int((Str() * 3.5 - Weight() - 20) // 30)}]
#Последними в стэк попадают указания к продаже предметов. Попадают только если в банке их больше 20.
#При крафте предметы сразу продаются, а если попытка была неудачной, разгрузит в банк.
for Item in ItemVendor:
if Item in ItemType and CountEx(ItemType[Item], ItemColor['any']['Color'], ItemContainer[Item]) > 20:
Stack += [{'Sell': Item, 'Count': CountEx(ItemType[Item], ItemColor['any']['Color'], ItemContainer[Item])}]
#Подсчет обычных ресурсов в рюкзаке персонажа.
def ResourceCount(Item = 'Ingots'):
ItemCount = 0
if Item == 'Ingots':
for Ore in OreType:
ItemCount += CountEx(Ore, ItemColor['Iron']['Color'], Backpack())
return ItemCount
return CountEx(ItemType[Item], ItemColor['Standart']['Color'], Backpack())
#Всякая шляпа.
ResourceTiles = set(); SetMoveOpenDoor(True); Stack = []; FindResources(); StackCache = []
#Тело =). Делает то, что решат мозги =).
while True:
#Если персонаж мёртвый - встать в гейт оф лайф.
if Dead():
for x, y in (ItemAnything['Gate of Life']['X'], ItemAnything['Gate of Life']['Y']), (GetX(ItemAnything['Gate of Life']['Serial']), GetY(ItemAnything['Gate of Life']['Serial'])):
FindRoute(x, y, 0)
Wait(1000)
else:
#Check() заводится только если стек пустой. Подход к банку и разгрузка выполняются перед началом любого действия.
if Stack == []:
Check()
else:
StackCache = Stack.pop()
OpenContainers()
Unload()
#Если в стеке было указание добывать ресурсы.
if 'GetResource' in StackCache:
#Добор инструмента.
for Resource in ('Logs', 'Ingots'):
Reload(ItemTool[Resource], 'Iron', 2)
print('Добыча ' + StackCache['GetResource'])
#Добывать указанный в стеке ресурс, пока персонаж не наберёт максимальный вес, не закончатся инструменты, пока персонаж не умрет.
while Weight() < Str() * 3.5 - 20 and myCount(ItemType[ItemTool[StackCache['GetResource']]], ItemColor['Iron']['Color']) > 0 and not Dead():
if ResourceCount(StackCache['GetResource']) < StackCache['Count']:
GetResource(FindNearestResource(StackCache['GetResource']))
else:
GetResource(FindNearestResource('any'))
#Если в рюкзаке персонажа есть руда, подход к форже, переплавка.
if ResourceCount('Ingots'):
while Dist(GetX(Self()), GetY(Self()), ItemAnything['Forge']['X'], ItemAnything['Forge']['Y']) > 10:
FindRoute(ItemAnything['Forge']['X'], ItemAnything['Forge']['Y'], 1)
FindRoute(GetX(ItemAnything['Forge']['Serial']), GetY(ItemAnything['Forge']['Serial']), 1)
Smelt()
#Если в стеке было указание крафтить.
elif 'Craft' in StackCache:
#Добор инструмента.
Reload(ItemTool[StackCache['Craft']], 'Iron', 3)
#Загрузка ресурсов в кол-ве ItemPrice[предмет][ресурс] * кол-во предметов, которое необходимо скрафтить.
for Resource in ('Logs', 'Ingots'):
Reload(Resource, StackCache['Color'], ItemPrice[StackCache['Craft']][Resource] * StackCache['Count'])
Craft(StackCache['Craft'], StackCache['Count'])
#Если в стеке было указание продавать.
elif 'Sell' in StackCache:
#Загрузка предметов из банка. Продажа.
Reload(StackCache['Sell'], 'any', StackCache['Count'])
SellItem(StackCache['Sell'])
#Кол-во строк сокращено в ущерб читаемости кода (кроме комментов).
Ещё раз напишу, что полностью не тестировался, вроде копает\рубит\крафтит\продает.
Если будут какие-нибудь глюки, то надо написать сюда, максимально подробно о проблемме.