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("recipe.ticks", "%s Ticks")
gui("exopack", "Exopack Inventory") 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_back", "Open vanilla inventory")
gui("exopack.go_in", "Open Exopack inventory") gui("exopack.go_in", "Open Exopack inventory")
gui("exopack.toggle_visibility", "Toggle Exopack visibility") gui("exopack.toggle_visibility", "Visibile on player")
gui("exopack.change_color", "Customize Exopack color") gui("exopack.toggle_glow", "Glows in dark")
gui("exopack.change_color2", "Press Middle Mouse Button to remove color") 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.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.") 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("recipe.ticks", "%s Тиков")
gui("exopack", "Инвентарь Экзопака") gui("exopack", "Инвентарь Экзопака")
gui("exopack.customize", "Изменить внешний вид Экзопака")
gui("exopack.customization", "Внешний вид Экзопака")
gui("exopack.go_back", "Открыть обычный инвентарь") gui("exopack.go_back", "Открыть обычный инвентарь")
gui("exopack.go_in", "Открыть инвентарь экзопака") gui("exopack.go_in", "Открыть инвентарь Экзопака")
gui("exopack.toggle_visibility", "Переключить отображение Экзопака") gui("exopack.toggle_visibility", "Отображать на игроке")
gui("exopack.change_color", "Изменить окраску Экзопака") gui("exopack.toggle_glow", "Свечение в темноте")
gui("exopack.change_color2", "Нажмите среднюю кнопку мыши для сброса окраски") gui("exopack.change_color", "Изменить окраску")
gui("exopack.change_color2", "Убрать окраску")
gui("exopack.probe1", "Данное маленькое устройство необычно на ощупь, а так же неприступно для любых попыток вскрыть.") gui("exopack.probe1", "Данное маленькое устройство необычно на ощупь, а так же неприступно для любых попыток вскрыть.")
gui("exopack.probe2", "На одной из сторон данного устройства находится сканер отпечатка, который тускло загорается при касании.") gui("exopack.probe2", "На одной из сторон данного устройства находится сканер отпечатка, который тускло загорается при касании.")

View File

@ -32,6 +32,7 @@ public final class ExosuitModel {
public static final HumanoidModel<AbstractClientPlayer> modelGlow; 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 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 { static {
MeshDefinition meshdefinition = new MeshDefinition(); MeshDefinition meshdefinition = new MeshDefinition();
@ -138,6 +139,20 @@ public final class ExosuitModel {
1f, 1f, 1f, 1f 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( modelGlow.renderToBuffer(
poseStack, poseStack,
bufferSource.getBuffer(RenderType.entityTranslucentEmissive(texture)), bufferSource.getBuffer(RenderType.entityTranslucentEmissive(texture)),
@ -146,6 +161,16 @@ public final class ExosuitModel {
// rgba // rgba
1f, 1f, 1f, 1f 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.ProjectileWeaponItem
import net.minecraft.world.item.crafting.RecipeManager import net.minecraft.world.item.crafting.RecipeManager
import net.minecraft.world.item.crafting.RecipeType 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.GameRules
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import net.minecraft.world.phys.Vec3 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.UUIDIntModifiersMap
import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.filter
import ru.dbotthepony.mc.otm.core.math.Decimal 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.math.minus
import ru.dbotthepony.mc.otm.core.nbt.getByteList import ru.dbotthepony.mc.otm.core.nbt.getByteList
import ru.dbotthepony.mc.otm.core.nbt.getCompoundList import ru.dbotthepony.mc.otm.core.nbt.getCompoundList
import ru.dbotthepony.mc.otm.core.nbt.getIntList import ru.dbotthepony.mc.otm.core.nbt.getIntList
import ru.dbotthepony.mc.otm.core.nbt.getStringList import ru.dbotthepony.mc.otm.core.nbt.getStringList
import ru.dbotthepony.mc.otm.core.nbt.set 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.IntValueCodec
import ru.dbotthepony.mc.otm.core.util.ItemValueCodec 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.Savetables
import ru.dbotthepony.mc.otm.core.util.TickList import ru.dbotthepony.mc.otm.core.util.TickList
import ru.dbotthepony.mc.otm.core.util.UUIDValueCodec 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 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 * Tick event schedulers
*/ */
@ -499,6 +506,9 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
savetables.stateful(::exoPackChargeSlots) savetables.stateful(::exoPackChargeSlots)
savetables.float(::exoPackSmelterExperience) savetables.float(::exoPackSmelterExperience)
savetables.bool(::isExoPackSmeltingInstalled) savetables.bool(::isExoPackSmeltingInstalled)
savetables.codecNullable(::exopackColor, RGBAColor.CODECRGB)
savetables.bool(::exopackGlows)
} }
fun invalidateNetworkState() { fun invalidateNetworkState() {

View File

@ -21,6 +21,7 @@ object Widgets8 {
val ARROW_PAINTED_UP = GRID[1, 2] val ARROW_PAINTED_UP = GRID[1, 2]
val MINUS = GRID[1, 3] val MINUS = GRID[1, 3]
val EXOSUIT_SHOWN = GRID[2, 1] val EXOPACK_SHOWN = GRID[2, 1]
val EXOSUIT_HIDDEN = GRID[3, 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 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.GuiGraphics
import net.minecraft.client.gui.screens.Screen import net.minecraft.client.gui.screens.Screen
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
import net.minecraft.client.gui.screens.inventory.InventoryScreen import net.minecraft.client.gui.screens.inventory.InventoryScreen
import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.player.Player 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.capability.matteryPlayer
import ru.dbotthepony.mc.otm.client.render.Widgets8 import ru.dbotthepony.mc.otm.client.render.Widgets8
import ru.dbotthepony.mc.otm.client.render.sprite import ru.dbotthepony.mc.otm.client.render.sprite
import ru.dbotthepony.mc.otm.client.screen.ExoPackInventoryScreen 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.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.CosmeticToggleRenderButton
import ru.dbotthepony.mc.otm.compat.cos.isCosmeticArmorLoaded 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.TranslatableComponent
import ru.dbotthepony.mc.otm.core.asGetterOnly import ru.dbotthepony.mc.otm.core.asGetterOnly
import ru.dbotthepony.mc.otm.network.DisplayExosuitPacket import ru.dbotthepony.mc.otm.core.math.RGBAColor
import ru.dbotthepony.mc.otm.network.HideExosuitPacket 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.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 { private fun calculateScale(width: Float, height: Float): Int {
val aspectRatio = width / height 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( class EntityRendererPanel<out S : Screen> @JvmOverloads constructor(
screen: S, screen: S,
parent: EditablePanel<*>?, parent: EditablePanel<*>?,
@ -67,21 +152,15 @@ class EntityRendererPanel<out S : Screen> @JvmOverloads constructor(
if (entity is Player) { if (entity is Player) {
val matteryPlayer = entity.matteryPlayer val matteryPlayer = entity.matteryPlayer
if (matteryPlayer != null && matteryPlayer.hasExoPack) { if (matteryPlayer != null && matteryPlayer.hasExoPack && screen is MatteryScreen<*>) {
exosuitButton = SmallBooleanRectangleButtonPanel(screen, this, this.width - 2f - SmallBooleanRectangleButtonPanel.SIZE, 2f, exosuitButton = SmallRectangleButtonPanel(screen, this, this.width - 2f - SmallBooleanRectangleButtonPanel.SIZE, 2f,
prop = matteryPlayer::displayExoPack.asGetterOnly(), skinElement = Widgets8.EXOPACK_SHOWN,
skinElementActive = Widgets8.EXOSUIT_SHOWN, onPress = {
skinElementInactive = Widgets8.EXOSUIT_HIDDEN, blockingWindow = createExopackAppearanceWindow(screen, matteryPlayer)
onChange = {
if (it) {
MatteryPlayerNetworkChannel.sendToServer(DisplayExosuitPacket)
} else {
MatteryPlayerNetworkChannel.sendToServer(HideExosuitPacket)
}
} }
) )
exosuitButton.tooltips.add(TranslatableComponent("otm.gui.exopack.toggle_visibility")) exosuitButton.tooltips.add(TranslatableComponent("otm.gui.exopack.customize"))
} else { } else {
exosuitButton = null 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.client.render.ShockwaveRenderer
import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.container.get
import ru.dbotthepony.mc.otm.container.set 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.math.Vector
import ru.dbotthepony.mc.otm.core.readItemType import ru.dbotthepony.mc.otm.core.readItemType
import ru.dbotthepony.mc.otm.core.writeItemType 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 write(buff: FriendlyByteBuf) {}
override fun play(context: Supplier<NetworkEvent.Context>) { 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 write(buff: FriendlyByteBuf) {}
override fun play(context: Supplier<NetworkEvent.Context>) { 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 { class SetInventoryFilterPacket(val type: Type, val slot: Int, val item: Item?) : MatteryPacket {
enum class Type { enum class Type {
INVENTORY, INVENTORY,
@ -559,7 +606,7 @@ class SetInventoryFilterPacket(val type: Type, val slot: Int, val item: Item?) :
} }
object MatteryPlayerNetworkChannel : MatteryNetworkChannel( object MatteryPlayerNetworkChannel : MatteryNetworkChannel(
version = "3", version = "4",
name = "player" name = "player"
) { ) {
fun register() { fun register() {
@ -590,8 +637,12 @@ object MatteryPlayerNetworkChannel : MatteryNetworkChannel(
add(GlitchPacket::class, GlitchPacket.Companion::read, PLAY_TO_CLIENT) add(GlitchPacket::class, GlitchPacket.Companion::read, PLAY_TO_CLIENT)
add(ShockwaveEffectPacket::class, ShockwaveEffectPacket.Companion::read, PLAY_TO_CLIENT) add(ShockwaveEffectPacket::class, ShockwaveEffectPacket.Companion::read, PLAY_TO_CLIENT)
add(DisplayExosuitPacket::class, { DisplayExosuitPacket }, PLAY_TO_SERVER) add(DisplayExopackPacket::class, { DisplayExopackPacket }, PLAY_TO_SERVER)
add(HideExosuitPacket::class, { HideExosuitPacket }, 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) 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