Implement Advancements (#3160)

Improvements welcome.
This commit is contained in:
fscan 2017-10-20 23:54:18 +02:00 committed by GitHub
parent 5496b746ea
commit cc9b33b473
47 changed files with 1062 additions and 622 deletions

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
package appeng.bootstrap;
import net.minecraft.advancements.ICriterionInstance;
import net.minecraft.advancements.ICriterionTrigger;
@FunctionalInterface
public interface ICriterionTriggerRegistry
{
void register( ICriterionTrigger<? extends ICriterionInstance> trigger );
}

View file

@ -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;

View file

@ -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 )
{

View file

@ -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<? extends ICriterionInstance> trigger )
{
try
{
method.invoke( null, trigger );
}
catch( IllegalAccessException | IllegalArgumentException | InvocationTargetException e )
{
AELog.debug( e );
}
}
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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:
}
}
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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 );
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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;
}
}
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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;
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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;
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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<AppEngAdvancementTrigger.Instance>, IAdvancementTrigger
{
private final ResourceLocation ID;
private final Map<PlayerAdvancements, AppEngAdvancementTrigger.Listeners> 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<AppEngAdvancementTrigger.Instance> 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<AppEngAdvancementTrigger.Instance> 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<ICriterionTrigger.Listener<AppEngAdvancementTrigger.Instance>> listeners = new HashSet<>();
Listeners( PlayerAdvancements playerAdvancementsIn )
{
this.playerAdvancements = playerAdvancementsIn;
}
public boolean isEmpty()
{
return this.listeners.isEmpty();
}
public void add( ICriterionTrigger.Listener<AppEngAdvancementTrigger.Instance> listener )
{
this.listeners.add( listener );
}
public void remove( ICriterionTrigger.Listener<AppEngAdvancementTrigger.Instance> listener )
{
this.listeners.remove( listener );
}
public void trigger( EntityPlayerMP player )
{
List<ICriterionTrigger.Listener<AppEngAdvancementTrigger.Instance>> list = null;
for( ICriterionTrigger.Listener<AppEngAdvancementTrigger.Instance> listener : this.listeners )
{
if( listener.getCriterionInstance().test() )
{
if( list == null )
{
list = new ArrayList<>();
}
list.add( listener );
}
}
if( list != null )
{
for( ICriterionTrigger.Listener<AppEngAdvancementTrigger.Instance> l : list )
{
l.grantCriterion( this.playerAdvancements );
}
}
}
}
}

View file

@ -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 );
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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 );
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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;
}
}

View file

@ -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 <http://www.gnu.org/licenses/lgpl>.
*/
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<Achievement> list = new ArrayList<Achievement>();
//
// 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 );
}
}
}

View file

@ -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;
}
}

View file

@ -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<IComparableDefinition> 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 )
{

View file

@ -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<Integer> 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

View file

@ -19,7 +19,6 @@
package appeng.parts.misc;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

View file

@ -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 ) );

View file

@ -20,7 +20,6 @@ package appeng.tile.storage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

View file

@ -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"
}
]
}
}
}
}

View file

@ -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
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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" ]
]
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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" ]
]
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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
}
]
}
}
}
}

View file

@ -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"
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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"
}
]
}
}
}
}

View file

@ -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" ]
]
}

View file

@ -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