From cc9b33b47335ddb7be29a007de3f7e364fdc1859 Mon Sep 17 00:00:00 2001 From: fscan Date: Fri, 20 Oct 2017 23:54:18 +0200 Subject: [PATCH] Implement Advancements (#3160) Improvements welcome. --- .../bootstrap/ICriterionTriggerRegistry.java | 30 +++ .../gui/implementations/GuiMEMonitorable.java | 2 +- src/main/java/appeng/core/AppEng.java | 6 + src/main/java/appeng/core/Registration.java | 43 ++++- .../stats/AchievementCraftingHandler.java | 73 -------- .../core/stats/AchievementHierarchy.java | 61 ------ .../core/stats/AchievementPickupHandler.java | 64 ------- .../java/appeng/core/stats/Achievements.java | 173 ----------------- .../core/stats/AdvancementTriggers.java | 59 ++++++ .../core/stats/AppEngAdvancementTrigger.java | 174 ++++++++++++++++++ ...mentType.java => IAdvancementTrigger.java} | 12 +- .../appeng/core/stats/PartItemPredicate.java | 70 +++++++ .../core/stats/PlayerDifferentiator.java | 52 ------ .../core/stats/PlayerStatsRegistration.java | 115 ------------ src/main/java/appeng/core/stats/Stats.java | 16 +- src/main/java/appeng/core/sync/GuiBridge.java | 49 +---- .../java/appeng/me/cache/PathGridCache.java | 31 ++-- .../appeng/parts/misc/PartStorageBus.java | 1 - .../java/appeng/spatial/StorageHelper.java | 4 +- .../java/appeng/tile/storage/TileChest.java | 1 - .../advancements/main/cable_glass.json | 23 +++ .../advancements/main/charged_quartz.json | 24 +++ .../advancements/main/charger.json | 22 +++ .../advancements/main/compass.json | 20 ++ .../advancements/main/controller.json | 22 +++ .../advancements/main/crafting_cpu.json | 55 ++++++ .../advancements/main/crafting_terminal.json | 23 +++ .../advancements/main/facade.json | 20 ++ .../advancements/main/fluix.json | 24 +++ .../advancements/main/growth_accelerator.json | 22 +++ .../advancements/main/interface.json | 22 +++ .../advancements/main/ioport.json | 22 +++ .../advancements/main/network1.json | 15 ++ .../advancements/main/network2.json | 15 ++ .../advancements/main/network3.json | 15 ++ .../advancements/main/network_tool.json | 20 ++ .../advancements/main/p2p.json | 23 +++ .../advancements/main/pattern_terminal.json | 23 +++ .../advancements/main/portable_cell.json | 20 ++ .../advancements/main/presses.json | 53 ++++++ .../advancements/main/qnb.json | 22 +++ .../advancements/main/root.json | 26 +++ .../advancements/main/spatial_explorer.json | 15 ++ .../advancements/main/spatial_ioport.json | 22 +++ .../advancements/main/storage_bus.json | 23 +++ .../advancements/main/storage_cell.json | 55 ++++++ .../appliedenergistics2/lang/en_us.lang | 2 + 47 files changed, 1062 insertions(+), 622 deletions(-) create mode 100644 src/main/java/appeng/bootstrap/ICriterionTriggerRegistry.java delete mode 100644 src/main/java/appeng/core/stats/AchievementCraftingHandler.java delete mode 100644 src/main/java/appeng/core/stats/AchievementHierarchy.java delete mode 100644 src/main/java/appeng/core/stats/AchievementPickupHandler.java delete mode 100644 src/main/java/appeng/core/stats/Achievements.java create mode 100644 src/main/java/appeng/core/stats/AdvancementTriggers.java create mode 100644 src/main/java/appeng/core/stats/AppEngAdvancementTrigger.java rename src/main/java/appeng/core/stats/{AchievementType.java => IAdvancementTrigger.java} (78%) create mode 100644 src/main/java/appeng/core/stats/PartItemPredicate.java delete mode 100644 src/main/java/appeng/core/stats/PlayerDifferentiator.java delete mode 100644 src/main/java/appeng/core/stats/PlayerStatsRegistration.java create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/cable_glass.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/charged_quartz.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/charger.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/compass.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/controller.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/crafting_cpu.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/crafting_terminal.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/facade.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/fluix.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/growth_accelerator.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/interface.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/ioport.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/network1.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/network2.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/network3.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/network_tool.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/p2p.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/pattern_terminal.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/portable_cell.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/presses.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/qnb.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/root.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/spatial_explorer.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/spatial_ioport.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/storage_bus.json create mode 100644 src/main/resources/assets/appliedenergistics2/advancements/main/storage_cell.json diff --git a/src/main/java/appeng/bootstrap/ICriterionTriggerRegistry.java b/src/main/java/appeng/bootstrap/ICriterionTriggerRegistry.java new file mode 100644 index 00000000..c62ab00f --- /dev/null +++ b/src/main/java/appeng/bootstrap/ICriterionTriggerRegistry.java @@ -0,0 +1,30 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2017, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.bootstrap; + + +import net.minecraft.advancements.ICriterionInstance; +import net.minecraft.advancements.ICriterionTrigger; + + +@FunctionalInterface +public interface ICriterionTriggerRegistry +{ + void register( ICriterionTrigger trigger ); +} diff --git a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java index 8843ed5c..ec9a9d92 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java +++ b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java @@ -319,7 +319,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi final Enum searchModeSetting = AEConfig.instance().getConfigManager().getSetting( Settings.SEARCH_MODE ); final boolean isAutoFocus = SearchBoxMode.AUTOSEARCH == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH == searchModeSetting || SearchBoxMode.AUTOSEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH_KEEP == searchModeSetting; - final boolean isManualFocus = SearchBoxMode.MANUAL_SEARCH == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH == searchModeSetting || SearchBoxMode.MANUAL_SEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH_KEEP == searchModeSetting; + final boolean isManualFocus = SearchBoxMode.MANUAL_SEARCH == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH == searchModeSetting || SearchBoxMode.MANUAL_SEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH_KEEP == searchModeSetting; final boolean isKeepFilter = SearchBoxMode.AUTOSEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_AUTOSEARCH_KEEP == searchModeSetting || SearchBoxMode.MANUAL_SEARCH_KEEP == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH_KEEP == searchModeSetting; final boolean isJEIEnabled = SearchBoxMode.JEI_AUTOSEARCH == searchModeSetting || SearchBoxMode.JEI_MANUAL_SEARCH == searchModeSetting; diff --git a/src/main/java/appeng/core/AppEng.java b/src/main/java/appeng/core/AppEng.java index cf2a7131..69a977b5 100644 --- a/src/main/java/appeng/core/AppEng.java +++ b/src/main/java/appeng/core/AppEng.java @@ -51,6 +51,7 @@ import appeng.core.crash.CrashInfo; import appeng.core.crash.IntegrationCrashEnhancement; import appeng.core.crash.ModCrashEnhancement; import appeng.core.features.AEFeature; +import appeng.core.stats.AdvancementTriggers; import appeng.core.sync.GuiBridge; import appeng.core.sync.network.NetworkHandler; import appeng.core.worlddata.WorldData; @@ -141,6 +142,11 @@ public final class AppEng return this.registration.storageDimensionID; } + public AdvancementTriggers getAdvancementTriggers() + { + return this.registration.advancementTriggers; + } + @EventHandler private void preInit( final FMLPreInitializationEvent event ) { diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index efa6eeaf..04b7f9c7 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -20,6 +20,8 @@ package appeng.core; import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; @@ -27,6 +29,9 @@ import javax.annotation.Nonnull; import com.google.common.base.Preconditions; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.advancements.ICriterionInstance; +import net.minecraft.advancements.ICriterionTrigger; import net.minecraft.block.Block; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -49,6 +54,7 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.ReflectionHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.registries.IForgeRegistry; @@ -72,6 +78,7 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.networking.ticking.ITickManager; import appeng.api.parts.IPartHelper; import appeng.api.recipes.IRecipeHandler; +import appeng.bootstrap.ICriterionTriggerRegistry; import appeng.bootstrap.IModelRegistry; import appeng.bootstrap.components.IBlockRegistrationComponent; import appeng.bootstrap.components.IInitComponent; @@ -88,7 +95,9 @@ import appeng.core.features.registries.cell.BasicCellHandler; import appeng.core.features.registries.cell.CreativeCellHandler; import appeng.core.localization.GuiText; import appeng.core.localization.PlayerMessages; -import appeng.core.stats.PlayerStatsRegistration; +import appeng.core.stats.AdvancementTriggers; +import appeng.core.stats.PartItemPredicate; +import appeng.core.stats.Stats; import appeng.core.worlddata.SpatialDimensionManager; import appeng.hooks.TickHandler; import appeng.items.materials.ItemMaterial; @@ -131,6 +140,7 @@ final class Registration DimensionType storageDimensionType; int storageDimensionID; Biome storageBiome; + AdvancementTriggers advancementTriggers; private File recipeDirectory; private CustomRecipeConfig customRecipeConfig; @@ -286,9 +296,9 @@ final class Registration registries.matterCannon().registerAmmo( ammoStack, weight ); } ); - final PlayerStatsRegistration registration = new PlayerStatsRegistration( MinecraftForge.EVENT_BUS, AEConfig.instance() ); - registration.registerAchievementHandlers(); - registration.registerAchievements(); + PartItemPredicate.register(); + Stats.register(); + this.advancementTriggers = new AdvancementTriggers( new CriterionTrigggerRegistry() ); } @SubscribeEvent @@ -581,4 +591,29 @@ final class Registration } } + private static class CriterionTrigggerRegistry implements ICriterionTriggerRegistry + { + private Method method; + + CriterionTrigggerRegistry() + { + this.method = ReflectionHelper.findMethod( CriteriaTriggers.class, "register", "func_192118_a", ICriterionTrigger.class ); + method.setAccessible( true ); + } + + @Override + public void register( ICriterionTrigger trigger ) + { + try + { + method.invoke( null, trigger ); + } + catch( IllegalAccessException | IllegalArgumentException | InvocationTargetException e ) + { + AELog.debug( e ); + } + } + + } + } diff --git a/src/main/java/appeng/core/stats/AchievementCraftingHandler.java b/src/main/java/appeng/core/stats/AchievementCraftingHandler.java deleted file mode 100644 index 90f09bc1..00000000 --- a/src/main/java/appeng/core/stats/AchievementCraftingHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.stats; - - -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent; - -import appeng.util.Platform; - - -/** - * handles the achievement when an {@link net.minecraft.item.Item} is crafted by a player. - * The achievement is only added if its a real {@link net.minecraft.entity.player.EntityPlayer}. - * - * @author thatsIch - * @since rv2 - */ -public class AchievementCraftingHandler -{ - private final PlayerDifferentiator differentiator; - - public AchievementCraftingHandler( final PlayerDifferentiator differentiator ) - { - this.differentiator = differentiator; - } - - @SubscribeEvent - public void onPlayerCraftingEvent( final PlayerEvent.ItemCraftedEvent event ) - { - if( this.differentiator.isNoPlayer( event.player ) || event.crafting.isEmpty() ) - { - return; - } - - for( final Achievements achievement : Achievements.values() ) - { - switch( achievement.getType() ) - { - case Craft: - if( Platform.itemComparisons().isSameItem( achievement.getStack(), event.crafting ) ) - { - achievement.addToPlayer( event.player ); - return; - } - break; - case CraftItem: - if( achievement.getStack() != null && achievement.getStack().getItem().getClass() == event.crafting.getItem().getClass() ) - { - achievement.addToPlayer( event.player ); - return; - } - default: - } - } - } -} diff --git a/src/main/java/appeng/core/stats/AchievementHierarchy.java b/src/main/java/appeng/core/stats/AchievementHierarchy.java deleted file mode 100644 index 2f605c2b..00000000 --- a/src/main/java/appeng/core/stats/AchievementHierarchy.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.stats; - - -/** - * Hierarchy of the AE2 achievements - * - * @author thatsIch - * @since rv2 - */ -public class AchievementHierarchy -{ - /** - * Setup hierarchy through assigning parents. - */ - void registerAchievementHierarchy() - { - // Achievements.Presses.setParent( Achievements.Compass ); - // - // Achievements.Fluix.setParent( Achievements.ChargedQuartz ); - // - // Achievements.Charger.setParent( Achievements.Fluix ); - // - // Achievements.CrystalGrowthAccelerator.setParent( Achievements.Charger ); - // - // Achievements.GlassCable.setParent( Achievements.Charger ); - // - // Achievements.SpatialIOExplorer.setParent( Achievements.SpatialIO ); - // - // Achievements.IOPort.setParent( Achievements.StorageCell ); - // - // Achievements.PatternTerminal.setParent( Achievements.CraftingTerminal ); - // - // Achievements.Controller.setParent( Achievements.Networking1 ); - // - // Achievements.Networking2.setParent( Achievements.Controller ); - // - // Achievements.Networking3.setParent( Achievements.Networking2 ); - // - // Achievements.P2P.setParent( Achievements.Controller ); - // - // Achievements.Recursive.setParent( Achievements.Controller ); - } -} diff --git a/src/main/java/appeng/core/stats/AchievementPickupHandler.java b/src/main/java/appeng/core/stats/AchievementPickupHandler.java deleted file mode 100644 index a00a883b..00000000 --- a/src/main/java/appeng/core/stats/AchievementPickupHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.stats; - - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent; - -import appeng.util.Platform; - - -/** - * handles the achievement when an {@link net.minecraft.item.Item} is picked up by a player. - * The achievement is only added if its a real {@link net.minecraft.entity.player.EntityPlayer}. - * - * @author thatsIch - * @since rv2 - */ -public class AchievementPickupHandler -{ - private final PlayerDifferentiator differentiator; - - public AchievementPickupHandler( final PlayerDifferentiator differentiator ) - { - this.differentiator = differentiator; - } - - @SubscribeEvent - public void onItemPickUp( final PlayerEvent.ItemPickupEvent event ) - { - if( this.differentiator.isNoPlayer( event.player ) || event.pickedUp == null || event.pickedUp.getItem().isEmpty() ) - { - return; - } - - final ItemStack is = event.pickedUp.getItem(); - - for( final Achievements achievement : Achievements.values() ) - { - if( achievement.getType() == AchievementType.Pickup && Platform.itemComparisons().isSameItem( achievement.getStack(), is ) ) - { - achievement.addToPlayer( event.player ); - return; - } - } - } -} diff --git a/src/main/java/appeng/core/stats/Achievements.java b/src/main/java/appeng/core/stats/Achievements.java deleted file mode 100644 index d38aac37..00000000 --- a/src/main/java/appeng/core/stats/Achievements.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.stats; - - -import net.minecraft.advancements.Advancement; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import appeng.api.AEApi; -import appeng.api.definitions.IItemDefinition; -import appeng.api.util.AEColor; -import appeng.api.util.AEColoredItemDefinition; - - -public enum Achievements -{ - // done - Compass( -2, -4, AEApi.instance().definitions().blocks().skyCompass(), AchievementType.Craft ), - - // done - Presses( -2, -2, AEApi.instance().definitions().materials().logicProcessorPress(), AchievementType.Custom ), - - // done - SpatialIO( -4, -4, AEApi.instance().definitions().blocks().spatialIOPort(), AchievementType.Craft ), - - // done - SpatialIOExplorer( -4, -2, AEApi.instance().definitions().items().spatialCell128(), AchievementType.Custom ), - - // done - StorageCell( -6, -4, AEApi.instance().definitions().items().cell64k(), AchievementType.CraftItem ), - - // done - IOPort( -6, -2, AEApi.instance().definitions().blocks().iOPort(), AchievementType.Craft ), - - // done - CraftingTerminal( -8, -4, AEApi.instance().definitions().parts().craftingTerminal(), AchievementType.Craft ), - - // done - PatternTerminal( -8, -2, AEApi.instance().definitions().parts().patternTerminal(), AchievementType.Craft ), - - // done - ChargedQuartz( 0, -4, AEApi.instance().definitions().materials().certusQuartzCrystalCharged(), AchievementType.Pickup ), - - // done - Fluix( 0, -2, AEApi.instance().definitions().materials().fluixCrystal(), AchievementType.Pickup ), - - // done - Charger( 0, 0, AEApi.instance().definitions().blocks().charger(), AchievementType.Craft ), - - // done - CrystalGrowthAccelerator( -2, 0, AEApi.instance().definitions().blocks().quartzGrowthAccelerator(), AchievementType.Craft ), - - // done - GlassCable( 2, 0, AEApi.instance().definitions().parts().cableGlass(), AchievementType.Craft ), - - // done - Networking1( 4, -6, AEApi.instance().definitions().parts().cableCovered(), AchievementType.Custom ), - - // done - Controller( 4, -4, AEApi.instance().definitions().blocks().controller(), AchievementType.Craft ), - - // done - Networking2( 4, 0, AEApi.instance().definitions().parts().cableSmart(), AchievementType.Custom ), - - // done - Networking3( 4, 2, AEApi.instance().definitions().parts().cableDenseSmart(), AchievementType.Custom ), - - // done - P2P( 2, -2, AEApi.instance().definitions().parts().p2PTunnelME(), AchievementType.Craft ), - - // done - Recursive( 6, -2, AEApi.instance().definitions().blocks().iface(), AchievementType.Craft ), - - // done - CraftingCPU( 6, 0, AEApi.instance().definitions().blocks().craftingStorage64k(), AchievementType.CraftItem ), - - // done - Facade( 6, 2, AEApi.instance().definitions().items().facade(), AchievementType.CraftItem ), - - // done - NetworkTool( 8, 0, AEApi.instance().definitions().items().networkTool(), AchievementType.Craft ), - - // done - PortableCell( 8, 2, AEApi.instance().definitions().items().portableCell(), AchievementType.Craft ), - - // done - StorageBus( 10, 0, AEApi.instance().definitions().parts().storageBus(), AchievementType.Craft ), - - // done - QNB( 10, 2, AEApi.instance().definitions().blocks().quantumLink(), AchievementType.Craft ); - - private final ItemStack stack; - private final AchievementType type; - private final int x; - private final int y; - - private Advancement parent; - private Advancement stat; - - Achievements( final int x, final int y, final AEColoredItemDefinition which, final AchievementType type ) - { - this.stack = ( which != null ) ? which.stack( AEColor.TRANSPARENT, 1 ) : ItemStack.EMPTY; - this.type = type; - this.x = x; - this.y = y; - } - - Achievements( final int x, final int y, final IItemDefinition which, final AchievementType type ) - { - this.stack = which.maybeStack( 1 ).orElse( ItemStack.EMPTY ); - this.type = type; - this.x = x; - this.y = y; - } - - Achievements( final int x, final int y, final ItemStack which, final AchievementType type ) - { - this.stack = which; - this.type = type; - this.x = x; - this.y = y; - } - - void setParent( final Achievements parent ) - { - this.parent = parent.getAchievement(); - } - - public Advancement getAchievement() - { - // if( this.stat == null && !this.getStack().isEmpty() ) - // { - // this.stat = new Advancement( "achievement.ae2." + this.name(), "ae2." + this.name(), this.x, this.y, - // this.getStack(), this.parent ); - // this.stat.registerStat(); - // } - - return this.stat; - } - - public void addToPlayer( final EntityPlayer player ) - { - // player.addStat( this.getAchievement(), 1 ); - } - - AchievementType getType() - { - return this.type; - } - - ItemStack getStack() - { - return this.stack; - } - -} diff --git a/src/main/java/appeng/core/stats/AdvancementTriggers.java b/src/main/java/appeng/core/stats/AdvancementTriggers.java new file mode 100644 index 00000000..e654dc43 --- /dev/null +++ b/src/main/java/appeng/core/stats/AdvancementTriggers.java @@ -0,0 +1,59 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2017, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.core.stats; + + +import appeng.bootstrap.ICriterionTriggerRegistry; + + +public class AdvancementTriggers +{ + private AppEngAdvancementTrigger networkApprentice = new AppEngAdvancementTrigger( "network_apprentice" ); + private AppEngAdvancementTrigger networkEngineer = new AppEngAdvancementTrigger( "network_engineer" ); + private AppEngAdvancementTrigger networkAdmin = new AppEngAdvancementTrigger( "network_admin" ); + private AppEngAdvancementTrigger spatialExplorer = new AppEngAdvancementTrigger( "spatial_explorer" ); + + public AdvancementTriggers( ICriterionTriggerRegistry registry ) + { + registry.register( networkApprentice ); + registry.register( networkEngineer ); + registry.register( networkAdmin ); + registry.register( spatialExplorer ); + } + + public IAdvancementTrigger getNetworkApprentice() + { + return this.networkApprentice; + } + + public IAdvancementTrigger getNetworkEngineer() + { + return this.networkEngineer; + } + + public IAdvancementTrigger getNetworkAdmin() + { + return this.networkAdmin; + } + + public IAdvancementTrigger getSpatialExplorer() + { + return this.spatialExplorer; + } +} diff --git a/src/main/java/appeng/core/stats/AppEngAdvancementTrigger.java b/src/main/java/appeng/core/stats/AppEngAdvancementTrigger.java new file mode 100644 index 00000000..b93c08cd --- /dev/null +++ b/src/main/java/appeng/core/stats/AppEngAdvancementTrigger.java @@ -0,0 +1,174 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2017, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.core.stats; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; + +import net.minecraft.advancements.ICriterionTrigger; +import net.minecraft.advancements.PlayerAdvancements; +import net.minecraft.advancements.critereon.AbstractCriterionInstance; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.ResourceLocation; + +import appeng.core.AppEng; + + +public class AppEngAdvancementTrigger implements ICriterionTrigger, IAdvancementTrigger +{ + private final ResourceLocation ID; + private final Map listeners = new HashMap<>(); + + public AppEngAdvancementTrigger( String parString ) + { + super(); + ID = new ResourceLocation( AppEng.MOD_ID, parString ); + } + + @Override + public ResourceLocation getId() + { + return ID; + } + + @Override + public void addListener( PlayerAdvancements playerAdvancementsIn, ICriterionTrigger.Listener listener ) + { + AppEngAdvancementTrigger.Listeners l = this.listeners.get( playerAdvancementsIn ); + + if( l == null ) + { + l = new AppEngAdvancementTrigger.Listeners( playerAdvancementsIn ); + this.listeners.put( playerAdvancementsIn, l ); + } + + l.add( listener ); + } + + @Override + public void removeListener( PlayerAdvancements playerAdvancementsIn, ICriterionTrigger.Listener listener ) + { + AppEngAdvancementTrigger.Listeners l = this.listeners.get( playerAdvancementsIn ); + + if( l != null ) + { + l.remove( listener ); + + if( l.isEmpty() ) + { + this.listeners.remove( playerAdvancementsIn ); + } + } + } + + @Override + public void removeAllListeners( PlayerAdvancements playerAdvancementsIn ) + { + this.listeners.remove( playerAdvancementsIn ); + } + + @Override + public AppEngAdvancementTrigger.Instance deserializeInstance( JsonObject json, JsonDeserializationContext context ) + { + return new AppEngAdvancementTrigger.Instance( this.getId() ); + } + + public void trigger( EntityPlayerMP parPlayer ) + { + AppEngAdvancementTrigger.Listeners l = this.listeners.get( parPlayer.getAdvancements() ); + + if( l != null ) + { + l.trigger( parPlayer ); + } + } + + public static class Instance extends AbstractCriterionInstance + { + public Instance( ResourceLocation parID ) + { + super( parID ); + } + + public boolean test() + { + return true; + } + } + + static class Listeners + { + private final PlayerAdvancements playerAdvancements; + private final Set> listeners = new HashSet<>(); + + Listeners( PlayerAdvancements playerAdvancementsIn ) + { + this.playerAdvancements = playerAdvancementsIn; + } + + public boolean isEmpty() + { + return this.listeners.isEmpty(); + } + + public void add( ICriterionTrigger.Listener listener ) + { + this.listeners.add( listener ); + } + + public void remove( ICriterionTrigger.Listener listener ) + { + this.listeners.remove( listener ); + } + + public void trigger( EntityPlayerMP player ) + { + List> list = null; + + for( ICriterionTrigger.Listener listener : this.listeners ) + { + if( listener.getCriterionInstance().test() ) + { + if( list == null ) + { + list = new ArrayList<>(); + } + + list.add( listener ); + } + } + + if( list != null ) + { + for( ICriterionTrigger.Listener l : list ) + { + l.grantCriterion( this.playerAdvancements ); + } + } + } + } +} diff --git a/src/main/java/appeng/core/stats/AchievementType.java b/src/main/java/appeng/core/stats/IAdvancementTrigger.java similarity index 78% rename from src/main/java/appeng/core/stats/AchievementType.java rename to src/main/java/appeng/core/stats/IAdvancementTrigger.java index 2e90ba9c..e5563f3e 100644 --- a/src/main/java/appeng/core/stats/AchievementType.java +++ b/src/main/java/appeng/core/stats/IAdvancementTrigger.java @@ -1,6 +1,6 @@ /* * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * Copyright (c) 2013 - 2017, AlgorithmX2, All rights reserved. * * Applied Energistics 2 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -19,9 +19,11 @@ package appeng.core.stats; -public enum AchievementType +import net.minecraft.entity.player.EntityPlayerMP; + + +@FunctionalInterface +public interface IAdvancementTrigger { - - Craft, CraftItem, Pickup, Custom - + void trigger( EntityPlayerMP parPlayer ); } diff --git a/src/main/java/appeng/core/stats/PartItemPredicate.java b/src/main/java/appeng/core/stats/PartItemPredicate.java new file mode 100644 index 00000000..018b9963 --- /dev/null +++ b/src/main/java/appeng/core/stats/PartItemPredicate.java @@ -0,0 +1,70 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2017, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.core.stats; + + +import com.google.gson.JsonObject; + +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.item.ItemStack; +import net.minecraft.util.JsonUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.advancements.critereon.ItemPredicates; + +import appeng.core.AppEng; +import appeng.items.parts.ItemPart; +import appeng.items.parts.PartType; + + +public class PartItemPredicate extends ItemPredicate +{ + private final PartType partType; + + public PartItemPredicate( String partName ) + { + this.partType = PartType.valueOf( partName.toUpperCase() ); + } + + @Override + public boolean test( ItemStack item ) + { + if( ItemPart.instance != null && item.getItem() == ItemPart.instance ) + { + return ItemPart.instance.getTypeByStack( item ) == this.partType; + } + return false; + } + + public static ItemPredicate deserialize( JsonObject jsonobject ) + { + if( jsonobject.has( "part" ) ) + { + return new PartItemPredicate( JsonUtils.getString( jsonobject, "part" ) ); + } + else + { + return ItemPredicate.ANY; + } + } + + public static void register() + { + ItemPredicates.register( new ResourceLocation( AppEng.MOD_ID, "part" ), PartItemPredicate::deserialize ); + } +} diff --git a/src/main/java/appeng/core/stats/PlayerDifferentiator.java b/src/main/java/appeng/core/stats/PlayerDifferentiator.java deleted file mode 100644 index 28418751..00000000 --- a/src/main/java/appeng/core/stats/PlayerDifferentiator.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.stats; - - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.common.util.FakePlayer; - - -/** - * Can differentiate if a {@link net.minecraft.entity.player.EntityPlayer} is a real player or not - * - * @author thatsIch - * @since rv2 - */ -public class PlayerDifferentiator -{ - /** - * Can determine if an {@link net.minecraft.entity.player.EntityPlayer} is not a real player. - * This is based on if the - * - * @param player is: - * - null - * - dead - * - fake - * - * @param player to be checked player - * - * @return true if - * @param player is not a real player - */ - boolean isNoPlayer( final EntityPlayer player ) - { - return player == null || player.isDead || player instanceof FakePlayer; - } -} diff --git a/src/main/java/appeng/core/stats/PlayerStatsRegistration.java b/src/main/java/appeng/core/stats/PlayerStatsRegistration.java deleted file mode 100644 index 4c562957..00000000 --- a/src/main/java/appeng/core/stats/PlayerStatsRegistration.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is part of Applied Energistics 2. - * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. - * - * Applied Energistics 2 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Applied Energistics 2 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Applied Energistics 2. If not, see . - */ - -package appeng.core.stats; - - -import net.minecraftforge.fml.common.eventhandler.EventBus; - -import appeng.core.AEConfig; -import appeng.core.features.AEFeature; - - -/** - * Registers any items a player is picking up or is crafting. - * Registered items are added to the player stats. - * This will only happen if the {@link AEFeature#ACHIEVEMENTS} feature is enabled. - */ -public class PlayerStatsRegistration -{ - /** - * {@link net.minecraftforge.fml.common.eventhandler.EventBus} to which the handlers might get posted to depending - * if the feature is enabled - */ - private final EventBus bus; - - /** - * is true if the {@link appeng.core.features.AEFeature#ACHIEVEMENTS} is enabled in the - * - * @param config - */ - private final boolean isAchievementFeatureEnabled; - - /** - * Constructs this with an {@link net.minecraftforge.fml.common.eventhandler.EventBus} and - * {@link appeng.core.AEConfig}. - * - * @param bus {@see #bus} - * @param config {@link appeng.core.AEConfig} which is used to determine if the - * {@link appeng.core.features.AEFeature#ACHIEVEMENTS} is enabled - */ - public PlayerStatsRegistration( final EventBus bus, final AEConfig config ) - { - this.bus = bus; - this.isAchievementFeatureEnabled = config.isFeatureEnabled( AEFeature.ACHIEVEMENTS ); - } - - /** - * Registers the {@link appeng.core.stats.AchievementCraftingHandler} and - * {@link appeng.core.stats.AchievementPickupHandler} to the {@link #bus} if {@link #isAchievementFeatureEnabled} is - * true. - */ - public void registerAchievementHandlers() - { - if( this.isAchievementFeatureEnabled ) - { - final PlayerDifferentiator differentiator = new PlayerDifferentiator(); - final AchievementCraftingHandler craftingHandler = new AchievementCraftingHandler( differentiator ); - final AchievementPickupHandler pickupHandler = new AchievementPickupHandler( differentiator ); - - this.bus.register( craftingHandler ); - this.bus.register( pickupHandler ); - } - } - - /** - * Registers the {@link appeng.core.stats.AchievementHierarchy} and adds all {@link appeng.core.stats.Achievements} - * to a new {@link net.minecraft.advancements.Advancement}. - */ - public void registerAchievements() - { - if( this.isAchievementFeatureEnabled ) - { - final AchievementHierarchy hierarchy = new AchievementHierarchy(); - hierarchy.registerAchievementHierarchy(); - - for( final Stats s : Stats.values() ) - { - s.getStat(); - } - - /** - * register - */ - // final ArrayList list = new ArrayList(); - // - // for( final Achievements a : Achievements.values() ) - // { - // final Achievement ach = a.getAchievement(); - // if( ach != null ) - // { - // list.add( ach ); - // } - // } - // - // final AchievementPage ae2AchievementPage = new AchievementPage( "Applied Energistics 2", list.toArray( - // new Achievement[list.size()] ) ); - // AchievementPage.registerAchievementPage( ae2AchievementPage ); - } - } -} diff --git a/src/main/java/appeng/core/stats/Stats.java b/src/main/java/appeng/core/stats/Stats.java index 6743e8bc..12b0193b 100644 --- a/src/main/java/appeng/core/stats/Stats.java +++ b/src/main/java/appeng/core/stats/Stats.java @@ -44,18 +44,18 @@ public enum Stats public void addToPlayer( final EntityPlayer player, final int howMany ) { - player.addStat( this.getStat(), howMany ); + player.addStat( this.stat, howMany ); } - StatBasic getStat() + public static void register() { - if( this.stat == null ) + for( final Stats s : Stats.values() ) { - this.stat = new StatBasic( "stat.ae2." + this.name(), new TextComponentTranslation( "stat.ae2." + this.name() ) ); - this.stat.registerStat(); + if( s.stat == null ) + { + s.stat = new StatBasic( "stat.ae2." + s.name(), new TextComponentTranslation( "stat.ae2." + s.name() ) ); + s.stat.registerStat(); + } } - - return this.stat; } - } diff --git a/src/main/java/appeng/core/sync/GuiBridge.java b/src/main/java/appeng/core/sync/GuiBridge.java index 2cf9d1f2..954123ca 100644 --- a/src/main/java/appeng/core/sync/GuiBridge.java +++ b/src/main/java/appeng/core/sync/GuiBridge.java @@ -20,13 +20,9 @@ package appeng.core.sync; import java.lang.reflect.Constructor; -import java.util.List; - -import com.google.common.collect.Lists; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; @@ -36,8 +32,6 @@ import net.minecraftforge.fml.relauncher.ReflectionHelper; import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; -import appeng.api.definitions.IComparableDefinition; -import appeng.api.definitions.IMaterials; import appeng.api.exceptions.AppEngException; import appeng.api.features.IWirelessTermHandler; import appeng.api.implementations.IUpgradeableHost; @@ -92,7 +86,6 @@ import appeng.container.implementations.ContainerUpgradeable; import appeng.container.implementations.ContainerVibrationChamber; import appeng.container.implementations.ContainerWireless; import appeng.container.implementations.ContainerWirelessTerm; -import appeng.core.stats.Achievements; import appeng.helpers.IInterfaceHost; import appeng.helpers.IPriorityHost; import appeng.helpers.WirelessTerminalGuiObject; @@ -356,27 +349,7 @@ public enum GuiBridge implements IGuiHandler .typeName( tE ) + " )" ); } - final Object o = target.newInstance( inventory, tE ); - - /** - * triggers achievement when the player sees presses. - */ - if( o instanceof AEBaseContainer ) - { - final AEBaseContainer bc = (AEBaseContainer) o; - for( final Object so : bc.inventorySlots ) - { - if( so instanceof Slot ) - { - final ItemStack is = ( (Slot) so ).getStack(); - - final IMaterials materials = AEApi.instance().definitions().materials(); - this.addPressAchievementToPlayer( is, materials, inventory.player ); - } - } - } - - return o; + return target.newInstance( inventory, tE ); } catch( final Throwable t ) { @@ -410,26 +383,6 @@ public enum GuiBridge implements IGuiHandler return inventory.getClass().getName(); } - private void addPressAchievementToPlayer( final ItemStack newItem, final IMaterials possibleMaterials, final EntityPlayer player ) - { - final IComparableDefinition logic = possibleMaterials.logicProcessorPress(); - final IComparableDefinition eng = possibleMaterials.engProcessorPress(); - final IComparableDefinition calc = possibleMaterials.calcProcessorPress(); - final IComparableDefinition silicon = possibleMaterials.siliconPress(); - - final List presses = Lists.newArrayList( logic, eng, calc, silicon ); - - for( final IComparableDefinition press : presses ) - { - if( press.isSameAs( newItem ) ) - { - Achievements.Presses.addToPlayer( player ); - - return; - } - } - } - @Override public Object getClientGuiElement( final int ordinal, final EntityPlayer player, final World w, final int x, final int y, final int z ) { diff --git a/src/main/java/appeng/me/cache/PathGridCache.java b/src/main/java/appeng/me/cache/PathGridCache.java index 7617f26a..80e0c542 100644 --- a/src/main/java/appeng/me/cache/PathGridCache.java +++ b/src/main/java/appeng/me/cache/PathGridCache.java @@ -26,6 +26,10 @@ import java.util.LinkedList; import java.util.List; import java.util.Set; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; + +import appeng.api.AEApi; import appeng.api.networking.GridFlags; import appeng.api.networking.IGrid; import appeng.api.networking.IGridBlock; @@ -43,8 +47,9 @@ import appeng.api.networking.pathing.IPathingGrid; import appeng.api.util.AEPartLocation; import appeng.api.util.DimensionalCoord; import appeng.core.AEConfig; +import appeng.core.AppEng; import appeng.core.features.AEFeature; -import appeng.core.stats.Achievements; +import appeng.core.stats.IAdvancementTrigger; import appeng.me.GridConnection; import appeng.me.GridNode; import appeng.me.pathfinding.AdHocChannelUpdater; @@ -340,26 +345,24 @@ public class PathGridCache implements IPathingGrid { if( this.lastChannels != this.getChannelsInUse() && AEConfig.instance().isFeatureEnabled( AEFeature.CHANNELS ) ) { - final Achievements currentBracket = this.getAchievementBracket( this.getChannelsInUse() ); - final Achievements lastBracket = this.getAchievementBracket( this.lastChannels ); + final IAdvancementTrigger currentBracket = this.getAchievementBracket( this.getChannelsInUse() ); + final IAdvancementTrigger lastBracket = this.getAchievementBracket( this.lastChannels ); if( currentBracket != lastBracket && currentBracket != null ) { - final Set players = new HashSet<>(); for( final IGridNode n : this.requireChannels ) { - players.add( n.getPlayerID() ); + EntityPlayer player = AEApi.instance().registries().players().findPlayer( n.getPlayerID() ); + if( player instanceof EntityPlayerMP ) + { + currentBracket.trigger( (EntityPlayerMP) player ); + } } - - // for( final int id : players ) - // { - // Platform.addStat( id, currentBracket.getAchievement() ); - // } } } this.lastChannels = this.getChannelsInUse(); } - private Achievements getAchievementBracket( final int ch ) + private IAdvancementTrigger getAchievementBracket( final int ch ) { if( ch < 8 ) { @@ -368,15 +371,15 @@ public class PathGridCache implements IPathingGrid if( ch < 128 ) { - return Achievements.Networking1; + return AppEng.instance().getAdvancementTriggers().getNetworkApprentice(); } if( ch < 2048 ) { - return Achievements.Networking2; + return AppEng.instance().getAdvancementTriggers().getNetworkEngineer(); } - return Achievements.Networking3; + return AppEng.instance().getAdvancementTriggers().getNetworkAdmin(); } @MENetworkEventSubscribe diff --git a/src/main/java/appeng/parts/misc/PartStorageBus.java b/src/main/java/appeng/parts/misc/PartStorageBus.java index 0b1b4c8a..dc4ddb84 100644 --- a/src/main/java/appeng/parts/misc/PartStorageBus.java +++ b/src/main/java/appeng/parts/misc/PartStorageBus.java @@ -19,7 +19,6 @@ package appeng.parts.misc; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; diff --git a/src/main/java/appeng/spatial/StorageHelper.java b/src/main/java/appeng/spatial/StorageHelper.java index f144a2b2..65816bc4 100644 --- a/src/main/java/appeng/spatial/StorageHelper.java +++ b/src/main/java/appeng/spatial/StorageHelper.java @@ -35,7 +35,7 @@ import net.minecraft.world.WorldServer; import appeng.api.AEApi; import appeng.api.util.WorldCoord; -import appeng.core.stats.Achievements; +import appeng.core.AppEng; import appeng.util.Platform; @@ -115,7 +115,7 @@ public class StorageHelper { if( link.dim.provider instanceof StorageWorldProvider ) { - Achievements.SpatialIOExplorer.addToPlayer( player ); + AppEng.instance().getAdvancementTriggers().getSpatialExplorer().trigger( player ); } player.mcServer.getPlayerList().transferPlayerToDimension( player, link.dim.provider.getDimension(), new METeleporter( newWorld, link ) ); diff --git a/src/main/java/appeng/tile/storage/TileChest.java b/src/main/java/appeng/tile/storage/TileChest.java index 7dd35240..b0b945b2 100644 --- a/src/main/java/appeng/tile/storage/TileChest.java +++ b/src/main/java/appeng/tile/storage/TileChest.java @@ -20,7 +20,6 @@ package appeng.tile.storage; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/cable_glass.json b/src/main/resources/assets/appliedenergistics2/advancements/main/cable_glass.json new file mode 100644 index 00000000..d8bfbe6b --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/cable_glass.json @@ -0,0 +1,23 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 16 + }, + "title": { "translate": "achievement.ae2.GlassCable" }, + "description": { "translate": "achievement.ae2.GlassCable.desc" } + }, + "parent": "appliedenergistics2:main/fluix", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "type": "appliedenergistics2:part", + "part": "CABLE_GLASS" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/charged_quartz.json b/src/main/resources/assets/appliedenergistics2/advancements/main/charged_quartz.json new file mode 100644 index 00000000..a0e2159b --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/charged_quartz.json @@ -0,0 +1,24 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:material", + "data": 1 + }, + "title": { "translate": "achievement.ae2.ChargedQuartz" }, + "description": { "translate": "achievement.ae2.ChargedQuartz.desc" } + }, + "parent": "appliedenergistics2:main/root", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:material", + "data": 1 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/charger.json b/src/main/resources/assets/appliedenergistics2/advancements/main/charger.json new file mode 100644 index 00000000..a1cd16e0 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/charger.json @@ -0,0 +1,22 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:charger" + }, + "title": { "translate": "achievement.ae2.Charger" }, + "description": { "translate": "achievement.ae2.Charger.desc" } + }, + "parent": "appliedenergistics2:main/charged_quartz", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:charger" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/compass.json b/src/main/resources/assets/appliedenergistics2/advancements/main/compass.json new file mode 100644 index 00000000..1fdaf531 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/compass.json @@ -0,0 +1,20 @@ +{ + "display": { + "icon": { "item": "appliedenergistics2:sky_compass" }, + "title": { "translate": "achievement.ae2.Compass" }, + "description": { "translate": "achievement.ae2.Compass.desc" } + }, + "parent": "appliedenergistics2:main/root", + "criteria": { + "compass": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:sky_compass" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/controller.json b/src/main/resources/assets/appliedenergistics2/advancements/main/controller.json new file mode 100644 index 00000000..cc954fc6 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/controller.json @@ -0,0 +1,22 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:controller" + }, + "title": { "translate": "achievement.ae2.Controller" }, + "description": { "translate": "achievement.ae2.Controller.desc" } + }, + "parent": "appliedenergistics2:main/presses", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:controller" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/crafting_cpu.json b/src/main/resources/assets/appliedenergistics2/advancements/main/crafting_cpu.json new file mode 100644 index 00000000..3a19b780 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/crafting_cpu.json @@ -0,0 +1,55 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:crafting_storage_64k" + }, + "title": { "translate": "achievement.ae2.CraftingCPU" }, + "description": { "translate": "achievement.ae2.CraftingCPU.desc" } + }, + "parent": "appliedenergistics2:main/pattern_terminal", + "criteria": { + "c1k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:crafting_storage_1k" + } + ] + } + }, + "c4k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:crafting_storage_4k" + } + ] + } + }, + "c16k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:crafting_storage_16k" + } + ] + } + }, + "c64k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:crafting_storage_64k" + } + ] + } + } + }, + "requirements": [ + [ "c1k", "c4k", "c16k", "c64k" ] + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/crafting_terminal.json b/src/main/resources/assets/appliedenergistics2/advancements/main/crafting_terminal.json new file mode 100644 index 00000000..0ee8825f --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/crafting_terminal.json @@ -0,0 +1,23 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 360 + }, + "title": { "translate": "achievement.ae2.CraftingTerminal" }, + "description": { "translate": "achievement.ae2.CraftingTerminal.desc" } + }, + "parent": "appliedenergistics2:main/controller", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "type": "appliedenergistics2:part", + "part": "CRAFTING_TERMINAL" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/facade.json b/src/main/resources/assets/appliedenergistics2/advancements/main/facade.json new file mode 100644 index 00000000..43f4098b --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/facade.json @@ -0,0 +1,20 @@ +{ + "display": { + "icon": { "item": "appliedenergistics2:facade" }, + "title": { "translate": "achievement.ae2.Facade" }, + "description": { "translate": "achievement.ae2.Facade.desc" } + }, + "parent": "appliedenergistics2:main/cable_glass", + "criteria": { + "facade": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:facade" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/fluix.json b/src/main/resources/assets/appliedenergistics2/advancements/main/fluix.json new file mode 100644 index 00000000..a04f0d78 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/fluix.json @@ -0,0 +1,24 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:material", + "data": 7 + }, + "title": { "translate": "achievement.ae2.Fluix" }, + "description": { "translate": "achievement.ae2.Fluix.desc" } + }, + "parent": "appliedenergistics2:main/charged_quartz", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:material", + "data": 7 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/growth_accelerator.json b/src/main/resources/assets/appliedenergistics2/advancements/main/growth_accelerator.json new file mode 100644 index 00000000..950341a8 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/growth_accelerator.json @@ -0,0 +1,22 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:quartz_growth_accelerator" + }, + "title": { "translate": "achievement.ae2.CrystalGrowthAccelerator" }, + "description": { "translate": "achievement.ae2.CrystalGrowthAccelerator.desc" } + }, + "parent": "appliedenergistics2:main/fluix", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:quartz_growth_accelerator" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/interface.json b/src/main/resources/assets/appliedenergistics2/advancements/main/interface.json new file mode 100644 index 00000000..c8d96c15 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/interface.json @@ -0,0 +1,22 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:interface" + }, + "title": { "translate": "achievement.ae2.Recursive" }, + "description": { "translate": "achievement.ae2.Recursive.desc" } + }, + "parent": "appliedenergistics2:main/cable_glass", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:interface" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/ioport.json b/src/main/resources/assets/appliedenergistics2/advancements/main/ioport.json new file mode 100644 index 00000000..80cafeae --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/ioport.json @@ -0,0 +1,22 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:io_port" + }, + "title": { "translate": "achievement.ae2.IOPort" }, + "description": { "translate": "achievement.ae2.IOPort.desc" } + }, + "parent": "appliedenergistics2:main/storage_cell", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:io_port" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/network1.json b/src/main/resources/assets/appliedenergistics2/advancements/main/network1.json new file mode 100644 index 00000000..5d332666 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/network1.json @@ -0,0 +1,15 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 36 + }, + "title": { "translate": "achievement.ae2.Networking1" }, + "description": { "translate": "achievement.ae2.Networking1.desc" } + }, + "parent": "appliedenergistics2:main/cable_glass", + "criteria": { + "cable": { + "trigger": "appliedenergistics2:network_apprentice" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/network2.json b/src/main/resources/assets/appliedenergistics2/advancements/main/network2.json new file mode 100644 index 00000000..e78e7fa0 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/network2.json @@ -0,0 +1,15 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 56 + }, + "title": { "translate": "achievement.ae2.Networking2" }, + "description": { "translate": "achievement.ae2.Networking2.desc" } + }, + "parent": "appliedenergistics2:main/network1", + "criteria": { + "cable": { + "trigger": "appliedenergistics2:network_engineer" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/network3.json b/src/main/resources/assets/appliedenergistics2/advancements/main/network3.json new file mode 100644 index 00000000..17baf607 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/network3.json @@ -0,0 +1,15 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 76 + }, + "title": { "translate": "achievement.ae2.Networking3" }, + "description": { "translate": "achievement.ae2.Networking3.desc" } + }, + "parent": "appliedenergistics2:main/network2", + "criteria": { + "cable": { + "trigger": "appliedenergistics2:network_admin" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/network_tool.json b/src/main/resources/assets/appliedenergistics2/advancements/main/network_tool.json new file mode 100644 index 00000000..1e393dcf --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/network_tool.json @@ -0,0 +1,20 @@ +{ + "display": { + "icon": { "item": "appliedenergistics2:network_tool" }, + "title": { "translate": "achievement.ae2.NetworkTool" }, + "description": { "translate": "achievement.ae2.NetworkTool.desc" } + }, + "parent": "appliedenergistics2:main/controller", + "criteria": { + "network_tool": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:network_tool" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/p2p.json b/src/main/resources/assets/appliedenergistics2/advancements/main/p2p.json new file mode 100644 index 00000000..4da1be8b --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/p2p.json @@ -0,0 +1,23 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 460 + }, + "title": { "translate": "achievement.ae2.P2P" }, + "description": { "translate": "achievement.ae2.P2P.desc" } + }, + "parent": "appliedenergistics2:main/cable_glass", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "type": "appliedenergistics2:part", + "part": "P2P_TUNNEL_ME" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/pattern_terminal.json b/src/main/resources/assets/appliedenergistics2/advancements/main/pattern_terminal.json new file mode 100644 index 00000000..1b7f2863 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/pattern_terminal.json @@ -0,0 +1,23 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 340 + }, + "title": { "translate": "achievement.ae2.PatternTerminal" }, + "description": { "translate": "achievement.ae2.PatternTerminal.desc" } + }, + "parent": "appliedenergistics2:main/crafting_terminal", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "type": "appliedenergistics2:part", + "part": "PATTERN_TERMINAL" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/portable_cell.json b/src/main/resources/assets/appliedenergistics2/advancements/main/portable_cell.json new file mode 100644 index 00000000..7f4f81ff --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/portable_cell.json @@ -0,0 +1,20 @@ +{ + "display": { + "icon": { "item": "appliedenergistics2:portable_cell" }, + "title": { "translate": "achievement.ae2.PortableCell" }, + "description": { "translate": "achievement.ae2.PortableCell.desc" } + }, + "parent": "appliedenergistics2:main/storage_cell", + "criteria": { + "portable_cell": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:portable_cell" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/presses.json b/src/main/resources/assets/appliedenergistics2/advancements/main/presses.json new file mode 100644 index 00000000..e366e43b --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/presses.json @@ -0,0 +1,53 @@ +{ + "display": { + "icon": { "item": "appliedenergistics2:material", "data": 15 }, + "title": { "translate": "achievement.ae2.Presses" }, + "description": { "translate": "achievement.ae2.Presses.desc" } + }, + "parent": "appliedenergistics2:main/root", + "criteria": { + "calc": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:material", "data": 13 + } + ] + } + }, + "eng": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:material", "data": 14 + } + ] + } + }, + "logic": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:material", "data": 15 + } + ] + } + }, + "silicon": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:material", "data": 19 + } + ] + } + } + }, + "requirements": [ + [ "calc", "eng", "logic", "silicon" ] + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/qnb.json b/src/main/resources/assets/appliedenergistics2/advancements/main/qnb.json new file mode 100644 index 00000000..0cddc7c7 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/qnb.json @@ -0,0 +1,22 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:quantum_link" + }, + "title": { "translate": "achievement.ae2.QNB" }, + "description": { "translate": "achievement.ae2.QNB.desc" } + }, + "parent": "appliedenergistics2:main/p2p", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:quantum_link" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/root.json b/src/main/resources/assets/appliedenergistics2/advancements/main/root.json new file mode 100644 index 00000000..1993caaf --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/root.json @@ -0,0 +1,26 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:material", + "data": 0 + }, + "title": { "translate": "achievement.ae2.Root" }, + "description": { "translate": "achievement.ae2.Root.desc" }, + "background": "appliedenergistics2:textures/blocks/sky_stone_brick.png", + "show_toast": false, + "announce_to_chat": false + }, + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:material", + "data": 0 + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/spatial_explorer.json b/src/main/resources/assets/appliedenergistics2/advancements/main/spatial_explorer.json new file mode 100644 index 00000000..8303d987 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/spatial_explorer.json @@ -0,0 +1,15 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:spatial_storage_cell_128_cubed" + }, + "title": { "translate": "achievement.ae2.SpatialIOExplorer" }, + "description": { "translate": "achievement.ae2.SpatialIOExplorer.desc" } + }, + "parent": "appliedenergistics2:main/spatial_ioport", + "criteria": { + "explorer": { + "trigger": "appliedenergistics2:spatial_explorer" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/spatial_ioport.json b/src/main/resources/assets/appliedenergistics2/advancements/main/spatial_ioport.json new file mode 100644 index 00000000..cf7bdd06 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/spatial_ioport.json @@ -0,0 +1,22 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:spatial_io_port" + }, + "title": { "translate": "achievement.ae2.SpatialIO" }, + "description": { "translate": "achievement.ae2.SpatialIO.desc" } + }, + "parent": "appliedenergistics2:main/ioport", + "criteria": { + "certus": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:spatial_io_port" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/storage_bus.json b/src/main/resources/assets/appliedenergistics2/advancements/main/storage_bus.json new file mode 100644 index 00000000..0e1da4f8 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/storage_bus.json @@ -0,0 +1,23 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:part", "data": 220 + }, + "title": { "translate": "achievement.ae2.StorageBus" }, + "description": { "translate": "achievement.ae2.StorageBus.desc" } + }, + "parent": "appliedenergistics2:main/interface", + "criteria": { + "part": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "type": "appliedenergistics2:part", + "part": "STORAGE_BUS" + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/advancements/main/storage_cell.json b/src/main/resources/assets/appliedenergistics2/advancements/main/storage_cell.json new file mode 100644 index 00000000..c0914e97 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/advancements/main/storage_cell.json @@ -0,0 +1,55 @@ +{ + "display": { + "icon": { + "item": "appliedenergistics2:storage_cell_64k" + }, + "title": { "translate": "achievement.ae2.StorageCell" }, + "description": { "translate": "achievement.ae2.StorageCell.desc" } + }, + "parent": "appliedenergistics2:main/controller", + "criteria": { + "c1k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:storage_cell_1k" + } + ] + } + }, + "c4k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:storage_cell_4k" + } + ] + } + }, + "c16k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:storage_cell_16k" + } + ] + } + }, + "c64k": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "appliedenergistics2:storage_cell_64k" + } + ] + } + } + }, + "requirements": [ + [ "c1k", "c4k", "c16k", "c64k" ] + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/appliedenergistics2/lang/en_us.lang b/src/main/resources/assets/appliedenergistics2/lang/en_us.lang index 35bfdd63..31cd744f 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/en_us.lang +++ b/src/main/resources/assets/appliedenergistics2/lang/en_us.lang @@ -533,6 +533,8 @@ commands.ae2.ChunkLoggerOff=Chunk Logging is now off commands.ae2.Supporters=Displays a list of AE2 Supporters // Achievements +achievement.ae2.Root=Applied Energistics +achievement.ae2.Root.desc=When a chest is simply not enough. achievement.ae2.Compass=Meteorite Hunter achievement.ae2.Compass.desc=Craft a Meteorite Compass achievement.ae2.Presses=Unknown Technology