Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Общие вопросы и ответы
denis2000Дата: Сб, 15.06.2013, 11:51 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Помощь тем кто хочет знать больше о игре и модах

Если у вас появились вопросы по модостроению в игре S.T.A.L.K.E.R. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]
[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Код
function abort(fmt, ...)
                     local reason = string.format(fmt, ...)
                     error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Код
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Код
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


Посты, для которых есть свои категории, из этой темы будут удаляться или перемещаться в соответсвующую тему. Персональных извещений в ЛС о переносе\удалении поста не будет, ищите сами. Учитывайте, что в системах Ucoz тема не обновляется в статистике при переносе поста.
Посты, написанные здесь-же после переноса, будут расцениваться как кросспостинг, со всеми вытекающими


[cut noguest=Первый юбилей нашей темы]

Здравствуйте господа модостроители, и все так или иначе причастные к этому.
Нашей теме исполнился 1 год.
От души поздравляю Всех Вас дорогие друзья, творческих успехов.
Хочу так же выразить отдельную благодарность denis2000 и ХОВАН.

tracker 23.06.11



[/cut]
 
shanseДата: Сб, 17.08.2013, 15:05 | Сообщение # 151
Отмычка
Пользователи
Сообщений: 25
Награды: 0
Репутация: [ 0 ]

подскажите, плз, где искать положение всплывающих окон при торговле (выходят за границу экрана)?
такое впечатление, что не определяется граница экрана на некоторых вещах.


Сообщение отредактировал shanse - Сб, 17.08.2013, 15:47
 
МитрандирДата: Сб, 17.08.2013, 16:12 | Сообщение # 152
Удаленные



shanse, нужно уменьшать кол-во текста в описании, чтобы он целиком входил в рамку.
 
shanseДата: Сб, 17.08.2013, 21:45 | Сообщение # 153
Отмычка
Пользователи
Сообщений: 25
Награды: 0
Репутация: [ 0 ]

Митрандир,
Цитата (Митрандир)
нужно уменьшать кол-во текста в описании
- проблематично, имею это в моде misery... и это не тот случай... если предмет в перврй колонке слева, то видно правый край рамки...
 
МитрандирДата: Вс, 18.08.2013, 16:14 | Сообщение # 154
Удаленные



shanse, размер рамок зависит от описания- их нельзя указать в файлах.
Мизери ли это или еще какой мод- разницы нет.
 
FantomICWДата: Вс, 18.08.2013, 18:57 | Сообщение # 155
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Добрый день. Ищу способ решить вечную проблему ЗП - неуязвимость НПС к аномалиям. В ТЧ такой проблемы не было.
Уязвимость/неуязвимость нпс в аномалиях в движке настроена, или скрипт какой-то за это отвечает?



 
shanseДата: Вс, 18.08.2013, 19:27 | Сообщение # 156
Отмычка
Пользователи
Сообщений: 25
Награды: 0
Репутация: [ 0 ]

Цитата (Митрандир)
размер рамок зависит от описания

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

А вот если это вас не устраивает, то редактируйте движок. denis2000
 
denis2000Дата: Вс, 18.08.2013, 21:15 | Сообщение # 157
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (FantomICW)
Ищу способ решить вечную проблему ЗП - неуязвимость НПС к аномалиям.

Я тоже пытался искать некий параметр в конфигах НПС за это отвечающий - безуспешно.
Единственное что могу сказать, что есть движковые функции:
Код
function disable_anomaly();
function enable_anomaly();
Но я так и не попробовал при помощи них включить аномалии для конкретных НПС.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Вс, 18.08.2013, 21:33 | Сообщение # 158
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

denis2000, жаль. Но если что, на трупы реагирует. Тогда можно через логику убить квестового нпс, попавшего на вей-поинт или рестриктор в аномалии, а там уже тело поглотиться (если о гравитационных)


 
МитрандирДата: Вс, 18.08.2013, 21:41 | Сообщение # 159
Удаленные



Цитата (denis2000)
Я тоже пытался искать некий параметр в конфигах НПС за это отвечающий - безуспешно.

Для возможности реагирования НПС на аномалии нужно писать дополнительные скрипты как в ars-mod 0.5.2
Цитата ( из описания ars мода)

5. Динамические аномалии.
* Добавлено около 1000 штук на все локации;
* НПЦ обходят аномалии, аномалии реагируют на НПЦ.
* Аномалии меняют свое местоположение во время выброса.
 
denis2000Дата: Вс, 18.08.2013, 22:11 | Сообщение # 160
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата (Митрандир)
нужно писать дополнительные скрипты


Скрипты в студию!


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Вс, 18.08.2013, 22:48 | Сообщение # 161
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

denis2000, папка scripts из ARS.
Из того, что я пока увидел, так это скрипт anomaly_evader.script, видимо отвечающий за логику НПС по отношению к аномалиям, и часть из ars_mod.script:
[cut=Код]
Код
--'-----------------------------------------------------------------------------
--'           ANOMALY HOLDER (RED75)
--'-----------------------------------------------------------------------------
anomaly_beside={}

function add_anomaly(id,position,radius)
   anomaly_beside[id]={pos=position,rad=radius}
end

function remove_anomaly(id)
   if anomaly_beside[id] then
  anomaly_beside[id]=nil
   end
end

local excluded_npcs={
--zaton
"zat_b14_stalker_1_name",
"zat_b18_noah_name",
"zat_b38_stalker_cop_name",
"zat_b53_artefact_hunter_1_name",
"zat_b53_artefact_hunter_2_name",
--jupiter
"jup_a12_stalker_prisoner",
"jup_b4_monolith_squad_leader_name",
"jup_b19_freedom_yar_name",
"jup_b217_stalker_tech",
--pripyat
"pri_b305_strelok_name",
}

function excluded(npc)
   for i=1,#excluded_npcs do
     if string.find(excluded_npcs[i],npc:name()) or string.find(npc:character_name(),GetString(excluded_npcs[i])) then
       return true
     end
   end
   return false
end

function get_nearest_anomaly(npc,dirp)
   if db.actor:has_info("jup_b6_anom_1") or db.actor:has_info("jup_b6_anom_2") then return false end
   if excluded(npc) then return false end
   local posnpc=npc:position()
   local anomid=nil
   local mindist=50
   local pos1=nil
   local anomdesc={}
   local dir
   if dirp then
     dir=dirp
   else
     dir=npc:direction()
   end
   for obj_id,o in pairs(anomaly_beside) do
     local obj=level.object_by_id(obj_id)
  if obj then
    if not o.rad then
         o.rad=4.5
       end
    if not o.pos or o.pos==0 then
         o.pos=obj:position()
       end
       local dist=posnpc:distance_to(o.pos)-o.rad
       if dist<mindist then
         local delta=vector():set(o.pos):sub(posnpc)
         local scalarmul=(delta.x*dir.x+delta.z*dir.z)/math.sqrt(delta.x*delta.x+delta.z*delta.z)
      -- если скалярное произведения текущего направления движения NPC
   -- и относительного радиус вектора аномалии меньше 0, то NPC удаляется от аномалии
         if scalarmul>-0.4 then
           mindist=dist
           anomid=obj_id
           pos1=o.pos
           anomdesc=o
   end
       end
    if dist+o.rad<o.rad*0.75 then
      local npc_id=npc:id()
         local snpc=alife():object(npc_id)
         if snpc and not snpc.ripper_start then
           snpc.ripper_start=true
           snpc.reason=obj_id
           alife():create("bolt",vector():set(o.pos.x,o.pos.y+1,o.pos.z),obj:level_vertex_id(),obj:game_vertex_id())
           local wpn=npc:active_item()
           if wpn then
             wpn_id=wpn:id()
           else
             wpn_id=65535
           end
           if wpn_id~=65535 then
             local str=wpn_id.."_"..obj_id
             ars_cop.start_timer("init_remove"..str,0.5,str)
           end
           local sect=obj:section()
           if string.find(sect,"gravi") then
             local ini=system_ini()
             local time_cum=utils.cfg_get_number(ini,sect,"accamulate_time",false,false,4000)
             ars_cop.start_timer("body_ripper"..npc_id,time_cum/1000+1, npc_id)
           end
           local h=hit()
           h.type=hit.explosion
           h:bone("pelvis")
           h.power=15
           h.impulse=750
           h.draftsman=npc
           h.direction=npc:position():sub(o.pos)
           npc:hit(h)
     drop_outfits.advanced_hit(npc_id,2)
         end
    end
     end
   end
   if anomid then
     return true,anomid,pos1,mindist+anomdesc.rad,anomdesc.rad
   else
     return false
   end
end

--'-----------------------------------------------------------------------------
--'           DEAD BODY RIPPER
--'-----------------------------------------------------------------------------
local dead_particle1=particles_object("anomaly2\\body_tear_00")
local dead_particle2=particles_object("anomaly2\\gravi_anomaly_shield_00")
local dead_sound=sound_object([[anomaly\anomaly_body_tear_1]])
function dead_body_ripper_particles(npc_id)
   local npc=level.object_by_id(npc_id)
   if npc then
     local npc_pos=npc:position()
     dead_particle1:play_at_pos(npc_pos)
     dead_particle2:play_at_pos(npc_pos)
     dead_sound:play_at_pos(npc,npc_pos,0.5)
     ars_cop.start_timer("body_remove"..npc_id,0,npc_id)
   end
end

function dead_body_ripper_body_remove(id)
   local snpc=alife():object(tonumber(id))
   if snpc then
     alife():release(snpc,true)
   end
end

function dead_body_ripper_init_remove(str)
   str=xr_s.str_explode("_",str)
   local wpn=level.object_by_id(tonumber(str[1]))
   local obj=level.object_by_id(tonumber(str[2]))
   if wpn and isWeapon(wpn) and obj then
     local wpn_dir=vector_rotate_y(obj:position():sub(wpn:position()),math.random(60,120))
     wpn_dir:normalize()
     local ps=wpn:get_physics_shell()
     if ps then
       ps:apply_force(40000*wpn_dir.x,40000*wpn_dir.y,40000*wpn_dir.z)
     end
   end
end
[/cut]



 
denis2000Дата: Пн, 19.08.2013, 10:14 | Сообщение # 162
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

FantomICW, Пока насколько я увидел НПС тупо скриптово убивается (без эффектов если НПС в опастной близости от аномалии) и его труп после смерти вызывает срабатывание аномалии. Выглядит - неказисто: НПС шел вдруг упал и умер и только потом аномалия активировалась. К сожалению ответ на вопрос не получен: как заставить реагировать аномалию на живого НПС.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
GeJorgeДата: Вт, 20.08.2013, 16:33 | Сообщение # 163
Зодчий SGM
Администраторы
Сообщений: 88
Награды: 29
Репутация: [ 1279 ]

Здравия желаю, коллеги.
Хочется адаптировать в игру локацию Бар (ТЧ версию из CoP’s Level Pack), но что-то грабли заблукали.
Поясните, как это делать и каким местом.
Раньше сим занимался ХОВАН. Брал мой репак аллспауна, переколдовывал вертексы, и возращал мне репак аллспауна с новыми графами и вертексами локации. По части конфигов можете не обьяснять, главное как вертексы с графами обновить под новую локацию.
Загодя кажу спасибо.
 
МитрандирДата: Вт, 20.08.2013, 17:28 | Сообщение # 164
Удаленные



GeJorge, берешь acdc универсальный, ggtool, прогу от AMK, распакованный спавн бара, свой спавн.
Совмещаешь section4.bin, через amk прогу. запускаешь ggtool- подгоняешь вертексы новой локации. Потом берешь универсальный acdc - там есть батник для подгона вертексов (acdc_parse.bat). устанавливаешь начальные и конечные значения (-parse all/alife_.......ltx -old старое значение -new новое значение -way), вписываешь версию скрипта в секцию актора, прогоняешь и меняешь ими те значения game-vertex-id что были у тебя раньше, собираешь свой новый спавн. можно и в ручную подгонять- но это мазохизм, можно и через java скрипт от калинина.


Сообщение отредактировал Митрандир - Вт, 20.08.2013, 17:40
 
sergej5500Дата: Вт, 20.08.2013, 17:48 | Сообщение # 165
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

GeJorge,
В архиве СГМ 2.1 в папке gamedata\spawns есть архив Compiler ЗП. Распаковываете его. Кидаете в папку Compiler ЗП файлы alife и way.ltx нужной локации. Открываете батник acdc_parse и пишете там:
universal_acdc.pl -parse alife_zaton.ltx -old 0 -new 1173 -way
pause

Вместо alife_zaton указываете файл нужной локации, после old вставляете старый начальный гейм-вертекс, после new указываете новый начальный гейм-вертекс. Сохраняете и запускаете батник. Появится папка parsed_spawn, в которой будут файлы alife и way с новыми нейм-вертексами, "готовые к употреблению".
 
Поиск: