diff --git a/gradle.properties b/gradle.properties index db2f903..4e1cdf3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=l2core mod_name=L2Core mod_license=LGPL-2.1 -mod_version=3.0.5-pre40 +mod_version=3.0.6-pre10 mod_group_id=dev.xkmc mod_authors=lcy0x1 mod_description=Core Library mod for all L2 mods diff --git a/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java b/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java index 25a5212..c352ef0 100644 --- a/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java +++ b/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java @@ -3,7 +3,9 @@ package dev.xkmc.l2core.compat.patchouli; import com.tterrag.registrate.providers.ProviderType; import com.tterrag.registrate.util.DataIngredient; import dev.xkmc.l2core.init.reg.registrate.L2Registrate; +import dev.xkmc.l2core.serial.advancements.RewardBuilder; import dev.xkmc.l2core.serial.recipe.ConditionalRecipeWrapper; +import net.minecraft.core.registries.Registries; import net.minecraft.data.recipes.RecipeBuilder; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; @@ -34,13 +36,15 @@ public class PatchouliHelper { } private final L2Registrate reg; - private final ResourceLocation book; + public final ResourceLocation book; + public final RewardBuilder reward; private ResourceLocation model; public PatchouliHelper(L2Registrate reg, String name) { this.reg = reg; - book = ResourceLocation.fromNamespaceAndPath(reg.getModid(), name); + book = reg.loc(name); + reward = new RewardBuilder(reg, 0, ResourceKey.create(Registries.LOOT_TABLE, book), () -> PatchouliHelper.getBookLoot(book)); } public PatchouliHelper buildModel() { diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/DataGenHolder.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/DataGenHolder.java new file mode 100644 index 0000000..fbb83c0 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/DataGenHolder.java @@ -0,0 +1,74 @@ +package dev.xkmc.l2core.init.reg.ench; + +import com.mojang.datafixers.util.Either; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderOwner; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; + +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Stream; + +public record DataGenHolder(ResourceKey key, T val) implements Holder { + @Override + public T value() { + return val; + } + + @Override + public boolean isBound() { + return true; + } + + @Override + public boolean is(ResourceLocation pLocation) { + return false; + } + + @Override + public boolean is(ResourceKey pResourceKey) { + return false; + } + + @Override + public boolean is(Predicate> pPredicate) { + return false; + } + + @Override + public boolean is(TagKey pTagKey) { + return false; + } + + @Override + public boolean is(Holder pHolder) { + return false; + } + + @Override + public Stream> tags() { + return Stream.empty(); + } + + @Override + public Either, T> unwrap() { + return Either.left(key()); + } + + @Override + public Optional> unwrapKey() { + return Optional.of(key); + } + + @Override + public Kind kind() { + return Kind.REFERENCE; + } + + @Override + public boolean canSerializeIn(HolderOwner pOwner) { + return true; + } +} diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java index 6ca86ad..af79c14 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java @@ -5,6 +5,7 @@ import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Unit; import net.minecraft.world.item.ItemStack; @@ -62,6 +63,11 @@ public interface EECVal extends Val { @@ -83,6 +89,11 @@ public interface EECVal extends Val extends Val extends Val DeferredHolder, DataComponentType> reg(String id, Codec codec) { diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java index 0b82ffc..9306e7f 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchVal.java @@ -1,6 +1,7 @@ package dev.xkmc.l2core.init.reg.ench; -import cpw.mods.util.Lazy; +import com.tterrag.registrate.providers.RegistrateProvider; +import dev.xkmc.l2core.util.DataGenOnly; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.Registries; @@ -15,6 +16,7 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.ItemEnchantments; import net.neoforged.neoforge.common.CommonHooks; import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.util.Lazy; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -28,6 +30,9 @@ public interface EnchVal { ResourceKey id(); + @DataGenOnly + Holder datagenDirect(RegistrateProvider pvd); + default Holder holder() { return Optional.ofNullable(CommonHooks.resolveLookup(Registries.ENCHANTMENT)).orElseThrow().getOrThrow(id()); } @@ -42,6 +47,14 @@ public interface EnchVal { interface Impl extends EnchVal { Lazy builder(); + + @Override + default Holder datagenDirect(RegistrateProvider pvd) { + var val = builder().get().cache; + if (val == null) throw new IllegalStateException("Enchantment is not built yet"); + return new DataGenHolder<>(id(), val); + } + } interface Flag extends EnchVal { @@ -71,6 +84,8 @@ public interface EnchVal { final List> tags = new ArrayList<>(); + private Enchantment cache; + Builder(ResourceLocation id) { this.id = id; supported = primary = new HolderSetBuilder.Simple<>(Tags.Items.ENCHANTABLES); @@ -156,14 +171,17 @@ public interface EnchVal { Enchantment build(BootstrapContext ctx, ResourceLocation id) { var items = ctx.registryLookup(Registries.ITEM).orElseThrow(); - var enchs = ctx.registryLookup(Registries.ENCHANTMENT).orElseThrow(); + var enchs = ctx.lookup(Registries.ENCHANTMENT); + var fakeItem = new FakeRegistryLookup<>(Registries.ITEM); + var fakeEnch = new FakeRegistryLookup<>(Registries.ENCHANTMENT); var ans = Enchantment.enchantment(new Enchantment.EnchantmentDefinition( - supported.build(items), Optional.of(primary.build(items)), + supported.build(fakeItem, items), Optional.of(primary.build(fakeItem, items)), weight, maxLevel, min, max, anvilCost, group == null ? List.of() : List.of(group))); - if (exclude != null) ans.exclusiveWith(exclude.build(enchs)); + if (exclude != null) ans.exclusiveWith(exclude.build(fakeEnch, enchs)); for (var e : effects) e.accept(ans); - return ans.build(id); + cache = ans.build(id); + return cache; } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/FakeRegistryLookup.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/FakeRegistryLookup.java new file mode 100644 index 0000000..1aeae53 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/FakeRegistryLookup.java @@ -0,0 +1,44 @@ +package dev.xkmc.l2core.init.reg.ench; + +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.*; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; + +import java.util.Optional; +import java.util.stream.Stream; + +public record FakeRegistryLookup(ResourceKey> key) + implements HolderLookup.RegistryLookup { + + @Override + public Lifecycle registryLifecycle() { + return Lifecycle.stable(); + } + + @Override + public Stream> listElements() { + return Stream.empty(); + } + + @Override + public Stream> listTags() { + return Stream.empty(); + } + + @Override + public Optional> get(ResourceKey pResourceKey) { + return Optional.empty(); + } + + @Override + public Optional> get(TagKey pTagKey) { + return Optional.empty(); + } + + @Override + public boolean canSerializeIn(HolderOwner pOwner) { + return true; + } + +} diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/HolderSetBuilder.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/HolderSetBuilder.java index 6d142c1..ee1ecf4 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/ench/HolderSetBuilder.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/HolderSetBuilder.java @@ -1,6 +1,6 @@ package dev.xkmc.l2core.init.reg.ench; -import net.minecraft.core.HolderLookup; +import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderSet; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; @@ -37,12 +37,12 @@ public interface HolderSetBuilder { return new Any<>(); } - HolderSet build(HolderLookup.RegistryLookup pvd); + HolderSet build(FakeRegistryLookup reg, HolderGetter pvd); record Simple(TagKey tag) implements HolderSetBuilder { @Override - public HolderSet build(HolderLookup.RegistryLookup pvd) { + public HolderSet build(FakeRegistryLookup reg, HolderGetter pvd) { return pvd.getOrThrow(tag); } @@ -51,7 +51,7 @@ public interface HolderSetBuilder { record Direct(ResourceKey key) implements HolderSetBuilder { @Override - public HolderSet build(HolderLookup.RegistryLookup pvd) { + public HolderSet build(FakeRegistryLookup reg, HolderGetter pvd) { return HolderSet.direct(pvd.getOrThrow(key)); } @@ -60,8 +60,8 @@ public interface HolderSetBuilder { record Or(List> list) implements HolderSetBuilder { @Override - public HolderSet build(HolderLookup.RegistryLookup pvd) { - return new OrHolderSet<>(list.stream().map(e -> e.build(pvd)).toList()); + public HolderSet build(FakeRegistryLookup reg, HolderGetter pvd) { + return new OrHolderSet<>(list.stream().map(e -> e.build(reg, pvd)).toList()); } } @@ -69,8 +69,8 @@ public interface HolderSetBuilder { record And(List> list) implements HolderSetBuilder { @Override - public HolderSet build(HolderLookup.RegistryLookup pvd) { - return new AndHolderSet<>(list.stream().map(e -> e.build(pvd)).toList()); + public HolderSet build(FakeRegistryLookup reg, HolderGetter pvd) { + return new AndHolderSet<>(list.stream().map(e -> e.build(reg, pvd)).toList()); } } @@ -78,8 +78,8 @@ public interface HolderSetBuilder { record Not(HolderSetBuilder val) implements HolderSetBuilder { @Override - public HolderSet build(HolderLookup.RegistryLookup pvd) { - return new NotHolderSet<>(pvd, val.build(pvd)); + public HolderSet build(FakeRegistryLookup reg, HolderGetter pvd) { + return new NotHolderSet<>(reg, val.build(reg, pvd)); } } @@ -87,8 +87,8 @@ public interface HolderSetBuilder { record Any() implements HolderSetBuilder { @Override - public HolderSet build(HolderLookup.RegistryLookup pvd) { - return new AnyHolderSet<>(pvd); + public HolderSet build(FakeRegistryLookup reg, HolderGetter pvd) { + return new AnyHolderSet<>(reg); } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/AttReg.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/AttReg.java index bfa2247..fca8f3b 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/AttReg.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/AttReg.java @@ -55,6 +55,11 @@ public record AttReg(DeferredRegister> att) { return val.get(); } + @Override + public ResourceLocation id() { + return val.getId(); + } + } private record CapValImpl>( @@ -66,6 +71,11 @@ public record AttReg(DeferredRegister> att) { return val.get(); } + @Override + public ResourceLocation id() { + return val.getId(); + } + } private record PlayerValImpl>( @@ -77,6 +87,11 @@ public record AttReg(DeferredRegister> att) { return val.get(); } + @Override + public ResourceLocation id() { + return val.getId(); + } + } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/CdcReg.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/CdcReg.java index d661788..3c0fed2 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/CdcReg.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/CdcReg.java @@ -3,6 +3,7 @@ package dev.xkmc.l2core.init.reg.simple; import com.mojang.serialization.MapCodec; import dev.xkmc.l2serial.serialization.codec.MapCodecAdaptor; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -27,6 +28,12 @@ public record CdcReg(DeferredRegister> reg) { public MapCodec get() { return val.get(); } + + @Override + public ResourceLocation id() { + return val.getId(); + } + } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java index 8cbcced..b07949b 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java @@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Unit; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.registries.DeferredHolder; @@ -75,6 +76,12 @@ public record DCReg(DeferredRegister> reg) { public DataComponentType get() { return val.get(); } + + @Override + public ResourceLocation id() { + return val.getId(); + } + } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/IngReg.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/IngReg.java index 8169644..61e861a 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/IngReg.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/IngReg.java @@ -2,6 +2,7 @@ package dev.xkmc.l2core.init.reg.simple; import com.mojang.serialization.MapCodec; import dev.xkmc.l2serial.serialization.codec.MapCodecAdaptor; +import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.common.crafting.ICustomIngredient; import net.neoforged.neoforge.common.crafting.IngredientType; import net.neoforged.neoforge.registries.DeferredHolder; @@ -30,6 +31,12 @@ public record IngReg(DeferredRegister> reg) { return val.get(); } + @Override + public ResourceLocation id() { + return val.getId(); + } + + } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java index e0b34f1..be7cce0 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java @@ -34,6 +34,11 @@ public record SR(DeferredRegister reg) { return val.get(); } + @Override + public ResourceLocation id() { + return val.getId(); + } + } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java index 1e34771..9f75810 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java @@ -1,6 +1,7 @@ package dev.xkmc.l2core.init.reg.simple; import com.tterrag.registrate.util.entry.RegistryEntry; +import net.minecraft.resources.ResourceLocation; import java.util.function.Supplier; @@ -8,6 +9,8 @@ public interface Val extends Supplier { T get(); + ResourceLocation id(); + record Registrate(RegistryEntry entry) implements Val { @Override @@ -15,6 +18,11 @@ public interface Val extends Supplier { return entry.get(); } + @Override + public ResourceLocation id() { + return entry.getId(); + } + } } diff --git a/src/main/java/dev/xkmc/l2core/mixin/ConfigTrackerAccessor.java b/src/main/java/dev/xkmc/l2core/mixin/ConfigTrackerAccessor.java deleted file mode 100644 index f35a9f6..0000000 --- a/src/main/java/dev/xkmc/l2core/mixin/ConfigTrackerAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.xkmc.l2core.mixin; - -import net.neoforged.fml.config.ConfigTracker; -import net.neoforged.fml.config.ModConfig; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.concurrent.ConcurrentHashMap; - -@Mixin(ConfigTracker.class) -public interface ConfigTrackerAccessor { - - @Accessor - public ConcurrentHashMap getFileMap(); - -} diff --git a/src/main/java/dev/xkmc/l2core/serial/advancements/AdvancementGenerator.java b/src/main/java/dev/xkmc/l2core/serial/advancements/AdvancementGenerator.java index 382d015..41e8103 100644 --- a/src/main/java/dev/xkmc/l2core/serial/advancements/AdvancementGenerator.java +++ b/src/main/java/dev/xkmc/l2core/serial/advancements/AdvancementGenerator.java @@ -93,11 +93,11 @@ public class AdvancementGenerator { return sub; } - public Entry patchouli(L2Registrate reg, CriterionBuilder builder, ResourceLocation book, String title, String desc) { - ItemStack stack = PatchouliHelper.getBook(book); + public Entry patchouli(L2Registrate reg, CriterionBuilder builder, PatchouliHelper pat, String title, String desc) { + ItemStack stack = PatchouliHelper.getBook(pat.book); return create("patchouli", stack, builder, title, desc) .add(new ModLoadedAdv("patchouli")) - .add(new RewardBuilder(reg, 0, ResourceKey.create(Registries.LOOT_TABLE, book), () -> PatchouliHelper.getBookLoot(book))); + .add(pat.reward); } public Entry root() { diff --git a/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java b/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java index 8241db5..c72af98 100644 --- a/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java +++ b/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java @@ -1,19 +1,38 @@ package dev.xkmc.l2core.serial.configval; -import dev.xkmc.l2core.mixin.ConfigTrackerAccessor; +import dev.xkmc.l2core.init.L2Core; +import dev.xkmc.l2serial.util.Wrappers; import net.neoforged.fml.config.ConfigTracker; +import net.neoforged.fml.config.ModConfig; import net.neoforged.neoforge.common.ModConfigSpec; import java.util.List; +import java.util.Map; import java.util.Optional; public class AbstractConfigParser { + private static Map getMap() { + try { + return Wrappers.cast(ConfigTracker.class.getDeclaredField("fileMap").get(ConfigTracker.INSTANCE)); + } catch (Exception e) { + L2Core.LOGGER.throwing(e); + return Map.of(); + } + } + public static Optional parse(String path, List line) { - var file = ((ConfigTrackerAccessor) ConfigTracker.INSTANCE).getFileMap().get(path); - if (file == null) return Optional.empty(); + var map = getMap(); + var file = map.get(path); + if (file == null) { + L2Core.LOGGER.warn("File {} is not a config file", path); + return Optional.empty(); + } var spec = file.getSpec(); - if (!(spec instanceof ModConfigSpec modSpec) || !modSpec.isLoaded()) return Optional.empty(); + if (!(spec instanceof ModConfigSpec modSpec) || !modSpec.isLoaded()){ + L2Core.LOGGER.warn("File {} is not a loaded config file", path); + return Optional.empty(); + } return Optional.ofNullable(modSpec.getValues().get(line)); } diff --git a/src/main/java/dev/xkmc/l2core/serial/recipe/RecSerializer.java b/src/main/java/dev/xkmc/l2core/serial/recipe/RecSerializer.java index d07147f..5c86f3d 100644 --- a/src/main/java/dev/xkmc/l2core/serial/recipe/RecSerializer.java +++ b/src/main/java/dev/xkmc/l2core/serial/recipe/RecSerializer.java @@ -6,7 +6,6 @@ import dev.xkmc.l2serial.serialization.codec.MapCodecAdaptor; import dev.xkmc.l2serial.util.Wrappers; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeInput; import net.minecraft.world.item.crafting.RecipeSerializer; @@ -35,8 +34,7 @@ public class RecSerializer, I extends RecipeInput> implement @SuppressWarnings("ConstantConditions") public R blank() { - return Wrappers.get(() -> cls.getConstructor(ResourceLocation.class) - .newInstance(ResourceLocation.withDefaultNamespace("dummy"))); + return Wrappers.get(() -> cls.getConstructor().newInstance()); } } diff --git a/src/main/java/dev/xkmc/l2core/util/ConfigInit.java b/src/main/java/dev/xkmc/l2core/util/ConfigInit.java index f5ced51..b8d7098 100644 --- a/src/main/java/dev/xkmc/l2core/util/ConfigInit.java +++ b/src/main/java/dev/xkmc/l2core/util/ConfigInit.java @@ -54,8 +54,11 @@ public class ConfigInit { val.path = path; RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> initClient(mod)); reg.initConfigTitle(mod); - reg.addRawLang(reg.getModid() + ".configuration.section." + path.replaceAll("[-_/]", ".") + ".title", - mod.getModInfo().getDisplayName() + " " + RegistrateLangProvider.toEnglishName(type.extension()) + " Configuration"); + String typeName = RegistrateLangProvider.toEnglishName(type.extension()); + String fileName = reg.getModid() + ".configuration.section." + path.replaceAll("[-_/]", "."); + String title = mod.getModInfo().getDisplayName() + " " + typeName + " Configuration"; + reg.addRawLang(fileName, title); + reg.addRawLang(fileName + ".title", title); } private static void initClient(ModContainer mod) { diff --git a/src/main/resources/l2core.mixins.json b/src/main/resources/l2core.mixins.json index 0b85140..2c6ac9c 100644 --- a/src/main/resources/l2core.mixins.json +++ b/src/main/resources/l2core.mixins.json @@ -4,7 +4,6 @@ "package": "dev.xkmc.l2core.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ - "ConfigTrackerAccessor" ], "client": [ ],