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

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

sk0rpi0n

Да, ты один раз занесёшь в скриптовый файл функцию, а потом в любое время можешь вызывать её вот так - имя_файла.имя_функции(). Или, если вызов находится в этом же файле, то можно и так - this.имя_функции().

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

Можно по подробний, как ставить этот скрипт

И спавн потом чтобы был в одну или в две строки

че то типо этого - spawn_anom(anom_mine, radius, pos, get_lv, get_gv, power)

ну я 2 месяца не делал вообще моды и забыл вообще все(

Можете рассказать, как после создания этого скрипта его юзать для спавна аномалий

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

sk0rpi0n

Для начала нужно знать, что проводя различные операци над аномалиями, нужно быть осторожным. От одной аномалии проблем возникнуть не должно, а вот при спавне штук ста - проблемы будут наверняка. А теперь как спавнить.

Создаёшь файл anoms.script в scripts, копируешь туда весь код. Бежишь в нужное место снимать координаты. Подставляешь сюда название аномалии, радиус, нужные координаты и мощность соответственно:

local var = spawn_anom(anom_mine, radius, pos, get_lv, get_gv, power)

Например(координаты взяты от балды):

local var = spawn_anom("zone_mine_electric", 4, vector():set(193.31, -21.36, 316.53), 11459, 109, 1)

 

Ну и осталось только вызвать. Самый простой способ - через диалог. Думаю знаешь как. А если незнаешь, то ищешь нужную фразу в dialogs_***.xml (*** - имя уровня) и после тегов <text>...</text> пишешь <action>anoms.spawn</action>.

Надеюсь понятно объяснил.

 

sk0rpi0n

Способов вызвать при старте игры - масса. Можно и в бинд_сталкере. Но подобными вещами захламлять его не стоит.

 

Нафига тебе 2 последние функции? Лишние вызовы. Всё что надо - уже есть. Вызывать надо spawn(), и всё.

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

Как бы этот вопрос смешно не выглядел, но как сделать чтобы сначала уровня они спавнились?xD

В bind_stalker.script МБ прописать?

Кстати, если в скрипт это, то какой функцией вызывать спавн?Например через диалог.(в конце кода добавил что-то на подобе стартера спавна)

function spawn()
  local var = spawn_anom(anom_mine, radius, pos, get_lv, get_gv, power) -- 
название аномалии, радиус её действия, позиция, лв, гв, мощность
end
function
spawn_anom(anom_name,plosh,position,level_vertex_id,game_vertex_id,powers_a,tim
e_danger
os) -- последний параметр не передаём
    local obj = 
alife():create(anom_name,position,level_vertex_id,game_vertex_id)
    local pac = net_packet()
    obj:STATE_Write(pac)
    local game_vertex_id = pac:r_u16()
    local distance = pac:r_float()
    local direction = pac:r_u32()
    local level_vertex_id = pac:r_u32()
    local object_flags = pac:r_s32()
    local custom_data = pac:r_stringZ()
    local story_id = pac:r_s32()
    local spawn_story_id = pac:r_s32()
    local shape_count = pac:r_u8()
    for i=1,shape_count do
        local shape_type = pac:r_u8()
        if shape_type == 0 then
            local center = pac:r_vec3()
            local plosh = pac:r_float()
        else
            local box = pac:r_matrix()
        end
    end
    local restrikror_type = pac:r_u8()
    local powers = pac:r_float()
    local owner_id = pac:r_s32()
    local on_off_mode_enabled_time = pac:r_u32()
    local on_off_mode_disabled_time = pac:r_u32()
    local on_off_mode_shift_time = pac:r_u32()
    local offline_interactive_radius = pac:r_float()
    local artefact_spawn_places_count = pac:r_u16()
    local artefact_position_offset = pac:r_s32()
    local last_spawn_time_present = pac:r_u8()
    if pac:r_elapsed()~= 0 then 
        abort("left=%d",pac:r_elapsed())
    end
    pac:w_begin(game_vertex_id)
    pac:w_float(distance)
    pac:w_u32(direction)
    pac:w_u32(level_vertex_id)
    pac:w_u32(object_flags)
    pac:w_stringZ(custom_data)
    pac:w_s32(story_id)
    pac:w_s32(spawn_story_id)
    pac:w_u8(1)
    pac:w_u8(0)
    local sphere_center = vector()
    sphere_center:set(0,0,0)
    pac:w_vec3(sphere_center)
    pac:w_float(plosh)
    pac:w_u8(restrikror_type)
    if powers_a ~= nil then 
        powers = powers_a 
    end
    pac:w_float(powers)
    if time_dangeros == nil then 
        owner_id = bit_not(0) 
    else 
        owner_id = time_dangeros 
    end
    pac:w_u32(owner_id)
    pac:w_u32(on_off_mode_enabled_time)
    pac:w_u32(on_off_mode_disabled_time)
    pac:w_u32(on_off_mode_shift_time)
    pac:w_float(offline_interactive_radius)
    pac:w_u16(artefact_spawn_places_count)
    pac:w_u32(artefact_position_offset)
    pac:w_u8(last_spawn_time_present)
    pac:r_seek(0)
    obj:STATE_Read(pac,pac:w_tell())
return obj
end

local var = spawn_anom("zone_mine_electric", 4, vector():set(-10.034901, 
0.225154, 40.438499), 134451, 0, 1)
end

Так чтоль?)

