From 6179fa1428cdcc7c492d53ec68fe77a3826f9324 Mon Sep 17 00:00:00 2001 From: LostLuma Date: Fri, 10 Nov 2023 11:49:18 +0100 Subject: [PATCH] Integrate upstream changes, fix stats involving blocks/items --- .../net/lostluma/server_stats/Constants.java | 6 + .../mixin/client/LocalPlayerEntityMixin.java | 30 +++++ .../mixin/client}/MinecraftMixin.java | 20 ++- .../{server => common}/EntitiesMixin.java | 2 +- .../mixin/common}/PlayerEntityMixin.java | 25 +++- .../mixin/common}/WorldMixin.java | 4 +- .../stats/FishingBobberEntityMixin.java | 22 ---- .../mixin/server/stats/ItemStackMixin.java | 52 -------- .../mixin/server/stats/MinecraftMixin.java | 26 ---- .../mixin/server/stats/PlayerEntityMixin.java | 120 ------------------ .../mixin/server/stats/block/BlockMixin.java | 20 --- .../server/stats/block/LeavesBlockMixin.java | 21 --- .../stats/block/SnowLayerBlockMixin.java | 21 --- .../stats/block/TallPlantBlockMixin.java | 21 --- .../server/stats/block/VineBlockMixin.java | 21 --- .../server_stats/stats/GeneralStat.java | 20 +-- .../net/lostluma/server_stats/stats/Stat.java | 75 ++++++----- .../lostluma/server_stats/stats/Stats.java | 69 +++++----- .../server_stats/utils/Serialization.java | 24 ++++ .../src/main/resources/quilt.mod.json | 5 +- .../main/resources/server_stats.mixins.json | 12 +- .../resources/server_stats.stats.mixins.json | 22 ---- .../mixin/client/LocalPlayerEntityMixin.java | 30 +++++ .../mixin/client}/MinecraftMixin.java | 27 ++-- .../{server => common}/EntitiesMixin.java | 2 +- .../mixin/common}/PlayerEntityMixin.java | 25 +++- .../mixin/common}/WorldMixin.java | 4 +- .../stats/FishingBobberEntityMixin.java | 22 ---- .../mixin/server/stats/ItemStackMixin.java | 52 -------- .../mixin/server/stats/MinecraftMixin.java | 26 ---- .../mixin/server/stats/PlayerEntityMixin.java | 120 ------------------ .../mixin/server/stats/block/BlockMixin.java | 20 --- .../server/stats/block/LeavesBlockMixin.java | 21 --- .../stats/block/SnowLayerBlockMixin.java | 21 --- .../stats/block/TallPlantBlockMixin.java | 21 --- .../server/stats/block/VineBlockMixin.java | 21 --- .../server_stats/stats/GeneralStat.java | 20 +-- .../net/lostluma/server_stats/stats/Stat.java | 75 ++++++----- .../lostluma/server_stats/stats/Stats.java | 69 +++++----- .../src/main/resources/quilt.mod.json | 5 +- .../main/resources/server_stats.mixins.json | 18 +-- .../resources/server_stats.stats.mixins.json | 22 ---- .../mixin/client/LocalPlayerEntityMixin.java | 30 +++++ .../{server => client}/MinecraftMixin.java | 27 ++-- .../{server => common}/EntitiesMixin.java | 2 +- .../mixin/common}/PlayerEntityMixin.java | 25 +++- .../mixin/common}/WorldMixin.java | 4 +- .../stats/FishingBobberEntityMixin.java | 22 ---- .../mixin/server/stats/ItemStackMixin.java | 52 -------- .../mixin/server/stats/MinecraftMixin.java | 26 ---- .../mixin/server/stats/PlayerEntityMixin.java | 120 ------------------ .../mixin/server/stats/block/BlockMixin.java | 20 --- .../server/stats/block/LeavesBlockMixin.java | 21 --- .../stats/block/SnowLayerBlockMixin.java | 21 --- .../stats/block/TallPlantBlockMixin.java | 21 --- .../server/stats/block/VineBlockMixin.java | 21 --- .../server_stats/stats/GeneralStat.java | 20 +-- .../net/lostluma/server_stats/stats/Stat.java | 75 ++++++----- .../lostluma/server_stats/stats/Stats.java | 69 +++++----- .../src/main/resources/quilt.mod.json | 5 +- .../main/resources/server_stats.mixins.json | 14 +- .../resources/server_stats.stats.mixins.json | 22 ---- 62 files changed, 532 insertions(+), 1344 deletions(-) create mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/Constants.java create mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java rename versions/{1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client}/MinecraftMixin.java (59%) rename versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/{server => common}/EntitiesMixin.java (92%) rename versions/{1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common}/PlayerEntityMixin.java (59%) rename versions/{1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common}/WorldMixin.java (93%) delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java delete mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java create mode 100644 versions/1.0.0-client/src/main/java/net/lostluma/server_stats/utils/Serialization.java delete mode 100644 versions/1.0.0-client/src/main/resources/server_stats.stats.mixins.json create mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java rename versions/{1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client}/MinecraftMixin.java (59%) rename versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/{server => common}/EntitiesMixin.java (92%) rename versions/{1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common}/PlayerEntityMixin.java (59%) rename versions/{1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common}/WorldMixin.java (93%) delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java delete mode 100644 versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java delete mode 100644 versions/1.1.0-client/src/main/resources/server_stats.stats.mixins.json create mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java rename versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/{server => client}/MinecraftMixin.java (59%) rename versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/{server => common}/EntitiesMixin.java (92%) rename versions/{1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common}/PlayerEntityMixin.java (59%) rename versions/{1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server => 1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common}/WorldMixin.java (93%) delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java delete mode 100644 versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java delete mode 100644 versions/1.2.5-client/src/main/resources/server_stats.stats.mixins.json diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/Constants.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/Constants.java new file mode 100644 index 0000000..4e642c7 --- /dev/null +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/Constants.java @@ -0,0 +1,6 @@ +package net.lostluma.server_stats; + +public class Constants { + public static final String MOD_ID = "server_stats"; + public static final String STATS_PACKET_CHANNEL = MOD_ID + "|s"; +} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java new file mode 100644 index 0000000..ee62753 --- /dev/null +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java @@ -0,0 +1,30 @@ +package net.lostluma.server_stats.mixin.client; + +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.client.entity.living.player.InputPlayerEntity; +import net.minecraft.client.entity.living.player.LocalPlayerEntity; +import net.minecraft.entity.living.player.PlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin({ InputPlayerEntity.class, LocalPlayerEntity.class }) +public class LocalPlayerEntityMixin { + private PlayerEntity getPlayer() { + return (PlayerEntity) (Object) this; + } + + @Inject(method = "incrementStat(Lnet/minecraft/stat/Stat;I)V", at = @At("HEAD")) + private void incrementStat(net.minecraft.stat.Stat vanillaStat, int amount, CallbackInfo callbackInfo) { + if (vanillaStat == null) { + return; + } + + var stat = Stats.byVanillaId(vanillaStat.id); + + if (stat != null) { + this.getPlayer().server_stats$incrementStat(stat, amount); + } + } +} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java similarity index 59% rename from versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java rename to versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java index 9ff60b2..85e87c4 100644 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java @@ -1,8 +1,7 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.client; import net.lostluma.server_stats.stats.ServerPlayerStats; import net.minecraft.world.WorldSettings; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -15,22 +14,21 @@ @Mixin(Minecraft.class) public class MinecraftMixin { - @Shadow - public InputPlayerEntity player; + @Shadow + public InputPlayerEntity player; - @Inject(method = "main", at = @At("HEAD")) - private static void onMain(CallbackInfo callbackInfo) { + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo callbackInfo) { Stats.init(); } @Inject(method = "startGame", at = @At("HEAD")) - private void loadWorld(String worldDir, String worldName, WorldSettings worldSettings, CallbackInfo callbackInfo) { - ServerPlayerStats.setWorldDirectory(String.format("saves/%s", worldDir)); + private void startGame(String worldDir, String worldName, WorldSettings worldSettings, CallbackInfo callbackInfo) { + ServerPlayerStats.setWorldDirectory(String.format("saves/%s", worldDir)); } - // This method is called when the player switches between worlds @Inject(method = "m_4977780", at = @At("TAIL")) - private void onRespawn(int dimension, CallbackInfo callbackInfo) { - this.player.server_stats$saveStats(); + private void changeDimension(int dimension, CallbackInfo callbackInfo) { + this.player.server_stats$saveStats(); } } diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java similarity index 92% rename from versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java rename to versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java index 45d8cbd..49cff01 100644 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java @@ -1,4 +1,4 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java similarity index 59% rename from versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java rename to versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java index 9825a49..386add1 100644 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java @@ -1,5 +1,8 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.living.LivingEntity; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -9,12 +12,19 @@ import net.lostluma.server_stats.types.StatsPlayer; import net.minecraft.client.Minecraft; import net.minecraft.entity.living.player.PlayerEntity; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PlayerEntity.class) public class PlayerEntityMixin implements StatsPlayer { @Unique private ServerPlayerStats server_stats$serverPlayerStats = null; + private PlayerEntity getPlayer() { + return (PlayerEntity) (Object) this; + } + @Override public void server_stats$incrementStat(Stat stat, int amount) { var stats = this.server_stats$getStats(); @@ -49,4 +59,17 @@ public class PlayerEntityMixin implements StatsPlayer { return this.server_stats$serverPlayerStats; } + + @Inject(method = "onKill", at = @At("HEAD")) + private void onKill(LivingEntity entity, CallbackInfo callbackInfo) { + this.getPlayer().server_stats$incrementStat(Stats.getEntityKillStat(entity), 1); + } + + @Inject(method = "onKilled", at = @At("HEAD")) + private void onKilled(DamageSource source, CallbackInfo callbackInfo) { + if (source.getAttacker() != null) { + var attacker = source.getAttacker(); + this.getPlayer().server_stats$incrementStat(Stats.getKilledByEntityStat(attacker), 1); + } + } } diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java similarity index 93% rename from versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java rename to versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java index 85cb515..f2ab2b9 100644 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java @@ -1,4 +1,4 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; import java.util.List; @@ -15,7 +15,7 @@ public class WorldMixin { @Shadow public List players; - + @Inject(method = "saveData", at = @At("TAIL")) public void onSave(CallbackInfo callbackInfo) { for (PlayerEntity player : this.players) { diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java deleted file mode 100644 index 7a11707..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.FishingBobberEntity; -import net.minecraft.entity.living.player.PlayerEntity; - -@Mixin(FishingBobberEntity.class) -public class FishingBobberEntityMixin { - @Shadow - public PlayerEntity player; - - @Inject(method = "retract", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onRetract(CallbackInfoReturnable callbackInfo) { - this.player.server_stats$incrementStat(Stats.FISH_CAUGHT, 1); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java deleted file mode 100644 index bc96015..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.living.LivingEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -@Mixin(ItemStack.class) -public class ItemStackMixin { - @Shadow - public int size; - - @Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void use(PlayerEntity player, World world, int x, int y, int z, int face, CallbackInfoReturnable callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "damageAndBreak", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void damageAndBreak(int amount, LivingEntity entity, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - var player = (PlayerEntity)(Object)entity; - - player.server_stats$incrementStat(Stats.ITEMS_BROKEN[stack.itemId], 1); - } - - @Inject(method = "attackEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void attackEntity(LivingEntity entity, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "mineBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void mineBlock(int blockId, int x, int y, int z, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "onResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onResult(World world, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_CRAFTED[stack.itemId], this.size); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java deleted file mode 100644 index f7c6ecb..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.living.player.InputPlayerEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(Minecraft.class) -public abstract class MinecraftMixin { - @Shadow - public InputPlayerEntity player; - - @Inject(method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;Lnet/minecraft/entity/living/player/PlayerEntity;)V", at = @At("HEAD")) - private void detectWorldLeaving(World world, String string, PlayerEntity playerEntity, CallbackInfo callbackInfo) { - if (world == null && this.player != null) { - this.player.server_stats$incrementStat(Stats.GAMES_LEFT, 1); - } - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java deleted file mode 100644 index 8da3a68..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.Entity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.living.LivingEntity; -import net.minecraft.entity.living.mob.passive.animal.PigEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.entity.vehicle.MinecartEntity; -import net.minecraft.stat.Stat; - -@Mixin(PlayerEntity.class) -public class PlayerEntityMixin { - @Inject(method = "tick", at = @At("HEAD")) - private void tick(CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.MINUTES_PLAYED, 1); - } - - @Inject(method = "onKilled", at = @At("HEAD")) - private void onKilled(DamageSource source, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - - if (source.getAttacker() != null) { - var attacker = source.getAttacker(); - player.server_stats$incrementStat(Stats.getKilledByEntityStat(attacker), 1); - } - - player.server_stats$incrementStat(Stats.DEATHS, 1); - } - - @Inject(method = "onKillEntity", at = @At("HEAD")) - private void onKillEntity(Entity entity, int score, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - - if (!(entity instanceof PlayerEntity)) { - player.server_stats$incrementStat(Stats.MOBS_KILLED, 1); - } else { - player.server_stats$incrementStat(Stats.PLAYERS_KILLED, 1); - } - } - - @Inject(method = "dropItem", at = @At("HEAD")) - private void dropItem(CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DROPS, 1); // Vanilla 1.7.10 increments this wrong, so we'll keep that - } - - @Inject(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void damage(DamageSource source, int amount, CallbackInfoReturnable callbackInfo) { - var world = ((PlayerEntity) (Object) this).world; - - if (world.difficulty == 0) { - amount = 0; - } - - if (world.difficulty == 1) { - amount = amount / 2 + 1; - } - - if (world.difficulty == 3) { - amount = amount * 3 / 2; - } - - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DAMAGE_TAKEN, amount); - } - - @Inject(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void attack(Entity target, CallbackInfo callbackInfo, int damage) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DAMAGE_DEALT, damage); - } - - @Inject(method = "tickRidingRelatedStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void tickRidingRelatedStats(double x, double y, double z, CallbackInfo callbackInfo, int distance) { - var player = (PlayerEntity) (Object) this; - - if (player.vehicle instanceof PigEntity) { - player.server_stats$incrementStat(Stats.CM_PIG, distance); - } else if (player.vehicle instanceof BoatEntity) { - player.server_stats$incrementStat(Stats.CM_SAILED, distance); - } else if (player.vehicle instanceof MinecartEntity) { - player.server_stats$incrementStat(Stats.CM_MINECART, distance); - } - } - - @Redirect(method = "tickNonRidingMovementRelatedStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void tickNonRidingMovementRelatedStats(PlayerEntity player, Stat stat, int amount) { - var translation = Map.of(net.minecraft.stat.Stats.CM_DIVEN, Stats.CM_DIVEN, net.minecraft.stat.Stats.CM_SWUM, - Stats.CM_SWUM, net.minecraft.stat.Stats.CM_CLIMB, Stats.CM_CLIMB, net.minecraft.stat.Stats.CM_WALKED, - Stats.CM_WALKED, net.minecraft.stat.Stats.CM_FLOWN, Stats.CM_FLOWN); - - player.incrementStat(stat, amount); // Increase vanilla stat too - player.server_stats$incrementStat(translation.get(stat), amount); - } - - @Inject(method = "applyFallDamage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void applyFallDamage(float distance, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.CM_FALLEN, (int) Math.round((double) distance * 100.0)); - } - - @Inject(method = "onKill", at = @At("HEAD")) - private void onKill(LivingEntity entity, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.getEntityKillStat(entity), 1); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java deleted file mode 100644 index 1bd8c8a..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(Block.class) -public class BlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java deleted file mode 100644 index be3a9e3..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.LeavesBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(LeavesBlock.class) -public class LeavesBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java deleted file mode 100644 index 94ae4c2..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.SnowLayerBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(SnowLayerBlock.class) -public class SnowLayerBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java deleted file mode 100644 index 1619335..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.TallPlantBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(TallPlantBlock.class) -public class TallPlantBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java deleted file mode 100644 index f9c8ade..0000000 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.VineBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(VineBlock.class) -public class VineBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java index a34d816..fed236a 100644 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java @@ -1,14 +1,16 @@ package net.lostluma.server_stats.stats; +import org.jetbrains.annotations.Nullable; + public class GeneralStat extends Stat { - public GeneralStat(String key, String name) { - super(key, name); - } + public GeneralStat(String key, @Nullable Integer vanillaId) { + super(key, vanillaId); + } - @Override - public Stat register() { - super.register(); - Stats.GENERAL.add(this); - return this; - } + @Override + public Stat register() { + super.register(); + Stats.GENERAL.add(this); + return this; + } } diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java index ec26627..aa387a4 100644 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java @@ -1,40 +1,47 @@ package net.lostluma.server_stats.stats; +import org.jetbrains.annotations.Nullable; + /* - * V very cut-down version of the vanilla 1.7.10 Stat class. + * A very cut-down version of the vanilla 1.7.10 Stat class. */ public class Stat { - public final String key; - private final String name; - public boolean local; - - public Stat(String key, String name) { - this.key = key; - this.name = name; - } - - public Stat register() { - if (Stats.BY_KEY.containsKey(this.key)) { - throw new RuntimeException("Duplicate stat id: \"" + ((Stat)Stats.BY_KEY.get(this.key)).name + "\" and \"" + this.name + "\" at id " + this.key); - } else { - Stats.ALL.add(this); - Stats.BY_KEY.put(this.key, this); - return this; - } - } - - public boolean equals(Object object) { - if (this == object) { - return true; - } else if (object != null && this.getClass() == object.getClass()) { - Stat var2 = (Stat)object; - return this.key.equals(var2.key); - } else { - return false; - } - } - - public int hashCode() { - return this.key.hashCode(); - } + public final String key; + + public final @Nullable Integer vanillaId; + + public Stat(String key, @Nullable Integer vanillaId) { + this.key = key; + this.vanillaId = vanillaId; + } + + public Stat register() { + if (Stats.BY_KEY.containsKey(this.key)) { + throw new RuntimeException("Duplicate stat id: \"" + ((Stat)Stats.BY_KEY.get(this.key)).key + "\" and \"" + this.key + "."); + } else { + Stats.ALL.add(this); + Stats.BY_KEY.put(this.key, this); + + if (this.vanillaId != null) { + Stats.BY_VANILLA_ID.put(this.vanillaId, this); + } + + return this; + } + } + + public boolean equals(Object object) { + if (this == object) { + return true; + } else if (object != null && this.getClass() == object.getClass()) { + Stat var2 = (Stat)object; + return this.key.equals(var2.key); + } else { + return false; + } + } + + public int hashCode() { + return this.key.hashCode(); + } } diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java index 974a071..f52eaa5 100644 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java @@ -22,39 +22,44 @@ @SuppressWarnings({ "squid:S3008", "squid:S2386" }) public class Stats { protected static Map BY_KEY = new HashMap<>(); + protected static Map BY_VANILLA_ID = new HashMap<>(); + public static List ALL = new ArrayList<>(); public static List GENERAL = new ArrayList<>(); public static List USED = new ArrayList<>(); public static List MINED = new ArrayList<>(); - public static Stat GAMES_LEFT = new GeneralStat("stat.leaveGame", "stat.leaveGame").register(); - public static Stat MINUTES_PLAYED = new GeneralStat("stat.playOneMinute", "stat.playOneMinute").register(); - public static Stat CM_WALKED = new GeneralStat("stat.walkOneCm", "stat.walkOneCm").register(); - public static Stat CM_SWUM = new GeneralStat("stat.swimOneCm", "stat.swimOneCm").register(); - public static Stat CM_FALLEN = new GeneralStat("stat.fallOneCm", "stat.fallOneCm").register(); - public static Stat CM_CLIMB = new GeneralStat("stat.climbOneCm", "stat.climbOneCm").register(); - public static Stat CM_FLOWN = new GeneralStat("stat.flyOneCm", "stat.flyOneCm").register(); - public static Stat CM_DIVEN = new GeneralStat("stat.diveOneCm", "stat.diveOneCm").register(); - public static Stat CM_MINECART = new GeneralStat("stat.minecartOneCm", "stat.minecartOneCm").register(); - public static Stat CM_SAILED = new GeneralStat("stat.boatOneCm", "stat.boatOneCm").register(); - public static Stat CM_PIG = new GeneralStat("stat.pigOneCm", "stat.pigOneCm").register(); - public static Stat CM_HORSE = new GeneralStat("stat.horseOneCm", "stat.horseOneCm").register(); - // public static Stat JUMPS = new GeneralStat("stat.jump", "stat.jump").register(); - public static Stat DROPS = new GeneralStat("stat.drop", "stat.drop").register(); - public static Stat DAMAGE_DEALT = new GeneralStat("stat.damageDealt", "stat.damageDealt").register(); - public static Stat DAMAGE_TAKEN = new GeneralStat("stat.damageTaken", "stat.damageTaken").register(); - public static Stat DEATHS = new GeneralStat("stat.deaths", "stat.deaths").register(); - public static Stat MOBS_KILLED = new GeneralStat("stat.mobKills", "stat.mobKills").register(); - // public static Stat ANIMALS_BRED = new GeneralStat("stat.animalsBred", "stat.animalsBred").register(); - public static Stat PLAYERS_KILLED = new GeneralStat("stat.playerKills", "stat.playerKills").register(); - public static Stat FISH_CAUGHT = new GeneralStat("stat.fishCaught", "stat.fishCaught").register(); - // public static Stat JUNK_FISHED = new GeneralStat("stat.junkFished", "stat.junkFished").register(); - // public static Stat TREASURE_FISHED = new GeneralStat("stat.treasureFished", "stat.treasureFished").register(); + + public static Stat GAMES_LEFT = new GeneralStat("stat.leaveGame", 1004).register(); + public static Stat MINUTES_PLAYED = new GeneralStat("stat.playOneMinute", 1100).register(); + public static Stat CM_WALKED = new GeneralStat("stat.walkOneCm", 2000).register(); + public static Stat CM_SWUM = new GeneralStat("stat.swimOneCm", 2001).register(); + public static Stat CM_FALLEN = new GeneralStat("stat.fallOneCm", 2002).register(); + public static Stat CM_CLIMB = new GeneralStat("stat.climbOneCm", 2003).register(); + public static Stat CM_FLOWN = new GeneralStat("stat.flyOneCm", 2004).register(); + public static Stat CM_DIVEN = new GeneralStat("stat.diveOneCm", 2005).register(); + public static Stat CM_MINECART = new GeneralStat("stat.minecartOneCm", 2006).register(); + public static Stat CM_SAILED = new GeneralStat("stat.boatOneCm", 2007).register(); + public static Stat CM_PIG = new GeneralStat("stat.pigOneCm", 2008).register(); + public static Stat JUMPS = new GeneralStat("stat.jump", 2010).register(); + public static Stat DROPS = new GeneralStat("stat.drop", 2011).register(); + public static Stat DAMAGE_DEALT = new GeneralStat("stat.damageDealt", 2020).register(); + public static Stat DAMAGE_TAKEN = new GeneralStat("stat.damageTaken", 2021).register(); + public static Stat DEATHS = new GeneralStat("stat.deaths", 2022).register(); + public static Stat MOBS_KILLED = new GeneralStat("stat.mobKills", 2023).register(); + public static Stat PLAYERS_KILLED = new GeneralStat("stat.playerKills", 2024).register(); + public static Stat FISH_CAUGHT = new GeneralStat("stat.fishCaught", 2025).register(); public static final Stat[] BLOCKS_MINED = new Stat[4096]; public static final Stat[] ITEMS_CRAFTED = new Stat[32000]; public static final Stat[] ITEMS_USED = new Stat[32000]; public static final Stat[] ITEMS_BROKEN = new Stat[32000]; + // For some reason vanilla stat IDs start at these numbers + private static final Integer MINE_BLOCK_PREFIX = 16777216; + private static final Integer USE_ITEM_PREFIX = 16908288; + private static final Integer BREAK_ITEM_PREFIX = 16973824; + private static final Integer CRAFT_ITEM_PREFIX = 16842752; + public static void init() { initBlocksMinedStats(); initItemsUsedStats(); @@ -80,8 +85,7 @@ private static void initItemsCraftedStats() { for (Item item : items) { if (item != null) { int id = item.id; - ITEMS_CRAFTED[id] = new Stat("stat.craftItem." + id, "stat.craftItem" + item.getDisplayName()) - .register(); + ITEMS_CRAFTED[id] = new Stat("stat.craftItem." + id, CRAFT_ITEM_PREFIX + id).register(); } } @@ -97,7 +101,7 @@ private static void initBlocksMinedStats() { int id = block.id; if (id != 0 && block.hasStats()) { - BLOCKS_MINED[id] = new Stat("stat.mineBlock." + id, "stat.mineBlock" + block.getName()).register(); + BLOCKS_MINED[id] = new Stat("stat.mineBlock." + id, MINE_BLOCK_PREFIX + id).register(); MINED.add(BLOCKS_MINED[id]); } } @@ -112,7 +116,7 @@ private static void initItemsUsedStats() { } int id = item.id; - ITEMS_USED[id] = new Stat("stat.useItem." + id, "stat.useItem" + item.getDisplayName()).register(); + ITEMS_USED[id] = new Stat("stat.useItem." + id, USE_ITEM_PREFIX + id).register(); if (!(item instanceof BlockItem)) { USED.add(ITEMS_USED[id]); } @@ -130,8 +134,7 @@ private static void initItemsBrokenStats() { int id = item.id; if (item.isDamageable()) { - ITEMS_BROKEN[id] = new Stat("stat.breakItem." + id, "stat.breakItem" + item.getDisplayName()) - .register(); + ITEMS_BROKEN[id] = new Stat("stat.breakItem." + id, BREAK_ITEM_PREFIX + id).register(); } } @@ -169,17 +172,21 @@ private static void mergeBlockStats(Stat[] stats, Block block1, Block block2) { } public static Stat createEntityKillStat(String key) { - return new Stat("stat.killEntity." + key, "stat.entityKill" + key).register(); + return new Stat("stat.killEntity." + key, null).register(); } public static Stat createKilledByEntityStat(String key) { - return new Stat("stat.entityKilledBy." + key, "stat.entityKilledBy" + key).register(); + return new Stat("stat.entityKilledBy." + key, null).register(); } public static Stat byKey(String key) { return BY_KEY.get(key); } + public static Stat byVanillaId(Integer id) { + return BY_VANILLA_ID.get(id); + } + public static Stat getEntityKillStat(Entity entity) { return byKey("stat.killEntity." + Entities.getKey(entity)); } diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/utils/Serialization.java b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/utils/Serialization.java new file mode 100644 index 0000000..d55c0ab --- /dev/null +++ b/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/utils/Serialization.java @@ -0,0 +1,24 @@ +package net.lostluma.server_stats.utils; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import net.lostluma.server_stats.Constants; +import org.quiltmc.loader.api.QuiltLoader; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Map; + +public class Serialization { + private static final String BASE_PATH = "assets/" + Constants.MOD_ID + "/data"; + + public static Map getFromAssets(String name) throws IOException { + var container = QuiltLoader.getModContainer(Constants.MOD_ID).orElseThrow(); + var path = container.getPath(BASE_PATH + "/" + name + ".json"); + + Type type = new TypeToken>(){}.getType(); + return new Gson().fromJson(Files.readString(path, StandardCharsets.UTF_8), type); + } +} \ No newline at end of file diff --git a/versions/1.0.0-client/src/main/resources/quilt.mod.json b/versions/1.0.0-client/src/main/resources/quilt.mod.json index 23381b1..8aac67b 100644 --- a/versions/1.0.0-client/src/main/resources/quilt.mod.json +++ b/versions/1.0.0-client/src/main/resources/quilt.mod.json @@ -33,10 +33,7 @@ "minecraft": { "environment": "client" }, - "mixin": [ - "server_stats.mixins.json", - "server_stats.stats.mixins.json" - ], + "mixin": "server_stats.mixins.json", "access_widener" : "server_stats.accesswidener", "quilt_loom": { "injected_interfaces": { diff --git a/versions/1.0.0-client/src/main/resources/server_stats.mixins.json b/versions/1.0.0-client/src/main/resources/server_stats.mixins.json index 5342438..b04f1f5 100644 --- a/versions/1.0.0-client/src/main/resources/server_stats.mixins.json +++ b/versions/1.0.0-client/src/main/resources/server_stats.mixins.json @@ -3,12 +3,14 @@ "minVersion": "0.8", "package": "net.lostluma.server_stats.mixin", "compatibilityLevel": "JAVA_17", - "mixins": [], + "mixins": [ + "common.EntitiesMixin", + "common.PlayerEntityMixin", + "common.WorldMixin" + ], "client": [ - "server.EntitiesMixin", - "server.MinecraftMixin", - "server.PlayerEntityMixin", - "server.WorldMixin" + "client.LocalPlayerEntityMixin", + "client.MinecraftMixin" ], "server": [], "injectors": { diff --git a/versions/1.0.0-client/src/main/resources/server_stats.stats.mixins.json b/versions/1.0.0-client/src/main/resources/server_stats.stats.mixins.json deleted file mode 100644 index 0fdf2c5..0000000 --- a/versions/1.0.0-client/src/main/resources/server_stats.stats.mixins.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "net.lostluma.server_stats.mixin.server.stats", - "compatibilityLevel": "JAVA_17", - "mixins": [], - "client": [ - "block.BlockMixin", - "block.LeavesBlockMixin", - "block.SnowLayerBlockMixin", - "block.TallPlantBlockMixin", - "block.VineBlockMixin", - "FishingBobberEntityMixin", - "ItemStackMixin", - "MinecraftMixin", - "PlayerEntityMixin" - ], - "server": [], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java new file mode 100644 index 0000000..ee62753 --- /dev/null +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java @@ -0,0 +1,30 @@ +package net.lostluma.server_stats.mixin.client; + +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.client.entity.living.player.InputPlayerEntity; +import net.minecraft.client.entity.living.player.LocalPlayerEntity; +import net.minecraft.entity.living.player.PlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin({ InputPlayerEntity.class, LocalPlayerEntity.class }) +public class LocalPlayerEntityMixin { + private PlayerEntity getPlayer() { + return (PlayerEntity) (Object) this; + } + + @Inject(method = "incrementStat(Lnet/minecraft/stat/Stat;I)V", at = @At("HEAD")) + private void incrementStat(net.minecraft.stat.Stat vanillaStat, int amount, CallbackInfo callbackInfo) { + if (vanillaStat == null) { + return; + } + + var stat = Stats.byVanillaId(vanillaStat.id); + + if (stat != null) { + this.getPlayer().server_stats$incrementStat(stat, amount); + } + } +} diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java similarity index 59% rename from versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java rename to versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java index 9ff60b2..9d9fad4 100644 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java @@ -1,36 +1,33 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.client; import net.lostluma.server_stats.stats.ServerPlayerStats; +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.living.player.InputPlayerEntity; import net.minecraft.world.WorldSettings; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.living.player.InputPlayerEntity; - @Mixin(Minecraft.class) public class MinecraftMixin { - @Shadow - public InputPlayerEntity player; + @Shadow + public InputPlayerEntity player; - @Inject(method = "main", at = @At("HEAD")) - private static void onMain(CallbackInfo callbackInfo) { + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo callbackInfo) { Stats.init(); } @Inject(method = "startGame", at = @At("HEAD")) - private void loadWorld(String worldDir, String worldName, WorldSettings worldSettings, CallbackInfo callbackInfo) { - ServerPlayerStats.setWorldDirectory(String.format("saves/%s", worldDir)); + private void startGame(String worldDir, String worldName, WorldSettings worldSettings, CallbackInfo callbackInfo) { + ServerPlayerStats.setWorldDirectory(String.format("saves/%s", worldDir)); } - // This method is called when the player switches between worlds @Inject(method = "m_4977780", at = @At("TAIL")) - private void onRespawn(int dimension, CallbackInfo callbackInfo) { - this.player.server_stats$saveStats(); + private void changeDimension(int dimension, CallbackInfo callbackInfo) { + this.player.server_stats$saveStats(); } } diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java similarity index 92% rename from versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java rename to versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java index 45d8cbd..49cff01 100644 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java @@ -1,4 +1,4 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java similarity index 59% rename from versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java rename to versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java index 9825a49..5181565 100644 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java @@ -1,5 +1,8 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.living.LivingEntity; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -9,12 +12,19 @@ import net.lostluma.server_stats.types.StatsPlayer; import net.minecraft.client.Minecraft; import net.minecraft.entity.living.player.PlayerEntity; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PlayerEntity.class) public class PlayerEntityMixin implements StatsPlayer { @Unique private ServerPlayerStats server_stats$serverPlayerStats = null; + private PlayerEntity getPlayer() { + return (PlayerEntity) (Object) this; + } + @Override public void server_stats$incrementStat(Stat stat, int amount) { var stats = this.server_stats$getStats(); @@ -49,4 +59,17 @@ public class PlayerEntityMixin implements StatsPlayer { return this.server_stats$serverPlayerStats; } + + @Inject(method = "onKilled", at = @At("HEAD")) + private void onKilled(DamageSource source, CallbackInfo callbackInfo) { + if (source.getAttacker() != null) { + var attacker = source.getAttacker(); + this.getPlayer().server_stats$incrementStat(Stats.getKilledByEntityStat(attacker), 1); + } + } + + @Inject(method = "onKill", at = @At("HEAD")) + private void onKill(LivingEntity entity, CallbackInfo callbackInfo) { + this.getPlayer().server_stats$incrementStat(Stats.getEntityKillStat(entity), 1); + } } diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java similarity index 93% rename from versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java rename to versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java index 85cb515..f2ab2b9 100644 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java @@ -1,4 +1,4 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; import java.util.List; @@ -15,7 +15,7 @@ public class WorldMixin { @Shadow public List players; - + @Inject(method = "saveData", at = @At("TAIL")) public void onSave(CallbackInfo callbackInfo) { for (PlayerEntity player : this.players) { diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java deleted file mode 100644 index 7a11707..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.FishingBobberEntity; -import net.minecraft.entity.living.player.PlayerEntity; - -@Mixin(FishingBobberEntity.class) -public class FishingBobberEntityMixin { - @Shadow - public PlayerEntity player; - - @Inject(method = "retract", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onRetract(CallbackInfoReturnable callbackInfo) { - this.player.server_stats$incrementStat(Stats.FISH_CAUGHT, 1); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java deleted file mode 100644 index bc96015..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.living.LivingEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -@Mixin(ItemStack.class) -public class ItemStackMixin { - @Shadow - public int size; - - @Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void use(PlayerEntity player, World world, int x, int y, int z, int face, CallbackInfoReturnable callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "damageAndBreak", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void damageAndBreak(int amount, LivingEntity entity, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - var player = (PlayerEntity)(Object)entity; - - player.server_stats$incrementStat(Stats.ITEMS_BROKEN[stack.itemId], 1); - } - - @Inject(method = "attackEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void attackEntity(LivingEntity entity, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "mineBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void mineBlock(int blockId, int x, int y, int z, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "onResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onResult(World world, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_CRAFTED[stack.itemId], this.size); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java deleted file mode 100644 index f7c6ecb..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.living.player.InputPlayerEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(Minecraft.class) -public abstract class MinecraftMixin { - @Shadow - public InputPlayerEntity player; - - @Inject(method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;Lnet/minecraft/entity/living/player/PlayerEntity;)V", at = @At("HEAD")) - private void detectWorldLeaving(World world, String string, PlayerEntity playerEntity, CallbackInfo callbackInfo) { - if (world == null && this.player != null) { - this.player.server_stats$incrementStat(Stats.GAMES_LEFT, 1); - } - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java deleted file mode 100644 index 8da3a68..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.Entity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.living.LivingEntity; -import net.minecraft.entity.living.mob.passive.animal.PigEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.entity.vehicle.MinecartEntity; -import net.minecraft.stat.Stat; - -@Mixin(PlayerEntity.class) -public class PlayerEntityMixin { - @Inject(method = "tick", at = @At("HEAD")) - private void tick(CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.MINUTES_PLAYED, 1); - } - - @Inject(method = "onKilled", at = @At("HEAD")) - private void onKilled(DamageSource source, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - - if (source.getAttacker() != null) { - var attacker = source.getAttacker(); - player.server_stats$incrementStat(Stats.getKilledByEntityStat(attacker), 1); - } - - player.server_stats$incrementStat(Stats.DEATHS, 1); - } - - @Inject(method = "onKillEntity", at = @At("HEAD")) - private void onKillEntity(Entity entity, int score, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - - if (!(entity instanceof PlayerEntity)) { - player.server_stats$incrementStat(Stats.MOBS_KILLED, 1); - } else { - player.server_stats$incrementStat(Stats.PLAYERS_KILLED, 1); - } - } - - @Inject(method = "dropItem", at = @At("HEAD")) - private void dropItem(CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DROPS, 1); // Vanilla 1.7.10 increments this wrong, so we'll keep that - } - - @Inject(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void damage(DamageSource source, int amount, CallbackInfoReturnable callbackInfo) { - var world = ((PlayerEntity) (Object) this).world; - - if (world.difficulty == 0) { - amount = 0; - } - - if (world.difficulty == 1) { - amount = amount / 2 + 1; - } - - if (world.difficulty == 3) { - amount = amount * 3 / 2; - } - - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DAMAGE_TAKEN, amount); - } - - @Inject(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void attack(Entity target, CallbackInfo callbackInfo, int damage) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DAMAGE_DEALT, damage); - } - - @Inject(method = "tickRidingRelatedStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void tickRidingRelatedStats(double x, double y, double z, CallbackInfo callbackInfo, int distance) { - var player = (PlayerEntity) (Object) this; - - if (player.vehicle instanceof PigEntity) { - player.server_stats$incrementStat(Stats.CM_PIG, distance); - } else if (player.vehicle instanceof BoatEntity) { - player.server_stats$incrementStat(Stats.CM_SAILED, distance); - } else if (player.vehicle instanceof MinecartEntity) { - player.server_stats$incrementStat(Stats.CM_MINECART, distance); - } - } - - @Redirect(method = "tickNonRidingMovementRelatedStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void tickNonRidingMovementRelatedStats(PlayerEntity player, Stat stat, int amount) { - var translation = Map.of(net.minecraft.stat.Stats.CM_DIVEN, Stats.CM_DIVEN, net.minecraft.stat.Stats.CM_SWUM, - Stats.CM_SWUM, net.minecraft.stat.Stats.CM_CLIMB, Stats.CM_CLIMB, net.minecraft.stat.Stats.CM_WALKED, - Stats.CM_WALKED, net.minecraft.stat.Stats.CM_FLOWN, Stats.CM_FLOWN); - - player.incrementStat(stat, amount); // Increase vanilla stat too - player.server_stats$incrementStat(translation.get(stat), amount); - } - - @Inject(method = "applyFallDamage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void applyFallDamage(float distance, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.CM_FALLEN, (int) Math.round((double) distance * 100.0)); - } - - @Inject(method = "onKill", at = @At("HEAD")) - private void onKill(LivingEntity entity, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.getEntityKillStat(entity), 1); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java deleted file mode 100644 index 1bd8c8a..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(Block.class) -public class BlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java deleted file mode 100644 index be3a9e3..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.LeavesBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(LeavesBlock.class) -public class LeavesBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java deleted file mode 100644 index 94ae4c2..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.SnowLayerBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(SnowLayerBlock.class) -public class SnowLayerBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java deleted file mode 100644 index 1619335..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.TallPlantBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(TallPlantBlock.class) -public class TallPlantBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java deleted file mode 100644 index f9c8ade..0000000 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.VineBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(VineBlock.class) -public class VineBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java index a34d816..fed236a 100644 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java @@ -1,14 +1,16 @@ package net.lostluma.server_stats.stats; +import org.jetbrains.annotations.Nullable; + public class GeneralStat extends Stat { - public GeneralStat(String key, String name) { - super(key, name); - } + public GeneralStat(String key, @Nullable Integer vanillaId) { + super(key, vanillaId); + } - @Override - public Stat register() { - super.register(); - Stats.GENERAL.add(this); - return this; - } + @Override + public Stat register() { + super.register(); + Stats.GENERAL.add(this); + return this; + } } diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java index ec26627..aa387a4 100644 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stat.java @@ -1,40 +1,47 @@ package net.lostluma.server_stats.stats; +import org.jetbrains.annotations.Nullable; + /* - * V very cut-down version of the vanilla 1.7.10 Stat class. + * A very cut-down version of the vanilla 1.7.10 Stat class. */ public class Stat { - public final String key; - private final String name; - public boolean local; - - public Stat(String key, String name) { - this.key = key; - this.name = name; - } - - public Stat register() { - if (Stats.BY_KEY.containsKey(this.key)) { - throw new RuntimeException("Duplicate stat id: \"" + ((Stat)Stats.BY_KEY.get(this.key)).name + "\" and \"" + this.name + "\" at id " + this.key); - } else { - Stats.ALL.add(this); - Stats.BY_KEY.put(this.key, this); - return this; - } - } - - public boolean equals(Object object) { - if (this == object) { - return true; - } else if (object != null && this.getClass() == object.getClass()) { - Stat var2 = (Stat)object; - return this.key.equals(var2.key); - } else { - return false; - } - } - - public int hashCode() { - return this.key.hashCode(); - } + public final String key; + + public final @Nullable Integer vanillaId; + + public Stat(String key, @Nullable Integer vanillaId) { + this.key = key; + this.vanillaId = vanillaId; + } + + public Stat register() { + if (Stats.BY_KEY.containsKey(this.key)) { + throw new RuntimeException("Duplicate stat id: \"" + ((Stat)Stats.BY_KEY.get(this.key)).key + "\" and \"" + this.key + "."); + } else { + Stats.ALL.add(this); + Stats.BY_KEY.put(this.key, this); + + if (this.vanillaId != null) { + Stats.BY_VANILLA_ID.put(this.vanillaId, this); + } + + return this; + } + } + + public boolean equals(Object object) { + if (this == object) { + return true; + } else if (object != null && this.getClass() == object.getClass()) { + Stat var2 = (Stat)object; + return this.key.equals(var2.key); + } else { + return false; + } + } + + public int hashCode() { + return this.key.hashCode(); + } } diff --git a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java index 974a071..f52eaa5 100644 --- a/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java +++ b/versions/1.1.0-client/src/main/java/net/lostluma/server_stats/stats/Stats.java @@ -22,39 +22,44 @@ @SuppressWarnings({ "squid:S3008", "squid:S2386" }) public class Stats { protected static Map BY_KEY = new HashMap<>(); + protected static Map BY_VANILLA_ID = new HashMap<>(); + public static List ALL = new ArrayList<>(); public static List GENERAL = new ArrayList<>(); public static List USED = new ArrayList<>(); public static List MINED = new ArrayList<>(); - public static Stat GAMES_LEFT = new GeneralStat("stat.leaveGame", "stat.leaveGame").register(); - public static Stat MINUTES_PLAYED = new GeneralStat("stat.playOneMinute", "stat.playOneMinute").register(); - public static Stat CM_WALKED = new GeneralStat("stat.walkOneCm", "stat.walkOneCm").register(); - public static Stat CM_SWUM = new GeneralStat("stat.swimOneCm", "stat.swimOneCm").register(); - public static Stat CM_FALLEN = new GeneralStat("stat.fallOneCm", "stat.fallOneCm").register(); - public static Stat CM_CLIMB = new GeneralStat("stat.climbOneCm", "stat.climbOneCm").register(); - public static Stat CM_FLOWN = new GeneralStat("stat.flyOneCm", "stat.flyOneCm").register(); - public static Stat CM_DIVEN = new GeneralStat("stat.diveOneCm", "stat.diveOneCm").register(); - public static Stat CM_MINECART = new GeneralStat("stat.minecartOneCm", "stat.minecartOneCm").register(); - public static Stat CM_SAILED = new GeneralStat("stat.boatOneCm", "stat.boatOneCm").register(); - public static Stat CM_PIG = new GeneralStat("stat.pigOneCm", "stat.pigOneCm").register(); - public static Stat CM_HORSE = new GeneralStat("stat.horseOneCm", "stat.horseOneCm").register(); - // public static Stat JUMPS = new GeneralStat("stat.jump", "stat.jump").register(); - public static Stat DROPS = new GeneralStat("stat.drop", "stat.drop").register(); - public static Stat DAMAGE_DEALT = new GeneralStat("stat.damageDealt", "stat.damageDealt").register(); - public static Stat DAMAGE_TAKEN = new GeneralStat("stat.damageTaken", "stat.damageTaken").register(); - public static Stat DEATHS = new GeneralStat("stat.deaths", "stat.deaths").register(); - public static Stat MOBS_KILLED = new GeneralStat("stat.mobKills", "stat.mobKills").register(); - // public static Stat ANIMALS_BRED = new GeneralStat("stat.animalsBred", "stat.animalsBred").register(); - public static Stat PLAYERS_KILLED = new GeneralStat("stat.playerKills", "stat.playerKills").register(); - public static Stat FISH_CAUGHT = new GeneralStat("stat.fishCaught", "stat.fishCaught").register(); - // public static Stat JUNK_FISHED = new GeneralStat("stat.junkFished", "stat.junkFished").register(); - // public static Stat TREASURE_FISHED = new GeneralStat("stat.treasureFished", "stat.treasureFished").register(); + + public static Stat GAMES_LEFT = new GeneralStat("stat.leaveGame", 1004).register(); + public static Stat MINUTES_PLAYED = new GeneralStat("stat.playOneMinute", 1100).register(); + public static Stat CM_WALKED = new GeneralStat("stat.walkOneCm", 2000).register(); + public static Stat CM_SWUM = new GeneralStat("stat.swimOneCm", 2001).register(); + public static Stat CM_FALLEN = new GeneralStat("stat.fallOneCm", 2002).register(); + public static Stat CM_CLIMB = new GeneralStat("stat.climbOneCm", 2003).register(); + public static Stat CM_FLOWN = new GeneralStat("stat.flyOneCm", 2004).register(); + public static Stat CM_DIVEN = new GeneralStat("stat.diveOneCm", 2005).register(); + public static Stat CM_MINECART = new GeneralStat("stat.minecartOneCm", 2006).register(); + public static Stat CM_SAILED = new GeneralStat("stat.boatOneCm", 2007).register(); + public static Stat CM_PIG = new GeneralStat("stat.pigOneCm", 2008).register(); + public static Stat JUMPS = new GeneralStat("stat.jump", 2010).register(); + public static Stat DROPS = new GeneralStat("stat.drop", 2011).register(); + public static Stat DAMAGE_DEALT = new GeneralStat("stat.damageDealt", 2020).register(); + public static Stat DAMAGE_TAKEN = new GeneralStat("stat.damageTaken", 2021).register(); + public static Stat DEATHS = new GeneralStat("stat.deaths", 2022).register(); + public static Stat MOBS_KILLED = new GeneralStat("stat.mobKills", 2023).register(); + public static Stat PLAYERS_KILLED = new GeneralStat("stat.playerKills", 2024).register(); + public static Stat FISH_CAUGHT = new GeneralStat("stat.fishCaught", 2025).register(); public static final Stat[] BLOCKS_MINED = new Stat[4096]; public static final Stat[] ITEMS_CRAFTED = new Stat[32000]; public static final Stat[] ITEMS_USED = new Stat[32000]; public static final Stat[] ITEMS_BROKEN = new Stat[32000]; + // For some reason vanilla stat IDs start at these numbers + private static final Integer MINE_BLOCK_PREFIX = 16777216; + private static final Integer USE_ITEM_PREFIX = 16908288; + private static final Integer BREAK_ITEM_PREFIX = 16973824; + private static final Integer CRAFT_ITEM_PREFIX = 16842752; + public static void init() { initBlocksMinedStats(); initItemsUsedStats(); @@ -80,8 +85,7 @@ private static void initItemsCraftedStats() { for (Item item : items) { if (item != null) { int id = item.id; - ITEMS_CRAFTED[id] = new Stat("stat.craftItem." + id, "stat.craftItem" + item.getDisplayName()) - .register(); + ITEMS_CRAFTED[id] = new Stat("stat.craftItem." + id, CRAFT_ITEM_PREFIX + id).register(); } } @@ -97,7 +101,7 @@ private static void initBlocksMinedStats() { int id = block.id; if (id != 0 && block.hasStats()) { - BLOCKS_MINED[id] = new Stat("stat.mineBlock." + id, "stat.mineBlock" + block.getName()).register(); + BLOCKS_MINED[id] = new Stat("stat.mineBlock." + id, MINE_BLOCK_PREFIX + id).register(); MINED.add(BLOCKS_MINED[id]); } } @@ -112,7 +116,7 @@ private static void initItemsUsedStats() { } int id = item.id; - ITEMS_USED[id] = new Stat("stat.useItem." + id, "stat.useItem" + item.getDisplayName()).register(); + ITEMS_USED[id] = new Stat("stat.useItem." + id, USE_ITEM_PREFIX + id).register(); if (!(item instanceof BlockItem)) { USED.add(ITEMS_USED[id]); } @@ -130,8 +134,7 @@ private static void initItemsBrokenStats() { int id = item.id; if (item.isDamageable()) { - ITEMS_BROKEN[id] = new Stat("stat.breakItem." + id, "stat.breakItem" + item.getDisplayName()) - .register(); + ITEMS_BROKEN[id] = new Stat("stat.breakItem." + id, BREAK_ITEM_PREFIX + id).register(); } } @@ -169,17 +172,21 @@ private static void mergeBlockStats(Stat[] stats, Block block1, Block block2) { } public static Stat createEntityKillStat(String key) { - return new Stat("stat.killEntity." + key, "stat.entityKill" + key).register(); + return new Stat("stat.killEntity." + key, null).register(); } public static Stat createKilledByEntityStat(String key) { - return new Stat("stat.entityKilledBy." + key, "stat.entityKilledBy" + key).register(); + return new Stat("stat.entityKilledBy." + key, null).register(); } public static Stat byKey(String key) { return BY_KEY.get(key); } + public static Stat byVanillaId(Integer id) { + return BY_VANILLA_ID.get(id); + } + public static Stat getEntityKillStat(Entity entity) { return byKey("stat.killEntity." + Entities.getKey(entity)); } diff --git a/versions/1.1.0-client/src/main/resources/quilt.mod.json b/versions/1.1.0-client/src/main/resources/quilt.mod.json index f210b42..8a76330 100644 --- a/versions/1.1.0-client/src/main/resources/quilt.mod.json +++ b/versions/1.1.0-client/src/main/resources/quilt.mod.json @@ -33,10 +33,7 @@ "minecraft": { "environment": "client" }, - "mixin": [ - "server_stats.mixins.json", - "server_stats.stats.mixins.json" - ], + "mixin": "server_stats.mixins.json", "access_widener" : "server_stats.accesswidener", "quilt_loom": { "injected_interfaces": { diff --git a/versions/1.1.0-client/src/main/resources/server_stats.mixins.json b/versions/1.1.0-client/src/main/resources/server_stats.mixins.json index f65435a..f62644a 100644 --- a/versions/1.1.0-client/src/main/resources/server_stats.mixins.json +++ b/versions/1.1.0-client/src/main/resources/server_stats.mixins.json @@ -3,15 +3,17 @@ "minVersion": "0.8", "package": "net.lostluma.server_stats.mixin", "compatibilityLevel": "JAVA_17", - "mixins": [], + "mixins": [ + "common.EntitiesMixin", + "common.PlayerEntityMixin", + "common.WorldMixin" + ], "client": [ - "client.PacketHandlerMixin", - "client.PlayerStatsMixin", - "server.EntitiesMixin", - "server.MinecraftMixin", - "server.PlayerEntityMixin", - "server.WorldMixin" - ], + "client.LocalPlayerEntityMixin", + "client.MinecraftMixin", + "client.PacketHandlerMixin", + "client.PlayerStatsMixin" + ], "server": [], "injectors": { "defaultRequire": 1 diff --git a/versions/1.1.0-client/src/main/resources/server_stats.stats.mixins.json b/versions/1.1.0-client/src/main/resources/server_stats.stats.mixins.json deleted file mode 100644 index 0fdf2c5..0000000 --- a/versions/1.1.0-client/src/main/resources/server_stats.stats.mixins.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "net.lostluma.server_stats.mixin.server.stats", - "compatibilityLevel": "JAVA_17", - "mixins": [], - "client": [ - "block.BlockMixin", - "block.LeavesBlockMixin", - "block.SnowLayerBlockMixin", - "block.TallPlantBlockMixin", - "block.VineBlockMixin", - "FishingBobberEntityMixin", - "ItemStackMixin", - "MinecraftMixin", - "PlayerEntityMixin" - ], - "server": [], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java new file mode 100644 index 0000000..ee62753 --- /dev/null +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/client/LocalPlayerEntityMixin.java @@ -0,0 +1,30 @@ +package net.lostluma.server_stats.mixin.client; + +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.client.entity.living.player.InputPlayerEntity; +import net.minecraft.client.entity.living.player.LocalPlayerEntity; +import net.minecraft.entity.living.player.PlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin({ InputPlayerEntity.class, LocalPlayerEntity.class }) +public class LocalPlayerEntityMixin { + private PlayerEntity getPlayer() { + return (PlayerEntity) (Object) this; + } + + @Inject(method = "incrementStat(Lnet/minecraft/stat/Stat;I)V", at = @At("HEAD")) + private void incrementStat(net.minecraft.stat.Stat vanillaStat, int amount, CallbackInfo callbackInfo) { + if (vanillaStat == null) { + return; + } + + var stat = Stats.byVanillaId(vanillaStat.id); + + if (stat != null) { + this.getPlayer().server_stats$incrementStat(stat, amount); + } + } +} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java similarity index 59% rename from versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java rename to versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java index 9ff60b2..9d9fad4 100644 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/MinecraftMixin.java +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/client/MinecraftMixin.java @@ -1,36 +1,33 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.client; import net.lostluma.server_stats.stats.ServerPlayerStats; +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.living.player.InputPlayerEntity; import net.minecraft.world.WorldSettings; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.living.player.InputPlayerEntity; - @Mixin(Minecraft.class) public class MinecraftMixin { - @Shadow - public InputPlayerEntity player; + @Shadow + public InputPlayerEntity player; - @Inject(method = "main", at = @At("HEAD")) - private static void onMain(CallbackInfo callbackInfo) { + @Inject(method = "", at = @At("TAIL")) + private void onInit(CallbackInfo callbackInfo) { Stats.init(); } @Inject(method = "startGame", at = @At("HEAD")) - private void loadWorld(String worldDir, String worldName, WorldSettings worldSettings, CallbackInfo callbackInfo) { - ServerPlayerStats.setWorldDirectory(String.format("saves/%s", worldDir)); + private void startGame(String worldDir, String worldName, WorldSettings worldSettings, CallbackInfo callbackInfo) { + ServerPlayerStats.setWorldDirectory(String.format("saves/%s", worldDir)); } - // This method is called when the player switches between worlds @Inject(method = "m_4977780", at = @At("TAIL")) - private void onRespawn(int dimension, CallbackInfo callbackInfo) { - this.player.server_stats$saveStats(); + private void changeDimension(int dimension, CallbackInfo callbackInfo) { + this.player.server_stats$saveStats(); } } diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java similarity index 92% rename from versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java rename to versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java index 45d8cbd..49cff01 100644 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/EntitiesMixin.java +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/EntitiesMixin.java @@ -1,4 +1,4 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java similarity index 59% rename from versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java rename to versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java index 9825a49..5181565 100644 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/PlayerEntityMixin.java +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/PlayerEntityMixin.java @@ -1,5 +1,8 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; +import net.lostluma.server_stats.stats.Stats; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.living.LivingEntity; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -9,12 +12,19 @@ import net.lostluma.server_stats.types.StatsPlayer; import net.minecraft.client.Minecraft; import net.minecraft.entity.living.player.PlayerEntity; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PlayerEntity.class) public class PlayerEntityMixin implements StatsPlayer { @Unique private ServerPlayerStats server_stats$serverPlayerStats = null; + private PlayerEntity getPlayer() { + return (PlayerEntity) (Object) this; + } + @Override public void server_stats$incrementStat(Stat stat, int amount) { var stats = this.server_stats$getStats(); @@ -49,4 +59,17 @@ public class PlayerEntityMixin implements StatsPlayer { return this.server_stats$serverPlayerStats; } + + @Inject(method = "onKilled", at = @At("HEAD")) + private void onKilled(DamageSource source, CallbackInfo callbackInfo) { + if (source.getAttacker() != null) { + var attacker = source.getAttacker(); + this.getPlayer().server_stats$incrementStat(Stats.getKilledByEntityStat(attacker), 1); + } + } + + @Inject(method = "onKill", at = @At("HEAD")) + private void onKill(LivingEntity entity, CallbackInfo callbackInfo) { + this.getPlayer().server_stats$incrementStat(Stats.getEntityKillStat(entity), 1); + } } diff --git a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java similarity index 93% rename from versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java rename to versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java index 85cb515..f2ab2b9 100644 --- a/versions/1.0.0-client/src/main/java/net/lostluma/server_stats/mixin/server/WorldMixin.java +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/common/WorldMixin.java @@ -1,4 +1,4 @@ -package net.lostluma.server_stats.mixin.server; +package net.lostluma.server_stats.mixin.common; import java.util.List; @@ -15,7 +15,7 @@ public class WorldMixin { @Shadow public List players; - + @Inject(method = "saveData", at = @At("TAIL")) public void onSave(CallbackInfo callbackInfo) { for (PlayerEntity player : this.players) { diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java deleted file mode 100644 index 7a11707..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/FishingBobberEntityMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.FishingBobberEntity; -import net.minecraft.entity.living.player.PlayerEntity; - -@Mixin(FishingBobberEntity.class) -public class FishingBobberEntityMixin { - @Shadow - public PlayerEntity player; - - @Inject(method = "retract", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onRetract(CallbackInfoReturnable callbackInfo) { - this.player.server_stats$incrementStat(Stats.FISH_CAUGHT, 1); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java deleted file mode 100644 index 117ed6a..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/ItemStackMixin.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.living.LivingEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -@Mixin(ItemStack.class) -public class ItemStackMixin { - @Shadow - public int size; - - @Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void use(PlayerEntity player, World world, int x, int y, int z, int face, CallbackInfoReturnable callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "damageAndBreak", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void damageAndBreak(int amount, LivingEntity entity, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - var player = (PlayerEntity)(Object)entity; - - player.server_stats$incrementStat(Stats.ITEMS_BROKEN[stack.itemId], 1); - } - - @Inject(method = "attackEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void attackEntity(LivingEntity entity, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "mineBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void mineBlock(int blockId, int x, int y, int z, PlayerEntity player, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_USED[stack.itemId], 1); - } - - @Inject(method = "onResult", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onResult(World world, PlayerEntity player, int amount, CallbackInfo callbackInfo) { - var stack = (ItemStack)(Object)this; - player.server_stats$incrementStat(Stats.ITEMS_CRAFTED[stack.itemId], this.size); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java deleted file mode 100644 index f7c6ecb..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/MinecraftMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.living.player.InputPlayerEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(Minecraft.class) -public abstract class MinecraftMixin { - @Shadow - public InputPlayerEntity player; - - @Inject(method = "setWorld(Lnet/minecraft/world/World;Ljava/lang/String;Lnet/minecraft/entity/living/player/PlayerEntity;)V", at = @At("HEAD")) - private void detectWorldLeaving(World world, String string, PlayerEntity playerEntity, CallbackInfo callbackInfo) { - if (world == null && this.player != null) { - this.player.server_stats$incrementStat(Stats.GAMES_LEFT, 1); - } - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java deleted file mode 100644 index 11310b8..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/PlayerEntityMixin.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.entity.Entity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.living.LivingEntity; -import net.minecraft.entity.living.mob.passive.animal.PigEntity; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.entity.vehicle.MinecartEntity; -import net.minecraft.stat.Stat; - -@Mixin(PlayerEntity.class) -public class PlayerEntityMixin { - @Inject(method = "tick", at = @At("HEAD")) - private void tick(CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.MINUTES_PLAYED, 1); - } - - @Inject(method = "onKilled", at = @At("HEAD")) - private void onKilled(DamageSource source, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - - if (source.getAttacker() != null) { - var attacker = source.getAttacker(); - player.server_stats$incrementStat(Stats.getKilledByEntityStat(attacker), 1); - } - - player.server_stats$incrementStat(Stats.DEATHS, 1); - } - - @Inject(method = "onKillEntity", at = @At("HEAD")) - private void onKillEntity(Entity entity, int score, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - - if (!(entity instanceof PlayerEntity)) { - player.server_stats$incrementStat(Stats.MOBS_KILLED, 1); - } else { - player.server_stats$incrementStat(Stats.PLAYERS_KILLED, 1); - } - } - - @Inject(method = "dropItem", at = @At("HEAD")) - private void dropItem(CallbackInfoReturnable callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DROPS, 1); // Vanilla 1.7.10 increments this wrong, so we'll keep that - } - - @Inject(method = "damage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void damage(DamageSource source, int amount, CallbackInfoReturnable callbackInfo) { - var world = ((PlayerEntity) (Object) this).world; - - if (world.difficulty == 0) { - amount = 0; - } - - if (world.difficulty == 1) { - amount = amount / 2 + 1; - } - - if (world.difficulty == 3) { - amount = amount * 3 / 2; - } - - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DAMAGE_TAKEN, amount); - } - - @Inject(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void attack(Entity target, CallbackInfo callbackInfo, int damage) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.DAMAGE_DEALT, damage); - } - - @Inject(method = "tickRidingRelatedStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V"), locals = LocalCapture.CAPTURE_FAILHARD) - private void tickRidingRelatedStats(double x, double y, double z, CallbackInfo callbackInfo, int distance) { - var player = (PlayerEntity) (Object) this; - - if (player.vehicle instanceof PigEntity) { - player.server_stats$incrementStat(Stats.CM_PIG, distance); - } else if (player.vehicle instanceof BoatEntity) { - player.server_stats$incrementStat(Stats.CM_SAILED, distance); - } else if (player.vehicle instanceof MinecartEntity) { - player.server_stats$incrementStat(Stats.CM_MINECART, distance); - } - } - - @Redirect(method = "tickNonRidingMovementRelatedStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void tickNonRidingMovementRelatedStats(PlayerEntity player, Stat stat, int amount) { - var translation = Map.of(net.minecraft.stat.Stats.CM_DIVEN, Stats.CM_DIVEN, net.minecraft.stat.Stats.CM_SWUM, - Stats.CM_SWUM, net.minecraft.stat.Stats.CM_CLIMB, Stats.CM_CLIMB, net.minecraft.stat.Stats.CM_WALKED, - Stats.CM_WALKED, net.minecraft.stat.Stats.CM_FLOWN, Stats.CM_FLOWN); - - player.incrementStat(stat, amount); // Increase vanilla stat too - player.server_stats$incrementStat(translation.get(stat), amount); - } - - @Inject(method = "applyFallDamage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void applyFallDamage(float distance, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.CM_FALLEN, (int) Math.round((double) distance * 100.0)); - } - - @Inject(method = "onKill", at = @At("HEAD")) - private void onKill(LivingEntity entity, CallbackInfo callbackInfo) { - var player = (PlayerEntity) (Object) this; - player.server_stats$incrementStat(Stats.getEntityKillStat(entity), 1); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java deleted file mode 100644 index 1bd8c8a..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/BlockMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(Block.class) -public class BlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java deleted file mode 100644 index be3a9e3..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/LeavesBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.LeavesBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(LeavesBlock.class) -public class LeavesBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java deleted file mode 100644 index 94ae4c2..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/SnowLayerBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.SnowLayerBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(SnowLayerBlock.class) -public class SnowLayerBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java deleted file mode 100644 index 1619335..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/TallPlantBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.TallPlantBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(TallPlantBlock.class) -public class TallPlantBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java deleted file mode 100644 index f9c8ade..0000000 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/mixin/server/stats/block/VineBlockMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lostluma.server_stats.mixin.server.stats.block; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.lostluma.server_stats.stats.Stats; -import net.minecraft.block.Block; -import net.minecraft.block.VineBlock; -import net.minecraft.entity.living.player.PlayerEntity; -import net.minecraft.world.World; - -@Mixin(VineBlock.class) -public class VineBlockMixin { - @Inject(method = "afterMinedByPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/living/player/PlayerEntity;incrementStat(Lnet/minecraft/stat/Stat;I)V")) - private void onAfterMinedByPlayer(World world, PlayerEntity player, int x, int y, int z, int metadata, CallbackInfo callbackInfo) { - Block block = (Block)(Object)this; - player.server_stats$incrementStat(Stats.BLOCKS_MINED[block.id], 1); - } -} diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java index a34d816..fed236a 100644 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/GeneralStat.java @@ -1,14 +1,16 @@ package net.lostluma.server_stats.stats; +import org.jetbrains.annotations.Nullable; + public class GeneralStat extends Stat { - public GeneralStat(String key, String name) { - super(key, name); - } + public GeneralStat(String key, @Nullable Integer vanillaId) { + super(key, vanillaId); + } - @Override - public Stat register() { - super.register(); - Stats.GENERAL.add(this); - return this; - } + @Override + public Stat register() { + super.register(); + Stats.GENERAL.add(this); + return this; + } } diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stat.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stat.java index ec26627..aa387a4 100644 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stat.java +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stat.java @@ -1,40 +1,47 @@ package net.lostluma.server_stats.stats; +import org.jetbrains.annotations.Nullable; + /* - * V very cut-down version of the vanilla 1.7.10 Stat class. + * A very cut-down version of the vanilla 1.7.10 Stat class. */ public class Stat { - public final String key; - private final String name; - public boolean local; - - public Stat(String key, String name) { - this.key = key; - this.name = name; - } - - public Stat register() { - if (Stats.BY_KEY.containsKey(this.key)) { - throw new RuntimeException("Duplicate stat id: \"" + ((Stat)Stats.BY_KEY.get(this.key)).name + "\" and \"" + this.name + "\" at id " + this.key); - } else { - Stats.ALL.add(this); - Stats.BY_KEY.put(this.key, this); - return this; - } - } - - public boolean equals(Object object) { - if (this == object) { - return true; - } else if (object != null && this.getClass() == object.getClass()) { - Stat var2 = (Stat)object; - return this.key.equals(var2.key); - } else { - return false; - } - } - - public int hashCode() { - return this.key.hashCode(); - } + public final String key; + + public final @Nullable Integer vanillaId; + + public Stat(String key, @Nullable Integer vanillaId) { + this.key = key; + this.vanillaId = vanillaId; + } + + public Stat register() { + if (Stats.BY_KEY.containsKey(this.key)) { + throw new RuntimeException("Duplicate stat id: \"" + ((Stat)Stats.BY_KEY.get(this.key)).key + "\" and \"" + this.key + "."); + } else { + Stats.ALL.add(this); + Stats.BY_KEY.put(this.key, this); + + if (this.vanillaId != null) { + Stats.BY_VANILLA_ID.put(this.vanillaId, this); + } + + return this; + } + } + + public boolean equals(Object object) { + if (this == object) { + return true; + } else if (object != null && this.getClass() == object.getClass()) { + Stat var2 = (Stat)object; + return this.key.equals(var2.key); + } else { + return false; + } + } + + public int hashCode() { + return this.key.hashCode(); + } } diff --git a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stats.java b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stats.java index 974a071..f52eaa5 100644 --- a/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stats.java +++ b/versions/1.2.5-client/src/main/java/net/lostluma/server_stats/stats/Stats.java @@ -22,39 +22,44 @@ @SuppressWarnings({ "squid:S3008", "squid:S2386" }) public class Stats { protected static Map BY_KEY = new HashMap<>(); + protected static Map BY_VANILLA_ID = new HashMap<>(); + public static List ALL = new ArrayList<>(); public static List GENERAL = new ArrayList<>(); public static List USED = new ArrayList<>(); public static List MINED = new ArrayList<>(); - public static Stat GAMES_LEFT = new GeneralStat("stat.leaveGame", "stat.leaveGame").register(); - public static Stat MINUTES_PLAYED = new GeneralStat("stat.playOneMinute", "stat.playOneMinute").register(); - public static Stat CM_WALKED = new GeneralStat("stat.walkOneCm", "stat.walkOneCm").register(); - public static Stat CM_SWUM = new GeneralStat("stat.swimOneCm", "stat.swimOneCm").register(); - public static Stat CM_FALLEN = new GeneralStat("stat.fallOneCm", "stat.fallOneCm").register(); - public static Stat CM_CLIMB = new GeneralStat("stat.climbOneCm", "stat.climbOneCm").register(); - public static Stat CM_FLOWN = new GeneralStat("stat.flyOneCm", "stat.flyOneCm").register(); - public static Stat CM_DIVEN = new GeneralStat("stat.diveOneCm", "stat.diveOneCm").register(); - public static Stat CM_MINECART = new GeneralStat("stat.minecartOneCm", "stat.minecartOneCm").register(); - public static Stat CM_SAILED = new GeneralStat("stat.boatOneCm", "stat.boatOneCm").register(); - public static Stat CM_PIG = new GeneralStat("stat.pigOneCm", "stat.pigOneCm").register(); - public static Stat CM_HORSE = new GeneralStat("stat.horseOneCm", "stat.horseOneCm").register(); - // public static Stat JUMPS = new GeneralStat("stat.jump", "stat.jump").register(); - public static Stat DROPS = new GeneralStat("stat.drop", "stat.drop").register(); - public static Stat DAMAGE_DEALT = new GeneralStat("stat.damageDealt", "stat.damageDealt").register(); - public static Stat DAMAGE_TAKEN = new GeneralStat("stat.damageTaken", "stat.damageTaken").register(); - public static Stat DEATHS = new GeneralStat("stat.deaths", "stat.deaths").register(); - public static Stat MOBS_KILLED = new GeneralStat("stat.mobKills", "stat.mobKills").register(); - // public static Stat ANIMALS_BRED = new GeneralStat("stat.animalsBred", "stat.animalsBred").register(); - public static Stat PLAYERS_KILLED = new GeneralStat("stat.playerKills", "stat.playerKills").register(); - public static Stat FISH_CAUGHT = new GeneralStat("stat.fishCaught", "stat.fishCaught").register(); - // public static Stat JUNK_FISHED = new GeneralStat("stat.junkFished", "stat.junkFished").register(); - // public static Stat TREASURE_FISHED = new GeneralStat("stat.treasureFished", "stat.treasureFished").register(); + + public static Stat GAMES_LEFT = new GeneralStat("stat.leaveGame", 1004).register(); + public static Stat MINUTES_PLAYED = new GeneralStat("stat.playOneMinute", 1100).register(); + public static Stat CM_WALKED = new GeneralStat("stat.walkOneCm", 2000).register(); + public static Stat CM_SWUM = new GeneralStat("stat.swimOneCm", 2001).register(); + public static Stat CM_FALLEN = new GeneralStat("stat.fallOneCm", 2002).register(); + public static Stat CM_CLIMB = new GeneralStat("stat.climbOneCm", 2003).register(); + public static Stat CM_FLOWN = new GeneralStat("stat.flyOneCm", 2004).register(); + public static Stat CM_DIVEN = new GeneralStat("stat.diveOneCm", 2005).register(); + public static Stat CM_MINECART = new GeneralStat("stat.minecartOneCm", 2006).register(); + public static Stat CM_SAILED = new GeneralStat("stat.boatOneCm", 2007).register(); + public static Stat CM_PIG = new GeneralStat("stat.pigOneCm", 2008).register(); + public static Stat JUMPS = new GeneralStat("stat.jump", 2010).register(); + public static Stat DROPS = new GeneralStat("stat.drop", 2011).register(); + public static Stat DAMAGE_DEALT = new GeneralStat("stat.damageDealt", 2020).register(); + public static Stat DAMAGE_TAKEN = new GeneralStat("stat.damageTaken", 2021).register(); + public static Stat DEATHS = new GeneralStat("stat.deaths", 2022).register(); + public static Stat MOBS_KILLED = new GeneralStat("stat.mobKills", 2023).register(); + public static Stat PLAYERS_KILLED = new GeneralStat("stat.playerKills", 2024).register(); + public static Stat FISH_CAUGHT = new GeneralStat("stat.fishCaught", 2025).register(); public static final Stat[] BLOCKS_MINED = new Stat[4096]; public static final Stat[] ITEMS_CRAFTED = new Stat[32000]; public static final Stat[] ITEMS_USED = new Stat[32000]; public static final Stat[] ITEMS_BROKEN = new Stat[32000]; + // For some reason vanilla stat IDs start at these numbers + private static final Integer MINE_BLOCK_PREFIX = 16777216; + private static final Integer USE_ITEM_PREFIX = 16908288; + private static final Integer BREAK_ITEM_PREFIX = 16973824; + private static final Integer CRAFT_ITEM_PREFIX = 16842752; + public static void init() { initBlocksMinedStats(); initItemsUsedStats(); @@ -80,8 +85,7 @@ private static void initItemsCraftedStats() { for (Item item : items) { if (item != null) { int id = item.id; - ITEMS_CRAFTED[id] = new Stat("stat.craftItem." + id, "stat.craftItem" + item.getDisplayName()) - .register(); + ITEMS_CRAFTED[id] = new Stat("stat.craftItem." + id, CRAFT_ITEM_PREFIX + id).register(); } } @@ -97,7 +101,7 @@ private static void initBlocksMinedStats() { int id = block.id; if (id != 0 && block.hasStats()) { - BLOCKS_MINED[id] = new Stat("stat.mineBlock." + id, "stat.mineBlock" + block.getName()).register(); + BLOCKS_MINED[id] = new Stat("stat.mineBlock." + id, MINE_BLOCK_PREFIX + id).register(); MINED.add(BLOCKS_MINED[id]); } } @@ -112,7 +116,7 @@ private static void initItemsUsedStats() { } int id = item.id; - ITEMS_USED[id] = new Stat("stat.useItem." + id, "stat.useItem" + item.getDisplayName()).register(); + ITEMS_USED[id] = new Stat("stat.useItem." + id, USE_ITEM_PREFIX + id).register(); if (!(item instanceof BlockItem)) { USED.add(ITEMS_USED[id]); } @@ -130,8 +134,7 @@ private static void initItemsBrokenStats() { int id = item.id; if (item.isDamageable()) { - ITEMS_BROKEN[id] = new Stat("stat.breakItem." + id, "stat.breakItem" + item.getDisplayName()) - .register(); + ITEMS_BROKEN[id] = new Stat("stat.breakItem." + id, BREAK_ITEM_PREFIX + id).register(); } } @@ -169,17 +172,21 @@ private static void mergeBlockStats(Stat[] stats, Block block1, Block block2) { } public static Stat createEntityKillStat(String key) { - return new Stat("stat.killEntity." + key, "stat.entityKill" + key).register(); + return new Stat("stat.killEntity." + key, null).register(); } public static Stat createKilledByEntityStat(String key) { - return new Stat("stat.entityKilledBy." + key, "stat.entityKilledBy" + key).register(); + return new Stat("stat.entityKilledBy." + key, null).register(); } public static Stat byKey(String key) { return BY_KEY.get(key); } + public static Stat byVanillaId(Integer id) { + return BY_VANILLA_ID.get(id); + } + public static Stat getEntityKillStat(Entity entity) { return byKey("stat.killEntity." + Entities.getKey(entity)); } diff --git a/versions/1.2.5-client/src/main/resources/quilt.mod.json b/versions/1.2.5-client/src/main/resources/quilt.mod.json index bbd7f15..04369ac 100644 --- a/versions/1.2.5-client/src/main/resources/quilt.mod.json +++ b/versions/1.2.5-client/src/main/resources/quilt.mod.json @@ -33,10 +33,7 @@ "minecraft": { "environment": "client" }, - "mixin": [ - "server_stats.mixins.json", - "server_stats.stats.mixins.json" - ], + "mixin": "server_stats.mixins.json", "access_widener" : "server_stats.accesswidener", "quilt_loom": { "injected_interfaces": { diff --git a/versions/1.2.5-client/src/main/resources/server_stats.mixins.json b/versions/1.2.5-client/src/main/resources/server_stats.mixins.json index f65435a..6c3ccfe 100644 --- a/versions/1.2.5-client/src/main/resources/server_stats.mixins.json +++ b/versions/1.2.5-client/src/main/resources/server_stats.mixins.json @@ -3,14 +3,16 @@ "minVersion": "0.8", "package": "net.lostluma.server_stats.mixin", "compatibilityLevel": "JAVA_17", - "mixins": [], + "mixins": [ + "common.EntitiesMixin", + "common.PlayerEntityMixin", + "common.WorldMixin" + ], "client": [ + "client.LocalPlayerEntityMixin", + "client.MinecraftMixin", "client.PacketHandlerMixin", - "client.PlayerStatsMixin", - "server.EntitiesMixin", - "server.MinecraftMixin", - "server.PlayerEntityMixin", - "server.WorldMixin" + "client.PlayerStatsMixin" ], "server": [], "injectors": { diff --git a/versions/1.2.5-client/src/main/resources/server_stats.stats.mixins.json b/versions/1.2.5-client/src/main/resources/server_stats.stats.mixins.json deleted file mode 100644 index 0fdf2c5..0000000 --- a/versions/1.2.5-client/src/main/resources/server_stats.stats.mixins.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "net.lostluma.server_stats.mixin.server.stats", - "compatibilityLevel": "JAVA_17", - "mixins": [], - "client": [ - "block.BlockMixin", - "block.LeavesBlockMixin", - "block.SnowLayerBlockMixin", - "block.TallPlantBlockMixin", - "block.VineBlockMixin", - "FishingBobberEntityMixin", - "ItemStackMixin", - "MinecraftMixin", - "PlayerEntityMixin" - ], - "server": [], - "injectors": { - "defaultRequire": 1 - } -}