Скриптование - Страница 29 - Скрипты / конфиги / движок - 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/

Всем здравствуйте!

Изъюзал весь поиск,но так и не нашёл ответа на,казалось бы простой вопрос:

Что такое мины?Как их спаунить? Какие конфиги за них отвечают.

Я имею ввиду простые стационарные мины,спавнящиеся с началом игры.

Larry76, простые мины палочкой вверх?

Если да, то это аномалии такие, типа мины.

В состоянии idle имеют партикл палочки, а в активном состоянии, когда актор вошёл в зону мины, активное, тоесть хит и партикл взрыва, звук.

Спавнить их в sdk или all.spawn, или скриптом.

Также спавнить, как и аномалии.

TREWKO.А поподробнее, с примером?

Я,в принципе понял,что они действуют наподобии аномалий.Но вот примерчик спавна одиночной мины не помешал бы конечно... :blush:

Интересно,а в Сигерусе мины как сделаны? (те,которые с началом игры по локации разбросаны.)

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

Здрасьте.

Хотел бы узнать, как спаунить непися на определенной локации (желательно торговца) к примеру на свалке.

И через какой инфопоршень его желательно вызывать?

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

 

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

Larry76, спавнятся как и аномалии.

Скриптом я аномалии так и не научился спавнить, скрипт у меня не пашет.

Секция мины = zone_mine_field

Но вот:

function create_anom(section,rad_anom,x,y,z,lv,gv,mode)

-- con(section)

if gv==nil then gv=db.actor:game_vertex_id() end

if lv==nil then lv=db.actor:level_vertex_id() end

if pos==nil then pos=db.actor:position() end

 

local p_obj = alife():create(section,vector():set(x,y,z),lv,gv)

 

local packet = net_packet()

packet:w_begin(0)

p_obj:STATE_Write(packet)

packet:r_seek(2)

 

local game_vertex_id = packet:r_u16()

local cse_alife_object__unk1_f32 = packet:r_float()

local cse_alife_object__unk2_u32 = packet:r_s32()

local level_vertex_id = packet:r_s32()

local object_flags = packet:r_s32()

local custom_data = packet:r_stringZ()

local story_id = packet:r_s32()

local cse_alife_object__unk3_u32 = packet:r_s32()

 

local shape_count = packet:r_u8()

for i=1,shape_count do

local shape_type = packet:r_u8()

if shape_type == 0 then

local center = packet:r_vec3()

local radius = packet:r_float()

else

local box = packet:r_matrix()

end

end

 

local restrictor_type = packet:r_u8()

 

local cse_alife_custom_zone__unk1_f32 = packet:r_float()

local cse_alife_custom_zone__unk2_u32 = packet:r_s32()

local on_off_mode_enabled_time = packet:r_s32()

local on_off_mode_disabled_time = packet:r_s32()

local on_off_mode_shift_time = packet:r_s32()

 

local offline_interactive_radius = packet:r_float()

local artefact_spawn_places_count = packet:r_u16()

local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32()

 

local last_spawn_time_present = packet:r_u8()

 

-- if packet:r_elapsed() ~= 0 then abort("left=%d", packet:r_elapsed()) end

 

packet:w_u16(game_vertex_id)

packet:w_float(cse_alife_object__unk1_f32)

packet:w_s32(cse_alife_object__unk2_u32)

packet:w_s32(level_vertex_id)

packet:w_s32(object_flags)

if mode~=nil then custom_data = mode end

packet:w_stringZ(custom_data)

packet:w_s32(story_id)

packet:w_s32(cse_alife_object__unk3_u32)

 

packet:w_u8(1)

packet:w_u8(0)

local sphere_center = vector()

sphere_center:set(0, 0, 0)

packet:w_vec3(sphere_center)

radius = rad_anom

packet:w_float(radius)

 

packet:w_u8(restrictor_type)

 

packet:w_float(cse_alife_custom_zone__unk1_f32)

cse_alife_custom_zone__unk2_u32 = bit_not(0)

packet:w_s32(cse_alife_custom_zone__unk2_u32)

packet:w_s32(on_off_mode_enabled_time)

packet:w_s32(on_off_mode_disabled_time)

packet:w_s32(on_off_mode_shift_time)

 

packet:w_float(offline_interactive_radius)

packet:w_u16(artefact_spawn_places_count)

packet:w_s32(cse_alife_anomalous_zone__unk1_u32)

 

if mode == nil then

 

packet:w_u8(last_spawn_time_present)

end

p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())

-- add_spot_on_map(p_obj.id,"red_location","Аномалия")

 

 

return p_obj

end

 

 

 

 

Вызвать так:

Ниже этого скрипта пиши:

function anm_cr()
    create_anom("zone_mine_field",radius,x,y,z,lv,gv, nil) -- пропиши координаты и радиус.
end

Сам толком не проверял.

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

~<Red>~,

function spawn_vintorez()
alife():create("имя_нпс_из_файла_character_descr_***",vector():set(-179.04676818848,9.4119186401367,76.59033203125),582891,145)
end

Где *** имя локации.

(-179.04676818848,9.4119186401367,76.59033203125),582891,145)

Координаты. В нашём случае спаун на затоне в одном из домов сгоревшего хутора.

И через какой инфопоршень его желательно вызывать?
Хм... Это как? Вызвать функцию можешь из диалога тегом
<action>имя_скрипта.имя_функции_спауна</action>

Всё.

ЗЫ: И вот это прочти. Много нового узнаешь.

 

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

А как удалить предмет из инвентаря скриптом?

Как и любой другой объект в игре :).

в цикле по инвентарю ищешь название и удаляешь по id

либо просто отбираешь у игрока :)(посмотри в сторону dialogs.script или amk_mod.script)

Здрасте народ! Никто не подскажет возможен ли какой нибудь счетчик диалогов? Например если один и тот же диалог например прошел 3 раза то чего нибудь делаем...

Подскажите, кто знает:

1. как узнать использован ли в данный момент оптический прицел главным героем ?

2. как убрать/вернуть весь индикаторный худ как по клавишам "серый минус"/"серый плюс" ?

 

malandrinus, это для ТЧ.

1. оружие с оптическим прицелом в состоянии прицеливания.

2. level.hide_indicators()/level.show_indicators() эквивалентны -/+, hud_weapon on/off убирает руки с оружием, hud_info on/off не заметил изменений на экране, а остальное не пробовал из-за ненадобности.

Изменено пользователем sapsan
Никто не подскажет возможен ли какой нибудь счетчик диалогов?

В диалогах можно завести тег action. Вписываешь туда свою функцию и делаешь там что надо. Можно и счётчик завести.

 

1. как узнать использован ли в данный момент оптический прицел главным героем ?

2. как убрать/вернуть весь индикаторный худ как по клавишам "серый минус"/"серый плюс" ?

1. Уточнить бы вопрос. Надет прицел на текущем оружии или оружие в состоянии прицеливания? Если установленность прицела, то в ТЧ это только через нетпакеты. Начиная с ЧН есть вроде функция у ствола weapon_is_scope

2. Для манипуляции элементами худа можно использовать консольные команды (через get_console():execute()):

hud_crosshair on/off

hud_crosshair_dist on/off

hud_info on/off

hud_weapon on/off

и функции:

level.hide_indicators()

level.show_indicators()

Что из этого заменяет +/- уже не помню.

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

Как сделать чтобы при подходе ГГ к НПС с определенным SIDом ближе чем на 10метров его(ГГ) бил хит(слабенький) + постэффект и появлялось сообщение что ближе мол нельзя убьёт.

ФеНиКс:

Впервые я могу что-то предложить:

Ну во-первых тебе надо сделать проверку на дистанцию:

local flobals = false

function bind_hit_static()
  for a=1,65635,1 do 
    local obj=level.object_by_id(a) 
    if obj and string.find(obj:name(),"имя нпс") and not flobals then
     if obj:position():distance_to(db.actor:position()) < 10 then
      local h = hit ();
      h.power = 1;
      h.direction = vector():set (0, 0, 0);
      h.impulse = 0;
      h.draftsman = obj;
      h.type = hit.explosion;
      obj:hit (h);
      flobals = true
     end
    end
  end
end

Вот мы и получили хит... по моему)))

Теперь надо сделать сообщение, получаем такое:

local flobals = false

function bind_hit_static()
  for a=1,65635,1 do 
    local npc=level.object_by_id(a) 
    if npc and string.find(npc:name(),"имя нпс") and not flobals then
     if npc:position():distance_to(db.actor:position()) < 10 then
      local h = hit ();
      h.power = 1;
      h.direction = vector():set (0, 0, 0);
      h.impulse = 0;
      h.draftsman = obj;
      h.type = hit.explosion;
      npc:hit (h);
      flobals = true
    local sactor = alife():actor() 
    local cactor = level.object_by_id(sactor.id) 
    cactor:give_game_news(
        "%c[255,255,1,1]Имя того, кто это скажет\\n%c[255,1,255,1]Дальше подойти нельзя! Опасная зона!",   
        "ui\\ui_iconstotal",        
        Frect():set(1245,517,83,47),  
        math.random(1000, 2000),     -- задержка появления сообщения. корейский рандом)))
        5000 -- сколько продержится это сообщение.                         
        )
     end
    end
  end
end

Но вот я не понял, эффект какой, пост эффект?

Или аним?

К сожалению не врубился, как прописать sid... Может: level.object_by_sid(номер сида)?

 

 

Кстати:

Засунул в скрипт test.script это:

local lamps_marsh_vr_on = false

function bind()
    local id, obj
    for id=0, 65535 do
        obj = level.object_by_id(id)
        if obj ~= nil and
           obj:section() == "lights_hanging_lamp" and
           string.find(obj:name(), "light_alarm_glass_0001")
        then
            local hl = obj:get_hanging_lamp()
            if hl ~= nil then
                                if lamps_marsh_vr_on then 
                     hl:turn_on()
                                   else
                     hl:turn_off()
                                end
            end
        end
    end
end

Прописал в биндер сталка: test.bind()

То есть, при запуске игры выключается лампочка в подвале у сидора.

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

Вылет без лога.

Удаляю скрипт--> игра работает без проблем.

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

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

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

 

Проверил с помощью проверки на наличие часов:

get_hud():GetCustomStatic("hud_show_time")

так они всегда присутствуют...

 

malandrinus, а сам элемент есть такой ? "hud_show_time" - это в Солянке часы выводятся...

Код

        local guiHidedManually = not cs
        get_console():execute("load ~#I#: guiHidedManually="..tostring(guiHidedManually))
        get_console():execute("load ~#I#: cs:wnd():IsEnabled()="..tostring(cs:wnd():IsEnabled()))
        get_console():execute("load ~#I#: cs:wnd():IsShown()="..tostring(cs:wnd():IsShown()))
        get_console():execute("load ~#I#: cs:wnd():GetWidth()="..tostring(cs:wnd():GetWidth()))
        get_console():execute("load ~#I#: cs:wnd():GetHeight()="..tostring(cs:wnd():GetHeight()))
        get_console():execute("load ~#I#: cs:wnd():GetTextX()="..tostring(cs:wnd():GetTextX()))
        get_console():execute("load ~#I#: cs:wnd():GetTextY()="..tostring(cs:wnd():GetTextY()))

всегда возвращает:

! Cannot find saved game ~#i#: guihidedmanually=false
! Cannot find saved game ~#i#: cs:wnd():isenabled()=true
! Cannot find saved game ~#i#: cs:wnd():isshown()=true
! Cannot find saved game ~#i#: cs:wnd():getwidth()=98
! Cannot find saved game ~#i#: cs:wnd():getheight()=19
! Cannot find saved game ~#i#: cs:wnd():gettextx()=22
! Cannot find saved game ~#i#: cs:wnd():gettexty()=1

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

sapsan,

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

 

Привет всем. Люди добрые, подскажите мне пожайлуста как прикрутить аномалию(например - электра) к конкретному объекту(например - бочка с бензином)? :russian_ru:

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

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

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

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

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

Войти

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

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

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