Jump to content
Korean Random

StranikS_Scan

Premium Member
  • Content Count

    7,550
  • Joined

  • Last visited

  • Days Won

    178

Everything posted by StranikS_Scan

  1. Ну если пинг пропадает, программа покажет. А для чего их считать? Играть при пропадании пакетов не получится.
  2. Ну понятие "не сильно влияло" оно очень растяжимо. Например, на ноуте с i7 цикл с обстрелом сетки в 150-200 точек и баллистикой укладывается в 0,1-0,2 сек без видимых тормозов. На более слабой машине может тормозить. Кулькуляторы зафризят при такой сетке. Коллайды нативные, сами они быстрые, а вся обвязка и вызовы на пайтоне же, вот отсюда и тормоза. Так что ядра-физика это всё не влияет. Все верно. Все запросы с компа априори можно посмотреть какой-нибудь "монитор"-программой. Однако я не очень понимаю чего такой кипишь вокруг токена. В использовании чужого токена нет никакого смысла.
  3. Не знаю, что такое рейкаст. В танках оценка столкновений идет путем вызова функции расчета столкновения, они разные есть. Есть для ландшафта BigWorld.wg_collideSegment, а есть и для моделей танков BigWorld.wg_collideDynamic или обе сразу BigWorld.wg_collideDynamicStatic. Ниже под спойлерами некоторая инфа по этому поводу, которую я собирал раньше. Она будет полезна при реализации. Чтобы сделать карту прострела, надо повторить по сути тот же механизм, который реализован в аимах. Его можно сделать по разному, например классический алгоритм, типа аима LPortii, делал прямые коллайды без учета траектории и искал тонкую броню методом направленного случайного поиска. Аим, который у меня, делает по другому, он формирует сетку за танком врага и коллайдит её узлы из точки, лежащей на нисходящей части траектории снаряда. Это увеличивает нагрузку на комп, зато делает аим в разы эффективнее. Есть и совсем продвинутые варианты, где (как я думаю, точно не знаю) берутся геометрические параметры сегментов коллижен модели и пересчитываются в плоскость разброса орудия с учетом траектории снаряда. Это дает большое быстродействие и высокую точность без лишних мат.операций. У коллайдов есть два минуса - если их много и часто вызывать, то жрут время, игра может тормозить. Ну и их нельзя вызывать в потоках. Клиент крашится.
  4. Там всё через токены application_id, разница только в ограничениях. Автономные приложения могут слать запросы с любых айпи, ибо будут запускаться разными юзверами. А серверное только с фиксированных, заранее перечисленных в кабинете, айпи. И для серверного токена больше лимит по запросам в секунду (вроде). Про компрометацию, это я не понял о чем ты. Если про перехват, то API - публичный, какие вопросы перехвата тут могут быть?
  5. Это не моды жы. ------------------------ По модам, XVM раньше писал на сайте о кол-во активных юзверов (как реклама), последний раз когда видел лейбл, было вроде написано об 3+ млн, из них думаю не менее 50% ставят его через толстые модпаки, так что 1-1,5 млн активного онлайна точно юзают модпаки. Если смотреть тот же сайт вгмодс, счетчик скачивания толстых модпаков, то там цифры побольше будут, но цифра скачивания совершенно не значит, что онлайн именно такой. Жовопак ~ 12 млн Корбен ~ 0,5 млн Юшапак - 11 + 19 +1 = 31 млн Трамвай - 3,5 млн Вспышка - 0,5 млн ... дальше мелочь. Итого: ~47,5 млн, если добрать мелочь, то будет красивая цифра 50 млн. Из этой цифры активноиграющие игорьки, это 10%, что получаем 5 млн. Что вроде бы говорит о том, что они могут юзать потенциально твой мод, если модпакеры решат его включить в свой паки. Но есть один важный момент, который ломает эту картинку, это % игроков с запрещенными модами и паками. Из активного онлайна, кто рубится в тынки, 40-60% всегда играет с какой-то запрещенкой, большинство по мелочи, аля "мине нада тока тундру остальное фигня", а кто-то и по крупному с платными модпаками. Эти товарищи наоборот - будут избегать юзать твой мод, ибо он сливает инфу на твой сервер. Что в сухом остатке, думаю , если (SoprachevAK) договоришься с @Yusha и мод будет в модпаке, то 5-10 тыс. онлайна вполне может появится и база начнет быстро расти.
  6. Ну типа шансов меньше сбить гуслю, если у врага закалка.
  7. Зачем вообще эта информация о том, есть закалка или нет, если она сводится только к добавке к ХП, а эту добавку мы видим и так?
  8. Понимает dds-формат. Однако нет никакого смысла юзать GUI, он кривой, не красивый и очень неудобный. Юзай GUIFlash. Все на нем сидят.
  9. Нормально. Приходишь на форум отвлечься после рабочего дня, а тут какой-то аноним возмущен, что ты не хочешь сделать ему мод за пару тугриков, которые он со школьных завтраков скопил. Мы, уважаемый, это так видим со свей колокольни, от того и нет в нас энтузиазма.
  10. Больше смахивает на работу антивируса.
  11. Ты столько не напуляешь, чтоб выборка стала репрезентативной. Помню на раковом один дед-грибоед, КРОТ его знает, на Тигре собирал выборки. Создавал акк, накатывал до тигра и на нем играл. Потом опять новый акк и т.д. Ну и конечно же у него на разных акка статистики отличались.
  12. @KPOT2338 как у Задорного про Ельцина "ты чего это мне мои счета показываешь..." )))) Сервер же всё знает, какая разница что там приходит или нет на клиент игры ))))
  13. Ну круто, курил что было, а видос с трешевым названием типа "Сенсация! Угнетают!" таки запилил. Дык мог не париться просто наврать в видео да и всё. Просмотры бы все равно собрал. Ты уж извини, но я вашего брата называю ютуберы-балаболы, вот именно из-за такого контента. А реплеи сейчас собираешь откуда? Если с какого-нибудь wotreplays.ru выгружаешь, то опять не репрезентативно, ибо их туда заливают потому что они особенные для тех, кто их залил.
  14. 152 выстрела? Это не репрезентативная выборка. Она ровным счетом ничего не показывает. Нужно 15к выстрелов и рандомные игроки.
  15. А на графике дистанция какому конкретно параметру в пайтон-коде соответствует? Почему нет? Мерить то можно. Круг отрисовки - это круг отображения моделей.
  16. А САУ то как тогда в аркадном наводится будет. У неё дистанция 10 км. Ну и дальномер в игре используют также чтобы и расстояния мерить.
  17. Колеса загрузки и картинки - это флэшки. Это не Python.
  18. Обновление 1.3.1 1. Добавлено получение и отображение количества игроков на серверах игры 2. На случай проблем с доступом к GitHub в ресурсы exe-файла добавлена локальная копия списка серверов 3. Добавлено запоминание столбца сортировки в окне сводных параметров 4. Внесены правки в интерфейс 5. Обновлен список серверов на GitHub ИНФОРМАЦИЯ ДЛЯ МОДОДЕЛОВ Для получения онлайна игроков, программа использует открытый api-сервис с моего сайта http://straniks.ru/pub/api/v1/wot_online.php?online=all. На сайте данные обновляются каждые 30 сек. Возвращаемый результат имеет вид: {"RU1":37005,"RU2":37580,"RU3":5677,"RU4":20522,"RU5":27002,"RU6":26905,"RU7":19271,"RU8":26119,"RU9":11411,"RU10":1523,"RU11":563,"EU1":27883,"EU2":24220,"USC":1225,"LATAM":1204,"HK":13250,"ANZ":1346} Поддерживаются аргументы all, ru, eu, na, asia. Получение данных о китайских серверах не реализовано т.к. то ли у них не все функции api работают из-за смены партнера у ВГ, то ли я не смог до конца разобраться как их получить.
  19. Результаты боев приходят в кэш и надо его оттуда дергать. Кэш, это файлы вот тут .../AppData/Roaming/Wargaming.net/WorldOfTanks\battle_results\..... А дергать если правильно помню в модах делают это через BigWorld.player().battleResultsCache. Ниже очередной чей-то древний код из моей библиотеки, что насобирал, он думаю тебе поможет. Это как дергать через battleResultsCache # -*- coding: utf-8 -*- import BigWorld, threading from Queue import Queue from functools import partial from PlayerEvents import g_playerEvents from messenger.formatters.service_channel import BattleResultsFormatter Threads = True ArenaIDQueue = Queue() ResultsQueue = Queue() old_format = BattleResultsFormatter.format def init(): g_playerEvents.onAvatarReady += IntoBattle g_playerEvents.onAccountBecomePlayer += self.onAccountBecomePlayer def onAccountBecomePlayer(): Results.ResultsAvailable.set() def IntoBattle(): Results.ResultsAvailable.clear() def format(self, message, *args): arenaUniqueID = message.data.get('arenaUniqueID', 0) ArenaIDQueue.put(arenaUniqueID) return old_format(self, message, *args) def fini(): Threads = False class BattleResultParser(object): def __init__(self): self.ResultsCache = [] self.ResultsAvailable = threading.Event() self.thread = threading.Thread(target = self.WaitResult) self.thread.setDaemon(True) self.thread.setName('WaitResult') self.thread.start() def CheckCallback(self, ArenaUniqueID, ErrorCode, Result): if ErrorCode in [-3, -5]: BigWorld.callback(1.0, lambda: ArenaIDQueue.put(ArenaUniqueID)) elif ErrorCode >= 0: if ArenaUniqueID in self.ResultsCache: return print Result.get('arenaUniqueID') print Result.get('personal') print Result.get('common') def WaitResult(self): while Threads: ArenaUniqueID = ArenaIDQueue.get() self.ResultsAvailable.wait() try: BigWorld.player().battleResultsCache.get(ArenaUniqueID, partial(self.CheckCallback, ArenaUniqueID)) except: pass BattleResultsFormatter.format = format Results = BattleResultParser() А тут вручную этот файл перехватывают и дампят, зачем, я хз import BigWorld import Math from gui.shared.utils.requesters import StatsRequester import AccountCommands import cPickle import zlib import os import base64 from battle_results_shared import * from messenger.proto.bw import ServiceChannelManager from functools import partial from gui import ClientHangarSpace from debug_utils import * BATTLE_RESULTS_VERSION = 1 CACHE_DIR = os.path.join(os.path.dirname(unicode(BigWorld.wg_getPreferencesFilePath(), 'utf-8', errors='ignore')), 'battle_results') todolist = [] waiting = False def new_valueResponse(self, responseCode, value = None, revision = 0): if responseCode < 0: LOG_NOTE('Battleresult not available or already retrieved. Response Code=%s' % responseCode) elif StatsRequester.__callback: StatsRequester.__callback(value) def fetchresult(arenaUID): global waiting if arenaUID: waiting = True proxy = partial(__onGetResponse, new_valueResponse) BigWorld.player()._doCmdInt3(AccountCommands.CMD_REQ_BATTLE_RESULTS, arenaUID, 0, 0, proxy) def __onGetResponse(callback, requestID, resultID, errorStr, ext = {}): global waiting if resultID != AccountCommands.RES_STREAM: waiting = False if callback is not None: try: callback(resultID, None) except: LOG_CURRENT_EXCEPTION() else: BigWorld.player()._subscribeForStream(requestID, partial(__onStreamComplete, callback)) def __onStreamComplete(callback, isSuccess, data): try: battleResults = cPickle.loads(zlib.decompress(data)) save(BigWorld.player().name, battleResults) except: LOG_CURRENT_EXCEPTION() if callback is not None: callback(AccountCommands.RES_FAILURE, None) def getFolderName(accountName, arenaUniqueID): battleStartTime = arenaUniqueID & 4294967295L battleStartDay = battleStartTime / 86400 return os.path.join(CACHE_DIR, base64.b32encode('%s;%s' % (accountName, battleStartDay))) def save(accountName, battleResults): fileHandler = None try: arenaUniqueID = battleResults[0] LOG_NOTE('Saving results of arenaUniqueID:', arenaUniqueID) folderName = getFolderName(accountName, arenaUniqueID) LOG_NOTE('Savefile Folder:', folderName) if not os.path.isdir(folderName): os.makedirs(folderName) fileName = os.path.join(folderName, '%s.dat' % arenaUniqueID) fileHandler = open(fileName, 'wb') cPickle.dump((BATTLE_RESULTS_VERSION, battleResults), fileHandler, -1) except: LOG_CURRENT_EXCEPTION() if fileHandler is not None: fileHandler.close() old_msg = ServiceChannelManager._ServiceChannelManager__addServerMessage def new_msg(self, message): global todolist LOG_NOTE('Message:', message) if message.type == 2: try: todolist.append(message.data.get('arenaUniqueID', 0)) except: LOG_CURRENT_EXCEPTION() old_msg(self, message) ServiceChannelManager._ServiceChannelManager__addServerMessage = new_msg old_setup = ClientHangarSpace._VehicleAppearance._VehicleAppearance__doFinalSetup def new_setup(self, buildIdx, model, delModel): global todolist if todolist: LOG_NOTE('Start work on my ToDoList:', todolist) while todolist: if waiting: time.delay(0.5) else: temp = todolist.pop() fetchresult(int(temp)) old_setup(self, buildIdx, model, delModel) ClientHangarSpace._VehicleAppearance._VehicleAppearance__doFinalSetup = new_setup
  20. Гугл аналитик у них и там у всех подключен. Не думаю, что раскрывать свою статистику кто-то будет. Иначе бы давно её публиковали бы. Я думаю тебе стоит не распыляться, а сосредоточится на первоочередных задачах.
  21. Дык о какой полноте может идти речь, если выборка изначально неполна и субъективна? Ты же собираешь не первичные данные, типа чисел на выходе ГПСЧ, а координаты попадания снарядов. У тебя изначально нет и не будет никакой "полной исходной последовательности", только её отголоски.
×
×
  • Create New...