<censored>, ошибся, тут надо второй раз писать function_spawn() или нет?

Строгое предупреждение от модератора Shader
Давай без мата с вуалью. ОК?

 

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

sk0rpi0n

Убери всё, что ты добавил после второй функции. Всё, что нужно я тебе уже дал, тебе остаётся только вызвать в нужный момент (как вызывать тоже писал). Теперь понятно?

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

Здравствуйте,я создал снайпера в тч,что ему прописать в логике,чтоб когда он увидит кого нить,не уходил,а стрелял с одного места,заранее спасибо..

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

Сталкеры!

А EditBox может распознавать русскую кирилицу?

А ввод в него русского текста?

Возможен поиск русского слова из текста по типу:

if string.find("Оружие") содержится в EditBox:GetText then

end?

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

Товарищи!

Чё то я не понял:

Мне надо проверить, есть ли в слоте с артефактами предмет...

Я так понимаю надо сделать:

local xf_table = db.actor:item_in_slot(Какой слот у артефактов?(Посмотрел,  у артов в конфигах вообще нет слота, но они ссылаются на af_base, но у него slot закомментирован, есть animation_slot))
if xf_table = "item_test"(вот как записать наличие одно предмета из таблицы(string.find? Но как?)?)

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

TREWKO, в файле system.ltx есть некоторое упоминание для всех слотов

slot_persistent_11  = false;artefact
slot_active_11      = true

Думаю слот под номером 11 , для шлемов со слотом 12 все отлично проверялось....

Что-то кончается, что-то начинается...

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

Ага, понятно, спасибо!

Вот ещё, сделал новый параметр ГГ, и хочу вывести прогресс бар на ухд.

Вот что сделал:

function progress_bar_oxy()
if DiXaresCounterOxy == 0 then
local texture_fds = "progress_bar_oxy_0"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.1 and DiXaresCounterOxy > 0.0 then
local texture_fds = "progress_bar_oxy_10"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.2 and DiXaresCounterOxy > 0.1 then
local texture_fds = "progress_bar_oxy_20"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.3 and DiXaresCounterOxy > 0.2 then
local texture_fds = "progress_bar_oxy_30"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.4 and DiXaresCounterOxy > 0.3 then
local texture_fds = "progress_bar_oxy_40"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.5 and DiXaresCounterOxy > 0.4 then
local texture_fds = "progress_bar_oxy_50"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.6 and DiXaresCounterOxy > 0.5 then
local texture_fds = "progress_bar_oxy_60"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.7 and DiXaresCounterOxy > 0.6 then
local texture_fds = "progress_bar_oxy_70"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.8 and DiXaresCounterOxy > 0.7 then
local texture_fds = "progress_bar_oxy_80"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 0.9 and DiXaresCounterOxy > 0.8 then
local texture_fds = "progress_bar_oxy_90"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
hud:RemoveCustomStatic("progress_bar_oxy_100", true)
end
if DiXaresCounterOxy < 1.0 and DiXaresCounterOxy > 0.9 then
local texture_fds = "progress_bar_oxy_100"
    local hud = get_hud()
    local cs = hud:GetCustomStatic(texture_fds)
    if cs == nil then
        hud:AddCustomStatic(texture_fds, true)
    end
