Top.Mail.Ru
Ответы

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

Доброе утро дорогие читатели и пользователи платформы mail ru, нужна помощь знающих людей. Играю в Global War на платформе Зов Чернобыля (CoC) и решил добавить в виде аддона экзоскелет от SGM Geoneziz, экзоскелет перенес все сделал, а вот на то чтобы нпс не видели при надевании этой брони главного героя, смог найти лишь в Anomaly, но беда в том, что он видимо не подтягивается и не хочет работать. Я перенес также по попути gamedata/scripts, и все, видимо скрипт нужно переделать под CoC, но как я без понятия, в общем, помогите кто сможет. Внизу код этого скрипта. Я увы не знаю скриптинг и так далее связанное с этим и потому мне сложно понять, что нужно поменять и где

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
 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 
По дате
По рейтингу
Аватар пользователя
Новичок

Для адаптации этого скрипта из Anomaly для использования в Call of Chernobyl будет необходимо внести несколько изменений. Поскольку но же игры использует схожие, но не тот же движок и структуры данных, мы изменим проверки выполнимых функций и исправим логику соответствующим образом для CoC. Основные этапы включают проверку доступной функции и редактуры логики находятся в программе CoC. Наши шаги do adaptation :андации: 1. Проверим наличие функции и объектов, применяемых в Coc. 2. Перепишем функции для использования в CoC. Шаги адаптации 1. Импортирование всех модулей: убедимся, что все используемые модули и библиотека доступны. 2. Адаптация функции ReadOutfitBlindnessKoeff. Если структура INI-файлов схожа, для этой функции не потребуется практически никаких изменений. 3. Адаптация основной логики: в функциях transparent_gg и timer_trans нам нужно убедиться, функции и методы применимы в средах Coc. обновленного: скрипт:

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

Аватар пользователя
Оракул

Перевод скрипта 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)

Аватар пользователя

На SOS