Это популярное сообщение. Dennis_Chikin 3 665 Опубликовано 16 Мая 2014 Это популярное сообщение. Поделиться Опубликовано 16 Мая 2014 Ковыряемся в файлах ТЧ Прежде чем писать в тему - внимательно читаем первый пост, и пользуемся поиском. Возможно, ответ на Ваш вопрос уже есть. Касательно телепатии: если Вы передаете Ваши файлы телепатическим путем - ответы будут передаваться тоже телепатически. Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком. 4 8 6 12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-847221
Карлан 1 050 Опубликовано 21 Октября 2014 Поделиться Опубликовано 21 Октября 2014 (изменено) @amik, on_timer = 6000 | {=actor_has_weapon} %+mer_guard_kill_actor =bar_arena_hit% function otshelnik_spawn (actor, npc, p) return (level.get_time_hours() >= 18 and level.get_time_hours() < 20) and (vector():set(x,y,z):distance_to(actor:position()) > p[1]) end cond = {=otshelnik_spawn(70)} Изменено 21 Октября 2014 пользователем Карлан 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884514
makdm 37 Опубликовано 21 Октября 2014 Поделиться Опубликовано 21 Октября 2014 @amik, по первому вопросу. Ошибок в логике нет. Правда непонятно, что за функция killactor. Попробуйте заменить на actor_enemy. По второму вопросу. Вот это check_distance = truemin_distance = 70 работать не будет, так как обработка этих параметров не предусмотрена в скрипте se_stalker.script Можете посмотреть, как эти параметры обрабатываются в скрипте se_monster.script, ну и по аналогии попробуйте добавить обработку в скрипт se_stalker.script 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884544
amik 256 Опубликовано 21 Октября 2014 Поделиться Опубликовано 21 Октября 2014 (изменено) Пока остановился на методе Карлан(а) on_timer = 6000 | {=actor_has_weapon} walker@guard2 %=bar_arena_hit% С actor_enemy точно так же срабатывает как и с killactor, срывается в бой только 3-й нпс. Не пойму... ну ладно буду обижать весь бар, все равно из-за непослушания должна быть смерть... обработка этих параметров не предусмотрена в скрипте se_stalker.script Спасибо, обошел ситуацию через дополнительный way_point, посылаю его куда подальше, да и все. Изменено 22 Октября 2014 пользователем amik Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884556
Wolkodav 0 Опубликовано 22 Октября 2014 Поделиться Опубликовано 22 Октября 2014 Ребят, а есть программа или какой урок, по изменению расположения карт локаций на глобальной карте в сталкер... Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884657
BFG 7 583 Опубликовано 22 Октября 2014 Поделиться Опубликовано 22 Октября 2014 @Wolkodav, Здесь почитай , на примере ЧН. Возможны ли аналогии с ТЧ не проверял. Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884667
riddik121 193 Опубликовано 22 Октября 2014 Поделиться Опубликовано 22 Октября 2014 Привет всем! Подскажите пожалуйста как сделать так, чтобы конкретный вид монстров не был врагом конкретной группировке сталкеров. Я в секции контролёра нашёл такую строку Friend_Community_Overrides = zombied. Вроде контролёр и сталкер-зомби не враги. Добавляю эту строку в файл сноркам и не работает. Снорки и зомби-сталкеры враги. Может кто знает подскажите пожалуйста! Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884772
amik 256 Опубликовано 22 Октября 2014 Поделиться Опубликовано 22 Октября 2014 (изменено) Отношения всегда были в файле game_relations.ltx Изменено 22 Октября 2014 пользователем amik Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884780
topdog 49 Опубликовано 22 Октября 2014 Поделиться Опубликовано 22 Октября 2014 @Wolkodav, смотри здесь: Полезная информация по работе с картами локаций в ПДА Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884817
Romann 623 Опубликовано 22 Октября 2014 Поделиться Опубликовано 22 Октября 2014 Приветствую, нужна помощь , - вот в моде есть арбалет, стрелы к нему - как сделать чтоб эти стрелы при попадании взрывались?Пытаюсь к ним "прикрутить" Заряд M209 -- ammo_m209, не получается, не хотят они взрываться..((( Подскажите пож. хоть в какую сторону "копать". Добавлено Dennis_Chikin, 27 Октября 2014 Сделать арбалет на классе гранатомета. Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884859
Zander_driver 10 348 Опубликовано 23 Октября 2014 Поделиться Опубликовано 23 Октября 2014 А кто проверял утверждение, что если число доступных работ в гулаге меньше чем его capasity, то должен быть вылет?У меня случайно такое получилось в гулаге general_lager, "лишние" неписи просто вышли из гулага и пошли бродить. а когда гулаг переключился в состояние с бОльшим числом работ, вернулись обратно. Есть такая мысль, что сделав к примеру два "пульсирующих" гулага, в которых поочередно увеличивается и уменьшается число работ, можно организовать регулярную миграцию неписей из одного гулага во второй и обратно. Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884871
Dennis_Chikin 3 665 Опубликовано 23 Октября 2014 Поделиться Опубликовано 23 Октября 2014 (изменено) В общем, в оригинале понавертели много всякого странного, в результате чего рано или поздно где-то пытаются сделать что-нибудь странное с nil. После чего все, что попало, тихо виснет, а потом вылетает со странными ошибками или без таковых. В амк это пытались поправить, но в результате происходит попытка освобождения несуществующего непися с несуществующих работ, с результатом опять же слегка предсказуемым. Да, миграцию неписей между смартами организовать можно, и нужно, но другими способами. А для самих работ лучше вернуть отключенную проверку на валидность, и не допускать. После того, как все добавлено/оттестировано - можно опять отключить. Изменено 23 Октября 2014 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884881
Zander_driver 10 348 Опубликовано 23 Октября 2014 Поделиться Опубликовано 23 Октября 2014 (изменено) А для самих работ лучше вернуть отключенную проверку на валидность, и не допускать. О чем идет речь, о том самом соотношении что число работ не должно быть меньше вместимости гулага? Я что-то не совсем понял ответ. Гулаг у меня не завис, а вполне явственно продолжал функционировать. Причем валидных работ. function gulag:validate_jobs() А зависнет там в итоге неизвестно что в неизвестно какой момент. dc Изменено 23 Октября 2014 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-884940
nego 35 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 (изменено) У меня вопрос: Как из диалога понизить или повысить репутацию после диалога? Со скриптами на ВЫ. Он(скрипт) просто не понимает мою логику. Изменено 24 Октября 2014 пользователем nego Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885147
AndreySol 215 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 (изменено) Как из диалога понизить или повысить репутацию после диалога? В нужной фразе диалога вызвать <action>, в котором прописать изменение репутации стандартными ф-циями. Т.е. change_character_reputation вызвать из ф-ции прописанной в <action>. Изменено 24 Октября 2014 пользователем AndreySol Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885167
nego 35 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 change_character_reputation <Это из скрипта? А где его найти? Я в скриптах 0,1% Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885241
amik 256 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 (изменено) nego Я тоже, но искать умею, по ходу, чуть лучше тебя function plus_reputation(stalker, player) db.actor:change_character_reputation(db.actor:character_reputation() + 60) end Или так: function plus_reputation(first_speaker, second_speaker) first_speaker:change_character_reputation(10); end п.с. Лучше за мной перепроверить. Он(скрипт) просто не понимает мою логику. Изменено 24 Октября 2014 пользователем amik 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885244
Вспышка 836 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 Скрипт se_respawn, кусок из него! Нужно сделать редкий респавн local idle_spawn_preset = { seldom = 60*60*96, medium = 60*60*48, often = 60*60*24, --seldom = 60*60*6, --medium = 60*60*3, --often = 60*60, once = -100000 Если я за комментирую так: local idle_spawn_preset = { seldom = 60*60*96, --medium = 60*60*48, --often = 60*60*24, --seldom = 60*60*6, --medium = 60*60*3, --often = 60*60, once = -100000 то, это и будет редкий респавн или же? Вот весь скрипт: --[[------------------------------------------------------------------------------------------------------------------ Respawner. Схема обновления популяции всего всего всего в симуляции. by Stohe (Диденко Руслан) --------------------------------------------------------------------------------------------------------------------]] --function printf() --end local section_name = "respawn" local i,k,v = 0,0,0 -- Таблица ограничений на спаун: всего в симуляции не должно быть больше, чем указано. local simMaxCount = { stalker_novice = 30, stalker_regular = 35, stalker_veteran = 35, stalker_master = 35, monolith_novice = 10, monolith_regular = 35, monolith_veteran = 39, monolith_master = 45, military_novice = 2, military_regular = 20, military_veteran = 20, military_master = 15, killer_novice = 2, killer_regular = 15, killer_veteran = 23, killer_master = 20, ecolog_novice = 1, ecolog_regular = 3, ecolog_veteran = 3, ecolog_master = 3, dolg_novice = 2, dolg_regular = 19, dolg_veteran = 20, dolg_master = 15, freedom_novice = 25, freedom_regular = 15, freedom_veteran = 19, freedom_master = 20, bandit_novice = 15, bandit_regular = 25, bandit_veteran = 25, bandit_master = 28, zombied_novice = 10, zombied_regular = 15, zombied_veteran = 15, zombied_master = 15, nebo_novice = 25, nebo_regular = 25, nebo_veteran = 25, nebo_master = 25, sniper_novice = 15, sniper_regular = 25, sniper_veteran = 25, sniper_master = 27, green_novice = 5, green_regular = 25, green_veteran = 25, green_master = 15, lastday_novice = 10, lastday_regular = 15, lastday_veteran = 25, lastday_master = 25, fotoman_novice = 2, fotoman_regular = 3, fotoman_veteran = 3, fotoman_master = 3, cat_weak = 30, cat_normal = 30,cat_strong = 30, rat_weak = 40, rat_normal = 40,rat_strong = 40, tushkano_weak = 150, flesh_weak = 19, flesh_normal = 45, flesh_strong = 35, boar_weak = 60, boar_normal = 50, boar_strong = 40, dog_weak = 60, dog_normal = 150, dog_strong = 140, pseudodog_weak = 69, pseudodog_normal = 90, pseudodog_strong = 80, psy_dog_weak = 20, psy_dog_normal = 20, psy_dog_strong = 20, zombie_weak = 71, zombie_normal = 60, zombie_strong = 65, snork_weak = 65, snork_normal = 80, snork_strong = 55, poltergeist_weak = 20, pseudo_gigant_weak = 30, controller_weak = 30, burer_weak = 30, bloodsucker_weak = 18, bloodsucker_normal = 60, bloodsucker_strong = 27, fracture_weak = 5, fracture_normal = 7, fracture_strong = 9 } local idle_spawn_preset = { seldom = 60*60*96, medium = 60*60*48, often = 60*60*24, --seldom = 60*60*6, --medium = 60*60*3, --often = 60*60, once = -100000 } -- Список респавнеров, для сбора статистики local respawners = {} local respawners_by_parent = {} ---------------------------------------------------------------------------------------------------------------------- -- Разные полезные функции ---------------------------------------------------------------------------------------------------------------------- function r_bool( spawn_ini, section, line, default ) if spawn_ini:line_exist( section, line ) then return spawn_ini:r_bool( section, line ) else return default end end function r_str( spawn_ini, section, line, default ) if spawn_ini:line_exist( section, line ) then return spawn_ini:r_string( section, line ) else return default end end function r_num( spawn_ini, section, line, default ) if spawn_ini:line_exist( section, line ) then return spawn_ini:r_float( section, line ) else return default end end function r_2nums( spawn_ini, section, line, def1, def2 ) if spawn_ini:line_exist( section, line ) then -- если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini local t = parse_names( spawn_ini:r_string( section, line ) ) local n = #t if n == 0 then return def1, def2 elseif n == 1 then return t[1], def2 else return t[1], t[2] end else return def1, def2 end end function parse_names( s ) local t = {} for name in string.gfind( s, "([%w_%-.\\]+)%p*" ) do table.insert( t, name ) end return t end function r_spawns( spawn_ini, section, line, sectSpawnProps) if spawn_ini:line_exist( section, line ) then --' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini local t = parse_names( spawn_ini:r_string( section, line ) ) local n = #t local ret_table = {} local k = 1 while k <= n do local spawn = {} spawn.section = t[k] -- Проверяем что это не последняя запись if t[k+1] ~= nil then local p = tonumber(t[k+1]) -- проверяем что вторым числом задана вероятность, а не другая секция спавну if p then -- забиваем число spawn.prob = p k = k + 2 else -- забиваем дефолт 1 spawn.prob = 1 k = k + 1 end else spawn.prob = 1 k = k + 1 end table.insert(ret_table, spawn) -- Вычитываем настройки секций респавна и кешируем их. if sectSpawnProps[spawn.section] == nil then local respawn_ini = system_ini() local community = r_str(respawn_ini, spawn.section, "community", "nil") local rank = r_str(respawn_ini, spawn.section, "spec_rank", "nil") local check = true local custom_data = r_str(respawn_ini, spawn.section, "custom_data") if custom_data ~= nil then local custom_data_ltx = ini_file(custom_data) if custom_data_ltx:section_exist("smart_terrains") then if custom_data_ltx:line_exist("smart_terrains", "none") then if r_str(custom_data_ltx, "smart_terrains", "none") == "true" then check = false end end if custom_data_ltx:line_exist("smart_terrains", "respawn_check") then if r_str(custom_data_ltx, "smart_terrains", "respawn_check") == "false" then check = false end end end end sectSpawnProps[spawn.section] = {community = community, rank = rank, check = check} end end return ret_table end return nil end ---------------------------------------------------------------------------------------------------------------------- -- Серверный объект спавнера ---------------------------------------------------------------------------------------------------------------------- class "se_respawn" ( cse_alife_smart_zone ) function se_respawn:__init( section ) super( section ) self.spawned_obj = {} -- Таблица для кеширования свойств секций респавна. self.sectSpawnProps = {} self.rt_read = false self.proxy_initialized = false end -- сохранение function se_respawn:STATE_Write( packet ) cse_alife_smart_zone.STATE_Write( self, packet ) local table_size = #self.spawned_obj -- printf("SPAWNER SAVE table_size[%d]", table_size) -- print_table(self.spawned_obj) packet:w_u8(table_size) for i=1,table_size do packet:w_u16(self.spawned_obj) end utils.w_CTime(packet, self.respawn_time) if self.respawn_time == nil then self.respawn_time = game.CTime() end --sak.dbglog("%s write respawn_time %s %s", tostring(self:name()), self.respawn_time:dateToString(0), self.respawn_time:timeToString(1)) end -- восстановление function se_respawn:STATE_Read( packet, size ) cse_alife_smart_zone.STATE_Read( self, packet, size ) if editor() then return end local table_size = packet:r_u8() for i=1,table_size do table.insert(self.spawned_obj, packet:r_u16()) end -- printf("SPAWNER READ table_size[%d]", table_size) -- print_table(self.spawned_obj) if not packet:r_eof() then self.respawn_time = utils.r_CTime(packet) self.rt_read = true --sak.dbglog("%s read respawn_time %s %s", tostring(self:name()), self.respawn_time:dateToString(0), self.respawn_time:timeToString(1)) end end -- инициализация объекта. -- вызывается симулятором. function se_respawn:on_register() cse_alife_smart_zone.on_register( self ) --printf("RESPAWN: [%s] se_respawn on_register", tostring(self:name())) init_respawn_params(self) end -- Создаем объект function se_respawn:create(prob) if tostring(prob)=="true" then prob=80 elseif tostring(prob)=="false" then prob=0 end if tonumber(prob) == nil then print_table(self.conditions) abort("RESPAWN[%s]spawn probability doesn't set", tostring(self:name())) prob = 0 return false end if math.random(100) <= tonumber(prob) then local spawn_section = "" local sum = 0 -- Производим рандомную взвешенную выборку -- с учетом уже заспавленного количества человек. for k,v in pairs(self.respawn_section) do --' local tt = self.sectSpawnProps[v.section] --' local community_rank = tt.community.."_"..tt.rank --' local s_count = simMaxCount[community_rank] --' if s_count == nil then --' s_count = 0 --' end --' if tt.check == false or --' self.item_spawn == true or --' sim_statistic.simNpcCount(tt.community, tt.rank) < s_count --' then sum = sum + v.prob --' end end sum = math.random(0, sum) for k,v in pairs(self.respawn_section) do --' local tt = self.sectSpawnProps[v.section] --' local community_rank = tt.community.."_"..tt.rank --' local s_count = simMaxCount[community_rank] --' if s_count == nil then --' s_count = 0 --' end --' if tt.check == false or --' self.item_spawn == true or --' sim_statistic.simNpcCount(tt.community, tt.rank) < s_count --' then sum = sum - v.prob if sum <= 0 then spawn_section = v.section break end --' end end if spawn_section == "" then -- printf("SPAWNING [%s], CANT SPAWN, SIMULATION POPULATION EXCEED", tostring(self:name())) --sak.dbglog("SPAWNING [%s], CANT SPAWN, SIMULATION POPULATION EXCEED", tostring(self:name())) return false end local parent_id = nil if self.parent ~= nil then local s_obj = alife():story_object(self.parent) if s_obj == nil then abort("SPAWNING [%s], cant find parent with SID [%s]", self:name(), self.parent) return end parent_id = s_obj.id end local obj if parent_id == nil then obj = alife():create(spawn_section, self.position, self.m_level_vertex_id, self.m_game_vertex_id) else obj = alife():create(spawn_section, self.position, self.m_level_vertex_id, self.m_game_vertex_id, parent_id) end get_console():execute("r2_sun_near_border 1") amk.on_REspawn(obj,self) local tt = self.sectSpawnProps[spawn_section] -- printf("SPAWN [%s] -> [%s]", tostring(self:name()), obj:name()) --sak.dbglog("SPAWN [%s] -> [%s]", tostring(self:name()), obj:name()) if self.item_spawn == false then if tt.check == true and not self.amk_name then obj:brain():update() local smart_terrain_id = obj:smart_terrain_id() --sak.dbglog("SPAWN [%s] move_offline [%s], interactive [%s], smart_terrain_id [%s]", tostring(self:name()), tostring(self:move_offline()), tostring(self:interactive()), smart_terrain_id) --printf("SPAWN [%s] move_offline [%s], interactive [%s], smart_terrain_id [%s]", tostring(self:name()), tostring(self:move_offline()), tostring(self:interactive()), smart_terrain_id) if smart_terrain_id ~= 65535 then table.insert(self.spawned_obj ,obj.id) local pos = obj.position -- printf("SPAWNING [%s] -> [%s], position [%s][%s][%s]", tostring(self:name()), spawn_section, pos.x, pos.y, pos.z) local sm_obj = alife():object(smart_terrain_id) -- printf("SPAWNING for SMART [%s] : [%s] -> [%s]", self:name(), obj:name(), sm_obj:name()) --sak.dbglog("SPAWNING for SMART [%s] : [%s] -> [%s]", self:name(), obj:name(), sm_obj:name()) return true else alife():release(obj, true) --sak.dbglog("SPAWNING [%s] -> [%s], CANT SPAWN. NO SMART_TERRAIN AVAILABLE!!!", tostring(self:name()), spawn_section) -- printf("SPAWNING [%s] -> [%s], CANT SPAWN. NO SMART_TERRAIN AVAILABLE!!!", tostring(self:name()), spawn_section) return false end end end table.insert(self.spawned_obj ,obj.id) return true end end -- Попытка спаунить объекты. Анализируется сколько уже заспавнено и выбирается один из механизмов - либо -- мы доспавниваем до минимального количества, либо спавним с заданной вероятностью function se_respawn:spawn() -- printf("RESPAWN: [%s] spawn execute", tostring(self:name())) --sak.dbglog("RESPAWN: [%s] spawn execute", tostring(self:name())) if not self.spawn_once then -- Пробегаемся по списку уже заспавненных объектов и удаляем из них мертвые либо уничтоженные. for k,v in pairs(self.spawned_obj) do local obj = level.object_by_id(v) if obj == nil then obj = alife():object(v) end if obj ~= nil then if (IAmAStalker[obj:clsid()] or IAmAMonster[obj:clsid()]) and obj:alive() ~= true then table.remove(self.spawned_obj, k) end else table.remove(self.spawned_obj, k) end end end if xr_logic.pick_section_from_condlist(db.actor_proxy, self, self.conditions) == "0" then -- printf("SPAWNING [%s], CANT SPAWN. PROBABILITY ZERO!!!", tostring(self:name())) --sak.dbglog("SPAWNING [%s], CANT SPAWN. PROBABILITY ZERO!!!", tostring(self:name())) sim_statistic.respawn_enabled(self, false) return end sim_statistic.respawn_enabled(self, true) if self.spawn_once and not self.already_once_spawned then self.already_once_spawned = true end -- экстренный спаун минимального количества объектов if #self.spawned_obj < self.min_count then while #self.spawned_obj < self.min_count do --sak.dbglog("RESPAWN: [%s] very small object", tostring(self:name())) if self:create(100) == false then return end end return end -- делаем несколько попыток заспаунить объект. for i=1,self.max_spawn do if self.max_count ~= -1 and #self.spawned_obj >= self.max_count then --sak.dbglog("RESPAWN: [%s] max count reached", tostring(self:name())) -- printf("SPAWNING [%s], CANT SPAWN. MAX COUNT REACHED!!!", tostring(self:name())) return end if self:create(xr_logic.pick_section_from_condlist(db.actor_proxy, self, self.conditions)) == false then return end end end --' Удаляем уже заспавненный объект из списка заспавненных --' Используется только для ящиком со шмотками в смарттеррейнах function se_respawn:remove_spawned(id) for k,v in pairs(self.spawned_obj) do if id == v then table.remove(self.spawned_obj, k) end end end -- Обновление респавнера. В зависимости от настроек обновляется либо только в офлайне, либо и там и там. function se_respawn:execute() -- printf("RESPAWN: [%s] se_respawn execute", tostring(self:name())) if self.already_once_spawned==true then return end --' Выходим, если у нас установлен событийный спавн. if self.idle_spawn_min == -1 then return end if self.respawn_time < game.get_game_time() then -- if not self.proxy_initialized then -- db.actor_proxy:init() -- self.proxy_initialized = true -- end local idle_time = game.CTime() local now = game.get_game_time() -- idle_time:setHMSms( 0, 0, 0, math.random(self.idle_spawn_min, self.idle_spawn_max)*1000) -- idle_time:setHMSms( math.random(12, 24), 0, 0, math.random(self.idle_spawn_min, self.idle_spawn_max)*1000) idle_time:setHMSms( math.random(23, 25), 0, 0, 0) self.respawn_time = now + idle_time --sak.dbglog("RESPAWN: [%s] se_respawn execute %s %s", tostring(self:name()), now:dateToString(0), now:timeToString(1)) --sak.dbglog("next respawn %s %s", self.respawn_time:dateToString(0), self.respawn_time:timeToString(1)) -- Производим попытку заспаунить объекты self:spawn() -- printf("spawn_count = %s", table.getn(self.spawned_obj)) end end -- Обновление в офлайне function se_respawn:update() cse_alife_smart_zone.update( self ) --'printf("RESPAWN: [%s] se_respawn update_offline", tostring(self:name())) self:execute() end -- Обновление в онлайне function se_respawn:update_online() --'cse_alife_smart_zone.update( self ) --'printf("RESPAWN: [%s] se_respawn update_online", tostring(self:name())) if self.respawn_radius == -1 then sim_statistic.respawn_enabled(self, false) return end if db.actor:position():distance_to (self.position) >= self.respawn_radius then self:execute() else sim_statistic.respawn_enabled(self, false) end end function spawn(name) local spawner = respawners[name] if spawner == nil then return end --sak.dbglog("spawn("..tostring(spawner:name())..")") for i=1,spawner.max_spawn do if spawner.max_count ~= -1 and #spawner.spawned_obj >= spawner.max_count then -- printf("SPAWNING [%s], CANT SPAWN. MAX COUNT REACHED!!!", tostring(spawner:name())) return end if spawner:create(xr_logic.pick_section_from_condlist(db.actor_proxy, spawner, spawner.conditions)) == false then return end end end function get_respawner_by_parent(parent_id) return respawners_by_parent[parent_id] end -- Сбор статистики function stats() local total_spawned = 0 local total_avail = 0 local total = 0 printf("***************** RESPAWN STATISTIC *********************") for k,v in pairs(respawners) do local s = xr_logic.pick_section_from_condlist(db.actor_proxy, v, v.conditions) local pops = "DISABLE" if s ~= "nil" and s ~= "0" then pops = #v.spawned_obj end local str_pops if v.max_count == pops then str_pops = "FULL "..tostring(pops) else str_pops = tostring(pops) end printf("[%s] spawns [%s] object", tostring(v:name()), str_pops) print_table(v.respawn_section) -- Увеличиваем общие счетчики total = total + v.max_count if pops ~= "DISABLE" then total_avail = total_avail + v.max_count total_spawned = total_spawned + pops end end printf("*** SUMMARY ***") printf(" total = %s", total) printf(" total_avail = %s", total_avail) printf(" total_spawned = %s", total_spawned) printf("***************") end -- Сбор продвинутой статистики статистики по лимитам function lstats() local can_spawn = {} printf("***************** LIMITS STATISTIC *********************") for k,v in pairs(respawners) do -- Запоминаем максимальное количество весов для данного респавнера local wage = 0 for kk,vv in pairs(v.respawn_section) do wage = wage + vv.prob end -- Заносим максимальное количество всех типов чуваков, которые данный респавнер может наспаунить. for kk,vv in pairs(v.respawn_section) do local tt = v.sectSpawnProps[vv.section] local community_rank = tt.community.."_"..tt.rank if can_spawn[community_rank] == nil then can_spawn[community_rank] = {community = tt.community, rank = tt.rank} end end end -- Выводим все это в общей статистике local total_max, total_prob, total_current, total_limit = 0,0,0,0 for k,v in pairs(can_spawn) do local cs = sim_statistic.simNpcCount(v.community, v.rank) local gl = simMaxCount[k] if gl == nil then gl = 0 end total_current = total_current + cs total_limit = total_limit + gl printf("%s current=%s limit=%s", k, cs, gl) end printf("TOTAL: current=%s limit=%s", total_current, total_limit) end -- Сбор статистики по ненастроенным объектам function estats() printf("***************** SPAWN ERROR STATISTIC *********************") for k,v in pairs(respawners) do -- Заносим максимальное количество всех типов чуваков, которые данный респавнер может наспаунить. for kk,vv in pairs(v.respawn_section) do local tt = v.sectSpawnProps[vv.section] if tt.community == "nil" or tt.rank == "nil" then printf("respawner [%s]", tostring(v:name())) printf("Section [%s] community[%s] rank [%s]", vv.section, tt.community, tt.rank) end end end end function create_ammo(section, position, lvi, gvi, pid, num) local ini = system_ini() local num_in_box = ini:r_u32(section, "box_size") while num > num_in_box do alife():create_ammo(section, position, lvi, gvi, pid, num_in_box) num = num - num_in_box end alife():create_ammo(section, position, lvi, gvi, pid, num) end local amk_respawner_control={} local amk_named_respawner_control={} function init_respawn_params(obj) amk_respawner_control[obj:name()] = obj -- Вычитываем настройки спауна local ini = obj:spawn_ini() if not ini:section_exist(section_name) then return end obj.respawn_section = r_spawns(ini, section_name, "respawn_section", obj.sectSpawnProps) if obj.respawn_section == nil then abort("RESPAWN: [%s] field 'respawn_section' doesn't exist.", obj:name()) end obj.spawned_goes_online = r_bool(ini, section_name, "spawned_goes_online", nil) obj.spawn_once = r_bool(ini, section_name, "spawn_once", false) obj.amk_name = r_str(ini, section_name, "amk_name", nil) if obj.amk_name then amk_named_respawner_control[obj.amk_name] = obj end obj.min_count = r_num(ini, section_name, "min_count", 0) obj.max_count = r_num(ini, section_name, "max_count", -1) if obj.min_count > obj.max_count and obj.max_count ~= -1 then abort("RESPAWN: [%s] min_count > max_count", obj:name()) end --' FOR DEBUG ONLY, please don't forget to delete --'if obj.max_count > 0 then --' obj.min_count = obj.max_count --'end obj.max_spawn = r_num(ini, section_name, "max_spawn", 1) obj.idle_spawn_min, obj.idle_spawn_max = r_2nums(ini, section_name, "idle_spawn") if obj.idle_spawn_min == nil then abort("RESPAWN: [%s] field 'idle_spawn' doesn't exist.", obj:name()) end if obj.idle_spawn_max == nil then obj.idle_spawn_max = obj.idle_spawn_min end --' Вычитка пресетов if idle_spawn_preset[obj.idle_spawn_min] ~= nil then obj.idle_spawn_min = idle_spawn_preset[obj.idle_spawn_min] else obj.idle_spawn_min = tonumber(obj.idle_spawn_min) end if idle_spawn_preset[obj.idle_spawn_max] ~= nil then obj.idle_spawn_max = idle_spawn_preset[obj.idle_spawn_max] else obj.idle_spawn_max = tonumber(obj.idle_spawn_max) end --sak.dbglog("spawn_min %d spawn_max %d", obj.idle_spawn_min, obj.idle_spawn_max) obj.str_conditions = r_str(ini, section_name, "conditions", 100) obj.conditions = xr_logic.parse_condlist(obj, section_name, "conditions", obj.str_conditions) obj.respawn_radius = r_num(ini, section_name, "respawn_radius", -1) --' Спешкейс, чтобы сохранить совместимость сейвов. if obj:name() == "mil_freedom_barier_respawn_1" then obj.respawn_radius = -1 end obj.parent = r_num(ini, section_name, "parent", nil) obj.item_spawn = r_bool(ini, section_name, "item_spawn", false) -- производим первичную инициализацию if obj.rt_read == false then obj.respawn_time = game.CTime() --sak.dbglog("INIT [%s] %s %s", tostring(obj:name()), obj.respawn_time:dateToString(0), obj.respawn_time:timeToString(1)) end -- Для сбора статистики сохраняем указатель на респавнер respawners[obj:name()] = obj if obj.parent ~= nil then respawners_by_parent[obj.parent] = obj end --' Отметка респавнера мапспотом (для статистики) sim_statistic.register_respawn(obj) end function reinit_spawner_params(name) if amk_respawner_control[name] then init_respawn_params(amk_respawner_control[name]) end end function get_respawner_by_name(name) if amk_named_respawner_control[name] then return alife():object(amk_named_respawner_control[name].id) end end Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885260
alex5773 1 332 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 (изменено) Так у тебя же 23, 25, вроде и так редкий, раз в сутки. Сделай вместо idle_time:setHMSms( math.random(23, 25), 0, 0, 0) например так: idle_time:setHMSms( math.random(72, 96), 0, 0, 0) Изменено 25 Октября 2014 пользователем alex5773 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885261
Хемуль36рус 1 790 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 @Вспышка, Сань, если из чистого Сталкера, то ничего не получится. Возьми из моего мода, мне Isclon делала. Если где будешь использовать, не забывай в авторах её указывать.) 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885262
Вспышка 836 Опубликовано 24 Октября 2014 Поделиться Опубликовано 24 Октября 2014 @Хемуль36рус, Это из Солянки. А если так: seldom = 60*60*296, medium = 60*60*148, often = 60*60*96, То это не не редкий получится? Ссылка на комментарий https://www.amk-team.ru/forum/topic/15045-soc-kovyrjaemsja-v-fajlah/page/620/#findComment-885265
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти