<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Аллен Волкер</title><author><name>Аллен Волкер</name></author><id>https://teletype.in/atom/allenwalker</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/allenwalker?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@allenwalker?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=allenwalker"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/allenwalker?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-14T03:50:58.474Z</updated><entry><id>allenwalker:robloxstudio</id><link rel="alternate" type="text/html" href="https://teletype.in/@allenwalker/robloxstudio?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=allenwalker"></link><title>📘 Программирование на Lua в Roblox. Полный курс от новичка до уверенного разработчика.</title><published>2025-05-21T14:18:11.763Z</published><updated>2025-05-21T14:18:11.763Z</updated><summary type="html">print(&quot;Привет, Roblox!&quot;)</summary><content type="html">
  &lt;h2 id=&quot;Hhis&quot;&gt;Оглавление:&lt;/h2&gt;
  &lt;p id=&quot;6FPT&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;f8bt&quot;&gt;🔹 Глава 1: Введение в Roblox и Lua.&lt;/h2&gt;
  &lt;h2 id=&quot;VCSv&quot;&gt;🔹 Глава 2: Знакомство с интерфейсом Roblox Studio.&lt;/h2&gt;
  &lt;h2 id=&quot;bOlX&quot;&gt;🔹 Глава 3: Основы программирования на Lua.&lt;/h2&gt;
  &lt;h2 id=&quot;N9yA&quot;&gt;🔹 Глава 4: Работа с объектами и сервисами Roblox.&lt;/h2&gt;
  &lt;h2 id=&quot;rBlt&quot;&gt;🔹 Глава 5: События и взаимодействие в Roblox.&lt;/h2&gt;
  &lt;h2 id=&quot;avyQ&quot;&gt;🔹 Глава 6: GUI — Создание интерфейса.&lt;/h2&gt;
  &lt;h2 id=&quot;Mkn1&quot;&gt;🔹 Глава 7: Работа с игроками и персонажами.&lt;/h2&gt;
  &lt;h2 id=&quot;Gxws&quot;&gt;🔹 Глава 8: Анимация и физика персонажей.&lt;/h2&gt;
  &lt;h2 id=&quot;EUaQ&quot;&gt;🔹 Глава 9: Сохранение данных с DataStore.&lt;/h2&gt;
  &lt;h2 id=&quot;EEr1&quot;&gt;🔹 Глава 10: Клиент-серверное взаимодействие.&lt;/h2&gt;
  &lt;h2 id=&quot;55tM&quot;&gt;🔹 Глава 11: Модульные скрипты и библиотеки.&lt;/h2&gt;
  &lt;h2 id=&quot;5zxf&quot;&gt;🔹 Глава 12: Работа с файлами и внешними данными.&lt;/h2&gt;
  &lt;h2 id=&quot;vEu9&quot;&gt;🔹 Глава 13: JSON и работа с форматами данных.&lt;/h2&gt;
  &lt;h2 id=&quot;x4mu&quot;&gt;🔹 Глава 14: Работа с аудио и звуками.&lt;/h2&gt;
  &lt;h2 id=&quot;VwBx&quot;&gt;🔹 Глава 15: Таймеры, корутины и многозадачность.&lt;/h2&gt;
  &lt;h2 id=&quot;pAvP&quot;&gt;🔹 Глава 16: Обработка ошибок и отладка.&lt;/h2&gt;
  &lt;h2 id=&quot;lzfM&quot;&gt;🔹 Глава 17: Плагины для Roblox Studio.&lt;/h2&gt;
  &lt;h2 id=&quot;wQ5t&quot;&gt;🔹 Глава 18: Мультиплеер и работа с командами.&lt;/h2&gt;
  &lt;h2 id=&quot;OtHZ&quot;&gt;🔹 Глава 19: Оптимизация и производительность.&lt;/h2&gt;
  &lt;p id=&quot;NGsl&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;UcU7&quot;&gt;&lt;/h2&gt;
  &lt;p id=&quot;WhVs&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;x0jh&quot;&gt;🔹 Глава 1: Введение в Roblox и Lua.&lt;/h2&gt;
  &lt;h3 id=&quot;cKBc&quot;&gt;Содержание:&lt;/h3&gt;
  &lt;h4 id=&quot;BZIf&quot;&gt;Что такое Roblox?&lt;/h4&gt;
  &lt;ul id=&quot;u6hf&quot;&gt;
    &lt;li id=&quot;druA&quot;&gt;Обзор платформы.&lt;/li&gt;
    &lt;li id=&quot;Xc2r&quot;&gt;Возможности: создание игр, монетизация, сообщество.&lt;/li&gt;
    &lt;li id=&quot;kkz0&quot;&gt;История развития.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;tiNW&quot;&gt;Что такое Lua?&lt;/h4&gt;
  &lt;ul id=&quot;vH95&quot;&gt;
    &lt;li id=&quot;zOcq&quot;&gt;Краткая история языка.&lt;/li&gt;
    &lt;li id=&quot;Ruaa&quot;&gt;Почему именно Lua используется в Roblox.&lt;/li&gt;
    &lt;li id=&quot;413z&quot;&gt;Особенности легковесности и скорости.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;9xge&quot;&gt;Зачем учить программирование через Roblox?&lt;/h4&gt;
  &lt;ul id=&quot;64Zz&quot;&gt;
    &lt;li id=&quot;MReS&quot;&gt;Логическое мышление.&lt;/li&gt;
    &lt;li id=&quot;We6z&quot;&gt;Основы алгоритмов.&lt;/li&gt;
    &lt;li id=&quot;AI4x&quot;&gt;Работа с событиями, объектами, данными.&lt;/li&gt;
    &lt;li id=&quot;Qvrh&quot;&gt;Возможность создания реальных проектов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;c3Bz&quot;&gt;Как устроена эта книга?&lt;/h4&gt;
  &lt;ul id=&quot;bi3O&quot;&gt;
    &lt;li id=&quot;P2X7&quot;&gt;Объяснение структуры.&lt;/li&gt;
    &lt;li id=&quot;zwzL&quot;&gt;Советы по прохождению.&lt;/li&gt;
    &lt;li id=&quot;Wuja&quot;&gt;Как использовать примеры.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;fYGS&quot;&gt;Первые шаги: установка и запуск Roblox Studio&lt;/h4&gt;
  &lt;ul id=&quot;Pzu4&quot;&gt;
    &lt;li id=&quot;MyOO&quot;&gt;Пошаговая инструкция по регистрации.&lt;/li&gt;
    &lt;li id=&quot;M6s1&quot;&gt;Скачивание и запуск Roblox Studio.&lt;/li&gt;
    &lt;li id=&quot;7V9j&quot;&gt;Создание первого Place.&lt;/li&gt;
    &lt;li id=&quot;9rcK&quot;&gt;Сохранение проекта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;FMpP&quot;&gt;Термины и понятия&lt;/h4&gt;
  &lt;ul id=&quot;JLe8&quot;&gt;
    &lt;li id=&quot;huWX&quot;&gt;&lt;code&gt;Place&lt;/code&gt;, &lt;code&gt;Game&lt;/code&gt;, &lt;code&gt;Server&lt;/code&gt;, &lt;code&gt;Client&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;vJXa&quot;&gt;Разница между клиентом и сервером.&lt;/li&gt;
    &lt;li id=&quot;VuqL&quot;&gt;Что такое &lt;code&gt;Workspace&lt;/code&gt;, &lt;code&gt;StarterGui&lt;/code&gt;, &lt;code&gt;ReplicatedStorage&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;52sF&quot;&gt;Упражнения:&lt;/h4&gt;
  &lt;ul id=&quot;70BM&quot;&gt;
    &lt;li id=&quot;KmeL&quot;&gt;Установи Roblox Studio.&lt;/li&gt;
    &lt;li id=&quot;H8JS&quot;&gt;Создай новый Place и сохрани его как &amp;quot;MyFirstGame&amp;quot;.&lt;/li&gt;
    &lt;li id=&quot;pvt5&quot;&gt;Добавь в Workspace одну Part и перемести её на высоту 10.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ym6k&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Wdeh&quot;&gt;🔹 Глава 2: Знакомство с интерфейсом Roblox Studio.&lt;/h2&gt;
  &lt;h3 id=&quot;AMCO&quot;&gt;Содержание:&lt;/h3&gt;
  &lt;h4 id=&quot;iUDl&quot;&gt;Интерфейс студии&lt;/h4&gt;
  &lt;ul id=&quot;CRfz&quot;&gt;
    &lt;li id=&quot;LouV&quot;&gt;Toolbar: основные инструменты.&lt;/li&gt;
    &lt;li id=&quot;kWzk&quot;&gt;Viewport: игровое окно.&lt;/li&gt;
    &lt;li id=&quot;u4g8&quot;&gt;Explorer: дерево объектов.&lt;/li&gt;
    &lt;li id=&quot;NwKV&quot;&gt;Properties: редактор свойств.&lt;/li&gt;
    &lt;li id=&quot;I9P4&quot;&gt;Output: вывод скриптов и ошибок.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;R89m&quot;&gt;Основные папки и сервисы&lt;/h4&gt;
  &lt;ul id=&quot;Z9l8&quot;&gt;
    &lt;li id=&quot;KgOK&quot;&gt;&lt;code&gt;Workspace&lt;/code&gt; – где происходит действие.&lt;/li&gt;
    &lt;li id=&quot;FwDZ&quot;&gt;&lt;code&gt;Players&lt;/code&gt; – информация об игроках.&lt;/li&gt;
    &lt;li id=&quot;TsW4&quot;&gt;&lt;code&gt;Lighting&lt;/code&gt; – управление освещением.&lt;/li&gt;
    &lt;li id=&quot;TRQE&quot;&gt;&lt;code&gt;StarterGui&lt;/code&gt; – UI для новых игроков.&lt;/li&gt;
    &lt;li id=&quot;Degv&quot;&gt;&lt;code&gt;ServerScriptService&lt;/code&gt; – серверные скрипты.&lt;/li&gt;
    &lt;li id=&quot;48RA&quot;&gt;&lt;code&gt;ReplicatedStorage&lt;/code&gt; – данные для клиента и сервера.&lt;/li&gt;
    &lt;li id=&quot;updY&quot;&gt;&lt;code&gt;Lighting&lt;/code&gt; – управление светом и тенью.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;Fug4&quot;&gt;Работа с объектами&lt;/h4&gt;
  &lt;ul id=&quot;aZuW&quot;&gt;
    &lt;li id=&quot;dlLO&quot;&gt;Создание, удаление, копирование.&lt;/li&gt;
    &lt;li id=&quot;64bT&quot;&gt;Перемещение, поворот, масштабирование.&lt;/li&gt;
    &lt;li id=&quot;CUmi&quot;&gt;Изменение цвета, текстуры, размера.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;qg5o&quot;&gt;Базовые понятия:&lt;/h4&gt;
  &lt;ul id=&quot;m73N&quot;&gt;
    &lt;li id=&quot;HUZs&quot;&gt;Instance – объект в Roblox.&lt;/li&gt;
    &lt;li id=&quot;Tbkc&quot;&gt;Parent/Child – иерархия объектов.&lt;/li&gt;
    &lt;li id=&quot;qgNI&quot;&gt;Property – параметр объекта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;cM82&quot;&gt;Практическое задание:&lt;/h4&gt;
  &lt;ul id=&quot;G6WX&quot;&gt;
    &lt;li id=&quot;1Ui7&quot;&gt;Создай комнату из Part&amp;#x27;ов.&lt;/li&gt;
    &lt;li id=&quot;qChV&quot;&gt;Добавь в неё дверь и кнопку.&lt;/li&gt;
    &lt;li id=&quot;8FAQ&quot;&gt;Настрой освещение.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;FHcp&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;iMtd&quot;&gt;🔹 Глава 3: Основы программирования на Lua.&lt;/h2&gt;
  &lt;h3 id=&quot;DQ6c&quot;&gt;Содержание:&lt;/h3&gt;
  &lt;h4 id=&quot;26X0&quot;&gt;Что такое язык программирования?&lt;/h4&gt;
  &lt;ul id=&quot;IHJS&quot;&gt;
    &lt;li id=&quot;uVSX&quot;&gt;Понятие синтаксиса.&lt;/li&gt;
    &lt;li id=&quot;gVbr&quot;&gt;Компиляция vs интерпретация.&lt;/li&gt;
    &lt;li id=&quot;vBuH&quot;&gt;Lua как скриптовый язык.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;cX87&quot;&gt;Первая программа&lt;/h4&gt;
  &lt;p id=&quot;drGC&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;skqa&quot;&gt;&lt;code&gt;print(&amp;quot;Привет, Roblox!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;RdmF&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;nlqB&quot;&gt;Структура программы&lt;/p&gt;
  &lt;ul id=&quot;CKI0&quot;&gt;
    &lt;li id=&quot;NE1C&quot;&gt;Комментарии: однострочные и многострочные.&lt;/li&gt;
    &lt;li id=&quot;7hRy&quot;&gt;Инструкции и выражения.&lt;/li&gt;
    &lt;li id=&quot;Z1c7&quot;&gt;Блоки кода.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;OkwH&quot;&gt;Переменные и типы данных&lt;/h4&gt;
  &lt;ul id=&quot;poIs&quot;&gt;
    &lt;li id=&quot;5YZN&quot;&gt;&lt;code&gt;local&lt;/code&gt; vs &lt;code&gt;global&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;mtIF&quot;&gt;Числа, строки, булевы значения.&lt;/li&gt;
    &lt;li id=&quot;ULUn&quot;&gt;nil и что это значит.&lt;/li&gt;
    &lt;li id=&quot;hyC0&quot;&gt;Преобразование типов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;wyHF&quot;&gt;Операторы&lt;/h4&gt;
  &lt;ul id=&quot;pDHN&quot;&gt;
    &lt;li id=&quot;c8QP&quot;&gt;Арифметические: +, -, *, /, ^, %&lt;/li&gt;
    &lt;li id=&quot;yQaD&quot;&gt;Сравнения: ==, ~=, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=&lt;/li&gt;
    &lt;li id=&quot;f5nE&quot;&gt;Логические: and, or, not&lt;/li&gt;
    &lt;li id=&quot;VvlL&quot;&gt;Конкатенация строк: ..&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;oiT5&quot;&gt;Условия&lt;/h4&gt;
  &lt;ul id=&quot;7q0k&quot;&gt;
    &lt;li id=&quot;8UBz&quot;&gt;if...then...else&lt;/li&gt;
    &lt;li id=&quot;HP0s&quot;&gt;elseif&lt;/li&gt;
    &lt;li id=&quot;A6F8&quot;&gt;switch-like конструкции через if&lt;/li&gt;
    &lt;li id=&quot;uDLf&quot;&gt;Таблицы как условие&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;SacP&quot;&gt;Циклы&lt;/h4&gt;
  &lt;ul id=&quot;qILi&quot;&gt;
    &lt;li id=&quot;Cm4e&quot;&gt;for i = a, b do ... end&lt;/li&gt;
    &lt;li id=&quot;nFCU&quot;&gt;while condition do ... end&lt;/li&gt;
    &lt;li id=&quot;0jKt&quot;&gt;repeat ... until condition&lt;/li&gt;
    &lt;li id=&quot;xBhW&quot;&gt;break и continue&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;7bmN&quot;&gt;Функции&lt;/h4&gt;
  &lt;ul id=&quot;7iGB&quot;&gt;
    &lt;li id=&quot;5WIW&quot;&gt;Создание функций.&lt;/li&gt;
    &lt;li id=&quot;eIYV&quot;&gt;Параметры и возврат значений.&lt;/li&gt;
    &lt;li id=&quot;2fbl&quot;&gt;Локальные и глобальные функции.&lt;/li&gt;
    &lt;li id=&quot;cdBb&quot;&gt;Анонимные функции.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;some&quot;&gt;Таблицы&lt;/h4&gt;
  &lt;ul id=&quot;Zk5T&quot;&gt;
    &lt;li id=&quot;kbbv&quot;&gt;Создание таблиц.&lt;/li&gt;
    &lt;li id=&quot;LuZi&quot;&gt;Индексация: числовая и строковая.&lt;/li&gt;
    &lt;li id=&quot;N2th&quot;&gt;Методы работы: ipairs, pairs.&lt;/li&gt;
    &lt;li id=&quot;HCEi&quot;&gt;Таблицы как структуры данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;fGut&quot;&gt;Упражнения:&lt;/h4&gt;
  &lt;ul id=&quot;v6lI&quot;&gt;
    &lt;li id=&quot;fRw0&quot;&gt;Напиши функцию, которая считает площадь прямоугольника.&lt;/li&gt;
    &lt;li id=&quot;cQYE&quot;&gt;Напиши цикл, который выводит числа от 1 до 20, но пропускает чётные.&lt;/li&gt;
    &lt;li id=&quot;hEiA&quot;&gt;Создай таблицу с информацией о персонаже: имя, уровень, здоровье.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;IzfO&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;rZtL&quot;&gt;🔹 Глава 4: Работа с объектами и сервисами Roblox.&lt;/h2&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;spoN&quot;&gt;Введение&lt;/h3&gt;
  &lt;p id=&quot;7jEQ&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;4wwd&quot;&gt;
    &lt;li id=&quot;3SF4&quot;&gt;Как устроены объекты в Roblox.&lt;/li&gt;
    &lt;li id=&quot;Fy5G&quot;&gt;Что такое &lt;code&gt;Instance&lt;/code&gt; и как им управлять.&lt;/li&gt;
    &lt;li id=&quot;eTgM&quot;&gt;Как работать с основными сервисами: &lt;code&gt;Workspace&lt;/code&gt;, &lt;code&gt;Players&lt;/code&gt;, &lt;code&gt;ReplicatedStorage&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;0iki&quot;&gt;Как создавать, изменять и удалять объекты через код.&lt;/li&gt;
    &lt;li id=&quot;4qNQ&quot;&gt;Как использовать дерево объектов (Explorer) для поиска нужных элементов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;5B5n&quot;&gt;4.1 — Основы объектов в Roblox&lt;/h3&gt;
  &lt;h4 id=&quot;grYS&quot;&gt;Что такое Instance?&lt;/h4&gt;
  &lt;p id=&quot;wzI7&quot;&gt;Все объекты в Roblox — это &lt;code&gt;Instances&lt;/code&gt;. Это базовый класс, из которого наследуются все остальные объекты: &lt;code&gt;Part&lt;/code&gt;, &lt;code&gt;Model&lt;/code&gt;, &lt;code&gt;Folder&lt;/code&gt;, &lt;code&gt;Script&lt;/code&gt;, &lt;code&gt;GuiObject&lt;/code&gt; и т.д.&lt;/p&gt;
  &lt;p id=&quot;eqzi&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;upoc&quot;&gt;&lt;code&gt;local part = Instance.new(&amp;quot;Part&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jp9h&quot;&gt;&lt;code&gt;part.Name = &amp;quot;МояЧасть&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NDhi&quot;&gt;&lt;code&gt;part.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;BfU4&quot;&gt;Иерархия объектов&lt;/h4&gt;
  &lt;p id=&quot;kvuh&quot;&gt;Каждый объект имеет родителя (&lt;code&gt;Parent&lt;/code&gt;) и может содержать дочерние элементы (&lt;code&gt;Children&lt;/code&gt;).&lt;/p&gt;
  &lt;p id=&quot;qcwl&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;KjIN&quot;&gt;&lt;code&gt;local folder = Instance.new(&amp;quot;Folder&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;7ww7&quot;&gt;&lt;code&gt;folder.Name = &amp;quot;Группа&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;aH3i&quot;&gt;&lt;code&gt;folder.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;iVq9&quot;&gt;&lt;code&gt;local part = Instance.new(&amp;quot;Part&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yBc5&quot;&gt;&lt;code&gt;part.Parent = folder&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4q2L&quot;&gt;Теперь &lt;code&gt;Part&lt;/code&gt; находится внутри &lt;code&gt;Folder&lt;/code&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;pgAb&quot;&gt;4.2 — Сервисы Roblox&lt;/h3&gt;
  &lt;p id=&quot;qXnx&quot;&gt;Roblox предоставляет ряд встроенных сервисов, которые можно получить через &lt;code&gt;game:GetService()&lt;/code&gt;.&lt;/p&gt;
  &lt;h4 id=&quot;9SPi&quot;&gt;Workspace&lt;/h4&gt;
  &lt;p id=&quot;2wIH&quot;&gt;Игровой мир, где находятся все части, модели и персонажи.&lt;/p&gt;
  &lt;p id=&quot;zwtZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;IfDZ&quot;&gt;&lt;code&gt;local workspace = game:GetService(&amp;quot;Workspace&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;gvaD&quot;&gt;Players&lt;/h4&gt;
  &lt;p id=&quot;SCtm&quot;&gt;Список всех игроков в игре.&lt;/p&gt;
  &lt;p id=&quot;vqzL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;vwPd&quot;&gt;&lt;code&gt;local players = game:GetService(&amp;quot;Players&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;N4u5&quot;&gt;ReplicatedStorage&lt;/h4&gt;
  &lt;p id=&quot;bLxt&quot;&gt;Хранилище объектов, доступных как серверу, так и клиенту.&lt;/p&gt;
  &lt;p id=&quot;iTzf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;NGVq&quot;&gt;&lt;code&gt;local replicatedStorage = game:GetService(&amp;quot;ReplicatedStorage&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;BcAk&quot;&gt;ServerScriptService&lt;/h4&gt;
  &lt;p id=&quot;dCa1&quot;&gt;Серверные скрипты. Сюда помещаются скрипты, работающие только на сервере.&lt;/p&gt;
  &lt;p id=&quot;Ju72&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Tjx2&quot;&gt;&lt;code&gt;local serverScripts = game:GetService(&amp;quot;ServerScriptService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;AXY3&quot;&gt;StarterGui / PlayerGui&lt;/h4&gt;
  &lt;p id=&quot;EGw1&quot;&gt;Интерфейс игрока. &lt;code&gt;StarterGui&lt;/code&gt; — шаблон для новых игроков. &lt;code&gt;PlayerGui&lt;/code&gt; — UI конкретного игрока.&lt;/p&gt;
  &lt;p id=&quot;NT0s&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Rk1X&quot;&gt;&lt;code&gt;local player = players.LocalPlayer&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wzkg&quot;&gt;&lt;code&gt;local gui = player.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;aY73&quot;&gt;4.3 — Создание и управление объектами&lt;/h3&gt;
  &lt;h4 id=&quot;gP8l&quot;&gt;Создание объекта&lt;/h4&gt;
  &lt;p id=&quot;1RTZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;h5sh&quot;&gt;&lt;code&gt;local cube = Instance.new(&amp;quot;Part&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YUAd&quot;&gt;&lt;code&gt;cube.Size = Vector3.new(2, 2, 2)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1suL&quot;&gt;&lt;code&gt;cube.BrickColor = BrickColor.Red()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3Rbi&quot;&gt;&lt;code&gt;cube.Anchored = true&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GqWO&quot;&gt;&lt;code&gt;cube.Position = Vector3.new(0, 5, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nEOH&quot;&gt;&lt;code&gt;cube.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;CfgT&quot;&gt;Изменение свойств объекта&lt;/h4&gt;
  &lt;p id=&quot;cOHC&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;zwuZ&quot;&gt;&lt;code&gt;cube.Transparency = 0.5 -- делает часть полупрозрачной&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;pnQr&quot;&gt;&lt;code&gt;cube.Shape = Enum.PartType.Ball -- делает часть шаром&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;gD2r&quot;&gt;Удаление объекта&lt;/h4&gt;
  &lt;p id=&quot;t0wx&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;fPrc&quot;&gt;&lt;code&gt;cube:Destroy() -- удаляет объект&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;HXvi&quot;&gt;&lt;/h4&gt;
  &lt;h4 id=&quot;Tt8D&quot;&gt;Поиск объекта&lt;/h4&gt;
  &lt;p id=&quot;Z4jl&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ALCI&quot;&gt;&lt;code&gt;local found = workspace:FindFirstChild(&amp;quot;МояЧасть&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;d1SR&quot;&gt;&lt;code&gt;if found then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UwKx&quot;&gt;&lt;code&gt;        print(&amp;quot;Найден объект: &amp;quot; .. found.Name)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;AE9N&quot;&gt;&lt;code&gt;else&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rhKN&quot;&gt;&lt;code&gt;        print(&amp;quot;Объект не найден.&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XRjA&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;q1Ud&quot;&gt;4.4 — Работа с событиями объектов&lt;/h3&gt;
  &lt;p id=&quot;fBl0&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;1Ka5&quot;&gt;Каждый объект может иметь события. Например, &lt;code&gt;Part&lt;/code&gt; имеет событие &lt;code&gt;Touched&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;F8Pb&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;M6ga&quot;&gt;&lt;code&gt;cube.Touched:Connect(function(hit)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;RXuf&quot;&gt;&lt;code&gt;local character = hit.Parent&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;b8rP&quot;&gt;&lt;code&gt;if character:FindFirstChild(&amp;quot;Humanoid&amp;quot;) then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;HEqO&quot;&gt;&lt;code&gt;print(&amp;quot;Персонаж коснулся куба!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dtH0&quot;&gt;&lt;code&gt;     end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OIon&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;80LU&quot;&gt;4.5 — Работа с моделями и группировкой объектов&lt;/h3&gt;
  &lt;h4 id=&quot;B3Q4&quot;&gt;Создание модели&lt;/h4&gt;
  &lt;p id=&quot;Ok5r&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ObNz&quot;&gt;&lt;code&gt;local model = Instance.new(&amp;quot;Model&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;10oI&quot;&gt;&lt;code&gt;model.Name = &amp;quot;Герой&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CaED&quot;&gt;&lt;code&gt;model.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;c72H&quot;&gt;&lt;code&gt;local head = Instance.new(&amp;quot;Part&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;qQJX&quot;&gt;&lt;code&gt;head.Name = &amp;quot;Head&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Fjkl&quot;&gt;&lt;code&gt;head.Parent = model&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nECe&quot;&gt;&lt;code&gt;local torso = Instance.new(&amp;quot;Part&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0J08&quot;&gt;&lt;code&gt;torso.Name = &amp;quot;Torso&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;V9fG&quot;&gt;&lt;code&gt;torso.Parent = model&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;A5Py&quot;&gt;Теперь &lt;code&gt;Model&lt;/code&gt; содержит две &lt;code&gt;Part&lt;/code&gt;: Head и Torso.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;c8zQ&quot;&gt;4.6 — Практическое задание&lt;/h3&gt;
  &lt;p id=&quot;3Dlj&quot;&gt;&lt;strong&gt;Задача:&lt;/strong&gt;&lt;br /&gt;Создай дом с крышей, стенами и дверью. Добавь освещение. При нажатии на дверь — она должна открываться.&lt;/p&gt;
  &lt;p id=&quot;oPV0&quot;&gt;&lt;strong&gt;Шаги:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;WIbI&quot;&gt;
    &lt;li id=&quot;IuCo&quot;&gt;Создай несколько Part для стен, крыши и двери.&lt;/li&gt;
    &lt;li id=&quot;Hh5S&quot;&gt;Сгруппируй их в одну модель.&lt;/li&gt;
    &lt;li id=&quot;bIF9&quot;&gt;Добавь двери &lt;code&gt;ClickDetector&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;38kk&quot;&gt;При нажатии поворачивай дверь на 90 градусов с помощью &lt;code&gt;CFrame&lt;/code&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;T1d2&quot;&gt;&lt;strong&gt;Пример кода для двери:&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;RJm1&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Vswa&quot;&gt;&lt;code&gt;local door = workspace.Door&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;DOyA&quot;&gt;&lt;code&gt;door.ClickDetector.MouseClick:Connect(function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;9CCN&quot;&gt;&lt;code&gt;door.CFrame = door.CFrame * CFrame.Angles(0, math.rad(90), 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;emGm&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;MMgz&quot;&gt;4.7 — Советы и рекомендации&lt;/h3&gt;
  &lt;ul id=&quot;G85h&quot;&gt;
    &lt;li id=&quot;JuZL&quot;&gt;Используй &lt;code&gt;print()&lt;/code&gt; для проверки, создан ли объект.&lt;/li&gt;
    &lt;li id=&quot;lxfU&quot;&gt;Не забывай указывать &lt;code&gt;Parent&lt;/code&gt;, иначе объект останется невидимым.&lt;/li&gt;
    &lt;li id=&quot;TSsE&quot;&gt;Используй &lt;code&gt;Folder&lt;/code&gt; для группировки объектов.&lt;/li&gt;
    &lt;li id=&quot;r3VH&quot;&gt;Тестируй взаимодействие с объектами через &lt;code&gt;Touched&lt;/code&gt;, &lt;code&gt;MouseClick&lt;/code&gt; и другие события.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;XRH3&quot;&gt;4.8 — Ключевые термины&lt;/h3&gt;
  &lt;p id=&quot;Ik7s&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;jlXu&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;Kkt7&quot;&gt;Instance - Базовый объект в Roblox&lt;/p&gt;
  &lt;p id=&quot;0Uyx&quot;&gt;Parent - Родительский объект&lt;/p&gt;
  &lt;p id=&quot;HHvH&quot;&gt;Child - Дочерний объект&lt;/p&gt;
  &lt;p id=&quot;Yy7Q&quot;&gt;Workspace - Основное игровое пространство&lt;/p&gt;
  &lt;p id=&quot;5SUP&quot;&gt;Model - Группировка объектов&lt;/p&gt;
  &lt;p id=&quot;UOr2&quot;&gt;ClickDetector - Компонент для обнаружения кликов&lt;/p&gt;
  &lt;p id=&quot;zvOQ&quot;&gt;Touched - Событие прикосновения объекта&lt;/p&gt;
  &lt;p id=&quot;kVjl&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;PAK4&quot;&gt;🔹 Глава 5: События и взаимодействие в Roblox.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;spnx&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;6qFD&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;NkTq&quot;&gt;
    &lt;li id=&quot;50LE&quot;&gt;Что такое события (Events) в Roblox.&lt;/li&gt;
    &lt;li id=&quot;dYHx&quot;&gt;Как использовать &lt;code&gt;.Connect()&lt;/code&gt; для обработки событий.&lt;/li&gt;
    &lt;li id=&quot;GssD&quot;&gt;Как работать с часто используемыми событиями: &lt;code&gt;Touched&lt;/code&gt;, &lt;code&gt;MouseClick&lt;/code&gt;, &lt;code&gt;Changed&lt;/code&gt;, &lt;code&gt;ChildAdded&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;ZvcK&quot;&gt;Как создавать собственные события через &lt;code&gt;BindableEvent&lt;/code&gt; и &lt;code&gt;RemoteEvent&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;MVib&quot;&gt;Как организовывать клиент-серверное взаимодействие.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;U6Cg&quot;&gt;5.1 — Что такое события?&lt;/h2&gt;
  &lt;p id=&quot;btDp&quot;&gt;События — это реакции на действия, происходящие в игре. Например:&lt;/p&gt;
  &lt;ul id=&quot;ssmM&quot;&gt;
    &lt;li id=&quot;lgEV&quot;&gt;Игрок нажал на кнопку → событие &lt;code&gt;MouseClick&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;XEq8&quot;&gt;Персонаж прыгнул → событие &lt;code&gt;Jumped&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;DlBM&quot;&gt;Объект изменил своё свойство → событие &lt;code&gt;Changed&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;ZcCn&quot;&gt;Пример:&lt;/h3&gt;
  &lt;p id=&quot;F3AR&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;UUiZ&quot;&gt;&lt;code&gt;local button = workspace.Button&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XKs2&quot;&gt;&lt;code&gt;button.ClickDetector.MouseClick:Connect(function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;pyVt&quot;&gt;&lt;code&gt;            print(player.Name .. &amp;quot; нажал на кнопку!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;q17j&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;WpZa&quot;&gt;5.2 — Основные типы событий&lt;/h2&gt;
  &lt;p id=&quot;6BMC&quot;&gt;Тип события - Где используется - Описание&lt;/p&gt;
  &lt;p id=&quot;lS3m&quot;&gt;MouseClick - ClickDetector - Клик мышью по объекту&lt;/p&gt;
  &lt;p id=&quot;x7mT&quot;&gt;Touched - BasePart - Прикосновение к объекту&lt;/p&gt;
  &lt;p id=&quot;q4Yy&quot;&gt;Changed - Instance - Изменение любого свойства&lt;/p&gt;
  &lt;p id=&quot;yA5e&quot;&gt;ChildAdded/Removed - Instance - Добавление или удаление дочернего элемента&lt;/p&gt;
  &lt;p id=&quot;9TtM&quot;&gt;Humanoid.Jumped - Humanoid - Прыжок персонажа&lt;/p&gt;
  &lt;p id=&quot;frJU&quot;&gt;PlayerAdded - Players - Игрок зашёл в игру&lt;/p&gt;
  &lt;p id=&quot;vTA5&quot;&gt;PlayerRemoving - Players - Игрок вышел из игры&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Z4SU&quot;&gt;5.3 — Подписка на события: &lt;code&gt;.Connect()&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;MT3G&quot;&gt;Чтобы отреагировать на событие, нужно подписаться на него с помощью метода &lt;code&gt;.Connect()&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;VuRd&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;PAgw&quot;&gt;&lt;code&gt;workspace.Door.Touched:Connect(function(hit)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0EkZ&quot;&gt;&lt;code&gt;          local character = hit.Parent&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gkig&quot;&gt;&lt;code&gt;          if character:FindFirstChild(&amp;quot;Humanoid&amp;quot;) then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XZJv&quot;&gt;&lt;code&gt;                    print(&amp;quot;Кто-то коснулся двери!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;AFOR&quot;&gt;&lt;code&gt;          end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;xBO9&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ky3i&quot;&gt;5.4 — Использование Changed&lt;/h2&gt;
  &lt;p id=&quot;re66&quot;&gt;Это событие вызывается при изменении любого свойства объекта.&lt;/p&gt;
  &lt;p id=&quot;Dvb8&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ErcN&quot;&gt;&lt;code&gt;local part = workspace.Part&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Giqt&quot;&gt;&lt;code&gt;part.Changed:Connect(function(property)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;vnyL&quot;&gt;&lt;code&gt;              print(&amp;quot;Изменилось свойство: &amp;quot; .. property)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XZqj&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rONf&quot;&gt;Можно отслеживать конкретное свойство:&lt;/p&gt;
  &lt;p id=&quot;w37r&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;z01g&quot;&gt;&lt;code&gt;if property == &amp;quot;Transparency&amp;quot; then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6hK8&quot;&gt;&lt;code&gt;             print(&amp;quot;Прозрачность изменилась&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;guWf&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;rRAC&quot;&gt;5.5 — ChildAdded и ChildRemoved&lt;/h2&gt;
  &lt;p id=&quot;wRFY&quot;&gt;Эти события позволяют отслеживать добавление или удаление дочерних объектов.&lt;/p&gt;
  &lt;p id=&quot;peAH&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;OefR&quot;&gt;&lt;code&gt;workspace.ChildAdded:Connect(function(child)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;R2tD&quot;&gt;&lt;code&gt;              print(&amp;quot;Добавлен объект: &amp;quot; .. child.Name)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Yj8U&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;buBp&quot;&gt;&lt;code&gt;workspace.ChildRemoved:Connect(function(child)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;x9t1&quot;&gt;&lt;code&gt;              print(&amp;quot;Удалён объект: &amp;quot; .. child.Name)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;vIEZ&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;llkH&quot;&gt;5.6 — Создание своих событий&lt;/h2&gt;
  &lt;p id=&quot;V62Q&quot;&gt;Иногда тебе нужно передавать информацию между скриптами. Для этого можно использовать:&lt;/p&gt;
  &lt;h3 id=&quot;tpEN&quot;&gt;BindableEvent&lt;/h3&gt;
  &lt;p id=&quot;yLy3&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;cbOV&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;9sYB&quot;&gt;&lt;code&gt;local event = Instance.new(&amp;quot;BindableEvent&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QL2a&quot;&gt;&lt;code&gt;event.Name = &amp;quot;DoorOpened&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3smf&quot;&gt;&lt;code&gt;event.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FTXw&quot;&gt;&lt;code&gt;event.Event:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yWrW&quot;&gt;&lt;code&gt;               print(&amp;quot;Дверь открыта!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;IZnL&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KsP9&quot;&gt;&lt;code&gt;-- Где-то в другом скрипте&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yttt&quot;&gt;&lt;code&gt;event:Fire()&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;vHrG&quot;&gt;5.7 — RemoteEvent: клиент ↔ сервер&lt;/h2&gt;
  &lt;p id=&quot;4OI6&quot;&gt;&lt;code&gt;RemoteEvent&lt;/code&gt; позволяет отправлять данные между клиентом и сервером.&lt;/p&gt;
  &lt;h3 id=&quot;0tKZ&quot;&gt;На сервере:&lt;/h3&gt;
  &lt;p id=&quot;yN2N&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;WVJ2&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OMCo&quot;&gt;&lt;code&gt;local remote = Instance.new(&amp;quot;RemoteEvent&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;pMEW&quot;&gt;&lt;code&gt;remote.Name = &amp;quot;PlayerJumped&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WOTW&quot;&gt;&lt;code&gt;remote.Parent = game.ReplicatedStorage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ri1M&quot;&gt;&lt;code&gt;remote.OnServerEvent:Connect(function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ErHk&quot;&gt;&lt;code&gt;             print(player.Name .. &amp;quot; прыгнул!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;2K65&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;jZPk&quot;&gt;На клиенте (LocalScript):&lt;/h3&gt;
  &lt;p id=&quot;3HvL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;FRwY&quot;&gt;&lt;code&gt;-- StarterPlayerScripts&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WaF6&quot;&gt;&lt;code&gt;local remote = game.ReplicatedStorage.PlayerJumped&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CtVo&quot;&gt;&lt;code&gt;game.Players.LocalPlayer.Character.Humanoid.Jumped:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Excc&quot;&gt;&lt;code&gt;        remote:FireServer()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TG3I&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;M1tc&quot;&gt;5.8 — RemoteFunction: запрос-ответ&lt;/h2&gt;
  &lt;p id=&quot;tRjn&quot;&gt;Если тебе нужно получить ответ от сервера, используй &lt;code&gt;RemoteFunction&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;yGCf&quot;&gt;На сервере:&lt;/h3&gt;
  &lt;p id=&quot;RUHV&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;9mOS&quot;&gt;&lt;code&gt;local remoteFunc = Instance.new(&amp;quot;RemoteFunction&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0J7N&quot;&gt;&lt;code&gt;remoteFunc.Name = &amp;quot;GetData&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rcTf&quot;&gt;&lt;code&gt;remoteFunc.Parent = game.ReplicatedStorage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MukM&quot;&gt;&lt;code&gt;remoteFunc.OnServerInvoke = function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;exLW&quot;&gt;&lt;code&gt;        return {coins = 100, level = 1}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ODau&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;UbQZ&quot;&gt;&lt;code&gt;На клиенте:&lt;/code&gt;&lt;/h3&gt;
  &lt;p id=&quot;JDRn&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;G3ar&quot;&gt;&lt;code&gt;local data = game.ReplicatedStorage.GetData:InvokeServer()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hpmT&quot;&gt;&lt;code&gt;print(data.level)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;OFob&quot;&gt;5.9 — Практическое задание&lt;/h2&gt;
  &lt;h3 id=&quot;SBde&quot;&gt;Задача:&lt;/h3&gt;
  &lt;p id=&quot;3mGQ&quot;&gt;Создай систему, которая отслеживает, когда игрок нажимает на кнопку, и увеличивает счётчик нажатий. После 5 нажатий — открывает дверь.&lt;/p&gt;
  &lt;h3 id=&quot;30OZ&quot;&gt;Шаги:&lt;/h3&gt;
  &lt;ol id=&quot;di2S&quot;&gt;
    &lt;li id=&quot;9Epn&quot;&gt;Создай кнопку (&lt;code&gt;Part&lt;/code&gt;) с &lt;code&gt;ClickDetector&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;fG1V&quot;&gt;Создай переменную-счётчик.&lt;/li&gt;
    &lt;li id=&quot;n5kY&quot;&gt;При каждом клике увеличивай счётчик.&lt;/li&gt;
    &lt;li id=&quot;JCaN&quot;&gt;Если счётчик &amp;gt;= 5 — уничтожь дверь или перемести её.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;42M7&quot;&gt;Пример кода:&lt;/h3&gt;
  &lt;p id=&quot;dO9e&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;owp1&quot;&gt;&lt;code&gt;local clickCount = 0&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TG3H&quot;&gt;&lt;code&gt;local door = workspace.Door&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lQim&quot;&gt;&lt;code&gt;workspace.Button.ClickDetector.MouseClick:Connect(function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CxDb&quot;&gt;&lt;code&gt;           clickCount += 1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;v9ER&quot;&gt;&lt;code&gt;           print(&amp;quot;Нажато раз: &amp;quot; .. clickCount)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;xEi6&quot;&gt;&lt;code&gt;           if clickCount &amp;gt;= 5 then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rHkL&quot;&gt;&lt;code&gt;                      door:Destroy()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KkYM&quot;&gt;&lt;code&gt;           end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rN7H&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;RjYv&quot;&gt;5.10 — Советы и рекомендации&lt;/h2&gt;
  &lt;ul id=&quot;yOnm&quot;&gt;
    &lt;li id=&quot;nJNw&quot;&gt;Не забывай проверять существование объекта перед подключением события.&lt;/li&gt;
    &lt;li id=&quot;amnU&quot;&gt;Используй &lt;code&gt;print()&lt;/code&gt; для отладки.&lt;/li&gt;
    &lt;li id=&quot;tqvr&quot;&gt;Убедись, что &lt;code&gt;ClickDetector&lt;/code&gt; установлен и имеет правильный радиус.&lt;/li&gt;
    &lt;li id=&quot;VL7J&quot;&gt;Используй &lt;code&gt;BindableEvent&lt;/code&gt; для внутренней логики.&lt;/li&gt;
    &lt;li id=&quot;CtI6&quot;&gt;Используй &lt;code&gt;RemoteEvent&lt;/code&gt; для связи между клиентом и сервером.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;tLxi&quot;&gt;5.11 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;vKqO&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;QGif&quot;&gt;Event - Событие, которое происходит в игре&lt;/p&gt;
  &lt;p id=&quot;HUGN&quot;&gt;.Connect() - Метод для подписки на событие&lt;/p&gt;
  &lt;p id=&quot;rtE3&quot;&gt;Changed - Событие изменения свойства&lt;/p&gt;
  &lt;p id=&quot;Be01&quot;&gt;Touched - Событие прикосновения объекта&lt;/p&gt;
  &lt;p id=&quot;afUO&quot;&gt;RemoteEvent - Событие между клиентом и сервером&lt;/p&gt;
  &lt;p id=&quot;9Z4A&quot;&gt;RemoteFunction - Вызов функции на сервере с возвратом значения&lt;/p&gt;
  &lt;p id=&quot;Lo5m&quot;&gt;BindableEvent - Локальное событие внутри игры&lt;/p&gt;
  &lt;p id=&quot;7qh8&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;tEgG&quot;&gt;🔹 Глава 6: GUI — Создание интерфейса.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;7r6K&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;mu5N&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;CatB&quot;&gt;
    &lt;li id=&quot;PxlS&quot;&gt;Как создавать и управлять элементами интерфейса (GUI).&lt;/li&gt;
    &lt;li id=&quot;yWyl&quot;&gt;Как использовать &lt;code&gt;ScreenGui&lt;/code&gt;, &lt;code&gt;TextLabel&lt;/code&gt;, &lt;code&gt;TextButton&lt;/code&gt;, &lt;code&gt;ImageButton&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;TGZI&quot;&gt;Как добавлять изображения, анимации и динамическое обновление.&lt;/li&gt;
    &lt;li id=&quot;c4bu&quot;&gt;Как реагировать на действия игрока через кнопки и поля ввода.&lt;/li&gt;
    &lt;li id=&quot;82Zc&quot;&gt;Как правильно размещать элементы на экране с помощью &lt;code&gt;UDim2&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;qxmr&quot;&gt;6.1 — Что такое GUI?&lt;/h2&gt;
  &lt;p id=&quot;gB4j&quot;&gt;GUI (Graphical User Interface) — это графический интерфейс, который игрок видит на экране. Он может содержать:&lt;/p&gt;
  &lt;ul id=&quot;OyHH&quot;&gt;
    &lt;li id=&quot;5VKC&quot;&gt;Текстовые надписи&lt;/li&gt;
    &lt;li id=&quot;twbx&quot;&gt;Кнопки&lt;/li&gt;
    &lt;li id=&quot;Lgw7&quot;&gt;Изображения&lt;/li&gt;
    &lt;li id=&quot;TC2D&quot;&gt;Индикаторы здоровья, очков, таймеров&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;j8gj&quot;&gt;Основные компоненты GUI:&lt;/h3&gt;
  &lt;ul id=&quot;3Ypr&quot;&gt;
    &lt;li id=&quot;yxU7&quot;&gt;&lt;code&gt;ScreenGui&lt;/code&gt; — контейнер для всех элементов интерфейса.&lt;/li&gt;
    &lt;li id=&quot;24qm&quot;&gt;&lt;code&gt;Frame&lt;/code&gt; — панель или фон.&lt;/li&gt;
    &lt;li id=&quot;7yRv&quot;&gt;&lt;code&gt;TextLabel&lt;/code&gt; — текстовая надпись.&lt;/li&gt;
    &lt;li id=&quot;jpbv&quot;&gt;&lt;code&gt;TextButton&lt;/code&gt; — кликабельная кнопка.&lt;/li&gt;
    &lt;li id=&quot;yfFz&quot;&gt;&lt;code&gt;ImageButton&lt;/code&gt; — кнопка с изображением.&lt;/li&gt;
    &lt;li id=&quot;MI0x&quot;&gt;&lt;code&gt;ImageLabel&lt;/code&gt; — отображение картинки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;B9uR&quot;&gt;6.2 — Добавление GUI к игроку&lt;/h2&gt;
  &lt;p id=&quot;LIoX&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;7HUx&quot;&gt;&lt;code&gt;local player = game.Players.LocalPlayer&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;eqGy&quot;&gt;&lt;code&gt;local gui = Instance.new(&amp;quot;ScreenGui&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EjER&quot;&gt;&lt;code&gt;gui.Parent = player.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;E13u&quot;&gt;&lt;code&gt;local label = Instance.new(&amp;quot;TextLabel&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;E9D6&quot;&gt;&lt;code&gt;label.Text = &amp;quot;Добро пожаловать!&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ndFz&quot;&gt;&lt;code&gt;label.Size = UDim2.new(0, 200, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EJcy&quot;&gt;&lt;code&gt;label.Position = UDim2.new(0.5, -100, 0.1, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wUVW&quot;&gt;&lt;code&gt;label.BackgroundColor3 = Color3.fromRGB(255, 255, 255)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;V5KE&quot;&gt;&lt;code&gt;label.TextColor3 = Color3.fromRGB(0, 0, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;U58p&quot;&gt;&lt;code&gt;label.FontSize = Enum.FontSize.Size24&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jofQ&quot;&gt;&lt;code&gt;label.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;oW6k&quot;&gt;6.3 — Работа с размерами и позицией: UDim2&lt;/h2&gt;
  &lt;p id=&quot;nh99&quot;&gt;&lt;code&gt;UDim2&lt;/code&gt; используется для задания размера и положения элементов относительно экрана.&lt;/p&gt;
  &lt;p id=&quot;w6DB&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;3Z1k&quot;&gt;&lt;code&gt;-- Ширина: 200 пикселей, высота: 50 пикселей&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Wo8I&quot;&gt;&lt;code&gt;UDim2.new(0, 200, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ph48&quot;&gt;&lt;code&gt;-- Позиция: по центру по X, 10% сверху по Y&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3LQr&quot;&gt;&lt;code&gt;UDim2.new(0.5, -100, 0.1, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TD5y&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;IopJ&quot;&gt;Значение - Описание&lt;/p&gt;
  &lt;p id=&quot;6s4o&quot;&gt;&lt;code&gt;0, x&lt;/code&gt; - Абсолютное значение в пикселях&lt;/p&gt;
  &lt;p id=&quot;nEfq&quot;&gt;&lt;code&gt;1, x&lt;/code&gt; - Относительное значение (доли от размера родителя)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;NYMH&quot;&gt;6.4 — Создание кнопок&lt;/h2&gt;
  &lt;p id=&quot;9F7R&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;77xJ&quot;&gt;&lt;code&gt;local button = Instance.new(&amp;quot;TextButton&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zwxK&quot;&gt;&lt;code&gt;button.Text = &amp;quot;Нажми меня&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lyx9&quot;&gt;&lt;code&gt;button.Size = UDim2.new(0, 150, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NKLN&quot;&gt;&lt;code&gt;button.Position = UDim2.new(0.5, -75, 0.2, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Y6ba&quot;&gt;&lt;code&gt;button.BackgroundColor3 = Color3.fromRGB(100, 200, 255)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LHND&quot;&gt;&lt;code&gt;button.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Wp0V&quot;&gt;&lt;code&gt;button.MouseButton1Down:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;od64&quot;&gt;&lt;code&gt;            print(&amp;quot;Кнопка нажата!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;n445&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;QkHg&quot;&gt;6.5 — Использование изображений&lt;/h2&gt;
  &lt;h3 id=&quot;qeRA&quot;&gt;ImageLabel — показывает изображение:&lt;/h3&gt;
  &lt;p id=&quot;OnVY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;GC5D&quot;&gt;&lt;code&gt;local image = Instance.new(&amp;quot;ImageLabel&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5lgi&quot;&gt;&lt;code&gt;image.Image = &amp;quot;rbxassetid://123456789&amp;quot; -- замени на нужный ID&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lyic&quot;&gt;&lt;code&gt;image.Size = UDim2.new(0, 100, 0, 100)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;o7wM&quot;&gt;&lt;code&gt;image.Position = UDim2.new(0.05, 0, 0.05, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Qibg&quot;&gt;&lt;code&gt;image.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;iYhE&quot;&gt;ImageButton — кликабельная картинка:&lt;/h3&gt;
  &lt;p id=&quot;lDDR&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;6sBT&quot;&gt;&lt;code&gt;local imageButton = Instance.new(&amp;quot;ImageButton&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;33MQ&quot;&gt;&lt;code&gt;imageButton.Image = &amp;quot;rbxassetid://987654321&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;x8Gz&quot;&gt;&lt;code&gt;imageButton.Size = UDim2.new(0, 100, 0, 100)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;97Hn&quot;&gt;&lt;code&gt;imageButton.Position = UDim2.new(0.05, 0, 0.2, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XFYt&quot;&gt;&lt;code&gt;imageButton.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4BoK&quot;&gt;&lt;code&gt;imageButton.MouseButton1Down:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Yp98&quot;&gt;&lt;code&gt;               print(&amp;quot;Изображение нажато!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UPTH&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;zyVe&quot;&gt;6.6 — Обновление интерфейса в реальном времени&lt;/h2&gt;
  &lt;p id=&quot;yWWE&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;X2gL&quot;&gt;&lt;code&gt;local score = 0&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wk5n&quot;&gt;&lt;code&gt;while true do&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;uHOX&quot;&gt;&lt;code&gt;           wait(1)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NQBa&quot;&gt;&lt;code&gt;           score += 1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;iOym&quot;&gt;&lt;code&gt;           label.Text = &amp;quot;Очки: &amp;quot; .. score&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Jb8x&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;04ln&quot;&gt;6.7 — Проект: Счётчик нажатий&lt;/h2&gt;
  &lt;p id=&quot;YmhJ&quot;&gt;Создадим кнопку, при нажатии на которую увеличивается счётчик.&lt;/p&gt;
  &lt;p id=&quot;B0jm&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;LIvC&quot;&gt;&lt;code&gt;local player = game.Players.LocalPlayer&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zy8g&quot;&gt;&lt;code&gt;local gui = Instance.new(&amp;quot;ScreenGui&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jfL4&quot;&gt;&lt;code&gt;gui.Parent = player.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CZUo&quot;&gt;&lt;code&gt;local scoreLabel = Instance.new(&amp;quot;TextLabel&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YtJU&quot;&gt;&lt;code&gt;scoreLabel.Text = &amp;quot;Счёт: 0&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;2LIQ&quot;&gt;&lt;code&gt;scoreLabel.Size = UDim2.new(0, 200, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;G5zM&quot;&gt;&lt;code&gt;scoreLabel.Position = UDim2.new(0.5, -100, 0.1, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JDOC&quot;&gt;&lt;code&gt;scoreLabel.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WDQd&quot;&gt;&lt;code&gt;local clickButton = Instance.new(&amp;quot;TextButton&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GLuh&quot;&gt;&lt;code&gt;clickButton.Text = &amp;quot;Нажми!&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4O5W&quot;&gt;&lt;code&gt;clickButton.Size = UDim2.new(0, 150, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TINU&quot;&gt;&lt;code&gt;clickButton.Position = UDim2.new(0.5, -75, 0.2, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YGJA&quot;&gt;&lt;code&gt;clickButton.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jg3s&quot;&gt;&lt;code&gt;local score = 0&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;66lI&quot;&gt;&lt;code&gt;clickButton.MouseButton1Down:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;9z3P&quot;&gt;&lt;code&gt;            score += 1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CAgH&quot;&gt;&lt;code&gt;            scoreLabel.Text = &amp;quot;Счёт: &amp;quot; .. score&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KZjI&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;8nop&quot;&gt;6.8 — Советы и рекомендации&lt;/h2&gt;
  &lt;ul id=&quot;mOF7&quot;&gt;
    &lt;li id=&quot;udpA&quot;&gt;Убедись, что GUI находится в &lt;code&gt;PlayerGui&lt;/code&gt;, иначе он не будет отображаться.&lt;/li&gt;
    &lt;li id=&quot;YaiI&quot;&gt;Используй &lt;code&gt;UDim2&lt;/code&gt; для правильного позиционирования.&lt;/li&gt;
    &lt;li id=&quot;Ecwk&quot;&gt;Не забывай удалять старые GUI перед созданием новых.&lt;/li&gt;
    &lt;li id=&quot;bP8T&quot;&gt;Для сложных интерфейсов используй &lt;code&gt;Frame&lt;/code&gt; как контейнер.&lt;/li&gt;
    &lt;li id=&quot;uwVp&quot;&gt;Тестируй GUI на разных разрешениях экрана.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Augr&quot;&gt;6.9 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;j0hA&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;LWr6&quot;&gt;ScreenGui - Основной контейнер для GUI&lt;/p&gt;
  &lt;p id=&quot;ncHL&quot;&gt;TextLabel - Текстовая надпись&lt;/p&gt;
  &lt;p id=&quot;FtGg&quot;&gt;TextButton - Кликабельная кнопка с текстом&lt;/p&gt;
  &lt;p id=&quot;6qec&quot;&gt;ImageLabel - Элемент для отображения изображения&lt;/p&gt;
  &lt;p id=&quot;1N7j&quot;&gt;ImageButton - Кликабельная кнопка с изображением&lt;/p&gt;
  &lt;p id=&quot;Z6Bg&quot;&gt;UDim2 - Размер и позиция элемента&lt;/p&gt;
  &lt;p id=&quot;gpE2&quot;&gt;MouseButton1Down - Событие нажатия мыши/пальца&lt;/p&gt;
  &lt;p id=&quot;sElg&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;0KVu&quot;&gt;🔹 Глава 7: Работа с игроками и персонажами.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;R8zo&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;Z1TZ&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;5Ls7&quot;&gt;
    &lt;li id=&quot;x2Yu&quot;&gt;Как получить доступ к текущему игроку.&lt;/li&gt;
    &lt;li id=&quot;3Upc&quot;&gt;Как управлять персонажем: перемещение, анимация, здоровье.&lt;/li&gt;
    &lt;li id=&quot;jS2I&quot;&gt;Как работать с инвентарём и оружием.&lt;/li&gt;
    &lt;li id=&quot;bO3j&quot;&gt;Как создавать систему здоровья и уровней.&lt;/li&gt;
    &lt;li id=&quot;56Ts&quot;&gt;Как взаимодействовать с другими игроками через чат и UI.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;4fco&quot;&gt;7.1 — Получение информации об игроке&lt;/h2&gt;
  &lt;p id=&quot;b5aA&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;iU6D&quot;&gt;&lt;code&gt;local player = game.Players.LocalPlayer -- Текущий игрок&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LvbG&quot;&gt;&lt;code&gt;print(player.Name) -- Имя игрока&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JL0J&quot;&gt;&lt;code&gt;print(player.UserId) -- Уникальный ID&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;mseE&quot;&gt;&lt;code&gt;print(player.DisplayName) -- Отображаемое имя&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;poNZ&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;lg0m&quot;&gt;Свойства игрока:&lt;/h3&gt;
  &lt;p id=&quot;za8X&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;k8SD&quot;&gt;Свойство - Описание&lt;/p&gt;
  &lt;p id=&quot;HKM2&quot;&gt;&lt;code&gt;Name&lt;/code&gt; - Логин игрока&lt;/p&gt;
  &lt;p id=&quot;iIn3&quot;&gt;&lt;code&gt;UserId&lt;/code&gt; - Уникальный числовой ID&lt;/p&gt;
  &lt;p id=&quot;JNC6&quot;&gt;&lt;code&gt;DisplayName&lt;/code&gt; - Отображаемое имя&lt;/p&gt;
  &lt;p id=&quot;Zlkv&quot;&gt;&lt;code&gt;Character&lt;/code&gt; - Персонаж игрока (если загружен)&lt;/p&gt;
  &lt;p id=&quot;PWe7&quot;&gt;&lt;code&gt;PlayerGui&lt;/code&gt; - Интерфейс игрока&lt;/p&gt;
  &lt;p id=&quot;YJFi&quot;&gt;&lt;code&gt;Team&lt;/code&gt; - Команда игрока&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;m4c9&quot;&gt;7.2 — Работа с персонажем&lt;/h2&gt;
  &lt;p id=&quot;JTPA&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;jl0Z&quot;&gt;&lt;code&gt;local character = player.Character or player.CharacterAdded:Wait()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;HG37&quot;&gt;&lt;code&gt;print(character.Name) -- Обычно &amp;quot;Character&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;8pUf&quot;&gt;Основные части персонажа:&lt;/h3&gt;
  &lt;ul id=&quot;Y9bg&quot;&gt;
    &lt;li id=&quot;wagL&quot;&gt;&lt;code&gt;HumanoidRootPart&lt;/code&gt; — корневая часть (обычно торс).&lt;/li&gt;
    &lt;li id=&quot;4Luy&quot;&gt;&lt;code&gt;Head&lt;/code&gt; — голова.&lt;/li&gt;
    &lt;li id=&quot;rVQd&quot;&gt;&lt;code&gt;Torso&lt;/code&gt; — туловище (устарело, но иногда используется).&lt;/li&gt;
    &lt;li id=&quot;in1j&quot;&gt;&lt;code&gt;Humanoid&lt;/code&gt; — компонент управления жизнью и движениями.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;0d3J&quot;&gt;Перемещение персонажа&lt;/h4&gt;
  &lt;p id=&quot;5kp9&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;APBJ&quot;&gt;&lt;code&gt;character.HumanoidRootPart.CFrame = CFrame.new(0, 10, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;v5aB&quot;&gt;Поворот персонажа&lt;/h4&gt;
  &lt;p id=&quot;QWxO&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;FjmB&quot;&gt;&lt;code&gt;character.HumanoidRootPart.CFrame = CFrame.Angles(0, math.rad(90), 0)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;c78k&quot;&gt;7.3 — Система здоровья&lt;/h2&gt;
  &lt;p id=&quot;wjtP&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;fGaz&quot;&gt;&lt;code&gt;local humanoid = character:FindFirstChildOfClass(&amp;quot;Humanoid&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;P8Qg&quot;&gt;&lt;code&gt;if humanoid then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;PpGd&quot;&gt;&lt;code&gt;            humanoid.HealthChanged:Connect(function(newHealth)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;oxpb&quot;&gt;&lt;code&gt;                        print(&amp;quot;Здоровье: &amp;quot; .. newHealth)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QTX4&quot;&gt;&lt;code&gt;            end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0h70&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;fvkr&quot;&gt;Установка максимального здоровья&lt;/h4&gt;
  &lt;p id=&quot;zz6b&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;FaJS&quot;&gt;&lt;code&gt;humanoid.MaxHealth = 200&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FnlG&quot;&gt;&lt;code&gt;humanoid.Health = 200&lt;/code&gt;&lt;/p&gt;
  &lt;h4 id=&quot;YXrj&quot;&gt;Нанесение урона&lt;/h4&gt;
  &lt;p id=&quot;3ESf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;bFhr&quot;&gt;&lt;code&gt;humanoid.Health -= 50&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;cM7L&quot;&gt;7.4 — Инвентарь игрока&lt;/h2&gt;
  &lt;p id=&quot;iEVa&quot;&gt;Инвентарь хранится в &lt;code&gt;Backpack&lt;/code&gt;. Чтобы добавить предмет:&lt;/p&gt;
  &lt;p id=&quot;qlt2&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;siLp&quot;&gt;&lt;code&gt;local tool = Instance.new(&amp;quot;Tool&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FM0K&quot;&gt;&lt;code&gt;tool.Name = &amp;quot;Меч&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;eAzd&quot;&gt;&lt;code&gt;tool.RequiresHandle = false&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;g7lZ&quot;&gt;&lt;code&gt;tool.TextureId = &amp;quot;rbxassetid://123456789&amp;quot; -- замени на нужный ID&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6OcO&quot;&gt;&lt;code&gt;tool.Parent = player.Backpack&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;P8wo&quot;&gt;Когда игрок возьмёт предмет в руки, он появится в &lt;code&gt;StarterPlayer.StarterCharacter&lt;/code&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;lrKA&quot;&gt;7.5 — Создание системы уровней&lt;/h2&gt;
  &lt;p id=&quot;PsGQ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;SCaY&quot;&gt;&lt;code&gt;-- Добавляем лидерборд&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;k5ch&quot;&gt;&lt;code&gt;local leaderstats = Instance.new(&amp;quot;Folder&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;AqzL&quot;&gt;&lt;code&gt;leaderstats.Name = &amp;quot;leaderstats&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GuxN&quot;&gt;&lt;code&gt;leaderstats.Parent = player&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GqVg&quot;&gt;&lt;code&gt;local level = Instance.new(&amp;quot;IntValue&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;H5FQ&quot;&gt;&lt;code&gt;level.Name = &amp;quot;Level&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TGGA&quot;&gt;&lt;code&gt;level.Value = 1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;enPO&quot;&gt;&lt;code&gt;level.Parent = leaderstats&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gcGX&quot;&gt;&lt;code&gt;local exp = Instance.new(&amp;quot;IntValue&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;oXdd&quot;&gt;&lt;code&gt;exp.Name = &amp;quot;Exp&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LtsT&quot;&gt;&lt;code&gt;exp.Value = 0&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JFdI&quot;&gt;&lt;code&gt;exp.Parent = leaderstats&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;X37X&quot;&gt;&lt;code&gt;-- Функция для повышения уровня&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VhLL&quot;&gt;&lt;code&gt;function addExp(amount)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UCiJ&quot;&gt;&lt;code&gt;          exp.Value += amount&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zNxR&quot;&gt;&lt;code&gt;          if exp.Value &amp;gt;= 100 then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;uquC&quot;&gt;&lt;code&gt;                   exp.Value = 0&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nEh8&quot;&gt;&lt;code&gt;                   level.Value += 1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VKT2&quot;&gt;&lt;code&gt;                   print(&amp;quot;Уровень повышен до &amp;quot; .. level.Value)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yV7f&quot;&gt;&lt;code&gt;          end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UpLn&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WxxE&quot;&gt;&lt;code&gt;-- Вызываем функцию&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XeKI&quot;&gt;&lt;code&gt;addExp(150)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;tKar&quot;&gt;7.6 — Проект: Мини-игра &amp;quot;Бой с боссом&amp;quot;&lt;/h2&gt;
  &lt;p id=&quot;cj1G&quot;&gt;Создадим простого босса, который теряет здоровье при нажатии на него.&lt;/p&gt;
  &lt;h3 id=&quot;7KuC&quot;&gt;Шаг 1: Создай Part для босса&lt;/h3&gt;
  &lt;p id=&quot;2gxs&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;F7rb&quot;&gt;&lt;code&gt;local boss = Instance.new(&amp;quot;Part&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LenU&quot;&gt;&lt;code&gt;boss.Name = &amp;quot;Boss&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;R6sZ&quot;&gt;&lt;code&gt;boss.Size = Vector3.new(5, 5, 5)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;26bD&quot;&gt;&lt;code&gt;boss.BrickColor = BrickColor.Red()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;IYgJ&quot;&gt;&lt;code&gt;boss.Anchored = true&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5q2q&quot;&gt;&lt;code&gt;boss.Position = Vector3.new(0, 5, 20)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VYva&quot;&gt;&lt;code&gt;boss.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;1ZzF&quot;&gt;Шаг 2: Добавь здоровье&lt;/h3&gt;
  &lt;p id=&quot;bqXf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;liiW&quot;&gt;&lt;code&gt;local bossHealth = 100&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tLaG&quot;&gt;&lt;code&gt;boss.Touched:Connect(function(hit)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;sIJ9&quot;&gt;&lt;code&gt;           local character = hit.Parent&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ZYNm&quot;&gt;&lt;code&gt;           local humanoid = character:FindFirstChild(&amp;quot;Humanoid&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lR5A&quot;&gt;&lt;code&gt;           if humanoid then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zzji&quot;&gt;&lt;code&gt;                    bossHealth -= 10&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OdtF&quot;&gt;&lt;code&gt;                    print(&amp;quot;Здоровье босса: &amp;quot; .. bossHealth)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Qmxz&quot;&gt;&lt;code&gt;                    if bossHealth &amp;lt;= 0 then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5jZY&quot;&gt;&lt;code&gt;                              print(&amp;quot;Босс побеждён!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;sQqa&quot;&gt;&lt;code&gt;                              boss:Destroy()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4s89&quot;&gt;&lt;code&gt;                    end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cgpG&quot;&gt;&lt;code&gt;           end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;s8ce&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ulvq&quot;&gt;7.7 — Советы и рекомендации&lt;/h2&gt;
  &lt;ul id=&quot;fLR1&quot;&gt;
    &lt;li id=&quot;FrQF&quot;&gt;Используй &lt;code&gt;CharacterAdded&lt;/code&gt; вместо &lt;code&gt;Character&lt;/code&gt;, чтобы избежать ошибок.&lt;/li&gt;
    &lt;li id=&quot;nc4o&quot;&gt;Проверяй наличие &lt;code&gt;Humanoid&lt;/code&gt; перед его использованием.&lt;/li&gt;
    &lt;li id=&quot;gFJr&quot;&gt;Не забывай очищать старые данные при повторном входе игрока.&lt;/li&gt;
    &lt;li id=&quot;JiJ0&quot;&gt;Используй &lt;code&gt;leaderstats&lt;/code&gt; для отображения статистики.&lt;/li&gt;
    &lt;li id=&quot;WQ7l&quot;&gt;Тестируй взаимодействие с объектами через &lt;code&gt;Touched&lt;/code&gt; и &lt;code&gt;MouseClick&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;r95a&quot;&gt;7.8 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;hA2v&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;mnB4&quot;&gt;LocalPlayer - Текущий игрок&lt;/p&gt;
  &lt;p id=&quot;3qkR&quot;&gt;Character - Модель персонажа&lt;/p&gt;
  &lt;p id=&quot;jM1F&quot;&gt;Humanoid - Управление здоровьем и движением&lt;/p&gt;
  &lt;p id=&quot;lavh&quot;&gt;Backpack - Хранилище предметов игрока&lt;/p&gt;
  &lt;p id=&quot;EuOS&quot;&gt;Leaderstats - Отображение рейтинга игрока&lt;/p&gt;
  &lt;p id=&quot;uGTz&quot;&gt;CFrame - Положение и поворот объекта&lt;/p&gt;
  &lt;p id=&quot;nb5Q&quot;&gt;Touched - Событие прикосновения объекта&lt;/p&gt;
  &lt;p id=&quot;fcq2&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;ENPg&quot;&gt;🔹 Глава 8: Анимация и физика персонажей.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;eIS1&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;sD1B&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;90Yz&quot;&gt;
    &lt;li id=&quot;kZr5&quot;&gt;Как загружать и воспроизводить анимации.&lt;/li&gt;
    &lt;li id=&quot;Euh1&quot;&gt;Как использовать &lt;code&gt;Animator&lt;/code&gt; и &lt;code&gt;AnimationTrack&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;i0RZ&quot;&gt;Как управлять движением персонажа с помощью &lt;code&gt;BodyMovers&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;y6Sm&quot;&gt;Как создавать эффекты полёта, пружинности, телепортации.&lt;/li&gt;
    &lt;li id=&quot;i1Sn&quot;&gt;Как работать с камерой и гравитацией.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Aw9z&quot;&gt;8.1 — Основы анимации в Roblox&lt;/h2&gt;
  &lt;h3 id=&quot;nSSB&quot;&gt;Что такое анимация?&lt;/h3&gt;
  &lt;p id=&quot;aznI&quot;&gt;Анимация в Roblox — это заранее записанный набор движений персонажа. Она может быть:&lt;/p&gt;
  &lt;ul id=&quot;nZlJ&quot;&gt;
    &lt;li id=&quot;tmqf&quot;&gt;Прыжок&lt;/li&gt;
    &lt;li id=&quot;XKMW&quot;&gt;Бег&lt;/li&gt;
    &lt;li id=&quot;nQCu&quot;&gt;Смерть&lt;/li&gt;
    &lt;li id=&quot;JUuL&quot;&gt;Удар мечом&lt;/li&gt;
    &lt;li id=&quot;ZxtI&quot;&gt;И многое другое&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;da5W&quot;&gt;Как получить анимацию?&lt;/h3&gt;
  &lt;p id=&quot;9gbf&quot;&gt;На &lt;a href=&quot;https://www.roblox.com/library&quot; target=&quot;_blank&quot;&gt;https://www.roblox.com/library &lt;/a&gt;можно найти готовые анимации. Каждая имеет свой ID, например: &lt;code&gt;rbxassetid://123456789&lt;/code&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;s9rp&quot;&gt;8.2 — Загрузка и воспроизведение анимации&lt;/h2&gt;
  &lt;p id=&quot;Ac4t&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;bof2&quot;&gt;&lt;code&gt;local player = game.Players.LocalPlayer&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VxUX&quot;&gt;&lt;code&gt;local character = player.Character or player.CharacterAdded:Wait()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Rm02&quot;&gt;&lt;code&gt;local animator = character:FindFirstChildOfClass(&amp;quot;Animator&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VN92&quot;&gt;&lt;code&gt;if animator then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GCc1&quot;&gt;&lt;code&gt;          local animation = Instance.new(&amp;quot;Animation&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SLoO&quot;&gt;&lt;code&gt;          animation.AnimationId = &amp;quot;rbxassetid://123456789&amp;quot; -- замени на нужный ID&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;r329&quot;&gt;&lt;code&gt;          local track = animator:LoadAnimation(animation)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3FBz&quot;&gt;&lt;code&gt;          track:Play()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;bNQX&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;YWkn&quot;&gt;8.3 — Управление анимацией&lt;/h2&gt;
  &lt;h3 id=&quot;Tk3f&quot;&gt;Воспроизведение и остановка&lt;/h3&gt;
  &lt;p id=&quot;UfsN&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;7uAV&quot;&gt;&lt;code&gt;track:Play() -- воспроизвести&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1YkJ&quot;&gt;&lt;code&gt;track:Stop() -- остановить&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;k0dk&quot;&gt;Изменение скорости&lt;/h3&gt;
  &lt;p id=&quot;EtDS&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;E5Z5&quot;&gt;&lt;code&gt;track:AdjustSpeed(2) -- удвоить скорость&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gGjs&quot;&gt;&lt;code&gt;track:AdjustSpeed(0.5) -- замедлить в 2 раза&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;e5OS&quot;&gt;Повтор анимации&lt;/h3&gt;
  &lt;p id=&quot;VtpI&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;L4jT&quot;&gt;&lt;code&gt;track.Looped = true -- зациклить&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;PAky&quot;&gt;8.4 — BodyMovers: управление физикой объектов&lt;/h2&gt;
  &lt;p id=&quot;PPib&quot;&gt;BodyMovers — это компоненты, которые позволяют перемещать объекты с учётом физики.&lt;/p&gt;
  &lt;h3 id=&quot;7G1k&quot;&gt;BodyPosition — перемещение в точку&lt;/h3&gt;
  &lt;p id=&quot;qrGY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;FPwP&quot;&gt;&lt;code&gt;local part = workspace.Part&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;pTKh&quot;&gt;&lt;code&gt;local bodyPos = Instance.new(&amp;quot;BodyPosition&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;xM6I&quot;&gt;&lt;code&gt;bodyPos.Position = Vector3.new(0, 10, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rvxv&quot;&gt;&lt;code&gt;bodyPos.MaxForce = Vector3.new(4000, 4000, 4000)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wR9e&quot;&gt;&lt;code&gt;bodyPos.Parent = part&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;HZSN&quot;&gt;BodyGyro — поворот объекта&lt;/h3&gt;
  &lt;p id=&quot;uhZu&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;pLSf&quot;&gt;&lt;code&gt;local bodyGyro = Instance.new(&amp;quot;BodyGyro&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;9uFm&quot;&gt;&lt;code&gt;bodyGyro.CFrame = CFrame.Angles(0, math.rad(90), 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hKJn&quot;&gt;&lt;code&gt;bodyGyro.MaxTorque = Vector3.new(4000, 4000, 4000)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ggbe&quot;&gt;&lt;code&gt;bodyGyro.Parent = part&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;SOop&quot;&gt;BodyVelocity — постоянное движение&lt;/h3&gt;
  &lt;p id=&quot;pmnZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;rLiH&quot;&gt;local velocity = Instance.new(&amp;quot;BodyVelocity&amp;quot;)&lt;/p&gt;
  &lt;p id=&quot;b59r&quot;&gt;velocity.Velocity = Vector3.new(0, 0, 10) -- движение вперёд&lt;/p&gt;
  &lt;p id=&quot;QyzD&quot;&gt;velocity.MaxForce = Vector3.new(4000, 4000, 4000)&lt;/p&gt;
  &lt;p id=&quot;oDuo&quot;&gt;velocity.Parent = part&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;2dk6&quot;&gt;8.5 — Создание летающего объекта&lt;/h2&gt;
  &lt;p id=&quot;zvA1&quot;&gt;Создадим простой летающий диск, который будет подниматься вверх.&lt;/p&gt;
  &lt;p id=&quot;loPy&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;wRM6&quot;&gt;&lt;code&gt;local disc = workspace.Disc&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;L74t&quot;&gt;&lt;code&gt;while true do&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yr5w&quot;&gt;&lt;code&gt;          wait(0.1)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VWf1&quot;&gt;&lt;code&gt;          disc.CFrame = disc.CFrame * CFrame.Angles(0, math.rad(10), 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VkKN&quot;&gt;&lt;code&gt;          local bodyPos = Instance.new(&amp;quot;BodyPosition&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ztwo&quot;&gt;&lt;code&gt;          bodyPos.Position = disc.Position + Vector3.new(0, 0.5, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;fzrw&quot;&gt;&lt;code&gt;          bodyPos.MaxForce = Vector3.new(4000, 4000, 4000)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;K5lv&quot;&gt;&lt;code&gt;          bodyPos.Parent = disc&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JkXe&quot;&gt;&lt;code&gt;          wait(1)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;x5tH&quot;&gt;&lt;code&gt;          bodyPos:Destroy()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ZbPO&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;AGQ5&quot;&gt;8.6 — Проект: Полёт персонажа&lt;/h2&gt;
  &lt;p id=&quot;334c&quot;&gt;Добавим игроку способность летать при нажатии на кнопку.&lt;/p&gt;
  &lt;h3 id=&quot;4kwp&quot;&gt;Шаг 1: Создай GUI кнопку&lt;/h3&gt;
  &lt;p id=&quot;uWgZ&quot;&gt; &lt;/p&gt;
  &lt;p id=&quot;PuBd&quot;&gt;&lt;code&gt;local gui = Instance.new(&amp;quot;ScreenGui&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dg81&quot;&gt;&lt;code&gt;gui.Parent = game.Players.LocalPlayer.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cCbI&quot;&gt;&lt;code&gt;local flyButton = Instance.new(&amp;quot;TextButton&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0HlU&quot;&gt;&lt;code&gt;flyButton.Text = &amp;quot;Лететь&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Mia7&quot;&gt;&lt;code&gt;flyButton.Size = UDim2.new(0, 100, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nX8v&quot;&gt;&lt;code&gt;flyButton.Position = UDim2.new(0.8, 0, 0.8, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gEKa&quot;&gt;&lt;code&gt;flyButton.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;QjPQ&quot;&gt;Шаг 2: Добавь функционал&lt;/h3&gt;
  &lt;p id=&quot;kgcw&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;4I0x&quot;&gt;&lt;code&gt;local flying = false&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ex96&quot;&gt;&lt;code&gt;local bodyGyro&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6mTp&quot;&gt;&lt;code&gt;local bodyVelocity&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;RHdJ&quot;&gt;&lt;code&gt;flyButton.MouseButton1Down:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;z59B&quot;&gt;&lt;code&gt;          flying = not flying&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EduQ&quot;&gt;&lt;code&gt;          if flying then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;C5i6&quot;&gt;&lt;code&gt;                    local character = game.Players.LocalPlayer.Character&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jv2t&quot;&gt;&lt;code&gt;                    local root = character.HumanoidRootPart&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gejk&quot;&gt;&lt;code&gt;                    bodyGyro = Instance.new(&amp;quot;BodyGyro&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;bnjF&quot;&gt;&lt;code&gt;                    bodyGyro.P = 1000&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TjM9&quot;&gt;&lt;code&gt;                    bodyGyro.D = 100&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6SKl&quot;&gt;&lt;code&gt;                    bodyGyro.MaxTorque = Vector3.new(4000, 4000, 4000)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1GJv&quot;&gt;&lt;code&gt;                    bodyGyro.Parent = root&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lTXh&quot;&gt;&lt;code&gt;                    bodyVelocity = Instance.new(&amp;quot;BodyVelocity&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;RkMe&quot;&gt;&lt;code&gt;                    bodyVelocity.Velocity = Vector3.new(0, 5, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;N7gr&quot;&gt;&lt;code&gt;                    bodyVelocity.MaxForce = Vector3.new(4000, 4000, 4000)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UJrw&quot;&gt;&lt;code&gt;                    bodyVelocity.Parent = root&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;AUQ1&quot;&gt;&lt;code&gt;          else&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;X6vm&quot;&gt;&lt;code&gt;                    if bodyGyro then bodyGyro:Destroy() end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QVTN&quot;&gt;&lt;code&gt;                    if bodyVelocity then bodyVelocity:Destroy() end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Dn3K&quot;&gt;&lt;code&gt;          end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UK2I&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;C0cE&quot;&gt;8.7 — Советы и рекомендации&lt;/h2&gt;
  &lt;ul id=&quot;Mq6R&quot;&gt;
    &lt;li id=&quot;PEQB&quot;&gt;Не забывай удалять старые BodyMovers, чтобы избежать багов.&lt;/li&gt;
    &lt;li id=&quot;X0PN&quot;&gt;Тестируй анимации перед использованием.&lt;/li&gt;
    &lt;li id=&quot;37ys&quot;&gt;Используй &lt;code&gt;CFrame&lt;/code&gt; для плавного движения.&lt;/li&gt;
    &lt;li id=&quot;UnVf&quot;&gt;Для сложных механик используй &lt;code&gt;RunService&lt;/code&gt; и &lt;code&gt;Heartbeat&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;IshT&quot;&gt;Сохраняй ссылки на треки и траектории, чтобы их можно было остановить.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Ckv1&quot;&gt;8.8 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;M8Oc&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;LpVc&quot;&gt;Animation - Анимация персонажа&lt;/p&gt;
  &lt;p id=&quot;rsVA&quot;&gt;Animator - Компонент для управления анимациями&lt;/p&gt;
  &lt;p id=&quot;GYMc&quot;&gt;BodyPosition - Перемещает объект в заданную точку&lt;/p&gt;
  &lt;p id=&quot;ybc7&quot;&gt;BodyGyro - Поворачивает объект&lt;/p&gt;
  &lt;p id=&quot;KtgY&quot;&gt;BodyVelocity - Заставляет объект двигаться постоянно&lt;/p&gt;
  &lt;p id=&quot;Cirj&quot;&gt;CFrame - Позиция и поворот объекта&lt;/p&gt;
  &lt;p id=&quot;TPHL&quot;&gt;Loop - Повтор анимации&lt;/p&gt;
  &lt;p id=&quot;Wy5t&quot;&gt;MaxForce / MaxTorque - Максимальная сила воздействия&lt;/p&gt;
  &lt;p id=&quot;E9nH&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;tlUi&quot;&gt;🔹 Глава 9: Сохранение данных с DataStore.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ZVGD&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;zRWK&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;OrZx&quot;&gt;
    &lt;li id=&quot;PXIP&quot;&gt;Как сохранять данные игрока между сессиями.&lt;/li&gt;
    &lt;li id=&quot;uKyp&quot;&gt;Как использовать &lt;code&gt;DataStoreService&lt;/code&gt; и работать с хранилищами.&lt;/li&gt;
    &lt;li id=&quot;6Vlw&quot;&gt;Как сохранять таблицы, числа, строки и сложные структуры.&lt;/li&gt;
    &lt;li id=&quot;wfMX&quot;&gt;Как обрабатывать ошибки при работе с данными.&lt;/li&gt;
    &lt;li id=&quot;ecYF&quot;&gt;Как создать полноценную систему сохранения прогресса: уровень, монеты, инвентарь и т.д.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;IenT&quot;&gt;9.1 — Что такое DataStore?&lt;/h2&gt;
  &lt;p id=&quot;Ranp&quot;&gt;&lt;code&gt;DataStore&lt;/code&gt; — это система хранения данных в Roblox, которая позволяет сохранять информацию о игроке даже после выхода из игры.&lt;/p&gt;
  &lt;h3 id=&quot;N23y&quot;&gt;Основные понятия:&lt;/h3&gt;
  &lt;p id=&quot;VcYF&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;N5yy&quot;&gt;DataStoreService - Сервис для работы с хранилищами&lt;/p&gt;
  &lt;p id=&quot;V3fT&quot;&gt;DataStore - Конкретное хранилище (например, &amp;quot;PlayerStats&amp;quot;)&lt;/p&gt;
  &lt;p id=&quot;IYAG&quot;&gt;Key - Уникальный идентификатор записи (например, ID игрока)&lt;/p&gt;
  &lt;p id=&quot;9Fjh&quot;&gt;SetAsync / GetAsync - Методы для сохранения и получения данных&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;3cFS&quot;&gt;9.2 — Подключение к DataStore&lt;/h2&gt;
  &lt;p id=&quot;ulJf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;gFbM&quot;&gt;&lt;code&gt;local ds = game:GetService(&amp;quot;DataStoreService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YrIj&quot;&gt;&lt;code&gt;local playerDataStore = ds:GetDataStore(&amp;quot;PlayerStats&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;qIjR&quot;&gt;9.3 — Сохранение данных&lt;/h2&gt;
  &lt;p id=&quot;NHa9&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;DrzI&quot;&gt;&lt;code&gt;-- Сохраняем данные игрока&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1Iuq&quot;&gt;&lt;code&gt;playerDataStore:SetAsync(&amp;quot;player_123&amp;quot;, {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;vklO&quot;&gt;&lt;code&gt;coins = 100,&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BCfY&quot;&gt;&lt;code&gt;    level = 1,&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QA4l&quot;&gt;&lt;code&gt;    inventory = {&amp;quot;Меч&amp;quot;, &amp;quot;Щит&amp;quot;}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dDTn&quot;&gt;&lt;code&gt;})&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;pp4u&quot;&gt;9.4 — Получение данных&lt;/h2&gt;
  &lt;p id=&quot;CNKL&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;zFlz&quot;&gt;&lt;code&gt;local data = playerDataStore:GetAsync(&amp;quot;player_123&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;moEm&quot;&gt;&lt;code&gt;if data then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;HO1X&quot;&gt;&lt;code&gt;    print(&amp;quot;Уровень: &amp;quot; .. data.level)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;iGKM&quot;&gt;&lt;code&gt;    print(&amp;quot;Монеты: &amp;quot; .. data.coins)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ZL5i&quot;&gt;&lt;code&gt;else&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OiLu&quot;&gt;&lt;code&gt;    print(&amp;quot;Нет сохранённых данных.&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;aAxQ&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;QwVb&quot;&gt;9.5 — Обработка ошибок&lt;/h2&gt;
  &lt;p id=&quot;6ooT&quot;&gt;Работа с &lt;code&gt;DataStore&lt;/code&gt; может вызвать ошибки (например, нет подключения). Используй &lt;code&gt;pcall()&lt;/code&gt; или &lt;code&gt;xpcall()&lt;/code&gt;:&lt;/p&gt;
  &lt;p id=&quot;UujB&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;EO02&quot;&gt;&lt;code&gt;local success, result = pcall(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1kZf&quot;&gt;&lt;code&gt;    return playerDataStore:GetAsync(&amp;quot;player_123&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;05QE&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cgjG&quot;&gt;&lt;code&gt;if success then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;7LU1&quot;&gt;&lt;code&gt;    print(result)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;uXf4&quot;&gt;&lt;code&gt;else&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;l55V&quot;&gt;&lt;code&gt;    warn(&amp;quot;Ошибка при получении данных: &amp;quot; .. result)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cp0J&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;2Xz8&quot;&gt;9.6 — Сохранение при входе и выходе&lt;/h2&gt;
  &lt;p id=&quot;GHkx&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;TJlS&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;snQd&quot;&gt;&lt;code&gt;    local userId = &amp;quot;player_&amp;quot; .. player.UserId&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MmPj&quot;&gt;&lt;code&gt;    local data = playerDataStore:GetAsync(userId)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5RKk&quot;&gt;&lt;code&gt;    if not data then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JePp&quot;&gt;&lt;code&gt;        data = {coins = 0, level = 1}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;m192&quot;&gt;&lt;code&gt;    end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;pX1U&quot;&gt;&lt;code&gt;    -- Создаём лидерборд&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rKtn&quot;&gt;&lt;code&gt;    local leaderstats = Instance.new(&amp;quot;Folder&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Uun9&quot;&gt;&lt;code&gt;    leaderstats.Name = &amp;quot;leaderstats&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Xd3Y&quot;&gt;&lt;code&gt;    leaderstats.Parent = player&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1Sif&quot;&gt;&lt;code&gt;    local coins = Instance.new(&amp;quot;IntValue&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4CK6&quot;&gt;&lt;code&gt;    coins.Name = &amp;quot;Coins&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Wwqb&quot;&gt;&lt;code&gt;    coins.Value = data.coins&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;oanb&quot;&gt;&lt;code&gt;    coins.Parent = leaderstats&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Dz8P&quot;&gt;&lt;code&gt;    local level = Instance.new(&amp;quot;IntValue&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tdo9&quot;&gt;&lt;code&gt;    level.Name = &amp;quot;Level&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tIes&quot;&gt;&lt;code&gt;    level.Value = data.level&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zidF&quot;&gt;&lt;code&gt;    level.Parent = leaderstats&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ffDZ&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Tvv6&quot;&gt;&lt;code&gt;game.Players.PlayerRemoving:Connect(function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Mryt&quot;&gt;&lt;code&gt;    local userId = &amp;quot;player_&amp;quot; .. player.UserId&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;haNz&quot;&gt;&lt;code&gt;    local leaderstats = player:FindFirstChild(&amp;quot;leaderstats&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Tuxj&quot;&gt;&lt;code&gt;    if leaderstats then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NTl5&quot;&gt;&lt;code&gt;        local coins = leaderstats:FindFirstChild(&amp;quot;Coins&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;R6Ti&quot;&gt;&lt;code&gt;        local level = leaderstats:FindFirstChild(&amp;quot;Level&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GD1a&quot;&gt;&lt;code&gt;        if coins and level then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dDw9&quot;&gt;&lt;code&gt;            playerDataStore:SetAsync(userId, {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Dz7c&quot;&gt;&lt;code&gt;                coins = coins.Value,&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Lc2E&quot;&gt;&lt;code&gt;                level = level.Value&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EtYZ&quot;&gt;&lt;code&gt;            })&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;9LEf&quot;&gt;&lt;code&gt;        end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WfpY&quot;&gt;&lt;code&gt;    end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Mzc1&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;d8iC&quot;&gt;9.7 — Проект: Система магазина и покупок&lt;/h2&gt;
  &lt;p id=&quot;apmH&quot;&gt;Создадим простой магазин, где игрок может купить предмет за монеты.&lt;/p&gt;
  &lt;h3 id=&quot;mCoU&quot;&gt;Шаг 1: Добавь кнопку в GUI&lt;/h3&gt;
  &lt;p id=&quot;wM8i&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;3cr1&quot;&gt;&lt;code&gt;local gui = Instance.new(&amp;quot;ScreenGui&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;pHn9&quot;&gt;&lt;code&gt;gui.Parent = game.Players.LocalPlayer.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SkTm&quot;&gt;&lt;code&gt;local buyButton = Instance.new(&amp;quot;TextButton&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;bq33&quot;&gt;&lt;code&gt;buyButton.Text = &amp;quot;Купить меч&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ounF&quot;&gt;&lt;code&gt;buyButton.Size = UDim2.new(0, 150, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BS6H&quot;&gt;&lt;code&gt;buyButton.Position = UDim2.new(0.5, -75, 0.2, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;B4oV&quot;&gt;&lt;code&gt;buyButton.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;B9mV&quot;&gt;Шаг 2: Реализуй логику покупки&lt;/h3&gt;
  &lt;p id=&quot;H3F6&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;adxU&quot;&gt;&lt;code&gt;buyButton.MouseButton1Down:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FbHE&quot;&gt;&lt;code&gt;    local player = game.Players.LocalPlayer&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NJa2&quot;&gt;&lt;code&gt;    local leaderstats = player:FindFirstChild(&amp;quot;leaderstats&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;fXSw&quot;&gt;&lt;code&gt;    local coins = leaderstats and leaderstats:FindFirstChild(&amp;quot;Coins&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tKM9&quot;&gt;&lt;code&gt;    if coins and coins.Value &amp;gt;= 50 then&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FMsz&quot;&gt;&lt;code&gt;        coins.Value -= 50&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;x6Jy&quot;&gt;&lt;code&gt;        print(&amp;quot;Вы купили меч!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MmwQ&quot;&gt;&lt;code&gt;        local tool = Instance.new(&amp;quot;Tool&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hIrI&quot;&gt;&lt;code&gt;        tool.Name = &amp;quot;Меч&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;mNmq&quot;&gt;&lt;code&gt;        tool.RequiresHandle = false&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;whos&quot;&gt;&lt;code&gt;        tool.TextureId = &amp;quot;rbxassetid://123456789&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;9IP8&quot;&gt;&lt;code&gt;        tool.Parent = player.Backpack&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;V1rp&quot;&gt;&lt;code&gt;    else&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6Pf9&quot;&gt;&lt;code&gt;        print(&amp;quot;Недостаточно монет!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LoIz&quot;&gt;&lt;code&gt;    end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;xaf0&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;K99b&quot;&gt;9.8 — Советы и рекомендации&lt;/h2&gt;
  &lt;ul id=&quot;lCs4&quot;&gt;
    &lt;li id=&quot;GYYh&quot;&gt;Не сохраняй слишком большие объекты в DataStore.&lt;/li&gt;
    &lt;li id=&quot;v39m&quot;&gt;Используй уникальные ключи для каждого игрока.&lt;/li&gt;
    &lt;li id=&quot;4FYQ&quot;&gt;Добавляй обработку ошибок, особенно при публикации.&lt;/li&gt;
    &lt;li id=&quot;O76q&quot;&gt;Проверяй наличие &lt;code&gt;leaderstats&lt;/code&gt; перед изменением.&lt;/li&gt;
    &lt;li id=&quot;PTHw&quot;&gt;Используй отдельные хранилища для разных типов данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;G8hu&quot;&gt;9.9 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;DZvL&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;9rTm&quot;&gt;DataStoreService - Сервис для работы с хранилищами&lt;/p&gt;
  &lt;p id=&quot;BjV1&quot;&gt;DataStore - Хранилище с данными&lt;/p&gt;
  &lt;p id=&quot;t1MT&quot;&gt;SetAsync - Сохраняет данные по ключу&lt;/p&gt;
  &lt;p id=&quot;ShiE&quot;&gt;GetAsync - Получает данные по ключу&lt;/p&gt;
  &lt;p id=&quot;keql&quot;&gt;pcall - Безопасный вызов функции&lt;/p&gt;
  &lt;p id=&quot;6BKs&quot;&gt;Leaderstats - Отображение рейтинга игрока&lt;/p&gt;
  &lt;p id=&quot;zr4P&quot;&gt;Inventory - Инвентарь игрока&lt;/p&gt;
  &lt;p id=&quot;MjUy&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;ZckZ&quot;&gt;🔹 Глава 10: Клиент-серверное взаимодействие.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;qAU7&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;HBwY&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;pfmF&quot;&gt;
    &lt;li id=&quot;xmWI&quot;&gt;Что такое клиент и сервер в Roblox.&lt;/li&gt;
    &lt;li id=&quot;aMfZ&quot;&gt;Как использовать &lt;code&gt;RemoteEvent&lt;/code&gt; и &lt;code&gt;RemoteFunction&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;eFsV&quot;&gt;Как безопасно передавать данные между клиентом и сервером.&lt;/li&gt;
    &lt;li id=&quot;5yKB&quot;&gt;Как создавать команды, меню, чат и другие интерактивные элементы.&lt;/li&gt;
    &lt;li id=&quot;JrHb&quot;&gt;Как избежать распространённых ошибок безопасности.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;CV7M&quot;&gt;10.1 — Архитектура клиент-сервер в Roblox&lt;/h2&gt;
  &lt;p id=&quot;rHe0&quot;&gt;Roblox использует клиент-серверную архитектуру:&lt;/p&gt;
  &lt;p id=&quot;uNZd&quot;&gt;Сторона - Описание&lt;/p&gt;
  &lt;p id=&quot;JCcM&quot;&gt;Сервер - Обрабатывает логику игры, данные, события.&lt;/p&gt;
  &lt;p id=&quot;BOww&quot;&gt;Клиент - Отображает графику, обрабатывает ввод игрока.&lt;/p&gt;
  &lt;p id=&quot;ok31&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;AUoc&quot;&gt;Почему важно разделять логику?&lt;/h3&gt;
  &lt;ul id=&quot;DEGe&quot;&gt;
    &lt;li id=&quot;wfZR&quot;&gt;Безопасность: игрок не должен управлять важными данными напрямую.&lt;/li&gt;
    &lt;li id=&quot;EP6f&quot;&gt;Производительность: тяжёлые вычисления лучше выполнять на сервере.&lt;/li&gt;
    &lt;li id=&quot;67Wi&quot;&gt;Централизация: все игроки видят одни и те же данные.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;26r2&quot;&gt;10.2 — RemoteEvent: передача событий от клиента к серверу&lt;/h2&gt;
  &lt;p id=&quot;tHVF&quot;&gt;&lt;code&gt;RemoteEvent&lt;/code&gt; используется для отправки информации от клиента к серверу (например, нажатие кнопки).&lt;/p&gt;
  &lt;h3 id=&quot;u2fS&quot;&gt;На сервере:&lt;/h3&gt;
  &lt;p id=&quot;6Zwf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Z26C&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5NPx&quot;&gt;&lt;code&gt;local remote = Instance.new(&amp;quot;RemoteEvent&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hnm9&quot;&gt;&lt;code&gt;remote.Name = &amp;quot;PlayerJumped&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wooH&quot;&gt;&lt;code&gt;remote.Parent = game.ReplicatedStorage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tojq&quot;&gt;&lt;code&gt;remote.OnServerEvent:Connect(function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Az3S&quot;&gt;&lt;code&gt;    print(player.Name .. &amp;quot; прыгнул!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5wCt&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;o2jd&quot;&gt;На клиенте (LocalScript):&lt;/h3&gt;
  &lt;p id=&quot;JUpn&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;4jNR&quot;&gt;&lt;code&gt;-- StarterPlayerScripts&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Sd31&quot;&gt;&lt;code&gt;local remote = game.ReplicatedStorage.PlayerJumped&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WLGk&quot;&gt;&lt;code&gt;game.Players.LocalPlayer.Character.Humanoid.Jumped:Connect(function()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wjx4&quot;&gt;&lt;code&gt;    remote:FireServer()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gaca&quot;&gt;&lt;code&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;H94D&quot;&gt;10.3 — RemoteFunction: запрос-ответ между клиентом и сервером&lt;/h2&gt;
  &lt;p id=&quot;Kllu&quot;&gt;&lt;code&gt;RemoteFunction&lt;/code&gt; позволяет запрашивать данные с сервера и получать ответ.&lt;/p&gt;
  &lt;h3 id=&quot;3mXi&quot;&gt;На сервере:&lt;/h3&gt;
  &lt;p id=&quot;x7js&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;UaMf&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Rd4h&quot;&gt;&lt;code&gt;local remoteFunc = Instance.new(&amp;quot;RemoteFunction&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0Pjx&quot;&gt;&lt;code&gt;remoteFunc.Name = &amp;quot;GetData&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5RHG&quot;&gt;&lt;code&gt;remoteFunc.Parent = game.ReplicatedStorage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XtBg&quot;&gt;&lt;code&gt;remoteFunc.OnServerInvoke = function(player)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;v5Ce&quot;&gt;&lt;code&gt;    return {coins = 100, level = 1}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wym8&quot;&gt;&lt;code&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;UHij&quot;&gt;На клиенте:&lt;/h3&gt;
  &lt;p id=&quot;aCxG&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;F4Ed&quot;&gt;&lt;code&gt;-- LocalScript&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Z9e7&quot;&gt;&lt;code&gt;local data = game.ReplicatedStorage.GetData:InvokeServer()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;n8hW&quot;&gt;&lt;code&gt;print(data.level)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;LmSG&quot;&gt;10.4 — Использование ReplicatedStorage&lt;/h2&gt;
  &lt;p id=&quot;kiju&quot;&gt;&lt;code&gt;ReplicatedStorage&lt;/code&gt; — это папка, которая доступна как на сервере, так и на клиенте. Именно здесь следует хранить &lt;code&gt;RemoteEvent&lt;/code&gt; и &lt;code&gt;RemoteFunction&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;Ji1H&quot;&gt;Пример структуры:&lt;/h3&gt;
  &lt;p id=&quot;WYAx&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;wfIV&quot;&gt;&lt;code&gt;ReplicatedStorage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;s6dM&quot;&gt;&lt;code&gt;│&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0eqm&quot;&gt;&lt;code&gt;├── RemoteEvents&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cmhE&quot;&gt;&lt;code&gt;│ └── PlayerJumped&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;uNPA&quot;&gt;&lt;code&gt;│&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Dkd5&quot;&gt;&lt;code&gt;└── RemoteFunctions&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nwAB&quot;&gt;&lt;code&gt;└── GetData&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ODMg&quot;&gt;10.5 — Создание системы команд&lt;/h2&gt;
  &lt;p id=&quot;hQ6g&quot;&gt;Создадим простую систему команд, где игрок может ввести &lt;code&gt;/fly on&lt;/code&gt; или &lt;code&gt;/fly off&lt;/code&gt;, чтобы активировать полёт.&lt;/p&gt;
  &lt;h3 id=&quot;wgom&quot;&gt;Шаг 1: Добавь скрипт на сервере&lt;/h3&gt;
  &lt;p id=&quot;CJWC&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;pYIh&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;br /&gt;local commands = {}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Zzpw&quot;&gt;&lt;code&gt;function commands.fly(player, args)&lt;br /&gt;    local enabled = args[1] == &amp;quot;on&amp;quot;&lt;br /&gt;    local character = player.Character&lt;br /&gt;    if not character then return end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3ZDa&quot;&gt;&lt;code&gt;    local root = character:FindFirstChild(&amp;quot;HumanoidRootPart&amp;quot;)&lt;br /&gt;    if not root then return end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;xPp3&quot;&gt;&lt;code&gt;    local bodyGyro = root:FindFirstChild(&amp;quot;FlyGyro&amp;quot;)&lt;br /&gt;    if enabled and not bodyGyro then&lt;br /&gt;        bodyGyro = Instance.new(&amp;quot;BodyGyro&amp;quot;)&lt;br /&gt;        bodyGyro.P = 1000&lt;br /&gt;        bodyGyro.D = 100&lt;br /&gt;        bodyGyro.MaxTorque = Vector3.new(4000, 4000, 4000)&lt;br /&gt;        bodyGyro.Parent = root&lt;br /&gt;    elseif not enabled and bodyGyro then&lt;br /&gt;        bodyGyro:Destroy()&lt;br /&gt;    end&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XmkT&quot;&gt;&lt;code&gt;— Подключаем обработчик команд&lt;br /&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    player.Chatted:Connect(function(message)&lt;br /&gt;        local prefix = &amp;quot;/&amp;quot;&lt;br /&gt;        if message:sub(1, 1) == prefix then&lt;br /&gt;            local cmd = message:sub(2):split(&amp;quot; &amp;quot;)&lt;br /&gt;            local commandName = cmd[1]&lt;br /&gt;            if commands[commandName] then&lt;br /&gt;                table.remove(cmd, 1)&lt;br /&gt;                commands[commandName](player, cmd)&lt;br /&gt;            end&lt;br /&gt;        end&lt;br /&gt;    end)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;z4WN&quot;&gt;10.6 — Советы по безопасности&lt;/h2&gt;
  &lt;ul id=&quot;ZlxY&quot;&gt;
    &lt;li id=&quot;NBtj&quot;&gt;Не доверяй данным от клиента — всегда проверяй их на сервере.&lt;/li&gt;
    &lt;li id=&quot;V3G7&quot;&gt;Используй &lt;code&gt;RemoteEvent&lt;/code&gt; только для безопасных действий.&lt;/li&gt;
    &lt;li id=&quot;XEE0&quot;&gt;Избегай выполнения важных операций на клиенте.&lt;/li&gt;
    &lt;li id=&quot;95WB&quot;&gt;Проверяй, является ли игрок владельцем объекта.&lt;/li&gt;
    &lt;li id=&quot;Y21C&quot;&gt;Используй &lt;code&gt;IsA()&lt;/code&gt; для проверки типа объекта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;kksb&quot;&gt;10.7 — Проект: Чат с командами&lt;/h2&gt;
  &lt;p id=&quot;2r3x&quot;&gt;Добавим в игру возможность вводить команды через чат.&lt;/p&gt;
  &lt;h3 id=&quot;gktc&quot;&gt;Шаг 1: Обработка сообщений&lt;/h3&gt;
  &lt;p id=&quot;vTwe&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;BwvH&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;br /&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    player.Chatted:Connect(function(message)&lt;br /&gt;        if message:sub(1, 1) == &amp;quot;/&amp;quot; then&lt;br /&gt;            local args = string.split(message:sub(2), &amp;quot; &amp;quot;)&lt;br /&gt;            local command = args[1]&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;myMb&quot;&gt;&lt;code&gt;            if command == &amp;quot;heal&amp;quot; then&lt;br /&gt;                local targetName = args[2]&lt;br /&gt;                local amount = tonumber(args[3])&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;m3ot&quot;&gt;&lt;code&gt;                if targetName and amount then&lt;br /&gt;                    local target = game.Players:FindFirstChild(targetName)&lt;br /&gt;                    if target then&lt;br /&gt;                        local humanoid = target.Character and target.Character:FindFirstChild(&amp;quot;Humanoid&amp;quot;)&lt;br /&gt;                        if humanoid then&lt;br /&gt;                            humanoid.Health += amount&lt;br /&gt;                            print(player.Name .. &amp;quot; вылечил &amp;quot; .. target.Name .. &amp;quot; на &amp;quot; .. amount)&lt;br /&gt;                        end&lt;br /&gt;                    end&lt;br /&gt;                end&lt;br /&gt;            end&lt;br /&gt;        end&lt;br /&gt;    end)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;j8RA&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;CEFa&quot;&gt;10.8 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;LG0d&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;eFtQ&quot;&gt;RemoteEvent - Передача данных от клиента к серверу&lt;/p&gt;
  &lt;p id=&quot;9ZzV&quot;&gt;RemoteFunction - Запрос-ответ между клиентом и сервером&lt;/p&gt;
  &lt;p id=&quot;zFhP&quot;&gt;ReplicatedStorage - Хранилище объектов, доступных всем сторонам&lt;/p&gt;
  &lt;p id=&quot;hvyW&quot;&gt;Client - Сторона, связанная с игроком&lt;/p&gt;
  &lt;p id=&quot;FMZu&quot;&gt;Server - Центральная часть игры, обрабатывающая логику&lt;/p&gt;
  &lt;p id=&quot;wqJm&quot;&gt;FireServer - Вызов события на сервере&lt;/p&gt;
  &lt;p id=&quot;w9Ju&quot;&gt;InvokeServer - Вызов функции на сервере с ожиданием результата&lt;/p&gt;
  &lt;p id=&quot;V3Pv&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;6Naz&quot;&gt;🔹 Глава 11: Модульные скрипты и библиотеки.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;jdEu&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;93Hi&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;zme8&quot;&gt;
    &lt;li id=&quot;8Ig1&quot;&gt;Как создавать модульные скрипты (ModuleScript).&lt;/li&gt;
    &lt;li id=&quot;jAK8&quot;&gt;Как использовать &lt;code&gt;require()&lt;/code&gt; для подключения библиотек.&lt;/li&gt;
    &lt;li id=&quot;CcD8&quot;&gt;Как упорядочивать код в больших проектах.&lt;/li&gt;
    &lt;li id=&quot;dMXm&quot;&gt;Как создавать переиспользуемые функции для GUI, инвентаря, событий и т.д.&lt;/li&gt;
    &lt;li id=&quot;xdez&quot;&gt;Как работать с таблицами как с классами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;6hXk&quot;&gt;11.1 — Что такое ModuleScript?&lt;/h2&gt;
  &lt;p id=&quot;MSCB&quot;&gt;&lt;code&gt;ModuleScript&lt;/code&gt; — это специальный тип скрипта, который возвращает значение (обычно таблицу), которое можно использовать в других скриптах через &lt;code&gt;require()&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;fo1b&quot;&gt;Преимущества:&lt;/h3&gt;
  &lt;ul id=&quot;2X6x&quot;&gt;
    &lt;li id=&quot;YbFj&quot;&gt;Повторное использование кода.&lt;/li&gt;
    &lt;li id=&quot;cbNN&quot;&gt;Удобство управления большими проектами.&lt;/li&gt;
    &lt;li id=&quot;3CMP&quot;&gt;Легче читать и поддерживать.&lt;/li&gt;
    &lt;li id=&quot;xtcM&quot;&gt;Возможность создания библиотек.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;4HxH&quot;&gt;11.2 — Создание простого ModuleScript&lt;/h2&gt;
  &lt;h3 id=&quot;8jnn&quot;&gt;Шаг 1: Создай ModuleScript в ReplicatedStorage&lt;/h3&gt;
  &lt;p id=&quot;368b&quot;&gt;&lt;code&gt;-- Shared/Utils.lua&lt;br /&gt;local module = {}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KARz&quot;&gt;&lt;code&gt;function module.formatCoins(coins)&lt;br /&gt;    return string.format(&amp;quot;%d монет&amp;quot;, coins)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yIBd&quot;&gt;&lt;code&gt;function module.addCoins(player, amount)&lt;br /&gt;    local leaderstats = player:FindFirstChild(&amp;quot;leaderstats&amp;quot;)&lt;br /&gt;    if leaderstats then&lt;br /&gt;        local coins = leaderstats:FindFirstChild(&amp;quot;Coins&amp;quot;)&lt;br /&gt;        if coins then&lt;br /&gt;            coins.Value += amount&lt;br /&gt;        end&lt;br /&gt;    end&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;efb7&quot;&gt;&lt;code&gt;return module&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;a7st&quot;&gt;11.3 — Использование ModuleScript&lt;/h2&gt;
  &lt;p id=&quot;6oob&quot;&gt;Теперь можем использовать его в любом другом скрипте:&lt;/p&gt;
  &lt;p id=&quot;Utfh&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;br /&gt;local utils = require(game.ReplicatedStorage.Utils)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BoAS&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    utils.addCoins(player, 50)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;BGiY&quot;&gt;11.4 — Структура проекта с модулями&lt;/h2&gt;
  &lt;p id=&quot;vBkb&quot;&gt;Рекомендуемая структура:&lt;/p&gt;
  &lt;p id=&quot;GZvn&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;QLVV&quot;&gt;&lt;code&gt;ReplicatedStorage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GWmU&quot;&gt;&lt;code&gt;│&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;H1L2&quot;&gt;&lt;code&gt;├── Modules&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Jlwo&quot;&gt;&lt;code&gt;│ ├── Utils.lua&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1WGb&quot;&gt;&lt;code&gt;│ ├── Inventory.lua&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3mBo&quot;&gt;&lt;code&gt;│ └── Levels.lua&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lOJ6&quot;&gt;&lt;code&gt;│&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;xXXN&quot;&gt;&lt;code&gt;└── RemoteEvents&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;aHz8&quot;&gt;&lt;code&gt;└── PlayerJumped&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;lkl2&quot;&gt;11.5 — Работа с таблицами как с классами&lt;/h2&gt;
  &lt;p id=&quot;63ya&quot;&gt;Можно имитировать ООП с помощью таблиц и функций:&lt;/p&gt;
  &lt;p id=&quot;x3SH&quot;&gt;&lt;code&gt;-- Shared/PlayerData.lua&lt;br /&gt;local PlayerData = {}&lt;br /&gt;PlayerData.__index = PlayerData&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;IQyo&quot;&gt;&lt;code&gt;function PlayerData.new(player)&lt;br /&gt;    local self = setmetatable({}, PlayerData)&lt;br /&gt;    self.player = player&lt;br /&gt;    self.coins = 0&lt;br /&gt;    self.level = 1&lt;br /&gt;    return self&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wz3n&quot;&gt;&lt;code&gt;function PlayerData:addCoins(amount)&lt;br /&gt;    self.coins += amount&lt;br /&gt;    print(self.player.Name .. &amp;quot; получил &amp;quot; .. amount .. &amp;quot; монет&amp;quot;)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;L1FM&quot;&gt;&lt;code&gt;return PlayerData&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zcLK&quot;&gt;Использование:&lt;/p&gt;
  &lt;p id=&quot;Qieu&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;br /&gt;local PlayerData = require(game.ReplicatedStorage.PlayerData)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Tkrp&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    local data = PlayerData.new(player)&lt;br /&gt;    data:addCoins(100)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;z72u&quot;&gt;11.6 — Проект: Библиотека для GUI&lt;/h2&gt;
  &lt;p id=&quot;aSS3&quot;&gt;Создадим простую библиотеку для создания кнопок.&lt;/p&gt;
  &lt;h3 id=&quot;X7LT&quot;&gt;Шаг 1: Создай ModuleScript&lt;/h3&gt;
  &lt;p id=&quot;DRT8&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;wYMl&quot;&gt;&lt;code&gt;-- Shared/GUIUtils.lua&lt;br /&gt;local guiUtils = {}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JtTu&quot;&gt;&lt;code&gt;function guiUtils.createButton(parent, text, size, position, callback)&lt;br /&gt;    local button = Instance.new(&amp;quot;TextButton&amp;quot;)&lt;br /&gt;    button.Text = text&lt;br /&gt;    button.Size = size&lt;br /&gt;    button.Position = position&lt;br /&gt;    button.BackgroundColor3 = Color3.fromRGB(100, 200, 255)&lt;br /&gt;    button.Parent = parent&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Pbe5&quot;&gt;&lt;code&gt;    button.MouseButton1Down:Connect(function()&lt;br /&gt;        callback()&lt;br /&gt;    end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EHji&quot;&gt;&lt;code&gt;    return button&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OHVO&quot;&gt;&lt;code&gt;return guiUtils&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;xLDf&quot;&gt;Шаг 2: Используй библиотеку&lt;/h3&gt;
  &lt;p id=&quot;JP1u&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;RyZu&quot;&gt;&lt;code&gt;-- LocalScript&lt;br /&gt;local guiUtils = require(game.ReplicatedStorage.GUIUtils)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SIAa&quot;&gt;&lt;code&gt;local player = game.Players.LocalPlayer&lt;br /&gt;local gui = Instance.new(&amp;quot;ScreenGui&amp;quot;)&lt;br /&gt;gui.Parent = player.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;bqAQ&quot;&gt;&lt;code&gt;guiUtils.createButton(gui, &amp;quot;Нажми меня&amp;quot;, UDim2.new(0, 150, 0, 50), UDim2.new(0.5, -75, 0.2, 0), function()&lt;br /&gt;    print(&amp;quot;Кнопка нажата!&amp;quot;)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;tQag&quot;&gt;11.7 — Советы по использованию модулей&lt;/h2&gt;
  &lt;ul id=&quot;cW9t&quot;&gt;
    &lt;li id=&quot;9NKQ&quot;&gt;Храни все общие функции в &lt;code&gt;ReplicatedStorage/Modules&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;Ohtj&quot;&gt;Давай понятные имена своим модулям.&lt;/li&gt;
    &lt;li id=&quot;c7bo&quot;&gt;Тестируй каждый модуль отдельно.&lt;/li&gt;
    &lt;li id=&quot;V42F&quot;&gt;Не используй глобальные переменные внутри модулей.&lt;/li&gt;
    &lt;li id=&quot;RQYn&quot;&gt;Обрабатывай ошибки при загрузке модулей.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;zw6c&quot;&gt;11.8 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;ZkXD&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;gPwm&quot;&gt;ModuleScript - Скрипт, возвращающий значение&lt;/p&gt;
  &lt;p id=&quot;icfK&quot;&gt;require() - Загружает ModuleScript&lt;/p&gt;
  &lt;p id=&quot;lbcb&quot;&gt;__index - Метатаблица для доступа к методам&lt;/p&gt;
  &lt;p id=&quot;wfp3&quot;&gt;setmetatable - Привязывает метатаблицу к таблице&lt;/p&gt;
  &lt;p id=&quot;xXZO&quot;&gt;namespace - Группировка связанных функций&lt;/p&gt;
  &lt;p id=&quot;Ch0t&quot;&gt;OOP - Объектно-ориентированное программирование (через таблицы)&lt;/p&gt;
  &lt;p id=&quot;SVHR&quot;&gt;reusable code - Код, который можно использовать повторно&lt;/p&gt;
  &lt;p id=&quot;Q3F2&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;uZHD&quot;&gt;🔹 Глава 12: Работа с файлами и внешними данными.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;jhgz&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;VQhc&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;cQYG&quot;&gt;
    &lt;li id=&quot;qMeS&quot;&gt;Как сохранять данные локально на компьютере (в ограниченном режиме).&lt;/li&gt;
    &lt;li id=&quot;wqtm&quot;&gt;Как использовать &lt;code&gt;HttpService&lt;/code&gt; для работы с JSON и другими форматами.&lt;/li&gt;
    &lt;li id=&quot;C3Tg&quot;&gt;Как читать и записывать данные из файла (в тестовой среде).&lt;/li&gt;
    &lt;li id=&quot;qJ3q&quot;&gt;Как использовать внешние данные для создания динамических игр.&lt;/li&gt;
    &lt;li id=&quot;Bp3D&quot;&gt;Как обрабатывать ошибки при работе с внешними ресурсами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;oAvC&quot;&gt;12.1 — Возможности и ограничения работы с файлами в Roblox&lt;/h2&gt;
  &lt;p id=&quot;mME5&quot;&gt;Roblox &lt;strong&gt;не позволяет напрямую читать/писать файлы на жёсткий диск &lt;/strong&gt;пользователя из соображений безопасности. Однако есть способы:&lt;/p&gt;
  &lt;ul id=&quot;anQb&quot;&gt;
    &lt;li id=&quot;3lIx&quot;&gt;Использование &lt;code&gt;HttpService&lt;/code&gt; для сериализации данных.&lt;/li&gt;
    &lt;li id=&quot;jI5E&quot;&gt;Сохранение данных через &lt;code&gt;DataStore&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;bs85&quot;&gt;Локальное хранение данных в песочнице (только для тестирования).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;kxXb&quot;&gt;12.2 — HttpService: работа с JSON&lt;/h2&gt;
  &lt;p id=&quot;hs8c&quot;&gt;&lt;code&gt;HttpService&lt;/code&gt; — это мощный инструмент для преобразования Lua-таблиц в JSON-строки и обратно.&lt;/p&gt;
  &lt;h3 id=&quot;in8D&quot;&gt;Включение HttpService:&lt;/h3&gt;
  &lt;ol id=&quot;4afV&quot;&gt;
    &lt;li id=&quot;T6ab&quot;&gt;Открой Roblox Studio.&lt;/li&gt;
    &lt;li id=&quot;NqZ3&quot;&gt;Перейди в &lt;strong&gt;File → Settings → Security &lt;/strong&gt;.&lt;/li&gt;
    &lt;li id=&quot;jpmo&quot;&gt;Включи &lt;strong&gt;Http Enabled &lt;/strong&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;owdm&quot;&gt;Сериализация данных:&lt;/h3&gt;
  &lt;p id=&quot;gF5b&quot;&gt;&lt;code&gt;local http = game:GetService(&amp;quot;HttpService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BrRK&quot;&gt;&lt;code&gt;local data = {&lt;br /&gt;    name = &amp;quot;Алекс&amp;quot;,&lt;br /&gt;    level = 5,&lt;br /&gt;    inventory = {&amp;quot;Меч&amp;quot;, &amp;quot;Щит&amp;quot;}&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;h23P&quot;&gt;&lt;code&gt;local jsonData = http:JSONEncode(data)&lt;br /&gt;print(jsonData) — {&amp;quot;name&amp;quot;:&amp;quot;Алекс&amp;quot;,&amp;quot;level&amp;quot;:5,&amp;quot;inventory&amp;quot;:[&amp;quot;Меч&amp;quot;,&amp;quot;Щит&amp;quot;]}&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;IXZ2&quot;&gt;Десериализация данных:&lt;/h3&gt;
  &lt;p id=&quot;YxL7&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;x6NV&quot;&gt;&lt;code&gt;local decoded = http:JSONDecode(jsonData)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;gFeO&quot;&gt;&lt;code&gt;print(decoded.name) -- Алекс&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;CmK6&quot;&gt;12.3 — Локальное хранение данных (тестирование)&lt;/h2&gt;
  &lt;p id=&quot;uVKT&quot;&gt;Хотя Roblox не поддерживает прямую работу с файлами, можно эмулировать чтение/запись с помощью &lt;code&gt;setclipboard()&lt;/code&gt; и &lt;code&gt;print()&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;jKBb&quot;&gt;Эмуляция записи:&lt;/h3&gt;
  &lt;p id=&quot;rCMD&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;U7sC&quot;&gt;&lt;code&gt;setclipboard(jsonData) -- копирует данные в буфер обмена&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MwRi&quot;&gt;&lt;code&gt;print(&amp;quot;Сохранено в буфер обмена:&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;mZw7&quot;&gt;&lt;code&gt;print(jsonData)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;DUNC&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;vfKm&quot;&gt;Эмуляция чтения:&lt;/h3&gt;
  &lt;p id=&quot;oqwH&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;GMvK&quot;&gt;&lt;code&gt;-- Представим, что игрок вставил данные в консоль&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MnPC&quot;&gt;&lt;code&gt;local pastedData = &amp;#x27;{&amp;quot;name&amp;quot;:&amp;quot;Алекс&amp;quot;,&amp;quot;level&amp;quot;:5,&amp;quot;inventory&amp;quot;:[&amp;quot;Меч&amp;quot;,&amp;quot;Щит&amp;quot;]}&amp;#x27;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OY9m&quot;&gt;&lt;code&gt;local loaded = http:JSONDecode(pastedData)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5amu&quot;&gt;&lt;code&gt;print(&amp;quot;Имя: &amp;quot; .. loaded.name)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;C1pD&quot;&gt;12.4 — Подключение к внешним API (при наличии разрешения)&lt;/h2&gt;
  &lt;p id=&quot;R8Ai&quot;&gt;Roblox позволяет делать HTTP-запросы к внешним серверам через &lt;code&gt;http:request()&lt;/code&gt;. Это может быть полезно для:&lt;/p&gt;
  &lt;ul id=&quot;JgG0&quot;&gt;
    &lt;li id=&quot;eCT0&quot;&gt;Получения погоды&lt;/li&gt;
    &lt;li id=&quot;jN0h&quot;&gt;Проверки статуса серверов&lt;/li&gt;
    &lt;li id=&quot;Kg6n&quot;&gt;Загрузки данных из сторонних сервисов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;bfrc&quot;&gt;Пример GET-запроса:&lt;/h3&gt;
  &lt;p id=&quot;AbvY&quot;&gt;&lt;code&gt;local http = game:GetService(&amp;quot;HttpService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SUyR&quot;&gt;&lt;code&gt;http:GetAsync(&amp;quot;&lt;a href=&quot;https://api.example.com/data&quot; target=&quot;_blank&quot;&gt;https://api.example.com/data&lt;/a&gt; &amp;quot;)&lt;br /&gt;    :andThen(function(response)&lt;br /&gt;        print(&amp;quot;Ответ от сервера:&amp;quot;, response)&lt;br /&gt;    end)&lt;br /&gt;    :catch(function(err)&lt;br /&gt;        warn(&amp;quot;Ошибка:&amp;quot;, err)&lt;br /&gt;    end)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;29xR&quot;&gt;Пример POST-запроса:&lt;/h3&gt;
  &lt;p id=&quot;A5Wu&quot;&gt;&lt;code&gt;local payload = http:JSONEncode({username = &amp;quot;Alex&amp;quot;, action = &amp;quot;login&amp;quot;})&lt;br /&gt;http:PostAsync(&amp;quot;&lt;a href=&quot;https://api.example.com/login&quot; target=&quot;_blank&quot;&gt;https://api.example.com/login&lt;/a&gt; &amp;quot;, payload)&lt;br /&gt;    :andThen(function(response)&lt;br /&gt;        print(&amp;quot;Успешный вход:&amp;quot;, response)&lt;br /&gt;    end)&lt;br /&gt;    :catch(function(err)&lt;br /&gt;        warn(&amp;quot;Ошибка авторизации:&amp;quot;, err)&lt;br /&gt;    end)&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;RkEc&quot;&gt;⚠️ Обрати внимание: большинство API требуют ключей и CORS-разрешений. Roblox имеет ограничения на такие запросы, поэтому используй их только в тестовых или контролируемых условиях.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;NiL8&quot;&gt;12.5 — Проект: Локальная система сохранения прогресса&lt;/h2&gt;
  &lt;p id=&quot;tDPq&quot;&gt;Создадим систему, которая позволяет временно сохранять данные в буфере обмена.&lt;/p&gt;
  &lt;h3 id=&quot;1qKD&quot;&gt;Шаг 1: Сохранить прогресс&lt;/h3&gt;
  &lt;p id=&quot;Bcpt&quot;&gt;&lt;code&gt;local http = game:GetService(&amp;quot;HttpService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NTuf&quot;&gt;&lt;code&gt;local playerData = {&lt;br /&gt;    coins = 100,&lt;br /&gt;    level = 3&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YKW2&quot;&gt;&lt;code&gt;local saveString = http:JSONEncode(playerData)&lt;br /&gt;setclipboard(saveString)&lt;br /&gt;print(&amp;quot;Сохранено в буфер обмена:&amp;quot;)&lt;br /&gt;print(saveString)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;m7Oy&quot;&gt;Шаг 2: Загрузить прогресс&lt;/h3&gt;
  &lt;p id=&quot;SDKu&quot;&gt;&lt;code&gt;-- Представим, что игрок вставил строку&lt;br /&gt;local pasteInput = &amp;#x27;[{&amp;quot;coins&amp;quot;:100,&amp;quot;level&amp;quot;:3}]&amp;#x27;&lt;br /&gt;local loadedData = http:JSONDecode(pasteInput)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CX9N&quot;&gt;&lt;code&gt;if loadedData then&lt;br /&gt;    print(&amp;quot;Загружено:&amp;quot;)&lt;br /&gt;    print(&amp;quot;Монеты:&amp;quot;, loadedData.coins)&lt;br /&gt;    print(&amp;quot;Уровень:&amp;quot;, loadedData.level)&lt;br /&gt;else&lt;br /&gt;    warn(&amp;quot;Неверный формат данных.&amp;quot;)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;F4Iv&quot;&gt;12.6 — Советы по работе с данными&lt;/h2&gt;
  &lt;ul id=&quot;jq8E&quot;&gt;
    &lt;li id=&quot;CODT&quot;&gt;Всегда проверяй типы данных перед сериализацией.&lt;/li&gt;
    &lt;li id=&quot;BELz&quot;&gt;Используй &lt;code&gt;pcall()&lt;/code&gt; при работе с JSON, чтобы избежать крахов.&lt;/li&gt;
    &lt;li id=&quot;wbV4&quot;&gt;Не отправляй конфиденциальные данные на внешние серверы.&lt;/li&gt;
    &lt;li id=&quot;5lxK&quot;&gt;Для реального сохранения используй &lt;code&gt;DataStore&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;WFzT&quot;&gt;При использовании &lt;code&gt;HttpService&lt;/code&gt; тестируй все возможные ошибки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;imBS&quot;&gt;12.7 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;fIow&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;s5TM&quot;&gt;HttpService - Сервис для работы с HTTP и JSON&lt;/p&gt;
  &lt;p id=&quot;em5D&quot;&gt;JSONEncode - Преобразует таблицу в JSON-строку&lt;/p&gt;
  &lt;p id=&quot;FQdS&quot;&gt;JSONDecode - Преобразует JSON-строку в таблицу&lt;/p&gt;
  &lt;p id=&quot;otZY&quot;&gt;setclipboard - Копирует текст в буфер обмена (только клиент)&lt;/p&gt;
  &lt;p id=&quot;eZcm&quot;&gt;GetAsync - Выполняет GET-запрос&lt;/p&gt;
  &lt;p id=&quot;5Jtu&quot;&gt;PostAsync - Выполняет POST-запрос&lt;/p&gt;
  &lt;p id=&quot;fyRE&quot;&gt;CORS - Политика безопасности для внешних запросов&lt;/p&gt;
  &lt;p id=&quot;MO96&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;hiuP&quot;&gt;🔹 Глава 13: JSON и работа с форматами данных.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;xQmV&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;PqxD&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;RFuh&quot;&gt;
    &lt;li id=&quot;WeEk&quot;&gt;Что такое JSON и зачем он нужен в Roblox.&lt;/li&gt;
    &lt;li id=&quot;kTUV&quot;&gt;Как сериализовать и десериализовать данные.&lt;/li&gt;
    &lt;li id=&quot;9JwW&quot;&gt;Как работать с вложенными структурами, массивами, сложными таблицами.&lt;/li&gt;
    &lt;li id=&quot;KoDv&quot;&gt;Как использовать JSON для обмена данными между клиентом и сервером.&lt;/li&gt;
    &lt;li id=&quot;smUz&quot;&gt;Как создавать шаблоны конфигураций, сохранять инвентарь, уровни и многое другое.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;EagS&quot;&gt;13.1 — Что такое JSON?&lt;/h2&gt;
  &lt;p id=&quot;Acc4&quot;&gt;JSON (JavaScript Object Notation) — это лёгкий формат обмена данными, который легко читается человеком и машиной.&lt;/p&gt;
  &lt;h3 id=&quot;RGrc&quot;&gt;Пример JSON:&lt;/h3&gt;
  &lt;p id=&quot;uwPR&quot;&gt;&lt;code&gt;{&lt;br /&gt;    &amp;quot;name&amp;quot;: &amp;quot;Алекс&amp;quot;,&lt;br /&gt;    &amp;quot;level&amp;quot;: 5,&lt;br /&gt;    &amp;quot;inventory&amp;quot;: [&amp;quot;Меч&amp;quot;, &amp;quot;Щит&amp;quot;, &amp;quot;Зелье&amp;quot;],&lt;br /&gt;    &amp;quot;stats&amp;quot;: {&lt;br /&gt;        &amp;quot;health&amp;quot;: 100,&lt;br /&gt;        &amp;quot;mana&amp;quot;: 50&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;aybv&quot;&gt;Почему используется в Roblox?&lt;/h3&gt;
  &lt;ul id=&quot;R63N&quot;&gt;
    &lt;li id=&quot;YUgV&quot;&gt;Легко передаётся через &lt;code&gt;HttpService&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;ERSX&quot;&gt;Подходит для хранения сложных данных.&lt;/li&gt;
    &lt;li id=&quot;neeb&quot;&gt;Используется при работе с API.&lt;/li&gt;
    &lt;li id=&quot;vb3t&quot;&gt;Удобен для отладки и тестирования.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;KyFv&quot;&gt;13.2 — Сериализация данных в JSON&lt;/h2&gt;
  &lt;p id=&quot;9FIh&quot;&gt;С помощью &lt;code&gt;HttpService&lt;/code&gt; можно преобразовать Lua-таблицы в JSON-строки.&lt;/p&gt;
  &lt;h3 id=&quot;y2Oe&quot;&gt;Пример:&lt;/h3&gt;
  &lt;p id=&quot;2OgY&quot;&gt;&lt;code&gt;local http = game:GetService(&amp;quot;HttpService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;oeVg&quot;&gt;&lt;code&gt;local playerData = {&lt;br /&gt;    name = &amp;quot;Алекс&amp;quot;,&lt;br /&gt;    level = 5,&lt;br /&gt;    inventory = {&amp;quot;Меч&amp;quot;, &amp;quot;Щит&amp;quot;},&lt;br /&gt;    stats = {&lt;br /&gt;        health = 100,&lt;br /&gt;        mana = 50&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Vp0r&quot;&gt;&lt;code&gt;local jsonData = http:JSONEncode(playerData)&lt;br /&gt;print(jsonData)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;UEf7&quot;&gt;Результат:&lt;/h3&gt;
  &lt;p id=&quot;eP42&quot;&gt;&lt;code&gt;{&amp;quot;name&amp;quot;:&amp;quot;Алекс&amp;quot;,&amp;quot;level&amp;quot;:5,&amp;quot;inventory&amp;quot;:[&amp;quot;Меч&amp;quot;,&amp;quot;Щит&amp;quot;],&amp;quot;stats&amp;quot;:{&amp;quot;health&amp;quot;:100,&amp;quot;mana&amp;quot;:50}}&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;xA5q&quot;&gt;⚠️ JSON не сохраняет порядок ключей в таблицах.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;7v3V&quot;&gt;13.3 — Десериализация JSON в Lua-таблицу&lt;/h2&gt;
  &lt;p id=&quot;4gED&quot;&gt;Из строки JSON можно получить обратно Lua-таблицу.&lt;/p&gt;
  &lt;p id=&quot;3cU5&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;8ghe&quot;&gt;&lt;code&gt;local jsonString = &amp;#x27;{&amp;quot;name&amp;quot;:&amp;quot;Алекс&amp;quot;,&amp;quot;level&amp;quot;:5,&amp;quot;inventory&amp;quot;:[&amp;quot;Меч&amp;quot;,&amp;quot;Щит&amp;quot;],&amp;quot;stats&amp;quot;:{&amp;quot;health&amp;quot;:100,&amp;quot;mana&amp;quot;:50}}&amp;#x27;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;vszs&quot;&gt;&lt;code&gt;local decoded = http:JSONDecode(jsonString)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ekdw&quot;&gt;&lt;code&gt;print(decoded.name) -- Алекс&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UW9S&quot;&gt;&lt;code&gt;print(decoded.stats.health) -- 100&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;aiLR&quot;&gt;13.4 — Работа с массивами и вложенными объектами&lt;/h2&gt;
  &lt;p id=&quot;wwJ5&quot;&gt;JSON поддерживает массивы (&lt;code&gt;{}&lt;/code&gt;) и вложенные объекты (&lt;code&gt;[]&lt;/code&gt;).&lt;/p&gt;
  &lt;h3 id=&quot;kTRp&quot;&gt;Массив:&lt;/h3&gt;
  &lt;p id=&quot;dAYv&quot;&gt;&lt;code&gt;[&amp;quot;яблоко&amp;quot;, &amp;quot;банан&amp;quot;, &amp;quot;апельсин&amp;quot;]&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;CWuC&quot;&gt;Вложенный объект:&lt;/h3&gt;
  &lt;p id=&quot;X285&quot;&gt;&lt;code&gt;{&lt;br /&gt;    &amp;quot;user&amp;quot;: {&lt;br /&gt;        &amp;quot;id&amp;quot;: 123,&lt;br /&gt;        &amp;quot;email&amp;quot;: &amp;quot;alex@example.com&amp;quot;&lt;br /&gt;    },&lt;br /&gt;    &amp;quot;roles&amp;quot;: [&amp;quot;admin&amp;quot;, &amp;quot;moderator&amp;quot;]&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;7sEG&quot;&gt;13.5 — Обработка ошибок при работе с JSON&lt;/h2&gt;
  &lt;p id=&quot;amnT&quot;&gt;При неправильном формате JSON может произойти ошибка. Используй &lt;code&gt;pcall()&lt;/code&gt;:&lt;/p&gt;
  &lt;p id=&quot;tL4V&quot;&gt;&lt;code&gt;local success, result = pcall(function()&lt;br /&gt;    return http:JSONDecode(&amp;quot;{invalid json}&amp;quot;)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tHdF&quot;&gt;&lt;code&gt;if not success then&lt;br /&gt;    warn(&amp;quot;Ошибка JSON:&amp;quot;, result)&lt;br /&gt;else&lt;br /&gt;    print(&amp;quot;Данные загружены:&amp;quot;, result)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ICiH&quot;&gt;13.6 — Проект: Сохранение инвентаря игрока в JSON&lt;/h2&gt;
  &lt;p id=&quot;wfQc&quot;&gt;Создадим систему, которая сохраняет инвентарь игрока в JSON.&lt;/p&gt;
  &lt;h3 id=&quot;yDla&quot;&gt;Шаг 1: Создай инструменты&lt;/h3&gt;
  &lt;p id=&quot;pV6X&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;br /&gt;local toolNames = {&amp;quot;Меч&amp;quot;, &amp;quot;Лук&amp;quot;, &amp;quot;Щит&amp;quot;, &amp;quot;Зелье&amp;quot;}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Pyob&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    local backpack = player.Backpack&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tMle&quot;&gt;&lt;code&gt;    for _, name in ipairs(toolNames) do&lt;br /&gt;        local tool = Instance.new(&amp;quot;Tool&amp;quot;)&lt;br /&gt;        tool.Name = name&lt;br /&gt;        tool.RequiresHandle = false&lt;br /&gt;        tool.Parent = backpack&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;SMvf&quot;&gt;Шаг 2: Сохрани инвентарь в JSON&lt;/h3&gt;
  &lt;p id=&quot;JjqI&quot;&gt;&lt;code&gt;-- LocalScript&lt;br /&gt;local http = game:GetService(&amp;quot;HttpService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ezlt&quot;&gt;&lt;code&gt;local function saveInventory()&lt;br /&gt;    local player = game.Players.LocalPlayer&lt;br /&gt;    local backpack = player.Backpack&lt;br /&gt;    local inventory = {}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Xanc&quot;&gt;&lt;code&gt;    for _, item in ipairs(backpack:GetChildren()) do&lt;br /&gt;        if item:IsA(&amp;quot;Tool&amp;quot;) then&lt;br /&gt;            table.insert(inventory, item.Name)&lt;br /&gt;        end&lt;br /&gt;    end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TLls&quot;&gt;&lt;code&gt;    local json = http:JSONEncode(inventory)&lt;br /&gt;    setclipboard(json)&lt;br /&gt;    print(&amp;quot;Инвентарь сохранён в буфер обмена:&amp;quot;)&lt;br /&gt;    print(json)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CNr4&quot;&gt;&lt;code&gt;-- Вызови функцию по кнопке&lt;br /&gt;local gui = Instance.new(&amp;quot;ScreenGui&amp;quot;)&lt;br /&gt;gui.Parent = player.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;I728&quot;&gt;&lt;code&gt;local button = Instance.new(&amp;quot;TextButton&amp;quot;)&lt;br /&gt;button.Text = &amp;quot;Сохранить инвентарь&amp;quot;&lt;br /&gt;button.Size = UDim2.new(0, 200, 0, 50)&lt;br /&gt;button.Position = UDim2.new(0.5, -100, 0.2, 0)&lt;br /&gt;button.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hHm1&quot;&gt;&lt;code&gt;button.MouseButton1Down:Connect(saveInventory)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;rs2i&quot;&gt;13.7 — Советы и рекомендации&lt;/h2&gt;
  &lt;ul id=&quot;FFAx&quot;&gt;
    &lt;li id=&quot;h5yH&quot;&gt;Используй JSON для временного хранения данных.&lt;/li&gt;
    &lt;li id=&quot;6umu&quot;&gt;Проверяй типы данных перед сериализацией.&lt;/li&gt;
    &lt;li id=&quot;zJqP&quot;&gt;Не используй JSON для критически важных операций без проверки.&lt;/li&gt;
    &lt;li id=&quot;1PJk&quot;&gt;Для долгосрочного хранения используй &lt;code&gt;DataStore&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;X6WS&quot;&gt;При работе с API всегда используй безопасные методы передачи.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;RSH1&quot;&gt;13.8 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;XUZB&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;ZwJp&quot;&gt;JSON - Формат обмена данными&lt;/p&gt;
  &lt;p id=&quot;q4Pl&quot;&gt;JSONEncode - Преобразует таблицу в JSON&lt;/p&gt;
  &lt;p id=&quot;Hbvl&quot;&gt;JSONDecode - Преобразует JSON в таблицу&lt;/p&gt;
  &lt;p id=&quot;QrFE&quot;&gt;HttpService - Сервис для работы с JSON и HTTP&lt;/p&gt;
  &lt;p id=&quot;RbjF&quot;&gt;Массив - Упорядоченная последовательность элементов&lt;/p&gt;
  &lt;p id=&quot;73Os&quot;&gt;Объект - Набор пар ключ-значение&lt;/p&gt;
  &lt;p id=&quot;lDnN&quot;&gt;Вложенная структура - Объект внутри другого объекта&lt;/p&gt;
  &lt;p id=&quot;oixY&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;wbHo&quot;&gt;🔹 Глава 14: Работа с аудио и звуками.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;OJdw&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;AQTy&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;wvFM&quot;&gt;
    &lt;li id=&quot;KRyn&quot;&gt;Как добавлять и воспроизводить звуки в Roblox.&lt;/li&gt;
    &lt;li id=&quot;aOKW&quot;&gt;Как использовать &lt;code&gt;Sound&lt;/code&gt; и &lt;code&gt;SoundService&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;dkmV&quot;&gt;Как управлять громкостью, позицией, повторением.&lt;/li&gt;
    &lt;li id=&quot;LviX&quot;&gt;Как связывать звуки с событиями (например, нажатие кнопки, выстрел).&lt;/li&gt;
    &lt;li id=&quot;rftC&quot;&gt;Как создавать фоновую музыку и динамические звуки.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;8KWo&quot;&gt;14.1 — Основы работы со звуком в Roblox&lt;/h2&gt;
  &lt;p id=&quot;5I4o&quot;&gt;Roblox использует объект &lt;code&gt;Sound&lt;/code&gt;, который можно прикрепить к любой части или персонажу.&lt;/p&gt;
  &lt;h3 id=&quot;9Szk&quot;&gt;Пример простого звука:&lt;/h3&gt;
  &lt;p id=&quot;519b&quot;&gt;&lt;code&gt;local sound = Instance.new(&amp;quot;Sound&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;oI0v&quot;&gt;&lt;code&gt;sound.SoundId = &amp;quot;rbxassetid://123456789&amp;quot; -- замени на нужный ID&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;fAL1&quot;&gt;&lt;code&gt;sound.Volume = 1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hiDe&quot;&gt;&lt;code&gt;sound.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;299V&quot;&gt;&lt;code&gt;sound:Play()&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;0h7Z&quot;&gt;💡 Чтобы найти SoundId, зайди на &lt;a href=&quot;https://www.roblox.com/library&quot; target=&quot;_blank&quot;&gt;https://www.roblox.com/library &lt;/a&gt;, выбери звук и скопируй его ID.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;AGfr&quot;&gt;14.2 — Свойства звука&lt;/h2&gt;
  &lt;p id=&quot;dI4p&quot;&gt;Свойство - Описание&lt;/p&gt;
  &lt;p id=&quot;xod0&quot;&gt;&lt;code&gt;SoundId&lt;/code&gt; - ID звука (из библиотеки Roblox)&lt;/p&gt;
  &lt;p id=&quot;0W65&quot;&gt;&lt;code&gt;Volume&lt;/code&gt; - Громкость (от 0 до 10)&lt;/p&gt;
  &lt;p id=&quot;emID&quot;&gt;&lt;code&gt;Pitch&lt;/code&gt; - Изменение тональности (от 0.1 до 2)&lt;/p&gt;
  &lt;p id=&quot;UvY2&quot;&gt;&lt;code&gt;Looped&lt;/code&gt; - Зациклить звук&lt;/p&gt;
  &lt;p id=&quot;nBDE&quot;&gt;&lt;code&gt;PlaybackSpeed&lt;/code&gt; - Скорость воспроизведения&lt;/p&gt;
  &lt;p id=&quot;382A&quot;&gt;&lt;code&gt;IsPlaying&lt;/code&gt; - Проверяет, играет ли звук сейчас&lt;/p&gt;
  &lt;h3 id=&quot;eJRG&quot;&gt;Пример изменения свойств:&lt;/h3&gt;
  &lt;p id=&quot;D6wi&quot;&gt;&lt;code&gt;sound.Volume = 0.5&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6jet&quot;&gt;&lt;code&gt;sound.Pitch = 1.2&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;HVUy&quot;&gt;&lt;code&gt;sound.Looped = true&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;AVZi&quot;&gt;14.3 — Управление воспроизведением&lt;/h2&gt;
  &lt;h3 id=&quot;RLVk&quot;&gt;Воспроизведение:&lt;/h3&gt;
  &lt;p id=&quot;A7SF&quot;&gt;&lt;code&gt;sound:Play()&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;WPHl&quot;&gt;Остановка:&lt;/h3&gt;
  &lt;p id=&quot;icE1&quot;&gt;&lt;code&gt;sound:Stop()&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;0Df7&quot;&gt;Пауза:&lt;/h3&gt;
  &lt;p id=&quot;dvxx&quot;&gt;&lt;code&gt;sound:Pause()&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;OT8O&quot;&gt;14.4 — Создание фоновой музыки&lt;/h2&gt;
  &lt;p id=&quot;RyhE&quot;&gt;Фоновая музыка обычно размещается в &lt;code&gt;SoundService&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;l43A&quot;&gt;&lt;code&gt;local music = Instance.new(&amp;quot;Sound&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;df6X&quot;&gt;&lt;code&gt;music.SoundId = &amp;quot;rbxassetid://987654321&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3XlN&quot;&gt;&lt;code&gt;music.Volume = 0.7&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;2Ed2&quot;&gt;&lt;code&gt;music.Looped = true&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cMRZ&quot;&gt;&lt;code&gt;music.Parent = game:GetService(&amp;quot;SoundService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;CnGm&quot;&gt;&lt;code&gt;music:Play()&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;EpjS&quot;&gt;14.5 — Локализация звука&lt;/h2&gt;
  &lt;p id=&quot;Zgiw&quot;&gt;Звук может быть локализован — он будет громче, если игрок рядом с источником.&lt;/p&gt;
  &lt;p id=&quot;vIN3&quot;&gt;&lt;code&gt;local part = workspace.Part&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1MoX&quot;&gt;&lt;code&gt;local sound = part:FindFirstChild(&amp;quot;Sound&amp;quot;) or Instance.new(&amp;quot;Sound&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;qJv5&quot;&gt;&lt;code&gt;sound.SoundId = &amp;quot;rbxassetid://123456789&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OkCP&quot;&gt;&lt;code&gt;sound.Volume = 1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4E7Z&quot;&gt;&lt;code&gt;sound.EmitterSize = 10 -- радиус действия звука&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OLee&quot;&gt;&lt;code&gt;sound.PlayOnRemove = false&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4rRk&quot;&gt;&lt;code&gt;sound.Parent = part&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;uQgy&quot;&gt;14.6 — Проект: Музыкальная кнопка&lt;/h2&gt;
  &lt;p id=&quot;kr1n&quot;&gt;Создадим кнопку, которая запускает и останавливает музыку.&lt;/p&gt;
  &lt;h3 id=&quot;NqHD&quot;&gt;Шаг 1: Создай GUI кнопку&lt;/h3&gt;
  &lt;p id=&quot;tOVx&quot;&gt;&lt;code&gt;local player = game.Players.LocalPlayer&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;fiav&quot;&gt;&lt;code&gt;local gui = Instance.new(&amp;quot;ScreenGui&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;2LGZ&quot;&gt;&lt;code&gt;gui.Parent = player.PlayerGui&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0K7F&quot;&gt;&lt;code&gt;local button = Instance.new(&amp;quot;TextButton&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Pkxi&quot;&gt;&lt;code&gt;button.Text = &amp;quot;Включить музыку&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Beyc&quot;&gt;&lt;code&gt;button.Size = UDim2.new(0, 200, 0, 50)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;FLyB&quot;&gt;&lt;code&gt;button.Position = UDim2.new(0.5, -100, 0.2, 0)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;MScq&quot;&gt;&lt;code&gt;button.Parent = gui&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;AGd5&quot;&gt;Шаг 2: Добавь функционал&lt;/h3&gt;
  &lt;p id=&quot;9YR5&quot;&gt;&lt;code&gt;local isPlaying = false&lt;br /&gt;local music = Instance.new(&amp;quot;Sound&amp;quot;)&lt;br /&gt;music.SoundId = &amp;quot;rbxassetid://987654321&amp;quot;&lt;br /&gt;music.Volume = 0.5&lt;br /&gt;music.Looped = true&lt;br /&gt;music.Parent = game:GetService(&amp;quot;SoundService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;bBXU&quot;&gt;&lt;code&gt;button.MouseButton1Down:Connect(function()&lt;br /&gt;    if not isPlaying then&lt;br /&gt;        music:Play()&lt;br /&gt;        button.Text = &amp;quot;Выключить музыку&amp;quot;&lt;br /&gt;    else&lt;br /&gt;        music:Stop()&lt;br /&gt;        button.Text = &amp;quot;Включить музыку&amp;quot;&lt;br /&gt;    end&lt;br /&gt;    isPlaying = not isPlaying&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Nrfl&quot;&gt;14.7 — Советы и рекомендации&lt;/h2&gt;
  &lt;ul id=&quot;kK7P&quot;&gt;
    &lt;li id=&quot;fGp0&quot;&gt;Используй &lt;code&gt;SoundService&lt;/code&gt; для фоновой музыки.&lt;/li&gt;
    &lt;li id=&quot;5Tch&quot;&gt;Для локальных звуков привязывай &lt;code&gt;Sound&lt;/code&gt; к &lt;code&gt;Part&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;3G6A&quot;&gt;Не забывай очищать звуки после использования.&lt;/li&gt;
    &lt;li id=&quot;5VHP&quot;&gt;Тестируй звуки в разных условиях (в помещении, на улице).&lt;/li&gt;
    &lt;li id=&quot;yqxW&quot;&gt;Используй &lt;code&gt;EmitterSize&lt;/code&gt; для реалистичного звучания.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;5AGh&quot;&gt;14.8 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;2T52&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;BUvG&quot;&gt;Sound - Объект для воспроизведения звука&lt;/p&gt;
  &lt;p id=&quot;xPmY&quot;&gt;SoundService - Сервис для глобальных звуков&lt;/p&gt;
  &lt;p id=&quot;sCEO&quot;&gt;SoundId - ID звука из Roblox Library&lt;/p&gt;
  &lt;p id=&quot;rXe7&quot;&gt;Volume - Громкость звука&lt;/p&gt;
  &lt;p id=&quot;lpdi&quot;&gt;Pitch - Тональность&lt;/p&gt;
  &lt;p id=&quot;TABd&quot;&gt;Looped - Зацикленное воспроизведение&lt;/p&gt;
  &lt;p id=&quot;lnWR&quot;&gt;EmitterSize - Радиус действия звука&lt;/p&gt;
  &lt;p id=&quot;bgoc&quot;&gt;PlaybackSpeed - Скорость воспроизведения&lt;/p&gt;
  &lt;p id=&quot;ZmIt&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;nnA2&quot;&gt;🔹 Глава 15: Таймеры, корутины и многозадачность.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;zBaU&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;gr1r&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;8bfN&quot;&gt;
    &lt;li id=&quot;5XIi&quot;&gt;Как использовать таймеры для отложенного выполнения.&lt;/li&gt;
    &lt;li id=&quot;TF7H&quot;&gt;Что такое &lt;code&gt;wait()&lt;/code&gt; и как его правильно использовать.&lt;/li&gt;
    &lt;li id=&quot;VCTB&quot;&gt;Как работают корутины и зачем они нужны.&lt;/li&gt;
    &lt;li id=&quot;AeLP&quot;&gt;Как выполнять несколько задач одновременно.&lt;/li&gt;
    &lt;li id=&quot;e2Au&quot;&gt;Как создавать сложные механики с задержками, анимациями и событиями.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;IvPi&quot;&gt;15.1 — Работа с временем: &lt;code&gt;wait()&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;Htny&quot;&gt;&lt;code&gt;wait()&lt;/code&gt; — это функция, которая приостанавливает выполнение кода на определённое время.&lt;/p&gt;
  &lt;h3 id=&quot;1qxj&quot;&gt;Пример:&lt;/h3&gt;
  &lt;p id=&quot;nOg4&quot;&gt;&lt;code&gt;print(&amp;quot;Старт&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ioTb&quot;&gt;&lt;code&gt;wait(3)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wZUX&quot;&gt;&lt;code&gt;print(&amp;quot;Прошло 3 секунды&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;7XPg&quot;&gt;⚠️ &lt;code&gt;wait()&lt;/code&gt; можно использовать только внутри корутин или циклов.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;wlFY&quot;&gt;15.2 — Циклы с задержкой&lt;/h2&gt;
  &lt;p id=&quot;TYYQ&quot;&gt;Создание повторяющихся действий:&lt;/p&gt;
  &lt;p id=&quot;XpAo&quot;&gt;&lt;code&gt;while true do&lt;br /&gt;    print(&amp;quot;Тик!&amp;quot;)&lt;br /&gt;    wait(1) — раз в секунду&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;L7CX&quot;&gt;15.3 — Параллельное выполнение: &lt;code&gt;spawn()&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;RuBJ&quot;&gt;Иногда нужно запускать несколько задач одновременно. Для этого используется &lt;code&gt;spawn()&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;EBSo&quot;&gt;Пример:&lt;/h3&gt;
  &lt;p id=&quot;qjSE&quot;&gt;&lt;code&gt;spawn(function()&lt;br /&gt;    while true do&lt;br /&gt;        print(&amp;quot;Задача 1&amp;quot;)&lt;br /&gt;        wait(2)&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jQUS&quot;&gt;&lt;code&gt;spawn(function()&lt;br /&gt;    while true do&lt;br /&gt;        print(&amp;quot;Задача 2&amp;quot;)&lt;br /&gt;        wait(3)&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;wu69&quot;&gt;15.4 — Корутины: управление потоками&lt;/h2&gt;
  &lt;p id=&quot;q0Dm&quot;&gt;Корутины позволяют управлять выполнением кода вручную.&lt;/p&gt;
  &lt;h3 id=&quot;9bjf&quot;&gt;Создание корутины:&lt;/h3&gt;
  &lt;p id=&quot;FriS&quot;&gt;&lt;code&gt;local co = coroutine.create(function()&lt;br /&gt;    for i = 1, 5 do&lt;br /&gt;        print(&amp;quot;Корутина:&amp;quot;, i)&lt;br /&gt;        wait(1)&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;mzCB&quot;&gt;&lt;code&gt;coroutine.resume(co) — запускает корутину&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;KuQs&quot;&gt;Проверка состояния:&lt;/h3&gt;
  &lt;p id=&quot;Js0U&quot;&gt;&lt;code&gt;print(coroutine.status(co)) -- &amp;quot;running&amp;quot;, &amp;quot;dead&amp;quot;, &amp;quot;suspended&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;TTHL&quot;&gt;15.5 — Использование &lt;code&gt;delay()&lt;/code&gt; для отложенного вызова&lt;/h2&gt;
  &lt;p id=&quot;Q5IL&quot;&gt;Можно выполнить функцию через определённое время:&lt;/p&gt;
  &lt;p id=&quot;LNIb&quot;&gt;&lt;code&gt;delay(5, function()&lt;br /&gt;    print(&amp;quot;Прошло 5 секунд&amp;quot;)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;69jR&quot;&gt;15.6 — Проект: Система спавна врагов с задержкой&lt;/h2&gt;
  &lt;p id=&quot;wF46&quot;&gt;Создадим систему, которая создаёт новых врагов каждые 5 секунд.&lt;/p&gt;
  &lt;h3 id=&quot;eSd7&quot;&gt;Шаг 1: Создай врага&lt;/h3&gt;
  &lt;p id=&quot;yN0M&quot;&gt;&lt;code&gt;function spawnEnemy()&lt;br /&gt;    local enemy = Instance.new(&amp;quot;Model&amp;quot;)&lt;br /&gt;    enemy.Name = &amp;quot;Enemy&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dfP2&quot;&gt;&lt;code&gt;    local root = Instance.new(&amp;quot;Part&amp;quot;)&lt;br /&gt;    root.Anchored = false&lt;br /&gt;    root.Name = &amp;quot;HumanoidRootPart&amp;quot;&lt;br /&gt;    root.Parent = enemy&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ali6&quot;&gt;&lt;code&gt;    local humanoid = Instance.new(&amp;quot;Humanoid&amp;quot;)&lt;br /&gt;    humanoid.Health = 50&lt;br /&gt;    humanoid.Parent = enemy&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BOto&quot;&gt;&lt;code&gt;    enemy.Parent = workspace&lt;br /&gt;    root.CFrame = CFrame.new(math.random(-20, 20), 5, math.random(-20, 20))&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;2ZSg&quot;&gt;Шаг 2: Запуск с задержкой&lt;/h3&gt;
  &lt;p id=&quot;oyII&quot;&gt;&lt;code&gt;spawn(function()&lt;br /&gt;    while true do&lt;br /&gt;        spawnEnemy()&lt;br /&gt;        wait(5) -- каждые 5 секунд&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;HBHo&quot;&gt;15.7 — Советы по работе с таймерами&lt;/h2&gt;
  &lt;ul id=&quot;Vu98&quot;&gt;
    &lt;li id=&quot;CjeA&quot;&gt;Не используй &lt;code&gt;wait()&lt;/code&gt; вне корутин или циклов.&lt;/li&gt;
    &lt;li id=&quot;AKWw&quot;&gt;Используй &lt;code&gt;spawn()&lt;/code&gt; для параллельного выполнения.&lt;/li&gt;
    &lt;li id=&quot;MDQ6&quot;&gt;Ограничивай количество активных задач.&lt;/li&gt;
    &lt;li id=&quot;sale&quot;&gt;Не забывай остановить циклы при удалении объектов.&lt;/li&gt;
    &lt;li id=&quot;7zOI&quot;&gt;Для точных таймеров используй &lt;code&gt;RunService&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;H2vG&quot;&gt;15.8 — Использование RunService для точного контроля времени&lt;/h2&gt;
  &lt;p id=&quot;YTiu&quot;&gt;&lt;code&gt;RunService&lt;/code&gt; позволяет запускать код на каждом кадре или через определённое количество времени.&lt;/p&gt;
  &lt;p id=&quot;Rt5k&quot;&gt;&lt;code&gt;local runService = game:GetService(&amp;quot;RunService&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;8oxl&quot;&gt;&lt;code&gt;-- Выполняется каждый кадр&lt;br /&gt;runService.RenderStepped:Connect(function()&lt;br /&gt;    -- здесь можно обновлять позиции, анимации и т.д.&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0tKZ&quot;&gt;&lt;code&gt;— Выполняется каждую секунду&lt;br /&gt;local lastTime = tick()&lt;br /&gt;runService.RenderStepped:Connect(function()&lt;br /&gt;    if tick() - lastTime &amp;gt;= 1 then&lt;br /&gt;        print(&amp;quot;Прошла 1 секунда&amp;quot;)&lt;br /&gt;        lastTime = tick()&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;oTf2&quot;&gt;15.9 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;sUA2&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;wSKY&quot;&gt;wait() - Приостанавливает выполнение&lt;/p&gt;
  &lt;p id=&quot;wVRn&quot;&gt;spawn() - Запускает задачу параллельно&lt;/p&gt;
  &lt;p id=&quot;BpPK&quot;&gt;coroutine - Объект для управления выполнением&lt;/p&gt;
  &lt;p id=&quot;rAQ7&quot;&gt;delay() - Откладывает выполнение&lt;/p&gt;
  &lt;p id=&quot;ZWvF&quot;&gt;RenderStepped - Событие каждого кадра&lt;/p&gt;
  &lt;p id=&quot;UUO5&quot;&gt;Heartbeat - Событие с частотой ~60 FPS&lt;/p&gt;
  &lt;p id=&quot;nYyw&quot;&gt;RunService - Сервис для работы с временем&lt;/p&gt;
  &lt;p id=&quot;1Vna&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;EnaE&quot;&gt;🔹 Глава 16: Обработка ошибок и отладка.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;XxTB&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;Xv0p&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;QxXo&quot;&gt;
    &lt;li id=&quot;4p0M&quot;&gt;Как обрабатывать ошибки с помощью &lt;code&gt;pcall()&lt;/code&gt; и &lt;code&gt;xpcall()&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;r9KO&quot;&gt;Как использовать &lt;code&gt;warn()&lt;/code&gt;, &lt;code&gt;error()&lt;/code&gt; и &lt;code&gt;assert()&lt;/code&gt; для диагностики.&lt;/li&gt;
    &lt;li id=&quot;pUV1&quot;&gt;Как читать стек-трейсы и находить проблемные места в коде.&lt;/li&gt;
    &lt;li id=&quot;Njto&quot;&gt;Как проверять типы данных и избегать крашей.&lt;/li&gt;
    &lt;li id=&quot;dMOl&quot;&gt;Как делать безопасные вызовы функций и методов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;LBA8&quot;&gt;16.1 — Что такое ошибка в программировании?&lt;/h2&gt;
  &lt;p id=&quot;64bd&quot;&gt;Ошибка (или исключение) — это ситуация, при которой выполнение программы невозможно продолжить по какой-то причине:&lt;/p&gt;
  &lt;ul id=&quot;Wums&quot;&gt;
    &lt;li id=&quot;KmEd&quot;&gt;Несуществующий объект&lt;/li&gt;
    &lt;li id=&quot;cWZ6&quot;&gt;Деление на ноль&lt;/li&gt;
    &lt;li id=&quot;g7sS&quot;&gt;Ошибка в синтаксисе&lt;/li&gt;
    &lt;li id=&quot;auwA&quot;&gt;Неверный тип данных&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;hk6Q&quot;&gt;Пример простой ошибки:&lt;/h3&gt;
  &lt;p id=&quot;VTWl&quot;&gt;&lt;code&gt;local x = 5 / &amp;quot;текст&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;sEWK&quot;&gt;&lt;code&gt;-- Выдаст: attempt to perform arithmetic on a string value&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;PxTq&quot;&gt;16.2 — Использование &lt;code&gt;pcall()&lt;/code&gt; для безопасных вызовов&lt;/h2&gt;
  &lt;p id=&quot;g7ZR&quot;&gt;&lt;code&gt;pcall()&lt;/code&gt; (protected call) позволяет вызвать функцию и поймать любые ошибки внутри неё.&lt;/p&gt;
  &lt;h3 id=&quot;07pf&quot;&gt;Пример:&lt;/h3&gt;
  &lt;p id=&quot;2waK&quot;&gt;&lt;code&gt;local success, result = pcall(function()&lt;br /&gt;    return 5 / 0&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6MIj&quot;&gt;&lt;code&gt;if not success then&lt;br /&gt;    print(&amp;quot;Произошла ошибка:&amp;quot;, result)&lt;br /&gt;else&lt;br /&gt;    print(&amp;quot;Результат:&amp;quot;, result)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;STHx&quot;&gt;💡 &lt;code&gt;pcall()&lt;/code&gt; возвращает два значения: успешность выполнения и результат или сообщение об ошибке.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;NpBM&quot;&gt;16.3 — Использование &lt;code&gt;xpcall()&lt;/code&gt; с пользовательским обработчиком&lt;/h2&gt;
  &lt;p id=&quot;5Eog&quot;&gt;&lt;code&gt;xpcall()&lt;/code&gt; работает как &lt;code&gt;pcall()&lt;/code&gt;, но позволяет указать свою функцию для форматирования ошибок.&lt;/p&gt;
  &lt;p id=&quot;D8Zt&quot;&gt;&lt;code&gt;local function errorHandler(err)&lt;br /&gt;    return &amp;quot;Критическая ошибка: &amp;quot; .. err&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Q2u7&quot;&gt;&lt;code&gt;local success, result = xpcall(function()&lt;br /&gt;    local x = 5 / &amp;quot;текст&amp;quot;&lt;br /&gt;end, errorHandler)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;IxIF&quot;&gt;&lt;code&gt;print(result) -- Критическая ошибка: attempt to perform arithmetic on a string value&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;wEs2&quot;&gt;16.4 — Использование &lt;code&gt;warn()&lt;/code&gt; и &lt;code&gt;error()&lt;/code&gt; для отладки&lt;/h2&gt;
  &lt;h3 id=&quot;N6op&quot;&gt;&lt;code&gt;warn()&lt;/code&gt; — вывод предупреждений&lt;/h3&gt;
  &lt;p id=&quot;Igfr&quot;&gt;&lt;code&gt;warn(&amp;quot;Эта функция устарела!&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;t3Fi&quot;&gt;Предупреждения не останавливают выполнение скрипта.&lt;/blockquote&gt;
  &lt;h3 id=&quot;zjHk&quot;&gt;&lt;code&gt;error()&lt;/code&gt; — генерация ошибки&lt;/h3&gt;
  &lt;p id=&quot;6sbl&quot;&gt;&lt;code&gt;if x == nil then&lt;br /&gt;    error(&amp;quot;Переменная x не определена&amp;quot;)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;ux1u&quot;&gt;При вызове &lt;code&gt;error()&lt;/code&gt; выполнение останавливается, и ошибка передаётся выше.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;8y0q&quot;&gt;16.5 — Проверка типов с помощью &lt;code&gt;type()&lt;/code&gt; и &lt;code&gt;typeof()&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;WlRF&quot;&gt;Иногда ошибка возникает из-за неверного типа данных. Лучше проверять заранее.&lt;/p&gt;
  &lt;p id=&quot;YNMf&quot;&gt;&lt;code&gt;local function add(a, b)&lt;br /&gt;    if type(a) ~= &amp;quot;number&amp;quot; or type(b) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;        error(&amp;quot;Ожидаются числа&amp;quot;, 2)&lt;br /&gt;    end&lt;br /&gt;    return a + b&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;it9m&quot;&gt;&lt;code&gt;add(5, &amp;quot;текст&amp;quot;) -- выдаст ошибку&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;LHOK&quot;&gt;Функция - Описание&lt;/p&gt;
  &lt;p id=&quot;GUts&quot;&gt;&lt;code&gt;type()&lt;/code&gt; - Возвращает тип значения (&lt;code&gt;nil&lt;/code&gt;,&lt;code&gt;number&lt;/code&gt;,&lt;code&gt;string&lt;/code&gt;,&lt;code&gt;boolean&lt;/code&gt;,&lt;code&gt;table&lt;/code&gt;,&lt;code&gt;function&lt;/code&gt;)&lt;/p&gt;
  &lt;p id=&quot;J43k&quot;&gt;&lt;code&gt;typeof()&lt;/code&gt; - Возвращает тип объекта Roblox (например,&lt;code&gt;Part&lt;/code&gt;,&lt;code&gt;Sound&lt;/code&gt;,&lt;code&gt;Humanoid&lt;/code&gt;)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;D5J0&quot;&gt;16.6 — Использование &lt;code&gt;assert()&lt;/code&gt; для проверки условий&lt;/h2&gt;
  &lt;p id=&quot;xCNL&quot;&gt;&lt;code&gt;assert()&lt;/code&gt; — удобный способ проверить условие и выдать ошибку, если оно не выполнено.&lt;/p&gt;
  &lt;p id=&quot;ufXB&quot;&gt;&lt;code&gt;local player = game.Players.LocalPlayer&lt;br /&gt;assert(player, &amp;quot;Игрок не найден&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;feBP&quot;&gt;&lt;code&gt;local character = player.Character or player.CharacterAdded:Wait()&lt;br /&gt;assert(character, &amp;quot;Персонаж не загружен&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;3Icj&quot;&gt;16.7 — Чтение стек-трейсов&lt;/h2&gt;
  &lt;p id=&quot;0fqa&quot;&gt;Когда происходит ошибка, Roblox выводит &lt;strong&gt;стек-трейс &lt;/strong&gt;— список всех функций, которые привели к ошибке.&lt;/p&gt;
  &lt;h3 id=&quot;81zZ&quot;&gt;Пример:&lt;/h3&gt;
  &lt;p id=&quot;R3Ej&quot;&gt;&lt;code&gt;Players.Alex.PlayerScripts.Script:5: in function &amp;#x27;add&amp;#x27;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;s3HJ&quot;&gt;&lt;code&gt;Players.Alex.PlayerScripts.Script:10: in main chunk&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;M6fI&quot;&gt;Это значит:&lt;/p&gt;
  &lt;ul id=&quot;Tw83&quot;&gt;
    &lt;li id=&quot;GlAe&quot;&gt;Ошибка произошла в строке 5 функции &lt;code&gt;add&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;N0Uh&quot;&gt;Эта функция была вызвана в строке 10 основного скрипта&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;5S91&quot;&gt;16.8 — Проект: Система защиты от краша&lt;/h2&gt;
  &lt;p id=&quot;DY42&quot;&gt;Создадим систему, которая защищает важную часть кода от краша.&lt;/p&gt;
  &lt;h3 id=&quot;YYZm&quot;&gt;Шаг 1: Защита функции&lt;/h3&gt;
  &lt;p id=&quot;P37l&quot;&gt;&lt;code&gt;local function safeCall(func)&lt;br /&gt;    local success, result = pcall(func)&lt;br /&gt;    if not success then&lt;br /&gt;        warn(&amp;quot;Ошибка в функции:&amp;quot;, result)&lt;br /&gt;    else&lt;br /&gt;        return result&lt;br /&gt;    end&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;yBGA&quot;&gt;Шаг 2: Использование&lt;/h3&gt;
  &lt;p id=&quot;Un7B&quot;&gt;&lt;code&gt;safeCall(function()&lt;br /&gt;    local x = 10 / 0&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4wNq&quot;&gt;&lt;code&gt;print(&amp;quot;Продолжаем выполнение...&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;zEdh&quot;&gt;✅ Этот код не упадёт, а просто выведет ошибку и продолжит работу.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;5Agd&quot;&gt;16.9 — Советы по отладке&lt;/h2&gt;
  &lt;ul id=&quot;G9sO&quot;&gt;
    &lt;li id=&quot;oYQt&quot;&gt;Используй &lt;code&gt;print()&lt;/code&gt; и &lt;code&gt;warn()&lt;/code&gt; для логирования.&lt;/li&gt;
    &lt;li id=&quot;WBt5&quot;&gt;Проверяй существование объектов до их использования.&lt;/li&gt;
    &lt;li id=&quot;4xNM&quot;&gt;Не используй глобальные переменные без проверки.&lt;/li&gt;
    &lt;li id=&quot;nHr2&quot;&gt;Используй &lt;code&gt;pcall()&lt;/code&gt; для внешних вызовов.&lt;/li&gt;
    &lt;li id=&quot;J2th&quot;&gt;Указывай уровень в &lt;code&gt;error()&lt;/code&gt; для точного трейса.&lt;/li&gt;
    &lt;li id=&quot;RsT3&quot;&gt;Тестируй каждую функцию отдельно.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;hWWR&quot;&gt;16.10 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;wUYX&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;amWL&quot;&gt;pcall - Безопасный вызов функции&lt;/p&gt;
  &lt;p id=&quot;FYWM&quot;&gt;xpcall - Вызов с пользовательским обработчиком ошибок&lt;/p&gt;
  &lt;p id=&quot;bYWl&quot;&gt;warn - Выводит предупреждение&lt;/p&gt;
  &lt;p id=&quot;FhZn&quot;&gt;error - Генерирует ошибку&lt;/p&gt;
  &lt;p id=&quot;DkE0&quot;&gt;assert - Проверяет условие и вызывает ошибку, если оно не выполнено&lt;/p&gt;
  &lt;p id=&quot;482f&quot;&gt;stack trace - Список вызванных функций&lt;/p&gt;
  &lt;p id=&quot;aBgz&quot;&gt;type - Возвращает тип значения&lt;/p&gt;
  &lt;p id=&quot;605r&quot;&gt;typeof - Возвращает тип объекта Roblox&lt;/p&gt;
  &lt;p id=&quot;dEgB&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;9vOw&quot;&gt;🔹 Глава 17: Плагины для Roblox Studio.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;LpG2&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;29Qx&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;l9Eh&quot;&gt;
    &lt;li id=&quot;uujh&quot;&gt;Что такое плагины в Roblox Studio и зачем они нужны.&lt;/li&gt;
    &lt;li id=&quot;IyDs&quot;&gt;Как создавать простые и сложные плагины.&lt;/li&gt;
    &lt;li id=&quot;ueSB&quot;&gt;Как добавлять кнопки, меню, контекстные действия.&lt;/li&gt;
    &lt;li id=&quot;iuPs&quot;&gt;Как использовать API Roblox Studio для автоматизации задач.&lt;/li&gt;
    &lt;li id=&quot;QbLu&quot;&gt;Как сохранять и распространять свои плагины.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;nZw3&quot;&gt;17.1 — Что такое плагин?&lt;/h2&gt;
  &lt;p id=&quot;SZPM&quot;&gt;Плагин — это скрипт, который работает внутри Roblox Studio и позволяет улучшать и ускорять процесс разработки.&lt;/p&gt;
  &lt;h3 id=&quot;KmXF&quot;&gt;Основные возможности:&lt;/h3&gt;
  &lt;ul id=&quot;V4Hx&quot;&gt;
    &lt;li id=&quot;egNl&quot;&gt;Добавление новых инструментов&lt;/li&gt;
    &lt;li id=&quot;hbjN&quot;&gt;Автоматизация рутинных действий&lt;/li&gt;
    &lt;li id=&quot;ojw2&quot;&gt;Работа с деревом объектов&lt;/li&gt;
    &lt;li id=&quot;jTe9&quot;&gt;Расширение возможностей интерфейса&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ykna&quot;&gt;17.2 — Создание первого плагина&lt;/h2&gt;
  &lt;h3 id=&quot;tQA1&quot;&gt;Шаг 1: Открой Plugin Editor&lt;/h3&gt;
  &lt;ol id=&quot;V3MZ&quot;&gt;
    &lt;li id=&quot;Eijk&quot;&gt;Открой Roblox Studio.&lt;/li&gt;
    &lt;li id=&quot;eX8t&quot;&gt;Перейди в &lt;strong&gt;Plugins &lt;/strong&gt;→ &lt;strong&gt;Plugin Manager &lt;/strong&gt;.&lt;/li&gt;
    &lt;li id=&quot;gGjq&quot;&gt;Нажми &lt;strong&gt;Create Plugin &lt;/strong&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;p1Op&quot;&gt;Шаг 2: Добавь код&lt;/h3&gt;
  &lt;p id=&quot;8Ehj&quot;&gt;&lt;code&gt;-- Main Script&lt;br /&gt;local plugin = script:FindFirstAncestor(&amp;quot;MyFirstPlugin&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ddEI&quot;&gt;&lt;code&gt;local toolbar = plugin:CreateToolbar(&amp;quot;Мои инструменты&amp;quot;)&lt;br /&gt;local button = toolbar:CreateButton(&amp;quot;Привет&amp;quot;, &amp;quot;Нажми меня&amp;quot;, &amp;quot;&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Nvwd&quot;&gt;&lt;code&gt;button.Clicked:Connect(function()&lt;br /&gt;    print(&amp;quot;Привет от плагина!&amp;quot;)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;U71y&quot;&gt;✅ Теперь у тебя есть новая кнопка в панели инструментов!&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Y4Kd&quot;&gt;17.3 — Структура плагина&lt;/h2&gt;
  &lt;p id=&quot;agKU&quot;&gt;Типичный плагин состоит из:&lt;/p&gt;
  &lt;p id=&quot;pc29&quot;&gt;Элемент - Описание&lt;/p&gt;
  &lt;p id=&quot;bXQQ&quot;&gt;&lt;code&gt;Plugin&lt;/code&gt; - Корневой объект плагина&lt;/p&gt;
  &lt;p id=&quot;HZMz&quot;&gt;&lt;code&gt;Toolbar&lt;/code&gt; - Панель инструментов&lt;/p&gt;
  &lt;p id=&quot;ztJa&quot;&gt;&lt;code&gt;Button&lt;/code&gt; - Кнопка на панели&lt;/p&gt;
  &lt;p id=&quot;excA&quot;&gt;&lt;code&gt;Menu&lt;/code&gt; - Выпадающее меню&lt;/p&gt;
  &lt;p id=&quot;7qMn&quot;&gt;&lt;code&gt;Context Menu&lt;/code&gt; - ПКМ-меню на объектах&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;O19S&quot;&gt;17.4 — Работа с деревом объектов через API&lt;/h2&gt;
  &lt;p id=&quot;lKOZ&quot;&gt;Плагины имеют доступ к полному API Roblox Studio и могут изменять объекты напрямую.&lt;/p&gt;
  &lt;h3 id=&quot;ZV7r&quot;&gt;Пример: Создай Part при нажатии&lt;/h3&gt;
  &lt;p id=&quot;StVf&quot;&gt;&lt;code&gt;button.Clicked:Connect(function()&lt;br /&gt;    local part = Instance.new(&amp;quot;Part&amp;quot;)&lt;br /&gt;    part.Size = Vector3.new(2, 2, 2)&lt;br /&gt;    part.Position = Vector3.new(0, 5, 0)&lt;br /&gt;    part.Anchored = true&lt;br /&gt;    part.Parent = workspace&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;devO&quot;&gt;17.5 — Добавление контекстного меню&lt;/h2&gt;
  &lt;p id=&quot;TGdo&quot;&gt;Контекстное меню появляется при правом клике на объекте.&lt;/p&gt;
  &lt;p id=&quot;rG60&quot;&gt;&lt;code&gt;plugin:CreateContextMenu(&amp;quot;Увеличить размер&amp;quot;, function(objects)&lt;br /&gt;    for _, obj in ipairs(objects) do&lt;br /&gt;        if obj:IsA(&amp;quot;BasePart&amp;quot;) then&lt;br /&gt;            obj.Size += Vector3.new(1, 1, 1)&lt;br /&gt;        end&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Q6av&quot;&gt;17.6 — Сохранение и загрузка данных плагина&lt;/h2&gt;
  &lt;p id=&quot;ayJQ&quot;&gt;Плагины могут хранить данные локально (в пределах сессии):&lt;/p&gt;
  &lt;p id=&quot;3HXl&quot;&gt;&lt;code&gt;local storage = require(game:GetService(&amp;quot;ReplicatedStorage&amp;quot;).PluginStorage)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;APer&quot;&gt;&lt;code&gt;button.Clicked:Connect(function()&lt;br /&gt;    storage.LastAction = &amp;quot;Кнопка нажата&amp;quot;&lt;br /&gt;    print(&amp;quot;Сохранено:&amp;quot;, storage.LastAction)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;wduf&quot;&gt;17.7 — Проект: Плагин для быстрого создания дверей&lt;/h2&gt;
  &lt;p id=&quot;qH3K&quot;&gt;Создадим плагин, который создаёт дверь с функцией открытия/закрытия.&lt;/p&gt;
  &lt;h3 id=&quot;9fxZ&quot;&gt;Шаг 1: Добавь кнопку&lt;/h3&gt;
  &lt;p id=&quot;xPFA&quot;&gt;&lt;code&gt;local plugin = script:FindFirstAncestor(&amp;quot;DoorTool&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;y9YT&quot;&gt;&lt;code&gt;local toolbar = plugin:CreateToolbar(&amp;quot;Инструменты&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ub5P&quot;&gt;&lt;code&gt;local createButton = toolbar:CreateButton(&amp;quot;Создать дверь&amp;quot;, &amp;quot;Создаёт новую дверь&amp;quot;, &amp;quot;&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;zjfL&quot;&gt;Шаг 2: Логика двери&lt;/h3&gt;
  &lt;p id=&quot;IWkn&quot;&gt;&lt;code&gt;createButton.Clicked:Connect(function()&lt;br /&gt;    local door = Instance.new(&amp;quot;Model&amp;quot;)&lt;br /&gt;    door.Name = &amp;quot;Door&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dVhl&quot;&gt;&lt;code&gt;    local frame = Instance.new(&amp;quot;Part&amp;quot;)&lt;br /&gt;    frame.Size = Vector3.new(2, 5, 0.5)&lt;br /&gt;    frame.BrickColor = BrickColor.Brown()&lt;br /&gt;    frame.Anchored = true&lt;br /&gt;    frame.Locked = true&lt;br /&gt;    frame.Parent = door&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;T85b&quot;&gt;&lt;code&gt;    local hinge = Instance.new(&amp;quot;HingeConstraint&amp;quot;)&lt;br /&gt;    hinge.Attachment0 = Instance.new(&amp;quot;Attachment&amp;quot;, frame)&lt;br /&gt;    hinge.Attachment0.Position = Vector3.new(-1, 0, 0)&lt;br /&gt;    hinge.LimitsEnabled = true&lt;br /&gt;    hinge.LowerAngle = -90&lt;br /&gt;    hinge.UpperAngle = 0&lt;br /&gt;    hinge.Parent = frame&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;L7Zi&quot;&gt;&lt;code&gt;    frame.CFrame = CFrame.new(0, 5, 10)&lt;br /&gt;    door.Parent = workspace&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;fJnE&quot;&gt;Шаг 3: Добавь интерактивность&lt;/h3&gt;
  &lt;p id=&quot;ol1R&quot;&gt;&lt;code&gt;local openButton = toolbar:CreateButton(&amp;quot;Открыть дверь&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OUcZ&quot;&gt;&lt;code&gt;openButton.Clicked:Connect(function()&lt;br /&gt;    for _, door in ipairs(workspace:GetChildren()) do&lt;br /&gt;        if door.Name == &amp;quot;Door&amp;quot; then&lt;br /&gt;            local hinge = door.HingeConstraint&lt;br /&gt;            hinge.UpperAngle = 90&lt;br /&gt;        end&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;y4Ah&quot;&gt;17.8 — Советы по созданию плагинов&lt;/h2&gt;
  &lt;ul id=&quot;l8qR&quot;&gt;
    &lt;li id=&quot;Z9xh&quot;&gt;Используй понятные названия для кнопок и панелей.&lt;/li&gt;
    &lt;li id=&quot;ekYM&quot;&gt;Не изменяй чужие объекты без подтверждения.&lt;/li&gt;
    &lt;li id=&quot;DohS&quot;&gt;Тестируй плагины перед публикацией.&lt;/li&gt;
    &lt;li id=&quot;Jj7c&quot;&gt;Документируй функционал и параметры.&lt;/li&gt;
    &lt;li id=&quot;097K&quot;&gt;Публикуй плагины на &lt;a href=&quot;https://www.roblox.com/library&quot; target=&quot;_blank&quot;&gt;https://www.roblox.com/library &lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;UaIU&quot;&gt;17.9 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;xwWk&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;ViM2&quot;&gt;Plugin - Объект, представляющий плагин&lt;/p&gt;
  &lt;p id=&quot;qiag&quot;&gt;Toolbar - Панель инструментов&lt;/p&gt;
  &lt;p id=&quot;watD&quot;&gt;Button - Кнопка на панели&lt;/p&gt;
  &lt;p id=&quot;Iid5&quot;&gt;Context Menu - Меню при правом клике&lt;/p&gt;
  &lt;p id=&quot;hMFW&quot;&gt;HingeConstraint - Шарнир для движения&lt;/p&gt;
  &lt;p id=&quot;hVsF&quot;&gt;Attachment - Точка привязки&lt;/p&gt;
  &lt;p id=&quot;63RC&quot;&gt;PluginStorage - Хранилище данных плагина&lt;/p&gt;
  &lt;p id=&quot;qv98&quot;&gt;CreateButton - Создаёт кнопку в интерфейсе&lt;/p&gt;
  &lt;p id=&quot;uJUq&quot;&gt;CreateContextMenu - Добавляет пункт в контекстное меню&lt;/p&gt;
  &lt;p id=&quot;81gP&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;kF6T&quot;&gt;🔹 Глава 18: Мультиплеер и работа с командами.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;676E&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;mg8F&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;zzqW&quot;&gt;
    &lt;li id=&quot;5eur&quot;&gt;Как работает мультиплеер в Roblox.&lt;/li&gt;
    &lt;li id=&quot;7Ka0&quot;&gt;Как взаимодействовать с другими игроками.&lt;/li&gt;
    &lt;li id=&quot;rB6c&quot;&gt;Как создавать команды (Teams) и управлять ими.&lt;/li&gt;
    &lt;li id=&quot;pndM&quot;&gt;Как реализовать систему битвы, чата и рейтинга.&lt;/li&gt;
    &lt;li id=&quot;zHMO&quot;&gt;Как использовать серверные данные для всех игроков.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;18lQ&quot;&gt;18.1 — Что такое мультиплеер?&lt;/h2&gt;
  &lt;p id=&quot;4izJ&quot;&gt;Roblox изначально поддерживает &lt;strong&gt;мультиплеер &lt;/strong&gt;, то есть возможность одновременной игры нескольких игроков в одном мире.&lt;/p&gt;
  &lt;h3 id=&quot;UjTB&quot;&gt;Основные особенности:&lt;/h3&gt;
  &lt;ul id=&quot;IX3j&quot;&gt;
    &lt;li id=&quot;vn8A&quot;&gt;Каждый игрок имеет своего персонажа.&lt;/li&gt;
    &lt;li id=&quot;pZkX&quot;&gt;Все действия отслеживаются на сервере.&lt;/li&gt;
    &lt;li id=&quot;jHlp&quot;&gt;Можно взаимодействовать с другими игроками.&lt;/li&gt;
    &lt;li id=&quot;k3FS&quot;&gt;Поддержка команд, лидербордов, чата и т.д.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;vkrv&quot;&gt;18.2 — Работа с игроками&lt;/h2&gt;
  &lt;p id=&quot;vQiZ&quot;&gt;&lt;code&gt;Roblox предоставляет доступ ко всем игрокам через сервис Players.&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JgT9&quot;&gt;&lt;code&gt;local players = game:GetService(&amp;quot;Players&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;bDL1&quot;&gt;&lt;code&gt;players.PlayerAdded:Connect(function(player)&lt;br /&gt;    print(player.Name .. &amp;quot; зашёл в игру&amp;quot;)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;DLnu&quot;&gt;&lt;code&gt;players.PlayerRemoving:Connect(function(player)&lt;br /&gt;    print(player.Name .. &amp;quot; вышел из игры&amp;quot;)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;WVF9&quot;&gt;18.3 — Использование команд (Teams)&lt;/h2&gt;
  &lt;p id=&quot;p0hQ&quot;&gt;Команды позволяют группировать игроков и управлять их взаимодействием.&lt;/p&gt;
  &lt;h3 id=&quot;7Bn3&quot;&gt;Создание команд:&lt;/h3&gt;
  &lt;p id=&quot;AVAC&quot;&gt;&lt;code&gt;local team1 = Instance.new(&amp;quot;Team&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;R6IP&quot;&gt;&lt;code&gt;team1.Name = &amp;quot;Красные&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;sAgo&quot;&gt;&lt;code&gt;team1.TeamColor = BrickColor.Red()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;L6LW&quot;&gt;&lt;code&gt;team1.Parent = game.Teams&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ibRt&quot;&gt;&lt;code&gt;local team2 = Instance.new(&amp;quot;Team&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;7uWI&quot;&gt;&lt;code&gt;team2.Name = &amp;quot;Синие&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;fbMx&quot;&gt;&lt;code&gt;team2.TeamColor = BrickColor.Blue()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QI98&quot;&gt;&lt;code&gt;team2.Parent = game.Teams&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;6F55&quot;&gt;Назначение игрока в команду:&lt;/h3&gt;
  &lt;p id=&quot;zqP6&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    if player.UserId % 2 == 0 then&lt;br /&gt;        player.Team = team1&lt;br /&gt;    else&lt;br /&gt;        player.Team = team2&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;w39P&quot;&gt;18.4 — Управление взаимодействием между игроками&lt;/h2&gt;
  &lt;p id=&quot;4NXF&quot;&gt;По умолчанию игроки могут взаимодействовать друг с другом. Но можно изменить поведение, например, чтобы игроки одной команды не наносили урон друг другу.&lt;/p&gt;
  &lt;h3 id=&quot;clwc&quot;&gt;Отключение дружеского огня:&lt;/h3&gt;
  &lt;p id=&quot;wkVt&quot;&gt;&lt;code&gt;workspace:SetRealPhysicsCollisionAsync(true)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;8N3b&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    player.Damaged:Connect(function(hit)&lt;br /&gt;        local otherPlayer = game.Players:GetPlayerFromCharacter(hit.Parent)&lt;br /&gt;        if otherPlayer and otherPlayer.Team == player.Team then&lt;br /&gt;            hit.Parent.Humanoid.Health = hit.Parent.Humanoid.MaxHealth&lt;br /&gt;        end&lt;br /&gt;    end)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;uZIi&quot;&gt;18.5 — Проект: Система команд и битва&lt;/h2&gt;
  &lt;p id=&quot;461B&quot;&gt;Создадим простую систему, где игроки делятся на две команды и получают бонус при убийстве игрока из другой команды.&lt;/p&gt;
  &lt;h3 id=&quot;JiWu&quot;&gt;Шаг 1: Настройка команд&lt;/h3&gt;
  &lt;p id=&quot;C9Ew&quot;&gt;&lt;code&gt;-- ServerScriptService&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BF98&quot;&gt;&lt;code&gt;local redTeam = Instance.new(&amp;quot;Team&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;aT5C&quot;&gt;&lt;code&gt;redTeam.Name = &amp;quot;Красные&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ICnq&quot;&gt;&lt;code&gt;redTeam.TeamColor = BrickColor.Red()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WSYP&quot;&gt;&lt;code&gt;redTeam.Parent = game:GetService(&amp;quot;Teams&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;aw4g&quot;&gt;&lt;code&gt;local blueTeam = Instance.new(&amp;quot;Team&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1SXv&quot;&gt;&lt;code&gt;blueTeam.Name = &amp;quot;Синие&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;PlJX&quot;&gt;&lt;code&gt;blueTeam.TeamColor = BrickColor.Blue()&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KeDC&quot;&gt;&lt;code&gt;blueTeam.Parent = game:GetService(&amp;quot;Teams&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;DHDu&quot;&gt;Шаг 2: Распределение игроков&lt;/h3&gt;
  &lt;p id=&quot;vpLB&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    if #redTeam:GetPlayers() &amp;lt;= #blueTeam:GetPlayers() then&lt;br /&gt;        player.Team = redTeam&lt;br /&gt;    else&lt;br /&gt;        player.Team = blueTeam&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;4q9l&quot;&gt;Шаг 3: Система очков за убийства&lt;/h3&gt;
  &lt;p id=&quot;vIxH&quot;&gt;&lt;code&gt;-- Добавим лидерборд&lt;br /&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    local leaderstats = Instance.new(&amp;quot;Folder&amp;quot;)&lt;br /&gt;    leaderstats.Name = &amp;quot;leaderstats&amp;quot;&lt;br /&gt;    leaderstats.Parent = player&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;A76i&quot;&gt;&lt;code&gt;    local kills = Instance.new(&amp;quot;IntValue&amp;quot;)&lt;br /&gt;    kills.Name = &amp;quot;Убийства&amp;quot;&lt;br /&gt;    kills.Value = 0&lt;br /&gt;    kills.Parent = leaderstats&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hWdV&quot;&gt;&lt;code&gt;— Обработка убийств&lt;br /&gt;workspace.Debris.ItemSpawned:Connect(function(part)&lt;br /&gt;    if part:IsA(&amp;quot;Humanoid&amp;quot;) then&lt;br /&gt;        part.Died:Connect(function()&lt;br /&gt;            local killer = part.Killer&lt;br /&gt;            if killer then&lt;br /&gt;                local value = killer:FindFirstChild(&amp;quot;leaderstats&amp;quot;) and killer.leaderstats:FindFirstChild(&amp;quot;Убийства&amp;quot;)&lt;br /&gt;                if value then&lt;br /&gt;                    value.Value += 1&lt;br /&gt;                end&lt;br /&gt;            end&lt;br /&gt;        end)&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ritQ&quot;&gt;18.6 — Чат и сообщения между игроками&lt;/h2&gt;
  &lt;p id=&quot;iPXY&quot;&gt;Roblox имеет встроенный чат. Также можно добавлять свои функции, например, команды в чате.&lt;/p&gt;
  &lt;h3 id=&quot;ynaM&quot;&gt;Пример: команда &lt;code&gt;/team&lt;/code&gt;&lt;/h3&gt;
  &lt;p id=&quot;iBMn&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    player.Chatted:Connect(function(message)&lt;br /&gt;        if message:sub(1, 6) == &amp;quot;/team&amp;quot; then&lt;br /&gt;            local teamName = message:sub(7)&lt;br /&gt;            local team = game.Teams:FindFirstChild(teamName)&lt;br /&gt;            if team then&lt;br /&gt;                player.Team = team&lt;br /&gt;                print(player.Name .. &amp;quot; присоединился к команде &amp;quot; .. team.Name)&lt;br /&gt;            else&lt;br /&gt;                print(&amp;quot;Команда не найдена.&amp;quot;)&lt;br /&gt;            end&lt;br /&gt;        end&lt;br /&gt;    end)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;s6DO&quot;&gt;18.7 — Работа с таблицами игроков&lt;/h2&gt;
  &lt;p id=&quot;bRJV&quot;&gt;Иногда нужно хранить данные о всех игроках.&lt;/p&gt;
  &lt;p id=&quot;9gJB&quot;&gt;&lt;code&gt;local activePlayers = {}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;04vq&quot;&gt;&lt;code&gt;game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    activePlayers[player] = true&lt;br /&gt;    print(&amp;quot;Текущие игроки:&amp;quot;, table.count(activePlayers))&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;xKl3&quot;&gt;&lt;code&gt;game.Players.PlayerRemoving:Connect(function(player)&lt;br /&gt;    activePlayers[player] = nil&lt;br /&gt;    print(&amp;quot;Текущие игроки:&amp;quot;, table.count(activePlayers))&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;BrVJ&quot;&gt;18.8 — Советы по работе с мультиплеером&lt;/h2&gt;
  &lt;ul id=&quot;JtWg&quot;&gt;
    &lt;li id=&quot;hKZp&quot;&gt;Используй &lt;code&gt;RemoteEvent&lt;/code&gt; для связи между клиентом и сервером.&lt;/li&gt;
    &lt;li id=&quot;JeJp&quot;&gt;Не доверяй данным от клиента — всегда проверяй их на сервере.&lt;/li&gt;
    &lt;li id=&quot;TPtv&quot;&gt;Используй &lt;code&gt;leaderstats&lt;/code&gt; для отображения данных.&lt;/li&gt;
    &lt;li id=&quot;3iYN&quot;&gt;Тестируй игру с несколькими аккаунтами.&lt;/li&gt;
    &lt;li id=&quot;pjfa&quot;&gt;Используй &lt;code&gt;DataStore&lt;/code&gt; для сохранения прогресса.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;aWbW&quot;&gt;18.9 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;ZXVO&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;OEdT&quot;&gt;Players - Сервис для работы с игроками&lt;/p&gt;
  &lt;p id=&quot;VFPc&quot;&gt;Team - Команда, к которой относится игрок&lt;/p&gt;
  &lt;p id=&quot;nMmb&quot;&gt;Chatted - Событие при вводе сообщения в чате&lt;/p&gt;
  &lt;p id=&quot;MrQ3&quot;&gt;RemoteEvent - Передача данных от клиента к серверу&lt;/p&gt;
  &lt;p id=&quot;YkhF&quot;&gt;leaderstats - Отображение статистики игрока&lt;/p&gt;
  &lt;p id=&quot;68hQ&quot;&gt;Humanoid - Управление здоровьем и смертью&lt;/p&gt;
  &lt;p id=&quot;y0dE&quot;&gt;Died - Событие смерти персонажа&lt;/p&gt;
  &lt;p id=&quot;VitB&quot;&gt;Killer - Игрок, который нанёс финальный урон&lt;/p&gt;
  &lt;p id=&quot;rYDa&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;5Ghl&quot;&gt;🔹 Глава 19: Оптимизация и производительность.&lt;/h1&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;v3Tz&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;LYJq&quot;&gt;В этой главе ты узнаешь:&lt;/p&gt;
  &lt;ul id=&quot;6bcJ&quot;&gt;
    &lt;li id=&quot;mq6r&quot;&gt;Как улучшить производительность игры.&lt;/li&gt;
    &lt;li id=&quot;2jTC&quot;&gt;Что влияет на FPS и загрузку сервера.&lt;/li&gt;
    &lt;li id=&quot;tpkk&quot;&gt;Как правильно управлять объектами, событиями и памятью.&lt;/li&gt;
    &lt;li id=&quot;jiuk&quot;&gt;Как использовать инструменты Roblox для анализа.&lt;/li&gt;
    &lt;li id=&quot;Gre3&quot;&gt;Как избежать лагов, вылетов и багов при большом количестве игроков.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;c3qw&quot;&gt;19.1 — Почему важна оптимизация?&lt;/h2&gt;
  &lt;p id=&quot;a5Fu&quot;&gt;Когда игра становится популярной, она может одновременно запускаться у сотен или тысяч игроков. Без оптимизации это приведёт к:&lt;/p&gt;
  &lt;ul id=&quot;DsWn&quot;&gt;
    &lt;li id=&quot;6q9M&quot;&gt;Падению FPS&lt;/li&gt;
    &lt;li id=&quot;eJSx&quot;&gt;Задержкам&lt;/li&gt;
    &lt;li id=&quot;ax0F&quot;&gt;Крахам сервера&lt;/li&gt;
    &lt;li id=&quot;6iHs&quot;&gt;Плохому опыту игрока&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;oL1b&quot;&gt;Цели оптимизации:&lt;/h3&gt;
  &lt;ul id=&quot;Yln4&quot;&gt;
    &lt;li id=&quot;AK5R&quot;&gt;Увеличение FPS&lt;/li&gt;
    &lt;li id=&quot;QmCn&quot;&gt;Снижение нагрузки на сервер&lt;/li&gt;
    &lt;li id=&quot;PEy1&quot;&gt;Более стабильная работа&lt;/li&gt;
    &lt;li id=&quot;Mart&quot;&gt;Меньше потребление ресурсов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;uqv1&quot;&gt;19.2 — Использование инструментов диагностики&lt;/h2&gt;
  &lt;p id=&quot;vfry&quot;&gt;Roblox Studio предоставляет мощные инструменты для отладки:&lt;/p&gt;
  &lt;h3 id=&quot;WR33&quot;&gt;🔍 Performance Stats&lt;/h3&gt;
  &lt;ul id=&quot;M2lc&quot;&gt;
    &lt;li id=&quot;1mVa&quot;&gt;Открой &lt;strong&gt;View → Output&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;0kKn&quot;&gt;Перейди в &lt;strong&gt;Performance &lt;/strong&gt;(вкладка)&lt;/li&gt;
    &lt;li id=&quot;FJKd&quot;&gt;Следи за:&lt;/li&gt;
    &lt;ul id=&quot;bT8E&quot;&gt;
      &lt;li id=&quot;VKUl&quot;&gt;Physics Heartbeat&lt;/li&gt;
      &lt;li id=&quot;hJDI&quot;&gt;Network Heartbeat&lt;/li&gt;
      &lt;li id=&quot;ZZwk&quot;&gt;Garbage Collection Time&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;tssJ&quot;&gt;📈 Memory Usage&lt;/h3&gt;
  &lt;ul id=&quot;m50y&quot;&gt;
    &lt;li id=&quot;mbmC&quot;&gt;Открой &lt;strong&gt;Script Editor → Tools → Memory Usage&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;Vt0c&quot;&gt;Проверяй, не происходит ли утечки памяти.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;NzUk&quot;&gt;19.3 — Управление объектами&lt;/h2&gt;
  &lt;p id=&quot;KIVk&quot;&gt;Создание и удаление объектов — дорогостоящая операция. Вот как сделать это эффективнее:&lt;/p&gt;
  &lt;h3 id=&quot;97FT&quot;&gt;❌ Плохо: Создание объекта каждый раз&lt;/h3&gt;
  &lt;p id=&quot;38g6&quot;&gt;&lt;code&gt;while true do&lt;br /&gt;    local part = Instance.new(&amp;quot;Part&amp;quot;)&lt;br /&gt;    part.Parent = workspace&lt;br /&gt;    wait(0.1)&lt;br /&gt;    part:Destroy()&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;VHgR&quot;&gt;✅ Хорошо: Переиспользование объекта&lt;/h3&gt;
  &lt;p id=&quot;iNUp&quot;&gt;&lt;code&gt;local part = Instance.new(&amp;quot;Part&amp;quot;)&lt;br /&gt;part.Anchored = true&lt;br /&gt;part.Parent = workspace&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zksz&quot;&gt;&lt;code&gt;while true do&lt;br /&gt;    part.Position = Vector3.new(math.random(-10, 10), 5, math.random(-10, 10))&lt;br /&gt;    wait(0.1)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;fVx6&quot;&gt;19.4 — Оптимизация скриптов&lt;/h2&gt;
  &lt;h3 id=&quot;oSy6&quot;&gt;Не используй бесконечные циклы без &lt;code&gt;wait()&lt;/code&gt;&lt;/h3&gt;
  &lt;p id=&quot;kaO4&quot;&gt;Бесконечный цикл без задержки может заблокировать игру.&lt;/p&gt;
  &lt;p id=&quot;DLoT&quot;&gt;&lt;code&gt;-- ❌ НЕПРАВИЛЬНО&lt;br /&gt;while true do&lt;br /&gt;    -- делаем что-то&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;tmDv&quot;&gt;&lt;code&gt;--✅ ПРАВИЛЬНО&lt;br /&gt;while true do&lt;br /&gt;    -- делаем что-то&lt;br /&gt;    wait(0.1)&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Xl8L&quot;&gt;Избегай частых вызовов &lt;code&gt;GetService()&lt;/code&gt; и &lt;code&gt;FindFirstChild()&lt;/code&gt;&lt;/h3&gt;
  &lt;p id=&quot;kXv0&quot;&gt;&lt;code&gt;-- ❌ Вызов внутри цикла — медленно&lt;br /&gt;for _, player in ipairs(game:GetService(&amp;quot;Players&amp;quot;):GetPlayers()) do&lt;br /&gt;    -- ...&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;g9hF&quot;&gt;&lt;code&gt;-- ✅ Вызов один раз — быстро&lt;br /&gt;local players = game:GetService(&amp;quot;Players&amp;quot;):GetPlayers()&lt;br /&gt;for _, player in ipairs(players) do&lt;br /&gt;    -- ...&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Kfh3&quot;&gt;19.5 — Работа с событиями&lt;/h2&gt;
  &lt;p id=&quot;lz3K&quot;&gt;Подписка на события — полезная, но опасная вещь, если делать это бездумно.&lt;/p&gt;
  &lt;h3 id=&quot;i0XX&quot;&gt;Подписывайся только когда нужно&lt;/h3&gt;
  &lt;p id=&quot;e8lu&quot;&gt;&lt;code&gt;player.CharacterAdded:Connect(function(char)&lt;br /&gt;    char.Humanoid.Died:Connect(onPlayerDied)&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;JTz1&quot;&gt;Удаляй обработчики, когда они больше не нужны&lt;/h3&gt;
  &lt;p id=&quot;b993&quot;&gt;&lt;code&gt;local connection = game.Players.PlayerAdded:Connect(function(player)&lt;br /&gt;    print(player.Name .. &amp;quot; зашёл&amp;quot;)&lt;br /&gt;    connection:Disconnect()&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;9sRp&quot;&gt;19.6 — Оптимизация физики и движений&lt;/h2&gt;
  &lt;p id=&quot;eBKS&quot;&gt;Физика — одна из самых тяжёлых частей игры.&lt;/p&gt;
  &lt;h3 id=&quot;ugsX&quot;&gt;Используй &lt;code&gt;BodyMovers&lt;/code&gt; с умом&lt;/h3&gt;
  &lt;p id=&quot;DWnB&quot;&gt;&lt;code&gt;-- Лучше уничтожать BodyMover после использования&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ig7o&quot;&gt;&lt;code&gt;local bodyPos = Instance.new(&amp;quot;BodyPosition&amp;quot;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;g96X&quot;&gt;&lt;code&gt;bodyPos.Parent = part&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;aaYJ&quot;&gt;&lt;code&gt;-- ... выполняем действие ...&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;n7ZE&quot;&gt;&lt;code&gt;bodyPos:Destroy()&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Pa6h&quot;&gt;Избегай множества &lt;code&gt;Touched&lt;/code&gt; событий&lt;/h3&gt;
  &lt;p id=&quot;fBlI&quot;&gt;&lt;code&gt;-- ❌ Для каждой части отдельное событие&lt;br /&gt;part.Touched:Connect(function(hit) end)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;C2cL&quot;&gt;&lt;code&gt;-- ✅ Используй один детектор столкновений&lt;br /&gt;workspace.Changed:Connect(function(part)&lt;br /&gt;    if part:IsA(&amp;quot;BasePart&amp;quot;) then&lt;br /&gt;        part.Touched:Connect(function(hit) end)&lt;br /&gt;    end&lt;br /&gt;end)&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;PZI0&quot;&gt;19.7 — Проект: Система пулов объектов&lt;/h2&gt;
  &lt;p id=&quot;laxN&quot;&gt;Создадим систему пула объектов — механизм, который переиспользует объекты вместо постоянного создания новых.&lt;/p&gt;
  &lt;p id=&quot;r08R&quot;&gt;&lt;code&gt;-- PoolManager.lua&lt;br /&gt;local pool = {}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WHTR&quot;&gt;&lt;code&gt;function createPoolItem()&lt;br /&gt;    local part = Instance.new(&amp;quot;Part&amp;quot;)&lt;br /&gt;    part.Anchored = true&lt;br /&gt;    part.Size = Vector3.new(1, 1, 1)&lt;br /&gt;    part.Transparency = 0.5&lt;br /&gt;    return part&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EIlQ&quot;&gt;&lt;code&gt;function spawnFromPool()&lt;br /&gt;    for i, part in ipairs(pool) do&lt;br /&gt;        if not part.Parent then&lt;br /&gt;            part.Parent = workspace&lt;br /&gt;            return part&lt;br /&gt;        end&lt;br /&gt;    end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EBxZ&quot;&gt;&lt;code&gt;    local newPart = createPoolItem()&lt;br /&gt;    newPart.Parent = workspace&lt;br /&gt;    table.insert(pool, newPart)&lt;br /&gt;    return newPart&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Dile&quot;&gt;&lt;code&gt;— Пример использования&lt;br /&gt;while true do&lt;br /&gt;    local part = spawnFromPool()&lt;br /&gt;    part.CFrame = CFrame.new(math.random(-10, 10), 5, math.random(-10, 10))&lt;br /&gt;    wait(1)&lt;br /&gt;    part.Parent = nil&lt;br /&gt;end&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;RK19&quot;&gt;19.8 — Советы по оптимизации&lt;/h2&gt;
  &lt;p id=&quot;HTuW&quot;&gt;Тема - Совет&lt;/p&gt;
  &lt;p id=&quot;ohpM&quot;&gt;Объекты - Используй пулы, а не создание/удаление&lt;/p&gt;
  &lt;p id=&quot;JlVZ&quot;&gt;События - Подписывайся только тогда, когда нужно&lt;/p&gt;
  &lt;p id=&quot;SpcQ&quot;&gt;Физика - Минимизируй использование&lt;code&gt;Touched&lt;/code&gt;,&lt;code&gt;BodyMovers&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zYcv&quot;&gt;Память - Удаляй лишние объекты и таблицы&lt;/p&gt;
  &lt;p id=&quot;2lsc&quot;&gt;GUI - Используй&lt;code&gt;GuiObject.Visible&lt;/code&gt;вместо удаления&lt;/p&gt;
  &lt;p id=&quot;iN0o&quot;&gt;DataStore - Не делай слишком много запросов за короткий срок&lt;/p&gt;
  &lt;p id=&quot;yD0W&quot;&gt;RemoteEvents - Фильтруй данные, проверяй доступ&lt;/p&gt;
  &lt;p id=&quot;vH5F&quot;&gt;Анимации - Используй кэшированные треки&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;WH1M&quot;&gt;19.9 — Ключевые термины&lt;/h2&gt;
  &lt;p id=&quot;BCJK&quot;&gt;Термин - Описание&lt;/p&gt;
  &lt;p id=&quot;ubB5&quot;&gt;FPS - Кадры в секунду&lt;/p&gt;
  &lt;p id=&quot;J2zy&quot;&gt;Garbage Collector - Сборщик мусора Lua&lt;/p&gt;
  &lt;p id=&quot;Ikm5&quot;&gt;Pool - Пул объектов для повторного использования&lt;/p&gt;
  &lt;p id=&quot;txX7&quot;&gt;Touched - Событие прикосновения&lt;/p&gt;
  &lt;p id=&quot;eAlw&quot;&gt;Changed - Событие изменения свойства&lt;/p&gt;
  &lt;p id=&quot;g0e9&quot;&gt;BodyMovers - Объекты для физического движения&lt;/p&gt;
  &lt;p id=&quot;YHlw&quot;&gt;RemoteEvent - Событие между клиентом и сервером&lt;/p&gt;
  &lt;p id=&quot;GvmZ&quot;&gt;Memory Leak - Утечка памяти&lt;/p&gt;
  &lt;p id=&quot;asjw&quot;&gt;Event Connection - Подписка на событие&lt;/p&gt;
  &lt;p id=&quot;Ajr1&quot;&gt;&lt;/p&gt;
  &lt;h1 id=&quot;p9Z1&quot;&gt;📘 Заключение&lt;/h1&gt;
  &lt;h2 id=&quot;lhzi&quot;&gt;Ты прошёл(а) долгий путь&lt;/h2&gt;
  &lt;p id=&quot;OUT2&quot;&gt;Поздравляем с завершением этой книги — ты не просто изучил(а) основы программирования на Lua в Roblox, но и углубился(ась) в реальные практические задачи:&lt;/p&gt;
  &lt;ul id=&quot;SCiJ&quot;&gt;
    &lt;li id=&quot;lWdY&quot;&gt;Создавал(а) интерфейс (GUI)&lt;/li&gt;
    &lt;li id=&quot;UbJt&quot;&gt;Работал(а) с событиями, игроками и персонажами&lt;/li&gt;
    &lt;li id=&quot;yKNh&quot;&gt;Управлял(а) анимацией, физикой и звуком&lt;/li&gt;
    &lt;li id=&quot;lzrZ&quot;&gt;Писал(а) клиент-серверный код&lt;/li&gt;
    &lt;li id=&quot;C0Z1&quot;&gt;Сохранял(а) данные с помощью DataStore&lt;/li&gt;
    &lt;li id=&quot;8jsL&quot;&gt;Изучил работу с JSON и HTTP&lt;/li&gt;
    &lt;li id=&quot;hwyy&quot;&gt;Создавал(а) свои плагины для Roblox Studio&lt;/li&gt;
    &lt;li id=&quot;iaHC&quot;&gt;Оптимизировал(а) игру и повышал(а) её производительность&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;POJG&quot;&gt;Ты уже не новичок — ты полноценный разработчик игр на платформе Roblox.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;R9qc&quot;&gt;Игра — это лишь начало&lt;/h2&gt;
  &lt;p id=&quot;dCDi&quot;&gt;Создание игры — это первый шаг. За этим следует:&lt;/p&gt;
  &lt;ul id=&quot;2fl4&quot;&gt;
    &lt;li id=&quot;ZVQc&quot;&gt;&lt;strong&gt;Тестирование и отладка&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;QqRr&quot;&gt;&lt;strong&gt;Публикация и продвижение&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;hSij&quot;&gt;&lt;strong&gt;Обратная связь от игроков&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;leec&quot;&gt;&lt;strong&gt;Развитие и обновления&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;YoZy&quot;&gt;Все великие игры начинались с простых идей. Возможно, именно ты создашь следующую хитовую игру, которую оценят миллионы игроков.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;uy47&quot;&gt;Что делать дальше?&lt;/h2&gt;
  &lt;p id=&quot;fed3&quot;&gt;Ты можешь: ✅ Продолжить развиваться как разработчик: создавать всё более сложные механики и системы&lt;br /&gt;✅ Сделать открытый проект и собрать сообщество вокруг своей игры&lt;br /&gt;✅ Начать зарабатывать внутри Roblox через Robux и Premium&lt;br /&gt;✅ Создать свой плагин или инструмент для других разработчиков&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;3Wuz&quot;&gt;Благодарность&lt;/h2&gt;
  &lt;p id=&quot;9B9i&quot;&gt;Большое спасибо, что выбрал(а) эту книгу для изучения программирования в Roblox.&lt;br /&gt;Ты не просто читатель — ты &lt;strong&gt;разработчик будущего&lt;/strong&gt;.&lt;br /&gt;Платформа Roblox — это не просто место для игр, это целая вселенная возможностей, где ты можешь:&lt;/p&gt;
  &lt;p id=&quot;mRkn&quot;&gt;🎮 Играть&lt;br /&gt;🛠 Создавать&lt;br /&gt;💡 Вдохновлять&lt;br /&gt;📈 Развиваться&lt;br /&gt;💰 Зарабатывать&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Bb28&quot;&gt;Давай создадим что-то великое!&lt;/h2&gt;
  &lt;p id=&quot;ezi5&quot;&gt;Теперь у тебя есть знания, чтобы сделать свою первую полноценную игру. Не бойся ошибок — они часть пути. Не бойся экспериментировать — именно так рождаются шедевры.&lt;/p&gt;
  &lt;p id=&quot;MG01&quot;&gt;&lt;strong&gt;Твой первый успех уже рядом.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Твоя первая игра ждёт тебя.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;История начинается с тебя.&lt;/strong&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;VF2k&quot;&gt;🎉 &lt;strong&gt;Удачи тебе в мире разработки игр!&lt;/strong&gt;&lt;/p&gt;

</content></entry></feed>