2018-12-10 23:46:50 +00:00
|
|
|
/*
|
|
|
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
2019-01-01 01:10:18 +00:00
|
|
|
* Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission.
|
2018-12-10 23:46:50 +00:00
|
|
|
* Send enquiries to dratcliffe@gmail.com
|
|
|
|
*/
|
|
|
|
|
|
|
|
package dan200.computercraft.shared;
|
|
|
|
|
|
|
|
import com.google.common.base.Preconditions;
|
|
|
|
import dan200.computercraft.ComputerCraft;
|
|
|
|
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
|
|
|
import dan200.computercraft.shared.computer.core.ComputerFamily;
|
|
|
|
import dan200.computercraft.shared.util.InventoryUtil;
|
|
|
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
|
|
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
|
|
|
|
import javax.annotation.Nonnull;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
public final class TurtleUpgrades
|
|
|
|
{
|
|
|
|
private static final Map<String, ITurtleUpgrade> upgrades = new HashMap<>();
|
|
|
|
private static final Int2ObjectMap<ITurtleUpgrade> legacyUpgrades = new Int2ObjectOpenHashMap<>();
|
|
|
|
|
|
|
|
public static void register( @Nonnull ITurtleUpgrade upgrade )
|
|
|
|
{
|
|
|
|
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
|
|
|
|
|
|
|
|
int id = upgrade.getLegacyUpgradeID();
|
|
|
|
if( id >= 0 && id < 64 )
|
|
|
|
{
|
|
|
|
String message = getMessage( upgrade, "Legacy UpgradeID '" + id + "' is reserved by ComputerCraft" );
|
|
|
|
ComputerCraft.log.error( message );
|
|
|
|
throw new RuntimeException( message );
|
|
|
|
}
|
|
|
|
|
|
|
|
registerInternal( upgrade );
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void registerInternal( ITurtleUpgrade upgrade )
|
|
|
|
{
|
|
|
|
Preconditions.checkNotNull( upgrade, "upgrade cannot be null" );
|
|
|
|
|
|
|
|
// Check conditions
|
|
|
|
int legacyId = upgrade.getLegacyUpgradeID();
|
|
|
|
if( legacyId >= 0 )
|
|
|
|
{
|
|
|
|
if( legacyId >= Short.MAX_VALUE )
|
|
|
|
{
|
|
|
|
String message = getMessage( upgrade, "UpgradeID '" + legacyId + "' is out of range" );
|
|
|
|
ComputerCraft.log.error( message );
|
|
|
|
throw new RuntimeException( message );
|
|
|
|
}
|
|
|
|
|
|
|
|
ITurtleUpgrade existing = legacyUpgrades.get( legacyId );
|
|
|
|
if( existing != null )
|
|
|
|
{
|
|
|
|
String message = getMessage( upgrade, "UpgradeID '" + legacyId + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'" );
|
|
|
|
ComputerCraft.log.error( message );
|
|
|
|
throw new RuntimeException( message );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
String id = upgrade.getUpgradeID().toString();
|
|
|
|
ITurtleUpgrade existing = upgrades.get( id );
|
|
|
|
if( existing != null )
|
|
|
|
{
|
|
|
|
String message = getMessage( upgrade, "UpgradeID '" + id + "' is already registered by '" + existing.getUnlocalisedAdjective() + " Turtle'" );
|
|
|
|
ComputerCraft.log.error( message );
|
|
|
|
throw new RuntimeException( message );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Register
|
|
|
|
if( legacyId >= 0 ) legacyUpgrades.put( legacyId, upgrade );
|
|
|
|
upgrades.put( id, upgrade );
|
|
|
|
}
|
|
|
|
|
|
|
|
private static String getMessage( ITurtleUpgrade upgrade, String rest )
|
|
|
|
{
|
|
|
|
return "Error registering '" + upgrade.getUnlocalisedAdjective() + " Turtle'. " + rest;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static ITurtleUpgrade get( String id )
|
|
|
|
{
|
|
|
|
return upgrades.get( id );
|
|
|
|
}
|
|
|
|
|
|
|
|
public static ITurtleUpgrade get( int id )
|
|
|
|
{
|
|
|
|
return legacyUpgrades.get( id );
|
|
|
|
}
|
|
|
|
|
|
|
|
public static ITurtleUpgrade get( @Nonnull ItemStack stack )
|
|
|
|
{
|
|
|
|
if( stack.isEmpty() ) return null;
|
|
|
|
|
|
|
|
for( ITurtleUpgrade upgrade : upgrades.values() )
|
|
|
|
{
|
|
|
|
ItemStack craftingStack = upgrade.getCraftingItem();
|
Be less strict in comparing upgrade crafting items
We currently generate the crafting item once when the upgrade is first
created, and cache it for the duration of the game. As the item never
changes throughout the game, and constructing a stack is a little
expensive (we need to fire an event, etc...), the caching is worth
having.
However, some mods may register capabilities after we've constructed our
ItemStack. This means the capability will be present on other items but
not ours, meaning they are not considered equivalent, and thus the item
cannot be equipped.
In order to avoid this, we use compare items using their share-tag, like
Forge's IngredientNBT. This means the items must still be "mostly" the
same (same enchantements, etc...), but allow differing capabilities.
See NillerMedDild/Enigmatica2Expert#655 for the original bug report -
in this case, Astral Sourcery was registering the capability in init,
but we construct upgrades just before then.
2019-01-19 21:57:21 +00:00
|
|
|
if( !craftingStack.isEmpty() && InventoryUtil.areItemsSimilar( stack, craftingStack ) )
|
2018-12-10 23:46:50 +00:00
|
|
|
{
|
|
|
|
return upgrade;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Iterable<ITurtleUpgrade> getVanillaUpgrades()
|
|
|
|
{
|
|
|
|
List<ITurtleUpgrade> vanilla = new ArrayList<>();
|
2019-01-12 17:51:26 +00:00
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.diamondPickaxe );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.diamondAxe );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.diamondSword );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.diamondShovel );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.diamondHoe );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.craftingTable );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.wirelessModem );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.advancedModem );
|
|
|
|
vanilla.add( ComputerCraft.TurtleUpgrades.speaker );
|
2018-12-10 23:46:50 +00:00
|
|
|
return vanilla;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean suitableForFamily( ComputerFamily family, ITurtleUpgrade upgrade )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|