sch1zk

sch1zk 

Видеоблогер, стример, композитор

24subscribers

14posts

goals1
$0 of $19.7 raised
Хочу купить Last Epoch чтобы играть в перерывах, а то я так с ума сойду кодить по 14 часов в день.

Дневник разработки #2

С прошлого поста прошло чуть больше недели. В целом, выпуск одного поста в неделю выглядит как что-то, к чему можно стремиться. Как вариант, чтобы вызвать привыкание можно стараться выпускать его ближе к выходным, как например сейчас в пятницу.
Прогресс, как обычно, состоит из добавления маленьких вещей тут и там, ну и переработок старого кода.
Предметы, которые находятся в хотбаре и отображаются на персонаже, теперь имеют некую "память". Они теперь хорошо понимают, как слоты заняты и будут стремиться к незанятому слоту:
Раньше, меч справа пытался сразу после того, как был взят меч слева, занять левый слот. В общем теперь этого больше не происходит. Но внутреннюю архитектуру того, как это будет работать я еще, скорее всего, переделаю.

Я добавил вот такие вот прикольные стульчики:
Как бы это ни было ужасно, сесть на них нажав ПКМ, увы, нельзя. Сделано это было осознанно, т.к. мне было просто лень делать полноценную систему того, как персонаж сидит на разных поверхностях.
Ке-ке-ке, поверили?
Сидение на разных поверхностях то я реализовал, и эта система выглядит очень даже, скажем так, перспективно. Но на стулья через ПКМ все также сесть будет нельзя.
Так как в моем моде можно будет садиться?
Все достаточно просто - зажми Shift+A+D, подожди немного, и ты сядешь на блок, на котором стоишь. Система учитывает высоту блока, и будет подстраиваться под него.
Сидеть можно будет на самых разных поверхностях:
В том числе не самых обычных:
Стрелы теперь тоже нужно будет подбирать вручную:
В пещерах, темных местах стало гораздо темнее:
Вот пример того, как это бы выглядело в ванилле:
В общем суть следующая - в темных местах теперь не будет некоего "высветления", как бы пользователь ни крутил ползунок гаммы. Если там темно, значит там темно. Очень похоже на то, как это реализовано в моде True Darkness, но я пошел своим путем и практически полностью обрезал любые намеки на высветление.
В дальнейшем, если я не забуду, я хочу сделать чтобы на поверхности степень темноты влияла от того, какая сейчас фаза луны, при этом чтобы эта фаза не влияла на степень темноты в пещерах.
Модель персонажа на экране инвентаря теперь отделена от энтити игрока и при наведении на тело показывает корректный тултип:
Мне нравится идея с тем, что можно интегрировать появление меню и показывать информацию при наведении или при нажатии на определенную часть тела персонажа. В дальнейшем, при наведении на голову я планирую показывать "мысли персонажа", грубо говоря то, что повлияло на его настроение, что ему понравилось и чего он хочет, чтобы улучшить свой рассудок.
Однако в ванилле персонаж в игре и на экране инвентаря это по факту одна и та же сущность, которая просто рендерится в разных местах. Это создавало проблемы, когда персонаж менял свою позу (приседал, плавал, сидел, лежал), "коллизии" для наведения на туловище становились неактуальными и их нужно было двигать.
Я не хотел делать динамические коллизии для мыши, и решил просто впихнуть туда заглушку, которая полностью копирует персонажа, его скин, его броню и одежду, но не копирует его анимации.
Бочки теперь умеют генерировать предметы внутри, если выдать их себе с определенным NBT-тегом:
Через такие бочки я планирую точечно выдавать игрокам стартовую экипировку. В начале шахты будет несколько таких бочек, в которых можно будет найти себе первую кирку, чтобы начать добывать руду.
Я создал свою систему статистики для отслеживания прогресса игрока:
Почему своя? Потому что ванильная не сбрасывается при смерти персонажа, а ведет "общую статистику". Я не хотел бы ее трогать, но при этом мне нужно вести хоть какую-то статистику, чтобы понимать, сколько мета-опыта выдавать игроку после гибели его персонажа.
Условно сломал два блока киркой при жизни за смерда - получил 2 ед. опыта. 
Благодаря этой статистике, к слову, можно показывать вот такой вот прикольный экран после гибели персонажа:
За кулисами всего этого была выстроена целая система игровых событий. Она похожа на то, как скалк реагирует на окружение, но все же она нужна для другого.
Есть определенный список событий, за которыми должны последовать определенные действия. Игрок сломал блок - начинается проверка, какой блок он слома, чем, какая у этого игрока была роль, какие были навыки, модификаторы к опыту и т.д.
Она мне нужна для того, чтобы избежать огромного спагетти-кода внутри каждого нужного мне блока, энтити или иной системы. Я просто вставляю в блок одну строчку кода, а дальнейшая обработка уже ведется в совершенно другом месте. Там же и начисляет мета-опыт, ведется статистика, снижаются/повышаются жизненные показатели персонажа и прочее-прочее.
Самое главное, что я хочу подвязать под все это - неправомерные действия игрока. Допустим, если игрок что-то сворует из сундука, который принадлежит вам, и вы это прямо увидели своими глазами, над ним будет высвечена плашка "ВОРЮГА".
Тела, кстати, теперь можно заталкивать на полублоки:
Так что в случае чего, у вас будет меньше проблем с тем, чтобы скрыть улики после всяких происшествий.
К тому же, они теперь сохраняют информацию о погибшем персонаже:
Вам высветится его настоящее имя, если вы успели познакомиться с этим персонажем при его жизни.

4 дня было убито на то, чтобы реализовать толковую систему распространения тепла от источников тепла:
Многие говорили о том, что моя прошлая реализация (через тикеты) выглядит довольно странно. В целом, я не мог не согласиться, и всеми силами пытался сделать так, чтобы тепло от печи распространялось равномерно, в меру реалистично, и при этом не сильно бы нагружало сервер.
Моя прошлая система каждую секунду проводила от каждого игрока к печи raycast, т.е. луч, который проверял бы доступность печи. Простенькая, но довольно эффективная система для простой системы температуры.
Но т.к. холод и тепло - одни из ключевых механик моего режима, я не хотел оставлять ее настолько банальной, так что решил слегка переработать ее. Чтобы вы понимали, даже дошло до полного абсурда - я реализовал симуляцию потоков воздуха, хранил воздух, его температуру и velocity (вектор движения), но Майнкрафт отказывается такое обрабатывать. Лагало жутко, так что пришлось думать дальше.
А дальше я пришел к следующей системе, которую отчасти подсмотрел из мода Cold Sweat - есть печь, она хранит в себе все блоки, на которые может распространять свое тепло, и она постоянно пытается расширяться. От оригинальный системы у меня осталась только идея, и вот почему:
- Я уже реализовал карту температур для каждого чанка. Чанк может хранить температуру каждого блока, а я могу крайне быстро получать и менять ее, используя крайне хитрые алгоритмы и чистую математику. Такую систему оставлять попросту жалко.
- Хранить все в одном blockEntity, который постоянно обновляется когда меняется состояние объекта, крайне затратно по ресурсам, поэтому у источников тепла идет своя, отдельная от печи обработка.
- Мне не хотелось превращать код для простой печи в огромную простыню. Хотелось, чтобы все было распределено по своим местам.
И в итоге я пришел к следующей реализации:
- У каждого чанка теперь есть своя карта температур
- Чанки же еще и хранят все источники тепла в себе
- Чанки обрабатывают каждый источник тепла, который в себе содержит (напр. распространение)
- Печи при активной работе добавляют или обновлять источники тепла в чанках, в которых находятся сами
- Источники тепла хранят позиции, на которые могут влиять
- Эти позиции постоянно пытаются расширяться, но могут и сокращаться, если позиция до центрального источника была перекрыта
- При добавлении новой позиции ее температура наносится на карту температур чанка, при удалении позиции ее температура снимается с карты температур чанка
- Обрабатывается все это не одним большим скопом, а маленькими кусочками, так что на производительность влияние будет минимальное, по крайней мере я на это надеюсь
Я слегка переработал то, что такое температура, как она вообще обрабатывается и влияет на персонажа. По факту, я сократил количество возможных температур до нескольких крайне простых значений: очень холодно, холодно, нормально, тепло и жарко. Условно холодно это -1, очень холодно это -4.
Т.к. игрок все равно не сможет увидеть конкретные их значения, да и нужды в такой детализации особой нет, я все упростил. Одежда все также расширяет или сдвигает диапазон комфортных температур, здесь все осталось без изменений.
Объединил разные показатели усталости (усталость от холода и жары) в один единственный. Адаптировал обработку под новую температуру. Сама температура тела теперь не имеет ничего общего с реальностью и скорее абстрактна, может уходить в положительные значения (т.е. персонаж перегревается) или в отрицательные (персонаж переохлаждается).
Сейчас на практике это работает примерно так:
- Находясь на холоде, показатель усталости идет в минус.
- Усталость, достигая порога в abs 4.0, снижает или повышает сначала резерв, потом уже температуру
- Резервы уходят в положительные значения, если усталость идет в минус
- Если персонаж находится в комфортной для себя температуре, резервы, температура и усталость стремятся к нулю
Таким образом:
- Если ты находишься на холоде некоторое время, зайдя в жаркое помещение у тебя уже есть накопленные резервы к жаре, и будут расходоваться сначала они
- Если ты находишься какое-то время на жаре, у тебя накапливаются резервы к холоду, и когда ты выйдешь на холод сначала будут расходоваться сначала они
Сделал так, что взаимодействовать с некоторыми объектами можно только с определенной стороны. Теперь открыть ту же печь можно только если нажать с той стороны, куда она повернута, если навести на ее верхнюю сторону взаимодействие попросту не будет доступно: 
Но как только я наведусь на фронтовую часть:
Сделано это по той простой причине, что я не хотел, чтобы игроки могли иметь возможность безнаказанно открывать сундуки и прочие штуки, находясь по ту сторону прилавка в магазине, или находясь позади сундука. Таким образом, чтобы что-то открыть, я принуждаю воришек подойти с корректной стороны, чтобы у них было меньше шансов уйти незамеченными.
Исходя из предыдущего переработал контекстные взаимодействия. Теперь они понимают, на какую часть блока смотрит игрок, и могут динамически показывать, может ли игрок взаимодействовать с этой частью или нет. Контекстное меню теперь корректно скрывает взаимодействие, если оно не доступно с этой стороны.
Ну последнее по списку, но не по важности и значению, это доработка системы крафта внутри мира. Это та система, где ты можешь бросить предмет на какой-нибудь специальный блок, нажать по нему инструментом и получить какой-то новый предмет.
- Расширил возможность брать разные инструменты, точнее их типы. Можно создать тег "hammers", добавить его всем молотам и теперь все они теперь могут быть использованы в этом новом типе крафта.
- Крафт может принимать в себя разное количество материалов. Т.е. можно сделать так, что на создание одного предмета может уйти не один другой предмет, а три или даже четыре. Некая конвертация одних четырех предметов в один другой.
- Звуки при крафте. Можно назначать свои в самом рецепте.
- Крафт теперь понимает, на какой поверхности он происходит. Можно задавать строго определенные поверхности, на которых он может происходить. Как, допустим, только на наковальне.
- Незавершённые предметы. Предметы, по которым нужно ещё несколько раз стукнуть инструментом, прежде чем получить полный результат. По факту болванки, промежуточное звено между изначальным предметом и итоговым.
На этом все, следующий пост через неделю, постараюсь родить его к пятнице. И, кстати, что думаете насчет регулярных стримов на Твиче сразу после выхода поста на бусти? Чтобы вы могли задать свои вопросы касательно того, что я описал в посте, ну и увидеть все эти фичи непосредственно своими глазами. Пишите в Discord или комментариях под этим постом.
Subscription levels5

Дерн

$1.23 per month
Регулярный, но все равно крайне важный блок, благодаря которому образуется ландшафт мира.
+ chat

Камень

$3.1 per month
Основа всех основ, ведь именно камень мы добываем в поиске драгоценных алмазов.
+ chat

Доски

$6.2 per month
Основной строительный блок, используемый практически во всех постройках.
+ chat

Обсидиан

$12.3 per month
Уникальный блок, тяжело разрушаемый, предоставляющий возможность отправиться в Нижний Мир.
+ chat

Адский Кирпич

$31 per month
Уникальный строительный блок, добываемый в крайне опасных крепостях Нижнего Мира.
+ chat
Go up