RolePlay-S

RolePlay-S 0.4.7

NâmBờQuanh

Пользователь
Регистрация
25.09.2024
Темы
0
Сообщения
18
Реакции
4
Возраст
20
Xin chào! Nếu tôi hiểu chính xác thì bạn cần tệp: \Data\Effects\Skill\MissileTypical.json
Sát thương không phải làm bản thân cây cung gây ra mà bắn tên bắn mục tiêu.
Cảm ơn Lãnh chúa, nhờ bạn hướng dẫn mà tôi đã có thể chỉnh sửa sát thương mũi tên, nhưng đáng buồn là tôi không biết nên cân bằng như thế nào, giảm 8 ATK MhLongBow và goblinbow sau đó tăng tỉ lệ 2.143 ATK cho MissileTypical thì sát thương NpcBasicSh của goblinbow đã hoàn hảo nhưng với Lona thì không, Lona đã trở nên quá mạnh. Vì vậy tôi đã sửa lại và tạo thêm các loại NpcBasicSh dành riêng cho cung quái vật và cung người 15 ATK, 18 ATK, 20 ATK, 25 ATK và mọi thứ đã ho àn hảo, bạn nên thử. Cuối cùng tôi lại tìm ra cách cân bằng mới, trong Mhlongbow sửa lại thành *0.8 ATK, trong MissileTypical sửa lại thành +6.4 ATK, sau đó giảm ATK cho goblinbow, chỉ có 1 vấn đề là nếu goblinbow 7 ATK (15 ATK - 8 ATK) thì sát thương mũi tên là 13.4 ATK mạnh hơn 12 ATK (15 * 0.8) nhưng NpcBasicSh thì hoàn hảo, còn nếu goblinbow 5.6 ATK (7 ATK * 0.8) thì sát thương mũi tên hoàn hảo = 12 ATK, nhưng NpcBasicSh lại yếu đi đôi chút, còn Lona thì không khác biệt gì.
 
Последнее редактирование:

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
191
Реакции
102
Возраст
32
Короче, чтоб перезаписать skill'ы которые в json - есть, но в rvdata2 - отсутствуют… Требуется весьма постараться.
Первый, простой способ, который дополняет данные выборочно, отдельными файлами:
$data_SkillName["SKILL"].load_additional_data("#{modFolder}Data/Effects/Skill/SKILL.json")
Уже не подходит. Потому что часть скиллов - не Skills, а arpgskills. «дата скилл нейм» - подходит для скиллов, которые хранятся в skills.rvdata2. Но часть скиллов - есть только в json. Типа, распакованные.
Этот метод - обрабатывает все файлы в папке data/effects/skill мода. За раз.
После него метод через SkillName (для навыков, которые Лона может изучить)- уже не требуется. Только если нужно перезаписать откуда-то из особого места, из другой папки, итд…
Еще, важно, что файлы нужны целиком. Копируете файл навыка, и меняете то, что нужно, остальное оставляя прежним. В особенности - нельзя трогать «item_name».
С «load_additional_data» - файлы в папке мода можно хранить не целиком, по крайней мере, для состояний или предметов, а только изменяемые значения.
Но с навыками - нужно хранить целиком.
1727964008502.png

ПС. Если оригинальная функция без self до названия - то метод подгрузки дополнения к ней - проще:
1727963713294.png
После этого кидаете все файлы навыков которые вы изменили - в папку data/effects/skill - в папке мода, и оно автоматически заменится.
Где-то ранее я кидал ссыль на свою сборку, там все это есть в виде кода мода, который работает(?) и что-то меняет.
 
Последнее редактирование:

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
0
Сообщения
229
Реакции
236
Короче, чтоб перезаписать skill'ы которые в json - есть, но в rvdata2 - отсутствуют… Требуется весьма постараться.
Первый, простой способ, который дополняет данные выборочно, отдельными файлами:
$data_SkillName["SKILL"].load_additional_data("#{modFolder}Data/Effects/Skill/SKILL.json")
Уже не подходит. Потому что часть скиллов - не Skills, а arpgskills. «дата скилл нейм» - подходит для скиллов, которые хранятся в skills.rvdata2. Но часть скиллов - есть только в json. Типа, распакованные.
Этот метод - обрабатывает все файлы в папке data/effects/skill мода. За раз.
После него метод через SkillName (для навыков, которые Лона может изучить)- уже не требуется. Только если нужно перезаписать откуда-то из особого места, из другой папки, итд…
Еще, важно, что файлы нужны целиком. Копируете файл навыка, и меняете то, что нужно, остальное оставляя прежним. В особенности - нельзя трогать «item_name».
С «load_additional_data» - файлы в папке мода можно хранить не целиком, по крайней мере, для состояний или предметов, а только изменяемые значения.
Но с навыками - нужно хранить целиком.
1727964008502.png

