IndexOutOfBoundsException on Rhino 77
pietro-lopes opened this issue ยท 1 comments
I'm crashing here.
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;
}
}