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

@Баба ЯГА, А ларчик просто открывался. Как всегда, все гениальное лежит на самом виду, спасибо.

  • Согласен 1

Сталкер - наше всё!

Здрасьте.

 

Возникла необходимость прочитать (сравнить) определенное значение из списка с записями вида ["k"]={v1, v2, v3}, то есть под каждым ключом список значений, но эти значения не "true", и не списки. Я пошел через размер таблицы-ключа и обращение по числовым индексам. Есть ли способ проще?

 

В поиске "rep_inc[k]["i"], но без кавычек переменная считается тегом "курсив".

Spoiler

local rep_inc = {
    [0.25] = { "bandit_", "killer_", "novice_",
        "_beretta", "_colt", "_eagle", "_fort", "_pb", "_pm", "_sig220", "_walther", "_usp",
        "_ak74u", "_bm16", "_mp5" },
    
    [0.1] = { "exo_", "military_",
        "_gauss", "_svu", "_svd", "_vintorez",
        "_rg", "_rpg7" }
                }


function rep_grade(slot)

    local sect = slot:section()
    local value = 0.15

    for k, v in pairs(rep_inc) do
        for i = 1, table.getn(rep_inc[k]) do
            if string.find(sect, rep_inc[k]) then
            value = k
            break
            end
        end
    end

    return value
end

 

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Всем привет! Делаю мод, в котором хочу восстановить гражданских зомби. С помощью скриптов добавил им радиационный фон и реакцию детектора при приближении к ним. Но я в скриптах - нуб, просто повезло, что под рукой оказались подходящие шаблоны. Ещё я хочу восстановить для зомби анимацию приема пищи. Просто вместо этого типа анимации проигрывается анимация "stand_idle_". На форуме по ковырянию в файлах "Теней Чернобыля" мне посоветовали вообще править движок, но этот вариант меня не устраивает, поскольку до доводки до ума зомби я вставил в мультиплеер дополнительное оружие, а игра с модифицированным движком не может при выборе сетевой игры распознать версии игр с немодифицированными движками. Остается только надежда восстановить не действующие анимации зомби через скрипт, но как я уже упоминал, в скриптах я - нуб. Кто-нибудь раньше пытался восстановить недействующие анимации монстров через скрипт? Был бы очень признателен за консультацию по этой теме.

Здрасьте.

 

Повесил в [bind_stalker.script] простую функцию с удалением предмета из инвентаря по имени секции. Взял для тестов пистолет ПБ и прицел ПСО-1: пистолет удаляется, прицел – нет. Оба предмета не квестовые, оба не находятся в слотах, конфиги предметов стандартные. В чем разница?

    local del = "wpn_pb"
--    local del = "wpn_addon_scope"
        if act:object(del) then
            alife():release(alife():object(del), true)
        end

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

7 часов назад, Norman Eisenherz сказал:

alife():object(del)

Ф-ция object с строковым аргументом ищет объект по имени. А ты в ф-цию подсовываешь конфиговую секцию. В случае с удалением "wpn_pb" - просто совпадение, что существует обект с таким именем. Сделай правильно, примерно так:

    local obj = db.actor:object("wpn_addon_scope")
    if obj then
        alife():release(alife():object(obj:id()), true)
    end

 

Изменено пользователем AndreySol
  • Согласен 2

@AndreySol И вот тут я теряюсь: для ПБ есть название секции "wpn_pb" и инвентарное имя "wpn-pb". Какое имя используется в функции удаления, если она срабатывает с вариантом "wpn_pb"? Имя файла модели?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

4 часа назад, Norman Eisenherz сказал:

Имя файла модели?

Ну при чем тут файл модели ? Вот несколько фрагментов из распакованного спавна:

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

 

; cse_abstract properties
section_name = wpn_bm16 <-- это конфиговая секция
name = esc_wpn_bm16 <-- это уникальное имя объекта
position = 338.799987792969, 15.3627433776855, 242.199981689453
direction = -3.42261046171188e-008, -0.838799953460693, -1.56779897212982
......

 

; cse_abstract properties
section_name = bandage
name = esc_bandage_0005
position = 340.254608154297, 18.6207141876221, 239.889846801758
......

 