ПС. Если оригинальная функция без self до названия - то метод подгрузки дополнения к ней - проще:
1727963713294.png
После этого кидаете все файлы навыков которые вы изменили - в папку data/effects/skill - в папке мода, и оно автоматически заменится.
Где-то ранее я кидал ссыль на свою сборку, там все это есть в виде кода мода, который работает(?) и что-то меняет.
Привет! Я посмотрел все твои сообщения и архив. Ничего не понял, но было очень интересно.) Сейчас буду разбираться и постепенно переносить мод. Так же попросил помощи у Экмы, так что, рано или поздно, наверное что-нибудь получится.
Самая большая проблема в том, что у меня слишком много файлов и они все цепляют друг друга, ну почти все, и мне нужно как-то с самого начала постараться все это организовать правильно.
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
191
Реакции
102
Возраст
32
Я так понял alias method - переименовывает (временно, пока работает код мода) функцию. И после этого, наша собственная функция с тем же названием, становится как бы основной, и внутри нее - можно вызвать переименованную оригинальную функцию. Если мы вызовем переименованную функцию в начале нашей - то наша функция сначала выполнит оригинальную, а потом начнет работать ее код. Это убирает необходимость дублировать код оригинальный и после него писать что-то еще в ту же функцию. Оригинальный код - вызывается за счет вызова переименованной функции.
Если мы в нашей функции вызовем оригинальную в конце, то сначала выполнится код нашей функции, а потом сработает переименованная оригинальная.
И так как оригинальную функцию мы переименовали, то для следующего мода - наша функция станет как бы оригинальной.
И он, следующий мод, если повторит наш алгоритм, то выполнит за одно - нашу функцию, а наша выполнит за одно - оригинальную. Это способ, чтоб не переписывать оригинальную функцию в файлах игры, и при этом цеплять к ней свой код дополнительно.

И так как мододелы не подумали о других мододелах, то они все использую копипасту, и переименовывают функцию в одно и то же имя. И все идет по одному месту... Ведь в итоге, получается что следующий мод переименовал функцию - в то же имя, которое эта функция вызывает внутри себя, ведь она переименовала оригинальную функцию в то же имя… И внутри нее вызов переименованной оригинальной функции, но после того, как кто-то переименовал и эту функцию в то же имя… Появится ипический цикл!!!!! Ну или одна из функций - не сработает.
Чтоб цепочка не прерывалась - нужно чтоб каждый мод в сборке производил переименование - уникальным образом. И тогда код будет работать из всех модов (по крайней мере в большей степени чем раньше. Ведь есть глобальные переменные, общие данные, и их перезапись - работает в общем на всю игру, и тогда один код сделает что-то а потом другой - другое, отменив первого…).

А еще способ с переименованием - упрощает переход на новую версию игры. Ведь как оно переименовывало функцию в старой версии, так же ее переименует в новой. Ведь наш мод не трогает код функции из игры, он лишь её переименовывает и вызывает. И ее код, будучи не задетым модом, поменяется на код из новой версии. То есть наш код как ранее вызывал функцию 0.9.2.0.3… точно так же, даже если мы ничего не перепишем, будет вызывать ту же функцию но 0.9.3.0…
И значит, менять в коде мода при переходе на новую версию - придется гораздо меньше. Не придется сидеть и сравнивать построчно - что изменилось…
 
