From bd2f21c1c1fe27e24b68b8141cd89a2d3fe52b2f Mon Sep 17 00:00:00 2001 From: OldSerpskiStalker Date: Thu, 24 Oct 2024 13:39:07 +0500 Subject: [PATCH] Added annotation: "@UniqueObject" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Защита от дубликатов полей, которые могут быть проблемными в некоторых местах --- .../DynamicSpawnControl.java | 14 +++-- .../dynamicspawncontrol/UniqueField.java | 53 +++++++++++++++++++ .../inlineannotation/UniqueObject.java | 16 ++++++ 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/UniqueField.java create mode 100644 dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/inlineannotation/UniqueObject.java diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java index 7ddfe5b..357a472 100644 --- a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java @@ -11,9 +11,9 @@ import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; -import org.imesense.dynamicspawncontrol.ai.spider.util.event.WebAttackEvent; +import org.imesense.dynamicspawncontrol.ai.spider.util.event.OnWebAttackEvent; import org.imesense.dynamicspawncontrol.ai.spider.util.attackweb.WebSlingerCapability; -import org.imesense.dynamicspawncontrol.ai.zombie.event.BreakTorchEvent; +import org.imesense.dynamicspawncontrol.ai.zombie.event.OnBreakTorchEvent; import org.imesense.dynamicspawncontrol.debug.CheckDebugger; import org.imesense.dynamicspawncontrol.gameplay.recipes.IRecipes; import org.imesense.dynamicspawncontrol.gameplay.recipes.CraftItemWeb; @@ -93,7 +93,7 @@ public DynamicSpawnControl() * @param event Preinitialization event */ @Mod.EventHandler - public synchronized void preInit(FMLPreInitializationEvent event) + public synchronized void preInit(FMLPreInitializationEvent event) throws IllegalAccessException { // CheckDebugger.instance = new CheckDebugger(); @@ -105,6 +105,10 @@ public synchronized void preInit(FMLPreInitializationEvent event) Log.createLogFile(globalDirectory.getPath() + File.separator + ProjectStructure.STRUCT_FILES_DIRS.NAME_DIRECTORY, CheckDebugger.instance.IsRunDebugger); Log.writeDataToLogFile(1, "Debugger is running: " + (CheckDebugger.instance.IsRunDebugger ? "true" : "false")); + // + UniqueField uniqueField = new UniqueField(); + Log.writeDataToLogFile(0, "Object create [UniqueField]: " + uniqueField.hashCode()); + // MessageHandler.init(); @@ -166,8 +170,8 @@ public synchronized void init(FMLInitializationEvent event) public synchronized void postInit(FMLPostInitializationEvent event) { //-' TODO: перенести это в отдельную инициализацию - MinecraftForge.EVENT_BUS.register(new WebAttackEvent()); - MinecraftForge.EVENT_BUS.register(new BreakTorchEvent()); + MinecraftForge.EVENT_BUS.register(new OnWebAttackEvent()); + MinecraftForge.EVENT_BUS.register(new OnBreakTorchEvent()); } /** diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/UniqueField.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/UniqueField.java new file mode 100644 index 0000000..55e4827 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/UniqueField.java @@ -0,0 +1,53 @@ +package org.imesense.dynamicspawncontrol; + +import net.minecraft.client.Minecraft; +import org.imesense.dynamicspawncontrol.technical.customlibrary.inlineannotation.UniqueObject; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Set; + +/** + * + */ +public final class UniqueField +{ + /** + * + */ + @UniqueObject + private final Minecraft CLIENT = Minecraft.getMinecraft(); + + /** + * + */ + public UniqueField() throws IllegalAccessException + { + this.validateUniqueFields(this); + } + + /** + * + * @param object + */ + private void validateUniqueFields(Object object) throws IllegalAccessException + { + Set uniqueValues = new HashSet<>(); + Field[] fields = object.getClass().getDeclaredFields(); + + for (Field field : fields) + { + if (field.isAnnotationPresent(UniqueObject.class)) + { + field.setAccessible(true); + + Object value = field.get(object); + + if (!uniqueValues.add(value)) + { + throw new IllegalStateException("Duplicate field value detected: " + field.getName()); + } + } + } + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/inlineannotation/UniqueObject.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/inlineannotation/UniqueObject.java new file mode 100644 index 0000000..f8a4da2 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/inlineannotation/UniqueObject.java @@ -0,0 +1,16 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.inlineannotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UniqueObject +{ + +}