Перейти к контенту

[CS] Ковыряемся в файлах


Рекомендуемые сообщения

5 часов назад, alexej-oz сказал:

25

Это ограничение на силу отряда, искать в скрипте sim_squad_generic.script, там рядом и формула его подсчёта.

  • Спасибо 1
Ссылка на комментарий
13 часов назад, h0N0r сказал:

Это ограничение на силу отряда, искать в скрипте sim_squad_generic.script, там рядом и формула его подсчёта.

Ох спасибо Тебе ОГРОМНОЕ! Я поменял допустимую силу с 25 на 40, и теперь не вылетает. Ты просто мой спаситель!!!:thank_you:

Ссылка на комментарий

Судя по записям в [xrGame\ActorCondition.cpp], расчеты в движке ссылаются на конфиг ГГ, а значения m_zone_max_power[тип] могут доходить до 1.0.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Как в ЧН определяется защита от физического урона?


Есть старый параметр strike_protection и новый physic_strike_wound_immunity; при одинаковых значениях 0.3 + 0.25 в конфигах комбезов "СЕВА" и Долг-1 (легкий) в описании брони в первом случае 37%, во втором – всего 5%.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Как вернуть возможность спавнить монстров по инфопоршню как в ТЧ?
По типу:
[spawner]
cond = {+info}

Мои попытки ни к чему не привели:
 

Скрытый текст

--[[
Изменения script_version:
    4 - сохранение поля job_online
    5 - сохранение поля was_in_smart_terrain
]]

class "se_monster" (cse_alife_monster_base)
--------------------
function se_monster:__init (section) super (section)
    self.ini = nil
    self.ini_initialized = false

    self.spawner_present = false

    self.smart_terrain_conditions = nil
    self.smart_terrain_conditions_initialized = false

    self.check_distance = false
    self.min_distance   = 150

    -- этот флаг берётся из работы смарта
    -- true     = всегда в онлайне
    -- false    = всегда в офлайне
    -- condlist = условие, которое отпределяет true или false
    -- nil      = смарту всё равно
    self.job_online          = nil
    self.job_online_condlist = nil

    self.squad_id = nil --' Указатель на отряд в котором прописан чувак.

    self.m_registred = false
    self.sim_forced_online = false
end
--------------------
function se_monster:get_ini()
    if not self.ini_initialized then
        self.ini             = self:spawn_ini ()
        self.ini_initialized = true

        self.spawner_present = self.ini:section_exist ("spawner")

        if self.ini ~= nil and self.spawner_present == true then
           if self.ini:line_exist ("spawner", "check_distance") == true then
              self.check_distance = self.ini:r_bool ("spawner", "check_distance")
              if self.check_distance == nil then self.check_distance = false end
              if self.ini:line_exist ("spawner", "min_distance") == true then
                 self.min_distance = self.ini:r_u32 ("spawner", "min_distance")
              end
           end

           if self.min_distance == nil then
              local sys = system_ini()
              if sys ~= nil and sys:line_exist ("alife", "switch_distance") == true then
                 self.min_distance = sys:r_u32 ("alife", "switch_distance") - 50
                 if self.min_distance == nil then
                    self.min_distance = 150
                 else
                    if self.min_distance <= 50 then
                       abort ("SE_MONSTER - SWITCH DISTANCE IS TOO SMALL !!!")
                    end
                 end
              else
                 self.min_distance = 150
              end
           end
        end
    end
end
--------------------
function se_monster:can_switch_offline()
    if self.sim_forced_online == true then
        return false
    end

    if self.job_online_condlist ~= nil then
        return xr_logic.pick_section_from_condlist(db.actor_proxy, self, self.job_online) ~= true
    end

    return cse_alife_monster_base.can_switch_offline(self)
