Compare commits

..

9 Commits

Author SHA1 Message Date
Flithor b82df25c75 Update zh_cn.lang (#3137) 2017-10-21 00:47:07 +02:00
fscan cc9b33b473 Implement Advancements (#3160)
Improvements welcome.
2017-10-20 23:54:18 +02:00
fscan 5496b746ea Fix Tiny TNT (#3162) 2017-10-20 23:52:55 +02:00
fscan f80f623ccf Fix AESharedItemStack#compareNBT to get consistent ordering. (#3169) 2017-10-20 23:25:18 +02:00
yueh cba6c5500f Fixes inscriber crash with name presses. 2017-10-16 21:41:44 +02:00
Florian Scandella bc8268af94 readd the non-fortune version 2017-10-15 16:07:12 +02:00
Florian Scandella 297cd16702 cleanup BlockQuartzOre and circumvent Forge bug 2017-10-15 15:53:31 +02:00
Florian Scandella 41711e50b9 Check for null in UpgradeInventory#saveChanges. Fixes #3159 2017-10-14 23:53:34 +02:00
Florian Scandella 2bfb8b75e8 Return correct item defintion. 2017-10-14 19:06:57 +02:00
56 changed files with 1180 additions and 746 deletions
@@ -37,13 +37,17 @@ import net.minecraft.init.SoundEvents;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import appeng.block.AEBaseBlock;
import appeng.core.AppEng;
import appeng.entity.EntityIds;
import appeng.entity.EntityTinyTNTPrimed;
import appeng.helpers.ICustomCollision;
@@ -54,15 +58,24 @@ public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision
public BlockTinyTNT()
{
super( Material.TNT );
this.setLightOpacity( 1 );
this.boundingBox = new AxisAlignedBB( 0.25f, 0.0f, 0.25f, 0.75f, 0.5f, 0.75f );
this.setFullSize( this.setOpaque( false ) );
this.setLightOpacity( 2 );
this.setFullSize( false );
this.setOpaque( false );
this.setSoundType( SoundType.GROUND );
this.setHardness( 0F );
// TODO: 1.11
// EntityRegistry.registerModEntity( EntityTinyTNTPrimed.class, "EntityTinyTNTPrimed", EntityIds.get(
// EntityTinyTNTPrimed.class ), AppEng.instance(), 16, 4, true );
EntityRegistry.registerModEntity( new ResourceLocation( AppEng.MOD_ID, EntityTinyTNTPrimed.class.getName() ), EntityTinyTNTPrimed.class,
"EntityTinyTNTPrimed", EntityIds.get( EntityTinyTNTPrimed.class ), AppEng.instance(), 16, 4, true );
}
@Override
public boolean isFullCube( IBlockState state )
{
return false;
}
@Override
@@ -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 );
}
@@ -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;
@@ -205,7 +205,7 @@ public abstract class AEBaseContainer extends Container
final NBTTagCompound data = CompressedStreamTools.readCompressed( new ByteArrayInputStream( buffer ) );
if( data != null )
{
this.setTargetStack( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( new ItemStack( data ) ) );
this.setTargetStack( AEItemStack.fromNBT( data ) );
}
}
catch( final IOException e )
+6
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 )
{
+39 -4
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 );
}
}
}
}
@@ -337,13 +337,13 @@ public final class ApiItems implements IItems
@Override
public IItemDefinition biometricCard()
{
return this.chargedStaff;
return this.biometricCard;
}
@Override
public IItemDefinition chargedStaff()
{
return this.memoryCard;
return this.chargedStaff;
}
@Override
@@ -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:
}
}
}
}
@@ -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 );
}
}
@@ -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;
}
}
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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 );
}
}
}
}
}
@@ -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 );
}
@@ -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 );
}
}
@@ -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;
}
}
@@ -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 );
}
}
}
+8 -8
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;
}
}
+1 -48
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 )
{
@@ -23,8 +23,11 @@ import java.util.Random;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -36,15 +39,8 @@ import appeng.core.AEConfig;
import appeng.core.AppEng;
public final class BlockChargedQuartzOre extends BlockQuartzOre
public class BlockChargedQuartzOre extends BlockQuartzOre
{
public BlockChargedQuartzOre()
{
this.setBoostBrightnessLow( 2 );
this.setBoostBrightnessHigh( 5 );
}
@Override
public Item getItemDropped( final IBlockState state, final Random rand, final int fortune )
{
@@ -68,6 +64,17 @@ public final class BlockChargedQuartzOre extends BlockQuartzOre
.getItemDamage();
}
@Override
public ItemStack getPickBlock( IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player )
{
return AEApi.instance()
.definitions()
.blocks()
.quartzOreCharged()
.maybeStack( 1 )
.orElseThrow( () -> new MissingDefinitionException( "Tried to access charged certus quartz ore, even though they are disabled" ) );
}
@Override
@SideOnly( Side.CLIENT )
public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
@@ -27,7 +27,6 @@ import net.minecraft.item.Item;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import appeng.api.AEApi;
@@ -37,18 +36,11 @@ import appeng.block.AEBaseBlock;
public class BlockQuartzOre extends AEBaseBlock
{
private int boostBrightnessLow;
private int boostBrightnessHigh;
private boolean enhanceBrightness;
public BlockQuartzOre()
{
super( Material.ROCK );
this.setHardness( 3.0F );
this.setResistance( 5.0F );
this.boostBrightnessLow = 0;
this.boostBrightnessHigh = 1;
this.enhanceBrightness = false;
}
@Override
@@ -58,76 +50,7 @@ public class BlockQuartzOre extends AEBaseBlock
}
@Override
public int getLightValue( final IBlockState state, final IBlockAccess worldIn, final BlockPos pos )
{
int j1 = super.getLightValue( state, worldIn, pos );
if( this.enhanceBrightness )
{
j1 = Math.max( j1 >> 20, j1 >> 4 );
if( j1 > 4 )
{
j1 += this.boostBrightnessHigh;
}
else
{
j1 += this.boostBrightnessLow;
}
if( j1 > 15 )
{
j1 = 15;
}
return j1 << 20 | j1 << 4;
}
return j1;
}
@Override
public int quantityDropped( final Random rand )
{
return 1 + rand.nextInt( 2 );
}
@Override
public Item getItemDropped( final IBlockState state, /* is null */
final Random rand, final int fortune )
{
return AEApi.instance()
.definitions()
.materials()
.certusQuartzCrystal()
.maybeItem()
.orElseThrow( () -> new MissingDefinitionException( "Tried to access certus quartz crystal, even though they are disabled" ) );
}
@Override
public void dropBlockAsItemWithChance( final World w, final BlockPos pos, final IBlockState state, final float chance, final int fortune )
{
super.dropBlockAsItemWithChance( w, pos, state, chance, fortune );
if( this.getItemDropped( state, w.rand, fortune ) != Item.getItemFromBlock( this ) )
{
final int xp = MathHelper.getInt( w.rand, 2, 5 );
this.dropXpOnBlockBreak( w, pos, xp );
}
}
@Override
public int damageDropped( final IBlockState state )
{
return AEApi.instance()
.definitions()
.materials()
.certusQuartzCrystal()
.maybeStack( 1 )
.orElseThrow( () -> new MissingDefinitionException( "Tried to access certus quartz crystal, even though they are disabled" ) )
.getItemDamage();
}
@Override
public int quantityDroppedWithBonus( final int fortune, final Random rand )
public int quantityDropped( IBlockState state, int fortune, Random rand )
{
if( fortune > 0 && Item.getItemFromBlock( this ) != this.getItemDropped( null, rand, fortune ) )
{
@@ -146,18 +69,45 @@ public class BlockQuartzOre extends AEBaseBlock
}
}
void setBoostBrightnessLow( final int boostBrightnessLow )
@Override
public int quantityDropped( final Random rand )
{
this.boostBrightnessLow = boostBrightnessLow;
return 1 + rand.nextInt( 2 );
}
void setBoostBrightnessHigh( final int boostBrightnessHigh )
@Override
public void dropBlockAsItemWithChance( final World w, final BlockPos pos, final IBlockState state, final float chance, final int fortune )
{
this.boostBrightnessHigh = boostBrightnessHigh;
super.dropBlockAsItemWithChance( w, pos, state, chance, fortune );
if( this.getItemDropped( state, w.rand, fortune ) != Item.getItemFromBlock( this ) )
{
final int xp = MathHelper.getInt( w.rand, 2, 5 );
this.dropXpOnBlockBreak( w, pos, xp );
}
}
public void setEnhanceBrightness( final boolean enhanceBrightness )
@Override
public Item getItemDropped( final IBlockState state, final Random rand, final int fortune )
{
this.enhanceBrightness = enhanceBrightness;
return AEApi.instance()
.definitions()
.materials()
.certusQuartzCrystal()
.maybeItem()
.orElseThrow( () -> new MissingDefinitionException( "Tried to access certus quartz crystal, even though they are disabled" ) );
}
@Override
public int damageDropped( final IBlockState state )
{
return AEApi.instance()
.definitions()
.materials()
.certusQuartzCrystal()
.maybeStack( 1 )
.orElseThrow( () -> new MissingDefinitionException( "Tried to access certus quartz crystal, even though they are disabled" ) )
.getItemDamage();
}
}
+17 -14
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
@@ -144,7 +144,10 @@ public abstract class UpgradeInventory extends AppEngInternalInventory implement
@Override
public void saveChanges()
{
this.parent.saveChanges();
if( this.parent != null )
{
this.parent.saveChanges();
}
}
@Override
@@ -19,7 +19,6 @@
package appeng.parts.misc;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -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 ) );
@@ -346,12 +346,19 @@ public class TileInscriber extends AENetworkPowerTile implements IGridTickable,
final InscriberProcessType type = InscriberProcessType.INSCRIBE;
final IInscriberRecipeBuilder builder = AEApi.instance().registries().inscriber().builder();
return builder.withInputs( inputs )
.withOutput( renamedItem )
.withTopOptional( plateA )
.withBottomOptional( plateB )
.withProcessType( type )
.build();
builder.withInputs( inputs ).withOutput( renamedItem ).withProcessType( type );
if( isNameA )
{
builder.withTopOptional( plateA );
}
if( isNameB )
{
builder.withBottomOptional( plateB );
}
return builder.build();
}
}
@@ -20,7 +20,6 @@ package appeng.tile.storage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -28,7 +28,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import appeng.api.config.FuzzyMode;
import appeng.util.Platform;
final class AESharedItemStack implements Comparable<AESharedItemStack>
@@ -60,7 +59,7 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
@Override
public int hashCode()
{
return Objects.hash( itemStack.getItem(), this.itemDamage );
return Objects.hash( this.itemId, this.itemDamage, this.itemStack.hasTagCompound() ? this.itemStack.getTagCompound() : 0 );
}
@Override
@@ -110,11 +109,10 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
private int compareNBT( final ItemStack b )
{
if( Platform.itemComparisons().isNbtTagEqual( this.itemStack.getTagCompound(), b.getTagCompound() ) )
if( this.itemStack.getTagCompound() == b.getTagCompound() )
{
return 0;
}
if( this.itemStack.getTagCompound() == LOW_TAG || b.getTagCompound() == HIGH_TAG )
{
return -1;
@@ -123,14 +121,6 @@ final class AESharedItemStack implements Comparable<AESharedItemStack>
{
return 1;
}
final int nbt = ( this.itemStack.hasTagCompound() ? this.itemStack.getTagCompound().hashCode() : 0 ) - ( b.hasTagCompound() ? b.getTagCompound()
.hashCode() : 0 );
if( nbt != 0 )
{
return nbt;
}
return System.identityHashCode( this.itemStack.getTagCompound() ) - System.identityHashCode( b.getTagCompound() );
}
@@ -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"
}
]
}
}
}
}
@@ -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
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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" ]
]
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
}
}
@@ -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"
}
}
}
@@ -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"
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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" ]
]
}
@@ -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"
}
]
}
}
}
}
@@ -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
}
]
}
}
}
}
@@ -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"
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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"
}
]
}
}
}
}
@@ -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" ]
]
}
@@ -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
@@ -101,7 +101,7 @@ gui.appliedenergistics2.RedstoneTunnel=红石
gui.appliedenergistics2.EUTunnel=EU
gui.appliedenergistics2.FETunnel=FE
gui.appliedenergistics2.LightTunnel=光
gui.appliedenergistics2.OCTunnel=OpenComputers
gui.appliedenergistics2.OCTunnel=开放式电脑
gui.appliedenergistics2.PressureTunnel=气压
gui.appliedenergistics2.security.extract.name=取出
@@ -117,6 +117,8 @@ gui.appliedenergistics2.security.build.tip=用户可以修改网络的物理结
gui.appliedenergistics2.security.security.tip=用户可以访问修改网络的安全终端.
gui.appliedenergistics2.Efficiency=效率
gui.appliedenergistics2.SCSSize=SCS规模
gui.appliedenergistics2.SCSInvalid=SCS无效
gui.appliedenergistics2.RequiredPower=所需能源
gui.appliedenergistics2.StoredPower=现存能源
gui.appliedenergistics2.MaxPower=最大能源
@@ -161,13 +163,14 @@ gui.appliedenergistics2.VibrationChamber=谐振仓
gui.appliedenergistics2.NetworkDetails=网络信息
gui.appliedenergistics2.StorageCells=ME存储元件
gui.appliedenergistics2.IOBuses=ME输入/输出总线
gui.appliedenergistics2.Stores=Stores
gui.appliedenergistics2.Stores=存储
gui.appliedenergistics2.BytesUsed=字节已使用
gui.appliedenergistics2.Types=类型
gui.appliedenergistics2.Blank=空白
gui.appliedenergistics2.Unlinked=未链接
gui.appliedenergistics2.Linked=已链接
gui.appliedenergistics2.StoredSize=存储空间大小
gui.appliedenergistics2.CellId=单元ID
gui.appliedenergistics2.SkyChest=陨石箱子
gui.appliedenergistics2.PatternTerminal=样板终端
gui.appliedenergistics2.CraftingPattern=合成样板
@@ -329,7 +332,7 @@ gui.tooltips.appliedenergistics2.ItemsRequestable=可请求: %s
// 单位
gui.appliedenergistics2.units.appliedenergstics=AE
gui.appliedenergistics2.units.ic2=EU
gui.appliedenergistics2.units.rf=Redstone Flux
gui.appliedenergistics2.units.rf=RF
// 颜色
gui.appliedenergistics2.White=白色
@@ -350,7 +353,8 @@ gui.appliedenergistics2.Red=红色
gui.appliedenergistics2.Black=黑色
gui.appliedenergistics2.Fluix=Fluix默认色
// waila
// Waila
waila.appliedenergistics2.Crafting=合成中
waila.appliedenergistics2.DeviceOnline=设备开启
waila.appliedenergistics2.DeviceOffline=设备关闭
waila.appliedenergistics2.DeviceMissingChannel=设备缺少频道
@@ -359,7 +363,26 @@ waila.appliedenergistics2.Unlocked=未锁定
waila.appliedenergistics2.Showing=显示
waila.appliedenergistics2.Contains=容纳
waila.appliedenergistics2.Channels=%1$d / %2$d 频道
waila.appliedenergistics2.Crafting=合成中
waila.appliedenergistics2.P2PUnlinked=未连接
waila.appliedenergistics2.P2PInputOneOutput=已连接(输入端)
waila.appliedenergistics2.P2PInputManyOutputs=已连接(输入端)- %d 输出
waila.appliedenergistics2.P2POutput=已连接(输出端)
// TheOneProbe
theoneprobe.appliedenergistics2.crafting=合成中: %1$s
theoneprobe.appliedenergistics2.device_online=设备开启
theoneprobe.appliedenergistics2.device_offline=设备关闭
theoneprobe.appliedenergistics2.device_missing_channel=设备缺少频道
theoneprobe.appliedenergistics2.locked=锁定
theoneprobe.appliedenergistics2.unlocked=未锁定
theoneprobe.appliedenergistics2.showing=显示
theoneprobe.appliedenergistics2.contains=容纳
theoneprobe.appliedenergistics2.channels=%1$d / %2$d 频道
theoneprobe.appliedenergistics2.p2p_unlinked=未连接
theoneprobe.appliedenergistics2.p2p_input_one_output=已连接(输入端)
theoneprobe.appliedenergistics2.p2p_input_many_outputs=已连接(输入端)- %d 输出
theoneprobe.appliedenergistics2.p2p_output=已连接(输出端)
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
// 物品
item.appliedenergistics2.storage_cell_1k.name=1k-ME存储元件
@@ -436,6 +459,7 @@ item.appliedenergistics2.multi_part.cable_anchor.name=线缆锚
item.appliedenergistics2.multi_part.cable_covered.name=ME包层线缆
item.appliedenergistics2.multi_part.cable_glass.name=ME玻璃线缆
item.appliedenergistics2.multi_part.cable_smart.name=ME智能线缆
item.appliedenergistics2.multi_part.cable_dense_covered.name=ME致密包层线缆
item.appliedenergistics2.multi_part.cable_dense_smart.name=ME致密线缆
item.appliedenergistics2.multi_part.storage_monitor.name=ME存储监控器
item.appliedenergistics2.multi_part.conversion_monitor.name=ME交换监控器