Jump to content
Korean Random

Как получить телеметрию с танка реалтайм?


Tee-m

Recommended Posts

Не стоит так делать. Используй потоки.

Одно из основных правил хорошего кода - выносить все операции ввода-вывода в отдельный поток/потоки. Ибо они могут просто повесить обработку события и создать лаг.

Или просто сорвать выполнение неожиданным исключением. Типа "файл недоступен", "нет прав", "сеть не работает" и в том же стиле.

 

Кстати позиция по моему не так вычисляется ...

 

position = playerVehicle.position

Я ее вот так получаю..

 

position = (player.getOwnVehiclePosition()).length

а первый способ не сработал.

 

Вот функция для расчета дистанции))

def target_distance(player, vehicle):
    distance = (player.getOwnVehiclePosition() - vehicle.position).length
    return int(distance)
Edited by Serfer_78
Link to comment
Short link
Share on other sites

Вот функция для расчета дистанции

return vehicle.position.distTo(BigWorld.player().getOwnVehiclePosition())
И не надо конвертить в инты, если тебе не нужен конкретно int-instance. Используй string.format на нужном месте, где преобразовываешь целое в строку.

Кстати позиция по моему не так вычисляется ...

Все вычисляется. Просто походу ты что-то не так делаешь.

playerVehicle = BigWorld.entity(BigWorld.player().playerVehicleID)
return playerVehicle.position
Это я по памяти написал, мог где-то допустить мелкую ошибку. Но в принципе так делать сейчас уже резона нет, ибо есть враппер у player на получение инстанса танка игрока.
Edited by GPCracker
  • Upvote 1
Link to comment
Short link
Share on other sites

 

 

Используй string.format на нужном месте, где преобразовываешь целое в строку.

В принципе да, можно прогнать через функцию...

def _intstr(f):
    return str(int(f)) 

 

 

return vehicle.position.distTo(BigWorld.player().getOwnVehiclePosition())

 

Благодарю за отличный пример, действительно работает отлично.


 

 

Все вычисляется. Просто походу ты что-то не так делаешь.

 

Не спорю ибо не ас пока в "картохином" питоне.  Возможно где то затупил..

Link to comment
Short link
Share on other sites

Вообщем набросал немного , тапочками и табуретками не кидать)))

# -*- coding: utf-8 -*-
import socket
import urllib
import BigWorld, Math
from gui import SystemMessages
from Account import Account
from Avatar import PlayerAvatar

UDP_IP = '127.0.0.1'
UDP_PORT = 7777

old_onBecomePlayer = Account.onBecomePlayer
def nev_onBecomePlayer(self):
    old_onBecomePlayer(self)
    txt = '<font color="#1AFF00"><b> Mod loaded</b></font>'
    type = SystemMessages.SM_TYPE.Warning
    SystemMessages.pushMessage(txt, type)
    Account.onBecomePlayer = old_onBecomePlayer
Account.onBecomePlayer = nev_onBecomePlayer

def target_distance(player, vehicle):
    return vehicle.position.distTo(BigWorld.player().getOwnVehiclePosition())


def _intstr(f):
    return str(int(f))


def sendMessage(Message):
    try:
        socket.socket(socket.AF_INET, socket.SOCK_DGRAM).sendto(_intstr(Message), (UDP_IP, UDP_PORT))
        socket.close()
    except:
        pass


def x_ray_position(vehicle):
    try:
        player = BigWorld.player()
        if vehicle is not None and player.vehicle is not None and vehicle.isAlive():
            if target_distance(player, vehicle) != 0:
                sendMessage(target_distance(player, vehicle))
    except:
        pass

    BigWorld.callback(1, lambda : x_ray_position(vehicle))
    return


def new_vehicle_onEnterWorld(self, vehicle):
    old_vehicle_onEnterWorld(self, vehicle)
    player = BigWorld.player()
    if vehicle is not None and player is not None:
        if not player.team == player.arena.vehicles[vehicle.id]['team']:
            x_ray_position(vehicle)
    return


old_vehicle_onEnterWorld = PlayerAvatar.vehicle_onEnterWorld
PlayerAvatar.vehicle_onEnterWorld = new_vehicle_onEnterWorld

Передает данные (расстояние до противников) на внешний сервак. 

 

Тут бы по идее потоки запилить но пока не созрел как правильно это реализовать. (это просто пробник)

 

Если кому надо код сервера могу скинуть...

 

Попытался вывести название техники

def tank_name():
    tankN = BigWorld.player().arena.vehicles[self.id]['vehicleType'].type.userString
    return tankN

Почему то не взлетело..


Проще так:

print '%s' %value
или так
print '{}'.format(value)

 

Вот только час назад голову ломал как это правильно делается))) От души благодарю spoter ! Сейчас попробую приладить..

 

Похоже return  '%s' %value

 

точно return , результат очень интересный) вещественные выводит и я так думаю считать можно поточнее чем с целыми,  spoter просто гуру в питоне) плюсанул..

 

 

357.151306152
354.023773193
354.170257568
353.364715576
354.857940674
353.543518066
351.053741455
345.922943115

А можно ли скажем сделать вывод с именем?  на подобии  return  '%n'  %value  '%s' %value  ...

Edited by Serfer_78
Link to comment
Short link
Share on other sites

В 06.08.2017 в 16:40, ktulho сказал:

return '%s %s' % (value1, value2)

 

Окей сейчас заценю)

 

Просто нет слов ! Плюсанул.

 

Таким способом получилось вывести все то что до сих пор не работало.

ktulho огромное спасибо за пример, собираю знания так сказать по крупицам, спасибо ребята показали правильный путь, а то я такой огород нагородил))) 

 

PS:

 Если вдруг кому понадобится , необходимую точность или длинну строк можно получить с помощью флагов преобразования.

>>> '%.2s' % 'Hello!'
'He'
>>> '%.*s' % (2, 'Hello!')
'He'
>>> '%-10d' % 25
'25        '
>>> '%+10f' % 25
'+25.000000'
>>> '%+10s' % 'Hello'
'     Hello'

Надеюсь, что вопросами помог не только себе , а так же всем, кто только начал изучать python.

 

И если отталкиваться от выше написанного то вывести имя игрока можно примерно так:

def tank_name(vehicle):
    return '%s' % (BigWorld.player().arena.vehicle.id['name'])

 100% ную точность информации не гарантирую еще не проверил)

Edited by Serfer_78
исправил
Link to comment
Short link
Share on other sites

В принципе да, можно прогнать через функцию...

Имелось в виду

print '{:.2f}'.format(3.1415)
... уже написали об этом.

Если вдруг кому понадобится , необходимую точность или длинну строк можно получить с помощью флагов преобразования.

Те, кому вдруг понадобится, могут зайти сюда (или сюда) и почитать официальные доки :)
Edited by GPCracker
  • Upvote 1
Link to comment
Short link
Share on other sites

Имелось в виду

print '{:.2f}'.format(3.1415)
... уже написали об этом.

Те, кому вдруг понадобится, могут зайти сюда (или сюда) и почитать официальные доки :)

 

 

Да, там чтиво по интереснее будет.. 

А то я в первый попавшийся пример глянул тут , за пример от души, потому что воды много в интернете и попробуй выциди эту самую истину :) 

 

а без форматирования вот так получается)

-354.91293335 59.7590484619 236.147888184
-358.088256836 59.9718360901 237.27911377
-361.505889893 60.0459060669 237.531188965
-361.495635986 60.1680793762 238.295974731
-362.109924316 60.3908729553 239.775772095
-358.47467041 60.5966072083 241.419418335
-355.25    60.8356361389 243.547149658
-354.889221191 60.8794593811 243.981536865
-353.218688965 61.0808448792 247.775039673
-353.195281982 61.2132835388 249.443008423

А это с форматированием)))

X -392      , Y 18        , Z 75        
X -388      , Y 18        , Z 75        
X -212      , Y -2        , Z -21       
X -212      , Y -2        , Z -20       
X -229      , Y 0         , Z -11       
X -232      , Y 0         , Z -8        
X -249      , Y 1         , Z 0         
Edited by Serfer_78
Link to comment
Short link
Share on other sites

потому что воды много в интернете и попробуй выциди эту самую истину

Истина в официальной документации обычно. Не так наглядно, но зато четко и лаконично. Лично я вообще по питону пользуюсь только официальными доками.

Какие-то сложные вопросы ищу поиском на английском (сам запрос на английском), он у меня в гугле как один из основных языков забит.

Форматирование в твоем случае красиво делается как-то так

import Math
position = Math.Vector3(1.588996, 2.789596, 3.888484884)
print 'X: {0.x: 08.2f}, Y: {0.y: 08.2f}, Z: {0.z: 08.2f}'.format(position)
print 'X: {: 08.2f}, Y: {: 08.2f}, Z: {: 08.2f}'.format(*position.tuple())
#X:  0001.59, Y:  0002.79, Z: -0003.89
Расшифровка первого формата: в качестве аргумента под индексом 0 приходит объект Math.Vector3 (аналогичный vehicle.position) первая формат-запись берет значение атрибута x нулевого аргумента, подставляет минус или пробел, заполняет слева нулями недостающие знаки в целой части так, чтобы в общей сложности было 8 символов, из них два после запятой, тип данных float. Во втором случае то же самое, только объект координат преобразуется в кортеж и отправляется "со звездочкой".
Edited by GPCracker
  • Upvote 1
Link to comment
Short link
Share on other sites

Истина в официальной документации обычно. Не так наглядно, но зато четко и лаконично. Лично я вообще по питону пользуюсь только официальными доками.

Какие-то сложные вопросы ищу поиском на английском (сам запрос на английском), он у меня в гугле как один из основных языков забит.

Форматирование в твоем случае красиво делается как-то так

import Math
position = Math.Vector3(1.588996, 2.789596, 3.888484884)
print 'X: {0.x: 08.2f}, Y: {0.y: 08.2f}, Z: {0.z: 08.2f}'.format(position)
print 'X: {: 08.2f}, Y: {: 08.2f}, Z: {: 08.2f}'.format(*position.tuple())
#X:  0001.59, Y:  0002.79, Z: -0003.89
Расшифровка первого формата: в качестве аргумента под индексом 0 приходит объект Math.Vector3 (аналогичный vehicle.position) первая формат-запись берет значение атрибута x нулевого аргумента, подставляет минус или пробел, заполняет слева нулями недостающие знаки в целой части так, чтобы в общей сложности было 8 символов, из них два после запятой, тип данных float. Во втором случае то же самое, только объект координат преобразуется в кортеж и отправляется "со звездочкой".

 

 

Очень познавательно про форматирование и пример очень наглядный действительно красиво получается, а за пример именно для моего случая большое тебе человеческое спасибо GPCracker !

Да и пользователям кореандра пригодится)

 

Только по ходу не X,Y,Z  a X,Z,Y

 

ca640bb216e0.jpg

 

Хотя полагаю при форматировании можно поставить подачу как угодно..  Например :

Math.Vector3(x, y, z)
return '%s %s %s' % (x, z, y)

Потестил все примеры приведенные выше, все параметры выводятся на ура (кроме расстояния до точки прицеливания а стратегическом режиме) пробовал из StrategicAimingSystem функции юзать , то ли я что то недопонял, то ли в этих режимах вообще данные не выводятся вообщем не взлетело... 

Возможно расчеты ведутся по другому, хотя функция возвращает  X, дистанция, Z  по моему так(предположение) возможно Z по навесной пересчитывается т.к снаряд не прямо летит..

def StrategicShotPoint():
    player = BigWorld.player()
    x, y, z = player.getShotPoint()
    return '%s %d, %s %d, %s %d' % ('X:' x, 'Dist:' y, 'Z:' z)
Edited by Serfer_78
Link to comment
Short link
Share on other sites

