Скриптование - Страница 427 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу.

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/
3 часа назад, Gomez сказал:

Я именно по этому гайду и делал, но у меня ничего не вышло.

Ну так покажи, что ты делал...

@naxac @CRAZY_STALKER666 А почему бы и не вот так?)

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

 local can_leave = {

    wpn_knife = true,

    wpn_binoc = true,

    device_pda = true

  }

  local sim, obj = alife(), nil

  db.actor:iterate_inventory(

    function (dummy, item)

      obj = sim:object(item:id())

      if obj and not can_leave[item:section()] then

        sim:release(obj, true)

      end

    end,

  nil )

 

 

Изменено пользователем vampirnik77
1 час назад, vampirnik77 сказал:

почему бы и не вот так?)

Ну это как бы то же самое, только вид сбоку :) .

  • Спасибо 1

Братишки, помогите разобраться, что за (цензура).

Скрипты ли это не оптимизированные или движог УГ, не особо предназначен для такого.

В чём суть. Есть мод, в котором спавнятся мутанты (волны), последовательно. 

При этом каждая следующая волна садит FPS. 

В начале игры допустим 200, волна 8-9 уже 30.

Реализация:

1. При убийстве мутанта спавнится в инвертарь ГГ предмет (сделано через скрипт ogsm_mutants, думаю многие знают суть. Моб мёртв - даём предмет).

2. Считаем количество предметов, при определённом количестве даём инфо.

 

function item_2_volna()
local cnt = db.actor:object_count()
local ch=0
for i=0, cnt-1 do
local item = db.actor:object(i)
       if item:section() == "trofey_volna" then
          local sobj = alife():object(item:id())
             if sobj then
      
                    ch = ch+1
                 if ch == 20 then
                  
                    db.actor:give_info_portion("volna_2")

 

if has_alife_info("volna_2") and not has_alife_info("music_volna_2") then
        local snd = sound_object([[gameplay\next_volna]])
        snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 1.0)
        db.actor:give_info_portion("music_volna_2")
zombie_timer.next_volna_timer()

if db.actor:object("double_points1") ~= nil then
         del_x2()
end
    
end


 end
end
end
end
end

3. Определили? Спавн следующей волны.

 


function sidor_volna_2()
if level.name() == "predbannik" and not has_alife_info("mob_l2")  and has_alife_info("volna_2") then
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
           db.actor:give_info_portion("mob_l2")
up_remove_corpses()

           save_volna_2()
    end
end

4. Ну и так далее, далее по аналогии.

Что только не пробовал... И переносил спавн волны с помощью кол-ва убитых мобов в xr_statistic (то бишь спавн предмета не причём), 

часть функций переносил в load, а не update (bind_stalker), и есть перерывы между спавном (10 сек... минута... разницы ноль).

И спавн мобов с помощью ogsm_packet, и так далее.

Ничего не помогает.

FPS падает и падает...

Вопрос: в чём проблема, как решить?

Изменено пользователем power-cat

Если каждая "волна" по 20 штук мутантов (*9=180 нехило так полигонов в кадре прибавилось) то, вполне возможно, что количество мобов и есть причина просадки FPS. Попробуй каждую "волну" заменить на всего одного моба и проверь, что получится. Кстати, проще сделать цикл спона мобов, чем городить кучу одинаковых строк кода:

 for a=1, 20 do
        alife():create("zombie_game2",vector():set(-475,-0.73,-170),288029,967)
end

А, только что заметил - вроде, уборщик трупов есть какой-то? Ну, тогда не знаю :) ...

Изменено пользователем =VENOM=
Поправка

Количество влияет, но не оч сильно. Когда мобов 60, FPS садится чуть быстрее.

Трупы удаляются, даже делал удаление при убийстве половины мобов.

Ничего не помогает. Мне кажется даже если 1 будет, всё тоже самое.

Интересно... А перезагрузка уровня (выход-вход обратно на локацию) после отстрела всей массы мутантов как-то влияет на FPS?

Насчёт перезагрузки не знаю, но save\load не помогает.

И опять таки, эти костыли даже если и работали б, всё равно не подойдут для геймплея, отрывают же.

+ в сталкере не мало мест, где много мобов (чаэс) и т.д., но всё нормально. Мне кажется дело не в количестве.

Ну тогда переезжаем в личку - общий контур проблемы вроде бы ясен (апдейт ГГ), а остальным всё это вряд ли будет интересно.

Не знаю куда конкретно написать, перенести плз куда правильнее.

У меня тут непонятка какая-то, при запаковке в архивы левелы, если запаковывать вот с таким конфигом:

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

local data_for_levels = [[
[header]
auto_load = true
level_name = single ; former level name, now can be mod name
level_ver = 1.0 ; former level version, now can be mod version
entry_point = $fs_root$\gamedata\ ; do not change !
creator = "Team EPIC" ; creator's name
link = "forum.epicstalker.com" ; creator's link

[options] ; exclude files from compression with such extension
exclude_exts = *.ncb,*.sln,*.vcproj,*.old,*.rc,*.scc,*.vssscc,*.bmp,*.exe,*.cmd,*.bat,*.db,*.xdb,*.bak*,*.bmp,*.smf,*.uvm,*.prj,*.tga,*.txt,*.rtf,*.doc,*.log,*.~*,*.rar,*.sfk,*.tmp,*.xr

[include_folders]
levels\%s\ = true   -- %s - это название левела(и папки)
]]
local data = strformat(data_for_levels, dir)

 

Игра крашится.
А если запаковывать вот с таким конфигом:

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

 


local data_for_levels = [[
[header]
auto_load = true
level_name = single ; former level name, now can be mod name
level_ver = 1.0 ; former level version, now can be mod version
entry_point = $fs_root$\gamedata\ ; do not change !
creator = "Team EPIC" ; creator's name
link = "forum.epicstalker.com" ; creator's link

[options] ; exclude files from compression with such extension
exclude_exts = *.ncb,*.sln,*.vcproj,*.old,*.rc,*.scc,*.vssscc,*.bmp,*.exe,*.cmd,*.bat,*.db,*.xdb,*.bak*,*.bmp,*.smf,*.uvm,*.prj,*.tga,*.txt,*.rtf,*.doc,*.log,*.~*,*.rar,*.sfk,*.tmp,*.xr

[include_folders]
.\ = true

[exclude_folders]
ai\ = true
anims\ = true
%s\ = true
;levels\ = true
meshes\ = true
scripts\ = true
shaders\ = true
sounds\ = true
spawns\ = true
textures\ = true
]]
local data = strformat(data_for_levels, type_dbs[ahkGetVar("UICoCDBToolDBToolListDbTypePack"..tab)])   -- под %s подставляется название папки с конфигами "configs"
   for k,v in pairs(level_directories) do   -- к data приписываются пути к каждому левелу, кроме того, который запаковываем, для исключения всех левелов, кроме пакуемого
    if (k ~= dir) then
     data = data .. "\nlevels\\" .. k .. "\\ = true"
    end
   end

То всё нормально, и не крашится.
Где косяк? В компрессоре или движке?

 


Подскажите, пожалуйста, как отловить момент выстрела из РПГ через скрипт?

Суть вопроса: У меня РПГ - 22 (одноразовый), выстрел, и у нас в место РПГ остается пустой контейнер. Платформа: ТЧ  1.0004

Ссылка на РПГ -22 https://yadi.sk/d/h0V8gPx83LN9aU

Копался в sr_timer.script. Возникли вопросы.

1.Как выключить отображение счётчика на экране? Сколько не пытался - пока что только вылеты.

2. Почему функция action_timer:save(), которая, как я понимаю, сохраняет в pstor счётчик - закоментирована?

 

Вот полный скрипт, чтобы не искать его.

http://rgho.st/6N7YS9FmH

@CRAZY_STALKER666

1. Закомментируй строки: 36, 49-52, 88-96.

2. Потому что запись нужных данных делается в функции xr_logic.save_logic() при сохранении рестриктора. Аналогично для чтения.

  • Спасибо 1

Здравствуйте. Есть такой код

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

function particle(self)  -- прописана в xr_motivator на хит_колбэке
   local victim = self.object
   local weapon = db.actor:item_in_slot(2)  
    if db.actor:active_slot()==2 and weapon and weapon:section()=="оружие" then
     if victim:who_hit_name()=="single_player" and victim.health < 1 then
   ash_particle(self)
     end
   end
end

 

function ash_particle(self)
   local victim = self.object
   local sect = victim:section()
   local type = {"stalker","neutral","dolg","freedom","soldier"} -- список значительно сокращен
   local ash = particles_object("путь_до_партикла")
    for t = 1,20 do
      if not string.find(sect,type[t]) then
      ash:play_at_pos(victim:position())
      end
   end
end

 

Задумка в том, чтобы партиклы проигрывались у всех подстреленных, кроме указанных в таблице. При этом если вместо строчки
      if not string.find(sect,type[t]) then
сделать просто перечисление
      if not (string.find(sect,"stalker") or string.find(sect,"neutral") or string.find(sect,"dolg") or string.find(sect,"freedom") or string.find(sect,"soldier")) then  -- соответственно список значительно сокращен
то все работает как надо. Что я упустил?

@Jekyll , попробуй так

function ash_particle(self)
	   local victim = self.object
	   local sect = victim:section()
	   local type = { "stalker", "neutral", "dolg", "freedom", "soldier" } -- список значительно сокращен
	    for t = 1,20 do
	      if string.find( sect, type[t] ) then return end
	   end
	   local ash = particles_object("путь_до_партикла")
	   ash:play_at_pos(victim:position())
	end

  • Спасибо 1
  • Согласен 1

2 Jekyll - в твоём коде с таблицей на каждую "подходящую" жертву будет по 20 раз (сколько итераций указано, если нет ни одного совпадения) срабатывать установка партикла. Проверка же набора строк вернёт всего лишь одно значение - верно/не верно. Поэтому во втором случае результат положительный.

Кстати, строчку

for t = 1,20 do

лучше сразу заменить на

 for t = 1,table.getn(type) do

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

  • Спасибо 1

Jekyll

Я могу сейчас всё расписать от и до.
Только один вопрос - Почему именно до двадцати?

for t = 1,20 do

В чём сакральная задумка?

P.S. Нет, я и так вижу что человек не разбирается. Просто хотелось определиться что именно нужно.
P.P.S. А что это с редактором? Жесть какая-то при изменении. Но это в общем-то не особо важно.

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

Господа, нужна ваша помощь. Кто шарит в скриптах? Хочу сделать комментарии к сообщениям о смерти сталкеров( чтобы сами НПЦ комментировали чью-либо смерть). 

Вот функция, отвечающая за выдачу новости о смерти сталкера:

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

