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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
14 часов назад, _Sk8_AsTeR_ сказал:

Так вот, там многих, так сказать, бочек с кострами нету. Каким образом можно получить название лагеря? Надеюсь правильно вопрос задал.

 

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

 

flame = "zone_flame_small_0001", light = "lights_camp_fire_omni_r1_r2_0001", а их названия взять из распакованного спавна.

Изменено пользователем AndrewMor
Ссылка на комментарий

Здрасьте.

 

Сделал иконку состояния брони (набор статиков) с вызовом из function actor_binder:update(delta): на двух старых сейвах статик загружается и успешно работает, еще примерно на 10 старых сейвах и в новой игре не загружается, а при попытке сохранения и перезагрузки игры приводит к вылету с одним из двух приведенных ниже сообщений. Методом исключения удалось выяснить, что статикам мешает работать уборщик – мешает даже не перебором объектов на сервере, а конкретно той частью, которая удаляет бесхозное оружие. Добавил к запуску уборщика условие if device().precache_frame <= 1 – проблема разрешилась, но все-таки хочется знать, что вызывало эту проблему.

ТЧ 1.0006, без глобальных модов.

https://drive.google.com/open?id=1Yp4s8CvySYUsv0j2EolZYWdAan0JHsfN

Spoiler

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:411: attempt to concatenate field '?' (a nil value)

 

для справки – указанная строка [bind_stalker.script] (с модами): get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])


Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...alker shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

 

Ссылка на комментарий
6 часов назад, Norman Eisenherz сказал:

attempt to concatenate field '?'

naxac дело говорит, я ловил такую дрянь, в другой ситуации. Тогда у меня нет-пакет портился из-за негодной адаптации, а я то думал, что там с загрузкой моего difficulty...

Ссылка на комментарий

@naxac Можно ли подробнее? Куда копать?

Потестил еще: условие precache_frame привело к тому, что теперь уборщик не срабатывает на текущей локации.

@mole venomous Нет-пакеты я точно не трогал.

Ссылка на комментарий

@Norman Eisenherz, вот в  этом цикле


						for j = 1, #bodies do
							if del.position:distance_to(bodies[j].position) > 5 then
								alife():release(del)
							end
						end

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

Изменено пользователем naxac
Ссылка на комментарий

@Norman Eisenherz

Вот этоl

local act = db.actor

стоит перенести из глобальной области скрипта в функцию, где объект актера используется.

Изменено пользователем AndreySol
  • Согласен 1
Ссылка на комментарий

@naxac Проверил еще раз уборщик – старая логика действительно должна была сбоить: проверяется расстояние до 1-го трупа из списка, объект (возможно) удаляется, потом проверяется расстояние от этого же объекта до 2-го, 3-го трупа и т. д., и тот же объект снова удаляется (по крайней мере, делается такая попытка).

Оператор break можно поставить только на негативное условие: если при переборе расстояний найдено значение меньше 5 , то закончить перебор для данного объекта и перейти к следующему, в противном случае удалить объект и перейти к следующему. Не до конца понимаю, как это правильно оформить, чтобы проверка не стопорилась на первом же значении > 5.

Пошел другим путем: создать таблицу расстояний от текущего объекта до всех трупов, взять минимум, сравнить его с заданной величиной (5) и удалить, если этот минимум больше.

Spoiler

        if next(wpn_near) ~= 0 then
            for i = 1, #wpn_near do
                local del = wpn_near[i]
                if del.position:distance_to(act:position()) > 10 then
                    if next(bodies) ~= 0 then
                        local distance = {}
                        for j = 1, #bodies do
                            local dist = del.position:distance_to(bodies[j].position)
                            table.insert(distance, dist)
                        end

                        table.sort(distance)
                        if distance[1] > 5 then
                            alife():release(del)
                        end
                    else
                        alife():release(del)
                    end
                end
            end
        end

 

 

@AndreySol Если функций несколько, лучше обозначать такие переменные в каждой из них или в общей области?

Ссылка на комментарий

@Norman Eisenherz, на мой взгляд - сильно "замудрил".

Попробуй так:

	for k, wpn in pairs(wpn_near)do
		if wpn.position:distance_to(act:position()) > 10 then
			if #bodies ~= 0 then
				for k, bod in pairs(bodies) do
					if wpn.position:distance_to(bod.position) > 5 then
						alife():release(wpn)
						break
					end
				end
			else
				alife():release(wpn)
			end
		end
	end

 

Ссылка на комментарий

@WinCap Кроме способа перебора (ну и еще остановки), это опять старая логика: "если до первого трупа в списке > 5 метров, то удалить оружие". Должно быть "если до всех трупов на локации > 5 метров, тогда удалять".

Ссылка на комментарий

Здрасьте.

 

Можно ли без правок движка изменить формат счетчика оставшегося времени для заданий? Единственный подходящий файл – [scripts\ask_manager.script], но сообщения в явном виде или его фрагментов (ui_st_time_remains, ui_st_days и ui_st_hours) в нем нет, как и ссылки на блок rem_time из файла [config\ui\job_item.xml].

Ссылка на комментарий

А никто ещё не переписывал скрипт  class_registrator так, чтобы в нем хранились все таблицы с данными для регистрации классов и классификации объектов?

В оригинале данные просто используются один раз при старте игры и не хранятся нигде, что неудобно.

Ссылка на комментарий

@AndreySol, данные, необходимые для любых функций классификации (IsMonster и тому подобных). Туда же можно сохранить значение stype (modules.stype_чтонибудь). Да много всего можно там хранить, чтобы каждый раз не делать свою табличку для классификации.

Ссылка на комментарий
6 часов назад, Полтергейст сказал:

IsMonster

Ну так эта ф-ция объявлена в _G.script, тебе очень хочется иметь ее в класс_регистратор ? И какой с этого профит ?

Ссылка на комментарий

@AndreySol, я про таблицы значений clsid, на которых эти функции работают. Неудобно, когда они разбросаны по куче разных файлов. Лучше иметь одну большую таблицу, где всё это собрано.

Ссылка на комментарий

Здрасьте.

 

Делаю счетчик хилок на HUD: создал группу скриптовых статиков, вывел через get_hud():AddDialogToRender(…) и записал в таблицу, чтобы статики не потерялись при уборке.

Проблема: если добавлять статики в таблицу через table.insert, то индексы получаются просто числами, и найти среди них нужный статик (для привязки текста или для удаления статика, если каких-то предметов 0) невозможно. Если добавлять статики в таблицу по секции предмета list[sect] = static, то случается безлоговый вылет через секунду после загрузки – так же, как при отсутствии хранения ссылок на статики. Что я упускаю?

 

Мой мод и оригинал счетчика: https://drive.google.com/open?id=16gX0BYqim6zB6aZnGLqSV-kMPMB3QjQC

 

Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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