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

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

ColR_iT, А зачем нужны game vertex и level vertex в лук поинтах?

[start_6look]

points = p0

p0:name = wp00

p0:flags = 0x1

p0:position = -1.03979444503784,8.50889873504639,-135.781280517578

p0:game_vertex_id = 3646

p0:level_vertex_id = 356302

А из-за этого не могут быть проблемы с сейвами? Так все нормально нет вылетов, но сейвы бьются постоянно

 

Здрасте, у меня вопрос как заспанить Монстра через скрипт? Кол-во не имеет значение, но если можно то лучше через алл. Плиз с примером на кордоне!

Из за чего может быть такая проблема?

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

 

Добавлено через 8 мин.:

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

Секция спавна собаки(моего мутанта) из all.spawn.

; cse_abstract properties
section_name = dog_normal
name = dog_normal_1
position = 179.759155273438,20.1181125640869,79.2889633178711 
direction = 5.63856360713544e-007,-1.32480001449585,-1.41571035783272e-007

; cse_alife_object properties
game_vertex_id = 0 
distance = 40.5999984741211 
level_vertex_id = 383716 
object_flags = 0xffffffbf 
custom_data = <<END
[logic]
active = mob_walker@dog_walk_1

[mob_walker@dog_walk_1]
path_walk = dog_walk_1
on_timer = 10 | mob_walker@dog_walk_2

[mob_walker@dog_walk_2]
path_walk = dog_walk_2
END

; cse_visual properties
visual_name = monsters\dog\dog_red

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions = 
dynamic_in_restrictions = 

upd:health = 1
upd:timestamp = 0 
upd:creature_flags = 0 
upd:position = 179.759155273438,20.1181125640869,79.2889633178711 
upd:o_model = 0 
upd:o_torso = -1.32480001449585,5.63856360713544e-007,0 
upd:g_team = 0 
upd:g_squad = 0 
upd:g_group = 0

; cse_alife_monster_abstract properties

upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0

; cse_ph_skeleton properties

; cse_alife_monster_base properties

; se_monster properties

Точки я думаю писать уже не нужно?

Не думаю что они чем-то помогут, но вот если что:

[dog_walk_1]
points = p0
p0:name = name00
p0:position = 218.416305541992,21.7092933654785,91.9415588378906
p0:game_vertex_id = 0
p0:level_vertex_id = 421092

 

[dog_walk_2]
points = p0
p0:name = name00
p0:position = 88.924103,-10.092127,118.739883
p0:game_vertex_id = 1
p0:level_vertex_id = 301145

 

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

strelok200, за тем же зачем и в остальных точках: точках пути, спавна и т.д. и тому подобное. Биться сейвы из-за этого точно не будут. Что это такое можно найти минут за пять воспользовавшись поиском.

 

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

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

Нужна помощь! Пытаюсь заспавнить непися на вышке, что на Кордоне у блокпоста военных. Спавн делаю через all.spawn. Прописал ему даже свой гулаг - днём дежурит, ночью спит (или что-то в этом роде). Так вот, прописал, спавнится - но не работает именно его логика. Как только появляется - тут же слезает с вышки и гуляет по блокпосту. Такую же проблему увидел и у командира военных на блокпосте - вместо того, чтобы стоять и наблюдать за происходящим, он тоже гуляет по тому же маршруту.

 

В скрипте gulag_escape смотрел приоритеты - своему неписю поставил аж под 500 ед. (на всякий случай, чтоб не сбивали другие террэйны). И всё равно его что-то сбивает - вместо того, чтобы стоять на вышке, он тупо ходит по территории за блокпостом.

 

Кто может, подскажите пожалуйста, в чём беда?

 

Вот. На скрине проиллюстрированы предположительные точки, куда непись смотрит и откуда он смотрит (только днём). А ночью пока не нужно - если разберусь с днём, разберуюсь и с ночью. По гулагам - слишком много нужно писать, всё не поместится. Но уверяю - что бы я ни делал, даже простую ремарковскую логику прописывал ему - всё равно куда-то убегает.

e8a7ae90d8c7t.jpg

Вот точка, откуда непись смотрит (прописал в all.spawn):

[big_soldier_smart_walk1]

points = p0

p0:name = name00

p0:flags = 0x400

p0:position = -163.7255859375, -25.435829162598, -350.27590942383

p0:game_vertex_id = 31

p0:level_vertex_id = 85729

А вот точки, куда он смотрит:

[big_soldier_smart_look1]

points = p0,p1,p2

p0:name = name00|a=guard

p0:flags = 0x400

p0:position = -183.30322265625, -30.729475021362, -318.25082397461

p0:game_vertex_id = 36

p0:level_vertex_id = 67308

p0:links = p1(1)

 

p1:name = name01|t=15000|a=guard