-- Погиб сталкер.
-- Собираем инфу о погибшем
-- Собираем инфу о виновнике смерти
-- Готовим сообщение
function on_stalker_death(victim_, killer_)
 local rnd = math.random
 if (victim_ == nil) then
  return
 end
 local m_killer = ""
 local m_killer_s = ""
 local m_victim = ""
 local victim
 if (isGameObject(victim_)) then
  victim = victim_
 else
  victim = get_obj(victim_.id)
 end
 local killer
 local m_name  = get_npc_name(victim)
 m_victim = format_death_stalker_corpse(victim)
 local m_level = get_level_name(get_object_levelname(victim))
 if (killer_) then
  if (isGameObject(killer_)) then
   killer = killer_
  else
   killer = get_obj(killer_.id)
  end
  if (IAmAMonster[killer:clsid()]) then
   m_killer = format_death_by_monster(killer)
   m_killer_str = get_monster_name(killer, 2)
  elseif (IsAnomaly(killer)) then
   m_killer = format_death_by_anomaly(killer)
   m_killer_str = get_anomaly_name(killer, 1)
  elseif (IsNpcStalker(killer)) then
   local m_o_weapon = get_npc_weapon(killer)
   local m_s_weapon = ""
   if (m_o_weapon) then
    m_s_weapon = get_weapon_type(m_o_weapon)
    if (m_s_weapon < 5) then m_killer_str = "пулевое ранение" end
    if (m_s_weapon == 6) then m_killer_str = "нож" end
    if (m_s_weapon == 8) then m_killer_str = "ожоги" end
    if (m_s_weapon == 7 or m_s_weapon == 5) then m_killer_str = "граната" end
   end
   if (IsNpcActor(killer)) then
    add_killed_by_actor(victim) -- Отметим, что это ГГ постарался.
   end      
   m_killer = format_death_by_stalker(killer)
  elseif (IsNpcOther(killer)) then
   local m_o_weapon2 = get_npc_weapon(killer)
   local m_s_weapon2 = ""
   if (m_o_weapon2) then
    m_s_weapon2 = get_weapon_type(m_o_weapon2)
    if (m_s_weapon2 < 5) then m_killer_str = "пулевое ранение" end
    if (m_s_weapon2 == 6) then m_killer_str = "нож" end
    if (m_s_weapon == 8) then m_killer_str = "ожоги" end
    if (m_s_weapon2 == 7 or m_s_weapon2 == 5) then m_killer_str = "граната" end
   end
   m_killer = format_death_by_stalker(killer)
  else
   m_killer_str = "причина смерти - неизвестна"
   m_killer = ""
   if _debug == true then mylog("On stalker death - unknown killer. "..killer:name().." clsid="..get_clsid(killer)) end
  end
 end
 if (m_killer_str==nil or m_killer_str=="") then m_killer_str = "причина смерти - неизвестна" end
 local m_string = m_name..". "..m_level..", "..m_killer_str.."."
  do_news(m_string, "Погиб сталкер:", rnd(timer_stalker_death, timer_stalker_death * 3), 10, "death", nil, 1)   --------оригинальная строчка вывода сообщения на экран


  amk.send_tip("ТЕКСТ КОММЕНТАРИЯ НПЦ",  "ИМЯ НПЦ ", time, show time, "death(иконка)")         ---------этой строчкой рандомные НПЦ должны оставлять комментарии

  end

end
  

 


Суть проблемы вот в чем: строчка Do_News - тут прописан хитрый механизм, чтобы не засорять нам экран сообщениями о смертях, когда мы убили разом целую группу сталкеров (гранатой, например). Поэтому если мы разом убьем сразу 10 человек, придет только одно сообщение о смерти какого-нибудь из этих жмуриков..  Зато тут же через  amk.send_tip покажутся сразу 10 сообщений с комментариями. 

И вот тут мне нужна ваша помощь, скриптеры. Помогите как-нибудь реализовать такой механизм, чтобы либо:  1) Комментарий (amk.send_tip) вызывался бы только после вывода сообщения (do_news) о смерти НПЦ на экран (сделать какую-то зависимость, не знаю), либо 2) тоже сделать "антиспам", чтобы на 10 практически одновременных сообщений о смерти сталкеров (do_news) отобразился бы только один комментарий (amk.send_tip).

Есть какие-нибудь идеи?

 

Здравствуйте, где-то видел фишку, в CoM кажется, там вроде в инвентаре лом перетаскиваешь на оружие и оно разбирается, не подскажите код?

  • Полезно 1

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

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

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

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

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

Войти

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

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

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