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

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

stalker.odinochka

Во скрипт для спавна аномалий:

singapur22 вроде скрипт написал:

function create_anom(name_anom, posit_anom, lvid_anom, gvid_anom, radius_anom, power_anom)
local obj = alife():create(name_anom, posit_anom, lvid_anom, gvid_anom)

-----------------------write----------------------
local packet = net_packet()
obj:STATE_Write(packet)

-------------------------load---------------------
-- cse_alife_object
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_u32()
local level_vertex_id = packet:r_u32()
local object_flags = packet:r_u32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_u32()
local spawn_story_id = packet:r_u32()

-- cse_shape
local shape_count = packet:r_u8()
for i=1,shape_count do
local shape_type = packet:r_u8()
if shape_type == 0 then
-- sphere
local center = packet:r_vec3()
local radius = packet:r_float()
else
-- box
local box = packet:r_matrix()
end
end

-- cse_alife_space_restrictor
local restrictor_type = packet:r_u8()

-- cse_alife_custom_zone
local max_power = packet:r_float()
local owner_id = packet:r_u32()
local enabled_time = packet:r_u32()
local disabled_time = packet:r_u32()
local start_time_shift = packet:r_u32()

-- cse_alife_anomalous_zone
local offline_interactive_radius = packet:r_float()
local artefact_spawn_count = packet:r_u16()
local artefact_position_offset = packet:r_u32()

-- se_zone_anom
local last_spawn_time_present = packet:r_u8()

if (string.find (name_anom, 'zone_zharka_static') ~= nil
or string.find (name_anom, 'zone_witches_galantine') ~= nil
or string.find (name_anom, 'zone_mosquito_bald') ~= nil
or string.find (name_anom, 'zone_mincer') ~= nil
or string.find (name_anom, 'zone_gravi_zone') ~= nil
or string.find (name_anom, 'zone_buzz') ~= nil )
and packet:r_elapsed() ~= 0 then
abort("left=%d", left)
end

---------------------------save--------------------
-- cse_alife_object
packet:w_begin(game_vertex_id)
packet:w_float(distance)
packet:w_u32(direct_control)
packet:w_u32(level_vertex_id)
object_flags = bit_not(193)
packet:w_u32(object_flags)
packet:w_stringZ(custom_data)
packet:w_u32(story_id)
packet:w_u32(spawn_story_id)

-- cse_shape
packet:w_u8(1) -- количество фигур
packet:w_u8(0) -- тип фигуры: сфера
packet:w_vec3(vector():set(0, 0, 0))
if radius_anom ~= nil then
packet:w_float(radius_anom)
else
packet:w_float(1.0)
end

-- cse_alife_space_restrictor
packet:w_u8(restrictor_type)

-- cse_alife_custom_zone
if power_anom ~= nil then
packet:w_float(power_anom)
else
packet:w_float(max_power)
end
packet:w_u32(owner_id)
packet:w_u32(enabled_time)
packet:w_u32(disabled_time)
packet:w_u32(start_time_shift)

-- cse_alife_anomalous_zone
packet:w_float(offline_interactive_radius)
packet:w_u16(artefact_spawn_count)
packet:w_u32(artefact_position_offset)

-- se_zone_anom
packet:w_u8(last_spawn_time_present)

------------------------read---------------------------
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())

end

 

Спавн аномалии производится из любой функции, таким образом:

 

_new_create.create_anom('name', pos, lv, gv, radius, power)

 

Где:

 

'name' --имя(тип) аномалии (в кавычках)

pos --позиция спавна аномалии vector():set(x,y,z)

lv --левел вертекс позиции спавна

gv --гейм вертекс позиции спавна

radius --радиус аномальной зоны (в метрах)

power --сила действия аномалии (1.0 равняется силе, прописаной в конфиге типа аномалии)

 

-----------------------------------------------------------------

Кстати. Имя аномалии ОБЯЗЯТЕЛЬНО должно быть из базовой секции конфига аномалии. Типа для электры -"zone_witches_galantine", для грави -"zone_gravi_zone", и т.д.

Так как другие секции приводят к вылету, во время спавна артефакта.

 

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

А через алл спавн аномалии уже не спавняться?

В теме ковыряемся в файлах зп на ..... 60-80странице есть секция из алл спавна.

Ой ты наверное с алл спавном работать не умеешь?! есть программа асдс ЗП, кладешь к ней алл спавн, запускаешь батник, находишь алайф локи, вставляешь туда секцию. ставишь ид своей аномалии, собираешь алл спавн. просто как песочные часы.

