ИСТРЕБИТЕЛИ БАГОВ: ЗАКЛЮЧЕНИЕ О СТРАХОВКЕ

Выпуск от 11 апреля 2018г.

Вас ждет вдвое больше ужаса и кровопролития, поскольку Спенсер Джонсон заменяет Марка Эйбента и жестоко расправляется с проблемой со страховкой, которая была связана с расположенными один в другом кораблями. Счетчик поверженных багов продолжает тикать в этом леденящем кровь эпизоде Истребителей багов.

 

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

Спенсер: Нет. В этом эпизоде мы будем их резать.

Марк: Знаешь, у меня нет на это времени. Пойду вернусь в свой трейлер.

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

Итак, как я, вероятно, упомянул во вступлении, сегодня на повестке дня очередной баг со страховкой. Он затрагивает корабли внутри других кораблей. Как вы можете видеть, у меня тут мой Cyclone, который очень плотно запаркован в трюме Cutlass. Баг актуален для всех кораблей, но данный конкретный случай является самым неприятным, и мне надо его протестировать. Итак, что же случается: если мы запрашиваем страховое возмещение Cutlass, когда внутри него находится Cyclone, Nox или какое-то другое транспортное средство, оно пропадает навсегда. Покажу вам, как это выглядит в текущем виде, когда система сломана. Подлетим к терминалу ASOP, и вы увидите, что у меня есть два Cyclone: один на площадке, а второй на хранении. В общем, их два, и один припаркован.

Теперь мне нужно попасть на Olisar, где я затребую возмещение Cutlass. Я просто залетаю внутрь, чтобы сэкономить время. Итак, один на Shubin – делаем запрос на возмещение. Отлично, а теперь вернемся обратно на Shubin. Нет, мы не будем путешествовать в кванте – я не хочу, чтобы это видео растянулось на 30 минут. И вот, теперь здесь остался только один Cyclone. Тот, что был внутри Cutlass, исчез навсегда. Очень печально. Попытаемся понять, почему так происходит, чтобы вам, ребята, не пришлось волноваться о возможности потерять свои корабли?

Мы перейдем к коду. Этот фрагмент находится в системе страховки. Если быть точным, это функция PrecessClaimToNextStep, и здесь нас интересует обратный вызов, называемый exchangeCB. В прошлом здесь присутствовал другой баг, когда корабли, которые вы купили, добавлялись на ваш аккаунт уже после формирования базы данных. В результате чего страховка для них не работала. Для исправления текущей проблемы нам нужно, чтобы функция смены прав доступа как бы говорила: «хорошо, этот старый корабль теперь стал новым, поэтому нужно включить всю веб-информацию, чтобы сформировались правильные пути.» Это последний шаг в системе страховки, и он выполняется после того, как мы передали права. Чтобы убедиться, что все прошло гладко, мы отслеживаем два корабля: ваш старый, который был уничтожен или покинут, и новый, который вы только что получили по страховке. Поэтому мы должны взять старый корабль и сказать, что он больше не принадлежит вам – нужно очистить права владения и избавиться от него, потому что у вас уже есть новый. Поэтому мы меняем законного владельца сущностью (ChangeLegalOwnerForEntity) для старой сущности (старого корабля). То есть, мы удаляем его из перечня судов, которыми вы легально владеете. Если корабль (этот старый) сейчас не размещен где-то во вселенной, то мы сразу же удаляем его из Постоянства. Такова текущая логика работы, и именно из-за этого механизма происходит баг, который нам надо исправить.

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

Значит нам нужно это исправить. Вернемся к функции ChangeLegalOwnerForEntity и удалим две строчки кода. Есть одна функция, которую я еще не дописал, но сделаю это прямо в ходе видео. Назовем ее CleanUpOldEnsuredEntity (очистить старую застрахованную сущность). Ее входным значением будет старый ID сущности с транспортным средством в качестве параметра. Сейчас наша новая функция совершенно пуста, но мы допишем ее прямо на камеру. Как и прежде, нам нужно изменить законного владельца старого корабля – того, от которого мы избавляемся. Однако после этого нам нужно будет циклически просмотреть все транспортные средства внутри старого корабля и вернуть право владения ими обратно игроку. Помните, что из-за древовидной структуры корабли внутри других кораблей тоже поменяют владельца. Мы позволим этому случиться, а затем просто передадим их во владение обратно игроку, который затребовал страховое возмещение.

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

Следующий шаг – нужно изменить законного владельца для маршрута старого корабля. Мы уже делали это ранее, так что я просто скопирую код, чтобы сэкономить время. После того, как мы изменили владельца старого корабля, нам нужно вернуться назад и сменить владельца для транспортных средств внутри него, чтобы они отображались на терминалах ASOP. Для этого циклически пройдемся по каждому находящемуся на хранении кораблю. К слову, ранее я не упомянул о списке containedVehicle, который содержит информацию о хранимых кораблях. Он был добавлен прямо перед началом видео. Фактически, когда мы формируем запрос ранее в списке вызовов, нам нужно так или иначе изъять транспортное средство из постоянства. Поэтому мы немного изменили аргумент, чтобы изымать не только сам корабль, но и все предметы внутри него, которые по своему типу относятся к этому кораблю. Я внес это небольшое изменение ранее, просто не показываю его на видео.

Так, хорошо. Нам нужно пройтись по всем хранимым в списке транспортным средствам. Если среди зрителей есть программисты, вам может показаться несколько странным, что я задаю i = 1. Это потому, что в этом списке транспортных средств под первым номером находится само родительское судно – Cutlass. Мы хотим проигнорировать его, ведь Cutlass не находится внутри себя, кроме того мы уже изменили его законного владельца. Так что не переживайте на этот счет, мы начнем с 1. Здесь мы возвращаем все содержащиеся внутри корабли их предыдущему владельцу. Выглядит несколько забавно, потому что мы задаем в качестве законного владельца корабля значение его текущего владельца. Так получается потому, что данные кэшируются до того, как мы вносим это изменение здесь. И это всего лишь основная часть кода, необходимая нам для исправления этого бага.

Однако есть еще одна вещь, которую нам надо сделать в этом участке кода. В цикле For мы хотим добавить проверку, убран ли корабль. Для экономии времени я просто скопирую и вставлю код. Итак, у нас выполняется одна проверка, убран ли корабль. Как я упомянул ранее, в игре есть разные типы владения: законное и физическое. По множеству различных причин мы хотим также менять физического владельца предметами, если они в данный момент не размещены во вселенной. Вы увидите это через мгновение. Мы перемещаем родителя постоянных предметов, потому что после цикла For (помните код, который мы удалили ранее?) нам нужно удалить старый корабль из Постоянства. Однако сделать это мы должны лишь в том случае, если он в данный момент не размещен где-то во вселенной. Прицепим сюда код, который не позволит удалить из Постоянства корабли внутри другого корабля.

Посмотрим, правильно ли я выразился. Мы изменили законного владельца для вашего Cyclone или Nox, или любого другого корабля в трюме Cutlass. Однако если корабль был убран, мы все равно удаляли его при помощи этого старого кода. Нам также нужно предотвратить это. В итоге у нас две задачи: предотвратить смену законного владения и физического владения. Причем физическое владение в данном случае важно только в том случае, если корабль убран из вселенной.

Отлично. И это весь код, который нам нужен, чтобы заставить систему работать. Мы только что вычистили старую функцию застрахованных сущностей и, как вы помните, вызвали ее из более общей функции смены прав владения. Это действительно последний шаг, нужный для выдачи вам нового корабля в случае запроса страхового возмещения. Теперь мы соберем билд, что займет примерно 5 лет, после чего я вернусь к вам и продемонстрирую, что баг, как я надеюсь, исчез.

Мы вернулись в игру. У нас Cyclone стоит внутри Cutlass, и я совершу те же шаги для воспроизведения бага, что и в начале видео. Надеюсь, мы больше не потеряем Cyclone навсегда. Я подлечу к терминалу, чтобы показать, что у нас два Cyclone. Да, действительно два, и один из них стоит на площадке. Теперь я отправлюсь на Olisar и запрошу возмещение. Вот наш Cutlass – там, где мы его и оставили. Запросим возмещение и заплатим за его ускорение. Вернемся на Shubin,… и вот оба наших Cyclone! Мы не потеряли их навечно.

Итак, подведем итоги. После смены законного владельца для нашего Cutlass нам нужно было заглянуть внутрь него, пройтись по всем хранящимся там транспортным средствам и передать право владеть ими обратно игроку. Так они не терялись бы навсегда для нашего страхового терминала. И на этом наш эпизод завершается, время снова вернуться к Марку.

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

Спенсер: Да. Страховка? Нет проблем. 1/6 часть экономики США… разрешена. Несколько строчек кода – легкое исправление!

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

Источник: https://star-citizen.ru

logo

ПОХОЖИЕ СТАТЬИ

Страховка в Star Citizen

Страховка в Star Citizen

  Как работает страховка в Star Citizen и как игроки будут ей пользоваться. Автор: Кристофер Ливингстон Когда я играл в билд альфы 3.0, несколько недель назад в студии CIG в Лос-Анджелесе,  обратил  внимание на нечто, что раньше не видел на...

Расписание на неделю

Расписание на неделю

Приветствую, Граждане! Добро пожаловать на неделю, когда мы обновим наш текущий веб-сайт и изменим его внешний вид, чтобы он соответствовал 2948 году! Нам не терпится поделиться с вами обновленным дизайном, который сотворили наши драгоценные товарищи из Turbulent. Не только звездная, но и...

Бен Лесник, Джаред Хакеби, Ульф Кушнер и оба Тайлера обсуждают всякое разное =)) [Какие различия между показателями "O2 tank" (кислородный баллон) и "suit oxygen" (кислород костюма)?] — Это одинаковые показатели, просто кислород из баллона подается в шлем игрока, это происходит по тому же...