Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Гость Greh921 Опубликовано 1 Марта 2010 Поделиться Опубликовано 1 Марта 2010 Влад, а чем возможно, мне нужно во время игры! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-389684
Влад 9 Опубликовано 1 Марта 2010 Поделиться Опубликовано 1 Марта 2010 Greh921 во время игры - невозможно. хотя..дизассемблер в руки и погнал движок ковырять Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-389704
Kirag 40 Опубликовано 1 Марта 2010 Поделиться Опубликовано 1 Марта 2010 (изменено) Подскажите, пожалуйста, как можно сделать так ,что при каждом заходе на локацию, на ней автоматически спавнилось человек 15 бандюков. Понадобится bind_stalker.script 1) В функции actor_binder:save(packet) допиши в самое начало примерно следующее: function actor_binder:save(packet) if utils.level_changing() then xr_logic.pstor_store(db.actor, "changing_level", 1) end ... и т.д. Это нужно для того, чтобы сохранить информацию о том, какой это сейв - автосейв при смене локации или любой другой. 2) В функции actor_binder:net_spawn(data) допиши в конец перед return true вот такое: if xr_logic.pstor_retrieve(db.actor, "changing_level", 0) == 1 then -- Здесь производим нужные действия xr_logic.pstor_store(db.actor, "changing_level", 0) end Здесь мы читаем сохраненную инфу о сейве. Если это автосейв при смене локи, производим нужные нам действия и сбрасываем инфу о сейве. Причем сколько бы раз мы не грузили автосейв, действия будут выполняться, как в первый раз (но при загрузке автосейва действия еще не выполнены, так что все честно, сколько бы не грузился сейв, эффект все равно однократный. В случае с бандитами единственная разница будет в случайном выборе профиля). При загрузке любого другого сейва, не связанного со сменой лок, действия не выполняются. Ну, как заспавнить нужное количество нужных персонажей, ты, я думаю, знаешь P.S. Писалось для ТЧ и проверялось на ТЧ, в других версиях не знаю, но что-то наподобие. Изменено 1 Марта 2010 пользователем Kirag Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-389730
Monnoroch 6 Опубликовано 2 Марта 2010 Поделиться Опубликовано 2 Марта 2010 Kirag, Я делал по-другому.Я в net_spawn() сохранял имя текущего левела.До того сравнивая с предыдущим сохраненным и по необходимости вызывая новопрописанный коллбэк level_change(old,new). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-390067
Struck 61 Опубликовано 3 Марта 2010 Поделиться Опубликовано 3 Марта 2010 а я делал вообще вот так... if level:name() == "l05_bar" then -- спавнил end по памяти так, может метод как ни так написал, но смысл такой Добавлено через 1 мин.: Влад, можно дфиг раскомпилить и перегнать на делфи, там удобней править Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-390704
Влад 9 Опубликовано 3 Марта 2010 Поделиться Опубликовано 3 Марта 2010 (изменено) [b]Struck[/b] можно дфиг раскомпилить и перегнать на делфи, там удобней править и зачем ты мне "это" говоришь? if level[b][u].[/u][/b]name() == "l05_bar" then ошибка была. Изменено 3 Марта 2010 пользователем Влад Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-390723
DiXares 1 Опубликовано 3 Марта 2010 Поделиться Опубликовано 3 Марта 2010 (изменено) Каким методом, скриптом добавить диалог нпс? Что бы, вроде: local push = true local item = db.actor:object("wpn_pm") function test() if item and push then добавить диалог... Выдать мессагу... push = false end end Мессагу знаю как сделать. Но как про диалог? И не подскажете чтение ini файла и запись, посредством Lua? Изменено 3 Марта 2010 пользователем TREWKO Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-390739
Влад 9 Опубликовано 3 Марта 2010 Поделиться Опубликовано 3 Марта 2010 TREWKO с диалогом: сделай выдачу поршня "my_info" в твоей функции,а в диалоге сделай <has_info>my_info</has_info> -------------------- Описание "class ini_file" от меченый(стрелок): C++ class ini_file { ini_file (string); --создать объект класса ini_file/за место string прописываем путь до файла function line_count(string); --возвращает количество ключей в секции string/ return ini:line_count("my_section") function r_bool(string, string); --возвращает логическое(булево) значение/(секция,ключ) function section_exist(string); --"проверка" существует ли секция string/if ini:section_exist("my_section") function r_float(string, string); --возвращает значение с плавающей точкой function r_clsid(string, string);********************* function r_s32(string, string); --возвращает целое число function r_line(ini_file*, string, number, string&, string&); --возвращает полностью "линию" т.е. key1 = value1 function r_token(string, string, const token_list&); ********** function r_vector(string, string);******** function r_u32(string, string);--возвращает целое число(чуть-чуть медленне чем s32) function r_string_wq(string, string);--возвращает строку function r_string(string, string);--возвращает строку function line_exist(string, string);--"проверка" существует ли ключ /if ini:line_exist("my_section","key1") }; Примеры работы с ним: ... local ini = ini_file("my_folder\my.ltx") if ini:section_exist("my_section") then ... end ---------------------------------------- local ini = ini_file("my_folder\my.ltx") ini:r_float("my_section", "my_line") --возвращает значение с плавающей точкой ... ---------------------------------------- local ini = ini_file("my_folder\my.ltx") ini:r_s32("my_section", "my_line") --возвращает целое число ... ---------------------------------------- local ini = ini_file("my_folder\my.ltx") ini:r_u32("my_section", "my_line") --возвращает целое число ... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-390788
iDreD 5 Опубликовано 3 Марта 2010 Поделиться Опубликовано 3 Марта 2010 function wpn_class() local active_item=db.actor:active_item() if active_item ~= nil then active_item:section() == "wpn_vintorez" or active_item:section() == "wpn_svu" or active_item:section() == "wpn_svd" and if math.ceil(db.actor:accuracy()*1000) == 1 then get_hud():AddCustomStatic("din_pric", true) end end end end он верный? И ещё, в какой апдейтер его присоединить? Пробывал в дельту - вылет без лога. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-390824
Влад 9 Опубликовано 3 Марта 2010 Поделиться Опубликовано 3 Марта 2010 (изменено) кровоSTALKER юзай так: function wpn_class() local hud = get_hud() local custom_static = hud:GetCustomStatic("din_pric") local active_item=db.actor:active_item() if active_item then if (active_item:section() == "wpn_vintorez" or active_item:section() == "wpn_svu" or active_item:section() == "wpn_svd") and math.ceil(db.actor:accuracy()*1000) == 1 then if custom_static == nil then hud:AddCustomStatic("din_pric", true) end end end end апдейт в bind_stalker.script - function actor_binder:update(delta) Изменено 3 Марта 2010 пользователем Влад Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-390830
Kirag 40 Опубликовано 4 Марта 2010 Поделиться Опубликовано 4 Марта 2010 Kirag, Я делал по-другому.Я в net_spawn() сохранял имя текущего левела.До того сравнивая с предыдущим сохраненным и по необходимости вызывая новопрописанный коллбэк level_change(old,new). Кстати, да, этот метод даже толковее. Он и проще, и позволяет выполнять действия с учетом того, откуда перешли. Век живи, век учись а я делал вообще вот так... if level:name() == "l05_bar" then -- спавнил end по памяти так, может метод как ни так написал, но смысл такой Если это (и только это) в net_spawn актора, то у метода есть большой недостаток - он будет срабатывать не только при переходе на бар, но и при каждом Сейв/Лоаде, причем эффект будет накапливаться каждый С/Л. Вся возня с сохранением имени левелов или факта перехода как раз и нужна, чтобы от этого момента избавиться. Хотя, смотря когда и что нужно. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391374
Monnoroch 6 Опубликовано 4 Марта 2010 Поделиться Опубликовано 4 Марта 2010 Kirag, тем более level.name() насколько я помню... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391379
iDreD 5 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 Влад, заюзал, вылет такой: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : .... - Çîâ Ïðèïÿòè\gamedata\scripts\bind_stalker.script:322: attempt to index global 'chimera_mod' (a nil value) В bind_stalker апдейтер был таков: chimera_mod.din_scope() Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391672
Push85 5 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 кровоSTALKER, синтаксическая ошибка в chimera_mod.script, если конечно этот файл вообще существует... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391676
iDreD 5 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 Обижаешь. Поправил ошибку синтаксиса, получил вылет: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : .... - Çîâ Ïðèïÿòè\gamedata\scripts\bind_stalker.script:322: attempt to call field 'din_scope' (a nil value) Кастом статик тоже сделал. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391687
Push85 5 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 (изменено) кровоSTALKER, покажи код, в слепую ничего не понятно. ============================ на первый взгляд все нормально, ругань идет на саму функцию, странно, попробуй закоментировать все внутри функции и проверь, потом раскоментируй немного и еще раз проверь и так пока все не раскоментиш, проще будет поймать косяк. Изменено 5 Марта 2010 пользователем 8push5 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391695
iDreD 5 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 (изменено) Содержание chimera_mod: snd_obj = {} --это нужно для воспроизведеня звука, должен быть в каждом скрипте где будет использоватся команда "s_play" snd_obj = xr_sound.get_safe_sound_object([[$no_sound]]) function s_stop() if snd_obj:playing()==true then snd_obj:stop() end end function s_play(path) --сюда передается путь файла, и он ево играет s_stop() snd_obj = xr_sound.get_safe_sound_object(path) snd_obj:play_at_pos(db.actor, vector ():set (0, 0, 0), 0, sound_object.s2d) end ------Copyright DEXXX------- -- device\pda\pda_tip --это путь до файла без расширения .ogg local sound_types = {"([[device\pda\pda_tip]])", "([[device\pda\pda_tip]])", "[device\pda\pda_news]", "[[device\pda\pda_objective]]"} --со скобками нада поэксперементировать, function name_script() --твой скрипт s_play(sound_types[math.random(4)]) --четыре это максимальное значение, от 1 до 4. скока файлов стока и максимальное значение end function add_new_lc(levch,levchn,levchm,info) --спауним левел ченджер local objt = alife():story_object(levch) if not objt then alife():create(levchn) end local obj = alife():story_object(levch) if obj then level.map_add_object_spot(obj.id, "level_changer",levchm) db.actor:give_info_portion(info) info_received() end end -- Апдейтер динамических прицелов function din_scope() local hud = get_hud() local custom_static = hud:GetCustomStatic("din_pric") local active_item=db.actor:active_item() if active_item then if (active_item:section() == "wpn_vintorez" or active_item:section() == "wpn_svu" or active_item:section() == "wpn_svd") and math.ceil(db.actor:accuracy()*1000) == 1 then if custom_static == nil then hud:AddCustomStatic("din_pric", true) end end end end Строка апдейтера в bind_stalker: function actor_binder:update(delta) object_binder.update(self, delta) if string.find(command_line(), "-designer") then return end if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then -- jump_level.try_to_jump() self.already_jumped = true return end -- Вызов апдейта переноса игрока проводником if travel_func ~= nil then travel_func() end -- DEBUG slowdown local time = time_global() game_stats.update (delta, self.object) -- апдейт погоды self.weather_manager:update() --' Апдейт саундменеджера xr_sound.update(self.object:id()) -- Обновление отключения ввода с клавиатуры. if self.st.disable_input_time ~= nil and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then level.enable_input() self.st.disable_input_time = nil end -- Апдейт прятание оружия игрока во время диалога if self.object:is_talking() then if self.weapon_hide_in_dialog == false then self.object:hide_weapon() printf("hiding weapon!!!") self.weapon_hide_in_dialog = true end else if self.weapon_hide_in_dialog == true then printf("restoring weapon!!!") self.object:restore_weapon() self.weapon_hide_in_dialog = false end end -- Апдейт прятание оружия игрока в зоне sr_no_weapon if check_for_weapon_hide_by_zones()==true then if self.weapon_hide == false then printf("hiding weapon!!!") self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then printf("restoring weapon!!!") self.object:restore_weapon() self.weapon_hide = false end end -- обновление пси-антенны if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end if self.bCheckStart then printf("SET DEFAULT INFOS") if not has_alife_info("global_dialogs") then self.object:give_info_portion("global_dialogs") end if not has_alife_info("level_changer_icons") then self.object:give_info_portion("level_changer_icons") end self.bCheckStart = false end if not self.loaded_slot_applied then self.object:activate_slot(self.loaded_active_slot) self.loaded_slot_applied = true end xr_s.on_actor_update(delta) -- ARS MOD -------------------------- ars.on_actor_update(self) -- обработчик всяческих менеджеров четыре раза в секунду. if TimeTrigger1<time then TimeTrigger1=time+250 self:check_detective_achievement() self:check_mutant_hunter_achievement() if(level_anomaly)then self.anomaly_manager:update() end end -- ARS MOD -------------------------- -- Chimera addon. Dinamic scopes update chimera_mod.din_scope() if(self.surge_manager) then if(self.f_surge_manager_loaded ~= true) then self.surge_manager:initialize() self.f_surge_manager_loaded = true end if(self.surge_manager.levels_respawn[level.name()]) then self.surge_manager:respawn_artefacts_and_replace_anomaly_zone() end self.surge_manager:update() end -- Апдейт доступности для симуляции. simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor()) if not self.loaded then get_console():execute("dump_infos") self.loaded = true end treasure_manager.get_treasure_manager():update() if not(primary_objects_filled) then pda.fill_primary_objects() primary_objects_filled = true end pda.fill_sleep_zones() end Содержание ui_custom_msgs: <!--Chimera addon to ARS CoP--> <din_pric x="640" y="512" stretch="1"> <texture>chimera\anim_cube</texture> </din_pric> anim_cube тестовая, файл .seq. Изменено 5 Марта 2010 пользователем кровоSTALKER Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391699
Влад 9 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 function din_scope() local hud = get_hud() local custom_static = hud:GetCustomStatic("din_pric") local active_item=db.actor:active_item() if active_item then if active_item:section() == "wpn_vintorez" or active_item:section() == "wpn_svu" or active_item:section() == "wpn_svd" then if math.ceil(db.actor:accuracy()*1000) == 1 then if custom_static == nil then hud:AddCustomStatic("din_pric", true) end end end end end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391707
iDreD 5 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 Влад, тоже Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : .... - Çîâ Ïðèïÿòè\gamedata\scripts\bind_stalker.script:322: attempt to call field 'din_scope' (a nil value) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391733
Влад 9 Опубликовано 5 Марта 2010 Поделиться Опубликовано 5 Марта 2010 кровоSTALKER не ври!я проверил - всё работает! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/16/#findComment-391743
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти