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/
TRAMP14 1 Опубликовано 30 Марта 2011 Поделиться Опубликовано 30 Марта 2011 Напшите пожалуйста пример как снять и потом записать характеристики оружия через нет пакет. Т.е. сначала снять хар-ки какого либо оружия затем через некоторое время записать эти хар-ки в другое оружие (модификацию). Хочу сделать чтобы модишикации оружия постепенно превращались в само оружие но где найти полный список хар-к нетпакета для оружия незнаю Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581494
HellRatz 2 913 Опубликовано 30 Марта 2011 Поделиться Опубликовано 30 Марта 2011 Всем привет. Объясните пожалуйста по пунктам, как заставить НПС встать на путь (который я задал в way) и переходить между локациями по нему? (Если такое возможно). Суть: Спавнится отряд на Янтаре, у всех такая логика [logic] active = otrad_kamp@perviy_put [otrad_kamp@perviy_put] home_min_radius = 0 home_max_radius = 0 on_info = {+doyti_do_rostka} otrad_kamp@vtoroy_put [otrad_kamp@vtoroy_put] path_home = putdva_walk meet = no_meet home_min_radius = 0 home_max_radius = 0 on_info = {+tocka_odin_done} remark@postovoy [remark@postovoy] anim = guard target = actor meet = meet По пути putdva_walk они должны идти с Янтаря на Росток. Но они почему то не встают на путь, и идут куда попало. или же все дело в том, что они не могут перейти через локации? Объясните пожалуйста. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581555
PavelSnork 3 Опубликовано 30 Марта 2011 Поделиться Опубликовано 30 Марта 2011 Ребята, помогите написать сткрипт. В функции мне нужно запустить таймер, а через 10 секунд его остановить. И еще нужно, чтоб во время этого запущенного таймера нельзя было использовать продукты питания. Сталкер ЗП. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581581
speczadanie 0 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 Как можно наиболее рационально скриптом сосчитать количество всех предметов в инвентаре у игрока, название которых начинается с "af_" ??? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581723
Stalk15 27 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 (изменено) speczadanie function d() local cnt = db.actor:object_count() local d = 0 for i=0, cnt-1 do local Item = db.actor:object(i) if string.find(Item:section(), "af_") then d = d + 1 end end return d end Изменено 31 Марта 2011 пользователем Stalk15 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581731
Министр 4 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 (изменено) TRAMP14, посмотри АМКшные ф-ии для чтения/записи пакетов, в частности get_weapon_data и set_weapon_data. PavelSnork, непонятно, у тебя сам таймер есть или нет? speczadanie, function rtn_af_cnt() local count = 0 db.actor:iterate_inventory(function (dummy, item) if string.find(item:section(), "af_") then count = count + 1 end end, db.actor) return count end А вообще такие вещи давно пора бы знать, тем более поиск по форуму никто не отменял. Изменено 31 Марта 2011 пользователем Министр Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581746
SkyLoader 53 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 Народ, помогите плз. Я хочу заспаунить турель из огсе, но она не спаунится, если место спауна онлайн. Спаун происходит через ф-цию [white]create_turret()[/white]. Вот так создаю турель: turret_mgun.create_turret("turret_nato", "l06_rostok", vector():set(-84.12,0.9,140.35), "killer", "", 90, 90) Текст скрипта turret_mgun.script function bind(obj) -- printf("turret_mgun.bind") local ini = obj:spawn_ini() if ini == nil or not ini:section_exist("logic") then abort("turret '%s' must have logic", obj:name()) end obj:bind_object(turret_binder(obj, ini)) end class "turret_binder" (object_binder) function turret_binder:__init(obj, ini) super(obj) self.ini = ini self.initialized = false self.loaded = false end function turret_binder:reinit() object_binder.reinit(self) db.storage[self.object:id()] = {} self.st = db.storage[self.object:id()] self.heli = self.object:get_helicopter() self.object:set_callback(callback.helicopter_on_hit, self.on_hit, self) end function turret_binder:update(delta) object_binder.update(self, delta) if not self.initialized and db.actor ~= nil then xr_logic.initialize_obj(self.object, self.st, self.loaded, db.actor, modules.stype_heli) self.initialized = true end if self.st.active_section ~= nil then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "update", delta) end self:check_health() end function turret_binder:net_spawn(data) if not object_binder.net_spawn(self, data) then return false end self.se_obj = alife():object(self.object:id()) self.heli:SetfHealth(self.se_obj.health) self.st.alive = self.se_obj.health > 0.005 db.add_turret(self.object) return true end function turret_binder:net_destroy() db.del_turret(self.object) object_binder.net_destroy(self) end function turret_binder:net_save_relevant() return true end function turret_binder:save(packet) object_binder.save(self, packet) xr_logic.save_obj(self.object, packet) end function turret_binder:load(packet) object_binder.load(self, packet) xr_logic.load_obj(self.object, packet) end function turret_binder:on_hit(power, impulse, hit_type, enemy_id) dbglog("hit: power=%f impulse=%f hit_type=%d enemy_id=%d health=%f", power, impulse, hit_type, enemy_id, self.heli:GetfHealth()) self.se_obj.health = self.heli:GetfHealth() local enemy = level.object_by_id(enemy_id) if enemy ~= nil and self.st.active_section ~= nil then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "hit_callback", self.object, power, nil, enemy, nil) end end function turret_binder:check_health() if self.st.alive and self.heli:GetfHealth() <= 0.005 then explode_turret(self.object) end end function explode_turret(turret) local heli = turret:get_helicopter() heli:ClearEnemy() heli:Die() local se_obj = alife():object(turret:id()) se_obj.health = 0 db.storage[turret:id()].alive = false utils2.deferred_release(turret:id(), 5) end function is_friendly_turret(npc, turret, position) -- сначала выясним, турель ли это вообще. local k,v if turret == nil then -- ссылки на объект нет. что ж, бывает, попробуем -- определить по месту расположения. for k,v in pairs(db.turret) do local test_position = v:position() if test_position.x == position.x and test_position.z == position.z then turret = v break end end if turret == nil then return false end elseif (turret:section() ~= "turret_mgun") and (turret:section() ~= "turret_army") and (turret:section() ~= "turret_nato") then return false end local community = db.storage[turret:id()].community if community == nil then return false end if utils2.community_relation(community, npc) > -400 then return true end return false end function create_turret(turret_section_name, level_name, position, community, owner_gulag, search_dist, hunt_actor_prob, explode_dist, spawner) local packet1 = utils2.packet_pool_get() local packet2 = utils2.packet_pool_get() local level_vertex_id, game_vertex_id = utils2.get_top_graph_ids(level_name) local se_obj = alife():create(turret_section_name, position, level_vertex_id, game_vertex_id) if se_obj == nil then abort("can't create '%s' at (%f,%f,%f)") end -- лучше через table.concat() local custom_data = "[logic]\nactive = turret\n[turret]\n" if community ~= nil then custom_data = custom_data.."community = "..community.."\n" end if owner_gulag ~= nil then custom_data = custom_data.."owner_gulag = "..owner_gulag.."\n" end if hunt_actor_prob ~= nil then custom_data = custom_data.."hunt_actor_prob = "..tostring(hunt_actor_prob).."\n" else custom_data = custom_data.."hunt_actor_prob = 50\n" end if search_dist ~= nil then custom_data = custom_data.."search_dist = "..tostring(search_dist).."\n" else custom_data = custom_data.."search_dist = 90\n" end if explode_dist ~= nil then custom_data = custom_data.."explode_dist = "..tostring(explode_dist).."\n" else custom_data = custom_data.."explode_dist = 1\n" end if spawner ~= nil then custom_data = custom_data.."[spawner]\ncond = "..spawner.."\n" end se_obj:STATE_Write(packet1) local dead_space = packet2:w_tell() -- cse_alife_dynamic_object utils2.packet_copy(packet2, packet1, 18) packet1:r_stringZ() packet2:w_stringZ(custom_data) utils2.packet_copy(packet2, packet1, 8) -- cse_visual packet2:w_stringZ(packet1:r_stringZ()) utils2.packet_copy(packet2, packet1, 1) -- cse_motion packet2:w_stringZ(packet1:r_stringZ()) -- cse_ph_skeleton packet2:w_stringZ(packet1:r_stringZ()) utils2.packet_copy(packet2, packet1, 3) -- cse_alife_helicopter packet2:w_stringZ("idle") packet2:w_stringZ("$no_sound") -- se_turret_mgun packet2:w_float(1.0) se_obj:STATE_Read(packet2, packet2:w_tell() - dead_space) utils2.packet_pool_put(packet1) utils2.packet_pool_put(packet2) end function create_dir_turret(turret_section_name, level_name, position, community, owner_gulag, search_dist, hunt_actor_prob, explode_dist, spawner) local packet1 = utils2.packet_pool_get() local packet2 = utils2.packet_pool_get() local level_vertex_id, game_vertex_id = utils2.get_top_graph_ids(level_name) local se_obj = alife():create(turret_section_name, position, level_vertex_id, game_vertex_id) if se_obj == nil then abort("can't create '%s' at (%f,%f,%f)") end -- лучше через table.concat() local custom_data = "[logic]\nactive = turret\n[turret]\n" if community ~= nil then custom_data = custom_data.."community = "..community.."\n" end if owner_gulag ~= nil then custom_data = custom_data.."owner_gulag = "..owner_gulag.."\n" end if hunt_actor_prob ~= nil then custom_data = custom_data.."hunt_actor_prob = "..tostring(hunt_actor_prob).."\n" else custom_data = custom_data.."hunt_actor_prob = 50\n" end if search_dist ~= nil then custom_data = custom_data.."search_dist = "..tostring(search_dist).."\n" else custom_data = custom_data.."search_dist = 90\n" end if explode_dist ~= nil then custom_data = custom_data.."explode_dist = "..tostring(explode_dist).."\n" else custom_data = custom_data.."explode_dist = 3\n" end if spawner ~= nil then custom_data = custom_data.."[spawner]\ncond = "..spawner.."\n" end se_obj:STATE_Write(packet1) local dead_space = packet2:w_tell() -- cse_alife_dynamic_object utils2.packet_copy(packet2, packet1, 18) packet1:r_stringZ() packet2:w_stringZ(custom_data) utils2.packet_copy(packet2, packet1, 8) -- cse_visual packet2:w_stringZ(packet1:r_stringZ()) utils2.packet_copy(packet2, packet1, 1) -- cse_motion packet2:w_stringZ(packet1:r_stringZ()) -- cse_ph_skeleton packet2:w_stringZ(packet1:r_stringZ()) utils2.packet_copy(packet2, packet1, 3) -- cse_alife_helicopter packet2:w_stringZ("idle") packet2:w_stringZ("$no_sound") -- se_turret_mgun packet2:w_float(1.0) se_obj:STATE_Read(packet2, packet2:w_tell() - dead_space) utils2.packet_pool_put(packet1) utils2.packet_pool_put(packet2) ---------------direction se_obj.direction = vector():set(-1, 0, 0) --------------- end ----------------------------------------------------------------------- class "se_turret_mgun" (cse_alife_helicopter) function se_turret_mgun:__init(section) super(section) self.spawner_present = false self.health = 1.0 self.direction = vector():set(0, 0, 0) end function se_turret_mgun:can_switch_offline() return cse_alife_helicopter.can_switch_offline(self) end function se_turret_mgun:can_switch_online() if self.health <= 0.005 then return false end if self.spawner_present == nil then local ini = self:spawn_ini() self.spawner_present = ini:section_exist("spawner") end if self.spawner_present == true then return cse_alife_helicopter.can_switch_online(self) end return xr_spawner.check_spawn(self) end function se_turret_mgun:STATE_Read(packet, size) cse_alife_helicopter.STATE_Read(self, packet, size) self.health = packet:r_float() self.direction = packet:r_vec3() end function se_turret_mgun:STATE_Write(packet) cse_alife_helicopter.STATE_Write(self, packet) packet:w_float(self.health) packet:w_vec3(self.direction) end Как мне вынести турель в онлайн? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581760
_Призрак_ 11 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 А если заспавнить в оффлайн куда нибудь, а потом установить нужную позицию Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581788
Lagos 688 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 Ребят,помогите!Нажимаю распаковать all.spawn: Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581789
SkyLoader 53 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 _Призрак_, а методов смены позиции вроде нет у турелей. Они на классе вертолета. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581794
panzyuza 53 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 кто нибудь.Разьясните понятия в сексиях респавнера файла all.spawn.Просто сделал респавнер,а у меня заместо троих основных появилось 12 человек.Причем сразу. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581807
_Призрак_ 11 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 SkyLoader У меня появилась дурацкая, но идея. А если заспавнить тураль под карту, а потом, когда нужно при помощи логики хели_мув переместить ее на нужное место? Турель ты же говоришь сделана на основе вертолета, а вертушки на агропроме так и сделаны - заспавнены под локацией и когда нужно, они вылетают Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581814
TRAMP14 1 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 Заспавнил несколько зомбей на кордоне скриптом. Поймал вылет: Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...w of chernobyl\gamedata\scripts\smart_terrain.script:1137: attempt to index local 'obj' (a nil value) Я в смарт террейны не лазил только бинд сталкер и мой скрипт спавна. Как исправить? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581816
SkyLoader 53 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 _Призрак_, ну так на это ж требуется время, чтобы турель пролетела. + я хочу сделать динамический спавн, .т.е. в любой момент спавнить турель. А вертолеты летают по точкам в алл.спавне. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581828
_Призрак_ 11 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 Ну так ты установи скорость полета турели 99999. Да и можно в логике поставить условие на инфопоршень или на выполенение функции Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581831
SkyLoader 53 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 Ну эту проблему возможно можно решить. Осталась одна: нужно найти метод скриптового назначения точки полета. Ибо через логику не получится сделать, потому что вертолеты летают по точкам в алл.спавне А я хочу сделать динамический спавн. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581883
PavelSnork 3 Опубликовано 31 Марта 2011 Поделиться Опубликовано 31 Марта 2011 PavelSnork, непонятно, у тебя сам таймер есть или нет? У меня таймера нету. Ответте, пожалуйста, на мой предыдущий пост. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581888
speczadanie 0 Опубликовано 1 Апреля 2011 Поделиться Опубликовано 1 Апреля 2011 Есть скрипт. Игра нещадно вылетает при попытке его чтения с логом типа "нет такого файла", то есть, как я понял, тут ошибка синтаксиса... Сам найти не могу. В чём проблема? local nano = 0 local outfit = db.actor:item_in_slot(6) function update() if not outfit then nano=0 end if outfit and (outfit="novice_outfit" or outfit="bandit_outfit" or outfit="killer_blue_exoskeleton" or outfit="svoboda_exoskeleton" or outfit="monolit_exoskeleton" or outfit="broken_exoskeleton" or outfit="monolit_scientific_outfit" or outfit="bandit_master_outfit" or outfit="soldier_outfit" or outfit="bandit_veteran_outfit") then nano=0 end if outfit and (outfit="killer_outfit" or outfit="monolit_outfit" or outfit="svoboda_light_outfit" or outfit="dolg_outfit" or outfit="dolg_black_exoskeleton" or outfit="merc_scientific_outfit" or outfit="neytral_exo_antigas_outfit" or outfit="military_outfit" or outfit="military_stalker_commander_outfit") then nano=1 end if outfit and (outfit="specops_outfit" or outfit="stalker_outfit" or outfit="exo_outfit" or outfit="svoboda_heavy_outfit" or outfit="dolg_scientific_outfit" or outfit="freedom_scientific_outfit" or outfit="vstalker_outfit") then nano=3 end if outfit and (outfit="scientific_outfit" or outfit="ecolog_outfit" or outfit="protection_outfit") then nano=5 end update_container() end function update_af_num() local cnt = db.actor:object_count() local d = 0 for i=0, cnt-1 do local Item = db.actor:object(i) if string.find(Item:section(), "af_") then d = d + 1 end end return d end function update_container() local af_num = update_af_num() local psy_hit = hit() psy_hit.direction = vector():set(0,0,0) psy_hit.impulse = 0 psy_hit.draftsman = db.actor if nano < af_num then psy_hit.power = 0.0005 psy_hit.type = hit.radiation db.actor:hit(psy_hit) end if nano >= af_num then psy_hit.power = 0 psy_hit.type = hit.radiation db.actor:hit(psy_hit) end end Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581932
TRAMP14 1 Опубликовано 1 Апреля 2011 Поделиться Опубликовано 1 Апреля 2011 Если "нет такого файла" то при чём тут ошибка синтаксиса? Дай весь лог вылета Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581935
speczadanie 0 Опубликовано 1 Апреля 2011 Поделиться Опубликовано 1 Апреля 2011 Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ....e.r.-1-1\gamedata\scripts\my_updating.script:21: attempt to index global 'my_container' (a nil value) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/84/#findComment-581938
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти