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

Динамические левел_ченджеры


Gonarh

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

Ну неужели никому не интересна эта идея. Я прикрутил эту фишку к двум своим сборкам на основе ФриплейСтарт-мода и ОГСМ, отключил видимость телепортов и их отметки на миникарте и КПК, оставил только звук. И в итоге получил Зону в которой никогда не уверен где окажешься через секунду. Попробуйте представить себе ситуацию когда идя по сюжету и , к примеру, спасая Шустрого вдруг телепортируешься со второго этажа АТП на Янтарь, прямиком на болота к сноркам, и после этого сюжет встает вверх ногами, и что-бы идти по сюжету дальше надо как-то вернутся назад. И прорвавшись через ДТ, пройдя Бар и Свалку и шагнув, наконец, в штатный пережод на Кордон, переносишься в Припять, на стадион,и опять шок и опять адреналин в голову. И это настолько интересно , что мне уже почти по фигу что после некоторых телепортаций приходиться переигровать с ранних сейвов (у меня сзади всегда два три сейва).

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

Может наши Мастера обратят внимание на эту разработку ?

Изменено пользователем strong
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

Уф..ф..ф!!! Наконец то я дождался одной из лучших фишек для Сталкера!! Я верил в наших Мастеров!! Поставил , побегал, два часа кряду -- полет нормальный. Спасибо!!

 

Gonarh, а почему ты исключил из зон спавна телепортов локации Бар, ЧАЭС-1 и ЧАЭС-2?

Ну с баром более менее понятно - зона безопасности, хотя и там можно, по моему спаунить три-четыре телепорта, но с ЧАЭС-1 и ЧАЭС-2 не понятно.

Изменено пользователем strong
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

"Старые следы" и "Легенда Зоны"

 

Немного беллетристики в столь серьезном разделе форума как "Школа..."

Хочу описать пару моментов, замеченных мною при использовании данного мода.

Все мы играем в ту игру, которую сами себе придумываем. И СТАЛКЕРА это касается в большей степени , чем многих других игр. Ждали одного - получили совсем другое. И по сему я принял для себя два варианта игры с данным модом:

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

2.Не касаться сюжета вообще, не выполнять сюжетных заданий, довольствоваться только побочными квестами, короче просто жить в Зоне. И это мне нравится больше.

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

Но это все лирика, а вот немного практики.

Интегрировал данный мод в целую кучу модов:Freeplay Start, OGSM_v2.3.1_ultimate, чистый AMK_MOD_1.4.1, Priboi_Stori_1.1, Новый сюжет-5"Тайные тропы". Скрипт "прыжка" срабатывает идеально.

Но при досаточно долгой игре (1.5-2часа) наблюдается такое : появляются телепорты-фантомы, т.е. телепорты без отметок на карте но в тех же самых местах где они были при предыдущей загрузки уровня. И срабатывают они мгновенно, без отыгрыша партиклов (побеление и мерцание экрана) и без звука.

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

И напоследок еще чуть-чуть лирики. В очередной раз "присев" к сталкерскому костерку после целого дня мотания по Зоне и "прыжков" с локи на локу, я вдруг с удивлением понял, что сталкерская байка о сталкере Проводнике, которого видят одновременно в разных местах Зоны и которого не останавливают никакие кордоны и аномалии это рассказ про меня, т.е. конечно про ту ипостась ГГ, которую я сейчас, с данным модом, отыгрываю.

Приятно, черт возьми, почувствовать себя "Легендой Зоны"

И еще раз автору - СПАСИБО МАСТЕР!

Изменено пользователем strong
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

Назрели вопросы. Есть большое желание максимально приблизить работу данного скрипта к воздействию на ГГ аномалии. Со всеми сопутствующими эффектами.

1- При увеличении радиуса срабатывания телепорта (не как сейчас, практически в точке), т.е. .грубо говоря, создания некой зоны аномалии, перестают проигрываться партиклы телепорта. Скорее всего просто не успевают. Можно ли это как-нибудь исправить?

2- Можно ли при загрузе уровня не показывать статичную картинку(intro), а проигрывать видео или те же партиклы? К примеру попал в зону срабатывания, заклубился туман, рассеялся и ГГ на новой локе.

3- Можно ли привязать к моменту появления ГГ на новой локе постэффект? Типа расколбас после перехода секунд на 10-15.

4- Как изменить количество телепортов на локе, что-то не нашел где это прописано в скрипте.

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

Обьясните "на пальцах" и по подробней.

Изменено пользователем strong
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

Gonarh

 

Вот твой скрипт - http://depositfiles.com/files/8wiatufmd

Покажи, если не сложно.

Или тебе лучше так:

------------- Спавн динамических телепортов --------------

-------------------- Copyright 2009 Gonarh ---------------

 

local real_lc_points =

{

[1] = {gvid = 3,

lvid = 312314,

pos = {31.3994522094727,16.5561962127686,677.265319824219},

dir = {0,0,0},

name = "l01_escape",

graph = "start_actor_01"},

[2] = {gvid = 253,

lvid = 209876,

pos = {36.4117431640625,0.481237411499023,-305.824523925781},

dir = {0.0111562451347709,-0.000250374461757019,0.0224392339587212},

name = "l02_garbage",

graph = "start_actor_01"},

[3] = {gvid = 693,

lvid = 432735,

pos = {273.589294433594,0.312782287597656,0.272092819213867},

dir = {0.0002013473858824,2.00711727142334,-0.00200603087432683},

name = "l03_agroprom",

graph = "start_actor_02"},

[4] = {gvid = 813,

lvid = 1321,

pos = {-188.877655029297,3.94756889343262,-193.695678710938},

dir = {0,-1.12671363353729,0},

name = "l04_darkvalley",

graph = "start_actor_01"},

[5] = {gvid = 1412,

lvid = 67363,

pos = {31.4319934844971,-0.632162094116211,140.407974243164},

dir = {0,0,0},

name = "l06_rostok",

graph = "start_actor_01"},

[6] = {gvid = 1546,

lvid = 16231,

pos = {-334.578491210938,-25.5103607177734,45.0102348327637},

dir = {0,-0.698128044605255,0},

name = "l07_military",

graph = "start_actor_01"},

[7] = {gvid = 1459,

lvid = 136760,

pos = {195.41227722168,5.87823486328125,-245.030059814453},

dir = {-0.0813582167029381,1.53351366519928,-0.0476411543786526},

name = "l08_yantar",

graph = "start_actor_01"},

[8] = {gvid = 1868,

lvid = 199539,

pos = {568.326354980469,-53.4707336425781,-408.685577392578},

dir = {0.0186832379549742,-0.353888958692551,0.0474293567240238},

name = "l10_radar",

graph = "start_actor_01"},

[9] = {gvid = 2269,

lvid = 145458,

pos = {34.8646354675293,-2.15999984741211,-290.553436279297},

dir = {0,0,0},

name = "l11_pripyat",

graph = "start_actor_01"}

}

 

local levels ={ "l01_escape", "l02_garbage", "l03_agroprom",

"l04_darkvalley", "l06_rostok", "l07_military",

"l08_yantar", "l10_radar", "l11_pripyat"}

 

local level_vertexes={ l01_escape = 595499, l02_garbage = 382663, l03_agroprom = 437420,

l04_darkvalley=390124, l06_rostok=67712, l07_military=418267,

l08_yantar=141470, l10_radar=227188, l11_pripyat=261218}

 

 

local level_number={ l01_escape = 1, l02_garbage = 2, l03_agroprom = 3, l03u_agr_underground=4,

l04_darkvalley=5, l04u_labx18=6, l05_bar=7, l06_rostok=8, l07_military=9,

l08_yantar=10, l08u_brainlab=11, l10_radar=12, l10u_bunker=13, l11_pripyat=14

}

 

 

local game_vertexes={ l01_escape={0,251}, l02_garbage={252,415}, l03_agroprom={416,702},

l03u_agr_underground={703,810}, l04_darkvalley={811,1108},

l04u_labx18={1109,1167}, l05_bar={1168,1307}, l06_rostok={1308,1437},

l08_yantar={1438,1528}, l08u_brainlab={1529,1544}, l07_military={1545,1861},

l10_radar={1862,2116}, l11_pripyat={2117,2272}}

 

local array_lc = {}

 

function save_variable(variable_name, value)

xr_logic.pstor_store(db.actor, variable_name, value)

end

 

function load_variable(variable_name, value_if_not_found)

return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)

end

 

function get_random_coordinates(lname)

local gvn, gvx, lvx = game_vertexes[lname][1], game_vertexes[lname][2], level_vertexes[lname]

local min_dist = 100000

local data = {}

data.lvid = math.random(1, lvx)

data.pos = level.vertex_position(data.lvid)

data.gvid = 0

for a = gvn, gvx do

g1 = game_graph():vertex(a):game_point()

if g1:distance_to(data.pos) < min_dist then

min_dist = g1:distance_to(data.pos)

data.gvid = a

end

end

return data

end

 

function create_lc(source_dt,dist_dt)

local obj = alife():create("level_changer", source_dt.pos, source_dt.lvid, source_dt.gvid)

if obj then

data = xr_packet.read_level_changer_params(obj)

local rad

data.shapes[1]={}

data.shapes[1].shtype=0

data.shapes[1].center = vector():set(0,0,0)

data.shapes[1].radius = 0.01

data.dest_gvid = dist_dt.gvid

data.dest_lvid = dist_dt.lvid

data.dest_pos = dist_dt.pos

data.dest_dir = dist_dt.dir

data.dest_lname = dist_dt.lname

data.silent_mode = 1

xr_packet.write_level_changer_params(data, obj)

return obj

end

end

 

function show_teleport()

local snd_obj = xr_sound.get_safe_sound_object([[affects\tinnitus3a]])

snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)

level.add_pp_effector ("teleport.ppe", 2006, false)

db.actor.power = 0.07

end

 

function spawn_restrictor(p_name, p_vector, p_lv, p_gv, p_radius, cust_data)

local obj = alife():create(p_name, p_vector, p_lv, p_gv)

local data = xr_packet.read_restrictor_params(obj)

data.custom = cust_data

data.shapes[1]={}

data.shapes[1].shtype=0

data.shapes[1].center = vector():set(0,0,0)

data.shapes[1].radius = p_radius

xr_packet.write_restrictor_params(data,obj)

return obj

end

 

function get_random_loc_index(lvl)

local random_index = math.random(table.getn(levels))

local rand_lvl = levels[random_index]

if rand_lvl ~= tostring(lvl)

then return random_index

else return get_random_loc_index(lvl) end

end

 

function get_dest_data(lname)

local dst = {}

index_point = get_random_loc_index(lname)

for i, data in ipairs(real_lc_points) do

if i == index_point then

dst.pos = vector():set(data.pos[1], data.pos[2], data.pos[3])

dst.lvid = data.lvid

dst.gvid = data.gvid

dst.lname = data.name

dst.dir = vector():set(data.dir[1], data.dir[2], data.dir[3])

dst.graph = data.graph

break

end

end

return dst

end

 

function spawn_random_lc(lname)

local src = get_random_coordinates(lname)

local obj = create_lc(src, get_dest_data(lname), 0.01, lname.."_dynamic_lc_gonarh")

if obj then

table.insert(array_lc, obj)

level.map_add_object_spot(obj.id, "red_location", "Телепорт")

end

local custom_data = "[logic] \nactive = sr_idle \n[sr_idle] \non_actor_inside = %+teleport_show%\non_actor_outside = %-teleport_show%"

spawn_restrictor(lname.."_dynamic_lc_gonarh_restrictor", src.pos, src.lvid, src.gvid, 2, custom_data)

end

 

function spawn_teleports()

db.actor:disable_info_portion("teleport_show")

local lname=level.name()

for a=0,65535 do

local obj = alife():object(a)

if obj then

if string.find(obj:name(), lname.."_dynamic_lc_gonarh")

then alife():release(obj) end

end

end

if level_vertexes[lname] and level_vertexes[lname] > 0 then

array_lc = {}

min_lc = level_number[lname]*2

lc_cnt = math.random(min_lc, min_lc+math.random(7,15))

for i=1, lc_cnt do spawn_random_lc(lname) end

end

if load_variable("mv_pos",0) == 1 then

save_variable("mv_pos",0)

db.actor:set_actor_position(get_random_coordinates(lname).pos)

end

end

 

function detect_need_move_actor()

local mv_pos = 0

for i, lc in pairs(array_lc) do

obj = level.object_by_id(lc.id)

if obj and db.actor:position():distance_to(obj:position()) <= 4 then

mv_pos = 1

break

end

end

if mv_pos > 0 then save_variable("mv_pos",1) end

end

 

 

А по поводу большего соответствия аномалии есть такая задумка. Распишу поэтапно как придумалось:

- Вспоминаем первые секунды "жизни в Зоне", очухиваемся у Сидора, затем экран медленно гаснет и также медленно открывается по новой.Это начало срабатывания аномалии, точнее первая половина.При попадании в зону рестриктора происжодит "подтягивание" ГГ к центру (как у аномалии Трамплин кажется) и медленно гаснет экран.

- Срабатывает скрипт перехода, идет загрузка уровня. При этом можно убрать dds-ки задника и загрузочного экрана, а точнее залить их, к примеру, черным цветом, также как и шрифты сообщений" ...загрузка текстур...синхронизация... и т.д." Черное на черном получаем черный экран.Я думаю не большая потеря, если мы не прочитаем этого, точно также как и отключение худа в этот момент.

- В момент "материализации" на новой локе экран медленно светлеет. Эдесь хорошо бы реализовать что-то типа "выталкивания" из зоны рестриктора и небольшой расколбас.

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

Изменено пользователем strong
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

Спасибо за разьяснения, после правки телепорты-фантомы исчезли. Но непонятки с количеством телепортов

остались. Я еще раз говорю, я в програмировании ноль, но руководствуясь только логикой и остатками

английского я пришел к такому выводу. За количество телепортов на локе отвечают две строки в скрипте, вот

эти:

min_lc = level_number[lname]*2
lc_cnt = math.random(min_lc,min_lc+math.random(7,15))

Из первой строки ясно, что кол-во определяется номером левела(да еще умноженному на 2 кажется), а во второй к этому кол-ву прибавляется еще какое-то рандомное число. На начальных уровнях вроде все в порядке, но представте себе сколько спавнится телепортов на уровне Болото с порядковым номером 33 в MapPack-е. Но здесь хоть площадь локи позволяет, а на локе Госпиталь под номером 28 просто кошмар. Я немного переделал эти строки, вот так:

min_lc = 3
lc_cnt = math.random(min_lc,min_lc+math.random(5,10))

И количество телепортов пришло в более-менее сносное состояние.

И хочу задать еще пару вопросов. Что касается ТЧ, здесь все в порядке, все работает безупречно. Но я привинтил этот скрипт к сборке ЗП+MapPack. В принципе все работает как надо , только иногда вылетает в Винду вот с этими логами:

Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : 
D:\prog_repository\sources\trunk\xrServerEntities\scri
pt_storage.cpp
Line          : 748
Description   : ....r. - 
cop\gamedata\scripts\bind_level_changer.script:46: 
attempt to index field 's_obj' (a nil value)


Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : 
D:\prog_repository\sources\trunk\xrServerEntities\scri
pt_storage.cppLine          : 748
Description   : ....t.a.l.k.e.r. - 
cop\gamedata\scripts\xr_logic.script:1270: attempt to 
index local 'obj' (a nil value)

Насколько я понял затык идет из присутствия в ЗП файла bind_level_changer.script , их просто надо развести по

времени срабатывания. Как это сделать? И второй вопрос почему на локах ЧАЭС и ЧАЭС-2 отметки переходов не отображаются в пда? Как их включить?

ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


Ссылка на сообщение
Не верно.Минимальное количество телепортов на локации с именем lname равно удвоенному числу,которое берется из таблицы level_number,описанной в начале файла.

Ни Болот, ни Госпиталя в ней нет,и динамических телепортов на этих локациях не будет.

Уже есть. Я расширил таблицу на весь MapPack. И чем твой ответ отличается от моего вопроса, я кажется тоже самое и написал.

 

Цитата

почему на локах ЧАЭС и ЧАЭС-2 отметки переходов не отображаются в пда?

 

По той же причине - динамических телепортов там нет.

См. ответ выше, телепорты есть и их видно на миникарте, но не видно в ПДА, т.ч. вопрос остался.

Мне это нужно на момент отработки. Потом отметки от рестрикторов будут отключены.

Изменено пользователем strong
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

С этим вариантом скрипта не пробовал, а со старым вариантом у меня получалось.

Вот в этом месте

function get_random_coordinates(lname)
local gvn, gvx, lvx = game_vertexes[lname][1], game_vertexes[lname][2], level_vertexes[lname]
local min_dist = 100000

уменьшая значение local min_dist = 100000 до 1000 прыгал по телепортам на одной локе

ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

Работает и на ЗП.

ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!

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


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

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