p1:flags = 0x400

p1:position = -159.03273010254, -30.059520721436, -302.86755371094

p1:game_vertex_id = 34

p1:level_vertex_id = 90503

p1:links = p2(1)

 

p2:name = name02|t=10000|a=guard

p2:flags = 0x400

p2:position = -119.28175354004, -30.398241043091, -324.59219360352

p2:game_vertex_id = 100

p2:level_vertex_id = 134793

А это точки, где непись спит:

[big_soldier_sleeper_sleep]

points = p0, p1

p0:name = wp00

p0:position = -166.57637023926, -24.899848937988, -356.91793823242

p0:game_vertex_id = 31

p0:level_vertex_id = 83083

p0:links = p1(1)

 

p1:name = wp01

p1:position = -166.56726074219, -25.43902015686, -352.73843383789

p1:game_vertex_id = 83092

p1:level_vertex_id = 31

p1:links = p0(1)

Из gulag_escape.script:

if type == "big_soldier_smart" then

t = { section = "logic@big_soldier_smart",

idle = 0,

prior = 100, state = {0},

in_rest = "", out_rest = "",

position_threshold = 100,

predicate = function(obj_info)

return obj_info.profile_name == "big_soldier_profile"

end

}

table.insert(sj, t)

t = { section = "logic@big_soldier_sleeper",

idle = 0,

prior = 100, state = {1},

position_threshold = 100,

online = true,

in_rest = "", out_rest = "",

predicate = function(obj_info)

return obj_info.profile_name == "big_soldier_profile"

end

}

table.insert(sj, t)

 

if type == "big_soldier_smart" then

return function(gulag)

if level.get_time_hours() >= 6 and level.get_time_hours() <= 20 then

return 0 -- день

else

return 1 -- ночь

end

end

end

 

if gulag_type == "big_soldier_smart" then

return se_obj:profile_name() == "big_soldier_profile"

end

 

[logic@big_soldier_smart]

active = walker@big_soldier_walker

 

[walker@big_soldier_walker]

path_walk = walk1

path_look = look1

on_info = {+big_soldier_warning1 -big_soldier_warning1_given} remark@big_soldier_warning

 

[remark@big_soldier_warning]

anim = threat

snd = big_soldier_1

tips = big_soldier_1_radio

tips_sender = soldier_elite1

target = actor

on_signal = sound_end | walker@big_soldier_walker %+big_soldier_warning1_given%

 

[logic@big_soldier_sleeper]

active = sleeper@big_soldier_sleeper

 

[sleeper@big_soldier_sleeper]

path_main = sleep

wakeable = true

 

 

 

Это всё, что я сделал.

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

Artos

Спасибо за разъяснение :)

___

Последний вопрос - раз рестрикторы есть и у оффлайн объектов, то можно ли их удалить через серверный без использования нет-пакетов? Или нужно например отлавливать их выход в онлайн?

*Shoker*, ну зачем задавать вопрос, на который можно самому ответить чуток подумав?

Для доступа к информации по рестрикторам объекта имеются методы ... Эти методы имеются только для клиентского объекта ... Делаем вывод, что или для изменения такой информации требуется иметь объект в онлайне или работать нештатными методами, т.е. через нет-пакеты.

Мне непонятно, ну почему тебе не посмотреть как работа с информацией по рестрикторам сделана в том же Simbion'е или OGSE? В этих модах проблемы со спавном и удалением аномалий решены.

Оставался вопрос с некорректной порой записью нет-пакетов по причине некорректных на то время кодов для чтения/записи скелета объекта, что приводило изредка к "рельсам" - так теперь и это решено.

 

Чем тебе вот этот код не подходит?

--/#+# чистка рестрикторов
function Clear_Restriction(idNPC,soNPC,oNPC)
  local sim = alife()
  if not soNPC then
    soNPC = idNPC and sim:object(idNPC)
  end
  if soNPC and IsNPC(soNPC) then
    --/ для онлайновых объектов
    if oNPC and level.object_by_id(soNPC.id) then
      if oNPC.alive and not oNPC:alive() then --/ мертв?
        oNPC:remove_all_restrictions() --/ чистим все
      elseif db.iSSVer <= 8 then --/#!# for SHOC|CS: по списку имен рестрикторов
        local sInRestrictions = oNPC:in_restrictions() --/ читаем список рестрикторов 'in' (входить)
        if sInRestrictions ~= "" then
          local tToRemove = {}
          for sRest in sInRestrictions:gmatch('%s*[^,]+%s*') do --/ разделяем имена по запятым
            local oRestr = sim:object(sRest) --/#!# only for SHOC|CS
            if oRestr and Is_ZoneAnom(oRestr) then
              table.insert(tToRemove,sRest)
            end
          end
          if next(tToRemove) then
            local sToRemove = table.concat(tToRemove,',') --/ строка 'удаляемых' у объекта рестрикторов
            oNPC:remove_restrictions("",sToRemove)
          end
        end
      end
    end
    --/ для всех (т.е. и оффлайновых) объектов
    local pk = get_netpk(soNPC,1) --/ запрос нет-пакета ('state')
    if pk:isOk() then --/ получен доступ к нет-пакету объекта?
      local data = pk:get() --/ читаем данные из нет-пакета
      if next(data.dynamic_in_restrictions) then --/ таблица рестрикторов не пуста?
        local tRestrLeft,idRestr = {},nil --/ массив НЕ удаляемых рестрикторов
        for idx,idRestr in ipairs(data.dynamic_in_restrictions) do
          local soRestr = idRestr and sim:object(idRestr)
          if soRestr then
            if Is_ZoneAnom(soRestr) then --/ проверка: аномалия?
              tRestrRemoved[idRestr] = true
              if tAnomsRemove[idRestr] then
                tAnomsRemove[idRestr] = false --/#?#
              end
              sim:remove_in_restriction(soNPC, idRestr)
            else --/ не удаляемый рестриктор
              table.insert(tRestrLeft, idRestr)
            end
          end
        end
        --
        if #data.dynamic_in_restrictions ~= #tRestrLeft then
          data.dynamic_in_restrictions = tRestrLeft
          pk:set(data) --/< запись в нет-пакет
        end
      end
    end
  end
end

 

Изменено пользователем Artos
Daniar299, функция спавн монстра ничем не отличается от спавна того же НПС или же какого-нибудь предмета. Примеры тебе предоставили разработчики в оригинальных файлах. Вооружаешься поиском по словам (выбрать есть из чего) и вперёд на фронт в геймдату.
Да я согласен функции тежи! Но например та же логика, story_id, spawn_sections, character_profile, откуда брать их? точнее что туда писать для монстра без логики, чтоб просто бегал! Изменено пользователем ColR_iT

Озадачился я сегодня такой проблемой. Есть текст произвольной длинны. Нужно узнать сколько строк он займет при выводе на статик. У статика задан параметр компекс_мод=1

У меня было несколько идей:

1. Посчитать какой размер текста и сколько в нем символов \n. Но проблема в том что из-за переменоса слов на другую строку этот метод дает погрешность в несколько строк при большом объеме текста.

2. Фактически переписать метод SetText. Идея такая - резать строку по словам и смотреть помещается ли это слово на эту строку. заодно посчитать символы \n. Но при больших текстах такая система будет работать очень долго, а там как у меня и так много чего в этот момент обрабатывается это не есть хорошо.

 

Заранее спасибо

Daniar299, если прочитать твои два поста, то становится очень не понятно чего тебе нужно.

Ты просишь спавн через скрипт и тут же говоришь, что лучше через "алл". Определись с выбором то.

Ещё раз повторюсь: функция спавна монстра ничем не отличается от функции спавна НПС, что там, что там тебе нужно прописать секцию и координаты.

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

Туторов тьма-тьмущая. Открой хотя бы тот же Stalkerin и изучай.

_Призрак_,

если надо быстро, то забудь про это. Но в самом то деле, зачем выводить быстро и при этом динамически переносить строки? На худ что ли многострочный текст дампить? Думаю, что при выводе на худ лучше как-то решить вопрос компромиссно - самому распределить строки и отформатировать текст.

Если же вывод подразумевается в диалоговое окно, то соображения скорости по большому счету не важны. В этом случае однако нет другого решения, кроме как считать символы и слова и формировать текст с переносами. Дополнительная сложность будет в том, что ширина символов почти всех ходовых шрифтов движка - неодинаковая. Придется делать допущения о среднем размере символа и вводить некий запас, чтобы строка ненароком не вылезла за ширину окна. Ну или сформировать таблицу размеров символов и при суммировании брать размеры из этой таблицы по коду.

Еще раз, для диалога самое чудовищное решение в плане скорости скорее всего никаких проблем не вызовет. На худ так естественно выводить нельзя.

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

 

Добавлено через 29 мин.:

Посмотрел на Инсайде, там об этом только вкратце

А на мой вопрос так и не ответили...

Неужели никто не знает решения? Не поверю...

Если это поможет, то у меня были следующие подозрения:

У сталкеров есть секции такого типа:

[stalker_terrain]

255,000,255,255

008,001,255,255 ;Разрешено ходить по опасным местам на баре

012,001,255,255 ;Разрешено ходить по опасным местам на Милитари

 

У собак же она одна, но может быть она не подходит для моей новой локации или что-то типа этого?

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

Параметр смарт-терейна в твоем случае не имеет никакого значения.

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

Artos, ну тогда меня может смущать только сама логика мутанта.

