Jump to content
Korean Random
StranikS_Scan

PjOrion - редактирование, компиляция, декомпиляция, обфускация модов (Версия: 1.3.5 Дата: 11.08.2019)

Пользуетесь ли вы Орионом?  

310 members have voted

You do not have permission to vote in this poll, or see the poll results. Please sign in or register to vote in this poll.

Recommended Posts

Для танчиков есть gc модуль garbagecollection вроде,  от туда можно

вытаскивать все ошибки и трассировку.

Из debug_utils.pyc :

def dump_garbage(source = False):
    """
    show us what's the garbage about
    """
    import inspect, gc
    print '\nCollecting GARBAGE:'
    gc.collect()
    print '\nCollecting GARBAGE:'
    gc.collect()
    print '\nGARBAGE OBJECTS:'
    for x in gc.garbage:
        try:
            s = str(x)
            if len(s) > 80:
                s = '%s...' % s[:80]
            print '::', s
            print '        type:', type(x)
            print '   referrers:', len(gc.get_referrers(x))
            print '    is class:', inspect.isclass(type(x))
            print '      module:', inspect.getmodule(x)
            if source:
                lines, line_num = inspect.getsourcelines(type(x))
                print '    line num:', line_num
                for l in lines:
                    print '        line:', l.rstrip('\n')
        except:
            pass
def dump_garbage_2(verbose = True, generation = 2):
    import gc
    from weakref import ProxyType, ReferenceType
    gc.set_debug(gc.DEBUG_LEAK | gc.DEBUG_STATS)
    if generation is None:
        gc.collect()
    elif generation in xrange(0, 3):
        gc.collect(generation)
    else:
        LOG_ERROR('Value of generation is invalid. Generation may be an integer specifying which generation to collect (from 0 to 2)')
        return
    if verbose:
        print '========================================='
        print '##DUMPSTART'
    del gc.garbage[:]
    d = defaultdict(lambda : 0)
    for i in gc.get_objects():
        if not isinstance(i, ProxyType) and not isinstance(i, ReferenceType):
            if hasattr(i, '__class__'):
                t = i.__class__
            else:
                t = type(i)
            d[t] += 1    if verbose:
        for t, cnt in d.iteritems():
            print '%d %s' % (cnt, t)
    d.clear()
    del gc.garbage[:]
    del d
    if verbose:
        print '##DUMPEND'
        print '========================================='
    return

Share this post


Link to post

Short link
Share on other sites

Здравствуйте, давно хотел поделится с вами простенькой утилиткой которая несколько упростит вам разработку и дебаг модов. Собирался оформить отдельной темой но уже 3 раза зафейлил топик нажав клавишу бекспейс в браузере(теперь пишу в блокноте), так что ограничусь пока обычным постом.

 

Встречайте, WOT Remote Terminal. Это интерактивная консоль, полностью аналогичная питоновскому REPL'у, позволяет выполнять скрипты в контексте запущенного клиента, перенаправляет лог из файла python.log в запущенную консоль.

 

Небольшая демонстрация работы:

 

Я создал новый модуль и импортировал функцию create_terminal и еще парочку тестовых, для демонстрации возможностей

from mods.remote import create_terminal
from gui import SystemMessages


def add_info(text):
    SystemMessages.pushMessage(text, type=SystemMessages.SM_TYPE.Information)


def add_warning(text):
    SystemMessages.pushMessage(text, type=SystemMessages.SM_TYPE.Warning)

HOST, PORT = "localhost", 9999
BANNER = """### WELCOME TO REMOTE CONSOLE ###"""
LOCALS = dict(author='Alex Yukikaze', info=add_info, warn=add_warning)

    # Create the server, binding to localhost on port 9999
server = create_terminal(HOST, PORT, banner=BANNER, local=LOCALS)
server.update_locals(host=HOST, port=PORT)

затем скомпилировал, запустил клиент игры и уютненький терминал. Далее воспользовавшись утилитой netcat(nc) подключился к серверу

OBw79Gm.jpg

сервер мне ответил и начал флудить варнами, значит функционирует, далее пытаюсь вызвать импортированые функции warn и info

dWvsnJv.jpg

как видите результат не заставил себя ждать, все довольно просто.

 

Остальные плюшки работают так же хорошо

ps1GvcA.jpg

 

Сорсы можно взять здесь https://gist.github.com/AlexYukikaze/ee8cf9fdf337f3b77565

 

Пользуйтесь, комментируйте, критикуйте. Спасибо за внимание.

Edited by Yukikaze
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

@lportii, сервер запускается непосредственно в самом клиенте игры и слушает указанный вами порт, я не стал заморачиваться написанием клиент под это дело и воспользовался netcat'ом

Почему именно сокеты, а не пайп, потому что я хитрожопый и переодически подключаюсь с планшета и просматриваю лог в реалтайме

Edited by Yukikaze

Share this post


Link to post

Short link
Share on other sites

StranikS_Scan, задам вопрос о том, что уже спрашивал. Можно ли файлы CameraNode.pyc и init.pyc сделать едиными и универсальными, т.е. чтоб были как родные для многих модов, использующих данные файлы. Проблема состоит в том, что при игре на клиенте с минимальным количеством модов (P-MOD, прицел нестандартный, УГН) фпс стабильно был 60-90, но после установки панели повреждений от зайца с заменой вышеуказанных файлов на те, что идут вместе с панелью, фпс  упал до 40-60.

Edited by Farseer

Share this post


Link to post

Short link
Share on other sites

StranikS_Scan, задам вопрос о том, что уже спрашивал. Можно ли файлы CameraNode.pyc и init.pyc сделать едиными и универсальными, т.е. чтоб были как родные для многих модов, использующих данные файлы. Проблема состоит в том, что при игре на клиенте с минимальным количеством модов (P-MOD, прицел нестандартный, УГН) фпс стабильно был 60-90, но после установки панели повреждений от зайца с заменой вышеуказанных файлов на те, что идут вместе с панелью, фпс  упал до 40-60.

 

CameraNode.pyc и Init.pyc - ни как и ни коим образом не связаны с фпс и производительностью. Файл CameraNode.pyc - это самодельный загрузчик модов, а файл Init.pyc - вообще пустой.

Загрузчик модов - это просто загрузчик, он не может быть не универсальным, он при запуске клиента просто перебирает файлы pyc в вашей папке с модами и загружает их в память. Всё больше ни чего он не делает. Он простой как два рубля. Он срабатывает один раз.

 

В твоем случае панель от зайца - это какая панель? Заяц же забросил свой мод.... панель-то наверно старая и кривая не под 0.9.1???... Вот панель наверно и дает тормоза.

Share this post


Link to post

Short link
Share on other sites

@Farseer, CameraNode - загрузчик модов. init - часть загрузчика. Этот файл необходим для последующего import'а модов. Он содержит всего одно слово pass и не делает ничего.

Этт файлы нельзя объеденить. Они и так стандартны для модов.

 

Но некоторые мод-пакеры вносят изменения в эти файлы: добавляют проверки файлов и т.д.

 

@StranikS_Scan, панель от зайца действительно старая - последняя версия вроде как для 0.8.8 была. Дальше её развивали пользователи...

Edited by Azbuka_slovensko

Share this post


Link to post

Short link
Share on other sites

'офтоп'

 

Этт файлы нельзя объеденить

 

можно)))

#CameraNode.py
import BigWorld

class CameraNode(BigWorld.UserDataObject):
    def __init__(self):
        BigWorld.UserDataObject.__init__(self)

import ResMgr
import os
import sys

modsPath = ''
for value in ResMgr.openSection('../paths.xml')['Paths'].values():
    path = value.asString
    if path[2:10] == 'res_mods':
        modsPath = os.getcwd() + path[1:] + '/scripts/client/mods'
        sys.path.append(modsPath)
        break

for name in [value for value in os.listdir(modsPath) if value.endswith('pyc')]:
    name = os.path.splitext(name)[0]
    try:
        __import__(name)
    except Exception as err:
        print '[ERROR] %s -> %s' % (name, err)

теперь "C:\Games\World_of_Tanks\res_mods\0.9.1\scripts\client\mods\__init__.pyc" можно удалять. =) Лоадер весит 1099 байт.

Edited by fecell

Share this post


Link to post

Short link
Share on other sites

CameraNode.pyc и Init.pyc - ни как и ни коим образом не связаны с фпс и производительностью. Файл CameraNode.pyc - это самодельный загрузчик модов, а файл Init.pyc - вообще пустой.

Загрузчик модов - это просто загрузчик, он не может быть не универсальным, он при запуске клиента просто перебирает файлы pyc в вашей папке с модами и загружает их в память. Всё больше ни чего он не делает. Он простой как два рубля. Он срабатывает один раз.

 

В твоем случае панель от зайца - это какая панель? Заяц же забросил свой мод.... панель-то наверно старая и кривая не под 0.9.1???... Вот панель наверно и дает тормоза.

Вот эта панель: http://dwn.wow-clear.ru/DamagePanel_zayaz+maks5189.7z

 

Я помню, когда-то сирмакс говорил о просадках фпс в теме про xvm: мало от флеша, больше от скриптов. Вот и провёл аналогию.

'офтоп'

 

 

можно)))

#CameraNode.py
import BigWorld

class CameraNode(BigWorld.UserDataObject):
    def __init__(self):
        BigWorld.UserDataObject.__init__(self)

import ResMgr
import os
import sys

modsPath = ''
for value in ResMgr.openSection('../paths.xml')['Paths'].values():
    path = value.asString
    if path[2:10] == 'res_mods':
        modsPath = os.getcwd() + path[1:] + '/scripts/client/mods'
        sys.path.append(modsPath)
        break

for name in [value for value in os.listdir(modsPath) if value.endswith('pyc')]:
    name = os.path.splitext(name)[0]
    try:
        __import__(name)
    except Exception as err:
        print '[ERROR] %s -> %s' % (name, err)

теперь "C:\Games\World_of_Tanks\res_mods\0.9.1\scripts\client\mods\__init__.pyc" можно удалять. =) Лоадер весит 1099 байт.

А моды, где есть init.pyc будут работать?

Share this post


Link to post

Short link
Share on other sites

А моды, где есть init.pyc будут работать?

Да. Правда есть одно "но" - только те, названия которых не конфликтуют с системными названиями. Например "stat.pyc". В этом случае его надо просто переименовать, иначе вместо него загружается системная библиотека с таким именем. Принцип в том, что широко распространенный сейчас CameraNode не может без __init__ загрузить моды, а этот может. А самим модам __init__ не важен, они его не используют.

Edited by fecell

Share this post


Link to post

Short link
Share on other sites

WOT Remote Terminal

 

Привет, будь другом поясни пожалуйста как запустить это все, а то я не понимаю :)

Edited by ProstoNoob

Share this post


Link to post

Short link
Share on other sites

 

 

что именно непонятно

Мне кажется, что всё.

 

 

как запустить это все

1. Идём на GitHub, жмём "Download Gist"

2. Достаём example.py и remote.py из архива.

3. Компилируем example.py и remote.py, и копируем .pyc в папку скриптовых модов (World_of_Tanks/res_mods/0.9.1/scripts/mods/ или (World_of_Tanks/res_mods/0.9.1/scripts/client/mods/, точно не помню)

4. Запускаем игру

5. Запускаем терминал  и

nc <ваш_ip> 9999

Оказалось, что всё уже было написано:

 

 

Я создал новый модуль и импортировал функцию create_terminal и еще парочку тестовых, для демонстрации возможностей, затем скомпилировал, запустил клиент игры и уютненький терминал. Далее воспользовавшись утилитой netcat(nc) подключился к серверу

Share this post


Link to post

Short link
Share on other sites

Мне кажется, что всё.

 

 

1. Идём на GitHub, жмём "Download Gist"

2. Достаём example.py и remote.py из архива.

3. Компилируем example.py и remote.py, и копируем .pyc в папку скриптовых модов (World_of_Tanks/res_mods/0.9.1/scripts/mods/ или (World_of_Tanks/res_mods/0.9.1/scripts/client/mods/, точно не помню)

4. Запускаем игру

5. Запускаем терминал  и

nc <ваш_ip> 9999

Оказалось, что всё уже было написано:

 

Ну еще нужно этот "nc" установить, так как он не входит в состав Windows... Как его установить то...

Edited by ProstoNoob

Share this post


Link to post

Short link
Share on other sites

Ну еще нужно этот "nc" установить, так как он не входит в состав Windows...

 

А всё потому что она распространяется под лицензией GPL.

Версию для Windows можно найти на Википедии.

Share this post


Link to post

Short link
Share on other sites

 

А всё потому что она распространяется под лицензией GPL.

Версию для Windows можно найти на Википедии.

 

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

 

И как его ставить, если там пакеты для UNIX систем..

Edited by ProstoNoob

Share this post


Link to post

Short link
Share on other sites

И как его ставить, если там пакеты для UNIX систем..

 

Вот nc111nt.zip

Установка - скопировать nc.exe в папку %WINDIR%. Обычно это C:\Windows\

Edited by Azbuka_slovensko

Share this post


Link to post

Short link
Share on other sites

Вот attachicon.gifnc111nt.zip

Установка - скопировать nc.exe в папку %WINDIR%. Обычно это C:\Windows\

Надеюсь на этом флуд закончится.

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...