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

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


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

@ZeeK работает только на снорках, на остальных мутантах нет, проверено.

Нужен 3D-артист для правок геометрии локаций.
Кто может помочь - пишите в ЛС.

@imcrazyhoudini 

На кровососе работает, но в ЧН он сделан так, что его нужно заменить кодом из ЗП, чтобы не делать такое:

[logic]
active = mob_walker@m1

[mob_walker@m1]
path_walk = mil_mob_walk1
path_look = mil_mob_look1
; combat_ignore_cond = true ; для ЧН-кровососа не работает
friendly = true ; аналог combat_ignore
state = vis ; не переводит в видимое состояние, но без этой строки не будет переключение в след.схему
on_info = {=dist_to_actor_le(20)} mob_jump@go

[mob_jump@go]
path_jump = mil_mob_jump_1
ph_jump_factor = 0.6 ; прыгнет в небо аки Нео
offset = 0,0,0
on_signal = jumped | mob_walker@m2

[mob_walker@m2]
path_walk = mil_mob_walk2
path_look = mil_mob_look2
friendly = true
state = vis

 

  • Спасибо 1

@h0N0r ща проверим...

Кстати, в mob_jump не вижу friendly - не работает что ли?

@h0N0r чудо, пашет.

1. Есть вариант сделать действительно видимым?
2. Возможно объединить это со схемой ремарк? Думал сделать, чтобы он отыграл крик (анимка есть такая), и лишь потом прыгнул.

Нужен 3D-артист для правок геометрии локаций.
Кто может помочь - пишите в ЛС.

22 часа назад, imcrazyhoudini сказал:

Есть вариант сделать действительно видимым?

Берёшь исходники ЗП, что касается bloodsucker адаптируешь под ЧН.

 

У монстров есть mob_remark, примеры ищи по имени схемы в папках configs/scripts.

  • Спасибо 1

@h0N0r mob_remark не работает, прыжок отыгрывает только с mob_walker.
Думал отыграть анимацию вот так:
 

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

[logic]
active = mob_walker@2

 

[mob_walker@2]
path_walk = yan_bloodsucker_normal_spawn_way
path_look = yan_monstr_look
braindead = true
state = vis
on_game_timer = 40 | mob_jump

 

[mob_jump]
path_jump = yan_monstr_look
ph_jump_factor = 0.6
offset = 0,1,0
braindead = true
state = vis
on_signal = jumped | mob_walker

 

[mob_walker]
path_walk = yan_krovo_walk
path_look = yan_krovo_look

В вэйпоинт писал (как и look, так и walk): wp00|s=yan_bloodsucker|a=boloto_attack_link_bone

Анимку как и звук не отыгрывает.

Есть варианты?

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

Нужен 3D-артист для правок геометрии локаций.
Кто может помочь - пишите в ЛС.

16 часов назад, imcrazyhoudini сказал:

Есть варианты?

Забить или экспериментировать. Например, в ТЧ, вместо анимки stand_threaten_0 играется sit_eat_0 для кровососа в ремарке, но удалив в его конфиге строку berserk_always = true, оно работает нормально. Даже его вампирский поцелуй на чистом ТЧ иногда срабатывает, но что-то мешает ему продолжать анимации, и он просто убегает от игрока.

 

Или проиграть нужную анимку функцией (add_animation), да и звук (play_no_feedback), через bind_monster для уник.секции или по стори_ид.

 

Звуки добавлять в mob_sound.script, там просто. К примеру, Сидорович тоже mob, и его реплики там же.

11.05.2023 в 17:11, imcrazyhoudini сказал:

звук не отыгрывает

Выдайте звук в логике отдельно по инфопоршню:

on_info = {+инфопоршень} %=play_sound(звук)%

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

Не соответствует. N6260

Здравствуйте, подскажите какую-то логику, для моих нпсов, заспавнных скриптов. Они враги, но нужно сделать так, чтобы они атаковали с места, на котором заспавнились. А то они убегают, бегают и стреляют. 

God save Hatsune Miku!

@Labadal, может быть подойдёт схема "remark" с анимацией "threat_fire" и actor'ом в качестве цели?

S.T.A.L.K.E.R. CoP Objects  >200 шт  (upd 21.05.26) - Скачать  (Яндекс-диск)

@WinCap не сработало, но сработало другое - кампер с radius = 0, а в качестве path_walk и path_look - взял уже существующие для других нпс)) В общем - работает))

God save Hatsune Miku!

Всем привет! Я играю в мод Faction Commander. Решил попробовать реализовать Наемников как группировку, чтобы хоть как-то можно было спавнить отряды через F2. Много раз у меня это не получалось, но вчера всё таки вышло это сделать. Правда при выборе группировки, особо ничего не происходит, телепорт, как казалось бы на какую точку поставил в скриптах не происходит, ну а вступить естественно никак, квестовых то нет, но через Повелитель ради Бога. И вообщем отряды создаются, но спустя несколько созданий происходит вылет с таким логом:

 

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

! [LUA][ERROR] ERROR: Squad power couldnt be over 25!!!
 
FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\priquel\sources\engine\xrServerEntities\script_engine.cpp
[error]Line          : 180
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...)\s.t.a.l.k.e.r clear sky\gamedata\scripts\_g.script:975: bad argument #2 to 'format' (string expected, got nil)

 

Я через squad_generic прописал создание 6 человек в отряде - этого вполне хватает, чтобы все возможные места npc заняли на точке, но вот это число 25 смущает. И вроде бы как раз 25 отрядов создано уже было, и вылетает после создания 26, но в то же время получилось создать уже 28 отрядов и опять же вылетает с этим же логом. Попробовал заново начать игру, и на болотах сразу отстреляться попробовать, даже и 20 не набралось опять же выкинуло. Может кто подскажет с чем это связано, или где примерно искать вообще откуда исходит эта цифра?

 

Изменено пользователем alexej-oz
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

 

 

Нужен 3D-артист для правок геометрии локаций.
Кто может помочь - пишите в ЛС.

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

Как править подобную проблему?:
ss-imcrazyhoudini-07-29-23-18-32-52-l01-

Нужен 3D-артист для правок геометрии локаций.
Кто может помочь - пишите в ЛС.

  

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

Спойлер

! [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)

 

Нужен 3D-артист для правок геометрии локаций.
Кто может помочь - пишите в ЛС.

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

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

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

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

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

Войти

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

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

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