Рабочая ли вообще схема mob_walker?

Boofer, давайте все же задумываться прежде чем писать вопрос в топик!

Если бы схема не была рабочей - то в кодах оригинальной игры мы бы не встречали сплошь и рядом упоминания этой схемы и конфигов логики этой схемы.

Ну возьми ты ту же "учебную" плоть с Кордона (esc_suicidal_flesh), которая гибнет в аномалии. Ей и схема прописана и она в соответствии с этой схемой бежит туда, куда ей заказано и "героически" гибнет, не суча на месте ногами ... ;-)

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

Поставь очень желательный параметр path_look, который ты напрочь у себя проигнорировал. Добавь в коды схемы тестовые выводы в лог и смотри ... будет ли твоя непись под управлением схемы или зависнет между "небом и землей", т.е. и схема ее "потеряет" и под управление алайфа она не вернется.

Не гадать и смущаться нужно, а делать что-то и смотреть. Делать желательно осмысленно, а не абы чО писать в схему/логику.

 

Добавлено через 19 мин.:

P.S. И что тебе мешает определить виновата ли логика/схема или нет?

Чтобы не заниматься перекомпиляцией алл.спавна - прописываем путь к конфигу логики, где и можно экспериментировать ...

Пробуем с "пустой" логикой, пробуем с иной схемой, пробуем с иными параметрами своей схемы ...

Ведь все это и не так сложно и ответ и порцию знаний/опыта на будущее.

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

привет,народ столкнулся с такой проблемой,пропала фраза у всех сталкеров "До встречи!" уже все перерыл немогу понять куда делась,подскажите плиз как исправить это чтобы фраза была

 

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

Artos, выяснил что виновата именно логика. Когда мутант находится под действием логики, то зависает в истерическом бегу на месте, но стоит ему заметить врага, он выходит из под действия логики и нападает на врага (передвигается). Но стоит врагу пропасть, он снова продолжает выполнять незаконченную логику и зависает... Менял и координаты точек и координаты спавна самого мутанта. Даже прописывал новую локацию в скрипте xr_gulag. Безрезультатно. Уже даже не представляю что ещё можно сделать...

Пробовал без логики. Всё нормально.

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

Boofer, ну и ... констатация факта того, что тобою написана ошибочная логика и не более. Теперь, если еще не отпало желание, смотри свою логику и приводи ее к рабочему варианту. Та же "учебная" плоть тебе в качестве примера, как сделана рабочая логика для схемы.

 

strelok200, в твоем вопросе "голый" сэйв бесполезен. Без всех твоих модмфицированных кодов и пр. изменений от оригинальной игры, версию которой ты также не упоминаешь - бессмыслено даже о чем-то говорить. Битые сэйвы могут возникать по самым разным причинам, коих неперечислишь даже.

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

Если выложишь где-нибуль весь свой мод с парой битых сэйвов - попробую на выходных глянуть ...

Здравствуйте! Пожалуйста, помогите разобраться с вылетом:

 

function object_eat(obj)
    local sect = obj:section()
if db.actor:has_info("wpn_porshein") then
    db.actor:disable_info_portion("wpn_porshein")
iTimer = nil
                db.actor:restore_weapon()
end
if  sect == "medkit" or sect == "medkit_army" or sect == "medkit_scientic" then
                db.actor:hide_weapon()
random_time()
end
end  
          
function random_time()
      local random_table_function = math.random(1,5)
if random_table_function == 1 then
      function_start_1()
end

if random_table_function == 2 then
      function_start_2() 
end

if random_table_function == 3 then
      function_start_3() 
end

if random_table_function == 4 then
      function_start_4() 
end

if random_table_function == 5 then
      function_start_5() 
end

function function_start_1() 
  iTimer = time_global() + 5*1000
  db.actor:give_info_portion("wpn_porshein")
end

function function_start_2() 
  iTimer = time_global() + 7*1000
  db.actor:give_info_portion("wpn_porshein")
end

function function_start_3() 
  iTimer = time_global() + 9*1000
  db.actor:give_info_portion("wpn_porshein")
end

function function_start_4() 
  iTimer = time_global() + 11*1000
  db.actor:give_info_portion("wpn_porshein")
end

function function_start_5() 
  iTimer = time_global() + 13*1000
  db.actor:give_info_portion("wpn_porshein")
end
end 

function Timer_N_minutes()
  if iTimer and iTimer < time_global() then 
    iTimer = nil 
    db.actor:disable_info_portion("wpn_porshein")
db.actor:restore_weapon()
  end
end

 

 

FATAL ERROR

[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line          : 748
[error]Description   : d:\stalker cop\gamedata\scripts\builds_activ.script:34: attempt to call global 'function_start_5' (a nil value)


stack trace:

 

 

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

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

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

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

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

Войти

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

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

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