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

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

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

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

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

 

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

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

S.T.A.L.K.E.R 1.004, Народная..Солянка от 19.04.10, дополнение 14.08.10, патч 3.09.10, DMX 1.3.5, Saruman addon 1.1

Vkontakte

Добавление нового транспорта в сталкер

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

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

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

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

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

ТЧ 1.0004. SAP и Trans mod

github

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

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

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

 

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

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

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

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

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

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

ТЧ 1.0004. SAP и Trans mod

github

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

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

 

 


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

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

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

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

@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

yl59NI59OeI.jpg

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

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

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

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

[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

ТЧ 1.0004. SAP и Trans mod

github

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

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Вроде одно время мелькало сообщение, что где то нашли функцию-замену в одном из 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 пользователей

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