static { metas = new ObjectSet<>(); META = new ObjectMap<>(); PMETA = new ObjectMap<>(); METATABLES = new ObjectMap<>(); GLOBAL_METATABLE = new ObjectMap<>(); EMPTY_METATABLE = new LuaTable(); // Metamethods implementation for all LuaObjectValues. GLOBAL_METATABLE.put( LuaValue.EQ.tojstring(), LuaUtil.asFunction( vargs -> { if (vargs.isnil(2)) { // We'll still get called for nil. Automagically return false for nil. return LuaValue.valueOf(false); } // obj1, us, is guaranteed to be an object value LuaObjectValue<? super Object> obj1 = (LuaObjectValue<? super Object>) vargs.arg(1); LuaValue obj2 = vargs.arg(2); if (obj2 instanceof LuaObjectValue) { return LuaValue.valueOf( obj1.getObject() == ((LuaObjectValue<? super Object>) obj2).getObject()); } return LuaValue.valueOf(false); })); loadMeta(LuaAudioDataMeta.class); loadMeta(LuaAudioMeta.class); loadMeta(LuaAudioPlayableMeta.class); loadMeta(LuaColliderMeta.class); loadMeta(LuaColorMeta.class); loadMeta(LuaDestructibleMeta.class); loadMeta(LuaEnvironmentMeta.class); loadMeta(LuaEventListenerMeta.class); loadMeta(LuaFontMeta.class); loadMeta(LuaIdentifiableMeta.class); loadMeta(LuaInputDataMeta.class); loadMeta(LuaLayerableMeta.class); loadMeta(LuaMusicMeta.class); loadMeta(LuaOverworldControllerMeta.class); loadMeta(LuaPositionableMeta.class); loadMeta(LuaPressDataMeta.class); loadMeta(LuaProcessableMeta.class); loadMeta(LuaRenderableMeta.class); loadMeta(LuaSchedulerMeta.class); loadMeta(LuaSoundDataMeta.class); loadMeta(LuaSoundMeta.class); loadMeta(LuaSpriteMeta.class); loadMeta(LuaSubsystemMeta.class); loadMeta(LuaTextComponentMeta.class); loadMeta(LuaTextMeta.class); loadMeta(LuaTextStyleMeta.class); loadMeta(LuaTransformMeta.class); loadMeta(LuaUIComponentMeta.class); loadMeta(LuaUIControllerMeta.class); loadMeta(LuaUIObjectMeta.class); loadMeta(LuaWorldObjectMeta.class); loadMeta(new LuaWorldRoomMeta(Undertailor.getInstance())); log.info("Finished loading lua object metadata"); log.info("Primary types list: "); Lua.PMETA .values() .forEach( meta -> { log.info(meta.getClass().getSimpleName()); }); }