Exopack coloring and toggle exopack glowing

This commit is contained in:
DBotThePony 2023-07-18 01:55:17 +07:00
parent 25875b162e
commit a707e49b8c
Signed by: DBot
GPG Key ID: DCC23B5715498507
9 changed files with 215 additions and 39 deletions

View File

@ -136,11 +136,16 @@ private fun misc(provider: MatteryLanguageProvider) {
gui("recipe.ticks", "%s Ticks")
gui("exopack", "Exopack Inventory")
gui("exopack.customize", "Customize Exopack appearance")
gui("exopack.customization", "Exopack appearance settings")
gui("exopack.go_back", "Open vanilla inventory")
gui("exopack.go_in", "Open Exopack inventory")
gui("exopack.toggle_visibility", "Toggle Exopack visibility")
gui("exopack.change_color", "Customize Exopack color")
gui("exopack.change_color2", "Press Middle Mouse Button to remove color")
gui("exopack.toggle_visibility", "Visibile on player")
gui("exopack.toggle_glow", "Glows in dark")
gui("exopack.change_color", "Customize color")
gui("exopack.change_color2", "Remove color")
gui("exopack.probe1", "This little device feels unnatural to touch, it is almost certainly resilient to any possible attempt to break it open.")
gui("exopack.probe2", "There is fingerprint reader built into one of sides which gently glow when touched.")

View File

@ -144,11 +144,16 @@ private fun misc(provider: MatteryLanguageProvider) {
gui("recipe.ticks", "%s Тиков")
gui("exopack", "Инвентарь Экзопака")
gui("exopack.customize", "Изменить внешний вид Экзопака")
gui("exopack.customization", "Внешний вид Экзопака")
gui("exopack.go_back", "Открыть обычный инвентарь")
gui("exopack.go_in", "Открыть инвентарь экзопака")
gui("exopack.toggle_visibility", "Переключить отображение Экзопака")
gui("exopack.change_color", "Изменить окраску Экзопака")
gui("exopack.change_color2", "Нажмите среднюю кнопку мыши для сброса окраски")
gui("exopack.go_in", "Открыть инвентарь Экзопака")
gui("exopack.toggle_visibility", "Отображать на игроке")
gui("exopack.toggle_glow", "Свечение в темноте")
gui("exopack.change_color", "Изменить окраску")
gui("exopack.change_color2", "Убрать окраску")
gui("exopack.probe1", "Данное маленькое устройство необычно на ощупь, а так же неприступно для любых попыток вскрыть.")
gui("exopack.probe2", "На одной из сторон данного устройства находится сканер отпечатка, который тускло загорается при касании.")

View File

@ -32,6 +32,7 @@ public final class ExosuitModel {
public static final HumanoidModel<AbstractClientPlayer> modelGlow;
public static final ResourceLocation texture = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/models/armor/exosuit.png");
public static final ResourceLocation textureColor = new ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/models/armor/exosuit_color.png");
static {
MeshDefinition meshdefinition = new MeshDefinition();
@ -138,14 +139,38 @@ public final class ExosuitModel {
1f, 1f, 1f, 1f
);
modelGlow.renderToBuffer(
poseStack,
bufferSource.getBuffer(RenderType.entityTranslucentEmissive(texture)),
packedLight,
overlayCoords,
// rgba
1f, 1f, 1f, 1f
);
var color = cap.resolve().get().getExopackColor();
if (color != null) {
modelNormal.renderToBuffer(
poseStack,
bufferSource.getBuffer(RenderType.entityCutoutNoCull(textureColor)),
packedLight,
overlayCoords,
// rgba
color.getRed(), color.getGreen(), color.getBlue(), 1f
);
}
if (cap.resolve().get().getExopackGlows()) {
modelGlow.renderToBuffer(
poseStack,
bufferSource.getBuffer(RenderType.entityTranslucentEmissive(texture)),
packedLight,
overlayCoords,
// rgba
1f, 1f, 1f, 1f
);
} else {
modelGlow.renderToBuffer(
poseStack,
bufferSource.getBuffer(RenderType.entityCutoutNoCull(texture)),
packedLight,
overlayCoords,
// rgba
1f, 1f, 1f, 1f
);
}
}
}
}

View File

@ -32,7 +32,6 @@ import net.minecraft.world.item.Items
import net.minecraft.world.item.ProjectileWeaponItem
import net.minecraft.world.item.crafting.RecipeManager
import net.minecraft.world.item.crafting.RecipeType
import net.minecraft.world.item.enchantment.EnchantmentHelper.hasVanishingCurse
import net.minecraft.world.level.GameRules
import net.minecraft.world.level.Level
import net.minecraft.world.phys.Vec3
@ -83,15 +82,16 @@ import ru.dbotthepony.mc.otm.core.*
import ru.dbotthepony.mc.otm.core.collect.UUIDIntModifiersMap
import ru.dbotthepony.mc.otm.core.collect.filter
import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.core.math.RGBAColor
import ru.dbotthepony.mc.otm.core.math.minus
import ru.dbotthepony.mc.otm.core.nbt.getByteList
import ru.dbotthepony.mc.otm.core.nbt.getCompoundList
import ru.dbotthepony.mc.otm.core.nbt.getIntList
import ru.dbotthepony.mc.otm.core.nbt.getStringList
import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.core.util.BooleanValueCodec
import ru.dbotthepony.mc.otm.core.util.IntValueCodec
import ru.dbotthepony.mc.otm.core.util.ItemValueCodec
import ru.dbotthepony.mc.otm.core.util.RGBCodec
import ru.dbotthepony.mc.otm.core.util.Savetables
import ru.dbotthepony.mc.otm.core.util.TickList
import ru.dbotthepony.mc.otm.core.util.UUIDValueCodec
@ -211,6 +211,13 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
*/
var displayExoPack by publicSynchronizer.bool(true).property
/**
* Whenever to render Exopack glow in dark
*/
var exopackGlows by publicSynchronizer.bool(true).property
var exopackColor by publicSynchronizer.Field(null, RGBCodec.nullable)
/**
* Tick event schedulers
*/
@ -499,6 +506,9 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
savetables.stateful(::exoPackChargeSlots)
savetables.float(::exoPackSmelterExperience)
savetables.bool(::isExoPackSmeltingInstalled)
savetables.codecNullable(::exopackColor, RGBAColor.CODECRGB)
savetables.bool(::exopackGlows)
}
fun invalidateNetworkState() {

View File

@ -21,6 +21,7 @@ object Widgets8 {
val ARROW_PAINTED_UP = GRID[1, 2]
val MINUS = GRID[1, 3]
val EXOSUIT_SHOWN = GRID[2, 1]
val EXOSUIT_HIDDEN = GRID[3, 1]
val EXOPACK_SHOWN = GRID[2, 1]
val EXOPACK_HIDDEN = GRID[3, 1]
val EXOPACK_COLOR = GRID[4, 1]
}

View File

@ -1,24 +1,39 @@
package ru.dbotthepony.mc.otm.client.screen.panels
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.blaze3d.platform.InputConstants
import it.unimi.dsi.fastutil.booleans.BooleanConsumer
import net.minecraft.ChatFormatting
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.screens.Screen
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
import net.minecraft.client.gui.screens.inventory.InventoryScreen
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.player.Player
import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability
import ru.dbotthepony.mc.otm.capability.matteryPlayer
import ru.dbotthepony.mc.otm.client.render.Widgets8
import ru.dbotthepony.mc.otm.client.render.sprite
import ru.dbotthepony.mc.otm.client.screen.ExoPackInventoryScreen
import ru.dbotthepony.mc.otm.client.screen.MatteryScreen
import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel
import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelPanel
import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallBooleanRectangleButtonPanel
import ru.dbotthepony.mc.otm.client.screen.panels.button.SmallRectangleButtonPanel
import ru.dbotthepony.mc.otm.compat.cos.CosmeticToggleRenderButton
import ru.dbotthepony.mc.otm.compat.cos.isCosmeticArmorLoaded
import ru.dbotthepony.mc.otm.core.GetterSetter
import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.asGetterOnly
import ru.dbotthepony.mc.otm.network.DisplayExosuitPacket
import ru.dbotthepony.mc.otm.network.HideExosuitPacket
import ru.dbotthepony.mc.otm.core.math.RGBAColor
import ru.dbotthepony.mc.otm.network.DisableExopackGlowPacket
import ru.dbotthepony.mc.otm.network.DisplayExopackPacket
import ru.dbotthepony.mc.otm.network.EnableExopackGlowPacket
import ru.dbotthepony.mc.otm.network.HideExopackPacket
import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel
import ru.dbotthepony.mc.otm.network.ResetExopackColorPacket
import ru.dbotthepony.mc.otm.network.SetExopackColorPacket
import java.util.function.IntConsumer
private fun calculateScale(width: Float, height: Float): Int {
val aspectRatio = width / height
@ -34,6 +49,76 @@ private fun calculateScale(width: Float, height: Float): Int {
}
}
private fun createExopackAppearanceWindow(screen: MatteryScreen<*>, matteryPlayer: MatteryPlayerCapability): FramePanel<*> {
val frame = FramePanel.padded(screen, width = 200f, height = 90f, title = TranslatableComponent("otm.gui.exopack.customization"))
screen.addPanel(frame)
frame.toScreenCenter()
frame.behaveAsWindow()
frame.requestFocus()
CheckBoxLabelPanel(
screen,
frame,
text = TranslatableComponent("otm.gui.exopack.toggle_visibility"),
isChecked = GetterSetter.of(
{
matteryPlayer.displayExoPack
},
{
if (it) {
MatteryPlayerNetworkChannel.sendToServer(DisplayExopackPacket)
} else {
MatteryPlayerNetworkChannel.sendToServer(HideExopackPacket)
}
}
)
).also {
it.dock = Dock.TOP
it.dockTop = 2f
}
CheckBoxLabelPanel(
screen,
frame,
text = TranslatableComponent("otm.gui.exopack.toggle_glow"),
isChecked = GetterSetter.of(
{
matteryPlayer.exopackGlows
},
{
if (it) {
MatteryPlayerNetworkChannel.sendToServer(EnableExopackGlowPacket)
} else {
MatteryPlayerNetworkChannel.sendToServer(DisableExopackGlowPacket)
}
}
)
).also {
it.dock = Dock.TOP
it.dockTop = 2f
}
ButtonPanel(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color"), onPress = IntConsumer {
frame.blockingWindow = ColorPickerPanel.frame(
screen,
callback = { MatteryPlayerNetworkChannel.sendToServer(SetExopackColorPacket(it)) },
color = matteryPlayer.exopackColor ?: RGBAColor.WHITE,
title = TranslatableComponent("otm.gui.exopack.change_color"))
}).also {
it.dock = Dock.TOP
it.dockTop = 2f
}
ButtonPanel(screen, frame, label = TranslatableComponent("otm.gui.exopack.change_color2"), onPress = IntConsumer { MatteryPlayerNetworkChannel.sendToServer(ResetExopackColorPacket) }).also {
it.dock = Dock.TOP
it.dockTop = 2f
}
return frame
}
class EntityRendererPanel<out S : Screen> @JvmOverloads constructor(
screen: S,
parent: EditablePanel<*>?,
@ -67,21 +152,15 @@ class EntityRendererPanel<out S : Screen> @JvmOverloads constructor(
if (entity is Player) {
val matteryPlayer = entity.matteryPlayer
if (matteryPlayer != null && matteryPlayer.hasExoPack) {
exosuitButton = SmallBooleanRectangleButtonPanel(screen, this, this.width - 2f - SmallBooleanRectangleButtonPanel.SIZE, 2f,
prop = matteryPlayer::displayExoPack.asGetterOnly(),
skinElementActive = Widgets8.EXOSUIT_SHOWN,
skinElementInactive = Widgets8.EXOSUIT_HIDDEN,
onChange = {
if (it) {
MatteryPlayerNetworkChannel.sendToServer(DisplayExosuitPacket)
} else {
MatteryPlayerNetworkChannel.sendToServer(HideExosuitPacket)
}
if (matteryPlayer != null && matteryPlayer.hasExoPack && screen is MatteryScreen<*>) {
exosuitButton = SmallRectangleButtonPanel(screen, this, this.width - 2f - SmallBooleanRectangleButtonPanel.SIZE, 2f,
skinElement = Widgets8.EXOPACK_SHOWN,
onPress = {
blockingWindow = createExopackAppearanceWindow(screen, matteryPlayer)
}
)
exosuitButton.tooltips.add(TranslatableComponent("otm.gui.exopack.toggle_visibility"))
exosuitButton.tooltips.add(TranslatableComponent("otm.gui.exopack.customize"))
} else {
exosuitButton = null
}

View File

@ -28,6 +28,7 @@ import ru.dbotthepony.mc.otm.client.render.GlitchRenderer
import ru.dbotthepony.mc.otm.client.render.ShockwaveRenderer
import ru.dbotthepony.mc.otm.container.get
import ru.dbotthepony.mc.otm.container.set
import ru.dbotthepony.mc.otm.core.math.RGBAColor
import ru.dbotthepony.mc.otm.core.math.Vector
import ru.dbotthepony.mc.otm.core.readItemType
import ru.dbotthepony.mc.otm.core.writeItemType
@ -496,7 +497,7 @@ class ShockwaveEffectPacket(val pos: Vector) : MatteryPacket {
}
}
object DisplayExosuitPacket : MatteryPacket {
object DisplayExopackPacket : MatteryPacket {
override fun write(buff: FriendlyByteBuf) {}
override fun play(context: Supplier<NetworkEvent.Context>) {
@ -505,7 +506,7 @@ object DisplayExosuitPacket : MatteryPacket {
}
}
object HideExosuitPacket : MatteryPacket {
object HideExopackPacket : MatteryPacket {
override fun write(buff: FriendlyByteBuf) {}
override fun play(context: Supplier<NetworkEvent.Context>) {
@ -514,6 +515,52 @@ object HideExosuitPacket : MatteryPacket {
}
}
object EnableExopackGlowPacket : MatteryPacket {
override fun write(buff: FriendlyByteBuf) {}
override fun play(context: Supplier<NetworkEvent.Context>) {
context.packetHandled = true
context.sender?.matteryPlayer?.exopackGlows = true
}
}
object DisableExopackGlowPacket : MatteryPacket {
override fun write(buff: FriendlyByteBuf) {}
override fun play(context: Supplier<NetworkEvent.Context>) {
context.packetHandled = true
context.sender?.matteryPlayer?.exopackGlows = false
}
}
object ResetExopackColorPacket : MatteryPacket {
override fun write(buff: FriendlyByteBuf) {}
override fun play(context: Supplier<NetworkEvent.Context>) {
context.packetHandled = true
context.sender?.matteryPlayer?.exopackColor = null
}
}
data class SetExopackColorPacket(val color: RGBAColor) : MatteryPacket {
override fun write(buff: FriendlyByteBuf) {
buff.writeFloat(color.red)
buff.writeFloat(color.green)
buff.writeFloat(color.blue)
}
override fun play(context: Supplier<NetworkEvent.Context>) {
context.packetHandled = true
context.sender?.matteryPlayer?.exopackColor = color
}
companion object {
fun read(buff: FriendlyByteBuf): SetExopackColorPacket {
return SetExopackColorPacket(RGBAColor(buff.readFloat(), buff.readFloat(), buff.readFloat()))
}
}
}
class SetInventoryFilterPacket(val type: Type, val slot: Int, val item: Item?) : MatteryPacket {
enum class Type {
INVENTORY,
@ -559,7 +606,7 @@ class SetInventoryFilterPacket(val type: Type, val slot: Int, val item: Item?) :
}
object MatteryPlayerNetworkChannel : MatteryNetworkChannel(
version = "3",
version = "4",
name = "player"
) {
fun register() {
@ -590,8 +637,12 @@ object MatteryPlayerNetworkChannel : MatteryNetworkChannel(
add(GlitchPacket::class, GlitchPacket.Companion::read, PLAY_TO_CLIENT)
add(ShockwaveEffectPacket::class, ShockwaveEffectPacket.Companion::read, PLAY_TO_CLIENT)
add(DisplayExosuitPacket::class, { DisplayExosuitPacket }, PLAY_TO_SERVER)
add(HideExosuitPacket::class, { HideExosuitPacket }, PLAY_TO_SERVER)
add(DisplayExopackPacket::class, { DisplayExopackPacket }, PLAY_TO_SERVER)
add(HideExopackPacket::class, { HideExopackPacket }, PLAY_TO_SERVER)
add(EnableExopackGlowPacket::class, { EnableExopackGlowPacket }, PLAY_TO_SERVER)
add(DisableExopackGlowPacket::class, { DisableExopackGlowPacket }, PLAY_TO_SERVER)
add(ResetExopackColorPacket::class, { ResetExopackColorPacket }, PLAY_TO_SERVER)
add(SetExopackColorPacket::class, SetExopackColorPacket.Companion::read, PLAY_TO_SERVER)
add(SetInventoryFilterPacket::class, SetInventoryFilterPacket.Companion::read, PLAY_TO_SERVER)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 915 B

After

Width:  |  Height:  |  Size: 964 B