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

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

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

@StafGlawer,  если платформа ЗП, навскидку можно реализовать следующим образом:

if not db.actor:object("device_pda") then
get_hud():HidePdaMenu()
end
end

Не идеально, конечно, зато дёшево и сердито...

 

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

@Sarumanда неужели? Все управление через биндинги в user.ltx прописано.

@StafGlawer, что то мне подсказывает, что анбиндинг работает не по значению, а по клавише, типа такого "unbind kP", но таким методом не заблокировать весь пда, контакты и карта все равно останутся (мб еще чтото, залезь в настройки управления). Можно попробовать разбиндивать и их, только нужно получать правильные клавиши, например у меня открытие активных задач далеко не на клавишу P. А как получать, не подскажу, могу только запутать :)

Вариант @Jurok'а из самых распространенных, в Солянке есть такая шняга с рюкзаком, якобы молния застряла (если ноги растут у этой идеи не из Солянки, уж извините, увидел именно в ней). Там проверяются инфопрошни, я уверен на 90% :) и как только получили инфопоршень открытия какого либо окна из ПДА его можно закрыть. Как - описано в справочнике по скриптам.

Изменено пользователем Desertir
  • Нравится 1

Здравствуйте. 

Вот, ЗП энциклопедию для ПДА создал - радовался. Не долго, правда: "Как статьи то выдавать?" - вопрос повис в воздухе и не хочет решаться. Знаю, проще всего сделать так: Сидор отправляя нас на задание, предупреждает, что там будут Слепые псы, их нужно опасаться, ведь у нас из оружия - только ПМ и т.д. В конце диалога выдать инфопоршень, по появлению которого у нас появляется статья в ПДА. Так - работает (да и с чего бы не работать?). Но если выдавать статьи только по заданию, то посинеешь их делать (ведь статей то явно перевалит за сотню, вместе с "дневником"), решил выкрутиться так же, как я выкрутился когда то с тайниками: при обыске NPC, есть вероятность того, что мы обнаружим наводку на тайник. Решил сделать аналогичное, но для инфопоршней.

 

function finding_info(npc)
local rnd_tbl = {
	"Mutant_boar_info",
	"Flesh_info",
	"Pseudo_flesh_info",
	"Bloodsucker_info",
	"Himera_info_info",
	"Pseudodog_info_info",
	"Psy_dog_info",
	"Dog_info",
	"Rotan_info",
	"Tushkano_info",
	"Giant_info",
	"Izlom_info",
	"Zombie_info",
	"Zombied_info",
	"Poltergeist_tele_info",
	"Poltergeist_flamer_info",
	"Snork_info",
	"Cat_info",
	"Cat_bayun_info",
	"Crow_info",
	"Burer_info",
	"Controller_info",
	"Rat_info",
	"Rats_wolf_info",
	"Escape_info",
	"Garbage_info",
	"Marsh_info",
	"Darkscape_info",
	"Agroprom_info",
	"Darkvalley_info",
	"Agroprom_u_info",
	"Rostok_info",	
	"Bar_info",
	"Monolith_info",
	"Military_stalkers_info",
	"Freedom_info",
	"Duty_info",
	"Stalkers_info",
	"Bandits_info",
	"Clear_sky_info",
	"Military_info",
	"Ecolog_info",
	"Killers_info"
}

    if math.random(0,100) > 1 then --Такой шанс дал, дабы не валить толпы народа
        for k,v in pairs(rnd_tbl) do 
	    if not has_alife_info(v) then --Если такого инфопоршня нет, то...
	        table.insert(rnd_tbl, v)  --...Выдаём его
	    end
	end
    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 : not enough memory


stack trace:

 

Не подскажете, в чём причина неработоспособности скрипта? За ответ буду благодарен.

@Сталкер Лом, я бы попробовал вынести за функцию таблицу с информацией, но наверняка это не поможет. Ты уверен, что именно из за этого вылетает? В рунете в основном советуют почистить диск, увеличить файл подкачки, сделать дефрагментацию.

На счет работоспособности скрипта в целом. Так задумано, что выдаются все инфопоршни из таблицы? :) Дебаг? Если нет, то в теле последнего if'а надо бы поставить break. Да и вообще как то рандомно надо выбирать инфопоршень, если такой инфопоршень есть, выбрать другой случайный, чисто моя логика, то бишь ИМХО.

PS: в справочнике вылетов такого еще нету/не нашел  :(

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

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

 

 


В рунете в основном советуют почистить диск, увеличить файл подкачки, сделать дефрагментацию.

Это когда ты играешь долгое время и память забивается, тогда - да, я бы винил подкачку и т.п., А сейчас: НИ, спавн бандоса и зомбированного, первый стреляет из ПБ во второго, тот обижается и даёт в зубы прикладом + раздаёт "в щи" контрольные пол-рожка. Ничего затратного, тем более, что и симуляция "спит" один час с НИ, а только потом начинает "кушать" ресурсы, творя своё великое дело! (как то громко вышло, хе-хе :russian_ru: ...)

P.S. Не объясните, почему таблицы лучше выносить за скрипт? А то мы без образования, скрипты без азбуки изучать пытаемся...

@Saruman, какая интересует платформа? На ЗП поставить выполнение функции при открытии инвентаря можно в файле actor_menu.script:

 

 

 


function inventory_wnd_opened()
твой_скрипт.твоя_функция()
printf("---:>Inventory opened")
end

 

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

@Сталкер Лом, по-моему, table.insert - это добавление в таблицу. То есть, вместо того, чтобы выдавать поршень, ты его добавляешь в таблицу, увеличивая ее до бесконечности. Отсюда и вылет в конце концов.

 

Чтобы выдать один поршень, самый простой вариант

local inf = rnd_tbl[math.random(#rnd_tbl)]
if not has_alife_info(inf) then
  give_info(inf)
end

Его минус в том, что чем больше у тебя поршней, тем меньше вероятность получить новый. В идеале нужно сохранять таблицу в памяти, и при получении поршня удалять его из таблицы. Тогда выбор будет идти всегда только из еще не полученных поршней. (Конечно, еще надо будет добавить проверку на то, что в таблице еще остались элементы if #rnd_tabl ~= 0) Но с сохранением я, к сожалению, помочь не могу.

Изменено пользователем azrael1325
  • Нравится 1

abramcumner

Согласен

По правилам Lua нельзя увеличивать таблицу во время перебора посредством table.insert.

Можно только удалять или изменять элементы

DEL

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

Вы запрашиваете значение элемента таблицы V

Но для всех полей Вашей таблицы значение V равно nil (Т.е. ключ - это строка с именем инфопорции, а значенее-то nil!!!!!!!!)

Не-не. Таблица вида

local rnd_tbl = {
	"Mutant_boar_info",
	"Flesh_info",
	"Pseudo_flesh_info",
	"Bloodsucker_info",
эквивалентна таблице

local rnd_tbl = {
	[1] = "Mutant_boar_info",
	[2] = "Flesh_info",
	[3] = "Pseudo_flesh_info",
	[4] = "Bloodsucker_info",
Ошибка в том, что при итерировании таблицы, таблица меняется(table.insert). Так делать просто нельзя.

 

Ну и код сам по себе напрочь бестолковый.

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

azrael1325, скрипт работает и инфопоршни выдаёт. Правда, при первом обыске был небольшой лаг (доля секунды игра "висела"), при втором уже подобного не было, но это не критично. А с тем, что под конец игры информация будет выдаваться реже, придётся смириться, до тех пор, пока не наберусь опыта в "скриптовом деле". Благодарю за подсказку.

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

[smart_terrain]
topi_smart_terrains=true

[logic]
active=patrol

[patrol]
path_walk=topi_smart_terrain_patrol_walk
path_walk=topi_smart_terrain_patrol_look

 

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

Ого, а insert то я и не увидел, вот я шляпа. Тогда все очевидно...

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

local infoportions = {"info_1","info_2","info_3"}
function load_game() --вызвать для удаления существующих\известных инфопорций
	for id,info in pairs(infoportions) do
		if db.actor:has_info(info) then
			table.remove(infoportions,id)
		end
	end
end
function give_rnd_info() --выдача случайного инфопоршня
	if not next(infoportions) then return end
	local chance = math.random(0,100)
	if chance < 20 then
		local id = math.random(#infoportions)
		db.actor:give_info_portion(infoportions[id])
		table.remove(infoportions,id)
	end
end 

 

 

Проверено под Lua for Windows 5.1.4

В критике не нуждаюсь, ибо ИМХО :)

PS: пока я писал, автор ответил.

Изменено пользователем Desertir
  • Нравится 1

 

 


path_walk=topi_smart_terrain_patrol_walk

path_walk=topi_smart_terrain_patrol_look

Не должно быть во второй строчке path_look?

Я извеняюсь за повторение, но на тушканов этот скрипт который писал выше подойдет??

StafGlawer, а  unbind и bind ты из головы взял? в оригинале их нет

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

 

@Sarumanда неужели? Все управление через биндинги в user.ltx прописано.

@StafGlawer, что то мне подсказывает, что анбиндинг работает не по значению, а по клавише, типа такого "unbind kP", но таким методом не заблокировать весь пда, контакты и карта все равно останутся (мб еще чтото, залезь в настройки управления). Можно попробовать разбиндивать и их, только нужно получать правильные клавиши, например у меня открытие активных задач далеко не на клавишу P. А как получать, не подскажу, могу только запутать :)

Вариант @Jurok'а из самых распространенных, в Солянке есть такая шняга с рюкзаком, якобы молния застряла (если ноги растут у этой идеи не из Солянки, уж извините, увидел именно в ней). Там проверяются инфопрошни, я уверен на 90% :) и как только получили инфопоршень открытия какого либо окна из ПДА его можно закрыть. Как - описано в справочнике по скриптам.

Я так понял с лыжами все в порядке ... а вот я дурак =) функция пашет (по-другому вызывал), но не в апдейте ... похоже я просто коряво вызвал, может тыкнешь пальчиком ? =) (ну е-мае первые шаги в скриптовании)

Хотел спросить, уже достаточно много времени прошло, никто не нашёл в ЗП более\менее адекватную замену функции level.main_input_receiver()? Эта функция возвращала текущее UI-окно, позволяя его изменять, но лично я её использовал чтобы определить что игрок сейчас не находится в инвентаре\ПДА\диалоге и вообще любом интерфейсе. Вроде одно время мелькало сообщение, что где то нашли функцию-замену в одном из UI-классов или типа того. Ну или вообще какие есть более\менее адекватные варианты чтобы определить что в данный момент у игрока не открыта никакая UI-менюшка (как движковые ПДА\Инвентори, так и скриптово добавленные окна) чтобы не делать для каждого из них персональную проверку.

 

_______________

Нашёл этот пост (в прошлый раз не так поиском воспользовался), он закрывает вопросы по
 level.main_input_receiver(), но всё ещё остаётся вопрос о том как универсальным методом определить что открыто любое UI-окно. (без правок движка)

Изменено пользователем *Shoker*
  • Нравится 1

Вроде одно время мелькало сообщение, что где то нашли функцию-замену в одном из UI-классов или типа того.

Где-то :) Malandrinus добавил в xray-extensions. Просто функция с подходощей сигнатурой нашлась в "одном из UI-классов".

 

Ну или вообще какие есть более\менее адекватные варианты чтобы определить что в данный момент у игрока не открыта никакая UI-менюшках

В actor_menu.script отслеживаются движковые окна. В скриптовые окна добавить при показе установку флажка, при закрытии сброс.

 

Нашёл этот пост (в прошлый раз не так поиском воспользовался), он закрывает вопросы по[/size] level.main_input_receiver(), но всё ещё остаётся вопрос о том как универсальным методом определить что открыто любое UI-окно. (без правок движка)

Совершенно не закрывает :) С окном, выведенным этим методом, невозможно никакое взаимодействие игрока. Это только для показа информации и все.
  • Нравится 1

Добавлю, что помимо actor_menu.script срабатывает функция actor_menu_mode из pda.script, но только для случаев:

-- 10 =  Talk dialog  show

-- 11 =  Talk dialog  hide
В actor_menu.script они не срабатывают.
На открытие pda выдаётся какой-то инфопоршень, на закрытие кажется тоже. Какие именно легко проверить, просто пишу, что они есть.
 
Используя xray-extensions получить текущее активное окно можно так:

dialog_wnd = CUIListBox():GetMainInputReceiver()

За что товарищу malandrinus огромное спасибо!
  • Нравится 1

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

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

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

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

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

Войти

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

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

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