diff --git a/build.gradle b/build.gradle index c82d78d..d0d7b38 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ base { repositories { maven { url 'https://repo.minebench.de/' } maven { url 'https://maven.nucleoid.xyz' } + maven { url 'https://masa.dy.fi/maven' } } dependencies { @@ -23,6 +24,7 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modRuntimeOnly(modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}") + modRuntimeOnly(modImplementation("carpet:fabric-carpet:${project.minecraft_version}-${project.carpet_version}")) include(implementation("net.kyori:adventure-text-minimessage:4.17.0-SNAPSHOT")) include(implementation("net.kyori:adventure-text-serializer-gson:4.17.0-SNAPSHOT")) diff --git a/gradle.properties b/gradle.properties index 012fc75..b3d5e6a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.jvmargs=-Xmx1G # check these on https://modmuss50.me/fabric.html minecraft_version=1.20.6 yarn_mappings=1.20.6+build.3 -loader_version=0.15.6 +loader_version=0.15.11 # Mod Properties mod_version = 1.0.0 @@ -15,4 +15,5 @@ archives_base_name = nexia-teams # Dependencies # check this on https://modmuss50.me/fabric.html fabric_version=0.100.0+1.20.6 -gson_version=2.11.0 \ No newline at end of file +gson_version=2.11.0 +carpet_version=1.4.141+v240429 \ No newline at end of file diff --git a/src/main/java/com/nexia/teams/NexiaTeams.java b/src/main/java/com/nexia/teams/NexiaTeams.java index c2995e6..59a216e 100644 --- a/src/main/java/com/nexia/teams/NexiaTeams.java +++ b/src/main/java/com/nexia/teams/NexiaTeams.java @@ -1,6 +1,7 @@ package com.nexia.teams; import com.nexia.teams.commands.CommandLoader; +import com.nexia.teams.utilities.CombatUtil; import com.nexia.teams.utilities.chat.ChatFormat; import com.nexia.teams.utilities.time.ServerTime; import net.fabricmc.api.ModInitializer; @@ -30,6 +31,8 @@ public class NexiaTeams implements ModInitializer { ServerPlayer player = handler.getPlayer(); player.sendSystemMessage(ChatFormat.convertComponent(ChatFormat.nexiaMessage.append(Component.text("Welcome to Nexia Teams!")))); + + CombatUtil.combatLoggedPlayersTimer.remove(player.getUUID()); }); ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { @@ -37,9 +40,7 @@ public class NexiaTeams implements ModInitializer { player.getCombatTracker().recheckStatus(); if(player.getCombatTracker().inCombat) { - // idk if this even works - ServerTime.minecraftServer.getCommands().performPrefixedCommand(ServerTime.minecraftServer.createCommandSourceStack().withPermission(4).withSuppressedOutput(), "player " + player.getScoreboardName() + " shadow"); - ServerTime.minecraftServer.getCommands().performPrefixedCommand(ServerTime.minecraftServer.createCommandSourceStack().withPermission(4).withSuppressedOutput(), "player " + player.getScoreboardName() + " spawn"); + CombatUtil.addPlayer(player); } }); diff --git a/src/main/java/com/nexia/teams/events/meteor/Meteor.java b/src/main/java/com/nexia/teams/events/meteor/Meteor.java index 9f7b28d..243466e 100644 --- a/src/main/java/com/nexia/teams/events/meteor/Meteor.java +++ b/src/main/java/com/nexia/teams/events/meteor/Meteor.java @@ -15,7 +15,7 @@ public abstract class Meteor { public static ServerPlayer serverPlayer = null; public static int[] meteorCoordinates = new int[]{0, 324, 0}; - public static void tick() { + public static void second() { if (scheduledTimestamp == null) return; long unixTime = System.currentTimeMillis() / 1000L; diff --git a/src/main/java/com/nexia/teams/mixin/AxeItemMixin.java b/src/main/java/com/nexia/teams/mixin/AxeItemMixin.java index 914f646..9741476 100644 --- a/src/main/java/com/nexia/teams/mixin/AxeItemMixin.java +++ b/src/main/java/com/nexia/teams/mixin/AxeItemMixin.java @@ -45,6 +45,7 @@ public class AxeItemMixin { player.sendSystemMessage(ChatFormat.convertComponent(ChatFormat.nexiaMessage.append(Component.text("Finished editing koth.")))); kothGame.initialCoordinates = null; + player.getInventory().removeItem(useOnContext.getItemInHand()); player.removeTag("koth_" + kothName); } } diff --git a/src/main/java/com/nexia/teams/utilities/CombatUtil.java b/src/main/java/com/nexia/teams/utilities/CombatUtil.java new file mode 100644 index 0000000..67063bf --- /dev/null +++ b/src/main/java/com/nexia/teams/utilities/CombatUtil.java @@ -0,0 +1,57 @@ +package com.nexia.teams.utilities; + +import com.nexia.teams.utilities.time.ServerTime; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.UUID; + +public class CombatUtil { + + public static final Logger logger = LoggerFactory.getLogger(CombatUtil.class); + + public static HashMap combatLoggedPlayersTimer = new HashMap<>(); + + public static void second() { + try { + CombatUtil.combatLoggedPlayersTimer.forEach(((uuid, integer) -> { + ServerPlayer serverPlayer = getPlayer(uuid); + int newInt = integer - 1; + + combatLoggedPlayersTimer.replace(uuid, newInt); + if(serverPlayer == null || newInt > 0) return; + + CombatUtil.logger.debug("Removing fake player {}: Combat Timer ran out", serverPlayer.getScoreboardName()); + + //serverPlayer.connection.disconnect(ChatFormat.convertComponent(Component.text("Combat Log Timer ran out. Disconnecting Bot\n\nIf you are not a bot then please report this issue to the developers."))); + serverPlayer.kill(); + + combatLoggedPlayersTimer.remove(uuid); + })); + } catch (Exception ignored) { } + + } + + public static void stop() { + CombatUtil.logger.debug("Clearing all fake players."); + combatLoggedPlayersTimer.clear(); + } + + public static boolean addPlayer(ServerPlayer player) { + CombatUtil.logger.debug("Spawning player {} as a fake player.", player.getScoreboardName()); + + ServerTime.minecraftServer.getCommands().performPrefixedCommand(ServerTime.minecraftServer.createCommandSourceStack().withPermission(4), "player " + player.getScoreboardName() + " shadow"); + + combatLoggedPlayersTimer.put(player.getUUID(), player.getCombatTracker().getCombatDuration()); + + return getPlayer(player.getUUID()) != null; + } + + private static @Nullable ServerPlayer getPlayer(UUID uuid) { + return ServerTime.minecraftServer.getPlayerList().getPlayer(uuid); + } +} + diff --git a/src/main/java/com/nexia/teams/utilities/time/ServerTime.java b/src/main/java/com/nexia/teams/utilities/time/ServerTime.java index 6e879d3..d3b53b0 100644 --- a/src/main/java/com/nexia/teams/utilities/time/ServerTime.java +++ b/src/main/java/com/nexia/teams/utilities/time/ServerTime.java @@ -4,6 +4,7 @@ import com.google.common.base.Suppliers; import com.nexia.teams.events.koth.KothGame; import com.nexia.teams.events.koth.KothGameHandler; import com.nexia.teams.events.meteor.Meteor; +import com.nexia.teams.utilities.CombatUtil; import com.nexia.teams.utilities.chat.ChatFormat; import com.nexia.teams.utilities.data.KothDataManager; import com.nexia.teams.utilities.data.NexiaDataManager; @@ -32,6 +33,7 @@ public abstract class ServerTime { NexiaDataManager.saveNexiaData(); KothGameHandler.stopAllKothGames(); KothDataManager.saveKothGamesData(); + CombatUtil.stop(); try { for (ServerPlayer player : server.getPlayerList().getPlayers()) { @@ -54,7 +56,9 @@ public abstract class ServerTime { static void everySecond() { totalSecondCount++; - Meteor.tick(); + Meteor.second(); + CombatUtil.second(); + long unixTime = System.currentTimeMillis() / 1000L; for (KothGame kothGame : KothGameHandler.kothGames) { if (kothGame.scheduledTimestamp == null) continue;