end
--------------------
function se_monster:can_switch_online()
    if self.sim_forced_online == true then
        return true
    end

    if self.job_online_condlist ~= nil then
        return xr_logic.pick_section_from_condlist(db.actor_proxy, self, self.job_online) == true
    end

    if self.ini == nil or self.spawner == nil or self.spawner_present == false then
        return cse_alife_monster_base.can_switch_online(self)
    end

    if db.actor ~= nil and db.actor:alive () == false then
        return self.online
    end

    if self.online == false then
        if db.actor == nil or db.actor:alive () == false then return false end
        
        --если задана дистанция проверки, то проверим.
        if self.check_distance == true then
            --printf ("Check distance")
            --получим позицию.
            local pos = level.vertex_position (self.m_level_vertex_id)
            -- проверим дистанцию до игрока. если меньше требуемой, то от винта
            if pos:distance_to (db.actor:position ()) < self.min_distance then
                --printf ("Check distance 1")
                return false
            end
        end
        
        --все проверки прошли - финал, вызов спавнера
        return xr_spawner.check_spawn (self) and cse_alife_monster_base.can_switch_online (self)

        --return (xr_logic.pick_section_from_condlist(db.actor, self, self.spawner) ~= nil) and    cse_alife_monster_base.can_switch_online(self)
    else
        if db.actor == nil or db.actor:alive () == false then return true end
        if xr_spawner.check_spawn (self) == true then
            return true
        end
        
        if self.check_distance == true then
            local pos = level.vertex_position (self.m_level_vertex_id)
            -- проверим дистанцию до игрока. если больше требуемой, то от винта
            if pos:distance_to (db.actor:position ()) > self.min_distance then
                return false
            end
        end
        return cse_alife_monster_base.can_switch_online (self)
    
        --if xr_logic.pick_section_from_condlist(db.actor, self, self.spawner) ~= nil then
        --    return true
        --end
        --return false
    end
end
function se_monster:switch_online()
    cse_alife_monster_base.switch_online(self)
        if self.squad_id ~= nil then
            local squad = self.board.squads[self.squad_id]
                squad:switch_online(true, self.id)
        end
end
function se_monster:switch_offline()
    cse_alife_monster_base.switch_offline(self)
        if self.squad_id ~= nil then
            local squad = self.board.squads[self.squad_id]
                squad:switch_online(false, self.id)
        end
end
-----------------------
function se_monster:STATE_Write(packet)
    cse_alife_monster_base.STATE_Write (self, packet)

--    if self.m_registred ~= true then
--        return
--    end

    if self.job_online == true then
        packet:w_u8(0)
    elseif self.job_online == false then
        packet:w_u8(1)
    elseif self.job_online == nil then
        packet:w_u8(2)
    else
        packet:w_u8(3)
        packet:w_stringZ(self.job_online_condlist)
    end
    if self.squad_id == nil then
        packet:w_stringZ("nil")
    else
        packet:w_stringZ(tostring(self.squad_id))
    end

    packet:w_bool(self.sim_forced_online)
end
--------------------
function se_monster:STATE_Read(packet, size)
    cse_alife_monster_base.STATE_Read (self, packet, size)

--    if self.m_registred ~= true then
--        return
--    end

    local t = packet:r_u8()

    if t == 0 then
        self.job_online = true
    elseif t == 1 then
        self.job_online = false
    elseif t == 2 then
        self.job_online = nil
    else
        self.job_online_condlist = packet:r_stringZ()
        self.job_online = xr_logic.parse_condlist(nil, "se_monster:STATE_Read", "job_online", self.job_online_condlist)
    end

    if self.script_version >= 7 then
        self.squad_id = packet:r_stringZ()
        if self.squad_id == "nil" or tostring(self.squad_id) == "0" then
            self.squad_id = nil
        end
    end

    if self.script_version >= 8 then
        self.sim_forced_online = packet:r_bool()
    end


    local pos = self.position
    --printf(" mpos[%s][%s][%s]", tostring(pos.x), tostring(pos.y), tostring(pos.z))
end
--------------------
function se_monster:on_before_register()
    self:fill_exclusives()
end
--------------------
function se_monster:on_register()
    cse_alife_monster_base.on_register( self )

    printf("registering monster %s ", self:name())
    self.m_registred = true
    self.board     = sim_board.get_sim_board()
    self.tm        = task_manager.get_task_manager()

    --' Отключаем старый метод выбора смарттеррейнов.
    self:brain():can_choose_alife_tasks(false)

        --' Выбор смарта
        local obj_ini = self:spawn_ini()
        local smart = utils.cfg_get_string(obj_ini, "logic", "smart_terrain", self, false, "", "")
        local smart_obj = self.board:get_smart_by_name(smart)
        if smart_obj == nil then
                return
        end
        alife():object(smart_obj.id):register_npc(self)
