Jump to content
Korean Random

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


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

320 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

А чем это лучше отдельного модика?

def auto_FlushPythonLog():
    BigWorld.flushPythonLog()
    BigWorld.callback(1.0, auto_FlushPythonLog)

Вот дела, я не знал.

 

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

 

Ладно, сделаем.

 

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

 

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

 

К тому же есть один полезный момент - при запущенном клиенте с realtime-загрузчиком я могу через него сделать обмен данными между средами Ориона и клиента :))))

А можно будет как нибудь, дополнить скрипт, чтобы он прекращал действие полностью, даже если

не было ошибок. Или может внедрить критическую ошибку, чтобы модуль вырубался

полностью (извращение немного..) ничего не придумалось лучше )

Link to comment
Short link
Share on other sites

А можно будет как нибудь, дополнить скрипт, чтобы он прекращал действие полностью, даже если

не было ошибок. Или может внедрить критическую ошибку, чтобы модуль вырубался

полностью (извращение немного..) ничего не придумалось лучше )

Поясни? Выгрузить модуль из памяти или что?

Link to comment
Short link
Share on other sites

Поясни? Выгрузить модуль из памяти или что?

 

Например исполняется:

from Avatar import PlayerAvatar
_vehicle_onEnterWorld = PlayerAvatar.vehicle_onEnterWorld
def __vehicle_onEnterWorld(self, vehicle):
    _vehicle_onEnterWorld(self, vehicle)
    print 'print'
PlayerAvatar.vehicle_onEnterWorld = __vehicle_onEnterWorld

Как остановить, без косяков, исполнение __vehicle_onEnterWorld,

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

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

Как остановить, без косяков, исполнение __vehicle_onEnterWorld,

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

PlayerAvatar.vehicle_onEnterWorld = _vehicle_onEnterWorld
del __vehicle_onEnterWorld
Не?
Link to comment
Short link
Share on other sites

PlayerAvatar.vehicle_onEnterWorld = _vehicle_onEnterWorld
del __vehicle_onEnterWorld
Не?

Это понятно. А если не известно какие процедуры запускались, если их много.

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

 

п.с. а BigWorld.callback луп как остановить?

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

Речь об этом: BigWorld.cancelCallback(some_function) ?

Это сработает только внутри some_function. Из другого модуля это не сделать (могу ошибаться).

Если (в примере выше) __vehicle_onEnterWorld можно увидеть в модуле, то скрытый внутри коллбак  никак.

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

Это понятно. А если не известно какие процедуры запускались, если их много.

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

 

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

def __exec_file(file):
    temp_str = open(file, 'rb').read()
    if len(temp_str) > 0:
        exec temp_str

Ну дык ведь "не правильно", надо чтоб он выполнялся в собственном модуле, для этого заменяем ваш скрипт на вот такой (Учтите писал на коленке! :)))):

modules = []

def __exec_file(file):
    def importCode(code, name, config_name, add_to_sys_modules = 0):
        try:
            module = new_module(name)
            module.__file__ = config_name
            exec code in module.__dict__
        except:
            modulesInfo[name] = None
            return None
        if add_to_sys_modules:
            sys.modules[name] = module
        return module

    from marshal import loads
    temp_str = open(file, 'rb').read()[8:]
    _, name = file.split('\\')
    name, _ = name.split('.')
    modules.append(importCode(loads(temp_str),name,file,0))

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

 

Когда потребуется убить модули, то делаем так:

for value in modules:
    del value

ЗЫ: И еще раз теперь схема "файл - модуль", то прежде чем грузить модуль по новой, надо будет его убивать или сделать алгоритм перезагрузки модуля

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

Это сработает только внутри some_function. Из другого модуля это не сделать (могу ошибаться).

А вот такой пример:

some_function_cb = 0
...
some_function_cb = BigWorld.callback(some_function)
...
if some_function_cb != 0:
    BigWorld.cancelCallback(some_function_cb)
    some_function_cb = 0
Не знаю, насколько этот способ "грамотный", но работает.
Link to comment
Short link
Share on other sites

 

Когда потребуется убить модули, то делаем так:

for value in modules:
    del value

Не работает. останавливается, без ошибок.

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

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

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

Link to comment
Short link
Share on other sites

Не работает. останавливается, без ошибок.

 

в код выше не вникал, но попробуй такие варианты:

for value in enumerate(modules):
    del value

или так:

for value in modules:
    del modules[value]

просто возможно что удаляется не модуль, а лишь индекс этого модуля присваиваемый в цикле переменной value

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

просто возможно что удаляется не модуль, а лишь индекс этого модуля присваиваемый в цикле переменной value

Вот нашел, когда косяк вылез -

Unloading a module from Python is not supported.

 

Вообще много тем с подобными вопросами, но ничего толкового не нашел.

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

Вот нашел, когда косяк вылез -

Unloading a module from Python is not supported.

 

Вообще много тем с подобными вопросами, но ничего толкового не нашел.

 

тогда так:

names = ['httplib', 'dis']
modules = map(__import__, names)
#.......
import sys
del modules
for x in names:
    del sys.modules[x]
print sys.modules # видно что 'httplib' и 'dis' - удалены
print modules # ошибка - такого объекта уже нет


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

в орионе?

Нет, но надеюсь в орионе все скоро будет работать.

Да нет, О тут не причем. Вообще код не рабочий:

 

module = map(__import__,'dis')

 

<<< Traceback (most recent call last):

<<<   File "<string>", line 1, in <module>

<<< ImportError: No module named d

'dis' тут как набор букв получается.

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