Последнее редактирование:

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
0
Сообщения
229
Реакции
236
Я так понял alias method - переименовывает (временно, пока работает код мода) функцию. И после этого, наша собственная функция с тем же названием, становится как бы основной, и внутри нее - можно вызвать переименованную оригинальную функцию. Если мы вызовем переименованную функцию в начале нашей - то наша функция сначала выполнит оригинальную, а потом начнет работать ее код. Это убирает необходимость дублировать код оригинальный и после него писать что-то еще в ту же функцию. Оригинальный код - вызывается за счет вызова переименованной функции.
Если мы в нашей функции вызовем оригинальную в конце, то сначала выполнится код нашей функции, а потом сработает переименованная оригинальная.
И так как оригинальную функцию мы переименовали, то для следующего мода - наша функция станет как бы оригинальной.
И он, следующий мод, если повторит наш алгоритм, то выполнит за одно - нашу функцию, а наша выполнит за одно - оригинальную. Это способ, чтоб не переписывать оригинальную функцию в файлах игры, и при этом цеплять к ней свой код дополнительно.

И так как мододелы не подумали о других мододелах, то они все использую копипасту, и переименовывают функцию в одно и то же имя. И все идет по одному месту... Ведь в итоге, получается что следующий мод переименовал функцию - в то же имя, которое эта функция вызывает внутри себя, ведь она переименовала оригинальную функцию в то же имя… И внутри нее вызов переименованной оригинальной функции, но после того, как кто-то переименовал и эту функцию в то же имя… Появится ипический цикл!!!!! Ну или одна из функций - не сработает.
Чтоб цепочка не прерывалась - нужно чтоб каждый мод в сборке производил переименование - уникальным образом. И тогда код будет работать из всех модов (по крайней мере в большей степени чем раньше. Ведь есть глобальные переменные, общие данные, и их перезапись - работает в общем на всю игру, и тогда один код сделает что-то а потом другой - другое, отменив первого…).

А еще способ с переименованием - упрощает переход на новую версию игры. Ведь как оно переименовывало функцию в старой версии, так же ее переименует в новой. Ведь наш мод не трогает код функции из игры, он лишь её переименовывает и вызывает. И ее код, будучи не задетым модом, поменяется на код из новой версии. То есть наш код как ранее вызывал функцию 0.9.2.0.3… точно так же, даже если мы ничего не перепишем, будет вызывать ту же функцию но 0.9.3.0…
И значит, менять в коде мода при переходе на новую версию - придется гораздо меньше. Не придется сидеть и сравнивать построчно - что изменилось…
1727983827546.png
 

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
191
Реакции
102
Возраст
32
alias_method :load_mod_database_CS, :load_mod_database

Расшифровываем:
Считать «load_mod_database» как «load_mod_database_CS».

Естественно нельзя менять «load_mod_database», это указание на существующую функцию, которую нужно переименовать.
Нет, так-то, его можно менять. Но только на другую существующую функцию. И писать команду переименования там, где функцию можно вызвать без префикосв. То есть, в том же классе, или модуле, что и функция.
И нужно понимать, что это другая функция, а не «load_mod_database».
А alias_method - это собственно метод. Название операции переименования, назовем ее так. Тоже нельзя менять, иначе команда не будет запущена, а случится ошибка, или еще что. Но да, этот метод применим к любой (почти?) функции в коде.

На данный момент, после выполнения команды «alias_method» в коде как бы вообще отсутствует функция «load_mod_database», вместо нее - «load_mod_database_CS» с кодом который был в «load_mod_database». Но все остальные функции и работа игры - пытается в нужное время и место вызвать «load_mod_database», которой уже нету.
Мы как бы заархивировали функцию под новое имя, и это имя еще нигде никто не вызывает и не трогает, оно просто висит в коде.

(Хотя, возможно, что алиас метод - не переименовывает, а создает копию «временную» этой функции, но под другим именем, а оригинальную мы перезаписываем, ибо она есть в моде под обычным названием (но с нашим кодом) буквально сразу после алиас метода. Но пока мы действуем правильно, результаты нашей работы, вне зависимости от того что именно алиас метод делает - не изменятся. Но интересно. Надо бы поэкспериментировать с алиас методом, намеренно косячить, чтоб посмотреть что получится…)

После этого мы создаем снова, с нуля, функцию с именем «load_mod_database», которую будут вызывать другие функции по имени, думая, что это оригинальная функция, и пишем в нее все что нам хочется. Она становится типа, не поверх оригинальной функции из игры, а вместо нее.

И потом внутри новой «load_mod_database», в которой - наш код, мы в любом удобном месте, и удобным нам способом - вызываем «load_mod_database_CS», то есть, оригинальную функцию, которую (виртуально) переименовали. И таким образом, сработает оригинальная функция, а потом, или до нее, уже наш код. И в сам код функции теперь не надо лезть. Вообще. Наш код в папке модов, а та функция в папке игры, и осталась без изменений. Если автор игры ее изменит, то мы будем тем же кодом переименовывать новую версию функции, и так же ее вызывать.

Следующий мод который так сделает - переименует уже наш «load_mod_database», ведь оригинальная «load_mod_database» уже «load_mod_database_CS». И следующий мод, сделает свой код, вызовет нашу функцию, она сделает свой код, и вызовет оригинальную функцию. Но только если все переименования - уникальные.

Все верно. ОбамаБайден все правильно сказал.
А наши мододелы - забили на уникальность. И переименовывают - по шаблону… А функции с одинаковыми названиями - перезаписывают друг друга…
1727991259371.png

«Зеленая» функция - это просто для наглядности. Так-то она находится в коде игры, а не в коде мода. В коде мода она лишь чтоб я видел рядом ее код. И потому она закомментирована.
 
Последнее редактирование:

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
191
Реакции
102
Возраст
32
С rvdata… (я не особо c ними разбираюсь, ибо работал с скриптами и json файлами, ведь у меня нету редактора игрового, только Notepad++…)
Но что я увидел и понял, просто из кода игры:

Есть функция «load_normal_database»...
1728034667336.png
В оригинале load_mod_database - так-то вообще пустая. Но зато она вызывается после загрузки данных из rvadata, в удобном месте внутри «load_normal_database», и значит туда можно цеплять (через алиас метод) свой код, связанный с данными. (Алиас метод позволяет прицепить новый код к любой существующей функции но либо ДО нее, либо ПОСЛЕ, но не в середину. Так что использовать лучше алиас метод на «load_mod_database», а не на основную «load_normal_database»...)
Например сделать так, по образцу из «load_normal_database», но с другими местами для файлов:
mod_name = "RolePlay"
modFolder = "ModScripts/_Mods/#{mod_name}"
$data_armors = load_data("#{modFolder}/Data/Armors.rvdata2")
$data_weapons = load_data("#{modFolder}/Data/Weapons.rvdata2")
# ИТД… А затем заново запустить парочку функций:
load_items_to_ItemHash #Заново придется вызвать… Ведь оно делает дата нейм, из обычных дата арморс и веапонс, а мы их изменили… И значит нужно запустить заново…
load_itemconfigs #Заново придется вызвать… Ведь оно тоже работает с [$data_items,$data_weapons,$data_armors,$data_states,$data_skills,$data_actors,$data_classes], а мы до этого их поменяли…


1728033322522.png

Но это простой способ, который полностью меняет Armors.rvdata2, используемый в игре на тот что лежит в папке мода.
По хорошему, надо чтоб в вашем файле были только ваши изменения… И не полностью перезаписывать, а конкретизировать, какая именно броня/оружие/предмет (итд) будет перезаписана, или добавлена.
А потом уже вызывать «load_items_to_ItemHash» (и/или иной… В зависимости от ваших изменений) и «load_itemconfigs»
Но это уже будет заметно сложнее… Полная перезапись всегда - проще…

У меня в сборке есть мод «Rus Graphics» - там произведена замена графики из официальной русификации - так, будто это мод, чтоб можно было отключить в Nyx. И чтоб графика заменялась только если стоит в настройках - RUS.
Ruby:
class << Bitmap
    alias_method :alias_new_rus_gr, :new unless method_defined?(:alias_new_rus_gr)
    def new(*args)
        modPath = "ModScripts/_Mods/Rus Graphics/"
        defultPath = args[0]
        if $lang == "RUS"
            args[0] = modPath+defultPath if args[0][0, 8] == "Graphics" || args[0][0, 8] == "Sprite"
        end
        alias_new_rus_gr(*args)
        rescue
        args[0] = defultPath
        alias_new_rus_gr(*args)
    end

end
 
Последнее редактирование:

rrgecd

Новичок
Регистрация
29.09.2024
Темы
0
Сообщения
3
Реакции
1
Возраст
24
Постояно игру крашит, что делать?
 

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
0
Сообщения
229
Реакции
236
С rvdata… (я не особо c ними разбираюсь, ибо работал с скриптами и json файлами, ведь у меня нету редактора игрового, только Notepad++…)
Но что я увидел и понял, просто из кода игры:

Есть функция «load_normal_database»...
1728034667336.png
В оригинале load_mod_database - так-то вообще пустая. Но зато она вызывается после загрузки данных из rvadata, в удобном месте внутри «load_normal_database», и значит туда можно цеплять (через алиас метод) свой код, связанный с данными. (Алиас метод позволяет прицепить новый код к любой существующей функции но либо ДО нее, либо ПОСЛЕ, но не в середину. Так что использовать лучше алиас метод на «load_mod_database», а не на основную «load_normal_database»...)
Например сделать так, по образцу из «load_normal_database», но с другими местами для файлов:
mod_name = "RolePlay"
modFolder = "ModScripts/_Mods/#{mod_name}"
$data_armors = load_data("#{modFolder}/Data/Armors.rvdata2")
$data_weapons = load_data("#{modFolder}/Data/Weapons.rvdata2")
# ИТД… А затем заново запустить парочку функций:
load_items_to_ItemHash #Заново придется вызвать… Ведь оно делает дата нейм, из обычных дата арморс и веапонс, а мы их изменили… И значит нужно запустить заново…
load_itemconfigs #Заново придется вызвать… Ведь оно тоже работает с [$data_items,$data_weapons,$data_armors,$data_states,$data_skills,$data_actors,$data_classes], а мы до этого их поменяли…


1728033322522.png

Но это простой способ, который полностью меняет Armors.rvdata2, используемый в игре на тот что лежит в папке мода.
По хорошему, надо чтоб в вашем файле были только ваши изменения… И не полностью перезаписывать, а конкретизировать, какая именно броня/оружие/предмет (итд) будет перезаписана, или добавлена.
А потом уже вызывать «load_items_to_ItemHash» (и/или иной… В зависимости от ваших изменений) и «load_itemconfigs»
Но это уже будет заметно сложнее… Полная перезапись всегда - проще…

У меня в сборке есть мод «Rus Graphics» - там произведена замена графики из официальной русификации - так, будто это мод, чтоб можно было отключить в Nyx. И чтоб графика заменялась только если стоит в настройках - RUS.
Ruby:
class << Bitmap
    alias_method :alias_new_rus_gr, :new unless method_defined?(:alias_new_rus_gr)
    def new(*args)
        modPath = "ModScripts/_Mods/Rus Graphics/"
        defultPath = args[0]
        if $lang == "RUS"
            args[0] = modPath+defultPath if args[0][0, 8] == "Graphics" || args[0][0, 8] == "Sprite"
        end
        alias_new_rus_gr(*args)
        rescue
        args[0] = defultPath
        alias_new_rus_gr(*args)
    end

end
Привет!) Ниче не понял, но как всегда, оч интересно. А я сейчас мод полностью в API пытаюсь перенести, а именно - переношу черты, перенес уже ~2%. Оказывается, .rvdata2 вообще в этом случае не нужен, можно все делать используя только .rb и .json. Справа штука которая их вытаскивается, слева то как должна выглядеть черта вне Мейкера. (Да, у меня все интерфейсы везде темные.)) Белые интерфейсы меня буквально уничтожают, ну то есть мои глаза. Это одна из причин, почему я не люблю Мейкер.)

1728059229484.png
 
Последнее редактирование:

Lazi Ness

Модостроитель
Автор модов
Регистрация
29.05.2024
Темы
0
Сообщения
229
Реакции
236
Постояно игру крашит, что делать?
Привет! Убедиться, что версия игры подходит версии мода. И что сама игра скачана из нормального источника. И что ты просто кидаешь мод в корень игры с заменой.
 

rrgecd

Новичок
Регистрация
29.09.2024
Темы
0
Сообщения
3
Реакции
1
Возраст
24
Привет! Убедиться, что версия игры подходит версии мода. И что сама игра скачана из нормального источника. И что ты просто кидаешь мод в корень игры с заменой.
Я все так делаю, крашит и всё
 
Последнее редактирование:

AleDerXan

Модостроитель
Автор модов
Регистрация
20.06.2024
Темы
6
Сообщения
191
Реакции
102
Возраст
32
А без мода - работает?
 
Сверху Снизу