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

[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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

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

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

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

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

 

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

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

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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

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

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

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

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

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

Войти

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

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

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...