Имя предмета может быть задано несколькими способами: разработчиком, при размещении объекта через СДК(или ACDC) или автогенерацией в движке или в СДК.. И ф-ция удаления не использует имен - она принимает аргументом указатель на серверный класс предмета...

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Хочу создать коробку и сложить в нее определенные предметы. Для ссылки на коробки из списка story_ids есть функция level.object_by_sid(#). Как вычислить id коробки в инвентаре? Обращение через db.actor:object("box"):id() или alife():object(все то же самое) приводит к вылету с ошибкой "attempt to index a nil value".

 

Коробка не обнаруживается даже через проверку if act:object("box"), хотя успешно спавнится в инвентарь по этому же имени.

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

1 час назад, Norman Eisenherz сказал:

Хочу создать коробку и сложить в нее определенные предметы

Это ты инвентарный ящик хочешь ГГ в рюкзак запихнуть ?

@AndreySol Идея в том, чтобы временно скидывать вещи из слотов в ящик на время торговли и обыска. Пока привязался к коробке около арены (story_id = 573), но я не могу таскать ее за собой на другие карты. Можно спавнить ящик под ноги и обращаться к нему через level.object_by_id (почему-то он ловится только при повторном вызове функции), но хочется все-таки спавнить ящик прямо в инвентарь и отправлять предметы в него. Так можно вообще?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

23 минуты назад, Norman Eisenherz сказал:

но хочется все-таки спавнить ящик прямо в инвентарь и отправлять предметы в него. Так можно вообще?

Нет, реализация подобного функционала для инвентарных предметов не предусмотрена.

26 минут назад, Norman Eisenherz сказал:

Идея в том, чтобы временно скидывать вещи из слотов в ящик на время торговли и обыска.

Идея - не фонтан... Тут однозначно лучше будет движковая правка.

@AndreySol Лучше это будет для тех, кто знает ассемблер и структуру движка. В X-Ray Extensions какое-то обозначение для экипированных предметов есть, но у меня с пропатченым файлом движка (правки версии 230.15) игра начинает вылетать при каждом обращении к инвентарю, поэтому пытаюсь сделать костыль. Меня вполне устроит, если временный ящик будет рождаться за спиной и после торговли удаляться из игры.

 

Все, последний вопрос: id коробки невозможно поймать сразу после ее создания (на секунду позже – пожалуйста, но два раза открывать диалог торговли не торт). Такое впечатление, что функция перебора id запускается слишком быстро – до того, как новая коробка успевает получить свой id. Как можно отложить выполнение перебора id, скажем, на 0,5 секунды?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

@Norman Eisenherz, тебе нужно получить онлайновый (клиентский) объект ящика? Иcпользуй каллбэк на выход в онлайн:

function spawn_box()
	  local se_obj = alife():create("box", position, lv, gv)
	  level.client_spawn_manager():add(se_obj.id, -1, this.spawn_callback)
	end
	 
	function spawn_callback(id, obj)
	  -- тут делаешь что хочешь со своим ящиком: это obj
	end
Изменено пользователем naxac
  • Полезно 3

Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO

naxac.gif

9 часов назад, naxac сказал:

Иcпользуй каллбэк на выход в онлайн:

@Norman Eisenherz, чтоб понятнее было - практически все в движке завязано на апдейте, соответственно, от момента создания объекта, до его выхода в он-лайн, проходит определенный промежуток времени(некое кол-во апдейтов (тиков системного таймера)). Именно для этой ситуации, разрабами был введен кэллбэк на выход объекта в он-лайн...

Изменено пользователем W.A.S.P.

Какое сильное колдунство… В оригинальном коде всего одно упоминание такого callback'а, и то в качестве теста. Всем спасибо, противная недоработка наконец-то "подпернута" костылем.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Господа, подскажите добрым советом, как проиграть звук? Задумка такая: в определенные часы будут от лица ГГ (типа по рации) проигрываться рандомные звуки, обрывки чьих-то фраз и тд, и всё это дело НПС будут комментировать в чат текстом, типа: "Что это было?" или "Вы тоже это слышали?"

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

@_Sk8_AsTeR_

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

do
	local lastIdx
	function name ()
		local sndTblPath = ["", "", ""] -- список путей до файлов со свуками
		local idx = math.random(0, table.getn(sndTblName))
      	
      	if idx ~= lastIdx then
			local sndPath = sndTblName[)]
			local snd = xr_sound.get_safe_sound_object(sndPath) -- путь до звукового файла
			snd:play_no_feedback(db.actor, sound_object.s2d, 1, vector(), 1.0)
      	else
      		for i=1,100 do 2+2*5 end
      		return name ()
     	end
	end
end

 

 

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

Я опять встрял, и не могу понять, во что именно… Есть две функции: одна привязана к "info_callback" и спавнит предмет в момент начала торговли, другая запускается после спавна предмета и должна получить его id. Как только я пытаюсь добавить в аргументы второй функции "info_id" для дальнейших действий на основании инфо-поршней из основного колбэка, функция перестает видеть созданный объект, хотя вызывается строго после его создания. Может ли проблема быть в том. что в первой функции создаются два объекта, а колбэк только на одном?

Код ниже, требуется передать (info_id) в функцию "transfer".

Spoiler



function box_id(sect)
	for i = 0, 65535 do
		local obj = level.object_by_id(i)
		if obj and obj:section() == sect then
			return obj:id()
		end
	end
end

function box_spawn(info_id)
	local act = db.actor
	if info_id == "ui_trade" then
		local act_pos = act:position()

		alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ),
			act:level_vertex_id(), act:game_vertex_id() )

		local spawn = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ),
			act:level_vertex_id(), act:game_vertex_id() )
		level.client_spawn_manager():add(spawn.id, -1, transfer)
	end
end

function transfer()
	local act = db.actor
	local box_1 = box_id("box_eq")
	local box_2 = box_id("box_ex")

	if box_1 and box_2 then
		news_manager.send_tip(act, "spawned")
	else
		news_manager.send_tip(act, "missing")
	end
end

 

 

 

Переделал вызовы так, чтобы "info_id" читался непосредственно в "bind_stalker", а функция, зависящая от спавна, только перебрасывала предметы. С одной коробкой работает, с двумя – не переносятся предметы из второй коробки, хотя id второй коробки читается правильно и предметы _в_ эту коробку точно переносятся, если что-нибудь купить (коробки на время теста не удаляются). Посмотрите, пожалуйста, кто-нибудь, где я косячу: https://drive.google.com/open?id=1ak0_jspeRXxoTxxHIDLCe-J0-Psp41DS

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

@Norman Eisenherz, у тебя id заспавненных предметов есть уже сразу после спавна. Зачем корячить ещё и какой-то поиск по десяткам тысяч объектов?

local spawn1 = alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ), act:level_vertex_id(), act:game_vertex_id() )
local spawn2 = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() )
local box_1_id = spawn1.id
local box_2_id = spawn2.id

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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

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

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

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

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

Войти

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

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

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