TREWKO и написан икс рей на си++.ФАКТ и никаких луа.

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

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

alexwew, повежливее. Не все здесь такие "мозговитые" как ты.

ЗЫ: Алл.спаун - зло. Скрипты спасут мир.

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

alexwew,

А через алл спавн аномалии уже не спавняться?

Динамические аномалии так не сделать.

 

 

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

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

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

 

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

alexwew, спавнятся, умею.

Но из-за пары аномалий увеличивать мод на 40 мб,

лишать его возможности работать на других патчах неочень то хочется..

 

Я люблю скрипты, поэтому ищю подходящий.

 

ЗЫ: Алл.спаун - зло. Скрипты спасут мир

:grin2:

Срочно ищу опытного скриптёра и модельера, нужна помощь в создании мода.

Готовность мода Новый мир 85%.

Мод Огнемёт для ЗП v1.0 Скачать

 

 

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

TREWKO шарп тут рядм и не стоял. си, с++,си# три разных языка, но похожих и с одинаковой основой

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

Можно ли заспаунить скелет скриптом (типа как как на милитари в вагончике около отца Диодора)? И как называется его модель и где она лежит?

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

Модель поиши в сдк чн в разделе боди. она в обжект, конверти ее в огф, создай айтемс с огф этой модели и спавни!

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

Stalk15, если тип фигуры матрица, то запись будет крива, и скорее всего будет вылет.. Так как не пишется матрица.

Хотя читается правильно.

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

Как сделать персональный Пда как в Sigerous Моде, скачать я не могу трафик не позволяет, но видел скриншоты этого ПДА, Не подскажите как такое в ТЧ сделать?

87728-stalker.gif
Ссылка на комментарий

В сталкере ПДА движковый(зашит в движок)

В сигерусе ПДА скриптовый. Учи луа. А легче попросить кого-нибудь чтоб тебе из сигеруса скинули его.

 

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

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

ФеНиКс, в Сигероус моде реализован КПК на скриптах.

Судя по твоим знаниям lua, сделаешь без проблем.

Сначала сходи на базу сталкерина, статью посмотри про: "Назначение скриптам горячих кнопок. Часть 2. Интерфейс".

Познавательная статья, потом сделав интерфейс, повесь его на предмет(не составит труда), и через калбэк использования предметов отлавливай.

 

Если надо сделать скрипт вывода окна через предмет - пиши в лс, сделаю.

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

stalker.odinochka,

ЗЫ: Алл.спаун - зло. Скрипты спасут мир

Полная туфта.

 

Архара.

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

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

Архара,

внесу свои пять копеек в холивар. Лично мне всегда были интересны подходы, которые позволяли дополнять игру без потери совместимости со старыми сохранениями. Скриптовый путь здесь более удобен. Хотя на самом деле дополнять можно почти что угодно и, при соблюдении определённых ограничений, совместимость с сохранёнками не потеряется: all.spawn, новые локации, новые объекты, визуалы и пр. - всё можно добавлять.

Только представьте себе мод, который расширяется эволюционно. Добавили новую локацию, появилась новость "открыты проходы туда-то". Со старой сохранёнкой бежишь исследовать новые локации. Другое дело, что на практике эта идея загнётся на первом же баге, правка которого убьёт совместимость и лишит всю затею смысла.

 

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

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

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

 

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

Здравствуйте! Возник такой вопрос: вот я сделал свое окно, для ремонта, активируется при разговоре с Сидоровичем, и там кнопки, 1слот 2 слот и броня, и вот как сделать чтоб при нажатии на одну из кнопок появлялась иконка выбранного оружия или брони? Как прописать такую команду, скрипт?

Или если так не получиться то как можно в это новое окно вывести весь инвентарь?

 

Добавлено через 5 мин.:

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

 

Добавлено через 50 мин.:

У меня получилось сделать вывод, но через ж... путем условий и появления кнопок при выполнении этого условия, но как сделать по более так сказать приличней, мож есть такой метод ... или там еще ченить?

Строгое предупреждение от модератора n6260
За завуалируваную ругать следующий раз будет "адекватное наказание". Это я про твое "ж...".
Ссылка на комментарий
Byurrer, тебе никто не будет давать готовый код,если он есть.Смотри луа_хелп и пиши сам.
Не бойтесь совершенства. Вам его не достичь.
C. Дали
Ссылка на комментарий

Извините тупанул ... условия срабатывают и иконка появляется, но возможно ли както подругому, более проще вывести иконку?

--в таком виде строяться апгрейды, но устанавливать с первого раза можно любой!!!

--mag_list_prugina_tormoz

 

 

function hud()

level.start_stop_menu(hud_ui(get_hud()), true)

end

 

-----------------------------------------

class "hud_ui" (CUIScriptWnd)

 

function hud_ui:__init(owner) super()

self.owner = owner

self:InitControls()

self:InitCallBacks()

end

 

function hud_ui:__finalize()

end

 

-----------------------------------------

-----------------------------------------

-----------------------------------------

function hud_ui:InitControls()

self:Init(0,0,1024,768)

local hud = CScriptXmlInit()

hud:ParseFile("upgrade.xml")

hud:InitStatic("background", self)

self:Register(hud:Init3tButton("slot_1", self),"slot_1")

self:Register(hud:Init3tButton("slot_2", self),"slot_2")

self:Register(hud:Init3tButton("slot_3", self),"slot_3")

 

self:Register(hud:Init3tButton("mag_1", self),"mag_1")

self:Register(hud:Init3tButton("mag_2", self),"mag_2")

self:Register(hud:Init3tButton("mag_3", self),"mag_3")

 

self:Register(hud:Init3tButton("list_1", self),"list_1")

self:Register(hud:Init3tButton("list_2", self),"list_2")

self:Register(hud:Init3tButton("list_3", self),"list_3")

 

self:Register(hud:Init3tButton("prugina_1", self),"prugina_1")

self:Register(hud:Init3tButton("prugina_2", self),"prugina_2")

self:Register(hud:Init3tButton("prugina_3", self),"prugina_3")

 

self:Register(hud:Init3tButton("tormoz_1", self),"tormoz_1")

self:Register(hud:Init3tButton("tormoz_2", self),"tormoz_2")

self:Register(hud:Init3tButton("tormoz_3", self),"tormoz_3")

self:Register(hud:Init3tButton("quits", self),"quits")

end

 

 

function hud_ui:InitCallBacks()

self:AddCallback("slot_1", ui_events.BUTTON_CLICKED, self.slot_1, self)

self:AddCallback("slot_2", ui_events.BUTTON_CLICKED, self.slot_2, self)

--self:AddCallback("slot_3", ui_events.BUTTON_CLICKED, self.slot_3, self)

self:AddCallback("quits", ui_events.BUTTON_CLICKED, self.quits, self)

end

 

 

function hud_ui:slot_1()

level.start_stop_menu(hud_slot_1(get_hud()), true)

self:quits()

end

 

function hud_ui:slot_2()

level.start_stop_menu(hud_slot_2(get_hud()), true)

self:quits()

end

 

--[[function hud_ui:slot_3()

level.start_stop_menu(hud_slot_3(get_hud()), true)

self:quits()

end]]

 

function hud_ui:quits()

self:GetHolder():start_stop_menu(self,true)

end

 

 

 

--Окно

--для

--апгрейда

--оружия в

--1 слоте

-----------------------------------------

class "hud_slot_1" (CUIScriptWnd)

 

function hud_slot_1:__init(owner) super()

self.owner = owner

self:S1Controls()

self:S1CallBacks()

end

 

function hud_ui:__finalize()

end

 

-----------------------------------------

function hud_slot_1:S1Controls()

self:Init(0,0,1024,768)

local hud = CScriptXmlInit()

hud:ParseFile("upgrade.xml")

hud:InitStatic("background", self)

self:Register(hud:Init3tButton("slot_1", self),"slot_1")

self:Register(hud:Init3tButton("slot_2", self),"slot_2")

self:Register(hud:Init3tButton("slot_3", self),"slot_3")

 

 

self:Register(hud:Init3tButton("mag_1", self),"mag_1")

self:Register(hud:Init3tButton("mag_2", self),"mag_2")

self:Register(hud:Init3tButton("mag_3", self),"mag_3")

 

 

self:Register(hud:Init3tButton("list_1", self),"list_1")

self:Register(hud:Init3tButton("list_2", self),"list_2")

self:Register(hud:Init3tButton("list_3", self),"list_3")

 

 

self:Register(hud:Init3tButton("prugina_1", self),"prugina_1")

self:Register(hud:Init3tButton("prugina_2", self),"prugina_2")

self:Register(hud:Init3tButton("prugina_3", self),"prugina_3")

self:Register(hud:Init3tButton("quits", self),"quits")

 

------------------------------------------------------------------------

local weapon = db.actor:item_in_slot(1)

if weapon ~= nil then

local wpn = weapon:section()

 

------------------------------------------------------------------------

if

string.sub(wpn,1,7) == "wpn_pm_" then

self:Register(hud:Init3tButton("pm_",self),"pm_")

 

elseif

string.sub(wpn,1,7) == "wpn_pb_" then

self:Register(hud:Init3tButton("pb_",self),"pb_")

 

elseif

string.sub(wpn,1,12) == "wpn_beretta_" then

self:Register(hud:Init3tButton("beretta_",self),"beretta_")

 

elseif

string.sub(wpn,1,13) == "wpn_colt1911_" then

self:Register(hud:Init3tButton("colt1911_",self),"colt1911_")

 

 

elseif

string.sub(wpn,1,17) == "wpn_desert_eagle_" then

self:Register(hud:Init3tButton("desert_eagle_",self),"desert_eagle_")

 

 

elseif

string.sub(wpn,1,9) == "wpn_fort_" then

self:Register(hud:Init3tButton("fort_",self),"fort_")

 

 

elseif

string.sub(wpn,1,9) == "wpn_hpsa_" then

self:Register(hud:Init3tButton("hpsa_",self),"hpsa_")

 

 

elseif

string.sub(wpn,1,11) == "wpn_sig220_" then

self:Register(hud:Init3tButton("sig220_",self),"sig220_")

 

elseif

string.sub(wpn,1,12) == "wpn_walther_" then

self:Register(hud:Init3tButton("walther_",self),"walther_")

------------------------------------------------------------

else return end

else return end

end

 

 

function hud_slot_1:S1CallBacks()

self:AddCallback("slot_1", ui_events.BUTTON_CLICKED, self.slot_1, self)

self:AddCallback("slot_2", ui_events.BUTTON_CLICKED, self.slot_2, self)

--self:AddCallback("slot_3", ui_events.BUTTON_CLICKED, self.slot_3, self)

self:AddCallback("quits", ui_events.BUTTON_CLICKED, self.quits, self)

 

end

 

function hud_slot_1:slot_1()

level.start_stop_menu(hud_slot_1(get_hud()), true)

self:quits()

end

 

function hud_slot_1:slot_2()

level.start_stop_menu(hud_slot_2(get_hud()), true)

self:quits()

end

 

--[[function hud_slot_1:slot_3()

level.start_stop_menu(hud_slot_3(get_hud()), true)

self:quits()

end]]

 

function hud_slot_1:quits()

self:GetHolder():start_stop_menu(self,true)

end

 

 

 

 

 

--Окно

--для

--апгрейда

--оружия в

--2 слоте

-----------------------------------------

class "hud_slot_2" (CUIScriptWnd)

 

function hud_slot_2:__init(owner) super()

self.owner = owner

self:S2Controls()

self:S2CallBacks()

end

 

function hud_ui:__finalize()

end

 

-----------------------------------------

function hud_slot_2:S2Controls()

self:Init(0,0,1024,768)

local hud = CScriptXmlInit()

hud:ParseFile("upgrade.xml")

hud:InitStatic("background", self)

self:Register(hud:Init3tButton("slot_1", self),"slot_1")

self:Register(hud:Init3tButton("slot_2", self),"slot_2")

self:Register(hud:Init3tButton("slot_3", self),"slot_3")

 

 

self:Register(hud:Init3tButton("mag_1", self),"mag_1")

self:Register(hud:Init3tButton("mag_2", self),"mag_2")

self:Register(hud:Init3tButton("mag_3", self),"mag_3")

 

 

self:Register(hud:Init3tButton("list_1", self),"list_1")

self:Register(hud:Init3tButton("list_2", self),"list_2")

self:Register(hud:Init3tButton("list_3", self),"list_3")

 

 

self:Register(hud:Init3tButton("prugina_1", self),"prugina_1")

self:Register(hud:Init3tButton("prugina_2", self),"prugina_2")

self:Register(hud:Init3tButton("prugina_3", self),"prugina_3")

 

 

self:Register(hud:Init3tButton("tormoz_1", self),"tormoz_1")

self:Register(hud:Init3tButton("tormoz_2", self),"tormoz_2")

self:Register(hud:Init3tButton("tormoz_3", self),"tormoz_3")

self:Register(hud:Init3tButton("quits", self),"quits")

 

 

------------------------------------------------------------------------

local weapon = db.actor:item_in_slot(2)

if weapon ~= nil then

local wpn = weapon:section()

 

------------------------------------------------------------------------

 

if string.sub(wpn,1,11) == "wpn_abakan_" then

self:Register(hud:Init3tButton("abakan_", self),"abakan_")

 

elseif

string.sub(wpn,1,9) == "wpn_ak74_" then

self:Register(hud:Init3tButton("ak74_",self),"ak74_")

 

