Serfer_78 Posted August 6, 2017 Share Posted August 6, 2017 (edited) Не стоит так делать. Используй потоки. Одно из основных правил хорошего кода - выносить все операции ввода-вывода в отдельный поток/потоки. Ибо они могут просто повесить обработку события и создать лаг. Или просто сорвать выполнение неожиданным исключением. Типа "файл недоступен", "нет прав", "сеть не работает" и в том же стиле. Кстати позиция по моему не так вычисляется ... position = playerVehicle.position Я ее вот так получаю.. position = (player.getOwnVehiclePosition()).length а первый способ не сработал. Вот функция для расчета дистанции)) def target_distance(player, vehicle): distance = (player.getOwnVehiclePosition() - vehicle.position).length return int(distance) Edited August 6, 2017 by Serfer_78 @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted August 6, 2017 Share Posted August 6, 2017 (edited) Вот функция для расчета дистанции return vehicle.position.distTo(BigWorld.player().getOwnVehiclePosition())И не надо конвертить в инты, если тебе не нужен конкретно int-instance. Используй string.format на нужном месте, где преобразовываешь целое в строку.Кстати позиция по моему не так вычисляется ...Все вычисляется. Просто походу ты что-то не так делаешь. playerVehicle = BigWorld.entity(BigWorld.player().playerVehicleID) return playerVehicle.positionЭто я по памяти написал, мог где-то допустить мелкую ошибку. Но в принципе так делать сейчас уже резона нет, ибо есть враппер у player на получение инстанса танка игрока. Edited August 6, 2017 by GPCracker 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 6, 2017 Share Posted August 6, 2017 Используй string.format на нужном месте, где преобразовываешь целое в строку. В принципе да, можно прогнать через функцию... def _intstr(f): return str(int(f)) return vehicle.position.distTo(BigWorld.player().getOwnVehiclePosition()) Благодарю за отличный пример, действительно работает отлично. Все вычисляется. Просто походу ты что-то не так делаешь. Не спорю ибо не ас пока в "картохином" питоне. Возможно где то затупил.. @ Quote Link to comment Short link Share on other sites More sharing options...
spoter Posted August 6, 2017 Share Posted August 6, 2017 В принципе да, можно прогнать через функцию... def _intstr(f): return str(int(f)) Проще так: print '%s' %value или так print '{}'.format(value) 1 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 6, 2017 Share Posted August 6, 2017 (edited) Вообщем набросал немного , тапочками и табуретками не кидать))) # -*- 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.151306152354.023773193354.170257568353.364715576354.857940674353.543518066351.053741455345.922943115 А можно ли скажем сделать вывод с именем? на подобии return '%n' %value '%s' %value ... Edited August 6, 2017 by Serfer_78 @ Quote Link to comment Short link Share on other sites More sharing options...
ktulho Posted August 6, 2017 Share Posted August 6, 2017 (edited) А можно ли скажем сделать вывод с именем? на подобии return '%n' %value '%s' %value ... return '%s %s' % (value1, value2) Edited August 6, 2017 by ktulho 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 6, 2017 Share Posted August 6, 2017 (edited) В 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 March 20, 2018 by Serfer_78 исправил @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted August 6, 2017 Share Posted August 6, 2017 (edited) В принципе да, можно прогнать через функцию...Имелось в виду print '{:.2f}'.format(3.1415)... уже написали об этом. Если вдруг кому понадобится , необходимую точность или длинну строк можно получить с помощью флагов преобразования.Те, кому вдруг понадобится, могут зайти сюда (или сюда) и почитать официальные доки :) Edited August 6, 2017 by GPCracker 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 6, 2017 Share Posted August 6, 2017 (edited) Имелось в виду 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 August 6, 2017 by Serfer_78 @ Quote Link to comment Short link Share on other sites More sharing options...
spoter Posted August 6, 2017 Share Posted August 6, 2017 Кучу примеров кода модов для танков можно на гитхабе найти. например у меня в репо https://github.com/spoter @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted August 6, 2017 Share Posted August 6, 2017 (edited) потому что воды много в интернете и попробуй выциди эту самую истинуИстина в официальной документации обычно. Не так наглядно, но зато четко и лаконично. Лично я вообще по питону пользуюсь только официальными доками.Какие-то сложные вопросы ищу поиском на английском (сам запрос на английском), он у меня в гугле как один из основных языков забит. Форматирование в твоем случае красиво делается как-то так 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 August 6, 2017 by GPCracker 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 6, 2017 Share Posted August 6, 2017 (edited) Истина в официальной документации обычно. Не так наглядно, но зато четко и лаконично. Лично я вообще по питону пользуюсь только официальными доками. Какие-то сложные вопросы ищу поиском на английском (сам запрос на английском), он у меня в гугле как один из основных языков забит. Форматирование в твоем случае красиво делается как-то так 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 Хотя полагаю при форматировании можно поставить подачу как угодно.. Например : 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 August 6, 2017 by Serfer_78 @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted August 7, 2017 Share Posted August 7, 2017 (edited) Только по ходу не X,Y,Z a X,Z,YОсь Z основная, по модели танка всегда вперед направлена. Y - вертикально вверх, X - ЕМНИП, вправо. Возможно расчеты ведутся по другому, хотя функция возвращает X, дистанция, Z по моему так(предположение) возможно Z по навесной пересчитывается т.к снаряд не прямо летит..Функция расчета точки прицеливания возвращает точку. Просто ты забыл, что точка не есть дистанция. Дистанция - это длина вектора из точки A в точку B. Почитай литературу по аналитической геометрии. Edited August 7, 2017 by GPCracker @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 7, 2017 Share Posted August 7, 2017 (edited) Ось 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 меняется когда движешься от базы к базе... А то я уж подумал что накуралесил , картинка с толку сбила Ребята подскажите пожалуйста как имя карты получить , всю ночь просидел и ничего, набросал функцию но она не отдает название, или не туда полез либо не правильно что то делаю.. Функция из 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 August 7, 2017 by Serfer_78 @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted August 7, 2017 Share Posted August 7, 2017 (edited) как раз и должна расчитывать эту точку. И возвращает 3 координаты. Или я заблуждаюсь?DesiredShotPoint - это для системы прицеливания, куда пушка наводится. ShotPoint - это передается на сервер для отрисовки камеры наблюдателя. правильно у меня работает , покатавшись с ней в трене выяснил , что X изменяется при движении поперек карты как ты и сказал, Y при подьеме-спуске , а Z меняется когда движешься от базы к базе... А то я уж подумал что накуралесил , картинка с толку сбилаКарта может иметь любую расстановку баз. К координатной системе они точно не привязаны. Если они тебе сильно нужны, их координаты можно получить из данных арены. Матрица танка есть матрица преобразования из локальной координатной системы танка в глобальную спейса (карты). Читай документацию к BigWorld. Уже неоднократно постил, поищи на форуме по аттачам. Edited August 7, 2017 by GPCracker 1 @ Quote Link to comment Short link Share on other sites More sharing options...
spoter Posted August 7, 2017 Share Posted August 7, 2017 Узнать название карты при старте боя 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) Я правда не уверен в корректности работы во всяких режимах, где несколько баз, как-то не проверял. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 7, 2017 Share Posted August 7, 2017 (edited) Узнать название карты при старте боя 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 August 8, 2017 by Serfer_78 @ Quote Link to comment Short link Share on other sites More sharing options...
Serfer_78 Posted August 8, 2017 Share Posted August 8, 2017 import game Получается не в том месте я пытался событие ловить :) Я в аватаре функцию __dumpVehicleState пытал , а она не колется))) Оказывается не там копал, 'spoter' еще раз спасибо за помощь, все отлично отрабатывает , из твоего первого примера уловил общую картину с передачей аргументов, в голове по этому вопросу была каша:) @ Quote Link to comment Short link Share on other sites More sharing options...
GPCracker Posted August 8, 2017 Share Posted August 8, 2017 "Изучать питон с помощью картохи"Честно говоря, никаких модификаций в сам питон, которые ощутимы для среднестатистического мододела, картоха не вносила, по крайней мере, я такого не заметил. Так что все доки по питону в принципе актуальны. @ Quote Link to comment Short link Share on other sites More sharing options...
Mixaill Posted August 8, 2017 Share Posted August 8, 2017 Честно говоря, никаких модификаций в сам питон, которые ощутимы для среднестатистического мододела, картоха не вносила Отлопатил около 60% libpython - различия не найдены. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
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.