Rhino

Rhino

84M Downloads

IndexOutOfBoundsException on Rhino 77

pietro-lopes opened this issue ยท 1 comments

commented

I'm crashing here.

consolidatedAll.set(i, consolidated);

commented

You need to add embeddium as runtime

runtimeOnly("curse.maven:embeddium-908741:6118392")

at client_scripts

let $MinecraftOptionsStorage = Java.loadClass("org.embeddedt.embeddium.api.options.storage.MinecraftOptionsStorage")
let $OptionImpl = Java.loadClass("org.embeddedt.embeddium.api.options.structure.OptionImpl")
let $Integer = Java.loadClass("java.lang.Integer")
let $SliderControl = Java.loadClass("org.embeddedt.embeddium.api.options.control.SliderControl")
let $ControlValueFormatter = Java.loadClass("org.embeddedt.embeddium.api.options.control.ControlValueFormatter")

NativeEvents.onEvent("org.embeddedt.embeddium.api.OptionGroupConstructionEvent", event => {
  if (event.getId() == "minecraft:window") {
    let fovScaleOption = $OptionImpl.createBuilder($Integer, $MinecraftOptionsStorage.INSTANCE)
      .setId("minecraft:fov_effect_scale")
      .setName(Text.translatable("options.fovEffectScale"))
      .setTooltip(Text.translatable("options.fovEffectScale.tooltip"))
      .setControl(option => new $SliderControl(option, 0, 100, 1, $ControlValueFormatter.percentage()))
      .setBinding((opts, value) => {
        opts.fovEffectScale().set(value / 100);
      }, (opts) => Java.cast($Integer, JavaMath.floor(opts.fovEffectScale().get() * 100)))
      .build()
    event.getOptions().add(fovScaleOption)
  }
})

Follow video to trigger the event/errors:

java_YkIgiUPtId.mp4

Those were the mixin required to make it work:

Fix OOB

@Mixin(TypeConsolidator.class)
public class TypeConsolidatorMixin {
    @WrapOperation(method = "consolidateAll(Ljava/util/List;Ljava/util/Map;)Ljava/util/List;", at = @At(value = "INVOKE", target = "Ljava/util/List;set(ILjava/lang/Object;)Ljava/lang/Object;"))
    private static Object populateIfOOB(List<Object> instance, int i, Object e, Operation<Object> original){
        while (instance.size() <= i) {
            instance.add(null);
        }
        return original.call(instance, i, e);
    }
}

Fix #61 (That #55 didn't fix it)

@Mixin(VariableTypeInfo.class)
public abstract class VariableTypeInfo2Mixin extends TypeInfoBase {

    @Shadow
    public abstract TypeInfo[] getBounds();

    @Override
    public boolean shouldConvert() {
        return getBounds() != TypeInfo.EMPTY_ARRAY;
    }
}

Fix #63
*Note: This is more accurate than .asClass() as VariableTypeInfo always return Object after PR #55 *

    @Definition(id = "OBJECT", field = "Ldev/latvian/mods/rhino/type/TypeInfo;OBJECT:Ldev/latvian/mods/rhino/type/TypeInfo;")
    @Definition(id = "target", local = @Local(type = TypeInfo.class, argsOnly = true))
    @Expression("target == OBJECT")
    @ModifyExpressionValue(method = "getConversionWeight", at = @At(value = "MIXINEXTRAS:EXPRESSION"))
    private boolean checkUnboundedGeneric(boolean original, @Local(argsOnly = true) TypeInfo target){
        if (!original && target instanceof VariableTypeInfo vti) {
            return !vti.shouldConvert();
        } else {
            return original;
        }
    }