Каждый блок твёрдый — кроме тех случаев, когда нет
У нашего клиентского построителя сетки есть железное правило: каждый блок, который не воздух, отрисовывается и имеет коллизию. Точка. Это упрощение делает построение сетки быстрым, а код простым — пока не появляется функция, которая хочет нарушить именно это правило.
Энергетические ворота. Для наших энергетических заборов нам хотелось ворота: мерцающую мембрану, через которую игроки и дружелюбные NPC могут просто пройти, а дикие животные — нет. То есть блок, который виден, но для кого-то не служит стеной. Именно то, что наша архитектура не предусматривает.
Решение состоит из двух половин. На клиенте построитель сетки получил своё первое намеренное исключение: блок ворот отрисовывается, но исключён из сетки коллизий — игроки просто проходят насквозь. На сервере работает сама логика: системы движения существ на каждом шаге проверяют, нет ли на пути энергетического барьера. Дикие животные и враги разворачиваются, компаньоны и игроки проходят. Эту проверку пришлось добавить во все три системы движения — диких животных, компаньонов, планетарных врагов, — иначе один вид существ «не знал» бы про ворота.
Честная сноска: летающие существа спокойно пролетают над забором. Это не баг, а задокументированное ограничение — забор просто не останавливает всё, что летает. Мы лучше запишем такие намеренные пробелы, чем будем их прятать.
Что в сухом остатке: архитектурные правила вроде «всё, что не воздух, — твёрдое» ценны именно потому, что они просты. Но нужно знать, где живёт единственное исключение — и почему оно живёт именно там.
Комментарии