end
--------------------
function se_monster:on_unregister()
    local strn_id = self:smart_terrain_id()
    if strn_id ~= 65535 then
        local smart = alife():object(strn_id)
        if smart ~= nil then
            smart:unregister_npc(self)
        end
    end

    cse_alife_monster_base.on_unregister(self)
end
--------------------
function se_monster:on_death(killer)
    cse_alife_monster_base.on_death(self, killer)

    smart_terrain.on_death(self)

    if self.squad_id ~= nil then
        local squad = self.board.squads[self.squad_id]
                squad:on_npc_death(self)
        end
end
--------------------
function se_monster:fill_exclusives()
    self:get_ini()
    self.smart_terrain_conditions             = smart_terrain.read_smart_terrain_conditions( self )

    if self.smart_terrain_conditions then
        for name, condlist in pairs(self.smart_terrain_conditions) do
            smart_terrain.exclusives[name] = (smart_terrain.exclusives[name] or 0) + 1
        end
    end
end
function se_monster:update()
    cse_alife_monster_base.update(self)

    -- Тут мы попробуем вызвать апдейт отряда
    if self.squad_id ~= nil then
        local squad = self.board.squads[self.squad_id]
        if squad ~= nil and squad.commander_id == self.id then
            squad:update()
        end
    end
end

 

 

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

Ссылка на комментарий

Народ, такой вопрос по Faction Commander, я год назад сделал так чтобы при выборе любой группировки стартовал с нулевым рангом, и определённым снаряжением, а сейчас год спустя начал делать такую же версию, но с реплейсером оружия, воткнув туда свои ранги, как задать стартовое снаряжение за опрделённую группировку и сделать чтобы присваивался нулевой ранг ???

Ссылка на комментарий

  

Подскажите почему могут возникать такие вылеты и как фиксить собственно:

Спойлер

! [LUA][ERROR] ERROR: Path between [rad_monolith_perehod] and [yan_zombied_attack] doesnt exist for [12].
 
FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrServerEntities\script_engine.cpp
[error]Line          : 192
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...t.a.l.k.e.r. clear sky\gamedata\scripts\sim_board.script:729: attempt to index local 'smart' (a nil value)
 

stack trace:
0x000000002BF52812 xrCore.dll, _Init_thread_footer + 86 byte(s), D:\a\_work\1\s\src\vctools\crt\vcstartup\src\misc\thread_safe_statics.cpp, 247
0x000000002BF7065F xrCore.dll, xrDebug::backend + 191 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrCore\xrDebugNew.cpp, 178
0x000000002BF70C5F xrCore.dll, xrDebug::fatal + 143 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrCore\xrDebugNew.cpp, 308
0x000000002A8FB10E xrGame.dll, CScriptEngine::lua_pcall_failed + 190 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrServerEntities\script_engine.cpp, 194
0x000000002C4154D0 LuaJIT.dll, wscanf_s + 12486 byte(s)
0x000000002C45355C LuaJIT.dll, wscanf_s + 266578 byte(s)
0x000000002C452606 LuaJIT.dll, wscanf_s + 262652 byte(s)
0x000000002C453306 LuaJIT.dll, wscanf_s + 265980 byte(s)
0x000000002C469910 LuaJIT.dll, wscanf_s + 357638 byte(s)
0x000000002C4159B7 LuaJIT.dll, wscanf_s + 13741 byte(s)
0x000000002C41F24A LuaJIT.dll, wscanf_s + 52800 byte(s)
0x0000000033B1FD55 luabind.dll, luabind::detail::pcall + 101 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\3rd party\luabind\src\pcall.cpp, 40 + 17 byte(s)
0x000000002A94BA86 xrGame.dll, luabind::detail::proxy_member_void_caller<>::~proxy_member_void_caller<> + 50 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\3rd party\luabind\include\luabind\detail\call_member.hpp, 269 + 19 byte(s)
0x000000002A9889BA xrGame.dll, CWrapperAbstractMonster<CSE_ALifeHumanStalker>::update + 54 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrServerEntities\xrServer_script_macroses.h, 171 + 54 byte(s)
0x000000002AB0C86C xrGame.dll, CALifeUpdateManager::update + 540 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\alife_update_manager.cpp, 110 + 235 byte(s)
0x00000000CDC1B2CD xrEngine.exe, mt_Thread + 109 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrEngine\device.cpp, 207
0x000000004ED7514B ucrtbase.dll, o__beginthread + 219 byte(s)
0x000000004F747034 KERNEL32.DLL, BaseThreadInitThunk + 20 byte(s)
0x0000000051162651 ntdll.dll, RtlUserThreadStart + 33 byte(s)