elseif

string.sub(wpn,1,10) == "wpn_ak74u_" then

self:Register(hud:Init3tButton("ak74u_",self),"ak74u_")

 

elseif

string.sub(wpn,1,9) == "wpn_bm16_" then

self:Register(hud:Init3tButton("bm16_",self),"bm16_")

 

elseif

string.sub(wpn,1,11) == "wpn_fn2000_" then

self:Register(hud:Init3tButton("fn2000_",self),"fn2000_")

 

elseif

string.sub(wpn,1,8) == "wpn_g36_" then

self:Register(hud:Init3tButton("g36_",self),"g36_")

 

elseif

string.sub(wpn,1,10) == "wpn_lr300_" then

self:Register(hud:Init3tButton("lr300_",self),"lr300_")

 

elseif

string.sub(wpn,1,10) == "wpn_groza_" then

self:Register(hud:Init3tButton("groza_",self),"groza_")

 

elseif

string.sub(wpn,1,11) == "wpn_sig550_" then

self:Register(hud:Init3tButton("sig550_",self),"sig550_")

 

elseif

string.sub(wpn,1,20) == "wpn_wincheaster1300_" then

self:Register(hud:Init3tButton("wincheaster1300_",self),"wincheaster1300_")

 

elseif

string.sub(wpn,1,8) == "wpn_svd_" then

self:Register(hud:Init3tButton("svd_",self),"svd_")

 

elseif

string.sub(wpn,1,8) == "wpn_svu_" then

self:Register(hud:Init3tButton("svu_",self),"svu_")

 

 

elseif

string.sub(wpn,1,10) == "wpn_mac10_" then

self:Register(hud:Init3tButton("mac10_",self),"mac10_")

 

elseif

string.sub(wpn,1,13) == "wpn_vintorez_" then

self:Register(hud:Init3tButton("vintorez_",self),"vintorez_")

 

elseif

string.sub(wpn,1,8) == "wpn_val_" then

self:Register(hud:Init3tButton("val_",self),"val_")

 

elseif

string.sub(wpn,1,10) == "wpn_spas12_" then

self:Register(hud:Init3tButton("spas12_",self),"spas12_")

 

elseif

string.sub(wpn,1,8) == "wpn_l85_" then

self:Register(hud:Init3tButton("l85_",self),"l85_")

 

elseif

string.sub(wpn,1,10) == "wpn_toz34_" then

self:Register(hud:Init3tButton("toz34_",self),"toz34_")

 

elseif

string.sub(wpn,1,8) == "wpn_mp5_" then

self:Register(hud:Init3tButton("mp5_",self),"mp5_")

 

elseif

string.sub(wpn,1,9) == "wpn_rpg7_" then

self:Register(hud:Init3tButton("rpg7_",self),"rpg7_")

 

------------------------------------------------------

else return end

else return end

end

 

 

function hud_slot_2:S2CallBacks()

self:AddCallback("slot_1", ui_events.BUTTON_CLICKED, self.slot_1, self)

self:AddCallback("slot_2", ui_events.BUTTON_CLICKED, self.slot_2, self)

--self:AddCallback("slot_3", ui_events.BUTTON_CLICKED, self.slot_3, self)

self:AddCallback("quits", ui_events.BUTTON_CLICKED, self.quits, self)

 

end

 

 

function hud_slot_2:slot_1()

level.start_stop_menu(hud_slot_1(get_hud()), true)

self:quits()

end

 

function hud_slot_2:slot_2()

level.start_stop_menu(hud_slot_2(get_hud()), true)

self:quits()

end

 

--[[function hud_slot_2:slot_3()

level.start_stop_menu(hud_slot_3(get_hud()), true)

self:quits()

end]]

 

function hud_slot_2:quits()

self:GetHolder():start_stop_menu(self,true)

end

 

 

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

Извините если кому чем помешал ... просто эта проблема меня уже неделю мучает ... вернее я ее и она меня ...

---------------------------------------------------------------------------------------------------------------------------

Вот еще вопрос назрел вот это совмещение строк:

"wpn_".."mag_1"

ну это я так к примеру написал, но можно ли сделать удаление символа?

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

Товарищи!

Рылся в lua_help.script и увидел:

C++ class alife_simulator {
    function level_name(const alife_simulator*, number); --<<Это что?
    function level_id(alife_simulator*); --<<Это что, для чего нужно?
    function switch_distance(number); --<<Это что?(Можно  установить радиус актора на алайф?(alife.ltx?))

Можно как получить имя левела, на котором находится npc?

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...