hud:RemoveCustomStatic("progress_bar_oxy_10", true)
hud:RemoveCustomStatic("progress_bar_oxy_20", true)
hud:RemoveCustomStatic("progress_bar_oxy_30", true)
hud:RemoveCustomStatic("progress_bar_oxy_40", true)
hud:RemoveCustomStatic("progress_bar_oxy_50", true)
hud:RemoveCustomStatic("progress_bar_oxy_60", true)
hud:RemoveCustomStatic("progress_bar_oxy_70", true)
hud:RemoveCustomStatic("progress_bar_oxy_80", true)
hud:RemoveCustomStatic("progress_bar_oxy_90", true)
hud:RemoveCustomStatic("progress_bar_oxy_0", true)
end
end

 

 

 

Сделал виртуальную шкалу от 0.0 до 1.0.

Дак вот, при вычитании из 1.0 числа 0.1 получаю дробь большую, примерно такую: 9.9882327382

Но бар не работает.

Есть ли другой способ создания прогресс бара?

 

И вот ещё, ни как не могу прочитать лампочку:

function desfunctions_lights_1()
for i=1,65535 do
    local obj = alife():object(i)
    if obj and obj:name()=="level_prefix_lights_hanging_lamp" then
        ds = obj:get_hanging_lamp()
    ds:turn_off()
    end
end
end

Получаю вылет:

dixarxights.script:46: attempt to call method 'get_hanging_lamp' (a nil value)

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

Я скачал АИ вертолётов,хочу заспавнить бтр.

В самом файле spawn нужно подставлять координаты или создавать копию с координатами?

И как его заставить появиться,я в bind_stalker вписал вот это:

В секции function actor_binder:net_spawn(data),добавил это:

             -- БТР
               function spawn()
               spawn.btr(-86.21,-9.43,-152.87,179600,107,"test" )
        end

А вот сам файл spawn

-------------------------------------------------------------------------------------------------------------
-- Спавн вертолета. На основе АМК
--Параметры вызова: 
--позиция x,
--позиция y,
--позиция z, 
--левел вертекс, 
--гейм вертекс,
--файл логики без расширения .ltx. !!!ДОЛЖЕН находиться в config\scripts\heli!!!
-------------------------------------------------------------------------------------------------------------
function heli(section,posx,posy,posz,lvid,gvid,logic)
local obj = alife():create(section,vector():set(posx,posy,posz),lvid,gvid)
local packet = net_packet()
obj:STATE_Write(packet)

-- свойства cse_alife_object
local game_vertex_id = packet:r_u16()
local cse_alife_object__unk1_f32 = packet:r_float()
local cse_alife_object__unk2_s32 = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local cse_alife_object__unk3_s32 = packet:r_s32()

-- свойства cse_visual
local model_visual = packet:r_stringZ()
local cse_visual__unk1_u8 = packet:r_u8()
-- свойства cse_motion
local motion_name = packet:r_stringZ()

-- свойства cse_ph_skeleton
local skeleton_name = packet:r_stringZ()
local cse_ph_skeleton__unk1_u8 = packet:r_u8()
local cse_ph_skeleton__unk2_u16 = packet:r_u16()

-- свойства cse_alife_helicopter
local cse_alife_helicopter__unk1_sz = packet:r_stringZ()
local engine_sound = packet:r_stringZ()

--устанавливаем логику
custom_data = "[logic]\ncfg = scripts\\heli\\"..logic..".ltx"

-- теперь заполняем нужные параметры
-- свойства cse_alife_object
packet:w_begin(game_vertex_id)
packet:w_float(cse_alife_object__unk1_f32)
packet:w_s32(cse_alife_object__unk2_s32)
packet:w_s32(level_vertex_id)
object_flags = bit_not(5)	-- ~5 = 0xfffffffa
packet:w_s32(object_flags)
packet:w_stringZ(custom_data)
packet:w_s32(-1)
packet:w_s32(cse_alife_object__unk3_s32)

-- свойства cse_visual
packet:w_stringZ(model_visual)
packet:w_u8(cse_visual__unk1_u8)

-- свойства cse_motion
packet:w_stringZ(motion_name)		

-- свойства cse_ph_skeleton
skeleton_name = "idle"
packet:w_stringZ(skeleton_name)
packet:w_u8(cse_ph_skeleton__unk1_u8)
packet:w_u16(cse_ph_skeleton__unk2_u16)

-- свойства cse_alife_helicopter
cse_alife_helicopter__unk1_sz = "idle"
engine_sound = "alexmx\\helicopter"
packet:w_stringZ(cse_alife_helicopter__unk1_sz)
packet:w_stringZ(engine_sound)

