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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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

Тема для обсуждения скриптов всего и всех в серии игр 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/
Только что, Stalkersof сказал(а):

Скрипт просто текстовый файл

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

Vq0Xbfg.png

Только что, Stalkersof сказал(а):

А какая нужна?

ANSI по идее.

Изменено пользователем Zander_driver
  • Спасибо 1
  • Согласен 4

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

4 минуты назад, Zander_driver сказал(а):

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

Vq0Xbfg.png

Понятно. Посмотрел скрипт в Кодировка UTF-8. А какая нужна?

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

local spawns_devices = {
    "part_lighter",
    "part_banka",
    "part_nitki",
    "part_kley",
    "part_cutler",
    "part_core",
    "part_ver",
    "part_grease",
    "part_fankt",
    "part_gunoil",
    "part_ramrod",
    "part_kitss",
    "part_kitrr",
    "part_jar",
    "part_weapons_light",
    "part_weapons_heavy",
    "part_outfit_heavy",
    "part_outfit_light",
    "part_electro"
}

function actor_on_random_devices_new()
    local text_new = ""
    for i = 2, 4 do--// ОТ 2 DO 4
    local item = spawns_devices[math.random(table.getn(spawns_devices))]
    alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    local a_name = game.translate_string(system_ini():r_string(item,"inv_name_short"))
    text_new = text_new.."\\n"..a_name
end
    send_tip_devices("\\n%c[d_cyan]"..game.translate_string("st_dis_text_9").."\\n".."%c[ui_white]"..text_new)
end

Может кто помочь получить количество получаемых деталей? Т.е если после разбора обьекта получаешь 2 ОДИНАКОВЫХ предмета, то в сообщении это не указываеться. ВОТ СКРИН https://yadi.sk/i/G3C88dOd1juczw

Только что, Colder сказал(а):

Т.е если после разбора обьекта получаешь 2 ОДИНАКОВЫХ предмета, то в сообщении это не указываеться.

В выше-приведенном коде. Если выпадут одинаковые предметы, то они и написаны будут два (три) раза в сообщении. Разве этого не достаточно?)

Только что, Colder сказал(а):

получить количество получаемых деталей?

Можно просто в табличку по ключу - секции итема, заносить количество предметов. А после спавна всех, подсчитывать сколько всего набралось.

local t = {}

...

if t[item] ~= nil then
  t[item] = t[item] + 1
else
  t[item] = 1
end
...
for sec, count in pairs(t) do
  text_new = text_new .. "\\n" .. game.translate_string(ltx:r_string(sec, "inv_name"))
  if count > 1 then text_new = text_new .. string.format(" x %i", count) end
end

Как-то так. Какой фрагмент куда вставить, я думаю и так понятно.

Изменено пользователем Zander_driver
  • Полезно 1

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

24 минуты назад, Colder сказал(а):

Не работает!

Ложь :)

25 минут назад, Colder сказал(а):

actor:iterate_inventory

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

Зачем эти сложности, если можно просто пересчитать, сколько чего заспавнили, при самом спавне?

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Только что, Colder сказал(а):

бред получаеться!

Ну как скомпоновал сообщение, то и получил. Ты это написал, не я. Подумай, как надо сделать.

Только что, Colder сказал(а):

Через него мне кажется проще.

Проще?

Ок, приведи свою реализацию, как вызвать свою функцию через несколько апдейтов.

И, как отличить те предметы которые недавно заспавнены, от тех что в рюкзаке уже были. И, точно ли для этого надо iterate_inventory дергать?)

А затем и посмотрим, что проще.

  • Нравится 1
  • Согласен 1

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

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

local part = {
    ["part_lighter"] = 2,
    ["part_banka"] = 2,
    ["part_nitki"] = 2,
    ["part_kley"] = 2,
    ["part_cutler"] = 2,
    ["part_core"] = 2,
    ["part_ver"] = 2,
    ["part_grease"] = 2,
    ["part_fankt"] = 2,
    ["part_gunoil"] = 2,
    ["part_ramrod"] = 2,
    ["part_kitss"] = 2,
    ["part_kitrr"] = 2,
    ["part_jar"] = 2,
    ["part_weapons_light"] = 2,
    ["part_weapons_heavy"] = 2,
    ["part_outfit_heavy"] = 2,
    ["part_outfit_light"] = 2,
    ["part_electro"] = 2
}

function actor_on_random_devices_new()
    local t = {}
    local text_new = ""
    for item, count in pairs(part) do
    alife():create(db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    if t[item] ~= nil then
    t[item] = t[item] + 1
    else
    t[item] = 1
end
    text_new = text_new.."\\n"..game.translate_string(system_ini():r_string(item, "inv_name"))
    if count > 1 then
    text_new = text_new..string.format(" x %i", count)
end
end
    send_tip_devices("\\n%c[d_cyan]"..game.translate_string("st_dis_text_9").."\\n".."%c[ui_white]"..text_new)
end

Сделал по твойму но они спавняться все по 2шт. А мне нужно рандомное количество общих деталей например: что бы гг получил 2 или 4 детали.

14 минут назад, Colder сказал(а):

["part_lighter"] = 2,

 

14 минут назад, Colder сказал(а):

но они спавняться все по 2шт.

Ну и кто же это написал?

Не я точно.

У тебя вообще в коде какая-то каша, все перемешано без смысла.

И крайний раз запускал ты его не в таком

17 минут назад, Colder сказал(а):

alife():create(db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

виде. Потому что тут даже секции итема нет, чего спавнить. Такой вызов, приведет к движковому вылету с руганью на недостаток аргументов и/или не соответствующие типы аргументов.

18 минут назад, Colder сказал(а):

мне нужно рандомное количество

Используй math.random

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Можно ли как-то изменить параметры параметры артефакта через скрипт? Если да, то как? И как отследить, что артефакт надет на пояс?

Только что, ARTLantist сказал(а):

изменить параметры параметры артефакта через скрипт?

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

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

Только что, ARTLantist сказал(а):

отследить, что артефакт надет на пояс

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

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

В OGSR к примеру, есть метод db.actor:iterate_belt

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Подскажите функцию на проверку итемов у актора типо:

local бла = { 

”бла” = true,

”бла” = true,

”бла” = true

}

...

Нескольких 

 

45 минут назад, Colder сказал(а):

Подскажите функцию

for k,v in pairs(бла) do

  if v == true then db.actor:give_game_news('бла-бла', 'бла-бла-бла', "ui_iconsTotal_PDA", 0, 3000) end

end

 

P.S.: задавай свои вопросы в человекопонятной форме.

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

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

3 часа назад, Colder сказал(а):

Подскажите функцию на проверку итемов у актора

Как-то так:

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

local need_item = {
	'medkit',
	'medkit_army',
	'medkit_scientic'
	}

function actor_has_one_item()
	for k,v in pairs(need_item) do
		if db.actor:object(v) ~= nil then
			return true
		end
	end
	return false
end

function actor_has_all_item()
	for k,v in pairs(need_item) do
		if db.actor:object(v) == nil then
			return false
		end
	end
	return true
end

 

 

P.S. Стол заказов это конечно очень хорошо...

Но хотя бы иногда, перед тем как задать вопрос, заглядывайте в "xr_conditions.script" и "xr_effects.script".

  • Согласен 4

S.T.A.L.K.E.R. CoP Objects  >200 шт  (upd 21.05.26) - Скачать  (Яндекс-диск)

Может и мне подскажете, вот есть рабочий способ на удаление объекта:

local obj = alife():object("esc_af_medusa12345") -- после спавна, провалилась под террейн
if obj ~= nil then
	alife():release(obj, true)
end

и как мне применить (любопытства ради) на этот объект нек.эффекты типа:

local ph = obj:get_physics_shell() -- пробовал, вылет по nil (подозреваю, что пытаюсь применить методы клиент.объектов к серверным)
if (ph) then
	ph:apply_force(0,10000,0) -- пнуть по у вверх
end

или уж совсем дикие методы:

 

function drop_item_and_teleport(game_object*, vector);
function transfer_item(game_object*, game_object*);

 

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

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

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

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

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

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

Войти

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

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

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