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

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


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

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

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

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

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

[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). 

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

 

 

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

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

[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

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

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

 

 

Ну, можно извратиться с 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

Ну вот сразу:

 

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

"солянка обезжиренная диетическая", но года через 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рус

В 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): 

Сделать арбалет на классе гранатомета.

Да получилось сделать, но вот осталась проблема - обычными стрелами стреляет не "красиво", т.е. при выстреле,не далеко от цели ГГ трясёт как от взрыва гранаты...Как с этим бороться?

Я посмотрел патроны- дробь, картечь - у них тоже имеется фейк эффект - а если сделать на классе дробовика?

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

Можно. Это тебе решать - если респавн в 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 пользователей

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