Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Не заводится.

тут можно задать вопрос по скриптингу
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: Не заводится.

Post by CFA »

nah nah wrote:Что значит такая вот ошибка?
TypeError: unhashable type: 'dict'
В python'е есть mutable и immutable типы данных. Ключом (в dict'е или set'е или еще где нибудь) могут быть только immutable.
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Спасибо. Нашёл в чем проблемма print'ом. У меня есть привычка переписывать функции на новый лад, а пребросить параметры в вызове этих функций, я зыбываю.
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Ещё вопрос, надеюсь я не надоел :oops:
Что будет, если в newMoveXY забросить координаты с большим удалением от чара, чем рекомендовано(300 кажется :?:).
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: Не заводится.

Post by CFA »

Вернет False и никуда не пойдет. Ну и вообще во всех случаях когда не удается достичь указной точки вернет False. True вернет если дошел куда надо.
300 это не рекомендованное расстояние, а максимальное, если оно будет хоть на 1 тайл дальше, стелс и не подумает искать путь. Ну и 300 тайлов - это не общая длинна пути (она может быть до 1000 тайлов) а максимальное расстояние между исходной и конечной точками по x или y.
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Значит попробую придумать какую-нить разбивалку пути. Если у чара скилл мининг 25.5, GetSkillValue вернёт 255 или 25.5?
И вот на такую штуку

Code: Select all

for i in range(10):
  SetGlobal('stelth', str(i) + ',' + str(i), str(time.time()))
  Wait(1000)
for i in range(10):
  print(GetGlobal('stelth', str(i) + ',' + str(i)))
print(GetGlobal('stelth', str(11) + ',' + str(11)))
Выдает пустые строки. Где я ошибся? :oops:
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: Не заводится.

Post by CFA »

тут
nah nah wrote: SetGlobal('stelth', str(i) + ',' + str(i), str(time.time()))
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Бывает... Ещё раз спасибо
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Иногда вот такая штука, начинает глючить.

Code: Select all

while GetDistance(Banker) > 1:
  newMoveXY(GetX(Banker), GetY(Banker), 0, 1, 1)
UOSay('bank')
Как результат, чар скажет банк, находясь далеко от банкира. Наверное что-то с определение координат банкира. Иногда работает, когда банкир близко.

Проверил. GetX и GetY возвращают 0. Может специфика шарда?
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Code: Select all

def SignIt(val):
  if val < 0:
    return -1
  elif val > 0:
    return 1
  elif val == 0:
    return 0

#Разбивает путь на отрезки по 300 каждый, подход до 50 тайлов, а то мало ли точка в реке окажется...
def FindDir(x, y):
  nx = GetX(Self())
  ny = GetY(Self())
  while Dist(GetX(Self()), GetY(Self()), x, y) > 300:
    for i in range(300):
      dx = nx - x
      dy = ny - y      
      if CalcDir(GetX(Self()), GetY(Self()), x, y) == 0:
        ny += SingIt(dy)
      elif CalcDir(GetX(Self()), GetY(Self()), x, y) == 1:
        nx += SignIt(dx)
        ny += SignIt(dy)
      elif CalcDir(GetX(Self()), GetY(Self()), x, y) == 2:
        nx += SignIt(dx)
      elif CalcDir(GetX(Self()), GetY(Self()), x, y) == 3:
        nx += SignIt(dx)
        ny += SignIt(dy)
      elif CalcDir(GetX(Self()), GetY(Self()), x, y) == 4:
        ny += SingIt(dy)
      elif CalcDir(GetX(Self()), GetY(Self()), x, y) == 5:
        nx += SignIt(dx)
        ny += SignIt(dy)
      elif CalcDir(GetX(Self()), GetY(Self()), x, y) == 6:
        nx += SignIt(dx)
      elif CalcDir(GetX(Self()), GetY(Self()), x, y) == 7:
        nx += SignIt(dx)
        ny += SignIt(dy)
    print(nx,ny)
    newMoveXY(nx, ny, 0, 50, 1)
  newMoveXY(x, y, 0, 1, 1)
NameError: global name 'SingIt' is not defined это для FindDir()
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

Re: Не заводится.

Post by Alex »

SignIt vs SingIt, петь стелс еще не умеет :)
Новый стелс лежит тут. Стелс это произведение искусства! :)
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

Итак... Вот оно чудо, из-за которого я так вам надоедал.

Code: Select all

from datetime import datetime as dt
import time
import random

#ID контейнера с ресурсам, инструментами и того, куда будет сбрасывать вещички, которые не удалось продать, а так же ID банкира и форжи.
ResourcesContainer = 0x4003951F; ItemsContainer = 0x40069428; ToolsContainer = 0x40039778; Forge = 0x40005E0C
#Цвета, из которых можно крафтить. Остальное накопанное будет накапливаться. Задержка на перемещение предметов.
ColorCanUse = ('Iron', 'Standart'); MoveDelay = 1100

#Кнопки в гампе, кол-во ресурсов, куда складывать, типы цвета, имена и прочее.
ItemToolType = {'Tinker Tools': {'Name': 'Tinker Tools', 'Type': 0x1EBC}, 'Hatchet': {'Name': 'Tinker Tools', 'Type': 0x1EBC}, 'Pickaxe': {'Name': 'Tinker Tools', 'Type': 0x1EBC}, 'Logs': {'Name': 'Hatchet', 'Type': 0x0F43}, 'Ingots': {'Name': 'Pickaxe', 'Type': 0x0E85}, 'Saw': {'Name': 'Tinker Tools', 'Type': 0x1EBC}, 'Smith Hammer': {'Name': 'Tinker Tools', 'Type': 0x1EBC}, 'Bowcraft Dagger': {'Name': 'Tinker Tools', 'Type': 0x1EBC}, 'Viking Sword': {'Name': 'Smith Hammer', 'Type': 0x13E3}, 'Club': {'Name': 'Saw', 'Type': 0x1034}, 'Bow': {'Name': 'Bowcraft Dagger', 'Type': 0x0F51}} 
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())}
ItemVendor = {'Viking Sword': {'Name': 'Weaponsmith', 'Serial': 0x000880D3, 'X': 480, 'Y': 852}, 'Club': {'Name': 'Carpenter', 'Serial': 0x00086271, 'X': 564, 'Y': 1013}, 'Bow': {'Name': 'Bowyer', 'Serial': 0x00086292, 'X': 567, 'Y': 970}, 'Gold': {'Name': 'Banker', 'Serial': 0x00086286, 'X': 554, 'Y': 992}, 'Forge': {'X': 522, 'Y': 994}}
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}
ItemColor = {'Ingots': {'Iron': 0x0000, 'Copper': 0x0AB2, 'Bronze': 0x0488, 'Steel': 0x042C, 'Black Steel': 0x0AA3}, 'Logs': {'Standart': 0x0000, 'Willow': 0x08F1, 'Cedar': 0x08A5, 'Walnut': 0x02F4, 'Oak': 0x0000}, 'any': -1}
ItemMaterialType = {'Tinker Tools': 0x1BEF, 'Hatchet': 0x1BEF, 'Pickaxe': 0x1BEF, 'Saw': 0x1BEF, 'Smith Hammer': 0x1BEF, 'Bowcraft Dagger': 0x1BEF, 'Viking Sword': 0x1BEF, 'Club': 0x1BDD, 'Bow': 0x1BDD}
ItemColorSkill = {'Iron': 20, 'Copper': 50, 'Bronze': 70, 'Steel': 90, 'Black Steel': 110, 'Standart': 20, 'Willow': 50, 'Cedar': 70, 'Walnut': 90, 'Oak': 110}
ItemStore = {'Tinker Tools': 2, 'Hatchet': 7, 'Pickaxe': 7, 'Logs': 1000, 'Ingots': 1000, 'Saw': 4, 'Smith Hammer': 4, 'Bowcraft Dagger': 4}
ItemSkill = {'Blacksmithing': 'Viking Sword','Carpentry': 'Club','Bowcraft': 'Bow'}
ItemAnvilNeed = {'Viking Sword': 1}

