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 »

1) если в функции изменяется глобальная переменная, то ее надо в начале функции объявить как global (впрочем это надо не для всех типов)

Code: Select all

def FindResources():
  global Resource
  Cache = []
2) Resources += i - если ты хочешь добавить i в список, то это делается так - Resources.append(i) или Resource +=
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

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

Post by CFA »

И еще, если сделать так

Code: Select all

Resources = set()
то это (тем более тут есть ошибка) -

Code: Select all

  for i in Cache:
    for j in Resources:
      if i == j:
        Match = 1
        break
    if not Match:
      Resources += i
можно заменить на

Code: Select all

Resources |= set(Cache)
Правда тогда элементы в Resources будет не в том порядке, в каком были добавлены, а в совершенно неожиданном)
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

Resources = set(); t_Hatchet = 0x0F43; t_Pickaxe = 0x0E85; id_LogsContainer = 1; id_IngotsContainer = 1; id_ToolsContainer = 1

def FindResources():
  Cache = []
  Match = 0
  global Resources
  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):
      Cache.append((t, x, y, z, 'Tree'))
  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):
      Cache.append((t, x, y, z, 'Rock'))
  Resources |= set(Cache)

def FindDistanceToResource(x, y):
  if abs(GetX(Self()) - x) < abs(GetY(Self()) - y):
    return abs(GetX(Self()) - x)
  else:
    return abs(GetY(Self()) - y)

def FindTheNearestPoint(res = 'all'):
  i = 100500
  Point = []
  global Resources
  for t, x, y, z, rt in Resources:
    if FindDistanceToResource(x, y) < i:
      i = FindDistanceToResource(x, y)
      if not GetGlobal('stelth', str(x) + ',' + str(y)) or int(GetGlobal('stelth', str(x) + ',' + str(y))) + 600 <= time.time():
        if res == 'all':
          Point = (t, x, y, rt)
        elif res == 'Tree' == rt:
          Point = (t, x, y, rt)
        elif res == 'Rock' == rt:
          Point = (t, x, y, rt)
  return Point

def GetResources(Point = ()):
  msg_t, msg_e = 'put|loosen some rocks|fail', 'There is no|far away|mining|so close|line of sight|t use|appears immune|nothing|reach this|far away'
  t, x, y, rt = Point
  SetGlobal('stelth', str(x) + ',' + str(y), str(time.time()))
  while GetX(Self()) not in range(x - 1, x + 2) or GetY(Self()) not in range(y - 1, y + 2):
    newMoveXY(x, y, 0, 1, 1)
  Now = dt.now()
  while InJournalBetweenTimes(msg_e, Now, dt.now()) < 0:
    if TargetPresent():
      CancelTarget()
    if WarMode():
      SetWarMode(0)
    WaitTargetTile(t, x, y, GetZ(Self()))
    if rt == 'Tree':
      UseType(t_Hatchet, -1)
    elif rt == 'Rock':
      UseType(t_Pickaxe, -1)
    WaitJournalLine(dt.now(), msg_t + '|' + msg_e, 15000)

FindResources()
print(Resources)
print(FindTheNearestPoint(res = 'Rock'))
Есть ли более изящные решения?
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 »

nah nah wrote:И ещё вопрос, можно ли как-то изменить кодировку юникода, которая используется по умолчанию?
Для того, чтобы стелс+питон понимал кириллицу, нужно чтобы 1ая или 2ая строка в файле со скриптом была такая

Code: Select all

# -*- coding: mbcs -*-
Это бы прилепить куда-нибудь на видное место на форуме.
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

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

Post by Alex »

добавил в вики-статью :)
Новый стелс лежит тут. Стелс это произведение искусства! :)
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

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

Post by nah nah »

Опять я со своими проблеммами :oops:
Хочу, чтобы в список заносился вот такой список:

Code: Select all

Stack += {'Craft': {'Item': i, 'Count': Count - FindCount()}}
Ошибок не вызывает, но AddToSystemJournal(str(Stack)) возвращает только

Code: Select all

05:06:18:668 [Charname]: Craft
Не подскажите, где я ошибся?
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

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

Post by CFA »

Надо так
Stack += [{'Craft': {'Item': i, 'Count': Count - FindCount()}}] или .append({'Craft': {'Item': i, 'Count': Count - FindCount()}}) (это если Stack list, и вообще то, что ты хочешь добавить не list и dict)
И вместо AddToSystemJournal можно пользоваться print'ом - не надо делать преобразование типов и можно сразу печатать несколько значений
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 »

А moveOpenDoor() перенесена на питон?
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

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

Post by Alex »

да, только иначе выглядит: SetMoveOpenDoor(True)
Новый стелс лежит тут. Стелс это произведение искусства! :)
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

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

Post by nah nah »

Это бы в вики... :roll:

Теперь вот какая шляпа.
Есть вот такое чудо

Code: Select all

def Reload(ToolType = 0x1EBC, Count = 2, Container = id_ToolsContainer):
  while Count(ToolType) < Count and FindType(ToolType, Container) != 0:
    MoveItem(FindType(ToolType, Container), Count, Backpack())
    Wait(MoveDelay)
строка с while выдает ошибку

Code: Select all

01:37:21:306 [Charname]:   File "D:\Games\UO\Stealth\Scripts\Crafter Bot Yew UORPG.py", line 126, in Reload
TypeError: 'int' object is not callable
Через принт посмотрел, что параметны заданы правельно (разве что не в hex'е)
Проблемма именно в Count(ToolType) < Count , я её просто не понимаю
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

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

Post by Alex »

изначально Count - это функция стелса, но ты в def`е захватываеш это имя для свой переменной и в строке с while - Count - это уже интегер, а вызывать интегер как функцию нельзя =)
Новый стелс лежит тут. Стелс это произведение искусства! :)
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 »

Что значит такая вот ошибка?
TypeError: unhashable type: 'dict'
Post Reply