-- считываем скорректированные параметры
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())


return obj
end

-------------------------------------------------------------------------------------------------------------
-- Спавн БТР. На основе АМК
--Параметры вызова: 
--позиция x,
--позиция y,
--позиция z, 
--левел вертекс, 
--гейм вертекс,
--файл логики без расширения .ltx. !!!ДОЛЖЕН находиться в config\scripts\btr!!!
-------------------------------------------------------------------------------------------------------------
function btr(posx,posy,posz,lvid,gvid,logic)
local obj = alife():create("btr",vector():set(posx,posy,posz),lvid,gvid)
local packet = net_packet()
obj:STATE_Write(packet)

-- свойства cse_alife_object
local game_vertex_id = packet:r_u16()
local cse_alife_object__unk1_f32 = packet:r_float()
local cse_alife_object__unk2_s32 = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local cse_alife_object__unk3_s32 = packet:r_s32()

-- свойства cse_visual
local model_visual = packet:r_stringZ()
local cse_visual__unk1_u8 = packet:r_u8()

-- свойства cse_ph_skeleton
local skeleton_name = packet:r_stringZ()
local cse_ph_skeleton__unk1_u8 = packet:r_u8()
local cse_ph_skeleton__unk2_u16 = packet:r_u16()
local health = packet:r_float()

--устанавливаем логику
custom_data = "[logic]\ncfg = scripts\\btr\\"..logic..".ltx"

-- теперь заполняем нужные параметры
-- свойства cse_alife_object
packet:w_begin(game_vertex_id)
packet:w_float(cse_alife_object__unk1_f32)
packet:w_s32(cse_alife_object__unk2_s32)
packet:w_s32(level_vertex_id)
object_flags = bit_not(5)	-- ~5 = 0xfffffffa
packet:w_s32(object_flags)
packet:w_stringZ(custom_data)
packet:w_s32(-1)
packet:w_s32(cse_alife_object__unk3_s32)

-- свойства cse_visual
packet:w_stringZ(model_visual)
packet:w_u8(cse_visual__unk1_u8)

-- свойства cse_ph_skeleton
skeleton_name = "idle"
packet:w_stringZ(skeleton_name)
packet:w_u8(cse_ph_skeleton__unk1_u8)
packet:w_u16(cse_ph_skeleton__unk2_u16)
health = 1
packet:w_float(health)

-- считываем скорректированные параметры
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())


return obj
end

function item(item,posx,posy,posz,lvid,gvid)
local obj = alife():create(item,vector():set(posx,posy,posz),lvid,gvid)
return obj
end

function inv(item,npc_id)
if npc_id == nil then
	npc_id = db.actor:id()
end
local obj = alife():create(item,vector():set(0,0,0),1,1,npc_id)
return obj
end

