From 04b71b7cc88bce9e94780fe3ef688601e210af51 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Fri, 11 Oct 2024 21:00:46 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=82=20=D0=BC=D0=B3=D0=BD=D0=BE=D0=B2=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B4=D1=83=D0=B2=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B1=D0=BE=D1=82=D0=BE=D0=B2=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=BD=D1=8B=D0=BC=20=D1=83=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=BE=D0=BC=20(=D0=BA=D0=B0=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D1=81,=20=D0=BC=D0=B0=D0=B3=D0=BC=D0=B0=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt index 512117f6b..820b2c566 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmorFeature.kt @@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm.android.feature import net.minecraft.core.HolderLookup import net.minecraft.nbt.CompoundTag import net.minecraft.server.level.ServerPlayer +import net.minecraft.tags.DamageTypeTags import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent import ru.dbotthepony.kommons.util.getValue import ru.dbotthepony.kommons.util.setValue @@ -44,6 +45,8 @@ class NanobotsArmorFeature(android: MatteryPlayer) : AndroidFeature(AndroidFeatu } override fun onHurt(event: LivingIncomingDamageEvent) { + if (ply.invulnerableTime > 10 && !event.source.`is`(DamageTypeTags.BYPASSES_COOLDOWN)) return; + ticksPassed = 0 if (!event.source.isBypassArmor && layers > 0) { From 35b865216190bcceef4fcd3e510074b35f12464b Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Fri, 11 Oct 2024 22:21:13 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20-=20?= =?UTF-8?q?=D0=B2=D1=8B=D1=87=D0=BB=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=20=D0=B2=20=D0=BE=D1=82?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D1=8B=20-=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0?= =?UTF-8?q?=20/android=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D1=82=20=D0=B2=D1=8B=D0=B4=D0=B0=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C/=D0=B7=D0=B0=D0=B1=D0=B8=D1=80=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B8=D1=81=D1=81=D0=BB=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/otm/datagen/lang/English.kt | 1 + .../mc/otm/datagen/lang/Russian.kt | 1 + .../mc/otm/OverdriveThatMatters.java | 5 +- .../mc/otm/android/AndroidResearch.kt | 18 +-- .../mc/otm/capability/MatteryPlayer.kt | 74 ----------- .../screen/tech/AndroidStationScreen.kt | 22 +-- .../mc/otm/registry/CommandArgumentTypes.kt | 20 +++ .../ru/dbotthepony/mc/otm/server/MCommands.kt | 11 ++ .../mc/otm/server/command/AndroidCommand.kt | 125 ++++++++++++++++++ .../server/command/AndroidResearchArgument.kt | 31 +++++ .../mc/otm/server/command/ExopackCommand.kt | 54 ++++++++ 11 files changed, 264 insertions(+), 98 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/registry/CommandArgumentTypes.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/server/MCommands.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidCommand.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidResearchArgument.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/server/command/ExopackCommand.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 763d8ccff..3c970a6d5 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -395,6 +395,7 @@ private fun misc(provider: MatteryLanguageProvider) { misc("android_station.research.low_power", "Android Station is low on power! Can't research!") misc("android_station.research.researched", "Researched!") misc("android_station.research.can_be_researched", "Ready to research!") + misc("android_station.research.can_not_afford", "Missing required items!") misc("android_station.research.can_not_be_researched", "Can't research!") misc("android_station.research.xp_cost", "Experience cost: %s levels") misc("android_station.research.item", "Requires %s x%s") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index f8575df20..6781d647a 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -403,6 +403,7 @@ private fun misc(provider: MatteryLanguageProvider) { misc("android_station.research.low_power", "Мало питания у станции андроидов! Исследования недоступны!") misc("android_station.research.researched", "Исследовано!") misc("android_station.research.can_be_researched", "Готово к исследованию!") + misc("android_station.research.can_not_afford", "Не хватает предметов!") misc("android_station.research.can_not_be_researched", "Нельзя исследовать!") misc("android_station.research.xp_cost", "Требуется %s уровней Опыта") misc("android_station.research.item", "Требует %s %s шт.") diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 77e20d762..853a6188d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -58,6 +58,7 @@ import ru.dbotthepony.mc.otm.matter.IMatterFunction; import ru.dbotthepony.mc.otm.matter.MatterManager; import ru.dbotthepony.mc.otm.network.*; import ru.dbotthepony.mc.otm.registry.*; +import ru.dbotthepony.mc.otm.server.MCommands; import ru.dbotthepony.mc.otm.storage.StorageStack; import ru.dbotthepony.mc.otm.triggers.KillAsAndroidTrigger; import top.theillusivec4.curios.api.CuriosApi; @@ -127,6 +128,7 @@ public final class OverdriveThatMatters { MArmorMaterials.INSTANCE.register(bus); MCriteriaTriggers.INSTANCE.register(bus); MStats.INSTANCE.register(bus); + CommandArgumentTypes.INSTANCE.register(bus); StorageStack.Companion.register(bus); MatteryChestMenu.Companion.register(bus); @@ -197,7 +199,6 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayer.Companion::onPlayerSpawnPhantoms); EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayer.Companion::onStartTracking); EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayer.Companion::onStopTracking); - EVENT_BUS.addListener(EventPriority.NORMAL, MatteryPlayer.Companion::addCommands); EVENT_BUS.addListener(EventPriority.NORMAL, QuantumBatteryItem.Companion::tick); EVENT_BUS.addListener(EventPriority.LOWEST, PortableCondensationDriveItem.Companion::onPickupEvent); @@ -228,6 +229,8 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, DevChestBlockEntity.Companion::mappingsChanged); + EVENT_BUS.addListener(EventPriority.NORMAL, MCommands.INSTANCE::register); + if (ModList.get().isLoaded(CuriosApi.MODID)) { EVENT_BUS.addListener(EventPriority.NORMAL, CuriosCompatKt::onCuriosSlotModifiersUpdated); } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt index b1f3a113f..b9f01f739 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt @@ -173,17 +173,9 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay return true } - val canResearch: Boolean get() { - if (!consumeResearchCost(simulate = true)) { - return false - } - - if (!isPrerequisitesResearched || (!ply.isCreative && isAnyBlockerResearched)) { - return false - } - - return true - } + val canResearch: Boolean get() = !(!isPrerequisitesResearched || (!ply.isCreative && isAnyBlockerResearched)) + val canAfford: Boolean get() = consumeResearchCost(simulate = true) + val readyToResearch: Boolean get() = canResearch && canAfford /** * Determines if this research is already blocked directly by another research. @@ -246,12 +238,12 @@ class AndroidResearch(val type: AndroidResearchType, val capability: MatteryPlay return true } - fun research(force: Boolean = false): Boolean { + fun research(force: Boolean = false, free: Boolean = false): Boolean { if (isResearched) { return false } - if (force || canResearch && consumeResearchCost(false)) { + if (force || canResearch && (free || canAfford && consumeResearchCost(false))) { onResearched() isResearched = true diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt index 52f63fc06..32492040e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt @@ -8,8 +8,6 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap import net.minecraft.ChatFormatting import net.minecraft.client.model.PlayerModel import net.minecraft.client.player.AbstractClientPlayer -import net.minecraft.commands.Commands -import net.minecraft.commands.arguments.EntityArgument import net.minecraft.core.HolderLookup import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.nbt.CompoundTag @@ -46,7 +44,6 @@ import net.neoforged.bus.api.Event import net.neoforged.bus.api.ICancellableEvent import net.neoforged.neoforge.common.CommonHooks import net.neoforged.neoforge.common.NeoForge -import net.neoforged.neoforge.event.RegisterCommandsEvent import net.neoforged.neoforge.event.entity.living.LivingDeathEvent import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent import net.neoforged.neoforge.event.entity.living.MobEffectEvent @@ -54,7 +51,6 @@ import net.neoforged.neoforge.event.entity.player.PlayerEvent import net.neoforged.neoforge.event.entity.player.PlayerSpawnPhantomsEvent import net.neoforged.neoforge.event.tick.PlayerTickEvent import net.neoforged.neoforge.network.PacketDistributor -import net.neoforged.neoforge.server.command.EnumArgument import org.apache.logging.log4j.LogManager import org.joml.Vector4f import ru.dbotthepony.kommons.collect.ListenableMap @@ -1412,76 +1408,6 @@ class MatteryPlayer(val ply: Player) { companion object { private val offhandSlotRange = IntSet.of(40) - private fun setExoPack(players: Collection, hasExoPack: Boolean): Int { - for (player in players) { - player.matteryPlayer.hasExopack = hasExoPack - player.matteryPlayer._exoPackMenu = null - } - - return players.size - } - - private fun makeAndroid(players: Collection): Int { - for (player in players) { - player.matteryPlayer.becomeAndroid() - } - - return players.size - } - - private fun makeHuman(players: Collection): Int { - for (player in players) { - player.matteryPlayer.becomeHumane() - } - - return players.size - } - - private fun setUpgrade(players: Collection, type: UpgradeType, state: Boolean): Int { - for (player in players) { - player.matteryPlayer.let { type.prop.set(it, state) } - } - - return players.size - } - - fun addCommands(event: RegisterCommandsEvent) { - event.dispatcher.register( - Commands.literal("exopack") - .requires { it.hasPermission(Commands.LEVEL_GAMEMASTERS) } - .then(Commands.literal("add") - .executes { setExoPack(listOf(it.source.playerOrException), true) } - .then(Commands.argument("targets", EntityArgument.players()).executes { setExoPack(EntityArgument.getPlayers(it, "targets"), true) }) - ) - .then(Commands.literal("remove") - .executes { setExoPack(listOf(it.source.playerOrException), false) } - .then(Commands.argument("targets", EntityArgument.players()).executes { setExoPack(EntityArgument.getPlayers(it, "targets"), false) }) - ) - .then(Commands.literal("upgrade") - .then(Commands.argument("type", EnumArgument.enumArgument(UpgradeType::class.java)) - .then(Commands.literal("add") - .executes { setUpgrade(listOf(it.source.playerOrException), it.getArgument("type", UpgradeType::class.java), true) } - .then(Commands.argument("targets", EntityArgument.players()).executes { setUpgrade(EntityArgument.getPlayers(it, "targets"), it.getArgument("type", UpgradeType::class.java), true) })) - .then(Commands.literal("remove") - .executes { setUpgrade(listOf(it.source.playerOrException), it.getArgument("type", UpgradeType::class.java), false) } - .then(Commands.argument("targets", EntityArgument.players()).executes { setUpgrade(EntityArgument.getPlayers(it, "targets"), it.getArgument("type", UpgradeType::class.java), false) }))) - ) - ) - - event.dispatcher.register( - Commands.literal("android") - .requires { it.hasPermission(Commands.LEVEL_GAMEMASTERS) } - .then(Commands.literal("on") - .executes { makeAndroid(listOf(it.source.playerOrException)) } - .then(Commands.argument("targets", EntityArgument.players()).executes { makeAndroid(EntityArgument.getPlayers(it, "targets")) }) - ) - .then(Commands.literal("off") - .executes { makeHuman(listOf(it.source.playerOrException)) } - .then(Commands.argument("targets", EntityArgument.players()).executes { makeHuman(EntityArgument.getPlayers(it, "targets")) }) - ) - ) - } - init { WitherBoss.TARGETING_CONDITIONS.selector(WitherBoss.TARGETING_CONDITIONS.selector!!.and { it.matteryPlayer?.isAndroid != true }) WitherBoss.LIVING_ENTITY_SELECTOR = WitherBoss.LIVING_ENTITY_SELECTOR.and { it.matteryPlayer?.isAndroid != true } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt index c17dac55c..6dae4bd61 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/tech/AndroidStationScreen.kt @@ -288,7 +288,7 @@ private class AndroidResearchButton( } override val cursorType: CursorType - get() = if (node.isAnyBlockerResearchedIndirect && !(parent?.screen as AndroidStationScreen).menu.player.isCreative) CursorType.NOT_ALLOWED else if (node.canResearch && !node.isResearched) CursorType.HAND else CursorType.ARROW + get() = if (node.isAnyBlockerResearchedIndirect && !(parent?.screen as AndroidStationScreen).menu.player.isCreative) CursorType.NOT_ALLOWED else if (node.readyToResearch && !node.isResearched) CursorType.HAND else CursorType.ARROW override fun innerRender(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float) { val hovered = screen.hoveredResearch @@ -303,7 +303,7 @@ private class AndroidResearchButton( AndroidStationScreen.RESEARCHED } else if (node.isAnyBlockerResearchedIndirect) { AndroidStationScreen.ALREADY_BLOCKED - } else if (node.canResearch) { + } else if (node.readyToResearch) { AndroidStationScreen.CAN_BE_RESEARCHED } else { AndroidStationScreen.CAN_NOT_BE_RESEARCHED @@ -388,7 +388,7 @@ private class AndroidResearchButton( override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean { if (button == InputConstants.MOUSE_BUTTON_LEFT && minecraft.player?.isSpectator != true) { - if (node.canResearch && !node.isResearched && (parent?.screen as AndroidStationScreen).menu.energyWidget.level >= MachinesConfig.AndroidStation.ENERGY_PER_RESEARCH) { + if (node.readyToResearch && !node.isResearched && (parent?.screen as AndroidStationScreen).menu.energyWidget.level >= MachinesConfig.AndroidStation.ENERGY_PER_RESEARCH) { if (node.type.flatBlocking.isNotEmpty()) { queryUser( TranslatableComponent("otm.android_station.research.confirm", node.type.displayName), @@ -420,14 +420,16 @@ private class AndroidResearchButton( if (node.isResearched) { list.add(TranslatableComponent("otm.android_station.research.researched").withStyle(ChatFormatting.DARK_AQUA)) - } else if (node.canResearch) { - list.add(TranslatableComponent("otm.android_station.research.can_be_researched").withStyle(ChatFormatting.DARK_GREEN)) - - if (!enoughPower) { - list.add(TranslatableComponent("otm.android_station.research.low_power").withStyle(ChatFormatting.DARK_RED)) - } } else { - list.add(TranslatableComponent("otm.android_station.research.can_not_be_researched").withStyle(ChatFormatting.DARK_RED)) + if (node.canResearch) { + if (node.canAfford) { + list.add(TranslatableComponent("otm.android_station.research.can_be_researched").withStyle(ChatFormatting.DARK_GREEN)) + } else { + list.add(TranslatableComponent("otm.android_station.research.can_not_afford").withStyle(ChatFormatting.DARK_RED)) + } + } else { + list.add(TranslatableComponent("otm.android_station.research.can_not_be_researched").withStyle(ChatFormatting.DARK_RED)) + } if (!enoughPower) { list.add(TranslatableComponent("otm.android_station.research.low_power").withStyle(ChatFormatting.DARK_RED)) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/CommandArgumentTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/CommandArgumentTypes.kt new file mode 100644 index 000000000..5c6e73824 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/CommandArgumentTypes.kt @@ -0,0 +1,20 @@ +package ru.dbotthepony.mc.otm.registry + +import net.minecraft.commands.synchronization.ArgumentTypeInfo +import net.minecraft.commands.synchronization.ArgumentTypeInfos +import net.minecraft.commands.synchronization.SingletonArgumentInfo +import net.minecraft.core.registries.Registries +import net.neoforged.bus.api.IEventBus +import ru.dbotthepony.mc.otm.server.command.AndroidResearchArgument + +object CommandArgumentTypes { + private val registry: MDeferredRegister> = MDeferredRegister(Registries.COMMAND_ARGUMENT_TYPE) + + val ANDROID_RESEARCH by registry.register("android_research") { + ArgumentTypeInfos.registerByClass(AndroidResearchArgument::class.java, SingletonArgumentInfo.contextFree(AndroidResearchArgument.Companion::create)) + } + + fun register(bus: IEventBus) { + registry.register(bus) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/server/MCommands.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/server/MCommands.kt new file mode 100644 index 000000000..8b911edb9 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/server/MCommands.kt @@ -0,0 +1,11 @@ +package ru.dbotthepony.mc.otm.server + +import net.neoforged.neoforge.event.RegisterCommandsEvent +import ru.dbotthepony.mc.otm.server.command.* + +object MCommands { + fun register(event: RegisterCommandsEvent) { + ExopackCommand.register(event) + AndroidCommand.register(event) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidCommand.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidCommand.kt new file mode 100644 index 000000000..44a14eb34 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidCommand.kt @@ -0,0 +1,125 @@ +package ru.dbotthepony.mc.otm.server.command + +import net.minecraft.commands.Commands +import net.minecraft.commands.arguments.EntityArgument +import net.minecraft.world.entity.player.Player +import net.neoforged.neoforge.event.RegisterCommandsEvent +import ru.dbotthepony.mc.otm.android.AndroidResearchManager +import ru.dbotthepony.mc.otm.android.AndroidResearchType +import ru.dbotthepony.mc.otm.capability.matteryPlayer + +object AndroidCommand { + fun register(event: RegisterCommandsEvent) { + event.dispatcher.register( + Commands.literal("android") + .requires { it.hasPermission(Commands.LEVEL_GAMEMASTERS) } + .then(Commands.literal("on") + .executes { makeAndroid(listOf(it.source.playerOrException)) } + .then(Commands.argument("targets", EntityArgument.players()).executes { makeAndroid(EntityArgument.getPlayers(it, "targets")) }) + ) + .then(Commands.literal("off") + .executes { makeHuman(listOf(it.source.playerOrException)) } + .then(Commands.argument("targets", EntityArgument.players()).executes { makeHuman(EntityArgument.getPlayers(it, "targets")) }) + ) + .then( + Commands.literal("research") + .then( + Commands.literal("grant") + .then( + Commands.argument("targets", EntityArgument.players()) + .then( + Commands.argument("research", AndroidResearchArgument.create()) + .executes { + grantResearch(EntityArgument.getPlayers(it, "targets"), AndroidResearchArgument.getResearchType(it, "research")) + } + .then( + Commands.literal("force") + .executes { + grantResearch(EntityArgument.getPlayers(it, "targets"), AndroidResearchArgument.getResearchType(it, "research"), true) + } + ) + ) + .then( + Commands.literal("*") + .executes { + val players = EntityArgument.getPlayers(it, "targets") + AndroidResearchManager.researchMap.map { a -> a.value }.forEach { a -> + grantResearch(players, a) + } + + players.size + } + .then( + Commands.literal("force") + .executes { + val players = EntityArgument.getPlayers(it, "targets") + AndroidResearchManager.researchMap.map { a -> a.value }.forEach { a -> + grantResearch(players, a, true) + } + + players.size + } + ) + ) + ) + ) + .then( + Commands.literal("revoke") + .then( + Commands.argument("targets", EntityArgument.players()) + .then( + Commands.argument("research", AndroidResearchArgument.create()) + .executes { + revokeResearch(EntityArgument.getPlayers(it, "targets"), AndroidResearchArgument.getResearchType(it, "research")) + } + ) + .then( + Commands.literal("*") + .executes { + val players = EntityArgument.getPlayers(it, "targets") + AndroidResearchManager.researchMap.map { a -> a.value }.forEach { a -> + revokeResearch(players, a) + } + + players.size + } + ) + ) + + ) + ) + ) + } + + private fun grantResearch(players: Collection, type: AndroidResearchType, force: Boolean = false): Int { + for (player in players) { + player.matteryPlayer.getResearch(type).research(force, free = true) + } + + return players.size + } + + private fun revokeResearch(players: Collection, type: AndroidResearchType): Int { + for (player in players) { + player.matteryPlayer.getResearch(type).unResearch() + } + + return players.size + } + + private fun makeAndroid(players: Collection): Int { + for (player in players) { + player.matteryPlayer.becomeAndroid() + } + + return players.size + } + + private fun makeHuman(players: Collection): Int { + for (player in players) { + player.matteryPlayer.becomeHumane() + } + + return players.size + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidResearchArgument.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidResearchArgument.kt new file mode 100644 index 000000000..16b9cebde --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/AndroidResearchArgument.kt @@ -0,0 +1,31 @@ +package ru.dbotthepony.mc.otm.server.command + +import com.mojang.brigadier.StringReader +import com.mojang.brigadier.arguments.ArgumentType +import com.mojang.brigadier.context.CommandContext +import com.mojang.brigadier.suggestion.Suggestions +import com.mojang.brigadier.suggestion.SuggestionsBuilder +import net.minecraft.commands.CommandSourceStack +import net.minecraft.commands.SharedSuggestionProvider +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.android.AndroidResearchManager +import ru.dbotthepony.mc.otm.android.AndroidResearchType +import java.util.concurrent.CompletableFuture + +class AndroidResearchArgument : ArgumentType { + override fun parse(reader: StringReader): AndroidResearchType { + return AndroidResearchManager[ResourceLocation.read(reader)] ?: throw NoSuchElementException() + } + + override fun listSuggestions(context: CommandContext, builder: SuggestionsBuilder): CompletableFuture { + return SharedSuggestionProvider.suggest(AndroidResearchManager.researchMap.map { it.key.toString() }, builder) + } + + companion object { + fun create(): AndroidResearchArgument = AndroidResearchArgument() + + fun getResearchType(context: CommandContext, name: String): AndroidResearchType { + return context.getArgument(name, AndroidResearchType::class.java) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/ExopackCommand.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/ExopackCommand.kt new file mode 100644 index 000000000..943283326 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/server/command/ExopackCommand.kt @@ -0,0 +1,54 @@ +package ru.dbotthepony.mc.otm.server.command + +import net.minecraft.commands.Commands +import net.minecraft.commands.arguments.EntityArgument +import net.minecraft.world.entity.player.Player +import net.neoforged.neoforge.event.RegisterCommandsEvent +import net.neoforged.neoforge.server.command.EnumArgument +import ru.dbotthepony.mc.otm.capability.MatteryPlayer.UpgradeType +import ru.dbotthepony.mc.otm.capability.matteryPlayer + +object ExopackCommand { + fun register(event: RegisterCommandsEvent) { + event.dispatcher.register( + Commands.literal("exopack") + .requires { it.hasPermission(Commands.LEVEL_GAMEMASTERS) } + .then(Commands.literal("add") + .executes { setExoPack(listOf(it.source.playerOrException), true) } + .then(Commands.argument("targets", EntityArgument.players()).executes { setExoPack(EntityArgument.getPlayers(it, "targets"), true) }) + ) + .then(Commands.literal("remove") + .executes { setExoPack(listOf(it.source.playerOrException), false) } + .then(Commands.argument("targets", EntityArgument.players()).executes { setExoPack(EntityArgument.getPlayers(it, "targets"), false) }) + ) + .then(Commands.literal("upgrade") + .then(Commands.argument("type", EnumArgument.enumArgument(UpgradeType::class.java)) + .then(Commands.literal("add") + .executes { setUpgrade(listOf(it.source.playerOrException), it.getArgument("type", UpgradeType::class.java), true) } + .then(Commands.argument("targets", EntityArgument.players()).executes { setUpgrade( + EntityArgument.getPlayers(it, "targets"), it.getArgument("type", UpgradeType::class.java), true) })) + .then(Commands.literal("remove") + .executes { setUpgrade(listOf(it.source.playerOrException), it.getArgument("type", UpgradeType::class.java), false) } + .then(Commands.argument("targets", EntityArgument.players()).executes { setUpgrade( + EntityArgument.getPlayers(it, "targets"), it.getArgument("type", UpgradeType::class.java), false) }))) + ) + ) + } + + private fun setExoPack(players: Collection, hasExoPack: Boolean): Int { + for (player in players) { + player.matteryPlayer.hasExopack = hasExoPack + // player.matteryPlayer.recreateExoPackMenu() + } + + return players.size + } + + private fun setUpgrade(players: Collection, type: UpgradeType, state: Boolean): Int { + for (player in players) { + player.matteryPlayer.let { type.prop.set(it, state) } + } + + return players.size + } +} From 434f06be7fa7fde5521a96bee3fd24e3e6774143 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Tue, 15 Oct 2024 18:32:23 +0300 Subject: [PATCH 3/9] =?UTF-8?q?=D0=BA=D0=BE=D1=81=D1=82=D1=8B=D0=BB=D0=B8?= =?UTF-8?q?=20=D0=BE=D1=82=20=D0=BA=D0=BE=D1=81=D1=82=D1=8B=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9=20(=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D1=81=D1=82=D1=8B?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt index 726a5eab2..0f775924f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt @@ -683,7 +683,10 @@ abstract class MatteryScreen(menu: T, inventory: Inventory, tit panelsReversed.any { it.updateCursor1() } RenderSystem.depthFunc(GL11.GL_LESS) + graphics.pose().pushPose() + graphics.pose().translate(guiLeft.toFloat(), guiTop.toFloat(), 0f) NeoForge.EVENT_BUS.post(ContainerScreenEvent.Render.Background(this, graphics, mouseX, mouseY)) + graphics.pose().popPose() RenderSystem.disableDepthTest() // Screen.super.render @@ -693,7 +696,10 @@ abstract class MatteryScreen(menu: T, inventory: Inventory, tit // /Screen.super.render RenderSystem.disableDepthTest() + graphics.pose().pushPose() + graphics.pose().translate(guiLeft.toFloat(), guiTop.toFloat(), 0f) NeoForge.EVENT_BUS.post(ContainerScreenEvent.Render.Foreground(this, graphics, mouseX, mouseY)) + graphics.pose().popPose() var itemstack = if (draggingItem.isEmpty) menu.carried else draggingItem From 0e1dcbf1fed5f741b9630dc05e2f937c475a0a19 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Wed, 16 Oct 2024 00:32:02 +0300 Subject: [PATCH 4/9] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D1=83=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D0=B5=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../structure/field_research_pod.nbt | Bin 3248 -> 3625 bytes .../structure/field_research_pod_ruin.nbt | Bin 1540 -> 1578 bytes .../laboratory/main/generator_room_0.nbt | Bin 23838 -> 23839 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/data/overdrive_that_matters/structure/field_research_pod.nbt b/src/main/resources/data/overdrive_that_matters/structure/field_research_pod.nbt index 02c59e4978ef07ab108e2c05262a1c2cec1d41d2..6de764a874ab9b7265b57242b3b4a69fac327ece 100644 GIT binary patch literal 3625 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 Gv*zDW2TVf% literal 3248 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 ICvMsDPvPxye*gdg diff --git a/src/main/resources/data/overdrive_that_matters/structure/field_research_pod_ruin.nbt b/src/main/resources/data/overdrive_that_matters/structure/field_research_pod_ruin.nbt index c3c297d9960d09042c7fa58d6557b293403ac047..57947deee3e16e24a090bb5137fb84cce8824620 100644 GIT binary patch literal 1578 zcmaKrdr;C@6vy3ZT2skp^M#eMQ!Q%RN#LHNUX(MvFsX!p^+oPJ;>pLg{1(s#h;D6WD z3n{fpd4(@uTy=^76iu(1-56F3vz)hd3hj`W`RP6#BRn==H`fC702U>hk1*CXut431 zk@)3?VJAD!?1z94u-v@Nz50$B;m;glpr|Gwp&q$Q+uaV5zqWk{-aLeWMa?yHcpC&N zeb5lX>RGXGCOq;8<4LI~rlNl9U(L>nv3|-iL+DxXlng<;*>^3&NIsvqFAP-*E8~Y` zswY~~@8}pocPZBbkw)MI_rA^8S@EeW9WIVb>g7iNtH=Uak=hU8G) zHQCRyvv4BM;y>eG(t5qAU(&wF|ELDg!Bqy`d1!iC1{_o+e|E&xa7jdE4R1#`=d{|FFb?KzC%^TT9ls!U$i-) zY>REXoZ6Qi|?RNv`F1y~7M5d}Vf+*^q~n#B_xGeIA@~EM)@z)tTLgE9F|L_O%?^e8bR;Yu*2JYZPd4sZd z2_>VQ&r=fN@56g*tKmakZ8?>Jx72ZR+DP3yZysVqbMk`OFT?WZ`CIHX0nYDJTb41e zL=wDmEOt>^N9|%CR^Mo(ULM||9~WI(#8pHEb`LWuGHSAMU9QMR^eN6m;Xe7oYMbWx z&ML?xA4$Z-xdu8e{|rCBkUqabTFinkvXhe03i4)S85fsQwi4($Zc)%tNP^IoZuI0e YEi_dXqKSl2`l^;w)tHgjel4xP0Y3jF(EtDd delta 1408 zcmZXSeKeB`7{EigvFw&P=61Q=Xh@g&h_>uqAGmaPDPxp;jNNc@54D4sdFlEHE%BZ- z70XAH?>Sh=SDPr7mBcjT)GlQ+6=oq^)%~yM{Qh{(^E`h%=lMNVurwI>OU@5lzQ%?^ z{4`qXg4Fup@p%Wx9!Ry?=^k@fy(gV-l4^R?eRo|RL?Gr2U!5IueXyanalldef;9Ij zVKV#NKHuw(UG4VCEF-X7B47?jS-%{^hTDe`3YZ^8WfM1rViosLoRao{8h>3Z@%!i9 z%6-*{?_0?PNu>oY$~6;fZbFK<4!JBxq7W)x*Y~NCx;_*?Y^$oAl;A%}S^-I`q_P@t z?oo=Xv>V%fO3q;xf=0X1=du-S|8 z$qm=Ienzp;cR09TgQ1ZECI&k#J@dUkrw~1nl*p{Xk&e*M-OV>f^?+)VNm6DTrtlf5 zW7qNR^$ssAa<6y!-*XnIhUYRgV)#CUb?Q_VJ`=1L_cG^M!)f%j=URN3aTngG(@82E zHshXG9&9)28Y*Fgb+2&-{qSs5OA~IQ$q^oWKBRPlA$4x&huej!yA~ZjY3?(eI%YvA z1<{o}4yF$}WktAyF5w|`i2DQuOhzbxjsmhuJxlLF`()+W*up(F$O1#yE%=qQ!2ZqD z&(??=A0nDaCDXJs6vjwy{P9P(|8Om;EgdAC40j%_O~ayvw3gH8EMB>eX%X#r{X8tX zf#-~`Q(p2wpnRDGTh?u6j9p0t&xHbPb~x+Z-=OF~R)ixf`hTKMFt1(FB2#I_f`r3RjV0oBQm|o zT(f$YJcy%)fNIs?>g;T&Ld_UXL>5@W1{@YBG8#9(uHwtE77-bTOD97+)y=?mia(3| zJ)#A_nHga|S@<4Zga4n|W#bH7S2V6~YIWRgrTs5Crfx4Eh#pJ4I-pt>o@Uw$7BJen zC|~5v0!taSCXjC}#@G}R$QMF+PY^vW&^83y3{@;Rele(^H#^w2V6jFO44y656D&0E zux9>N30aKzS25u*Ih=409c9ep#4z7S#dXrC|4KjZ;9$>I3;{7?DYzaVF*DG^)}y)}0-I&FL}WI;&%h{#anc%Rf3 zP78(j=K`1MsWs~CjPP?Y2sVazdxuL4h51Wdm3g1;M1xkB|M*ZsRgMvFc6Y0v8s`ZzPH@LB&&uZfV7OsR}qzK#y43iWo;#TW` z;@SSFL$ujIv1n3GBoj diff --git a/src/main/resources/data/overdrive_that_matters/structure/laboratory/main/generator_room_0.nbt b/src/main/resources/data/overdrive_that_matters/structure/laboratory/main/generator_room_0.nbt index be574371872e8239983cd12ff27a102f6e9ce6b2..b8a71e7abf0095ce87fa7d404ebe2ecba56c63f8 100644 GIT binary patch literal 23839 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 MfJ5tEfA*>W0|m_A`2YX_ literal 23838 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 Date: Thu, 17 Oct 2024 03:53:45 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D0=BB=D1=91=D0=B3=D0=BA=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BD=D1=91=D1=80=D1=84=20=D0=BC=D0=BE=D0=BB=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D1=80=D0=B0=D1=84=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BB=D0=B0=D1=81=D1=82=D0=B8=D0=BD,=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BC=D0=B0=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D1=83=D0=BC=20=D1=81=D1=82=D0=B0=D0=BA=20=D0=BD=D0=B0=20?= =?UTF-8?q?1=20=D0=BC=D0=BE=D0=BB=D0=BE=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/otm/item/tool/ExplosiveHammerItem.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt index 8fcdb6015..72dc1cd38 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt @@ -86,17 +86,16 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1) val player = CommonHooks.getCraftingPlayer() ?: return itemStack.copy() if (player.level().isClientSide) return itemStack.copy() - if (!isPrimed(itemStack)) { - itemStack.hurtAndBreak(1, player.level() as ServerLevel, player) {} - } else { - val level = player.level() as ServerLevel + val level = player.level() as ServerLevel + itemStack.hurtAndBreak(8, level, player) {} - itemStack.hurtAndBreak(level.random.nextInt(1, 20), player.level() as ServerLevel, player) {} + if (isPrimed(itemStack)) { + itemStack.hurtAndBreak(level.random.nextInt(1, 20), level, player) {} unprime(itemStack) val (ex, ey, ez) = Vector.atCenterOf(player.blockPosition()) - val exp = Explosion(player.level(), player, ex, ey, ez, 1f, false, if (ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS) Explosion.BlockInteraction.DESTROY_WITH_DECAY else Explosion.BlockInteraction.KEEP) + val exp = Explosion(level, player, ex, ey, ez, 1f, false, if (ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS) Explosion.BlockInteraction.DESTROY_WITH_DECAY else Explosion.BlockInteraction.KEEP) exp.explode() exp.finalizeExplosion(true) From 5913f56fb07534458900ae418a9be11fc719acee Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Wed, 23 Oct 2024 11:47:28 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D1=81=D0=BA=D0=B5?= =?UTF-8?q?=D0=B9=D0=BB=D0=B8=D0=BD=D0=B3=20=D1=82=D0=B5=D0=BA=D1=81=D1=82?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=BA=D0=B0=D1=85=20(=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B=D0=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AMD User — Сегодня, в 11:36 Изображение наверное ветер --- .../mc/otm/client/render/blockentity/HoloSignRenderer.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt index 6242b1eee..ed719fb84 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt @@ -35,6 +35,11 @@ class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context) val totalHeight = lines.size * font.lineHeight + (lines.size - 1) * 2f var y = -totalHeight / 2f + val totalWidth = lines.maxOf { font.width(it) }.toFloat() + val highest = totalWidth.coerceAtLeast(totalHeight) + val mul = if (highest > 64f) 1f / (highest / 64f) else 64f / highest + poseStack.scale(mul, mul, mul) + for (line in lines) { font.draw(poseStack = poseStack, buffer = bufferSource, text = line, gravity = RenderGravity.TOP_CENTER, y = y, color = RGBAColor(tile.textRed, tile.textGreen, tile.textBlue, tile.textAlpha)) y += font.lineHeight + 2f From 84da57719dd253f08081389db1bb51d1ab895070 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Wed, 23 Oct 2024 20:50:31 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BA=D0=B5=D0=B9=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=87=D0=BA=D0=B5=20?= =?UTF-8?q?(=D0=B8=20=D0=B2=D1=81=D1=80=D0=B0=D1=82=D0=B0=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D1=82=D1=80=D0=B0=20=D0=BD=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=BA=D1=83=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=20=D1=86=D0=B2=D0=B5=D1=82=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/decorative/HoloSignBlockEntity.kt | 7 +++++++ .../mc/otm/client/render/Widgets18.kt | 4 ++++ .../render/blockentity/HoloSignRenderer.kt | 10 ++++++---- .../screen/decorative/HoloSignScreen.kt | 15 +++++++++++---- .../mc/otm/menu/decorative/HoloSignMenu.kt | 4 ++++ .../textures/gui/widgets/side_controls.png | Bin 2925 -> 2675 bytes .../textures/gui/widgets/side_controls.xcf | Bin 74976 -> 78060 bytes 7 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt index 34a356892..5ab2a9764 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/HoloSignBlockEntity.kt @@ -56,6 +56,11 @@ class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB var textBlue by syncher.float(85f / 255f, setter = ::colorSetter).delegate var textAlpha by syncher.float(1f).delegate + var textAutoScale by syncher.boolean(true, setter = { access, value -> + setChanged() + access.accept(value) + }).delegate + var isLocked = false init { @@ -67,6 +72,8 @@ class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB savetables.float(::textGreen) savetables.float(::textBlue) savetables.float(::textAlpha) + + savetables.bool(::textAutoScale) } override fun createMenu(p_39954_: Int, p_39955_: Inventory, p_39956_: Player): AbstractContainerMenu { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt index 4454efe37..d8ef39b0a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt @@ -176,4 +176,8 @@ object Widgets18 { } val UPGRADES = controlsGrid.next() + + val COLOR_PALETTE = controlsGrid.next() + val TEXT_SCALE_DISABLED = controlsGrid.next() + val TEXT_SCALE_ENABLED = controlsGrid.next() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt index ed719fb84..45ca54dd4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt @@ -35,10 +35,12 @@ class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context) val totalHeight = lines.size * font.lineHeight + (lines.size - 1) * 2f var y = -totalHeight / 2f - val totalWidth = lines.maxOf { font.width(it) }.toFloat() - val highest = totalWidth.coerceAtLeast(totalHeight) - val mul = if (highest > 64f) 1f / (highest / 64f) else 64f / highest - poseStack.scale(mul, mul, mul) + if (tile.textAutoScale) { + val totalWidth = lines.maxOf { font.width(it) }.toFloat() + val highest = totalWidth.coerceAtLeast(totalHeight) + val mul = if (highest > 64f) 1f / (highest / 64f) else 64f / highest + poseStack.scale(mul, mul, mul) + } for (line in lines) { font.draw(poseStack = poseStack, buffer = bufferSource, text = line, gravity = RenderGravity.TOP_CENTER, y = y, color = RGBAColor(tile.textRed, tile.textGreen, tile.textBlue, tile.textAlpha)) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt index f291876b3..20524cf57 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt @@ -2,8 +2,6 @@ package ru.dbotthepony.mc.otm.client.screen.decorative import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import net.minecraft.world.item.ItemStack -import ru.dbotthepony.mc.otm.client.render.ItemStackIcon import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.ColorPickerPanel import ru.dbotthepony.mc.otm.client.screen.panels.Dock @@ -15,8 +13,9 @@ import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.input.NetworkedStringInputPanel import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.kommons.math.RGBAColor +import ru.dbotthepony.mc.otm.client.render.Widgets18 +import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeBooleanRectangleButtonPanel import ru.dbotthepony.mc.otm.menu.decorative.HoloSignMenu -import ru.dbotthepony.mc.otm.registry.MItems class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) : MatteryScreen(menu, title) { override fun makeMainFrame(): FramePanel> { @@ -51,10 +50,18 @@ class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) }) { init { tooltips.add(TranslatableComponent("otm.gui.change_color")) - icon = ItemStackIcon(ItemStack(MItems.PAINTER)).fixed() + icon = Widgets18.COLOR_PALETTE } }) + controls.addButton(LargeBooleanRectangleButtonPanel( + this@HoloSignScreen, + frame, + prop = menu.textAutoScale, + iconActive = Widgets18.TEXT_SCALE_ENABLED, + iconInactive = Widgets18.TEXT_SCALE_DISABLED, + )) + return frame } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt index 87c55378e..2dd7ffa7c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/decorative/HoloSignMenu.kt @@ -24,6 +24,7 @@ class HoloSignMenu( val textGreen = FloatInputWithFeedback(this) val textBlue = FloatInputWithFeedback(this) val textAlpha = FloatInputWithFeedback(this) + val textAutoScale = BooleanInputWithFeedback(this) init { text.filter { it.isCreative || !locked.value } @@ -35,6 +36,8 @@ class HoloSignMenu( textBlue.filter { it.isCreative || !locked.value } textAlpha.filter { it.isCreative || !locked.value } + textAutoScale.filter { it.isCreative || !locked.value } + if (tile != null) { text.withConsumer { if (tile.isLocked) tile.signText = it else tile.signText = HoloSignBlockEntity.truncate(it) }.withSupplier(tile::signText) textRed.withConsumer { tile.textRed = it.coerceIn(0f, 1f) }.withSupplier(tile::textRed) @@ -43,6 +46,7 @@ class HoloSignMenu( textAlpha.withConsumer { tile.textAlpha = it.coerceIn(0f, 1f) }.withSupplier(tile::textAlpha) locked.with(tile::isLocked) redstone.with(tile.redstoneControl::redstoneSetting) + textAutoScale.with(tile::textAutoScale) } } } diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png index 41171ed83cf8384efae821239c5e56b039904b5e..9806ad55a39af3b1f167772a5192e540ff6ed437 100644 GIT binary patch delta 2624 zcmXw*dpy(MAIEk1=8{`;$zngub@o@CHKnh<63;}hnVX&mvS$B zF(O}7Zc#$WOyyfbX&YLylJ#4c-}&SHIOlQB`<(N7zRx-D!RSH#ZQIi%A4q^e_7sVHjjID}HutC5WnF5by&U0;S%H$j zE^th%GXoNZm)5k)SD4dq6iS&)SY2Pwo$;;}7Ve*1@+0=1!os-jVgxpWPu5%Q2@6tQv!;gV zL7#)IZLMwdUJ-5On*L6i-sfVqSI$bCZAeN-p3q%gE&J3vb|vnfh#@Xnnu&Op~n%LansqhL5g^O?<~ov*Eb7Jz6qM@C{<^THFe? z-KC}VP}Z@}2b*UBI``GB{v{Bk_`N*tQwiUSGFEfrpPNZTC72Twx#t#I5vLlN@qhL9_8ew zb-qLpH$kIjMKMDM$1m%33P7QMG)V>ghDHGh8&JAHctJq|JOdoNd@e6U)S;Ag^z>$Ul7lTeU(d1_g9ld5)6q%d52Pcko(9Ak4)eMi}L$qr1 z(fyOt{ORX{{UD5vreE=q<`#L*-p8o1BJ;LeMQj=#zT;JGl3Huy8#M zBmwGy?bhZqV$S4Bt5ZwUP~u|*v5*%Erp>(Re{(v~id%r`xGr+$)huaMq4=MRg@gcN zz|h2#O@G<+4srxstMi3VP1O&`6x18BkYncq&u-L@DgWMR7=Fl0CV~sMlKs%e<*}aL zFHzWL9TUWtn%S}zm+(1(7uAaD^mXt=Ac4+}jf65q<#XMgd>$+9n<&S0I|b_$;0&AC0sNPJBc_)nqHHL`b@PBB!UZ#DC};{-v($^9X+RjV$#p-c zn3a6*wrhlq5&|$#C`QB%ZwWJ%6jGOQ`pWkcIxllTeJ_?MrsYpG9*Rr)FpE6BGvD@ql)>%|M#fE=w7?Vyryu0E_LCs)$>0cGNgd&NUA= zSW8FUE>`V;nfQLPl2@&f;}j>)0>O9^Daa`i0@I|9Oi{_vtcQiWKNq9I5^$xC>n|H^ta6 zxyS9Wa)I^)=E>||QF5&GO8qgk4a}f^x7Av52w~^7?)iOq^upwr$S^sePhcJqw-=o? z$1RWqw%8o3X=13Y{V~t@u7A)$*MP-2rr)=c#kTe=7=0s{ZNz`FImdiU(u9dVcKXJQ zRH^=`?5(=w@YJ|2C_Bfc8y!8RF9cg?VW=;0I zX?x?&a8oN)BZKTAK16r+h`+dg{gZfze#C5_dJ2w)wezm+;7u=&XOnO=@~wc9BGhlW z|58cAnr~&D^vDeEUk;)g9a0Z^E+~UxfLMrji$LrV4YSM)*(GDYNkuG6Akrxlq5-w~ zLd8Cm1)a#WXpUK8isp^Hu*J;rQ$cZOH(-?mn&StE>7r#tBBbO(96I=WK}+OR$M?Ll zpHId!zB=lpqVHa?;Ar@i7-)*7oNE6LmYHxghffp#bDcK|}Y8V;V5atHd| z0uH-Yi_2}%`Sg063C>mbZ3`sU>}(*7w0?ti_$#4-YOU+Cd4u zIo#97<=O5u;F2#nh<0x-c)<9-ns@o^(KmvRfNIKS0*YEzrc+IR)|Wims;Z@XW<_{W ztN73ANA6jWiWE|v;0IFVZLnM+aeckl``P92ujPOU(48OZ1|4EU9qR_ zd+gvxOh){BCC5~oA#gYR$Hc2zDE|Sa@Jh?5=!~vUAj*6_(Ug@)CY);$D?Ge5T>(_t z7UQ6T$wlTSZ14m(6HFbzBDqIo%X{?h+OIQqtqGf7AUF2fz1~*GRWD$C&uv3eX~Ez6 z`%Dv!8djdo2TZdE7&ng?7(<5&V{7VMV7_}r1z9xd{RYG#mgpC6FPHIyzpWMCvI%`Y F<$sWZ;0*u( delta 2874 zcmXX|c{~&DAD{FUatF6>9k9>-A6zvo+k0Ta^t_9QS+}wzOh32Q zyzIN!%t(5ZA@*J71$>d}F-fYUuBg26-eRWA?(@E87_v)n7~;Rrny~^^Lf6;Q>-T~* z)X>@%ao-SYqvgjR&|}h(P7mkXY7p($KEb%>hE`TNk+trCA12YP*e$g~{wwLrXS}KV zL_SA;`tr1_>q_&4jNxLT^X;#Wadc$8)HBB0BTCmlpYV?!;FnjX^zG7e_d7HS*p<+H z=~e~L>f@;V*zj;uh~?H6AcaP#xOK&PSz@Ow#IgW1eG>qX2zRpk8+&Pp@28!j z=Aigsbgx*#U%6OCO>yy(VE;XY!lKTHm>++K1A$O2X^JADwFf~_^v5X^KxbP}xI$5p ztb9kYfX^+S++=w6-0Q|8OGM(J(1x(GArO2VeiJp>bG5-s5+Hdr_N+*4WLd*qgFRHT zWQ@6%&W2lzW}TfO!%eHJ&o{2K{tJ*0{L~qulvVeTYsDGg{LhzFf=K0ROb<&7t33ZFXxTB z_n8jKapPRTRMKM47!28(ni$may@TBI_i)WW93Lzxe)^SPXYcFsbE};Jh&$|j;LFBk zbnh0juJr^gODQ9{EGMUwnmkz@0)cF-pUc9&H7DZ9XDhzG_}|Q@gc;?Hk6T4btJU1Z z(Q~yw#Gd<}hA>D5>S%|=4EVn?6S4&=W*WS&5lQyHf%l&-Z*6x zOe;?AXI@TII)4y2wA6&g&FZqOqbj>zlqcK3=PtmYu5o_k+aodeJ=El_3aA(Kb0e&yX_Nb+LFH}iWZ*N*noW`k9r4N?>tocTC)uA|^zHzr# zAmJfxNoSpi(kexA-!98#ehnO@jZwPPM)sk=GBYO}k-imC*($&@;z z+7TbRR~%|-*PmD|A>)1ugiZ5fiZhia#O3i6Z|1w9`Fy1W(MIMylP`j-A-E440SbPGV@lGJ}o6x)J=+Fd_Tg2RbnMk;u*pm5##tp6EM31dk^yH)(w9udCYkjifRfOWc0 z%YT1T%ItdKT&a3m8vX#He(O3?jjXo=9V$AZATJr|AESd*-@Q#ks$A!t?BRv=%us@U zrn9Hb>S)`wf21GN5UjS0@S+;`|IORa1?l~iBmleWQ}Nx5cVAG|ePvt?PY#~GSg+44 zxp>8K;a8e=Dh+{usSYQ)uDe?PB;L7O=1=iFX~vO5H=A*Sjb@ydEI-9P+v>Z(u}!HW z-H&|(ir+n@aGOG_c{?Y4Qeg0SpN#2>g^3)T6Y zR8Kn&I?!DoVL^LuvvZY9Cj}SkRWVz8$KUkR-h*^7v^TV4QF@$hz{kKu19@ooln<~y zRU9=Nw#`1oasL&F_L)uD?c)R_0hnXuFdN|#-DKx4-j4?cZW^TI1q}2QA zNV1Ws^1-y_qUo}DQkr3L^-FX6>XjmD{fdM?N!Sksk#}B$S=EyYPR3cBex6XywZUc> zV@JlfYYFyNz0_AVd~Sz;DO541E1E)sHbs9UQMVYJsSY3Z+8!c!GiJaYQnxjcAbh#k zrc8(p<44@gVENSiSd+uxwX231+*Ne|$YZlKpcu2GS#LlNC*OHeel&?^dMBJNhLb0& zDB`>aJW(ZWfgWbA1uz4HY78om!SH@HvDm=7XLD4t63uFO_N+grr(Mo%xYh45FTC=D z*3D}I?%B);7qghRrag_oA!j&1%S)a#z*Ya@rRt${Jz$FRpg!RAfiYr3ISsS-!ZH7E z7WpTnhie9IhYkjnt03~k0J9c4fNL6*Uy$@zLXo`@X1=|h+|HjDPRHEr*hv2y{|8p! BXsiGL diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.xcf index cbd6a7acfa19b0844f877af057c6f252946495eb..928c66053ec01045c3af6587d5a8c8ece6a40f94 100644 GIT binary patch delta 6053 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 delta 3817 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 Date: Thu, 24 Oct 2024 05:54:08 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D0=A3=D0=A0=D0=90=20=D0=91=D0=9E=D0=9B?= =?UTF-8?q?=D0=AC=D0=A8=D0=95=20=D0=92=D0=A1=D0=A0=D0=90=D0=A2=D0=AB=D0=A5?= =?UTF-8?q?=20=D0=98=D0=9A=D0=9E=D0=9D=D0=9E=D0=9A=20(=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D1=81=20=D1=87=D0=B5=D0=BA=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=D1=81=D0=B0=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B2=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=20+?= =?UTF-8?q?=20=D1=82=D1=83=D0=BB=D1=82=D0=B8=D0=BF=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=80=D0=B5=D1=81=D0=B0=D0=B9=D0=B7=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/otm/datagen/lang/English.kt | 4 ++++ .../mc/otm/datagen/lang/Russian.kt | 4 ++++ .../mc/otm/client/render/Widgets18.kt | 3 +++ .../screen/decorative/HoloSignScreen.kt | 22 ++++++++++++------ .../textures/gui/widgets/side_controls.png | Bin 2675 -> 2802 bytes .../textures/gui/widgets/side_controls.xcf | Bin 78060 -> 79947 bytes 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 3c970a6d5..9201d2270 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -164,8 +164,12 @@ private fun misc(provider: MatteryLanguageProvider) { misc("needs_no_power", "Requires no power to operate") gui("lock_holo_screen", "Lock contents") + gui("lock_holo_screen.unlocked", "Unlock contents") gui("lock_holo_screen.tip", "Locking and unlocking contents is only possible in creative.\nWhen locked, text boundaries are removed.") + gui("holo_screen.resize_text", "Resize text automatically") + gui("holo_screen.do_not_resize_text", "Do not resize text") + gui("ticks", "Ticks") gui("power_cost_per_use", "Power cost per use: %s") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 6781d647a..cca000ded 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -176,8 +176,12 @@ private fun misc(provider: MatteryLanguageProvider) { misc("needs_no_power", "Не требует энергии для работы") gui("lock_holo_screen", "Заблокировать содержимое") + gui("lock_holo_screen.unlocked", "Разблокировать содержимое") gui("lock_holo_screen.tip", "Блокировка и разблокировка содержимого возможна только в режиме творчества.\nКогда заблокировано, границы ввода текста отключены.") + gui("holo_screen.resize_text", "Изменять размер текста автоматически") + gui("holo_screen.do_not_resize_text", "Не менять размер текста") + gui("ticks", "Тиков") gui("power_cost_per_use", "Энергии на операцию: %s") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt index d8ef39b0a..a405fed3d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/Widgets18.kt @@ -180,4 +180,7 @@ object Widgets18 { val COLOR_PALETTE = controlsGrid.next() val TEXT_SCALE_DISABLED = controlsGrid.next() val TEXT_SCALE_ENABLED = controlsGrid.next() + + val LOCK_UNLOCKED = controlsGrid.next() + val LOCK_LOCKED = controlsGrid.next() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt index 20524cf57..66294534b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/HoloSignScreen.kt @@ -5,9 +5,7 @@ import net.minecraft.world.entity.player.Inventory import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.ColorPickerPanel import ru.dbotthepony.mc.otm.client.screen.panels.Dock -import ru.dbotthepony.mc.otm.client.screen.panels.DockProperty import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel -import ru.dbotthepony.mc.otm.client.screen.panels.button.CheckBoxLabelInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeRectangleButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.makeDeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.input.NetworkedStringInputPanel @@ -23,16 +21,14 @@ class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) frame.makeCloseButton() frame.onClose { onClose() } + frame.makeHelpButton().apply { + tooltips.add(TranslatableComponent("otm.gui.lock_holo_screen.tip")) + } val input = NetworkedStringInputPanel(this, frame, backend = menu.text) input.dock = Dock.FILL input.isMultiLine = true - val lock = CheckBoxLabelInputPanel(this, frame, menu.locked, TranslatableComponent("otm.gui.lock_holo_screen")) - lock.dock = Dock.BOTTOM - lock.dockMargin = DockProperty(2f, 2f, 2f, 2f) - lock.tooltips.add(TranslatableComponent("otm.gui.lock_holo_screen.tip")) - val controls = makeDeviceControls(this, frame, redstoneConfig = menu.redstone) controls.addButton(object : LargeRectangleButtonPanel(this@HoloSignScreen, frame, onPress = { @@ -60,6 +56,18 @@ class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component) prop = menu.textAutoScale, iconActive = Widgets18.TEXT_SCALE_ENABLED, iconInactive = Widgets18.TEXT_SCALE_DISABLED, + tooltipActive = TranslatableComponent("otm.gui.holo_screen.resize_text"), + tooltipInactive = TranslatableComponent("otm.gui.holo_screen.do_not_resize_text"), + )) + + controls.addButton(LargeBooleanRectangleButtonPanel( + this@HoloSignScreen, + frame, + prop = menu.locked, + iconActive = Widgets18.LOCK_LOCKED, + iconInactive = Widgets18.LOCK_UNLOCKED, + tooltipActive = TranslatableComponent("otm.gui.lock_holo_screen"), + tooltipInactive = TranslatableComponent("otm.gui.lock_holo_screen.unlocked") )) return frame diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.png index 9806ad55a39af3b1f167772a5192e540ff6ed437..f3e0a019d5c5d22634ed62738b393e0ce7c52235 100644 GIT binary patch delta 2747 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 C@ZP`x diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets/side_controls.xcf index 928c66053ec01045c3af6587d5a8c8ece6a40f94..e04e31f4a08831f638192a80f07d006bd0a0b0fb 100644 GIT binary patch delta 5131 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 sKK)x(0p1r)(i-BE^js# delta 3889 zcmYk930M?I7RRTGK~WfIxN(L<1ymduQO7GHN<=iY#v2bja6LX(J~W_$vT_-ZcqAUB z>DFaDB8C+e!BQtNtjXr{K2Qt^t}80UJ07^W#*47k@3l$h`+9y;_5WAB>i4>4oaU@9_G zJF&%2u)Wj|n5WCrR#K3G!g3Gfmj5BQ4n!8NMDD0W?zSMm)Xr>gCv5MJLLRgu%V#1F zYxAFyuzmJ(m3cbdh3nXHISlzjI`XGQ$baV`uWK2&xdz*H$B?(rAR7iD|GOLc{5RyU z6OpgJM!t1L{x(KX#3#BP&_U=Uq-!9uCDxF5J;k;!rj+;>VY}^HWFQ70!F#aXt^pYu zgAB*akxp1T(xo-_M~c#_RU@`9phJAIIyY~YGEdJwaW@mn%HtV}&egN-9ujr!%<8(E zscXFO_)*u%oO|4Jp{)i(Z>#B|*PkrmmrV{AY6yT%gB`4fVeGQW!jJoux=>GlP&|8p z;wkYj0-m{0-&nPm__9$2K5BA&Gx*uS215O3g4;hI-2MuG8hnmYGxnOX*DQM5pQ62j zQr?||U@vi~HueD9_xvpM|apIj#KTRp@lyq4Re5?p9R zIIJcj4ptK}k(WhxrNqh#7FnqEOSQ9=^*9dEZL()Fy*-2L?WYN~Wx_z)CKzZd;iOk1 zrQLS0Z~tQU>UJK7^lz!rTQ-@9ueYvSBX;zVQf5~HsYu{{zkUU4vdm$;%@LHehZ$&8g3g6^E+~6 zHh-){htC3icme3cxAKOu--z*>>eOXQbYx$UM~(w|WEwv)-cMaZImgo|on)kA=749+ za`22P6wC18Et9G0^SmcBN1qs0JH<$oWbh?%@Fkt+b*p?xn?7n1gT>({4i7o5t4NSK z!av1GCse_R36EjKL{~mJWjdwFbJY5HCT~_p>U6VjXk>L2KEC32as_sze1@D^%)Mu% zyAy+`kIVw+OLUGG%sa;h^Ug`&j`>Z57_d6_+>H>OJ0_a&&+1?yxn6R2L3hP%Y z(c*3}ws<&uw+C+s7JuJ}!xB(n^ zw*edwd*hCW zj&j4XA1FPt7BYUsi3vT`L*oD~<40~{N5ul<_xo7ox(Gh)pP44Me4fJ6DkXY)2F!dq z4`x0s^Cy)euiMfU#;YWHZZD|kPJ(()?66ma>R70-SJe`|_!QJicTg)sdG?PY>ld>W zmT*;~RWYDeO#rp(BYyg-$a-zI!q)yrqSa!H5s#^A2dLFYxW{#o*TNh%ZVbD4!$@ny ztsopVV#^X)sriO`-4u?re1*w%620~*sMo{-g?jB@JfL1=ee1^x+kRW3wVOe$Ed#ao z3=g>@a(-r|!d6$rc)r4Py!*Z-vML^Hw^;dNc&y#Jf(7XRz`*Eg7{Y=d8fpDin6&;m zO!~72pYc!>;Z7YC;jRIvYp`nUtrg*JPwaS@ihL5v*FBDFO-!)=%z7!&XSgjq!)@W& zdKUL4l(%{nLfFZj3j6N0L>rGnn3#x&MZp2 z2-|%?b57B#&L*+Dh^jR80B4iL3Y$XZmsavtp4yqTl+U<|&17$xBB!+=i7vWkytS~td0i8&w)3YV`p@-a6eQBo#vG!XGDyCBC!6R{oLb_$y~{j!zrq#G+eTEuQX zijfoCiIM7c=+y_JS8s<}$vZqm+~;2@;LJA=BWc09xtd)_izGC*n1`|N8^~)y-98mX zYwJzi@Li91)j)BG*UxIz{Jh-iux-G%VPd-E>|-Lat=W$k6}gQ?EZRqp3-M`(^ZWF1 zuD1}8Sxc27&khm}zsczETZ|6B4RT=z(#hE-m;?|uy;_lvhX`B1VYCHYMq9vr=YV!3 zp0LsyMYePh4vQx`EK%sN40ei%M5xAViagdTig++gq$cREXbW0_wjc+dv46P8276U2 z;&l|Wg=q0Yw0I#RUMJFnu;yEe+&V%yI%qlWpyjxOT^6Sn=q!#PzJ#^74M8OumWc7f zW@EgtT=iOTifcg>*K|*j*BZsrYNN!`I?8D6$kE#IJgZyPEVu7ULRjJhbb6{!{69XV zb0v=H{1C@PQ1x^Ior|K08>QCHa$a|0&a>j*9uld&Lq`t%V+x)6y1W6}#JXQ2z6}uT z1+9HuqxMd3eT(f#4~>BuBZ1;8&!p@5`{4}eK{%mNnXsC Date: Thu, 24 Oct 2024 06:26:30 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B4=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=20=D0=B2=D0=BE=20=D0=B2?= =?UTF-8?q?=D1=81=D1=8E=20=D1=88=D0=B8=D1=80=D0=B8=D0=BD=D1=83=20=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B0=20font.width=20=D0=B2=D1=8B=D0=B4?= =?UTF-8?q?=D0=B0=D1=91=D1=82=20=D1=88=D0=B8=D1=80=D0=B8=D0=BD=D1=83=20?= =?UTF-8?q?=D0=BD=D0=B0=201=20=D0=BF=D0=B8=D0=BA=D1=81=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5,=20=D1=82=D0=B0=D0=BA?= =?UTF-8?q?=20=D1=87=D1=82=D0=BE=20=D1=87=D0=B5=D0=BC=20=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D1=88=D0=B5=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=20?= =?UTF-8?q?=D1=8D=D1=82=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B0=D0=BC=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=B8=D0=BA=D1=81=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/otm/client/render/blockentity/HoloSignRenderer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt index 45ca54dd4..dc86fa0d6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/HoloSignRenderer.kt @@ -38,7 +38,7 @@ class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context) if (tile.textAutoScale) { val totalWidth = lines.maxOf { font.width(it) }.toFloat() val highest = totalWidth.coerceAtLeast(totalHeight) - val mul = if (highest > 64f) 1f / (highest / 64f) else 64f / highest + val mul = if (highest > 96f) 1f / (highest / 96f) else 96f / highest poseStack.scale(mul, mul, mul) }