Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Скрипт от Anomaly на CoC перевести

Егор Галиуллин Ученик (177), закрыт 3 недели назад
Доброе утро дорогие читатели и пользователи платформы mail ru, нужна помощь знающих людей. Играю в Global War на платформе Зов Чернобыля (CoC) и решил добавить в виде аддона экзоскелет от SGM Geoneziz, экзоскелет перенес все сделал, а вот на то чтобы нпс не видели при надевании этой брони главного героя, смог найти лишь в Anomaly, но беда в том, что он видимо не подтягивается и не хочет работать. Я перенес также по попути gamedata/scripts, и все, видимо скрипт нужно переделать под CoC, но как я без понятия, в общем, помогите кто сможет. Внизу код этого скрипта. Я увы не знаю скриптинг и так далее связанное с этим и потому мне сложно понять, что нужно поменять и где
 function ReadOutfitBlindnessKoeff(section) 
if ini_sys:line_exist(section,"npc_blindness_koeff") then
return ini_sys:r_float(section,"npc_blindness_koeff")
else
return 80
end
end


function transparent_gg()
local range1, id, obj_around, alife_obj, dist_act_npc
local outfit_in_slot=db.actor:item_in_slot(7)
if db.actor == nil then
return nil
end
if db.actor:item_in_slot(7) == nil then
range1 = 80
elseif outfit_in_slot~=nil and ReadOutfitBlindnessKoeff(outfit_in_slot:section())>0.0 then
range1 = ReadOutfitBlindnessKoeff(outfit_in_slot:section())
else
range1 = 80
end

for id = 1, 65534 do
obj_around = level.object_by_id(id)
if obj_around ~= nil and IsStalker(obj_around) then
alife_obj = alife_object(id)
if alife_obj then
dist_act_npc = db.actor:position():distance_to(alife_obj.position)
end
if dist_act_npc <= 120 then
if obj_around then
obj_around:set_range(range1)
end
else
if obj_around then
obj_around:set_range(80)
end
end
end
end
end

function timer_trans()
timer_transparent = timer_transparent + 1
if timer_transparent >= 50 then
timer_transparent = 0
transparent_gg()
end
end
Лучший ответ
olimchik Мастер (1151) 4 недели назад
Для адаптации этого скрипта из Anomaly для использования в Call of Chernobyl будет необходимо внести несколько изменений. Поскольку но же игры использует схожие, но не тот же движок и структуры данных, мы изменим проверки выполнимых функций и исправим логику соответствующим образом для CoC. Основные этапы включают проверку доступной функции и редактуры логики находятся в программе CoC. Наши шаги do adaptation :андации: 1. Проверим наличие функции и объектов, применяемых в Coc. 2. Перепишем функции для использования в CoC. Шаги адаптации 1. Импортирование всех модулей: убедимся, что все используемые модули и библиотека доступны. 2. Адаптация функции ReadOutfitBlindnessKoeff. Если структура INI-файлов схожа, для этой функции не потребуется практически никаких изменений. 3. Адаптация основной логики: в функциях transparent_gg и timer_trans нам нужно убедиться, функции и методы применимы в средах Coc. обновленного: скрипт:

 local timer_transparent = 0 

function ReadOutfitBlindnessKoeff(section)
if ini_sys:line_exist(section, "npc_blindness_koeff") then
return ini_sys:r_float(section, "npc_blindness_koeff")
else
return 80
end
end

function transparent_gg()
local range1, id, obj_around, alife_obj, dist_act_npc
local outfit_in_slot = db.actor:item_in_slot(7)
if db.actor == nil then
return nil
end
if db.actor:item_in_slot(7) == nil then
range1 = 80
elseif outfit_in_slot ~= nil and ReadOutfitBlindnessKoeff(outfit_in_slot:section()) > 0.0 then
range1 = ReadOutfitBlindnessKoeff(outfit_in_slot:section())
else
range1 = 80
end

for id = 1, 65534 do
obj_around = level.object_by_id(id)
if obj_around ~= nil and IsStalker(obj_around) then
alife_obj = alife_object(id)
if alife_obj then
dist_act_npc = db.actor:position():distance_to(alife_obj.position)
end
if dist_act_npc <= 120 then
if obj_around then
obj_around:set_range(range1)
end
else
if obj_around then
obj_around:set_range(80)
end
end
end
end
end

function timer_trans()
timer_transparent = timer_transparent + 1
if timer_transparent >= 50 then
timer_transparent = 0
transparent_gg()
end
end

-- Регистрация функций для таймера (если используется в CoC)
function on_game_update()
timer_trans()
end

-- Регистрация функции обновления игры
if game_events then
game_events.on_game_update:add(on_game_update)
end
1. Регистрация функции обновления: Убедитесь, что функция on_game_update правильно зарегистрирована в системе событий CoC. Это может потребовать модификации существующего скрипта или добавления нового обработчика событий.
2. Проверка методов: Убедитесь, что все используемые методы, такие как level.object_by_id, db.actor :position, и другие, доступны и работают в CoC.

Дополнительные шаги

Если скрипт не работает после внесения изменений, выполните следующие шаги:

1. Проверка ошибок: Проверьте журнал ошибок игры, чтобы увидеть, какие функции или методы вызывают проблемы.
2. Отладка: Временно добавьте дополнительные сообщения об ошибках и отладочные сообщения в ключевых точках скрипта, чтобы лучше понять, где возникают проблемы.

Этот подход должен помочь вам адаптировать скрипт из Anomaly для использования в Call of Chernobyl (CoC).
Егор ГалиуллинУченик (177) 4 недели назад
on_game_update ее в скриптах Глобал Вара нет в целом в скриптах.Насчте этих: level.object_by_id, db.actor :position - они имеются
olimchikМастер (1151) 4 недели назад
Поскольку в Global War нет функции on_game_update, придется использовать другой способ для вызова функции timer_trans() периодически. Один из способов — это использование встроенного таймера в Lua, который будет вызывать функцию timer_trans() через определенные промежутки времени.


Объяснение

1. Функция start_timer: Эта функция запускает бесконечный цикл, который инкрементирует счетчик и вызывает timer_trans() каждые 50 итераций. Использование coroutine.yield() позволяет периодически приостанавливать выполнение функции для других операций.
2. Корутину co: Создается корутина на основе функции start_timer. Корутину можно возобновлять в основном цикле игры.
olimchikМастер (1151) 4 недели назад
3. Функция update: Функция для возобновления выполнения корутины. Она должна вызываться в основном цикле игры для выполнения таймера.
4. Основной цикл игры: В основном цикле игры вызывается функция update(), которая возобновляет выполнение корутины и обеспечивает периодическое выполнение функции timer_trans().

Этот подход позволяет адаптировать скрипт к Global War без использования on_game_update и обеспечивает вызов функции timer_trans() через определенные промежутки времени.
Егор Галиуллин Ученик (177) olimchik, внес как на фото, сейчас гляну
olimchikМастер (1151) 4 недели назад
увы.. больше идеи у меня нет
Егор Галиуллин Ученик (177) olimchik, Может не все есть в гв или другое название. Может проще папку скриптов скинуть от гв ?
Егор ГалиуллинУченик (177) 4 недели назад
Если можно, то могли бы в вк поговорить https://vk.com/df57545f
olimchikМастер (1151) 4 недели назад
https://disk.yandex.ru/d/x2UijeN8NedAig

попробуйте эту должно сработать
Егор Галиуллин Ученик (177) olimchik, Хорошо, сейчас испробую
Егор ГалиуллинУченик (177) 4 недели назад
 Expression    :   
 Function      : CScriptEngine::lua_error  
 File          : ..\xrServerEntities\script_engine.cpp  
 Line          : 189  
 Description   : fatal error  
 Arguments     : LUA error: ...k.e.r.- global war\gamedata\scripts\smart_terrain.script:88: attempt to call field 'add_smart_terrain' (a nil value)  
   
 stack trace:  
   
 0023:00D9399C xrCore.dll, xrDebug::fatal()  
 0023:0CB9AA0B xrGame.dll, CDialogHolder::IgnorePause()  
 0023:0CB9A716 xrGame.dll, CDialogHolder::IgnorePause()  
 0023:0CB86B83 xrGame.dll, CDialogHolder::IgnorePause()  
 0023:77AD12C0 ntdll.dll, RtlQueryPerformanceCounter()  
 0023:00D957C7 xrCore.dll, str_container::dock()  
 0023:0CC598A9 xrGame.dll, CDialogHolder::IgnorePause()  
 0023:0CC597E0 xrGame.dll, CDialogHolder::IgnorePause() 
Егор ГалиуллинУченик (177) 3 недели назад
Тута?))
Остальные ответы
John Smith Гуру (4748) 1 месяц назад
На SOS
Егор ГалиуллинУченик (177) 1 месяц назад
Ничего не понял..
Егор Галиуллин, Для адаптации скрипта, использующегося в моде Anomaly, к игре Зов Чернобыля (Call of Chernobyl, CoC), нужно внести несколько изменений в зависимости от различий в API и логике работы между этими модами. Давайте попробуем разобраться с вашим скриптом. Инициализация переменных и методов: Убедитесь, что все используемые в скрипте методы и переменные существуют и работают в CoC. Секция npc_blindness_koeff: Убедитесь, что в файле конфигурации (ini-файле) вашего экзоскелета присутствует эта секция с нужными параметра ми Объекты и методы: Некоторые методы и классы могут отличаться между Anomaly и CoC. Проверим, существуют ли они в CoC и правильно ли вызываются.
Инспектор Жопидý Оракул (50501) 4 недели назад
Перевод скрипта Anomaly для CoC
Скрипт, который вы предоставили, реализует скрытность игрока от NPC при надевании определенной брони. Он делает это, изменяя видимость игрока для NPC.
Вот как переделать скрипт для CoC:
1. Создание скрипта в CoC
• Создайте файл с именем transparent_gg.script в папке gamedata/scripts вашей игры CoC.
• Откройте этот файл в текстовом редакторе.
2. Замена функций
• ReadOutfitBlindnessKoeff(): Эта функция должна быть заменена на функцию из CoC, которая читает значение коэффициента невидимости из конфигурационного файла брони.
o Например, если вы сохранили коэффициент в секции [exoskeleton_name] с ключом npc_blindness_koeff, замените функцию на:
• function ReadOutfitBlindnessKoeff(section)
• return ini_sys:r_float(section, "npc_blindness_koeff") or 80
• end

• IsStalker(): Эта функция должна быть заменена на функцию из CoC, которая проверяет, является ли объект NPC.
o Например, в CoC можно использовать функцию object.is _actor():
• function IsStalker(obj_around)
• return not obj_around:is_actor() and obj_around:is_alive()
• end

3. Замена переменных
db.actor : В CoC доступ к игроку осуществляется через переменную game.actor .
• level.object_by_id(): Эта функция остается без изменений, но помните, что в CoC доступ к объектам осуществляется через переменную level.
4. Модификация логики
• timer_transparent: Используйте таймер для вызова функции transparent_gg() в нужное время. В CoC таймеры работают немного по-другому.
o Добавьте в код вызов функции game.add_timer() для запуска таймера.
o Замените timer_transparent на переменную таймера в CoC.
o Убедитесь, что функция transparent_gg() правильно обновляет таймер.
Полный код для CoC:
function ReadOutfitBlindnessKoeff(section)
return ini_sys:r_float(section, "npc_blindness_koeff") or 80
end

function IsStalker(obj_around)
return not obj_around:is_actor() and obj_around:is_alive()
end

function transparent_gg()
local range1, id, obj_around, alife_obj, dist_act_npc
local outfit_in_slot = game.actor :item_in_slot(7)

if outfit_in_slot == nil then
range1 = 80
elseif outfit_in_slot ~= nil and ReadOutfitBlindnessKoeff(outfit_in_slot:section()) > 0.0 then
range1 = ReadOutfitBlindnessKoeff(outfit_in_slot:section())
else
range1 = 80
end

for id = 1, 65534 do
obj_around = level.object_by_id(id)
if obj_around ~= nil and IsStalker(obj_around) then
alife_obj = alife_object(id)
if alife_obj then
dist_act_npc = game.actor :position():distance_to(alife_obj.position)
end
if dist_act_npc <= 120 then
if obj_around then
obj_around:set_range(range1)
end
else
if obj_around then
obj_around:set_range(80)
end
end
end
end
end

function timer_trans()
transparent_gg()
end

game.add_timer("timer_trans", 0.1, true, timer_trans)
Егор ГалиуллинУченик (177) 4 недели назад
Постаивл ваш, чуть лучше стали вроде не замечать, но все равно херачат по мне. Хоть и не всегда и не постоянно
Похожие вопросы