Перейти к контенту

[SoC] Ковыряемся в файлах


Рекомендуемые сообщения

Всем привет.
Подскажите, в ТЧ вообще работает метод spawn_artefact() для аномалий? Применял к серверному объекту аномалии: ни вылета, ни какого-либо результата...

Скорее не работает, чем работает. dc

Изменено пользователем Dennis_Chikin

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Прошу помощи. На Агро Крот уходит в оффлайн по выдаче определенного поршня. Я условие закомментировал, теперь он постоянно в онлайне. Но мне хочется, чтобы он уходил на Свалку. Вот секция логики:

[walker@well3]


path_walk = agr_krot_well_walk
path_look = agr_krot_well_look
meet = meet@well2
on_info = {!actor_enemy +agr_find_gunslinger_cache_found} walker@well4
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

[walker@well4]
path_walk = gar_krot_well_walk
path_look = gar_krot_well_look
meet = meet@well2
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

 

Но проблема в том, что он не хочет идти на Свалку, а прется севернее фабрики на Агро и там остается. Хотя координаты указаны правильные. Но если указать какую-нибудь точку на Агро - он туда идет без проблем. Почему так?

Сталкер - наше всё!

Ссылка на комментарий

Всем привет! Есть вопросец. Можно ли как то увеличить шанс выпадения случайных тайников (амк опции)?

treasure_manager.script - там в комментариях все есть. dc

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Вопрос: если в секции НПС указан смарт

[smart_terrain]

none = true

 

можно ли его приписать к какому-нибудь другому смарту при выдаче инфорпоршня?

Сталкер - наше всё!

Ссылка на комментарий

Решил немного побаловаться с конфигами оружия, решил сделать СВД автоматической, нашёл в гугле что за это отвечает строка "fire_modes =",

Поставил значения "-1, 1", сохранил конфиг, захожу в игру, и понимаю что ничего не изменилось, скажите, в чём проблема? почему при изменении конфига не изменяется режим огня?)

 

Класс не тот. И тип, кстати, тоже. dc

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

 

 

он не хочет идти на Свалку, а прется севернее фабрики на Агро и там остается

Возможно, что НПС не могут переходить через этот переход?

  • Не согласен 1
Ссылка на комментарий

AndrewMor Когда даешь логику давай ее полностью а не куском.

Чтобы НПС перешел с локи на локу нужно ему указать два гулага, как у Волка(ТЧ) это сделано.

Или удалять его и спавнить на нужной тебе локации, или еще как... но так как ты делаешь не прокатит.

если в секции НПС указан смарт...

А почему сам не попробуешь сделать примерно так:

[smart_terrains]
esc_lager = {+инфо} ; или куда там тебе его...
none = true

Если нет, то сделай еще один смарт для своего сталка, и все (потом переключишь при надобности).

 

Вспышка Ну что, попробовал? Редкий?)

Изменено пользователем amik

Мой архив

Сталкером не занимаюсь.

Ссылка на комментарий
Вспышка Ну что. попробовал? Редкий?)

Андрей, пользуюсь тем что Хемуль предложил! В дороботке lsclon. Хороший скрипт с выводом инфы в лог и т.п..

Мне нравится, играю на редком (скрипт lsclon). 

Изменено пользователем Вспышка

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

%DF%20-%20%C2%F1%EF%FB%F8%EA%E0%20%21.gi

 

Ссылка на комментарий

 

 

А почему сам не попробуешь сделать примерно так:

То есть, если сделать так:

[smart_terrains]

none = {-agr_find_gunslinger_cache_found}

gar_angar = {+agr_find_gunslinger_cache_found}

 

то искомый перс пойдет в другой гулаг? А как мне его на конкретную точку посадить?

Сталкер - наше всё!

Ссылка на комментарий

Люди, ну читайте вы внимательно, святого Слонопотама ради !

В смарте есть гулаг. У гулага есть конфиг. В конфиге есть работы. У работы есть путь. Вот в первую точку этого пути непись и бежит.

В офлайне в том числе. Собственно, именно так он и между локациями перемещается. Если переходы прописаны. Но это уже в маппинг.

Изменено пользователем Dennis_Chikin
  • Согласен 1
Ссылка на комментарий

Кстати, скрипт из 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

А файлом куда-нибудь положить ?

Что имеешь ввиду? :nono:

 

dropbox, ЯД и иже с ними. Да хоть на ргхост. Ну вот как это сравнивать в таком виде ?

Изменено пользователем 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

%DF%20-%20%C2%F1%EF%FB%F8%EA%E0%20%21.gi

 

Ссылка на комментарий

В смарте есть гулаг. У гулага есть конфиг. В конфиге есть работы. У работы есть путь. Вот в первую точку этого пути непись и бежит.

В том-то и дело, что мне не хочется его под смарт пихать. Хотелось его с одной локи на другую по поршню пересадить.

 

 

Ну, можно извратиться с CALifeSmartTerrainTask() - писал уже. Но это - dirty hack.

Причем логику придется прописывать нетривиально, а все переключения всего делать отдельным скриптом. dc

Изменено пользователем Dennis_Chikin

Сталкер - наше всё!

Ссылка на комментарий

Тогда пояните, кто-нибудь (если вопросы нубские - сильно не бейте):

1. есть смарт, есть гулаг и в нем свободная работа. Если к этому смарту ни один НПС не приписан - работа будет свободна, или другой НПС на нее придет?

 

Идея такая: заспавнить смарт-террейн, в гулаге прописать одного волкера, а в секции [smart_terrains] написать:

[smart_terrains]

none = {-agr_find_gunslinger_cache_found}

gar_angar = {+agr_find_gunslinger_cache_found}

 

Так вот этот перс до выдачи поршня будет под СВОЕЙ логикой, прописанной в конфиге, а по выдаче поршня пойдет на работу в указанный гулаг, или нет? Или на эту работу придет любой другой НПС?

 

В gar_angar для работы, зарезервированной под непися, прописать предикат. dc

Изменено пользователем Dennis_Chikin

Сталкер - наше всё!

Ссылка на комментарий

 

 

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

%DF%20-%20%C2%F1%EF%FB%F8%EA%E0%20%21.gi

 

Ссылка на комментарий

Ну вот сразу:

 

local t_common = system_ini():r_s32("options","t_common")

- в конфиге должны быть эти самые options.

 

smart_terrain.prot_smt_td - ссылается на соответствующий файл из ogse.

 

с соляночным amk.script несовместимо.

Ссылка на комментарий

с соляночным amk.script несовместимо.

Но сделать можно? Или оно того не стоит?

 

Принципиальной разницы нет. Для соли там свои фишки, для ogse - свои. В OGSE есть одна существенная  правка, и несколько "скоростных". Но жить можно и без этого. То, что реально имеет смысл перелопачивать - потянет за собой другие скрипты, и в итоге будет та же "солянка обезжиренная диетическая", но года через 3. dc

Изменено пользователем 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

%DF%20-%20%C2%F1%EF%FB%F8%EA%E0%20%21.gi

 

Ссылка на комментарий

"солянка обезжиренная диетическая", но года через 3.

Ден, скажи по честному, ты пошутил?  :blink:Будь проклят тот день...... :big_boss:

Пускай кто-то другой адаптирует/пишет/проигрывает эти скрипты, я ПАС!!!!

 

 

для сравнения:

https://dl.dropboxusercontent.com/u/27871782/se_respawn.script

плюс к нему https://dl.dropboxusercontent.com/u/27871782/xl_offline.script+ news_main + десяток вынесенный таблиц + всякого по-мелочи. Это если чтобы был смысл реально переделывать. dc

Изменено пользователем Хемуль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

%DF%20-%20%C2%F1%EF%FB%F8%EA%E0%20%21.gi

 

Ссылка на комментарий

В 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

Изменено пользователем Dennis_Chikin

Сталкер - наше всё!

Ссылка на комментарий

 

 

moderator_global_small.png 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.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий
Но сделать можно? Или оно того не стоит?

Можно. Это тебе решать - если респавн в 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, глянуть что там они добавили.

 

Изменено пользователем AndreySol
  • Не согласен 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...