Только по ходу не X,Y,Z  a X,Z,Y

Ось Z основная, по модели танка всегда вперед направлена. Y - вертикально вверх, X - ЕМНИП, вправо.

Возможно расчеты ведутся по другому, хотя функция возвращает  X, дистанция, Z  по моему так(предположение) возможно Z по навесной пересчитывается т.к снаряд не прямо летит..

Функция расчета точки прицеливания возвращает точку. Просто ты забыл, что точка не есть дистанция. Дистанция - это длина вектора из точки A в точку B. Почитай литературу по аналитической геометрии.
Edited by GPCracker
Link to comment
Short link
Share on other sites

Ось Z основная, по модели танка всегда вперед направлена. Y - вертикально вверх, X - ЕМНИП, вправо.

Функция расчета точки прицеливания возвращает точку. Просто ты забыл, что точка не есть дистанция. Дистанция - это длина вектора из точки A в точку B. Почитай литературу по аналитической геометрии.

 

Все верно точка это точка,  дистанция - длинна от точки до точки..

 

Мне показалось что функция из StrategicAimingSystem.py  

    def getShotPoint(self):
        desiredShotPoint = self.getDesiredShotPoint()
        return Vector3(desiredShotPoint.x, self.getCamDist(), desiredShotPoint.z)

как раз и должна расчитывать эту точку. И возвращает 3 координаты. Или я заблуждаюсь?

 

 

Ось Z основная, по модели танка всегда вперед направлена. Y - вертикально вверх, X - ЕМНИП, вправо.

 

Значит функция

def getPozTank():
    x, y, z = BigWorld.player().getOwnVehiclePosition()
    return '%s %-10d, %s %-10d, %s %-10d' % ('X:',x,'Y:', y,'Z:', z) 

правильно у меня работает  , покатавшись с ней в трене выяснил , что  X изменяется при движении поперек карты как ты и сказал, Y при подьеме-спуске , а Z меняется когда движешься от базы к базе... А то я уж  подумал что накуралесил , картинка с толку сбила  3-1_2.jpg

 

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

 

Функция из AreaDestructibles.py 

def getSpaseId():
    muspase = BigWorld.player().getSpaceID()
    return '%s %s' % ('muspase:', muspase)

Аргументы подсовывал не помогло.

 

 

немного изменил функцию

def getSpaseId():
    player = BigWorld.player()
    muspase = player.arena.arenaUniqueID
    return '%s %s' % ('muspase:', muspase)

и получил это :   muspase: 47804976076426269

попросил айдишник вот и получил его походу вместо названия карты :)

видимо истина где то рядом..

 

все нашел)

Edited by Serfer_78
Link to comment
Short link
Share on other sites

как раз и должна расчитывать эту точку. И возвращает 3 координаты. Или я заблуждаюсь?

DesiredShotPoint - это для системы прицеливания, куда пушка наводится. ShotPoint - это передается на сервер для отрисовки камеры наблюдателя.

правильно у меня работает  , покатавшись с ней в трене выяснил , что  X изменяется при движении поперек карты как ты и сказал, Y при подьеме-спуске , а Z меняется когда движешься от базы к базе... А то я уж  подумал что накуралесил , картинка с толку сбила

Карта может иметь любую расстановку баз. К координатной системе они точно не привязаны. Если они тебе сильно нужны, их координаты можно получить из данных арены.

Матрица танка есть матрица преобразования из локальной координатной системы танка в глобальную спейса (карты).

Читай документацию к BigWorld. Уже неоднократно постил, поищи на форуме по аттачам.

Edited by GPCracker
  • Upvote 1
Link to comment
Short link
Share on other sites

Узнать название карты при старте боя

import game
def hookOnGeometryMapped(spaceID, path):
    hookedOnGeometryMapped(spaceID, path)
    print 'mapName: %s, mapPath: %s' % (path.split('/')[-1], path)

hookedOnGeometryMapped = game.onGeometryMapped
game.onGeometryMapped = hookOnGeometryMapped
Узнать какая база у твоей команды:

