Истребители багов: враждебность кусается

Истребители багов: враждебность кусается

Истребители багов: враждебность кусается

Выпуск от 31 января 2018г.

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

Марк начинает показ на своем мультяшном тестовом уровне. Такие потрясающие билды – это одна из прелестей геймдева. В этой мультяшной стране он хочет взлететь на своем Cutlass, но сначала надо припарковать Ursa на рампе Constellation. Заехать на нее не так то просто, и приходится несколько раз таранить корабль. Как вы можете заметить по надписи в верхнем левом углу, в процессе тарана корабля Марк повысил свой уровень разыскиваемости. Дело в том, что при опущенной рампе вездеход во время движения немного задевает геометрию корабля, и это действие повышает уровень разыскиваемости. Так быть не должно, потому что владельцем корабля также является Марк. Суть этой механики в том, что если вы ведете себя агрессивно и врезаетесь в другого игрока, она считает это проявлением грубости и повышает ваш уровень разыскиваемости. Но так не должно происходить в случае, когда вы врезаетесь в свои собственные транспортные средства, иначе как же вам загнать вездеход в Constellation?

Марк переходит к фрагменту кода, который называется Player Hostility Manager (менеджер враждебности игрока). Он ответственен за прослушивание событий, происходящих во всей игре (например, когда один игрок стреляет в другого, или кто-то крадет ваш ящик и т.п.). Именно этот код решает, стоит ли за совершенное игроком действие повышать ему уровень разыскиваемости. В данном конкретном случае он слушает, когда управляемое вами транспортное средство сталкивается с другим транспортным средством. При столкновении код проверяет скорость и смотрит, являетесь ли вы врагом по отношению к другому игроку. Затем при необходимости он поднимает ваш уровень разыскиваемости. Конечно, если вы врезаетесь во врага, это довольно весело и с технической точки зрения считается нормальным. Но если вы врезаетесь в дружественного персонажа, ваша степень "враждебности" повышается. Однако технически вы дружественны с самим собой, поэтому после столкновения с собственным транспортным средством система также повысит вашу "враждебность". И это не очень хорошо.

Что мы хотим сделать – добавить проверку, принадлежит ли протараненное вами транспортное средство вам. Если да, то никаких дальнейших действий совершать не нужно. Для этого воспользуемся старым компонентом Game, который со временем полностью уйдет в небытие. Это очень старый компонент, который тем не менее до сих пор используется. Он содержит в себе некоторую важную информацию, называемую "информацией о постоянстве". Нам нужно транспортное средство, в которое мы врезаемся. Мы хотим получить сущность (GetEntity) и опросить компонент игрового объекта (QueryComponent<IGameObject>) . Теперь получим GEID. В общем случае логика тут такая: если эта сущность совпадает со "мной", значит "я" являюсь ее владельцем. Значит, если этот ID совпадает со "мной", то мы ничего не будем делать, так как "транспортное средство принадлежит мне, и я слишком люблю себя, чтобы повышать свой уровень разыскиваемости™". И вернемся обратно (return;). Теперь если вы врежетесь во врага или в свой собственный транспорт, вы не получите уровень разыскиваемости.

После волшебной компиляции можно посмотреть на результат. Прошлый уровень разыскиваемости сохранился, поэтому его нужно сбросить на сервере. Все, больше уровней нет. Отъедем немного назад и поставим несколько точек остановки, чтобы убедиться, что код работает правильно. Теперь газуем и врезаемся в рампу корабля. Мы врезались в собственный корабль... момент истины... игра выходит из функции и не поднимает уровень разыскиваемости. Теперь можно попытаться забраться-таки на рампу, не становясь при этом преступником. Потому что, ну, это ваш корабль.

Вся прелесть в том, что теперь у нас есть этот замечательный фреймворк. Когда мы построим систему, которая будет знать кто ваши друзья, мы сможем с легкостью добавить еще код, который таким же образом предотвратит повышение уровня разыскиваемости при столкновении с транспортным средством вашего друга. Так, играя в группе, вы сможете заехать в Constellation своего друга.

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

Итак, как вы видели, у нас был небольшой забавный баг: когда Марк врезался в свой собственный корабль, игра повышала его рейтинг разыскиваемости. В этом не было никакого смысла. То есть если вы хотите срубить свой собственный домик на дереве посреди леса, почему вы должны становиться преступником? Бессмыслица. Благодаря небольшому исправлению теперь вы можете уничтожать свои корабли, не нарушая закон.

Надеюсь, вам понравилось. Увидимся в следующий раз.

H_Rush administrator