Кожен блок твердий — крім випадків, коли ні
У нашого клієнтського мешера є залізне правило: кожен блок, що не є повітрям, відображається і має колізію. Крапка. Це спрощення робить побудову мешів швидкою, а код — простим, поки не з'являється функція, яка хоче порушити саме це правило.
Енергетичні ворота. Для наших енергетичних парканів нам потрібні були ворота: мерехтлива мембрана, крізь яку гравці та дружні NPC можуть просто пройти, а дикі тварини — ні. Тобто блок, який видно, але який не є стіною для декого. Саме те, чого наша архітектура не передбачає.
Рішення складається з двох половин. На клієнті мешер отримав свій перший свідомий виняток: блок воріт відображається, але виключений із меша колізій — гравці просто проходять крізь нього. На сервері працює справжня логіка: системи руху істот на кожному кроці перевіряють, чи немає на шляху енергетичного бар'єра. Дикі тварини та вороги розвертаються, помічники й гравці проходять. Цю перевірку довелося додати в усі три системи руху — дикі тварини, помічники, планетні вороги, — інакше один вид істот про ворота «не знав» би.
Чесна примітка: літаючі істоти ковзають просто над парканом. Це не помилка, а задокументоване обмеження — паркан просто не зупиняє нічого, що літає. Ми краще запишемо такі свідомі прогалини, ніж приховуватимемо їх.
Що залишається: архітектурні правила на кшталт «усе, що не повітря, — тверде» цінні саме тому, що вони прості. Але треба знати, де живе єдиний виняток — і чому він живе саме там.
Коментарі