Спойлер

! WARNING: SV: can't find child [wpn_l851449] of parent [wpn_l851449]! Children list:

! ERROR: can't detach independant object. entity[wpn_l851449][1449], parent[wpn_l851449][1449], section[wpn_l85]
 
xrEngine.exe caused an EXCEPTION_ACCESS_VIOLATION in module xrGame.dll at 000000002AD0A240, CUIWindow::Draw()+0032 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\ui\UIWindow.cpp, line 0162
stack trace:
0x000000002AD0A240 xrGame.dll, CUIWindow::Draw + 32 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\ui\UIWindow.cpp, 162
0x000000002ACEF4D5 xrGame.dll, CUIStatic::Draw + 341 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\ui\UIStatic.cpp, 147
0x000000002AD0A256 xrGame.dll, CUIWindow::Draw + 54 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\ui\UIWindow.cpp, 161
0x000000002ACEF4D5 xrGame.dll, CUIStatic::Draw + 341 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\ui\UIStatic.cpp, 147
0x000000002AC56A0C xrGame.dll, CUIZoneMap::Render + 28 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\UIZoneMap.cpp, 81
0x000000002ACB3B0B xrGame.dll, CUIMainIngameWnd::Draw + 891 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\ui\UIMainIngameWnd.cpp, 282
0x000000002AC3E0BD xrGame.dll, CUI::Render + 429 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\UI.cpp, 103
0x000000002AA38061 xrGame.dll, CHUDManager::RenderUI + 81 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\HUDManager.cpp, 271 + 17 byte(s)
0x000000002AA70606 xrGame.dll, CLevel::OnRender + 86 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrGame\Level.cpp, 930
0x00000000CDC1ADD5 xrEngine.exe, CRenderDevice::on_idle + 1893 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrEngine\device.cpp, 344 + 94 byte(s)
0x00000000CDC1A64F xrEngine.exe, CRenderDevice::message_loop + 111 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrEngine\device.cpp, 427
0x00000000CDC1A470 xrEngine.exe, CRenderDevice::Run + 480 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrEngine\device.cpp, 471
0x00000000CDC60308 xrEngine.exe, Startup + 344 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrEngine\x_ray.cpp, 277
0x00000000CDC5FA96 xrEngine.exe, WinMain_impl + 1846 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrEngine\x_ray.cpp, 757
0x00000000CDC5F2F9 xrEngine.exe, WinMain + 9 byte(s), E:\S.T.A.L.K.E.R. Clear Sky\Hike\xray\xrEngine\x_ray.cpp, 808
0x00000000CDC15CBE xrEngine.exe, __scrt_common_main_seh + 262 byte(s), D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl, 288 + 33 byte(s)
0x000000004F747034 KERNEL32.DLL, BaseThreadInitThunk + 20 byte(s)
0x0000000051162651 ntdll.dll, RtlUserThreadStart + 33 byte(s)

 

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

Ссылка на комментарий

Подскажите, как засейвить одиночную логику НПС при переходе их с онлайн в оффлайн?
Кондлисты не работают.

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

Ссылка на комментарий

Форумчане, подскажите пожалуйста, как исправить баг на сброс модификации на кратность прицела у ГП27 и ФН200М. Какие файлы подправить и в чем проблема там?

Ссылка на комментарий

