Эта тема создана для общения модостроителей. Не обязательно, если вы строите моды например только для ТЧ - тема предназначена для общения мододелов и ТЧ, и ЧН, и ЗП. Общайтесь, выкладывайте, разъясняйте. Также здесь обсуждаются не только модостроительство, но и сами моды.
Приветствуется: - Помощь другим модостроителям - Дружеское общение на тему модостроительства
Запрещается: - Оффтоп (Сообщения не по теме) - Провокации и оскорбления - Реклама своих модов
Разрешается: - Выкладывание ссылок на какой-либо нужный материал
Сообщение отредактировал Вектор - Воскресенье, 21.08.2011, 18:31:14
Vova-VIP, получилось! Но проблема. Он заспавнился не в подвале, как у меня на скрине, а раазрушенном доме рядом. И ещё. Как прописать такую логику, чтобы он стоял на месте, но скажем, при Выбросе бежал в укрытие? Я потому и заспавнил его под землёй, в укрытии, потому что незнаю, побежит ли он в укрытие?
Вектор, либо в подвал спавнить нельзя, либо выход только следующий: в spawn_section ты же создал секцию торгаша своего. Ниже community = ***** пиши, ну например:
Code
custom_data = scripts\название_файла.ltx
Ну а потом в config\scripts\ создай свой пустой блокнот название_файла.ltx В нём пропиши (кстати если он будет стоять на месте, он возможно будет смотреть в стенку, а не в твою сторону. С дирекцией в скрипте я не парюсь и прописываю дополнительную строчку в логике. При ней он всегда будет смотреть на тебя):
Code
[smart_terrains] none = true
[logic] active = remark1 danger = danger_ignore trade = misc\trade_weapons.ltx
[danger_ignore] ignore_distance = 5
[remark1] no_move = true target = actor
-----------------------
Строчку target = actor забыл написать, уже исправил.
Не забудь про строчку trade = misc\trade_trader.ltx, она указывает чем он торгует и как. Можешь сделать как у Сидоровича для начала.
Истинный путь MOD ver. 1.3.0 (ТЧ) готов! Истинный путь v2.0 (ТЧ) готов!
Сообщение отредактировал Vova-VIP - Вторник, 23.08.2011, 12:21:46
Vova-VIP, для теста добавил в продажу Г36. Загрузил игру. Подошёл к торговцу (На этот раз в норм. месте заспавнился.) У него ничего не оказалось. Перезагрузил (Авось пояится Г36) Словил интересный вылет:
Code
Expression : hFile>0 Function : FileDownload File : E:\stalker\patch_1_0004\xrCore\FS.cpp Line : 106 Description : d:\Игры Антона\Моды\stalker shoc\gamedata\config\
Добавлено (23.08.2011, 12:41:49) --------------------------------------------- Стоп, больше вылета не последовало. Всё заработало! Спасибо.
Добавлено (23.08.2011, 12:44:40) --------------------------------------------- Кстати торговлю я тоже идеально делаю, если проблемы будут по этом поводу, спрашивай.
Истинный путь MOD ver. 1.3.0 (ТЧ) готов! Истинный путь v2.0 (ТЧ) готов!
Много чего. Спавнить, создавать НПС, делать новых монстров (на основе старых естественно), делать диалоги в которых сам бывает запутываюсь, задания, в скриптах разбираюсь примерно так же как и ты, логики писать умею, но не мастерски, вообщем перечислять безсмысленно. То что я не умею - почти всё связаное с новыми локациями, почти всё что нужно делать через SDK ну и большие скрипты писать не умею, из других модов функции выносить без тутора не могу, ну и особо скрипты писать не умею и куча всяких мелочей.
Добавлено (23.08.2011, 13:02:10) --------------------------------------------- Сейчас в моде своём бар обустраиваю, сегодня наверное буду Мертвый город присоединять, думаю получится
Истинный путь MOD ver. 1.3.0 (ТЧ) готов! Истинный путь v2.0 (ТЧ) готов!
Добавлено (23.08.2011, 13:05:59) --------------------------------------------- Vova-VIP, кстати, но основе создания диалогов понял принцип вызывания скриптов в самих скриптах.
Vova-VIP, можно попробовать разработать скрипт динамических аномалий... А то после выброса появляются новые артефакты, а аномалии на том же месте остаются. Я где-то видел принцип рандомного спавна через скрипт чего-либо.
for k,v in pairs(bad_list.x1) do if (p_vector.x >= bad_list.x2[k] and p_vector.x <= bad_list.x1[k]) and (p_vector.z >= bad_list.y1[k] and p_vector.z <= bad_list.y2[k]) then return true end end
return false
end
-- Получаем список всех аномалий на уровне function get_anom(obj_id) list_obj_id[obj_id] = obj_id end
-- Отключаем ненужные аномалии при загрузке function on_game_load()
if check_game == 0 then
if level.name() == "l03u_agr_underground" or level.name() == "l04u_labx18" or level.name() == "l05_bar" or (level.name() == "l06_rostok" and not has_alife_info("bar_rescue_research_done") and not has_alife_info("bar_rescue_research_fail")) or level.name() == "l08_yantar" or level.name() == "l08u_brainlab" or level.name() == "l10u_bunker" or level.name() == "l12_stancia" or level.name() == "l12u_sarcofag" or level.name() == "l12u_control_monolith" or level.name() == "l12_stancia_2" then return end
if list_obj_id then for k,v in pairs(list_obj_id) do local obj = level.object_by_id(list_obj_id[k]) if obj and not string.find(obj:name(), "noartf_") and not (string.find(obj:name(),"gar_zone_mincer") and level.name()=="l11_pripyat") and not string.find(obj:name(),"no_gravity") and not string.find(obj:name(),"pri_zone_witches_galantine_0004") and not string.find(obj:name(),"pri_zone_witches_galantine_0005") and not string.find(obj:name(),"pri_zone_witches_galantine_0006") and not string.find(obj:name(),"pri_zone_witches_galantine_0007") and not string.find(obj:name(),"rostok_zone_zharka_static") and not string.find(obj:name(),"rostok_zone_witches_galantine_average") and not string.find(obj:name(),"tutorial") and not string.find(obj:name(),"esc_zone_mincer_strong") and not string.find(obj:name(),"esc_zone_witches") then obj:disable_anomaly() end
local mode = get_anomaly_mode(list_obj_id[k]) if obj and mode == "anom_off" then obj:disable_anomaly() end
end end
check_game = 1
end
end
-- Отключаем все текущие динамические аномалии и вызываем новую порцию function add_anom(param) local obj_id local gv_id local name_anom
local list_noart_anom = {} local list_orig_anom = {}
for k,v in pairs(list_obj_id) do local ppp = level.object_by_id(list_obj_id[k]) if ppp then if string.find(ppp:name(), "noartf_") then table.insert(list_noart_anom, v) else table.insert(list_orig_anom, v) end end end
if not param then for k,v in pairs(loc) do if k == level.name() and not (level.name() == "l06_rostok" and not has_alife_info("bar_rescue_research_done") and not has_alife_info("bar_rescue_research_fail")) and not (level.name() == "l05_bar") and not (level.name() == "l08_yantar") then amk.save_variable("an"..loc[level.name()], 1) else amk.del_variable("an"..loc[k]) end end else if not (level.name() == "l03u_agr_underground" or level.name() == "l04u_labx18" or level.name() == "l05_bar" or (level.name() == "l06_rostok" and not has_alife_info("bar_rescue_research_done") and not has_alife_info("bar_rescue_research_fail")) or level.name() == "l08_yantar" or level.name() == "l08u_brainlab" or level.name() == "l10u_bunker" or level.name() == "l12_stancia" or level.name() == "l12u_sarcofag" or level.name() == "l12u_control_monolith" or level.name() == "l12_stancia_2") then amk.save_variable("an"..loc[level.name()], 1) end end
if level.name() == "l03u_agr_underground" or level.name() == "l04u_labx18" or level.name() == "l05_bar" or (level.name() == "l06_rostok" and not has_alife_info("bar_rescue_research_done") and not has_alife_info("bar_rescue_research_fail")) or level.name() == "l08_yantar" or level.name() == "l08u_brainlab" or level.name() == "l10u_bunker" or level.name() == "l12_stancia" or level.name() == "l12u_sarcofag" or level.name() == "l12u_control_monolith" or level.name() == "l12_stancia_2" then return end
if list_obj_id and list_noart_anom and list_orig_anom then
if table.getn(list_noart_anom) <= 500 then
for k,v in pairs(list_obj_id) do local obj=level.object_by_id(list_obj_id[k]) if obj then name_anom=obj:name() lv_id=obj:level_vertex_id() gv_id=obj:game_vertex_id() if string.find(name_anom,"noartf_")~=nil then obj:disable_anomaly() create_anom(alife():object(list_obj_id[k]), math.random(2,4), "anom_off") --level.map_remove_object_spot(list_obj_id[k], "green_location") else
if not string.find(obj:name(),"rostok_zone_zharka_static") and not (string.find(obj:name(),"gar_zone_mincer") and level.name()=="l11_pripyat") and not string.find(obj:name(),"no_gravity") and not string.find(obj:name(),"pri_zone_witches_galantine_0004") and not string.find(obj:name(),"pri_zone_witches_galantine_0005") and not string.find(obj:name(),"pri_zone_witches_galantine_0006") and not string.find(obj:name(),"pri_zone_witches_galantine_0007") and not string.find(obj:name(),"rostok_zone_witches_galantine_average") then anom_rand(lv_id, gv_id) end end end end
else
for k,v in pairs(list_noart_anom) do local obj=level.object_by_id(list_noart_anom[k]) if obj then obj:disable_anomaly() create_anom(alife():object(list_noart_anom[k]), math.random(2,4), "anom_off") --level.map_remove_object_spot(list_noart_anom[k], "green_location") end end
for i=0, table.getn(list_orig_anom) do local new_id = math.random(table.getn(list_noart_anom)) local obj = level.object_by_id(list_noart_anom[new_id]) if obj then obj:enable_anomaly() create_anom(alife():object(list_noart_anom[new_id]), math.random(2,4), "anom_on") --level.map_add_object_spot(list_noart_anom[new_id], "green_location", obj:name()) end end
end
end
end
-- Рандомный выбор переменных для спавна function anom_rand(lv_id, gv_id)
if math.random(0,1)>0.5 then lv_new = lv_id + math.random(1000,5000) else lv_new = lv_id - math.random(1000,5000) end if lv_new < 1 or lv_new > level_vertexes[level.name()] then lv_new = math.random(1000,5000) end
-- Получаем custom_data из нэт-пакета о вкл / выкл аномалии function get_anomaly_mode(p_obj_id) local obj = alife():object(p_obj_id) local packet = net_packet() obj:STATE_Write(packet) local game_vertex_id = packet:r_u16() local cse_alife_object__unk1_f32 = packet:r_float() local cse_alife_object__unk2_u32 = packet:r_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() return custom_data end
-- Обновляем менеджер аномалий function anom_update() if amk.load_variable("an"..loc[level.name()],0) == 0 and has_alife_info("first_blowout") and db.Flag2 == 0 then add_anom("param") end if amk.load_variable("an"..loc[level.name()],0) == 1 then on_game_load() end end
-- Спавним и записываем новые свойства аномалий через нет-пакет function create_anom(p_obj, rad_anom, mode)
local packet = net_packet() p_obj:STATE_Write(packet)
local game_vertex_id = packet:r_u16() local cse_alife_object__unk1_f32 = packet:r_float() local cse_alife_object__unk2_u32 = packet:r_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local cse_alife_object__unk3_u32 = packet:r_s32()
local shape_count = packet:r_u8() for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local box = packet:r_matrix() end end
local restrictor_type = packet:r_u8()
local cse_alife_custom_zone__unk1_f32 = packet:r_float() local cse_alife_custom_zone__unk2_u32 = packet:r_s32() local on_off_mode_enabled_time = packet:r_s32() local on_off_mode_disabled_time = packet:r_s32() local on_off_mode_shift_time = packet:r_s32()
local offline_interactive_radius = packet:r_float() local artefact_spawn_places_count = packet:r_u16() local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32()
local last_spawn_time_present = packet:r_u8()
if packet:r_elapsed() ~= 0 then abort("left=%d", packet:r_elapsed()) end
packet:w_u16(game_vertex_id) packet:w_float(cse_alife_object__unk1_f32) packet:w_s32(cse_alife_object__unk2_u32) packet:w_s32(level_vertex_id) packet:w_s32(object_flags) if mode~=nil then custom_data = mode end packet:w_stringZ(custom_data) packet:w_s32(story_id) packet:w_s32(cse_alife_object__unk3_u32)
Vova-VIP, пока незнаю. Насчёт идей: могу подсунуть скрипт Ремонт-комплекта
Добавлено (23.08.2011, 13:40:14) --------------------------------------------- Мммм, нашёл скрипт вывода сообщения на экран.... Самое интересное, что сообщение можно получить от всего: от куска калбасы и от снорка.
Вектор, из АМК скрипт и диалог взял, да и всё. У тебя версия другая, у меня показывает где не найдена текстура, я туда кладу и всё
Добавлено (23.08.2011, 14:18:49) --------------------------------------------- Успешно добавил Мертвый город, наконец-то Хочу проверить нет ли от него последствиий в виде лагов. + у него лаги исправляю. Заселять позже буду
Добавлено (23.08.2011, 15:04:11) --------------------------------------------- Вектор, может знаешь: Вообщем все сделал, всё работает, мини - карта и карта конечно косые, ну хрен с ними. Вообщем переходов на карте нет, а на самом деле они есть. Как их на карту вывести?
Истинный путь MOD ver. 1.3.0 (ТЧ) готов! Истинный путь v2.0 (ТЧ) готов!