from helpers import dependency
from skeletons.gui.battle_session import IBattleSessionProvider
guiSessionProvider = dependency.descriptor(IBattleSessionProvider)
teamBase = guiSessionProvider.getArenaDP().getNumberOfTeam()
print 'EnemyBaseNum: %s, TeamBaseNum' %(teamBase , teamBase -1)
Я правда не уверен в корректности работы во всяких режимах, где несколько баз, как-то не проверял.
  • Upvote 1
Link to comment
Short link
Share on other sites

Узнать название карты при старте боя

import game
def hookOnGeometryMapped(spaceID, path):
    hookedOnGeometryMapped(spaceID, path)
    print 'mapName: %s, mapPath: %s' % (path.split('/')[-1], path)

hookedOnGeometryMapped = game.onGeometryMapped
game.onGeometryMapped = hookOnGeometryMapped
Узнать какая база у твоей команды:

from helpers import dependency
from skeletons.gui.battle_session import IBattleSessionProvider
guiSessionProvider = dependency.descriptor(IBattleSessionProvider)
teamBase = guiSessionProvider.getArenaDP().getNumberOfTeam()
print 'EnemyBaseNum: %s, TeamBaseNum' %(teamBase , teamBase -1)
Я правда не уверен в корректности работы во всяких режимах, где несколько баз, как-то не проверял.

 

 

"не уверен в корректности работы во всяких режимах" - тут хоть бы в стандартном запустить и так сказать посчупать как все это работает :)

Сейчас протестирую и буду изучать как что и куда передается...

 

Спасибо большое spoter , без тебя бы еще не один день провазюкался с названием карты, функцию набросал по идее должна была выдавать значение но увы ... А у меня правило если что то не получается пытаюсь добиться результата но тут всю голову сломал. Не пойму что не так делал..

def getSpaseName():
    muspase = BigWorld.player().arena.arenaType.geometryName
    return '%s %s' % ('muspase:', muspase)

Вообщем аж до скрипа в зубах... у всех работает у меня ни как :)

DesiredShotPoint - это для системы прицеливания, куда пушка наводится. ShotPoint - это передается на сервер для отрисовки камеры наблюдателя.

Карта может иметь любую расстановку баз. К координатной системе они точно не привязаны. Если они тебе сильно нужны, их координаты можно получить из данных арены.

Матрица танка есть матрица преобразования из локальной координатной системы танка в глобальную спейса (карты).

Читай документацию к BigWorld. Уже неоднократно постил, поищи на форуме по аттачам.

 

Читаю но медленно т.к с энглиш не айс.. А гугл сам знаешь как переводит, не в оном коммиксе такого не прочтешь :-)

Хорошо что форум этот существует, тут с вашей помощью чему то научиться можно, я уж не раз думал, что тяжелый путь я выбрал "Изучать питон с помощью картохи" но мы не ищем легких путей, да и не люблю бросать начатое... Сейчас цель научиться получать значения и передавать параметры. СПС за примеры с комментариями ребята .

Edited by Serfer_78
Link to comment
Short link
Share on other sites

 

 

import game

Получается не в том месте я пытался событие ловить :)

Я в аватаре функцию  __dumpVehicleState  пытал , а она не колется))) Оказывается не там копал, 'spoter' еще раз спасибо за помощь, все отлично отрабатывает , из твоего первого примера уловил общую картину с передачей аргументов, в голове по этому вопросу была каша:)

Link to comment
Short link
Share on other sites

"Изучать питон с помощью картохи"

Честно говоря, никаких модификаций в сам питон, которые ощутимы для среднестатистического мододела, картоха не вносила, по крайней мере, я такого не заметил. Так что все доки по питону в принципе актуальны.
Link to comment
Short link
Share on other sites

 

 

Честно говоря, никаких модификаций в сам питон, которые ощутимы для среднестатистического мододела, картоха не вносила
 

Отлопатил около 60% libpython - различия не найдены.

  • Upvote 1
Link to comment
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...