function heli_pair(posx,posy,posz,lvid,gvid,logic)
local heli_a = heli(posx,posy,posz,lvid,gvid,logic)
local heli_b = heli_copy(vector():set(posx+25,posy,posz),lvid,gvid,heli_a.id)
heli_target.add_heli_pair(heli_a,heli_
end

function heli_pair2(posx,posy,posz,lvid,gvid,logic)
local heli_a = heli(posx,posy,posz,lvid,gvid,logic)
local heli_b = heli(posx+25,posy,posz,lvid,gvid,"test_heli2")
heli_target.add_heli_pair(heli_a,heli_
end

function heli_copy(section,pos,lvid,gvid,id,logic)
--читаем данные из прототипа
local prototype = alife():object(id)
local packet1 = net_packet()
prototype:STATE_Write(packet1)

-- свойства cse_alife_object
local game_vertex_id1 = packet1:r_u16()
local cse_alife_object1__unk1_f32 = packet1:r_float()
local cse_alife_object1__unk2_s32 = packet1:r_s32()
local level_vertex_id1 = packet1:r_s32()
local object_flags1 = packet1:r_s32()
local custom_data1 = packet1:r_stringZ()

local obj = alife():create(section,pos,lvid,gvid)
local packet = net_packet()
obj:STATE_Write(packet)

-- свойства cse_alife_object
local game_vertex_id = packet:r_u16()
local cse_alife_object__unk1_f32 = packet:r_float()
local cse_alife_object__unk2_s32 = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local cse_alife_object__unk3_s32 = packet:r_s32()

-- свойства cse_visual
local model_visual = packet:r_stringZ()
local cse_visual__unk1_u8 = packet:r_u8()
-- свойства cse_motion
local motion_name = packet:r_stringZ()

-- свойства cse_ph_skeleton
local skeleton_name = packet:r_stringZ()
local cse_ph_skeleton__unk1_u8 = packet:r_u8()
local cse_ph_skeleton__unk2_u16 = packet:r_u16()

-- свойства cse_alife_helicopter
local cse_alife_helicopter__unk1_sz = packet:r_stringZ()
local engine_sound = packet:r_stringZ()

--устанавливаем логику
game_vertex_id = game_vertex_id1
level_vertex_id = level_vertex_id1
object_flags = object_flags1
if not logic then
	custom_data = custom_data1
else
	custom_data = "[logic]\ncfg = scripts\\heli\\"..logic..".ltx"
end

-- теперь заполняем нужные параметры
-- свойства cse_alife_object
packet:w_begin(game_vertex_id)
packet:w_float(cse_alife_object__unk1_f32)
packet:w_s32(cse_alife_object__unk2_s32)
packet:w_s32(level_vertex_id)
object_flags = bit_not(5)	-- ~5 = 0xfffffffa
packet:w_s32(object_flags)
packet:w_stringZ(custom_data)
packet:w_s32(-1)
packet:w_s32(cse_alife_object__unk3_s32)

-- свойства cse_visual
packet:w_stringZ(model_visual)
packet:w_u8(cse_visual__unk1_u8)

-- свойства cse_motion
packet:w_stringZ(motion_name)		

-- свойства cse_ph_skeleton
skeleton_name = "idle"
packet:w_stringZ(skeleton_name)
packet:w_u8(cse_ph_skeleton__unk1_u8)
packet:w_u16(cse_ph_skeleton__unk2_u16)

-- свойства cse_alife_helicopter
cse_alife_helicopter__unk1_sz = "idle"
engine_sound = "alexmx\\helicopter"
packet:w_stringZ(cse_alife_helicopter__unk1_sz)
packet:w_stringZ(engine_sound)

-- считываем скорректированные параметры
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())


return obj
end

function missile(lncpos,lvid,gvid,target,launcher,trgpos,lncdir,sundir)
--lncpos - позиция запуска,  в ней спавнится ракета. Нужна для спавна и в биндере
--lvid - левел вертекс запуска. Только для спавна
--gvid - гейм вертекс запуска. Только для спавна
--target - строка с ИД цели. Задает цель в биндере 
--launcher - строка с ИД объекта, запустившего ракету. Для оповещения цели, кто стрелял. Может отсутствовать при старте ракеты из недоступной области
--trgpos - позиция цели. 
--lncdir - направление запуска. нужно для задания траектории, особенно без launcher-а
--sundir - направление на Солнце. Считаем во время полета постоянным, чтобы не грузить комп.

--	local particle = particles_object([[explosions\group_items\expl_10_smoke00]]) -- для стандартного particles.xr
local particle = particles_object([[weapons\group_items\missile_smoke_launch]])
particle:play_at_pos(lncpos)

local obj = alife():create("missile",lncpos,lvid,gvid)
local packet = net_packet()
obj:STATE_Write(packet)

-- свойства cse_alife_object
local game_vertex_id = packet:r_u16()
local cse_alife_object__unk1_f32 = packet:r_float()
local cse_alife_object__unk2_s32 = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local cse_alife_object__unk3_s32 = packet:r_s32()

-- свойства cse_visual
local model_visual = packet:r_stringZ()
local cse_visual__unk1_u8 = packet:r_u8()
-- свойства cse_motion
local motion_name = packet:r_stringZ()

-- свойства cse_ph_skeleton
local skeleton_name = packet:r_stringZ()
local cse_ph_skeleton__unk1_u8 = packet:r_u8()
local cse_ph_skeleton__unk2_u16 = packet:r_u16()

-- свойства cse_alife_helicopter
local cse_alife_helicopter__unk1_sz = packet:r_stringZ()
local engine_sound = packet:r_stringZ()

--устанавливаем логику
--if launcher == nil then launcher = 0 end
custom_data =   "[logic]\ntarget = "..tostring(target)..

				"\ntrgposx = "..tostring(trgpos.x)..
				"\ntrgposy = "..tostring(trgpos.y)..
				"\ntrgposz = "..tostring(trgpos.z)..

				"\nlauncher = "..tostring(launcher)..

				"\nlncposx = "..tostring(lncpos.x)..
				"\nlncposy = "..tostring(lncpos.y)..
				"\nlncposz = "..tostring(lncpos.z)..

				"\nlncdirx = "..tostring(lncdir.x)..
				"\nlncdiry = "..tostring(lncdir.y)..
				"\nlncdirz = "..tostring(lncdir.z)..

				"\nsundirx = "..tostring(sundir.x)..
				"\nsundiry = "..tostring(sundir.y)..
				"\nsundirz = "..tostring(sundir.z)..

				"\nactive = heli_move@missile"..
				"\n[heli_move@missile]"..
				"\npath_move = missile_path"

-- теперь заполняем нужные параметры
-- свойства cse_alife_object
packet:w_begin(game_vertex_id)
packet:w_float(cse_alife_object__unk1_f32)
packet:w_s32(cse_alife_object__unk2_s32)
packet:w_s32(level_vertex_id)
object_flags = bit_not(5)	-- ~5 = 0xfffffffa
packet:w_s32(object_flags)
packet:w_stringZ(custom_data)
packet:w_s32(-1)
packet:w_s32(cse_alife_object__unk3_s32)

-- свойства cse_visual
packet:w_stringZ(model_visual)
packet:w_u8(cse_visual__unk1_u8)

-- свойства cse_motion
packet:w_stringZ(motion_name)		

-- свойства cse_ph_skeleton
skeleton_name = "idle"
packet:w_stringZ(skeleton_name)
packet:w_u8(cse_ph_skeleton__unk1_u8)
packet:w_u16(cse_ph_skeleton__unk2_u16)

-- свойства cse_alife_helicopter
cse_alife_helicopter__unk1_sz = "idle"
engine_sound = "weapons\\rocket_fly"
packet:w_stringZ(cse_alife_helicopter__unk1_sz)
packet:w_stringZ(engine_sound)

-- считываем скорректированные параметры
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())


return obj
end

Подскажите пожалуйста,что делать...Заренее спасибо.

 

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

stalker19965

Убери функцию в нет_спавне, оставь только вызов (т.к. сама она вызываться не будет).

 

function actor_binder:net_spawn(data)
...
  spawn.btr(-86.21,-9.43,-152.87,179600,107,"test" )
...

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

Строгое предупреждение от модератора Halford
Цитирования правил не забываем. ;)

Убрал,получилось вот что:

function init    (obj)
xr_motivator.AddToMotivator(obj)
end

function actor_init    (npc)
npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
[0] = "gd_novice",
[1] = "gd_stalker",
[2] = "gd_veteran",
[3] = "gd_master"
}

lasthealth  = 0
lasttime	= 0
post_process = 0
local weapon_hide = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
self.bCheckStart = false
self.weather_manager = level_weathers.WeatherManager()
self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)
printf("actor net spawn")		

level.show_indicators()

self.bCheckStart = true
self.weapon_hide = false -- спрятано или нет оружие при разговоре.
weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

if object_binder.net_spawn(self,data) == false then
	return false
end

db.add_actor(self.object)

if self.st.disable_input_time == nil then
	level.enable_input()
end

self.weather_manager:reset()
--	game_stats.initialize ()

if(actor_stats.add_to_ranking~=nil)then
	actor_stats.add_to_ranking(self.object:id())
end

if xr_logic.pstor_retrieve(db.actor, "first_run", 0)==0 then 
	-- тест ПЗРК
	spawn.inv("wpn_igla")
	for i = 1,3 do
		-- СЛИШКОМ тяжело, но можно сбросить у Сидоровича, жрать не просит. Больше взять негде.
		spawn.inv("ammo_igla")
	end

	-- Вертушки на кордоне
	spawn.heli("mi24",-356.30456542969,15.556171417236,231.61962890625,613,66,"esc_railroad_patrol" )
               xr_logic.pstor_store(db.actor, "first_run", 1) 
end 


              spawn.btr(-86.21,-9.43,-152.87,179600,107,"test_btr" )
       end

--' Загружаем настройки дропа
death_manager.init_drop_settings()
       new_stalkers.spawn_pochti_vsex_mudil()
return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
if(actor_stats.remove_from_ranking~=nil)then
	actor_stats.remove_from_ranking(self.object:id())
end
--	game_stats.shutdown ()
db.del_actor(self.object)

   sr_light.clean_up ()

self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
--self.object:set_callback(callback.actor_sleep, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)