@Norman Eisenherz В Чистом Небе после установки апгрейдов на изменение кратности прицелов на ГП27 и на ФН200М, эффект апгрейда сбивается (то есть визуально кратность прицела становится стоковой) при перезагрузке или установке любой другой модификации, хотя остается отмеченным в описании оружия.

Изменено пользователем NikBulldog
Конкретизация
Ссылка на комментарий

Подтверждаю ошибку для FN2K, G36 и L85.

В нетпакете оружия установленные апгрейды перечислены правильно, так что, видимо, болезнь движковая.

 

Добавил апгрейд оптики в схему СВД: та же проблема.

 

Описание применения апгрейда в движке ЧН/ЗП одинаковое:

Spoiler
[xrGame\WeaponMagazined.cpp]
bool CWeaponMagazined::install_upgrade_impl( LPCSTR section, bool test )
	
	if( IsScopeAttached() )
	{
		//if ( m_eScopeStatus == ALife::eAddonAttachable )
		{
			result |= process_if_exists( section, "scope_zoom_factor", &CInifile::r_float, m_zoom_params.m_fScopeZoomFactor, test );
		}
	}
	else
	{
		if( IsZoomEnabled() )
		{
			result |= process_if_exists( section, "scope_zoom_factor", &CInifile::r_float, m_zoom_params.m_fIronSightZoomFactor, test );
		}
	}

 

 

Ждем более продвинутых моддеров…

Изменено пользователем Norman Eisenherz

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

 

Кое-что нашлось: в ЗП zoom_factor читается движком при загрузке оружия, в ЧН – нет.

Spoiler
[xrGame\Weapon.cpp]
BOOL CWeapon::net_Spawn		(CSE_Abstract* DC)
	
	m_fRTZoomFactor		= m_zoom_params.m_fScopeZoomFactor;	-- только ЗП
	
	iAmmoElapsed		= E->a_elapsed;
	m_flagsAddOnState	= E->m_addon_flags.get();
	m_ammoType		= E->ammo_type;
	

 

 

  • Нравится 2
  • Полезно 2

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Стало быть, без правки движка это исправить невозможно?

До перезагрузки-то распознается вродн как.

Изменено пользователем NikBulldog
Ссылка на комментарий

Здравствуйте, граждане.

Назрел вопрос, хочу в определенный момент (при выдаче задания на зачистку определенного смарта) поссорить гг и группировку отличную от той которая дает задание.

Как это грамотно реализовать и делается ли такое?

@Nachzehrer_SS через файл faction_commander_initial по пути gamedata/script

Изменено пользователем !Stars!
Ссылка на комментарий

@!Stars! есть штатная для ЧН функция установки отношения группировки к игроку, вызывается из кучи мест в логике, например:

%=set_faction_community_to_actor(stalker:enemy)%

Разумеется, никто не запрещает при необходимости вызвать её и из скрипта:

xr_effects.set_faction_community_to_actor(nil, nil, { "stalker", "enemy" })

 

  • Нравится 3
Ссылка на комментарий

@Kirgudu за совет огромное спасибо, но прошу уточнить.

В faction_renegade.ltx установил в expansion установил зачистку смарта.

Я иду в all.spawn, в смарт добавляю логику, в файле логики пишу функцию указанную выше и при получении задания за группировку ренегаты  в данном случае он становится врагом для иной фракции которую укажу так?

Поправьте если не прав.

 

Ссылка на комментарий

@!Stars! выглядит избыточно сложно - с одной стороны. А с другой - цели в секциях expansion конфигов группировок (из первого вопроса было непонятно, что речь идёт именно о них, есть ведь и оторванные от войны группировок задания на захват смартов) выдаются автоматически симуляцией, и врезаться в них не так просто. Да, можно попробовать сделать именно так, только подумать, что именно прописать в логике смарта, какую проверку сделать до того, как запустить функцию.
Более короткая альтернатива - врезаться с условием куда-нибудь в sim_faction_brain_human.faction_brain_human:init_player_task и сделать всё на скриптовом уровне. Но тут уровень владения скриптами в целом и скриптами/логикой симуляции ВГ в частности потребуется изрядный. Войну группировок легко поломать.
Так да, всё вполне возможно.

Изменено пользователем Kirgudu
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...