ResourceTiles = set(); Stack = []

#Заполняет ResourceTiles тайлами, с которых рубится и копается (номер, х, у, z, ресурс).
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()) - 50, GetY(Self()) - 50, GetX(Self()) + 50, GetY(Self()) + 50, WorldNum(), i):
      TilesCache.append((t, x, y, z, 'Logs'))
  for i in range(1339, 1359):
    for t, x, y, z in GetStaticTilesArray(GetX(Self()) - 50, GetY(Self()) - 50, GetX(Self()) + 50, GetY(Self()) + 50, 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()) - 50, GetY(Self()) - 50, GetX(Self()) + 50, GetY(Self()) + 50, WorldNum(), i):
      TilesCache.append((t, x, y, z, 'Ingots'))
  ResourceTiles |= set(TilesCache)

#Возвращает 1, если число положительное, 0, если == 0, -1, если отрицательное.
def SignIt(val):
  if val < 0:
    return -1
  elif val > 0:
    return 1
  elif val == 0:
    return 0

#Разбивает путь на отрезки по 300 каждый, подход до 50 тайлов, а то мало ли точка в реке окажется...
def FindDir(x, y):
  nx = GetX(Self())
  ny = GetY(Self())
  while Dist(nx, ny, x, y) > 300:
    for i in range(300):
      dx = nx - x
      dy = ny - y      
      if CalcDir(nx, ny, x, y) == 0:
        ny += SignIt(dy)
      elif CalcDir(nx, ny, x, y) == 1:
        nx += SignIt(dx)
        ny += SignIt(dy)
      elif CalcDir(nx, ny, x, y) == 2:
        nx += SignIt(dx)
      elif CalcDir(nx, ny, x, y) == 3:
        nx += SignIt(dx)
        ny += SignIt(dy)
      elif CalcDir(nx, ny, x, y) == 4:
        ny += SingIt(dy)
      elif CalcDir(nx, ny, x, y) == 5:
        nx += SignIt(dx)
        ny += SignIt(dy)
      elif CalcDir(nx, ny, x, y) == 6:
        nx += SignIt(dx)
      elif CalcDir(nx, ny, x, y) == 7:
        nx += SignIt(dx)
        ny += SignIt(dy)
    newMoveXY(nx, ny, 0, 50, 0)
  newMoveXY(x, y, 0, 1, 0)
   

#Находит близжайший к чару тайл. В параметре указывается имя ресурса ('Logs', 'Ingots', 'all'(не используется, но работает)).
#Елси тайл был вырублен\выкопан менее чем 20 мин назад, пропустит.    
def FindNearestResource(Resource = 'all'):
  Distance = 100500
  for t, x, y, z, r in ResourceTiles:
    if Resource in ('Logs', 'Ingots') 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)
    elif 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

#Рубилка-копалка =). Рубит\копает до полного истощения тайла или 10 раз.
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'
  t, x, y, r = Tile
  SetGlobal('stealth', str(x) + ',' + str(y), str(time.time()))
  while Dist(GetX(Self()), GetY(Self()), x, y) > 1:
    FindDir(x, y)
  FindResources()
  Now = dt.now()
  TryCount = 0
  while InJournalBetweenTimes(msg_e, Now, dt.now()) < 0 and not Dead() and TryCount < 10 and Count(ItemToolType[r]['Type']) > 0:
    TryCount += 1
    if TargetPresent():
      CancelTarget()
    WaitTargetTile(t, x, y, GetZ(Self()))
    UseType(ItemToolType[r]['Type'], -1)
    WaitJournalLine(dt.now(), msg_t + '|' + msg_e, 15000)