if sr_psy_antenna.psy_antenna then
	sr_psy_antenna.psy_antenna:destroy()
	sr_psy_antenna.psy_antenna = false
end

xr_sound.stop_all_sound_object()

object_binder.net_destroy(self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
object_binder.reinit(self)

local npc_id = self.object:id()

db.storage[npc_id] = { }

self.st = db.storage[npc_id]
self.st.pstor = nil

self.next_restrictors_update_time = -10000

self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.article_info, self.article_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)
self.object:set_callback(callback.task_state, self.task_callback, self)
--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)
self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)
self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
local story_id = box:story_id()
if story_id == nil then
	return
end

treasure_manager.take_item_from_box(box, story_id)
--[[	
local respawner = se_respawn.get_respawner_by_parent(story_id)
if respawner == nil then
	return
end

--' Необходимо уменьшить счетчик в респавнере
respawner:remove_spawned(item:id())

local smart_terrain = db.strn_by_respawn[respawner:name()]
if smart_terrain == nil then
	return
end

local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
   if npc ~= nil then
    xr_sound.set_sound_play(npc, "reac_box")
    xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)		
   end
]]
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет
level_tasks.proceed(self.object)
-- Отметки на карте
level_tasks.process_info_portion(info_id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
   if sell_bye == true then
      game_stats.money_trade_update (money)
   else       
      game_stats.money_trade_update (-money) 
   end   
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name)
--printf("article_callback [%s][%s]", group, name)
if device().precache_frame >1 then return end

if group == "Diary" then
	news_manager.send_encyclopedy("diary", group)
else
	news_manager.send_encyclopedy("encyclopedy", group)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
   level_tasks.proceed(self.object)
   --game_stats.update_take_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
   level_tasks.proceed(self.object)
   --game_stats.update_drop_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------

function actor_binder:task_callback(_task, _objective, _state)
task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
if _objective:get_idx() == 0 then
	if _state == task.fail then
		news_manager.send_task(db.actor, "fail", _task, _objective)
	elseif _state == task.completed then
		task_manager.reward_by_task(_task)
		news_manager.send_task(db.actor, "complete", _task, _objective)
	else
		news_manager.send_task(db.actor, "new", _task, _objective)
	end
else
	if _task:get_objective(0):get_state() == task.in_progress then
		news_manager.send_task(db.actor, "update", _task, _objective)
	end
end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
if (false==app_ready()) or (device().precache_frame>1) then return end
--'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
object_binder.update(self, delta)

-- DEBUG slowdown
--	slowdown.update()

local time = time_global()

game_stats.update (delta, self.object)

       pzrk.update()

-- апдейт погоды
self.weather_manager:update()

-- апдейт схемы детектора
self.actor_detector:update()

-- апдейт звуковой схемы актера
xr_sound.update_actor()

--' Проверка потери жизни
--[[
if self.object.health - lasthealth > 0.001 or
   self.object.health - lasthealth < -0.001 then
	printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
	lasthealth = self.object.health
	lasttime = game.time()

    end
]]	
-- Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time ~= nil and
   game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle 
then
	level.enable_input()
	self.st.disable_input_time = nil
end
-- Обновление сна с переносом чувака в указанную позицию
if self.st.sleep_relocate_time ~= nil and
   game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle 
then
	self.object:set_actor_position(self.st.sleep_relocate_point)
	local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
	self.object:set_actor_direction(dir:getH())
	self.st.sleep_relocate_time = nil
end

-- Апдейт прятание оружия игрока во время диалога
if weapon_hide == true or self.object:is_talking() then
	if self.weapon_hide == false then
		self.object:hide_weapon()
		self.weapon_hide = true
	end
else
	if self.weapon_hide == true then
		self.object:restore_weapon()
		self.weapon_hide = false
	end
end	

-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
if self.next_restrictors_update_time < time then
	bind_restrictor.actor_update(delta)

	self.next_restrictors_update_time = time + 200

	task_manager.actor_update()
end

-- обновление постпроцессов
if post_process ~= 0 then
	if post_process:update () == true then
	   post_process = 0
	end
end

-- обновление пси-антенны
if sr_psy_antenna.psy_antenna then
	sr_psy_antenna.psy_antenna:update(delta)
end

--' Вывод сообщения о большой радиации
if self.object.radiation >= 0.7 then
	local hud = get_hud()
	local custom_static = hud:GetCustomStatic("cs_radiation_danger")
	if custom_static == nil then
		hud:AddCustomStatic("cs_radiation_danger", true)
		hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
	end
else
	local hud = get_hud()
	local custom_static = hud:GetCustomStatic("cs_radiation_danger")
	if custom_static ~= nil then
		hud:RemoveCustomStatic("cs_radiation_danger")
	end
end



	if self.bCheckStart then
	printf("SET DEFAULT INFOS")		

	if not has_alife_info("storyline_actor_start") and
	   (level.name() == "l01_escape")
	then
		self.object:give_info_portion("storyline_actor_start")
		_G.g_start_avi = true
		printf("*AVI* RUN START AVI")			
	end

--		if not has_alife_info("encyclopedy") then
--			self.object:give_info_portion("encyclopedy")
--		end

	if not has_alife_info("global_dialogs") then
		self.object:give_info_portion("global_dialogs")
	end

	if not has_alife_info("level_changer_icons") then
		self.object:give_info_portion("level_changer_icons")
	end

	level_tasks.add_lchanger_location()

	self.bCheckStart = false		
end

if sniper_add.load_variable("spawn_sniper",false)==false then
sniper_add.start_add_spawn()
sniper_add.save_variable("spawn_sniper",true)
end


end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)

local save_treasure_manager = true

printf("actor_binder:save(): self.object:name()='%s'", self.object:name())
object_binder.save(self, packet)

--' Сохраняем уровень сложности
if save_treasure_manager == true then
	packet:w_u8(level.get_game_difficulty() + 128)
else
	packet:w_u8(level.get_game_difficulty())
end


--' Сохраняем данные об отключенном вводе
if self.st.disable_input_time == nil then
	packet:w_bool(false)
else
	packer:w_bool(true)
	utils.w_CTime(packet, self.st.disable_input_time)
end

xr_logic.pstor_save_all(self.object, packet)
self.weather_manager:save(packet)

sr_psy_antenna.save( packet )

if save_treasure_manager == true then
	treasure_manager.save(packet)      
end                                  

task_manager.save(packet)
self.actor_detector:save(packet)	
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
printf("actor_binder:load(): self.object:name()='%s'", self.object:name())
object_binder.load(self, reader)
printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

--' Загружаем уровень сложности
local game_difficulty = reader:r_u8()

local load_treasure_manager = false      
if game_difficulty >= 128 then           
	game_difficulty = game_difficulty - 128
	load_treasure_manager = true           
end                                      


get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

if reader:r_eof() then
	abort("SAVE FILE IS CORRUPT")
end

local stored_input_time = reader:r_u8()
if stored_input_time == true then
	self.st.disable_input_time = utils.r_CTime(reader)
end

xr_logic.pstor_load_all(self.object, reader)
self.weather_manager:load(reader)

sr_psy_antenna.load(reader)

if load_treasure_manager == true then
	treasure_manager.load(reader)      
end                                  


task_manager.load(reader)
self.actor_detector:load(reader)	
end
----------------------------------------------------------------------------------------------------------------------

--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
--	sound_prefetch.prefetch_sounds()
--end


-- Weapon functions
function hide_weapon()
weapon_hide = true
end
function restore_weapon()
weapon_hide = false
end

// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
printf			("file    : %s",file_name)
printf			("section : %s",section_name)

local			file = ini_file(file_name)
local			n = file:line_count(section_name)
printf			("lines   : %d",n)

local			id, value = "", "", result
for i=0,n-1 do
	result, id, value	= file:r_line(section_name,i,"","")
	printf		("line %d : %s = %s",i,id,value)
end
end

test_section_iteration("system.ltx","space_restrictor")
/**/

 

 

Но вылетает((

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ....r. - shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

В чём ошибка то,какие файлы нужны для этого бтра,у бтр какой файл-конфиг?

p.s Делаю на чистой игре.

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

TREWKO, меня этот метод немного раздражает

method 'get_hanging_lamp'

возможно не метод, а параметр ?

т.е

ds = obj.get_hanging_lamp

 

У меня такое было с id , похоже что метод пока не может быть применен, попробуй параметром.

Или может метода такого нет?

Что-то кончается, что-то начинается...

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

Vano_Santuri,

Это однозначно метод. Возвращает ссылку на объект типа hanging_lamp, если это конечно hanging_lamp. Применим только к лампочкам. В справочнике я его упоминал в связи с описанием системы регистрации классов.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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

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

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

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

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

Войти

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

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

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