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

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

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

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

 

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

 

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

 

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

 

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

 

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

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

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

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

Share this post


Link to post

Short link
Share on other sites

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

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

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

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

Share this post


Link to post

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

Share this post


Link to post

Short link
Share on other sites

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

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

PlayerAvatar.vehicle_onEnterWorld = _vehicle_onEnterWorld
del __vehicle_onEnterWorld
Не?

Share this post


Link to post

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

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

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

 

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

Edited by lportii

Share this post


Link to post

Short link
Share on other sites

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

Речь об этом?

some_function_cb = BigWorld.callback(some_function)

...

BigWorld.cancelCallback(some_function_cb) ?

Edited by MakcT40

Share this post


Link to post

Short link
Share on other sites

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

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

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

Edited by lportii

Share this post


Link to post

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

Share this post


Link to post

Short link
Share on other sites
for value in modules:

    del value

Вроде пробовал ),  сейчас еще раз затестим.

Share this post


Link to post

Short link
Share on other sites

Вроде пробовал ),  сейчас еще раз затестим.

 

не забудьте обвязать try except: pass

Share this post


Link to post

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
Не знаю, насколько этот способ "грамотный", но работает.

Share this post


Link to post

Short link
Share on other sites

@MakcT40, мне кажется или можно проще:

 

try:

    BigWorld.cancelCallback(some_function_cb)

except:

    pass

 

@RoxXx, добавил видео, потом еще сделаю.

Edited by StranikS_Scan
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

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

for value in modules:
    del value

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

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

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

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

Share this post


Link to post

Short link
Share on other sites

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

 

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

for value in enumerate(modules):
    del value

или так:

for value in modules:
    del modules[value]

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

Edited by fecell

Share this post


Link to post

Short link
Share on other sites

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

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

Unloading a module from Python is not supported.

 

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

Edited by lportii

Share this post


Link to post

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

Share this post


Link to post

Short link
Share on other sites

 

 

Не получается. Стабильно виснет на del.

в орионе?

Share this post


Link to post

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

Share this post


Link to post

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' тут как набор букв получается.

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