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

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

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

Потребовалось для моего мода спавнить левел ченджеры не через аллспавн а скриптом,

потому как я не знал заранее местоположения перехода. Попробовал -

сделать это дело рандомным, случайное местоположение левел ченджера

и случайное место спавна ГГ.

Ниже можно скачать скрипты реализации этой идеи.

Описание: при появлении ГГ на любой из локаций - там рандомно спавняться 25 телепортов.

Мод для чистой игры с патчем 1.0004.

Есть баги: "проваливание" под карту, появление за пределами локи (один раз появился за Баром :D)

http://ifolder.ru/13401916

Пользуйтесь на здоровье!

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

Идея интересна не забрасывай! Я бы посоветовал сделать на только некоторых локах по 2-3 телепорта в трудных местах что бы кидали куда угодно!

Идеально подошло бы к НЛС или НС что бы можно было проходить на новые локи без известных проходов

Не соответствует. N6260

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

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

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

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

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

strong,

Если бы знал как убрать эти вылеты за карту

Можно просто прописать в переходах точки выхода. Тогда точно не улетишь туда, куда не запланировал. В моде Hand Teleport такой метод реализован еще прошлым летом. Там создается точка перехода под ногами ГГ и переносит туда, куда ты прописал в level_changer. Этих точек переходов много. Они рандомно выбираются при определенных условиях и возникает ощущение динамичности переходов.

Надо только не забывать удалять каждый раз level_changer после перехода. Иначе будут вылеты по story_ids.

Вот и здесь можно сделать такие же переходы. Заранее снять все координаты и активировать через скрипт в нужное время.

Кто весел - тот смеется, кто хочет - тот добьется, кто ищет - тот всегда найдет!

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

Gonarh,

Прочитай вот эту статью - http://stalkerin.gameru.net/wiki/index.php...%8F%D0%BC%D0%B8

 

А потом посмотри в моде Hand Teleport в файле spawn_level_changer.script реализацию.

Кто весел - тот смеется, кто хочет - тот добьется, кто ищет - тот всегда найдет!

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

дык я этот мод и делал на основе этой статьи, на скоко я понял, в "ручном телепорте" координаты

точек выхода сняты в игре, а у мну выбираются рандомно на основе графпойнтов. щас пытаюсь

устранить пропадения под карту и вылеты при помощи выбирания точек выхода в "безопасных зонах", реализацию хочу подсмотреть в АМК

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

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

 

strong,

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

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

Молод ты еще сталкер со мной по Зоне бегать.Вот когда из шестерок вырастешЬ, тогда поговорим.

А о моих подвигах после войны , тоже расскажешь.

Ссылка на комментарий
Ура , дело сдвинулось!

:unsure: не канает :dash2:

нужна помощь спецов, вылеты изза save file is corrupt и проваливание немогу победить :dash3:

пробовал спавнить точки выхода по принципу аномалий в АМК, брал оттуда зоны безопасности, чтобы не попадать в критические места - тоже самое :cray5:

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

Короче надо сделать так. Замутить выбросы и на выбросы приделать инфопорошни с именем к примеру

 

l01_escape_1

l01_escape_2

l02_gar_1

l02_gar_3

l02_gar_4

lxx_testmap1

lxx_testmap2

 

Потом спавним на локах по 4 левел чангера:

l01_escape

l02_garbage

lxx_testmap

 

Каждому в логику вбиваем:

[spawn]

cond = +\-%имя любого инфопоршня%

 

И рассоуваем их по локе. Когда происходят выбросы левел чангеры пропадают и появляются в новых местах.Вот так будет круче

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

модеров прошу снести тему, после тщательного исследования, пришел к выводу шо получение координат по левелвертексу любого другого уровня отличного от текущего - невозможно, посему данная фишка нереализуема :angry: => тему мона удалить

 

ыыыы... я ландух, реализуемо - ещё как! :beach:

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

dash2.gif где ж ты раньше был, щас попробуемс

Добавлено через 250 мин.:
Все, получилось, проблемы были именно с получением координат на другом уровне, поэтому были провалы под землю и вылеты. По совету Bak'а, сделал телепорт после использования левелченджера, красота. Все работает russian_ru.gifвот оно

Внес небольшые изменения в спавн, теперь количество телепортов зависит от уровня, чем дальше на север, тем больше => так я думаю и должно было быть, что чем дальше тем непредсказуемей. Это так чел доходит до Припяти, а тут бах - и он на Кордоне huh.gif вот где жесть biggrin.gif

Изменено пользователем Dennis_Chikin
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

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

 

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

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

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

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

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

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

 

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

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

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

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
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!
Ссылка на комментарий

1. Не поверишь, сам задумался над этой проблемой на выходных, щяс пытаюсь решить методом создания схемы для определённого типа спейс_рестриктора

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

3. Можно, но влом.

4. У мну нет скриптов которые я выкладывал, сайт ifolder.ru прикрыли, если приведеш код скрипта спавна - покажу

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий

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
ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!
Ссылка на комментарий

Радиус срабатывания рестриктора 2,а левел-ченджера - 0.01.

Если радиус срабатывания левел-ченджера выставишь больше 2,то рестриктор не будет успевать срабатывать и вспышки не будет.

 

Количество телепортов на локе определяется тут:

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

"старые следы"...

При заходе на локацию скрипт убирает объекты с секцией,содержащей lname.."_dynamic_lc_gonarh"

Спейс-рестрикторы спавнятся с секцией lname.."_dynamic_lc_gonarh_restrictor" и успешно убираются.

Левел-ченджеры спавнятся с секцией "level_changer" и потому не убираются.

Следовательно,чтобы избавиться от телепортов-фантомов,их нужно спавнить не так:

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

а вот так:

 local obj = alife():create(level.name().."_dynamic_lc_gonarh", source_dt.pos, source_dt.lvid, source_dt.gvid)

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...