Jump to content
Korean Random
H.Falcon

Список участников боя

Recommended Posts

Что-то я делаю не так и не могу понять . Прошу помощи, пожалуйста.

Хочу получить список участников боя.

И всё хорошо, только не получается дополнить его именами машин, на которых игроки вышли в бой и именем места боя.

Кучу вариантов перепробовал. Проверяю методом dir(объект) какие есть атрибуты, а получить те, что есть, не выходит.

TypeError: 'Vehicle' object has no attribute '__getitem__'

(это попытка получить свою машину:

try:

  avatarVehicle = BigWorld.player().getVehicleAttached()

  print 'ID = %s' % str(avatarVehicle['id'])

except Exception:

  LOG_CURRENT_EXCEPTION()

 

)

При сканировании BigWorld.player().arena.vehicle.values()  доступен атрибут vehicleType.

Но любые попытки получить из него что-либо кончаются в лучшем случае строкой:

'vehicleType': '<items.vehicle.vehicleDescr of Object at ...>' (или типа этой строки, лог уже дропнул)

или ошибкой TypeError: 'VehicleDescr' object is not iterable

 

 

Share this post


Link to post

Short link
Share on other sites

BigWorld.player().arena.vehicle​s

Это словарь

Соответсвенно BigWorld.player().arena.vehicles.values() список из значений этого словаря. По нему можно обращаться по индексу:

BigWorld.player().arena.vehicles.values()[0]
Либо пройтись циклом:

for player in BigWorld.player().arena.vehicles.values():
    # Здесь player - тоже словарь, и у него есть разные ключи среди которых name и vehicleType
    print player['name'], # Player name
    print player['vehicleType'].type.userString # Vehicle name

Share this post


Link to post

Short link
Share on other sites
...
    print player['vehicleType'].type.userString # Vehicle name

Спасибо!

Не понял только на каком основании вот эта строка...

Метод dir ни атрибута, ни метода type не показывал в наличии у player['vehicleType']

 

Share this post


Link to post

Short link
Share on other sites

Не понял только на каком основании вот эта строка...

player - это словарь (он же dict, он же ассоциативный массив), доступ к элементам которого осуществляется по ключу примерно так названиеСловаря["Ключ"].

Список всех ключей можно получить к примеру так:

print player.keys()

либо просто

print player # Выведет и ключи и их значения.

Share this post


Link to post

Short link
Share on other sites

Спасибо за разъяснение.

Но не всё так просто, как кажется.

Вы писали :

 

print player # Выведет и ключи и их значения.

 

try:

   for p in BigWorld.player():

      print p

except Exception:

   LOG_CURRENT_EXCEPTION()

 

Этот код выдаёт ошибку:

*** EXCEPTION(mod_1, 88):
*** Traceback (most recent call last):
***   File "mod_1", line 85, in test
*** TypeError: 'PlayerAvatar' object is not iterable


Прошу прощения, не получилось правильно отформатировать предыдущее сообщение.

Оказалось, что нельзя для форматирования использовать табуляцию.

Share this post


Link to post

Short link
Share on other sites

Та изи же, сверху даже бросали готовое

player = BigWorld.player()
for vehicleID, vehicle in player.arena.vehicles.iteritems():
    pName, pTeam, vName, vLocalName = vehicle['name'], vehicle['team'], vehicle['vehicleType'].name, vehicle['vehicleType'].type.userString
    # никнейм, имя танка кирилицей, команда игрока, имя танка латиницей (внутреигровое)
    print pName, vLocalName, pTeam, vName

Share this post


Link to post

Short link
Share on other sites

for p in BigWorld.player():

print p

А это не работает т.к. нужно

for p in BigWorld.player().arena.vehicles.values():
    print p

Share this post


Link to post

Short link
Share on other sites

Да не надо обижаться-то.

Кажись я не смог правильно сформулировать последнее своё сообщение.

Попробую пояснить на базе Вашего последнего кода.

vehicle['name'], vehicle['team'] - да конечно

vehicle['vehicleType'].name - ну может быть, если там не значение, а структура

vehicle['vehicleType'].type.userString - но почему это? .type.userString в атрибутах даже близко ничего не высвечивается

Вот в чём был последний мой вопрос.

Я в Питоне не так давно. В известных мне языках такого подхода нет (если только vehicle['vehicleType'] не является объектом),

да и Питоновский хелп такого решения не даёт. Можно попробовать явное приведение типов, но надо знать к какому типу приводить.

Кстати и тут Марк Лутц. Изучаем Python, 4-е издание ничего похожего я не нашёл.

Share this post


Link to post

Short link
Share on other sites

vehicle['vehicleType'].type.userString - но почему это? .type.userString в атрибутах даже близко ничего не высвечивается

Ну вот же:

screenshot

post-32536-0-44263600-1470131743_thumb.png

 

userString - это уже атрибут type и он тоже нормально высвечивается.

Share this post


Link to post

Short link
Share on other sites

Получается эти две записи эквивалентны?

vehicle['vehicleType'].type.userString

vehicle.vehicleType.type.userString

 

Ведь, если мы type  можем так указать, то и vehicleType то же.


А такой вопрос:

судя по приложенному скрину есть возможность в Орионе выполнять отдельные строки без привязки их к скриптам?

Share this post


Link to post

Short link
Share on other sites

vehicle.vehicleType.type.userString

Так не будет работать.

 

 

судя по приложенному скрину есть возможность в Орионе выполнять отдельные строки без привязки их к скриптам?

Да, пишете код, нажимаете WOT-Transmission>Exec script in client (for ANSI) либо сочетание клавиш Shift+F5. Ещё есть такая удобная штука как Run>Express script. Я в основном её использую для таких вещей т.к. в главном окне находится скрипт мода.

Share this post


Link to post

Short link
Share on other sites

Так не будет работать.

 

...Я в основном её использую для таких вещей т.к. в главном окне находится скрипт мода.

Так вот и не понятно, почему для type можно так писать, а для 'vehicleType' нельзя.

Хотелось бы почитать, где это прописано.

 

А вот у меня экспресс скрипт выполняется только типа print 'blablabla'

На всё другое кричит, что модуль не определён.

Может что не так делаю:

1.в окне открыт скрипт, который в разработке

2.после компиляции и копирования в каталог /scripts/client/gui/mods запускаю игру F11

3.после логина, находясь в игре, вызываю окно экспресс скрипта

4.ввожу текст (например: print dir(BigWorld.player().arena)) и жму F5

5.получаю ошибку, модуль не определён

   если указать import BigWorld - ничего не изменится

Вот и приходится изменить несколько строк, скомпилить, кинуть в папку, запустить игру, сыграть бой, выйти из игры, проанализировать лог.

Share this post


Link to post

Short link
Share on other sites

Так вот и не понятно, почему для type можно так писать, а для 'vehicleType' нельзя. Хотелось бы почитать, где это прописано.

Потому что vehicle['vehicleType'] - это получить значения элемента словаря vehicle с ключем 'vehicleType', а vehicle['vehicleType'].type - это обратится к атрибуту type объекта что хранится в vehicle['vehicleType'] (В данном случае это экземпляр класса VehicleDescr, который можно найти в scripts/common/items/vehicles.pyc). Так вот у этого класса есть атрибут type, что можно без проблем проверить в декомпилированном скрипте.

 

Может что не так делаю:

...

ввожу текст (например: print dir(BigWorld.player().arena)) и жму F5

Нужно Shift+F5.

Я в основном всё делаю в реплеях: открываю реплей в WOT-Transmission. Ставлю его на паузу, открываю экспресс скрипт и пишу что хочу, потом жму Shift+F5 и всё работает.

 

Кстати чтобы каждый раз не писать print dir(что-то-там) можно в Орионе нажать ПКМ потом Select the attributes source и выбрать WOT. Теперь когда пишете к примеру BigWorld.player().arena ставите точку и получаете список всех только "публичных" (для всех нужно успеть нажать ctrl+shift+space) атрибутов.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Как говорится "..Семён Семёныч!..."

Огромное СПАСИБО!

Честно говоря и не надеялся на столь подробное разъяснение.

Хороший "пинок" в нужном направлении!

СПАСИБО!

Share this post


Link to post

Short link
Share on other sites

А можно вот так:

from gui.battle_control.arena_info import vos_collections
from gui.battle_control import g_sessionProvider as g_BattleSessionProvider
isEnemy = True #или False
ArenaDP = g_BattleSessionProvider.getArenaDP()
SortKey = vos_collections.VehicleInfoSortKey
if isEnemy:
  collection = vos_collections.EnemyItemsCollection(sortKey=SortKey)
else:
  collection = vos_collections.AllyItemsCollection(sortKey=SortKey)
for Index, (vInfoVO, vStatsVO) in enumerate(collection.iterator(ArenaDP)):
  print Index, vInfoVO.vehicleID

Получим список танков в том порядке, в котором они идут в ушах.

И дальше, зная vehicleID, более подробная информация: BigWorld.player().arena.vehicles[VehicleID]

И для засвеченных - еще более подробная: BigWorld.entity(VehicleID)

Edited by sl101
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...