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

[SoC] Ковыряемся в файлах


Halford

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

local strn_id = obj and obj.smart_terrain_id and obj:smart_terrain_id()

if strn_id and strn_id ~= 65535 then

local strn = alife():object( strn_id )

...

end

 

Schemen Sie sich !

Поделиться этим сообщением


Ссылка на сообщение

1. alife():object("esc_fox") ;)

2. known_info - теоретически - выдается при разговоре/обшаривании трупа. На практике - "есть нюанс" ©

Поделиться этим сообщением


Ссылка на сообщение

Вспышка, что, таки у серверных объектов появился и заработал метод set_dest_level_vertex_id() ?

 

У них есть CALifeSmartTerrainTask(), но это вообще-то путь, из которого берется начальная точка работы.

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

Поделиться этим сообщением


Ссылка на сообщение

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

 

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

 

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

После того, как все добавлено/оттестировано  - можно опять отключить.

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

Поделиться этим сообщением


Ссылка на сообщение

Люди, ну читайте вы внимательно, святого Слонопотама ради !

В смарте есть гулаг. У гулага есть конфиг. В конфиге есть работы. У работы есть путь. Вот в первую точку этого пути непись и бежит.

В офлайне в том числе. Собственно, именно так он и между локациями перемещается. Если переходы прописаны. Но это уже в маппинг.

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

Поделиться этим сообщением


Ссылка на сообщение

Ну вот сразу:

 

local t_common = system_ini():r_s32("options","t_common")

- в конфиге должны быть эти самые options.

 

smart_terrain.prot_smt_td - ссылается на соответствующий файл из ogse.

 

с соляночным amk.script несовместимо.

Поделиться этим сообщением


Ссылка на сообщение

Сделать можно все. Но кто это будет делать, и зачем ? То, что делаю я - выложил.

 

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

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

Поделиться этим сообщением


Ссылка на сообщение

[smart_terrain]

type = gar_ost

capacity = 1

cond = {+freeplay}

 

Ну и где этот самый freeplay выдается ?

Поделиться этим сообщением


Ссылка на сообщение
function gulag:get_job_path_name( job )
	local section = job.section

	if not self.ltx:line_exist( section, "active" ) then
		abort( "gulag: ltx=%s  no 'active' in section %s", self.ltx_name, section )
	end

	local active_section = self.ltx:r_string( section, "active" )
	local path_field

	for i, v in ipairs( path_fields ) do
		if self.ltx:line_exist( active_section, v ) then
			path_field = v
			break
		end
	end

	if not path_field then
		abort( "gulag: ltx=%s, there is no path in section %s", self.ltx_name, active_section )
	end

	if path_field == "center_point" then --' TODO убрать затык
		local path_name = self.name .. "_" .. self.ltx:r_string( active_section, path_field )

		if level.patrol_path_exists( path_name .. "_task" ) then
			return path_name .. "_task"
		else
			return path_name
		end
	else
		return self.name .. "_" .. self.ltx:r_string( active_section, path_field )
	end
end

 

Имеющий да усмотрит.

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

Поделиться этим сообщением


Ссылка на сообщение

А вы бы таки в приведенный кусочек кода распечаточку-то вставили бы... ;)

Поделиться этим сообщением


Ссылка на сообщение

Зачем оно вообще в смарте ?

 

А вообще, слона обычно едят по частям.

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

Поделиться этим сообщением


Ссылка на сообщение

"Крот должен пойти под этот смарт после выдачи поршня."

 

Ну так условие тогда прописывается Кроту, а не смарту.

[smart_terrains]

none = {-freeplay}

gar_ost = {+freeplay}

- вполне достаточно.

 

А для поверки вообще оставить gar_ost = true

 

Угум, сначала делаем все сразу , а потом начинаем гадать, что не работает.

 

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

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

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

 

Гм... Еще раз перечитал, и сам ничего не понял.

 

Если по другому сформулировать, то любой непись стремится занять свободную работу с наибольшим приоритетом. Но, если там есть предикат, и непись не прошел по условию, на эту работу его не пустят.

Пример с Кордоном: работа для Волка имеет наивысший приоритет. Поэтому, пока она свободна, на нее пытаются назначить всех подряд. Но подходит только Волк, так что он на ней в итоге и оказывается.

Если таких работ будет 3 - Волк займет одну, с максимальным приоритетом, остальные 2 останутся свободными.

 

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

 

Просто у работ с предикатами приоритеты должны быть максимальны.

И, да, я гулаговый скрипт переписал: там если есть предикат - приоритет автоматически поднимается, + альтернативный формат описания работ.

 

типа вот так:

["esc_lager"] = {    -- Лагерь новичков на Кордоне-- "logic@esc_lager_sleeper1"    -- бункер доктора-- "logic@esc_lager_sleeper2"    -- ближний бункер к Волку-- "logic@esc_lager_sleeper3"    -- ближний бункер к Волку-- "logic@esc_lager_sleeper5"    -- в развалинах-- "logic@esc_lager_sleeper6"    -- бункер доктора-- "logic@esc_lager_sleeper7"    -- дом на входе-- "logic@esc_lager_defend1"    -- напротив костра    -- занято под Фаната-- "logic@esc_lager_defend2"    -- за кустом у развалюхи-- "logic@esc_lager_defend3"    -- ХРЕНОВЫЙ. чуть дальше и правее 2. Наемники видят !-- "logic@esc_lager_defend4"    -- типа за бункером, между ним и кустом. todo: в олспавне сдвинуть чуть дальше.-- "logic@esc_lager_defend5"    -- ХРЕНОВЫЙ. Типа за бочкой.-- "logic@esc_lager_defend6"    -- ближний бункер к Волку-- "logic@esc_lager_defend7"    -- ближний бункер к Волку-- "logic@esc_lager_defend8"    -- дальний-- "logic@esc_lager_defend9"    -- дальний (Когда-то был Петруха)-- "logic@esc_lager_defend10"    -- дальний (Толик. Был.)-- "logic@esc_lager_defend11"    -- дальний-- "logic@esc_lager_defend12"    -- Фанат. И ему здесь смерть, по тому что он первый, кого видят наймы еще от дороги.-- "logic@esc_lager_defend13"    -- дальний, и таки Волк.    -- охранники    { section = "logic@esc_lager_zoneguard1", -- "logic@esc_lager_zoneguard1",    idle = 0, prior = 9, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_zoneguard2", -- "logic@esc_lager_zoneguard2",    idle = 0, prior = 9, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_walker3",    idle = 0, prior = 8, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_walker4",    idle = 0, prior = 8, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend2",    idle = 0, prior = 14, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend4",    idle = 0, prior = 12, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend6",    idle = 0, prior = 10, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend7",    idle = 0, prior = 9, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- у костра днём    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 6, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 6, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 6, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- спящие ночью    { section = "logic@esc_lager_sleeper1",    idle = 0, prior = 5, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper2",    idle = 0, prior = 5, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper3",    idle = 0, prior = 5, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend8",    idle = 0, prior = 8, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend9",    idle = 0, prior = 7, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend10",    idle = 0, prior = 7, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- спящие ночью и днём    { section = "logic@esc_lager_sleeper5",    idle = 0, prior = 4, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper6",    idle = 0, prior = 3, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper7",    idle = 0, prior = 3, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend11",    idle = 0, prior = 6, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },                        -- где-то тут был Толик    { section = "logic@esc_lager_defend14",    -- Волка скорее всего нет    idle = 0, prior = 5, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend15",    -- если Толик помер.    idle = 0, prior = 4, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_sleeper5",    -- если все еще не лезет.    idle = 0, prior = 3, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- Волк, собственной персоной.    { section = "logic@esc_lager_volk",    idle = 0, prior = 19, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_wolf" end },    { section = "logic@esc_lager_defend13",    idle = 0, prior = 20, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_wolf" end },    -- and not (has_alife_info("agroprom_military_case_have") and has_alife_info("esc_fanat_spawn") ) end },    -- Фанат    { section = "logic@esc_lager_fanat",    idle = 0, prior = 19, state = {0, 1},    in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_fanat" end },    { section = "logic@esc_lager_defend12",    idle = 0, prior = 20, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["profile_name"] == "esc_fanat" end },    -- резерв на случай смерти Волкофаната.    { section = "logic@esc_lager_sleeper1",    idle = 0, prior = 2, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 2, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend5", -- ХРЕНОВЫЙ. Но резерв.    idle = 0, prior = 2, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    -- Шустрый    { section = "logic@esc_lager_shustryi_sleep",    idle = 0, prior = 18, state = {0, 2}, in_rest = "", out_rest = "",    predicate = function(obj_info) return ( obj_info["profile_name"] == "esc_shustryi" )        and has_alife_info( "tutorial_wounded_give_info" ) end },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 18, state = {1}, in_rest = "", out_rest = "",    predicate = function(obj_info) return ( obj_info["profile_name"] == "esc_shustryi" )        and has_alife_info( "tutorial_wounded_give_info" ) end },    { section = "logic@esc_lager_shustryi",    idle = 0, prior = 17, state = {0, 1, 2}, in_rest = "", out_rest = "",    predicate = function(obj_info) return ( obj_info["profile_name"] == "esc_shustryi" )        and has_alife_info( "tutorial_wounded_start" ) end },    { section = "logic@esc_lager_shustryi",    idle = 0, prior = 16, state = {0, 1, 2}, in_rest = "", out_rest = "", online = false,    predicate = function(obj_info) return obj_info["profile_name"] == "esc_shustryi" end },    -- резерв на случай смерти Шустрого    { section = "logic@esc_lager_sleeper2",    idle = 0, prior = 2, state = {0}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1",    idle = 0, prior = 2, state = {1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend3", -- ХРЕНОВЫЙ. Но резерв.    idle = 0, prior = 2, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_kamp1", -- ну наплодили... больше некуда, кроме как к костру    idle = 0, prior = 1, state = {0, 1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend1", -- Занято под Фаната    idle = 0, prior = 1, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone" },    { section = "logic@esc_lager_defend16", -- Толик. Пусть дальше спит.    idle = 0, prior = 16, state = {2}, in_rest = "", out_rest = "esc_lager_guard_kill_zone",    predicate = function(obj_info) return obj_info["name"] == "esc_vagon_wounded" end }},

 

- это уже со всеми фиксами типа бегающего Шустрого, вылета по нехватке работ, переключениях при дохлых неписях и т.д. - и все равно гораздо нагляднее.

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

Поделиться этим сообщением


Ссылка на сообщение

Тот, кто сказал, что так можно делать - он Вас обманул, зачем-то.

Если не знаете, что и зачем делает какая-либо строчка - не надо ее ни куда добавлять.

 

 

--- Блин, достало уже автообъединение постов ! Хоть клона заводи...---

Сейчас будет по другому вопросу.

 

Чистил сейчас "разработку НС", и наткнулся на свой древний пост:

 

"Так, скажите кто-нибудь: эта конструкция -

on_timer = 120000 | mob_home1

on_signal = sig_attacked | mob_combat

- вообще в принципе работает ? Я вижу, что срабатывает всегда только переключение по первому условию. Вряд-ли это имеет отношение к вылету, но тем не менее."

 

Потом вспомнил, как уже позже разбирал xr_logic, и нашел там целых две засады. А потом вспомнилось еще и несколько дискуссий здесь "почему у меня не работает"...

 

Так вот записываю здесь, чтобы самому опять не забыть, и в надежде, что если вдруг кто, столкнувшись с аналогичным, сделает поиск по "переключение секций логики":

 

Засада первая: при разборе логики в таблицы, у вас может случится так, что окажутся 2 одинаковых ключа.

Скажем, true. Или false. ;) Да, такое бывает в оригинальном скрипте.

Соответственно, в таблице окажется только одно условие.

 

Засада вторая: при проверке условий может проверяться, что они ВСЕ true или ВСЕ false.

 

Руки дойдут - может, вытащу эти куски из оригинала с подробным разбором. Не дойдут - не вытащу.

Что делать ? Оставьте в вашей логике только одно условие. И проверьте, работает ли. Потом - другое, но опять же, одно.

Если по отдельности все работает так, как надо, а вместе - неправильно - см. выше причины, и попытайтесь переписать как-то иначе.

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

Поделиться этим сообщением


Ссылка на сообщение

Самое простое, что можно сделать со звуком, это sounds\characters_voice\бла-бла\death\* поудалять - во ВСЕХ бла-бла, и оставить в каждом по одной пустышке. Заодно и лагов по-меньше станет.

 

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

 

 

P.S. А вообще, как же достало это сектанство, когда все сидят по 2-3 человека по своим маленьким уютненьким подпольям, и если что-то как-то передается, так через 10-е руки... 8(

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

prefetch за че отвечают

Есть подозрение, что в итоге - вообще ни за что.

 

Проверить пока ни кому не удалось за отсутствием локаций, на которых было бы только то, что указано в этих файлах.

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

Поделиться этим сообщением


Ссылка на сообщение

_Dunay_, вообще-то про телепатию все сказано в шапке, но я попробую сыграть в эту викторину, и догадаться, про что был вопрос. Если не угадаю, прошу строго не наказывать.

 

Находящиеся на поясе патроны могут быть прописаны как боеприпасы для оружия. Ну и, соответственно, этим патронавм прописан пояс и автовзятие. Если они вдруг обнаруживается не на поясе - удалять, и создавать вместо нее что-то другое.

А пачки патронов в рюкзаке можно, например, прописать на классе антирада, но ни к какому оружию их, естественно, не прописывать. И при использовании создавать патроны на поясе. Либо, действительно, сразу устанавливать количество патронов в оружии.

 

Как-то так, наверное. Если я правильно понял вопрос.

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

Поделиться этим сообщением


Ссылка на сообщение

Что-то моя очередь пришла глупые вопросы задавать.

 

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

флаги - ffffffbf, естественно, переключения on/off не запрещены.

 

От чего оно зависит ?

 

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

 

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

 

P.S. Ибо да, достали квестовые неписи, застрявшие посреди лагеря других квестовых неписей, враждебных, и ждущих, когда актор подойдет на расстояние алайфа, чтобы всех убить либо сдохнуть.

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

Поделиться этим сообщением


Ссылка на сообщение

Любому торговцу и даже просто неписю можно прописать сколько угодно секций, и условий, по которым они будут переключаться. Только очень аккуратно, поскольку при малейшей ошибке виснут наглухо.

По аналогии с тем же торговцем на Кордоне:

buy_supplies = {+esc_kill_bandits_quest_done} supplies_after_fabric, supplies_start

товары, имеющиеся в наличии = {условие} секция со списком,  {условие} другая секция со списком, ... и так сколько надо, секция для случая, если ни одно условие не подошло.

Аналогично - цены на покупку, цены на продажу.

 

Конкретные условия - тут уже делающему виднее, что в них прописывать, и как именно у него выжигатель отключается. Телепаты, традиционно, в отпуске. Считается, что если он способен изменить конфиг так, чтобы не попортить - то и с выжигателем как-то разобрался.

 

Но злоупотреблять этим не стоит, поскольку конфиги читаются довольно медленно. Чем больше размер файла - тем медленее и печальнее.

 

 

Прицелы и даже гранатометы - на самом деле, можно. Но не нужно. Так что эпическую поэму "о сменных гранатометах" в трех томах писать вряд-ли кто-то будет.

 

Ночной прицел как на арбалете в НС делается точно так же, как ночной прицел на арбалете НС. ;)

Проверяется actor:accuracy(), если получено значение, какое надо, проверяется оружие в руках, и если оно тоже какое надо - включается нужный эффект, например: level.add_pp_effector( "bast.ppe", 1034, true ) - если такой есть. Хоть ночное зрение, хоть мигание, хоть пляшущие голые деффки.

 

 

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

Поделиться этим сообщением


Ссылка на сообщение

Визуал - это и есть модель, или я чего-то не понимаю ?

А логика меняется вообще постоянно:

xr_logic.configure_schemes( npc, ltx, self.ltx_name, stype, sect, self.name )

xr_logic.activate_by_section( npc, ltx, xr_logic.determine_section_to_activate( npc,

ltx, sect, actor ), false )

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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