Skip to content

Commit

Permalink
refactor package structure and rename HorsePower to HorsePowerClient
Browse files Browse the repository at this point in the history
add server side opt-out
  • Loading branch information
Lyzev committed Jan 3, 2025
1 parent 9f0639d commit b9e2176
Show file tree
Hide file tree
Showing 13 changed files with 91 additions and 47 deletions.
10 changes: 5 additions & 5 deletions src/main/java/dev/lyzev/hp/mixin/HorseScreenMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@

package dev.lyzev.hp.mixin;

import dev.lyzev.hp.HorsePower;
import dev.lyzev.hp.modmenu.HorsePowerConfig;
import dev.lyzev.hp.util.HorseStatsRenderer;
import dev.lyzev.hp.client.HorsePowerClient;
import dev.lyzev.hp.client.modmenu.HorsePowerConfig;
import dev.lyzev.hp.client.util.HorseStatsRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ingame.HorseScreen;
import net.minecraft.entity.passive.AbstractHorseEntity;
Expand All @@ -43,8 +43,8 @@ private void onDrawBackground(DrawContext drawContext, float f, int mouseX, int

var imageWidth = 176;
var imageHeight = 166;
var x = HorsePower.INSTANCE.getMc().getWindow().getScaledWidth() / 2 + imageWidth / 2;
var y = (HorsePower.INSTANCE.getMc().getWindow().getScaledHeight() - imageHeight) / 2;
var x = HorsePowerClient.INSTANCE.getMc().getWindow().getScaledWidth() / 2 + imageWidth / 2;
var y = (HorsePowerClient.INSTANCE.getMc().getWindow().getScaledHeight() - imageHeight) / 2;

HorseStatsRenderer.INSTANCE.render(drawContext, entity, x + 10, y + 5, mouseX, mouseY);
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/dev/lyzev/hp/mixin/MinecraftClientMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

package dev.lyzev.hp.mixin;

import dev.lyzev.hp.HorsePower;
import dev.lyzev.hp.client.HorsePowerClient;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.Entity;
import net.minecraft.entity.passive.AbstractHorseEntity;
Expand All @@ -32,7 +32,7 @@ public class MinecraftClientMixin {
@Inject(method = "hasOutline", at = @At("HEAD"), cancellable = true)
private void onHasOutline(Entity entity, CallbackInfoReturnable<Boolean> cir) {
if (entity instanceof AbstractHorseEntity) {
if (System.currentTimeMillis() - HorsePower.INSTANCE.getLast() <= 5000 && HorsePower.INSTANCE.getHorses().contains(entity)) {
if (System.currentTimeMillis() - HorsePowerClient.INSTANCE.getLast() <= 5000 && HorsePowerClient.INSTANCE.getHorses().contains(entity)) {
cir.setReturnValue(true);
cir.cancel();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,25 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package dev.lyzev.hp
package dev.lyzev.hp.client

import com.mojang.brigadier.arguments.IntegerArgumentType
import com.mojang.brigadier.arguments.StringArgumentType
import com.mojang.brigadier.context.CommandContext
import dev.lyzev.hp.modmenu.HorsePowerConfig
import dev.lyzev.hp.modmenu.HorsePowerConfigManager
import dev.lyzev.hp.payload.SearchAllowedPayload
import dev.lyzev.hp.util.HorseStatsRenderer.render
import dev.lyzev.hp.util.round
import dev.lyzev.hp.util.toBPS
import dev.lyzev.hp.util.toJump
import dev.lyzev.hp.client.modmenu.HorsePowerConfig
import dev.lyzev.hp.client.modmenu.HorsePowerConfigManager
import dev.lyzev.hp.main.payload.SearchAllowedPayload
import dev.lyzev.hp.client.util.HorseStatsRenderer.render
import dev.lyzev.hp.client.util.round
import dev.lyzev.hp.client.util.toBPS
import dev.lyzev.hp.client.util.toJump
import net.fabricmc.api.ClientModInitializer
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource
import net.fabricmc.fabric.api.client.networking.v1.C2SPlayChannelEvents
import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry
import net.minecraft.client.MinecraftClient
Expand All @@ -47,7 +48,7 @@ import net.minecraft.text.Text
import net.minecraft.util.Formatting


object HorsePower : ClientModInitializer {
object HorsePowerClient : ClientModInitializer {

const val MOD_ID = "horsepower"

Expand Down Expand Up @@ -117,22 +118,20 @@ object HorsePower : ClientModInitializer {
}
})

C2SPlayChannelEvents.REGISTER.register(C2SPlayChannelEvents.Register { handler, sender, client, channels ->
ClientLoginConnectionEvents.INIT.register(ClientLoginConnectionEvents.Init { handler, client ->
HorsePowerConfig.isSearchCommandAllowed = true
println("Search command is allowed!!!!!!!!")
})

PayloadTypeRegistry.configurationS2C().register(SearchAllowedPayload.ID, SearchAllowedPayload.CODEC)

ClientConfigurationNetworking.registerGlobalReceiver(CustomPayload.Id(HorsePowerConfig.SEARCH_ALLOWED_PACKET_ID)) { payload: SearchAllowedPayload, context ->
ClientConfigurationNetworking.registerGlobalReceiver(SearchAllowedPayload.ID) { payload: SearchAllowedPayload, context ->
context.client().execute {
HorsePowerConfig.isSearchCommandAllowed = payload.allowed
if (!payload.allowed) {
mc.inGameHud.chatHud.addMessage(
Text.translatable("horsepower.search.disabled").formatted(Formatting.RED)
)
}
println("Search command is ${if (payload.allowed) "allowed" else "disabled"}!!!!!!!!!")
}
}
}
Expand Down Expand Up @@ -171,11 +170,11 @@ object HorsePower : ClientModInitializer {
0
} else {
last = System.currentTimeMillis()
this.horses.clear()
this.horses += horses.takeLast(amount)
HorsePowerClient.horses.clear()
HorsePowerClient.horses += horses.takeLast(amount)
context.source.sendFeedback(
Text.translatable(
"horsepower.search.success", this.horses.size, criteria
"horsepower.search.success", HorsePowerClient.horses.size, criteria
).withColor(Formatting.GREEN.colorValue!!)
)
1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package dev.lyzev.hp.modmenu
package dev.lyzev.hp.client.modmenu

import com.terraformersmc.modmenu.config.FileOnlyConfig
import com.terraformersmc.modmenu.config.option.BooleanConfigOption
Expand All @@ -32,7 +32,6 @@ object HorsePowerConfig {
val SHOW_AVERAGE = BooleanConfigOption("show_average", true)
val SHOW_HUD = BooleanConfigOption("show_hud", true)

val SEARCH_ALLOWED_PACKET_ID = Identifier.of("horsepower", "search")
var isSearchCommandAllowed = true

fun asOptions(): Array<SimpleOption<*>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package dev.lyzev.hp.modmenu
package dev.lyzev.hp.client.modmenu

import com.google.gson.JsonArray
import com.google.gson.JsonObject
Expand All @@ -24,7 +24,7 @@ import com.terraformersmc.modmenu.config.option.BooleanConfigOption
import com.terraformersmc.modmenu.config.option.ConfigOptionStorage
import com.terraformersmc.modmenu.config.option.EnumConfigOption
import com.terraformersmc.modmenu.config.option.StringSetConfigOption
import dev.lyzev.hp.HorsePower
import dev.lyzev.hp.client.HorsePowerClient
import net.fabricmc.loader.api.FabricLoader
import java.io.IOException
import java.nio.file.Files
Expand All @@ -35,7 +35,7 @@ import kotlin.reflect.jvm.isAccessible
object HorsePowerConfigManager {

private val path: Path by lazy {
FabricLoader.getInstance().configDir.resolve("${HorsePower.MOD_ID}.json")
FabricLoader.getInstance().configDir.resolve("${HorsePowerClient.MOD_ID}.json")
}

fun initializeConfig() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package dev.lyzev.hp.modmenu
package dev.lyzev.hp.client.modmenu

import net.minecraft.client.MinecraftClient
import net.minecraft.client.gui.screen.Screen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package dev.lyzev.hp.modmenu
package dev.lyzev.hp.client.modmenu

import com.terraformersmc.modmenu.api.ConfigScreenFactory
import com.terraformersmc.modmenu.api.ModMenuApi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package dev.lyzev.hp.util
package dev.lyzev.hp.client.util

import dev.lyzev.hp.HorsePower
import dev.lyzev.hp.modmenu.HorsePowerConfig
import dev.lyzev.hp.client.HorsePowerClient
import dev.lyzev.hp.client.modmenu.HorsePowerConfig
import net.minecraft.client.gui.DrawContext
import net.minecraft.client.render.RenderLayer
import net.minecraft.entity.attribute.EntityAttributes
Expand All @@ -30,7 +30,7 @@ import kotlin.math.roundToInt

object HorseStatsRenderer {

private val BACKGROUND_TEXTURE = Identifier.of(HorsePower.MOD_ID, "textures/gui/container/background.png")
private val BACKGROUND_TEXTURE = Identifier.of(HorsePowerClient.MOD_ID, "textures/gui/container/background.png")
private const val WHITE = 0xFFFFFFFF.toInt()
private val FORMATTINGS = arrayOf(Formatting.DARK_RED, Formatting.RED, Formatting.GOLD, Formatting.YELLOW, Formatting.GREEN, Formatting.DARK_GREEN)

Expand Down Expand Up @@ -65,7 +65,7 @@ object HorseStatsRenderer {
private fun DrawContext.drawAttribute(symbol: String, value: Double, percentage: Double, minValue: Double, maxValue: Double, x: Int, y: Int, offsetY: Int, mouseX: Int, mouseY: Int) {
val text = buildAttributeText(symbol, value, percentage)
val formatting = getFormatting(percentage)
drawTextWithShadow(HorsePower.mc.textRenderer, Text.literal(text).formatted(formatting), x, y + offsetY, WHITE)
drawTextWithShadow(HorsePowerClient.mc.textRenderer, Text.literal(text).formatted(formatting), x, y + offsetY, WHITE)

if (isMouseHovering(mouseX, mouseY, x, y + offsetY, text)) {
drawTooltip(minValue, maxValue, mouseX, mouseY)
Expand Down Expand Up @@ -95,7 +95,7 @@ object HorseStatsRenderer {
}

private fun isMouseHovering(mouseX: Int, mouseY: Int, x: Int, y: Int, text: String): Boolean {
val textWidth = HorsePower.mc.textRenderer.getWidth(text)
val textWidth = HorsePowerClient.mc.textRenderer.getWidth(text)
return mouseX in x..(x + textWidth) && mouseY in y..(y + 9)
}

Expand All @@ -104,12 +104,12 @@ object HorseStatsRenderer {
Text.literal("Min: ${minValue.round(1)}").formatted(Formatting.DARK_RED),
Text.literal("Max: ${maxValue.round(1)}").formatted(Formatting.DARK_GREEN)
)
drawTooltip(HorsePower.mc.textRenderer, hoverText, mouseX, mouseY)
drawTooltip(HorsePowerClient.mc.textRenderer, hoverText, mouseX, mouseY)
}

private fun DrawContext.drawAverage(speedPercentage: Double, jumpPercentage: Double, healthPercentage: Double, x: Int, y: Int) {
val average = (speedPercentage + jumpPercentage + healthPercentage) / 3
val averageFormatting = getFormatting(average)
drawTextWithShadow(HorsePower.mc.textRenderer, Text.literal("Average: ${(average * 100).roundToInt()}%").formatted(averageFormatting), x, y, WHITE)
drawTextWithShadow(HorsePowerClient.mc.textRenderer, Text.literal("Average: ${(average * 100).roundToInt()}%").formatted(averageFormatting), x, y, WHITE)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package dev.lyzev.hp.util
package dev.lyzev.hp.client.util

import net.minecraft.entity.LivingEntity
import kotlin.math.pow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,23 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package dev.lyzev.hp.payload
package dev.lyzev.hp.main.payload

import dev.lyzev.hp.modmenu.HorsePowerConfig
import net.minecraft.network.PacketByteBuf
import net.minecraft.network.RegistryByteBuf
import net.minecraft.network.codec.PacketCodec
import net.minecraft.network.codec.PacketCodecs
import net.minecraft.network.packet.CustomPayload
import net.minecraft.util.Identifier

@JvmRecord
data class SearchAllowedPayload(val allowed: Boolean) : CustomPayload {

override fun getId() = ID

companion object {
val ID = CustomPayload.Id<SearchAllowedPayload>(HorsePowerConfig.SEARCH_ALLOWED_PACKET_ID)
private val PACKET_ID = Identifier.of("horsepower", "search")

val ID = CustomPayload.Id<SearchAllowedPayload>(PACKET_ID)
val CODEC: PacketCodec<PacketByteBuf, SearchAllowedPayload> =
PacketCodec.tuple(
PacketCodecs.BOOLEAN, SearchAllowedPayload::allowed
Expand Down
39 changes: 39 additions & 0 deletions src/main/kotlin/dev/lyzev/hp/server/HorsePowerServer.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright (c) 2025. Lyzev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package dev.lyzev.hp.server

import dev.lyzev.hp.main.payload.SearchAllowedPayload
import net.fabricmc.api.DedicatedServerModInitializer
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry
import net.fabricmc.fabric.api.networking.v1.ServerConfigurationConnectionEvents
import net.fabricmc.fabric.api.networking.v1.ServerConfigurationNetworking

object HorsePowerServer : DedicatedServerModInitializer {

override fun onInitializeServer() {
PayloadTypeRegistry.configurationS2C().register(SearchAllowedPayload.ID, SearchAllowedPayload.CODEC)

val payload = SearchAllowedPayload(false)

ServerConfigurationConnectionEvents.CONFIGURE.register { handler, sender ->
if (ServerConfigurationNetworking.canSend(handler, SearchAllowedPayload.ID)) {
ServerConfigurationNetworking.send(handler, payload)
}
}
}
}
12 changes: 9 additions & 3 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,22 @@
"contact": {},
"license": "AGPL-3.0",
"icon": "assets/horsepower/icon.png",
"environment": "client",
"environment": "*",
"entrypoints": {
"client": [
{
"adapter": "kotlin",
"value": "dev.lyzev.hp.HorsePower"
"value": "dev.lyzev.hp.client.HorsePowerClient"
}
],
"server": [
{
"adapter": "kotlin",
"value": "dev.lyzev.hp.server.HorsePowerServer"
}
],
"modmenu": [
"dev.lyzev.hp.modmenu.HorsePowerModMenu"
"dev.lyzev.hp.client.modmenu.HorsePowerModMenu"
]
},
"mixins": [
Expand Down
2 changes: 1 addition & 1 deletion src/test/kotlin/dev/lyzev/hp/TestMath.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

package dev.lyzev.hp

import dev.lyzev.hp.util.toJump
import dev.lyzev.hp.client.util.toJump

fun main() {
val movementSpeed = 0.3375
Expand Down

0 comments on commit b9e2176

Please sign in to comment.