#Переплавляет руду и мечи в слитки.
def Smelt():
  for i in [0x19B9, 0x19B8, 0x19BA, 0x19B7, 0x13B9]:
    while Count(i) > 0:
      WaitTargetType(i)
      UseObject(Forge)
      Wait(300)

#Подходит к банку и открывает все контейнеры. Контейнеры не должны буть пустыми. Баг?
def OpenContainers():
  while Dist(GetX(Self()), GetY(Self()), ItemVendor['Gold']['X'], ItemVendor['Gold']['Y']) > 10:
    FindDir(ItemVendor['Gold']['X'], ItemVendor['Gold']['Y'])
  while GetDistance(ItemVendor['Gold']['Serial']) > 1:
    FindDir(GetX(ItemVendor['Gold']['Serial']), GetY(ItemVendor['Gold']['Serial']))
  UOSay('bank')
  Wait(500)
  while LastContainer() != ObjAtLayer(BankLayer()):
    UOSay('bank')
    Wait(500)
  for i in (ToolsContainer, ResourcesContainer, ItemsContainer):
    while LastContainer() != i:
      UseObject(i)
      Wait(500)

#Полностью разгружает чара в банк. Расбрасывает по контейнерам.
def Unload():
  for i in (RhandLayer(), LhandLayer()):
    if i > 0:
      unequip(i)
      Wait(MoveDelay)
  for Item in ItemType:
    while Count(ItemType[Item]):
      MoveItems(Backpack(), ItemType[Item], -1, ItemContainer[Item], 0, 0, 0, MoveDelay)

#Перемещает предметы из банка в пак. Параметры (имя предмета, имя цвета, кол-во)
def Reload(Item = 'Tinker Tools', ColorNeed = 'Iron', CountNeed = 2):
  #Этот гемор нужен, чтобы не добавлять новый список {цвет: материал}.
  if ColorNeed != 'any':
    for Material in ('Logs', 'Ingots'):
      for ColorName in ItemColor[Material]:
        if ColorNeed == ColorName:
          Color = ItemColor[Material][ColorName]
  else:
    Color = -1
  while CountEx(ItemType[Item], Color, Backpack()) < CountNeed and CountEx(ItemType[Item], Color, ItemContainer[Item]) != 0 and Weight() < Str() * 3.5 - 50:
    MoveItem(FindTypeEx(ItemType[Item], Color, ItemContainer[Item], False), CountNeed, Backpack(), 0, 0, 0)
    Wait(MoveDelay)

#Крафтит. Параметры (имя предмета, имя цвета, кол-во).
def Craft(Item = 'Tinker Tools', ItemCount = 1):
  msg = 'destroyed'
  #Подход к наковальне, если она нужна для крафта.
  if Item in ItemAnvilNeed:
    while Dist(GetX(Self()), GetY(Self()), ItemVendor['Forge']['X'], ItemVendor['Forge']['Y']) > 10:
      FindDir(ItemVendor['Forge']['X'], ItemVendor['Forge']['Y'])
    while GetDistance(Forge) > 1:
      FindDir(GetX(Forge), GetY(Forge))
  GumpsCount = GetGumpsCount()
  ItemsCount = Count(ItemType[Item])
  WaitTargetType(ItemMaterialType[Item])
  UseType(ItemToolType[Item]['Type'], -1)
  Now = dt.now()
  while GumpsCount == GetGumpsCount():
    pass
  NumGumpTextEntry(GetGumpsCount() - 1, 1, str(ItemCount))
  NumGumpButton(GetGumpsCount() - 1, ItemGumpButtons[Item]['Category'])
  Wait(2000)
  NumGumpButton(GetGumpsCount() - 1, ItemGumpButtons[Item]['Choice'])
  while InJournalBetweenTimes('destroyed', Now, dt.now()) < 0 and ItemsCount + ItemCount > Count(ItemType[Item]) and Count(ItemType['Logs']) >= ItemPrice[Item]['Logs'] and Count(ItemType['Ingots']) >= ItemPrice[Item]['Ingots'] and Count(ItemToolType[Item]['Type']) > 0 and not Dead():
    pass
  #Переплавка обратно в слитка (если нужна наковальня для крафта...)
  while Item in ItemAnvilNeed and Count(ItemType[Item]) > 0 and not Dead():
    Smelt()
  if Count(ItemType[Item]) and Item in ItemVendor:
    SellItems(Item)

#Продаёт предметы вендорам. Параметр всего один - имя предмета.
def SellItems(Item = 'Bow'):
  print('SellItems')
  while Dist(GetX(Self()), GetY(Self()), ItemVendor[Item]['X'], ItemVendor[Item]['Y']) > 10:
    FindDir(ItemVendor[Item]['X'], ItemVendor[Item]['Y'])
  while GetDistance(ItemVendor[Item]['Serial']) > 1:
    FindDir(GetX(ItemVendor[Item]['Serial']), GetY(ItemVendor[Item]['Serial']))
  SetAutoSellDelay(Count(ItemType[Item]) // 2)
  AutoSell(ItemType[Item], -1, Count(ItemType[Item]))
  UOSay(ItemVendor[Item]['Name'] + ' sell')
  Now = time.time()
  while Count(ItemType[Item]) > 0 and Now + 60 >= time.time():
    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['Ingots']['Iron'], ItemContainer[Item]) < ItemStore[Item]:
      Wantage = True
      if Item not in ('Logs', 'Ingots') and CountEx(ItemType['Logs'], ItemColor['Logs']['Standart'], ItemContainer['Logs']) >= ItemPrice[Item]['Logs'] and CountEx(ItemType['Ingots'], ItemColor['Ingots']['Iron'], ItemContainer['Ingots']) >= ItemPrice[Item]['Ingots']:
        Stack += [{'Craft': Item, 'Count' : ItemStore[Item] - CountEx(ItemType[Item], -1, ItemContainer[Item]), 'Color': 'Iron'}]
      else:
        Stack += [{'GetResource': Item, 'Count': ItemStore[Item] - CountEx(ItemType[Item], ItemColor['Ingots']['Iron'], ItemContainer[Item])}]
  #Если инструментов и ремурсов в банке достаточно - крафт.
  if not Wantage:
    for Material in ('Logs', 'Ingots'):
      for ColorName in ItemColor[Material]:
        if ColorName in ColorCanUse and CountEx(ItemType[Material], ItemColor[Material][ColorName], ItemContainer[Material]) >= Str() * 3.5 - 10:
          if Material == 'Logs':
            Skill = random.choice(['Carpentry', 'Bowcraft'])
          else:
            Skill = 'Blacksmithing'
          if GetSkillValue(Skill) >= ItemColorSkill[ColorName]:
            Stack += [{'Craft': ItemSkill[Skill], 'Count': int(((Str() * 3.5 - 50) // 30)), 'Color': ColorName}]
  #Подсчёт продукции.
  for Item in ('Bow', 'Viking Sword', 'Club'):
    if CountEx(ItemType[Item], -1, ItemContainer[Item]) > 20:
      Stack += [{'Sell': Item, 'Count': CountEx(ItemType[Item], -1, ItemContainer[Item])}]

#Всякая шляпа.
SetMoveOpenDoor(True)
FindResources()
StackCache = []
while Dist(GetX(Self()), GetY(Self()), ItemVendor['Forge']['X'], ItemVendor['Forge']['Y']) > 10:
  FindDir(ItemVendor['Forge']['X'], ItemVendor['Forge']['Y'])
while GetDistance(Forge) > 1:
  FindDir(GetX(Forge), GetY(Forge))
Smelt()    

#Принцип работы скрипта - делать то, что записано в стеке.
while True:
  #Процедура Check() заносит в стек указания к следующим действиям, запускается только если стэк пуст.
  if Stack == []:
    Check()
  else:
    StackCache = Stack.pop()
  #Перед каждым действием выполняется полная разгрузка в банк. Зато строк меньше =).
  OpenContainers()
  Unload()
  #Если в стеке указание добывать ресурсы, то доберёт и пойдёт рубить\копать. В функцию поиска близжайшего к чару тайла с ресурсом можно закинуть 'all',
  #и тогда она будет искать все ресурсы, что она и делает, елси требуемое количество требуемого ресурса уже добыто. Остальное тут: запуск Craft(), Sell() и ресалка.
  if 'GetResource' in StackCache:
    Reload(Item = ItemToolType['Logs']['Name'])
    Reload(Item = ItemToolType['Ingots']['Name'])
    while Weight() < Str() * 3.5 - 50 and Count(ItemToolType[StackCache['GetResource']]['Type']) > 0 and not Dead():
      if CountEx(ItemType[StackCache['GetResource']], ItemColor['Ingots']['Iron'], Backpack()) <= StackCache['Count']:
        GetResource(FindNearestResource(StackCache['GetResource']))
      else:
        GetResource(FindNearestResource('all'))
    while Dist(GetX(Self()), GetY(Self()), ItemVendor['Forge']['X'], ItemVendor['Forge']['Y']) > 10:
      FindDir(ItemVendor['Forge']['X'], ItemVendor['Forge']['Y'])
    while GetDistance(Forge) > 1:
      FindDir(GetX(Forge), GetY(Forge))
    Smelt()        
  elif 'Craft' in StackCache:
    Reload(ItemToolType[StackCache['Craft']]['Name'], 'Iron', 2)
    for i in ('Logs', 'Ingots'):
      Reload(i, StackCache['Color'], ItemPrice[StackCache['Craft']][i] * StackCache['Count'])
    Craft(StackCache['Craft'], StackCache['Count'])
  elif 'Sell' in StackCache:
    Reload(StackCache['Sell'], 'any', StackCache['Count'])
    SellItems(StackCache['Sell'])
  if Dead():
    Wait(10 * 60 * 1000)
  while Dead():
    FindDir(GetX(id_GateOfLife), GetY(id_GateOfLife))
Скажите что лучше чеклаг или вэйтконекшен? Куда их воткнуть? А если подскажете, как сократить кол-во строк не в ущерб полезности, я от вас навсегда отстану =) 'Tinker Tools', 'Type' 0x1BEF, 'Club', Color, Backpack()) )
while InJournalBetweenTimes('destroyed', Now, dt, ItemContainer'Y'
Last edited by nah nah on 27.12.2011 6:43, edited 2 times in total.
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Не заводится.

Post by nah nah »

А CountEx считает то, что в слое, если указать на чара?
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: Не заводится.

Post by CFA »

GetX, GetY вернут 0, если "Banker" находится далеко и стелс его "не видит", и GetDistance(Banker) в таком случае вернет -1. Таким образом цикл

Code: Select all

while GetDistance(Banker) > 1:
  newMoveXY(GetX(Banker), GetY(Banker), 0, 1, 1)
не выполнится вообще ни разу, и чар никуда не ходя скажет "bank"
А CountEx считает то, что в слое, если указать на чара?
Должен.

чеклаг и вейтконнекшн это разные вещи.
Чеклаг надо выткать там, где нужно следующее действие выполнить после того как сработает предыдущие. Например после открытия конта, юза инструмента и тп.
После того как отработал вейтконнешн, можно считать что чар гарантированно онлайн.
И не стоит гнаться за меньшим количеством строк. Читаемость и понятность важнее.
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Re: Не заводится.

Post by MuDaCk »

Code: Select all

while GetDistance(Banker) > 1:
  newMoveXY(GetX(Banker), GetY(Banker), 0, 1, 1)
Почему не

Code: Select all

while GetDistance(Banker) > 1 do
  newMoveXY(GetX(Banker), GetY(Banker), true, 1, true);
?
My name is Игорёшка Image
Пишу скрипты за едуImage
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Не заводится.

Post by Vizit0r »

потому что это питон)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply