Это популярное сообщение. Dennis_Chikin 3 658 Опубликовано 16 Мая 2014 Это популярное сообщение. Поделиться Опубликовано 16 Мая 2014 Ковыряемся в файлах ТЧ Прежде чем писать в тему - внимательно читаем первый пост, и пользуемся поиском. Возможно, ответ на Ваш вопрос уже есть. Касательно телепатии: если Вы передаете Ваши файлы телепатическим путем - ответы будут передаваться тоже телепатически. Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком. 4 8 6 12 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
naxac 2 441 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 (изменено) Всем привет.Подскажите, в ТЧ вообще работает метод spawn_artefact() для аномалий? Применял к серверному объекту аномалии: ни вылета, ни какого-либо результата...Скорее не работает, чем работает. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
AndrewMor 527 Опубликовано 26 Октября 2014 Поделиться Опубликовано 26 Октября 2014 Прошу помощи. На Агро Крот уходит в оффлайн по выдаче определенного поршня. Я условие закомментировал, теперь он постоянно в онлайне. Но мне хочется, чтобы он уходил на Свалку. Вот секция логики: [walker@well3] path_walk = agr_krot_well_walkpath_look = agr_krot_well_lookmeet = meet@well2on_info = {!actor_enemy +agr_find_gunslinger_cache_found} walker@well4combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition[walker@well4]path_walk = gar_krot_well_walkpath_look = gar_krot_well_lookmeet = meet@well2combat_ignore_cond = {!actor_enemy !fighting_actor}danger = danger_condition Но проблема в том, что он не хочет идти на Свалку, а прется севернее фабрики на Агро и там остается. Хотя координаты указаны правильные. Но если указать какую-нибудь точку на Агро - он туда идет без проблем. Почему так? Сталкер - наше всё! Ссылка на комментарий
andreyich 30 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) Всем привет! Есть вопросец. Можно ли как то увеличить шанс выпадения случайных тайников (амк опции)?treasure_manager.script - там в комментариях все есть. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 Вопрос: если в секции НПС указан смарт [smart_terrain] none = true можно ли его приписать к какому-нибудь другому смарту при выдаче инфорпоршня? Сталкер - наше всё! Ссылка на комментарий
Maestro_84 3 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) Решил немного побаловаться с конфигами оружия, решил сделать СВД автоматической, нашёл в гугле что за это отвечает строка "fire_modes =", Поставил значения "-1, 1", сохранил конфиг, захожу в игру, и понимаю что ничего не изменилось, скажите, в чём проблема? почему при изменении конфига не изменяется режим огня?) Класс не тот. И тип, кстати, тоже. dc Изменено 13 Января 2015 пользователем Dennis_Chikin Ссылка на комментарий
monk 2 845 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 он не хочет идти на Свалку, а прется севернее фабрики на Агро и там остается Возможно, что НПС не могут переходить через этот переход? 1 Ссылка на комментарий
amik 253 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) AndrewMor Когда даешь логику давай ее полностью а не куском. Чтобы НПС перешел с локи на локу нужно ему указать два гулага, как у Волка(ТЧ) это сделано. Или удалять его и спавнить на нужной тебе локации, или еще как... но так как ты делаешь не прокатит. если в секции НПС указан смарт... А почему сам не попробуешь сделать примерно так: [smart_terrains] esc_lager = {+инфо} ; или куда там тебе его... none = true Если нет, то сделай еще один смарт для своего сталка, и все (потом переключишь при надобности). Вспышка Ну что, попробовал? Редкий?) Изменено 27 Октября 2014 пользователем amik Мой архив Сталкером не занимаюсь. Ссылка на комментарий
Вспышка 836 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) Вспышка Ну что. попробовал? Редкий?) Андрей, пользуюсь тем что Хемуль предложил! В дороботке lsclon. Хороший скрипт с выводом инфы в лог и т.п.. Мне нравится, играю на редком (скрипт lsclon). Изменено 27 Октября 2014 пользователем Вспышка AMD Ryzen 5 2600 \ ASRock B450 PRO 4 \ RTX 2070 Super \ RAM DDR4 16Gb (3400MHz) \ 2 SSD Crucial MX500 (250Gb и 500Gb) \ Windows 10 (2004) x64-bit Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 А почему сам не попробуешь сделать примерно так: То есть, если сделать так: [smart_terrains] none = {-agr_find_gunslinger_cache_found} gar_angar = {+agr_find_gunslinger_cache_found} то искомый перс пойдет в другой гулаг? А как мне его на конкретную точку посадить? Сталкер - наше всё! Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) Люди, ну читайте вы внимательно, святого Слонопотама ради ! В смарте есть гулаг. У гулага есть конфиг. В конфиге есть работы. У работы есть путь. Вот в первую точку этого пути непись и бежит. В офлайне в том числе. Собственно, именно так он и между локациями перемещается. Если переходы прописаны. Но это уже в маппинг. Изменено 27 Октября 2014 пользователем Dennis_Chikin 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Вспышка 836 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) Кстати, скрипт из OGSE, se_respawn подойдёт для Соли, или для другой сборке? --[[------------------------------------------------------------------------------------------------------------------ Respawner. Схема обновления популяции всего всего всего в симуляции. by Stohe (Диденко Руслан) --------------------------------------------------------------------------------------------------------------------]] -- Поправки: Колмогор, KamikaZze --------------------------------------------------------------------------------------------------------------------]] -- Доработано под нужды мода OGSE 0.6.9.2 KamikaZze --------------------------------------------------------------------------------------------------------------------]] local t_common = system_ini():r_s32("options","t_common") local section_name = "respawn" local i,k,v = 0,0,0 -- Таблица ограничений на спаун: всего в симуляции не должно быть больше, чем указано. local simMaxCount = { stalker_novice = 38, stalker_regular = 34, stalker_veteran = 33, stalker_master = 15, monolith_novice = 4, monolith_regular = 19, monolith_veteran = 25, monolith_master = 22, military_novice = 4, military_regular = 24, military_veteran = 16, military_master = 4, killer_novice = 4, killer_regular = 15, killer_veteran = 13, killer_master = 10, ecolog_novice = 1, ecolog_regular = 1, ecolog_veteran = 1, ecolog_master = 1, dolg_novice = 4, dolg_regular = 24, dolg_veteran = 27, dolg_master = 13, freedom_novice = 35, freedom_regular = 15, freedom_veteran = 18, freedom_master = 15, bandit_novice = 24, bandit_regular = 30, bandit_veteran = 12, bandit_master = 7, zombied_novice = 15, zombied_regular = 12, zombied_veteran = 7, zombied_master = 7, rat_weak = 0, tushkano_weak = 150, flesh_weak = 14, flesh_normal = 38, flesh_strong = 22, boar_weak = 52, boar_normal = 38, boar_strong = 27, dog_weak = 53, dog_normal = 126, dog_strong = 130, pseudodog_weak = 59, pseudodog_normal = 80, pseudodog_strong = 60, psy_dog_weak = 15, psy_dog_normal = 15, psy_dog_strong = 15, zombie_weak = 61, zombie_normal = 50, zombie_strong = 35, snork_weak = 50, snork_normal = 61, snork_strong = 15, poltergeist_weak = 10, pseudo_gigant_weak = 23, controller_weak = 18, burer_weak = 20, bloodsucker_weak = 7, bloodsucker_normal = 40, bloodsucker_strong = 15 } local idle_spawn_preset = { seldom = 60*60*t_common*2, medium = 60*60*t_common, often = math.ceil((60*60*t_common)/2), 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 = table.getn( 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 = table.getn( 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 = table.getn(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 --logf("%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 --logf("%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 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())) --logf("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 local tt = self.sectSpawnProps[spawn_section] -- printf("SPAWN [%s] -> [%s]", tostring(self:name()), obj:name()) -- logf("SPAWN [%s] -> [%s]", tostring(self:name()), obj:name()) if self.item_spawn == false then if tt.check == true then obj:brain():update() local smart_terrain_id = 65535 local result, smt_id = pcall(smart_terrain.prot_smt_td,obj) if result then smart_terrain_id = smt_id end -- 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()) -- logf("SPAWNING for SMART [%s] : [%s] -> [%s]", self:name(), obj:name(), sm_obj:name()) return true else if obj then alife():release(obj, true) end -- logf("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())) --logf("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 (IsStalker(obj) or IsMonster(obj)) 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())) --logf("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 table.getn(self.spawned_obj) < self.min_count then while table.getn(self.spawned_obj) < self.min_count do --logf("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 table.getn(self.spawned_obj) >= self.max_count then --logf("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( 0, 0, 0, math.random(self.idle_spawn_min, self.idle_spawn_max)*1000) self.respawn_time = now + idle_time --logf("RESPAWN: [%s] se_respawn execute %s %s", tostring(self:name()), now:dateToString(0), now:timeToString(1)) --logf("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 --logf("spawn("..tostring(spawner:name())..")") for i=1,spawner.max_spawn do if spawner.max_count ~= -1 and table.getn(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 = table.getn(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 function init_respawn_params(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.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 --logf("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() --logf("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 А файлом куда-нибудь положить ? Что имеешь ввиду? dropbox, ЯД и иже с ними. Да хоть на ргхост. Ну вот как это сравнивать в таком виде ? Изменено 13 Января 2015 пользователем Dennis_Chikin AMD Ryzen 5 2600 \ ASRock B450 PRO 4 \ RTX 2070 Super \ RAM DDR4 16Gb (3400MHz) \ 2 SSD Crucial MX500 (250Gb и 500Gb) \ Windows 10 (2004) x64-bit Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) В смарте есть гулаг. У гулага есть конфиг. В конфиге есть работы. У работы есть путь. Вот в первую точку этого пути непись и бежит. В том-то и дело, что мне не хочется его под смарт пихать. Хотелось его с одной локи на другую по поршню пересадить. Ну, можно извратиться с CALifeSmartTerrainTask() - писал уже. Но это - dirty hack. Причем логику придется прописывать нетривиально, а все переключения всего делать отдельным скриптом. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Сталкер - наше всё! Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) Тогда пояните, кто-нибудь (если вопросы нубские - сильно не бейте): 1. есть смарт, есть гулаг и в нем свободная работа. Если к этому смарту ни один НПС не приписан - работа будет свободна, или другой НПС на нее придет? Идея такая: заспавнить смарт-террейн, в гулаге прописать одного волкера, а в секции [smart_terrains] написать: [smart_terrains] none = {-agr_find_gunslinger_cache_found} gar_angar = {+agr_find_gunslinger_cache_found} Так вот этот перс до выдачи поршня будет под СВОЕЙ логикой, прописанной в конфиге, а по выдаче поршня пойдет на работу в указанный гулаг, или нет? Или на эту работу придет любой другой НПС? В gar_angar для работы, зарезервированной под непися, прописать предикат. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Сталкер - наше всё! Ссылка на комментарий
Вспышка 836 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 dropbox, ЯД и иже с ними. Да хоть на ргхост. Ну вот как это сравнивать в таком виде ? http://rghost.ru/58748085 AMD Ryzen 5 2600 \ ASRock B450 PRO 4 \ RTX 2070 Super \ RAM DDR4 16Gb (3400MHz) \ 2 SSD Crucial MX500 (250Gb и 500Gb) \ Windows 10 (2004) x64-bit Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 Ну вот сразу: local t_common = system_ini():r_s32("options","t_common") - в конфиге должны быть эти самые options. smart_terrain.prot_smt_td - ссылается на соответствующий файл из ogse. с соляночным amk.script несовместимо. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Вспышка 836 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) с соляночным amk.script несовместимо. Но сделать можно? Или оно того не стоит? Принципиальной разницы нет. Для соли там свои фишки, для ogse - свои. В OGSE есть одна существенная правка, и несколько "скоростных". Но жить можно и без этого. То, что реально имеет смысл перелопачивать - потянет за собой другие скрипты, и в итоге будет та же "солянка обезжиренная диетическая", но года через 3. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin AMD Ryzen 5 2600 \ ASRock B450 PRO 4 \ RTX 2070 Super \ RAM DDR4 16Gb (3400MHz) \ 2 SSD Crucial MX500 (250Gb и 500Gb) \ Windows 10 (2004) x64-bit Ссылка на комментарий
Вспышка 836 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) "солянка обезжиренная диетическая", но года через 3. Ден, скажи по честному, ты пошутил? Будь проклят тот день...... Пускай кто-то другой адаптирует/пишет/проигрывает эти скрипты, я ПАС!!!! для сравнения: https://dl.dropboxusercontent.com/u/27871782/se_respawn.script плюс к нему https://dl.dropboxusercontent.com/u/27871782/xl_offline.script+ news_main + десяток вынесенный таблиц + всякого по-мелочи. Это если чтобы был смысл реально переделывать. dc Изменено 28 Октября 2014 пользователем Хемуль36рус AMD Ryzen 5 2600 \ ASRock B450 PRO 4 \ RTX 2070 Super \ RAM DDR4 16Gb (3400MHz) \ 2 SSD Crucial MX500 (250Gb и 500Gb) \ Windows 10 (2004) x64-bit Ссылка на комментарий
AndrewMor 527 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 (изменено) В gar_angar для работы, зарезервированной под непися, прописать предикат. dc Что есть предикат? Это в имя_локи.скрипт надо прописывать? И как? Если можно, примерчик.. Хрестоматийный пример из gulag_escape.script: if type == "esc_lager" then ... -- Волк, собственной персоной. t = { section = "logic@esc_lager_volk", idle = 0, prior = 16, state = {0,1}, in_rest = "", out_rest = "esc_lager_guard_kill_zone", predicate = function(obj_info) return obj_info.profile_name == "esc_wolf" end } Кроме него эту работу ни кто не займет. dc Изменено 27 Октября 2014 пользователем Dennis_Chikin Сталкер - наше всё! Ссылка на комментарий
Romann 619 Опубликовано 27 Октября 2014 Поделиться Опубликовано 27 Октября 2014 Dennis_Chikin (Вчера, 21:10): Сделать арбалет на классе гранатомета. Да получилось сделать, но вот осталась проблема - обычными стрелами стреляет не "красиво", т.е. при выстреле,не далеко от цели ГГ трясёт как от взрыва гранаты...Как с этим бороться? Я посмотрел патроны- дробь, картечь - у них тоже имеется фейк эффект - а если сделать на классе дробовика? Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
AndreySol 215 Опубликовано 28 Октября 2014 Поделиться Опубликовано 28 Октября 2014 (изменено) Но сделать можно? Или оно того не стоит? Можно. Это тебе решать - если респавн в OGSE нравиться тебе больше чем в Солянке, то о чем разговор ? Насчет local t_common = system_ini():r_s32("options","t_common")- в конфиге должны быть эти самые options.smart_terrain.prot_smt_td - ссылается на соответствующий файл из ogse. то вместо чтения базового времени респавна из конфига(system_ini():r_s32("options","t_common")), можно просто сразу указать значение: local t_common = 24. smart_terrain.script есть и в чистой ТЧ, но prot_smt_td - это действительно из OGSE. Если хочешь - выложи smart_terrain.script из OGSE, глянуть что там они добавили. Изменено 28 Октября 2014 пользователем AndreySol 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти