АНДРЮ}{@ 2 Опубликовано 5 Июля 2009 Поделиться Опубликовано 5 Июля 2009 Если какая-то мелочь(непись, предмет, ствол, мутант, да в принципе все), я спавню через скрипт, через ол.спавн не удобно, да и лишние метры в моде не нужны. Добавлено через 2 мин.: Pihan13, по разному. Через скрипт легче, да и меньше шанс ошибки, а через ол.спавн тежялее, вероятность ошибки, да и лишнии "мегабайты" в МОДе Добавлено через 1 мин.: А если через алл.спавн делаю, то предмет (нпс) появится сразу после начала новой игры? или можно этим путём сделать так, чтоб он появился после выполнения мною чего-либо (прим. квеста) и ещё: к примеру у меня есть координаты: position = -139.449829101563,-29.6908683776855,-351.492797851563 обязательно писать их такими длинными? можно к примеру написать? position = -139.4,-29.6,-351.4 Математик блин, округление десятичных дробей не проходил в 5ом классе? А ты сказал себе "Ы?" Ссылка на комментарий
Pihan13 9 Опубликовано 5 Июля 2009 Поделиться Опубликовано 5 Июля 2009 (изменено) АНДРЮ}{@, Я вот про это и спрашивал. Ато я округлял, а ничего не выходило (но округлял правильно ) - значит дело в скрипте Изменено 5 Июля 2009 пользователем Pihan13 Локация "Жилище Картографа" Хелп по созданию смарт террейнов Ссылка на комментарий
Vano_Santuri 33 Опубликовано 6 Июля 2009 Поделиться Опубликовано 6 Июля 2009 меченый(стрелок), ccорь, но можешь еще объяснить тупому. решил сделать респаун монстров через каждые 6 минут(для теста) вот скрипт local actor = db.actor function main() spawn_all() end --Спавним все аномалии function spawn_all(respawn) if load("spawn_anom",false)==false or respawn==true then --test spawn("sim_default_monolith_3",vector():set(-170.53266906738,0.67925143241882,-312.03155517578),1,135) -- РЕСПАВН МОНСТРОВ --== БОЛОТА --БЮРЕРЫ spawn("burer_weak",vector():set(347.982788085938,1.15263211727142,362.435119628906),1,135) spawn("burer_normal",vector():set(-181.321166992188,2.20583915710449,536.22412109375),1,135) spawn("burer_strong",vector():set(106.57487487793,1.11209356784821,331.199737548828),1,135) -- ХИМЕрЫ spawn("chimera_normal",vector():set(12.362359046936,1.20762395858765,465.655242919922),1,135) spawn("chimera_normal",vector():set(-103.976005554199,0.348260492086411,334.711975097656),1,135) save("spawn_anom",true) end end function create_anom(section,rad_anom,x,y,z,lv,gv,mode) -- con(section) if gv==nil then gv=db.actor:game_vertex_id() end if lv==nil then lv=db.actor:level_vertex_id() end if pos==nil then pos=db.actor:position() end local p_obj = alife():create(section,vector():set(x,y,z),lv,gv) local packet = net_packet() packet:w_begin(0) p_obj:STATE_Write(packet) packet:r_seek(2) 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) packet:w_u8(1) packet:w_u8(0) local sphere_center = vector() sphere_center:set(0, 0, 0) packet:w_vec3(sphere_center) radius = rad_anom packet:w_float(radius) packet:w_u8(restrictor_type) packet:w_float(cse_alife_custom_zone__unk1_f32) cse_alife_custom_zone__unk2_u32 = bit_not(0) packet:w_s32(cse_alife_custom_zone__unk2_u32) packet:w_s32(on_off_mode_enabled_time) packet:w_s32(on_off_mode_disabled_time) packet:w_s32(on_off_mode_shift_time) packet:w_float(offline_interactive_radius) packet:w_u16(artefact_spawn_places_count) packet:w_s32(cse_alife_anomalous_zone__unk1_u32) if mode == nil then packet:w_u8(last_spawn_time_present) end p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) -- add_spot_on_map(p_obj.id,"red_location","Аномалия") return p_obj end -- Вывод инфы в консоль function con(msg) get_console():execute(msg) end -- Записываем переменную function save(variable_name, value) xr_logic.pstor_store(db.actor, variable_name, value) end -- Загружаем переменную function load(variable_name, value_if_not_found) return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found) end -- Удаляем переменную function del(variable_name) if db.storage[db.actor:id()].pstor[variable_name] then db.storage[db.actor:id()].pstor[variable_name] = nil end end -- Функция спауна объекта function spawn(section,pos,lv,gv) -- vector():set(x,y,z) if gv==nil then gv=db.actor:game_vertex_id() end if lv==nil then lv=db.actor:level_vertex_id() end if pos==nil then pos=db.actor:position() end if section==nil then con("Не_указанная_секция") else return alife():create(section,pos,lv,gv) end end далее в amk_mod.script добавил строку таймера и вот что получилось: local nrg,med,cnt,gv,lv,w -- Эта функция вызывается первой. Онлайновые объекты недоступны! db.actor недоступен! function on_game_start() math.randomseed (device ():time_global ()) end function first_run() if amk.load_variable("x_first_run",true) then amk.g_start_timer("main",0,0,6) -- вызов респауна!!!!!!!!!!!! amk.g_start_timer("gg_need_sleep",0,0,6) --amk.g_start_timer("show_news",0,0,10) amk.spawn_item_in_inv("matras") amk.save_variable("x_first_run",false) end end ......... а там далее спальник пошел... потом как ты и сказал в amk.script там где надо вписал ето --- функция респавна монстров if select_string=="main" then new_monsters.main() amk.g_start_timer("main",0,0,6) end Проблема в том, что тестовый монолитовец после старта и6 минут спаунится, валит там пару ребят,НО больше он не спаунится, один раз только, и все, хотя он же должен каждые 6 минут вариться, Вопрос, я неправильно сбросил таймер, как его надо было сбрасывать??? Так же , прописал на всех локациях монстров людей, тоже для респауна в томже файле, но тогда вообще вылет, т.е скрипт не может спаунить предмет пока ты не на той локации где он прописан?? И можно это как нибудь поправить??? Что-то кончается, что-то начинается... Ссылка на комментарий
меченый(стрелок) 5 Опубликовано 7 Июля 2009 Поделиться Опубликовано 7 Июля 2009 Vano_Santuri,из своего скрипта удали if load("spawn_anom",false)==false or respawn==true then ... ... save("spawn_anom",true) end end Удали ,то что выделено... Ссылка на комментарий
Vano_Santuri 33 Опубликовано 7 Июля 2009 Поделиться Опубликовано 7 Июля 2009 меченый(стрелок), Окей, все теперь наспауниль заразы , благодарствую) Что-то кончается, что-то начинается... Ссылка на комментарий
AKKK1 6 Опубликовано 9 Июля 2009 Поделиться Опубликовано 9 Июля 2009 Уважаемые корифеи рассуждая о системе A-Live и AI НПС игры S.T.A.L.K.E.R я пришел к следуюшим выводам поправте если неправ. Моды разблокирующие A-Live не решают проблему хотя и вносят разнообразие в игровой процес.Первой мыслью было было то что не гулаги должны выбирать подходяшего НПС а нпс гулаг примерно вот так лагерь новичков новички сидят у костра часов в 6 встают и покидают лагерь (гулаг) отправляясь охотится и.т.д тойсть переходят под дефолтную либо свою логику а нагулявшись возврашаются назад к костру если место в гулаге свободно либо в любой другой гулаг kamp Но выяснилось что это невозможно без роспуска гулага .Спасибо Wawka и другим ответившим на мои дилетанские вопросы Wawka еше раз спасибо подсказал решение а именно использовать вот эту функцию из фаила xr_conditions -- ---------------------------------------------------------------------------------------------------- -- amk function -- ---------------------------------------------------------------------------------------------------- function time_hours() if level.get_time_hours() >= 5 and level.get_time_hours() <= 22 then return true -- день else return false -- ночь end end переделав ее в function time_testow() if level.get_time_hours() >= 6 and level.get_time_hours() < 8 then return true -- отдых else return false -- end end создав НПС в ал спавне [1] ; cse_abstract properties section_name = stalker name = testow position = -209.755249,-20.444433,-153.096436 direction = 0.062321275472641,0.00316426996141672,0.0140644172206521 ; cse_alife_trader_abstract properties money = 5000 character_profile = amk_test_testow ; cse_alife_object properties game_vertex_id = 8 distance = 2.79999995231628 level_vertex_id = 8190 object_flags = 0xffffffbf custom_data = <<END [logic] cfg = scripts\testow.ltx [smart_terrains] none = true [spawn] wpn_toz34 ammo_12x76_zhekan = 4 medkit = 3 kolbasa END ; cse_visual properties visual_name = actors\soldier\soldier_bandana_3 ; cse_alife_creature_abstract properties g_team = 0 g_squad = 1 g_group = 5 health = 1 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 1 upd:timestamp = 0x660a0d30 upd:creature_flags = 0x69 upd:position = -209.25016784668,-20.0724010467529,-141.015487670898 upd:o_model = 0 upd:o_torso = 0.00316426996141672,0.062321275472641,0 upd:g_team = 0 upd:g_squad = 1 upd:g_group = 5 ; cse_alife_monster_abstract properties upd:next_game_vertex_id = 65535 upd:prev_game_vertex_id = 65535 upd:distance_from_point = 0 upd:distance_to_point = 0 ; cse_alife_human_abstract properties predicate5 = 0,0,0,0,1 predicate4 = 1,1,2,1 ; cse_ph_skeleton properties upd:start_dialog = ; se_stalker properties прописав точки пути [testow_walk] points = p0,p1,p2,p3 p0:name = wp00 p0:flags = 0x4 p0:position = -209.755249,-20.444433,-153.096436 p0:game_vertex_id = 61 p0:level_vertex_id = 43262 p0:links = p1(1) p1:name = wp01 p1:flags = 0x2 p1:position = -206.181992,-20.517683,-148.460022 p1:game_vertex_id = 61 p1:level_vertex_id = 46562 p1:links = p2(1) p2:name = wp02 p2:flags = 0x1 p2:position = -191.232422,-20.038328,-148.739609 p2:game_vertex_id = 46 p2:level_vertex_id = 60449 p2:links = p3(1) p3:name = wp03 p3:flags = 0x1 p3:position = -182.478073,-20.137499,-143.810410 p3:game_vertex_id = 46 p3:level_vertex_id = 68212 p3:links = p0(1) прописав в scripts\testow.ltx [logic] active = kamp [kamp] on_info = {=time_testow} walker center_point = esc_lager_camp_center path_walk = esc_lager_camp_center_task soundgroup = esc_lager meet = meet@lager active = walker [walker] on_info = {!time_testow} kamp path_walk = testow_walk точки esc_lager_camp_center и esc_lager_camp_center_task тупо взяты из путей гулага esc_lager в итоге наш НПС test_testow с начала игры сидит у костра с новичками а в 6 часов отправляется патрулировать (проверенно) теперь хочу заставить его свинюшек вынести ( на которых волк квест дает ) нечего меченому ерундой заниматся ну и ночью пускай спит в подвале к чему я все это понаписал ? просто как мне кажется на базе всего этого можно много чего сделать для улучшения S.T.A.L.K.E.R Так как я не разбираюсь в скриптах может стоит создать отдельную тему в которой создав с нуля общего НПС тамогочи эдакого при помощи знающих товарищей и их и наших идей попытатся написать ему достаточно сложную логику-расписание хотябы для кордона ? спасибо за внимание с уважением АККК1 Ссылка на комментарий
Vano_Santuri 33 Опубликовано 9 Июля 2009 Поделиться Опубликовано 9 Июля 2009 (изменено) AKKK1, Это конечно интересно, и очень нужно , но тут стоит вопрос в другом, сделаем мы хотя бы 20 таких НПС с путями и логиками, а будем делать долго, ну так дня 2, а потом раз и убили их вояки или химера съест, потом пойдет респаун и все наш труд напрасен, если и делать такое, то только через скрипт, чтоб если непись, допустим: 1.5_patrul убили, то вместо нее заспаунить другую (худ,диалоги и т.д) но чтоб привязать эту же логику и пути(автоматически скриптом). Может такое есть, но я не видел.Если провернуть такую штуку хотя бы с 30 процентами населения, это будет что-то новое в жизни сталкеров.Все реализуемо, кроме респавна неписи и привязкиой ему логики умершего скриптом. Но может кто и сделает. Изменено 9 Июля 2009 пользователем Vano_Santuri Что-то кончается, что-то начинается... Ссылка на комментарий
AKKK1 6 Опубликовано 9 Июля 2009 Поделиться Опубликовано 9 Июля 2009 Vano_Santuri Если я правильно понимаю то создав некую универсальную логику допустим с 23 до 5 сплю потом у костра завтракую потом делами занимаюсь наверно можно например здесь [logic] active = kamp [kamp] on_info = {=time_testow} walker вместо walker была какая нибудь переменная или функция заставляюшая нпс рандомно выбрать какуюто схему из нескольких ? center_point = esc_lager_camp_center path_walk = esc_lager_camp_center_task soundgroup = esc_lager meet = meet@lager active = walker [walker] on_info = {!time_testow} kamp path_walk = testow_walk и прикрутив ее к уже имеюшимся НПС допустим новичкам в лагере они и респаунится будут с ней ? И еше наличее в игре таких персонажей как отец диодор наталкивает на мысль что изначально они должны были находится под своей достаточно сложной эксклюзивной логикой (худ,диалоги и т.д) и им респаун не нужен но почемуто это не сделали Ссылка на комментарий
Vano_Santuri 33 Опубликовано 9 Июля 2009 Поделиться Опубликовано 9 Июля 2009 (изменено) AKKK1, Да нет, у меня так не получалось, тех что ты прописал в алл.спауне, ты тут же убил, они больше не возобновятся респауном, а респаунится будут другие и без логики, их просто камп под себя подбирает и все, а там у же у кого какие функции. Но можно сделать не логику , как ты прописал к одному сталкеру, а камп , чтоб любой новичок попадавший в свободный камп(например камп потрулирования как у вояк) начинал патрулировать участок,спать и все такое. ЗЫ если где-то не прав исправьте. Изменено 9 Июля 2009 пользователем Vano_Santuri Что-то кончается, что-то начинается... Ссылка на комментарий
Tonny 4 Опубликовано 20 Июля 2009 Поделиться Опубликовано 20 Июля 2009 добрый день, есть задача: свой обработчик взрыва гранаты (скриптовая граната по сути) сам момент броска гранаты отлавливаю через on_item_drop, там запоминаю gren_id=obj:id() и потом в actor_update проверяю alife:object(gren_id), таким образом отлавливаю момент когда граната перестаёт существовать (что отличает брошеную от просто дропнутой) но как оказывается граната перестаёт существовать как alife-обьект ещё задолго до того, как взорвётся, поэтому узнать координаты КУДА она упала - не получается. Т.е. задача - узнать координаты гранаты во время взрыва. Не обязательно, чтоб она вообще взрывалась штатным образом. Пробовал болт - на него on_drop не срабатывает. В идеале хотелось бы узнать не только координаты взрыва гранаты, но и точки попадения при выстреле из автомата, гранатомёта. PS: делаю для ЧН Ссылка на комментарий
MIXATOR 0 Опубликовано 20 Июля 2009 Поделиться Опубликовано 20 Июля 2009 (изменено) Мне подсказали что ответ на мой вопрос в allspaun, если повторяюсь сильно не пинайте! Что нужно менять для того чтобы прописать вещь в постоянные нычки? Точнее мне нужно прописать пару вещей в ящик в казарме на блокпосту на кордоне! Если можно в личку и подробно!) Поясню про тайники я знаю, мне надо чтобы вещ лежала там постоянно! Ну я имею ввиду без наводки! Изменено 20 Июля 2009 пользователем MIXATOR Харки - Mobile DualCore Intel Core 2 Duo T6400, 2000 MHz, NVIDIA GeForce G 105M (512 Мб), 4Gb DDR3, Windows 7 Ultimate(64-bit) Игровой набор - Соль от 19.04.2010 + допа 14.08.2010, кум-патч 03.09.2010 P.S., Ибо так возлюбил Бог мир, что отдал Сына своего единородного, дабы всякий верующий в Него, не погиб, но имел жизнь вечную. Иоанна 3:16 Ссылка на комментарий
Bak 754 Опубликовано 20 Июля 2009 Поделиться Опубликовано 20 Июля 2009 Tonny, в момент броска граната просто удаляется, а то что летит и взрывается - уже другой объект, так что таким способом отловить не получится. Ссылка на комментарий
Tonny 4 Опубликовано 20 Июля 2009 Поделиться Опубликовано 20 Июля 2009 Bak похоже на то. Может, есть способ отловить момент выстрела из любого оружия? фактически ищу способ убить неубиенного кровососа в ЧН, так что подойдёт любой способ сделать кровососа в режиме невидимости убиенным, или каким-то чудом отключить ему невидимость вообще. MIXATOR в АМК моде есть оффлайновое заполнение тайников скриптами, для ЧН есть отдельный мод для этого же самого (на этом же форуме) Ссылка на комментарий
MIXATOR 0 Опубликовано 20 Июля 2009 Поделиться Опубликовано 20 Июля 2009 Мне нужном для ТЧ, и если не трудно покажите пальцем!) Харки - Mobile DualCore Intel Core 2 Duo T6400, 2000 MHz, NVIDIA GeForce G 105M (512 Мб), 4Gb DDR3, Windows 7 Ultimate(64-bit) Игровой набор - Соль от 19.04.2010 + допа 14.08.2010, кум-патч 03.09.2010 P.S., Ибо так возлюбил Бог мир, что отдал Сына своего единородного, дабы всякий верующий в Него, не погиб, но имел жизнь вечную. Иоанна 3:16 Ссылка на комментарий
Tonny 4 Опубликовано 20 Июля 2009 Поделиться Опубликовано 20 Июля 2009 (изменено) MIXATOR для ЧН тут: http://www.amk-team.ru/forum/index.php?showtopic=1772 автор сделал вырезку из АМК для ТЧ, соответственно, есть на что ориентироваться и что искать в скриптах АМК. Совсем пальцем в конкретные строчки не покажу. Изменено 20 Июля 2009 пользователем Tonny Ссылка на комментарий
IQDDD 5 Опубликовано 21 Июля 2009 Поделиться Опубликовано 21 Июля 2009 (изменено) меченый(стрелок), а вот такой к вам вопрос: как всем хорошо известно, lua - язык, в котором функция является обычной переменной и может быть передана в аргументы другой функции. Тогда почему же в амк не используется универсальный таймер (т.е. такой таймер, в котором вызыванные функции могут быть произвольными), вызов которого будет с параметрами функций, например: new_timer (1, myscript.myfunc, 20) Добавлено: Vano_Santuri, на acdc_cs.pl или какой там у тебя, нажимаешь правой кнопкой -> изменить, или открыть с помощью, блокнота. Маньяк... D: Изменено 21 Июля 2009 пользователем IQDDD Ссылка на комментарий
меченый(стрелок) 5 Опубликовано 21 Июля 2009 Поделиться Опубликовано 21 Июля 2009 IQDDD, Собственно вопрос не ко мне,а к xStream'у.... Могу предположить,что таким образом ,как предложили вы,универсальности не будет.... я представляю эту функцию примерно так function new_timer(cr,func_name,min) local begin = false timer[cr]=game.time+min ...тут считаем if begin then func_name() begin=false end end собственно загвоздка в том,что нету возможности сохранить имя функции...следовательно...если будет скажем два вызова этой функции(таймера) с разными функциями(переменными),то,когда первый раз begin будет истинным ,произойдёт вызов всех функций....ИМХО...Если покажите свой способ,то попытаюсь объяснить,чем он хуже(хотя возможно и лучше).... ЗЫ:Насчёт АМК скажу, по моим "данным" в АМК 2.0 не будет функций от xStream'a - следовательно и таймер будет другим... Ссылка на комментарий
Tonny 4 Опубликовано 21 Июля 2009 Поделиться Опубликовано 21 Июля 2009 попробую вопрос по-другому поставить, авось кто знает может, кто подскажет как выполнить один из вариантов: 1. определить момент выстрела из оружия 2. определить точку попадения пули 3. определить координаты брошенной гранаты (перед взрывом) или болта (дополнительно) 4. заставить кровососа в ЧН стать видимым и/или уязвимым. 5. (Кстати, невидимый кровосос является game_object?) спасибо за внимание Ссылка на комментарий
IQDDD 5 Опубликовано 21 Июля 2009 Поделиться Опубликовано 21 Июля 2009 (изменено) меченый(стрелок), давайте разберёся в аргументах моей функции: new_timer (1, myscript.myfunc, 20) Здесь первый - это номер таймера. Второй - имя функции. Кстати, почему это его сохранить нельзя? Третий - через сколько секунд/миллисекунд/обновлений вызывать процедуру таймера. Задача состоит в том, что создать псевдообъект таймера. Можно при вызове new_timer(...): Создать объект класса "timer" (его тоже надо создать заранее. Он будет представлять собой класс всего из четёрых свойств: number, procedure, active, interval) Свойства соответственно будут равны: number = 1. procedure = myscript.myfunc. active = true. interval = 20. Запоминаем объект этого класс в глобальную таблицу timerZ. С каждый апдейтом актора будет вызываться функция, проверяющая всю таблицу на наличие объектов класса таймер и, если надо, исполняющая функции, сохранённые в свойстве procedure объектов. Добавлено через 3 мин.: Tonny, всё это можно (кроме 2. И то можно, только приблизительно и ОЧЕНЬ сложно. Без математики нельзя). Вот только вы изучили, что такое: 1. bind_object 2. callback 3. класс 4. методы update, net_destroy, __init(...) super(...) и пр. класса "bind_object" ? Изменено 21 Июля 2009 пользователем IQDDD Ссылка на комментарий
Tonny 4 Опубликовано 21 Июля 2009 Поделиться Опубликовано 21 Июля 2009 IQDDD да, имею представление и использовал. О коллбеках имею представление только о тех, которые встречались в каких-либо из модов, что мне попадались. Но отловить момент выстрела кроме как в update актёра проверять количество патронов в магазине оружия в слотах - фантазии пока не хватило. п.2. для меня не критичен, 1 и/или 3 - актуальнее (граната берестаёт быть алайф-обьектом задолго до взрыва, а на болт не реагирует on_item_drop) а всё это нужно восновном для п.4 (раз кровосос неуязвим - сделать против него спец.оружие) Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти