From b450a0af806ed9acf869f5c3463fd1ee0ec356e7 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Thu, 14 Jan 2021 20:08:43 +0000 Subject: [PATCH] Fix confirm for some commands that give AutoValue_CommandParametersImpl from the getgo --- .../command/util/annotation/Confirm.java | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java index ef386d44b..974167c82 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java @@ -20,6 +20,8 @@ import org.enginehub.piston.inject.InjectAnnotation; import org.enginehub.piston.inject.InjectedValueAccess; import org.enginehub.piston.inject.Key; import org.enginehub.piston.inject.MemoizingValueAccess; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -155,7 +157,17 @@ public @interface Confirm { actor.setMeta("cmdConfirm", wait); try { // This is really dumb but also stops the double //confirm requirement... - Map, Optional> memory = (Map, Optional>) Reflect.memory.get(context); + final MemoizingValueAccess memoizingValueAccess; + if (!(context instanceof MemoizingValueAccess)) { + if (!context.getClass().getSimpleName().contains("AutoValue_CommandParametersImpl")) { + LoggerFactory.getLogger(Confirm.class).warn("InjectedValueAccess " + context.getClass().getName() + " given to Confirm"); + return true; + } + memoizingValueAccess = (MemoizingValueAccess) Reflect.injectedValues.get(context); + } else { + memoizingValueAccess = (MemoizingValueAccess) context; + } + Map, Optional> memory = (Map, Optional>) Reflect.memory.get(memoizingValueAccess); memory.put(Key.of(InterruptableCondition.class), Optional.of(wait)); } catch (IllegalAccessException e) { e.printStackTrace(); @@ -183,16 +195,28 @@ public @interface Confirm { class Reflect { static final Field memory; + static final Field injectedValues; static { - Field f; + Field memoryField; try { - f = MemoizingValueAccess.class.getDeclaredField("memory"); - f.setAccessible(true); + memoryField = MemoizingValueAccess.class.getDeclaredField("memory"); + memoryField.setAccessible(true); } catch (NoSuchFieldException e) { e.printStackTrace(); - f = null; + memoryField = null; } - memory = f; + memory = memoryField; + + Field injectedValuesField; + try { + Class c = Class.forName("org.enginehub.piston.impl.AutoValue_CommandParametersImpl"); + injectedValuesField = c.getDeclaredField("injectedValues"); + injectedValuesField.setAccessible(true); + } catch (NoSuchFieldException | ClassNotFoundException e) { + e.printStackTrace(); + injectedValuesField = null; + } + injectedValues = injectedValuesField; } } }