diff --git a/src/main/java/gregtech/api/items/armor/ArmorLogicSuite.java b/src/main/java/gregtech/api/items/armor/ArmorLogicSuite.java index e4e6c67da6a..8c8ba7fdcfd 100644 --- a/src/main/java/gregtech/api/items/armor/ArmorLogicSuite.java +++ b/src/main/java/gregtech/api/items/armor/ArmorLogicSuite.java @@ -2,8 +2,6 @@ import gregtech.api.capability.GregtechCapabilities; import gregtech.api.capability.IElectricItem; -import gregtech.api.items.armor.ArmorMetaItem.ArmorMetaValueItem; -import gregtech.api.items.metaitem.ElectricStats; import gregtech.api.items.metaitem.stats.IItemHUDProvider; import net.minecraft.client.resources.I18n; @@ -22,6 +20,7 @@ import java.util.List; +@Deprecated public abstract class ArmorLogicSuite implements ISpecialArmorLogic, IItemHUDProvider { protected final int energyPerUse; @@ -63,22 +62,6 @@ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { } } - @Override - public void addToolComponents(ArmorMetaValueItem mvi) { - mvi.addComponents(new ElectricStats(maxCapacity, tier, true, false) { - - @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { - return onRightClick(world, player, hand); - } - - @Override - public void addInformation(ItemStack itemStack, List lines) { - addInfo(itemStack, lines); - } - }); - } - public void addInfo(ItemStack itemStack, List lines) { int armor = (int) Math.round(20.0F * this.getAbsorption(itemStack) * this.getDamageAbsorption()); if (armor > 0) @@ -129,10 +112,6 @@ public boolean shouldDrawHUD() { return this.SLOT == EntityEquipmentSlot.CHEST; } - public int getEnergyPerUse() { - return this.energyPerUse; - } - protected float getAbsorption(ItemStack itemStack) { switch (this.getEquipmentSlot(itemStack)) { case HEAD: diff --git a/src/main/java/gregtech/api/items/armor/ArmorMetaItem.java b/src/main/java/gregtech/api/items/armor/ArmorMetaItem.java index a972b669c95..a744dd3e31d 100644 --- a/src/main/java/gregtech/api/items/armor/ArmorMetaItem.java +++ b/src/main/java/gregtech/api/items/armor/ArmorMetaItem.java @@ -1,35 +1,28 @@ package gregtech.api.items.armor; import gregtech.api.items.metaitem.MetaItem; -import gregtech.api.items.metaitem.stats.IEnchantabilityHelper; -import gregtech.api.items.metaitem.stats.IItemComponent; import gregtech.common.creativetab.GTCreativeTabs; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnumEnchantmentType; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import com.google.common.base.Preconditions; -import com.google.common.collect.Multimap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class ArmorMetaItem.ArmorMetaValueItem> extends MetaItem - implements IArmorItem, ISpecialArmor, IEnchantabilityHelper { +import java.util.List; + +@Deprecated +public class ArmorMetaItem.ArmorMetaValueItem> extends MetaItem implements ISpecialArmor { public ArmorMetaItem() { super((short) 0); @@ -45,68 +38,30 @@ protected T constructMetaValueItem(short metaValue, String unlocalizedName) { @NotNull private IArmorLogic getArmorLogic(ItemStack itemStack) { T metaValueItem = getItem(itemStack); - return metaValueItem == null ? new DummyArmorLogic() : metaValueItem.getArmorLogic(); - } - - @NotNull - @Override - public Multimap getAttributeModifiers(@NotNull EntityEquipmentSlot slot, - @NotNull ItemStack stack) { - Multimap multimap = super.getAttributeModifiers(slot, stack); - IArmorLogic armorLogic = getArmorLogic(stack); - multimap.putAll(armorLogic.getAttributeModifiers(slot, stack)); - return multimap; + return metaValueItem == null ? new DummyArmorLogic(EntityEquipmentSlot.HEAD, "") : + metaValueItem.getArmorLogic(); } @Override public ArmorProperties getProperties(EntityLivingBase player, @NotNull ItemStack armor, DamageSource source, double damage, int slot) { - IArmorLogic armorLogic = getArmorLogic(armor); - if (armorLogic instanceof ISpecialArmorLogic) { - return ((ISpecialArmorLogic) armorLogic).getProperties(player, armor, source, damage, getSlotByIndex(slot)); - } return new ArmorProperties(0, 0, Integer.MAX_VALUE); } @Override public int getArmorDisplay(EntityPlayer player, @NotNull ItemStack armor, int slot) { - IArmorLogic armorLogic = getArmorLogic(armor); - if (armorLogic instanceof ISpecialArmorLogic) { - return ((ISpecialArmorLogic) armorLogic).getArmorDisplay(player, armor, slot); - } return 0; } @Override public void damageArmor(EntityLivingBase entity, @NotNull ItemStack stack, DamageSource source, int damage, - int slot) { - IArmorLogic armorLogic = getArmorLogic(stack); - armorLogic.damageArmor(entity, stack, source, damage, getSlotByIndex(slot)); - } - - @Override - public boolean handleUnblockableDamage(EntityLivingBase entity, @NotNull ItemStack armor, DamageSource source, - double damage, int slot) { - IArmorLogic armorLogic = getArmorLogic(armor); - if (armorLogic instanceof ISpecialArmorLogic) { - return ((ISpecialArmorLogic) armorLogic).handleUnblockableDamage(entity, armor, source, damage, - getSlotByIndex(slot)); - } - return false; - } - - @Override - public void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack itemStack) { - IArmorLogic armorLogic = getArmorLogic(itemStack); - armorLogic.onArmorTick(world, player, itemStack); - } + int slot) {} @Override public boolean isValidArmor(@NotNull ItemStack stack, @NotNull EntityEquipmentSlot armorType, @NotNull Entity entity) { IArmorLogic armorLogic = getArmorLogic(stack); - return super.isValidArmor(stack, armorType, entity) && - armorLogic.isValidArmor(stack, entity, armorType); + return super.isValidArmor(stack, armorType, entity) && armorLogic.getEquipmentSlot(stack) == armorType; } @Nullable @@ -124,50 +79,20 @@ public String getArmorTexture(@NotNull ItemStack stack, @NotNull Entity entity, return armorLogic.getArmorTexture(stack, entity, slot, type); } - @Nullable @Override - @SideOnly(Side.CLIENT) - public ModelBiped getArmorModel(@NotNull EntityLivingBase entityLiving, @NotNull ItemStack itemStack, - @NotNull EntityEquipmentSlot armorSlot, @NotNull ModelBiped _default) { - IArmorLogic armorLogic = getArmorLogic(itemStack); - return armorLogic.getArmorModel(entityLiving, itemStack, armorSlot, _default); + public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn, @NotNull List lines, + @NotNull ITooltipFlag tooltipFlag) { + lines.add(TextFormatting.RED + "Deprecated Item! Convert in an Assembler to get the new version"); // todo lang } @Override - public int getArmorLayersAmount(ItemStack itemStack) { - IArmorLogic armorLogic = getArmorLogic(itemStack); - return armorLogic.getArmorLayersAmount(itemStack); - } - - @Override - public int getArmorLayerColor(ItemStack itemStack, int layerIndex) { - IArmorLogic armorLogic = getArmorLogic(itemStack); - return armorLogic.getArmorLayerColor(itemStack, layerIndex); - } - - @Override - public void renderHelmetOverlay(@NotNull ItemStack stack, @NotNull EntityPlayer player, - @NotNull ScaledResolution resolution, float partialTicks) { - IArmorLogic armorLogic = getArmorLogic(stack); - armorLogic.renderHelmetOverlay(stack, player, resolution, partialTicks); - } - - private static EntityEquipmentSlot getSlotByIndex(int index) { - switch (index) { - case 0: - return EntityEquipmentSlot.FEET; - case 1: - return EntityEquipmentSlot.LEGS; - case 2: - return EntityEquipmentSlot.CHEST; - default: - return EntityEquipmentSlot.HEAD; - } + public boolean isEnchantable(@NotNull ItemStack stack) { + return false; } public class ArmorMetaValueItem extends MetaValueItem { - private IArmorLogic armorLogic = new DummyArmorLogic(); + private IArmorLogic armorLogic; protected ArmorMetaValueItem(int metaValue, String unlocalizedName) { super(metaValue, unlocalizedName); @@ -179,63 +104,47 @@ public IArmorLogic getArmorLogic() { return armorLogic; } - public ArmorMetaValueItem setArmorLogic(IArmorLogic armorLogic) { - Preconditions.checkNotNull(armorLogic, "Cannot set ArmorLogic to null"); - this.armorLogic = armorLogic; - this.armorLogic.addToolComponents(this); + public ArmorMetaValueItem setArmorLogic(EntityEquipmentSlot slot, String armorTextureName) { + this.armorLogic = new DummyArmorLogic(slot, armorTextureName); return this; } - @Override - public ArmorMetaValueItem addComponents(IItemComponent... stats) { - super.addComponents(stats); + public ArmorMetaValueItem setArmorLogic(IArmorLogic armorLogic) { + Preconditions.checkNotNull(armorLogic, "Cannot set ArmorLogic to null"); + this.armorLogic = armorLogic; return this; } @Override - public ArmorMetaValueItem setModelAmount(int modelAmount) { - return (ArmorMetaValueItem) super.setModelAmount(modelAmount); + public ArmorMetaValueItem setRarity(EnumRarity rarity) { + return (ArmorMetaValueItem) super.setRarity(rarity); } @Override - public ArmorMetaValueItem setRarity(EnumRarity rarity) { - return (ArmorMetaValueItem) super.setRarity(rarity); + public ArmorMetaValueItem setInvisible() { + super.setInvisible(); + return this; } } - @Override - public boolean isEnchantable(@NotNull ItemStack stack) { - return true; - } + private static class DummyArmorLogic implements IArmorLogic { - @Override - public int getItemEnchantability(@NotNull ItemStack stack) { - return 50; - } + private final EntityEquipmentSlot slot; + private final String armorTextureName; - @Override - public boolean canApplyAtEnchantingTable(@NotNull ItemStack stack, @NotNull Enchantment enchantment) { - EntityEquipmentSlot slot = this.getEquipmentSlot(stack); - if (slot == null || enchantment.type == null) { - return false; + public DummyArmorLogic(EntityEquipmentSlot slot, String armorTextureName) { + this.slot = slot; + this.armorTextureName = armorTextureName; } - IArmorLogic armorLogic = getArmorLogic(stack); - if (!armorLogic.canBreakWithDamage(stack) && enchantment.type == EnumEnchantmentType.BREAKABLE) { - return false; + @Override + public EntityEquipmentSlot getEquipmentSlot(ItemStack itemStack) { + return slot; } - switch (slot) { - case HEAD: - return enchantment.type.canEnchantItem(Items.DIAMOND_HELMET); - case CHEST: - return enchantment.type.canEnchantItem(Items.DIAMOND_CHESTPLATE); - case LEGS: - return enchantment.type.canEnchantItem(Items.DIAMOND_LEGGINGS); - case FEET: - return enchantment.type.canEnchantItem(Items.DIAMOND_BOOTS); - default: - return enchantment.isAllowedOnBooks(); + @Override + public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { + return String.format("gregtech:textures/items/armors/%s.png", armorTextureName); } } } diff --git a/src/main/java/gregtech/api/items/armor/ArmorUtils.java b/src/main/java/gregtech/api/items/armor/ArmorUtils.java index 2729c46fa38..651ccd6d566 100644 --- a/src/main/java/gregtech/api/items/armor/ArmorUtils.java +++ b/src/main/java/gregtech/api/items/armor/ArmorUtils.java @@ -2,39 +2,31 @@ import gregtech.api.capability.GregtechCapabilities; import gregtech.api.capability.IElectricItem; -import gregtech.api.util.ItemStackHashStrategy; import gregtech.common.ConfigHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.util.*; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.NonNullList; import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; -import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; +@Deprecated public class ArmorUtils { public static final Side SIDE = FMLCommonHandler.instance().getSide(); - public static final SoundEvent JET_ENGINE = new SoundEvent(new ResourceLocation("gregtech:jet_engine")); /** * Check is possible to charge item @@ -102,45 +94,6 @@ public static List, List>> getChargeableIte return inventorySlotMap; } - /** - * Spawn particle behind player with speedY speed - */ - public static void spawnParticle(World world, EntityPlayer player, EnumParticleTypes type, double speedY) { - if (type != null && SIDE.isClient()) { - Vec3d forward = player.getForward(); - world.spawnParticle(type, player.posX - forward.x, player.posY + 0.5D, player.posZ - forward.z, 0.0D, - speedY, 0.0D); - } - } - - public static void playJetpackSound(@NotNull EntityPlayer player) { - if (player.world.isRemote) { - float cons = (float) player.motionY + player.moveForward; - cons = MathHelper.clamp(cons, 0.6F, 1.0F); - - if (player.motionY > 0.05F) { - cons += 0.1F; - } - - if (player.motionY < -0.05F) { - cons -= 0.4F; - } - - player.playSound(JET_ENGINE, 0.3F, cons); - } - } - - /** - * Resets private field, amount of ticks player in the sky - */ - @SuppressWarnings("deprecation") - public static void resetPlayerFloatingTime(EntityPlayer player) { - if (player instanceof EntityPlayerMP) { - ObfuscationReflectionHelper.setPrivateValue(NetHandlerPlayServer.class, - ((EntityPlayerMP) player).connection, 0, "field_147365_f", "floatingTickCount"); - } - } - /** * This method feeds player with food, if food heal amount more than * empty food gaps, then reminder adds to saturation @@ -178,41 +131,6 @@ public static ActionResult canEat(EntityPlayer player, ItemStack food } } - /** - * Format itemstacks list from [1xitem@1, 1xitem@1, 1xitem@2] to - * [2xitem@1, 1xitem@2] - * - * @return Formated list - */ - public static List format(List input) { - Object2IntMap items = new Object2IntOpenCustomHashMap<>( - ItemStackHashStrategy.comparingAllButCount()); - List output = new ArrayList<>(); - for (ItemStack itemStack : input) { - if (items.containsKey(itemStack)) { - int amount = items.get(itemStack); - items.replace(itemStack, ++amount); - } else { - items.put(itemStack, 1); - } - } - for (Object2IntMap.Entry entry : items.object2IntEntrySet()) { - ItemStack stack = entry.getKey().copy(); - stack.setCount(entry.getIntValue()); - output.add(stack); - } - return output; - } - - @NotNull - public static String format(long value) { - return new DecimalFormat("###,###.##").format(value); - } - - public static String format(double value) { - return new DecimalFormat("###,###.##").format(value); - } - /** * Modular HUD class for armor * now available only string rendering, if will be needed, diff --git a/src/main/java/gregtech/api/items/armor/DummyArmorLogic.java b/src/main/java/gregtech/api/items/armor/DummyArmorLogic.java index 91c18351856..8b137891791 100644 --- a/src/main/java/gregtech/api/items/armor/DummyArmorLogic.java +++ b/src/main/java/gregtech/api/items/armor/DummyArmorLogic.java @@ -1,23 +1 @@ -package gregtech.api.items.armor; -import net.minecraft.entity.Entity; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; - -class DummyArmorLogic implements IArmorLogic { - - @Override - public EntityEquipmentSlot getEquipmentSlot(ItemStack itemStack) { - return EntityEquipmentSlot.HEAD; - } - - @Override - public boolean isValidArmor(ItemStack itemStack, Entity entity, EntityEquipmentSlot equipmentSlot) { - return false; - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - return "minecraft:textures/models/armor/diamond_layer_0.png"; - } -} diff --git a/src/main/java/gregtech/api/items/armor/IArmorItem.java b/src/main/java/gregtech/api/items/armor/IArmorItem.java deleted file mode 100644 index 41fb9b4eaf5..00000000000 --- a/src/main/java/gregtech/api/items/armor/IArmorItem.java +++ /dev/null @@ -1,18 +0,0 @@ -package gregtech.api.items.armor; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; - -public interface IArmorItem { - - default int getArmorLayersAmount(ItemStack itemStack) { - return 1; - } - - default int getArmorLayerColor(ItemStack itemStack, int layerIndex) { - return 0xFFFFFF; - } - - void damageArmor(EntityLivingBase entity, ItemStack itemStack, DamageSource source, int damage, int slot); -} diff --git a/src/main/java/gregtech/api/items/armor/IArmorLogic.java b/src/main/java/gregtech/api/items/armor/IArmorLogic.java index b8c906d4388..6ad18650172 100644 --- a/src/main/java/gregtech/api/items/armor/IArmorLogic.java +++ b/src/main/java/gregtech/api/items/armor/IArmorLogic.java @@ -1,82 +1,22 @@ package gregtech.api.items.armor; -import gregtech.api.items.armor.ArmorMetaItem.ArmorMetaValueItem; - -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; -import org.jetbrains.annotations.Nullable; -import java.util.UUID; - -/** - * Defines abstract armor logic that can be added to ArmorMetaItem to control it - * It can implement {@link net.minecraftforge.common.ISpecialArmor} for extended damage calculations - * supported instead of using vanilla attributes - */ +@Deprecated public interface IArmorLogic { - UUID ATTACK_DAMAGE_MODIFIER = UUID.fromString("CB3F55D3-645C-4F38-A144-9C13A33DB5CF"); - UUID ATTACK_SPEED_MODIFIER = UUID.fromString("FA233E1C-4180-4288-B05C-BCCE9785ACA3"); - - default void addToolComponents(ArmorMetaValueItem metaValueItem) {} - EntityEquipmentSlot getEquipmentSlot(ItemStack itemStack); - default boolean canBreakWithDamage(ItemStack stack) { - return false; - } - default void damageArmor(EntityLivingBase entity, ItemStack itemStack, DamageSource source, int damage, EntityEquipmentSlot equipmentSlot) {} - default Multimap getAttributeModifiers(EntityEquipmentSlot slot, ItemStack stack) { - return ImmutableMultimap.of(); - } - - default boolean isValidArmor(ItemStack itemStack, Entity entity, EntityEquipmentSlot equipmentSlot) { - return getEquipmentSlot(itemStack) == equipmentSlot; - } - default void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {} - @SideOnly(Side.CLIENT) - default void renderHelmetOverlay(ItemStack itemStack, EntityPlayer player, ScaledResolution resolution, - float partialTicks) {} - - default int getArmorLayersAmount(ItemStack itemStack) { - return 1; - } - - default int getArmorLayerColor(ItemStack itemStack, int layerIndex) { - return 0xFFFFFF; - } - String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type); - - @Nullable - default ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot, - ModelBiped defaultModel) { - return null; - } - - /** - * - * @return the value to multiply heat damage by - */ - default float getHeatResistance() { - return 1.0f; - } } diff --git a/src/main/java/gregtech/api/items/armor/ISpecialArmorLogic.java b/src/main/java/gregtech/api/items/armor/ISpecialArmorLogic.java index dda46689d2f..89e263b5b1a 100644 --- a/src/main/java/gregtech/api/items/armor/ISpecialArmorLogic.java +++ b/src/main/java/gregtech/api/items/armor/ISpecialArmorLogic.java @@ -13,6 +13,7 @@ * Armor logic that wraps {@link net.minecraftforge.common.ISpecialArmor} methods * to allow full control over damage absorption additionally to vanilla attribute values */ +@Deprecated public interface ISpecialArmorLogic extends IArmorLogic { /** diff --git a/src/main/java/gregtech/api/items/armoritem/ArmorBuilder.java b/src/main/java/gregtech/api/items/armoritem/ArmorBuilder.java new file mode 100644 index 00000000000..722d0e94ffd --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/ArmorBuilder.java @@ -0,0 +1,128 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.items.armoritem.armorset.IArmorSet; +import gregtech.api.items.armoritem.jetpack.IJetpackStats; + +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.EnumRarity; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.IRarity; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; + +public abstract class ArmorBuilder> { + + protected final String domain, id; + + /* IGTToolDefinition held values, extended builders do not need to access these */ + private final EntityEquipmentSlot slot; + private final List behaviors = new ArrayList<>(); + private IArmorSet armorSet; + private IJetpackStats jetpackStats; + private double damageAbsorption; + private final List handledUnblockableSources = new ArrayList<>(); + private boolean isEnchantable = true; + private int enchantability = 10; // default to vanilla diamond armor enchantability + private IRarity rarity = EnumRarity.COMMON; + private int durability; + + protected ArmorBuilder(@NotNull String domain, @NotNull String id, @NotNull EntityEquipmentSlot slot) { + this.domain = domain; + this.id = id; + this.slot = slot; + } + + public U behaviors(IArmorBehavior... behaviors) { + Collections.addAll(this.behaviors, behaviors); + return cast(this); + } + + public U rarity(IRarity rarity) { + this.rarity = rarity; + return cast(this); + } + + public U durability(int durability) { + this.durability = durability; + return cast(this); + } + + public U enchantability(int enchantability) { + this.enchantability = enchantability; + return cast(this); + } + + public U allowBlocking(DamageSource... sources) { + Collections.addAll(handledUnblockableSources, sources); + return cast(this); + } + + public U armorSet(IArmorSet armorSet) { + this.armorSet = armorSet; + return cast(this); + } + + public abstract Supplier supply(IGTArmorDefinition definition); + + public abstract U cast(ArmorBuilder builder); + + public final T build() { + return supply(buildDefinition()).get(); + } + + protected final IGTArmorDefinition buildDefinition() { + return new IGTArmorDefinition() { + + @Override + public @NotNull EntityEquipmentSlot getEquippedSlot() { + return slot; + } + + @Override + public @NotNull List getBehaviors() { + return behaviors; + } + + @Override + public @Nullable IArmorSet getArmorSet() { + return armorSet; + } + + @Override + public double getDamageAbsorption(EntityEquipmentSlot slot, @Nullable DamageSource damageSource) { + return damageAbsorption; + } + + @Override + public @NotNull List handledUnblockableSources() { + return handledUnblockableSources; + } + + @Override + public boolean isEnchantable() { + return isEnchantable; + } + + @Override + public int getEnchantability() { + return enchantability; + } + + @Override + public @NotNull IRarity getRarity() { + return rarity; + } + + @Override + public int getMaxDurability() { + return durability; + } + }; + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/ArmorHelper.java b/src/main/java/gregtech/api/items/armoritem/ArmorHelper.java new file mode 100644 index 00000000000..41a0876e2d7 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/ArmorHelper.java @@ -0,0 +1,51 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.items.armoritem.armorset.IArmorSet; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static net.minecraft.inventory.EntityEquipmentSlot.*; + +public class ArmorHelper { + + public static final String BEHAVIORS_TAG_KEY = "GT.Behaviors"; + + public static final String NIGHT_VISION_KEY = "NightVision"; + public static final String FALL_DAMAGE_KEY = "FallDamageCancel"; + public static final String STEP_ASSIST_KEY = "StepAssist"; + public static final String HEAT_REDUCTION_KEY = "HeatReduction"; + + /* Jetpack Keys */ + public static final String JETPACK_HOVER_KEY = "JetpackHover"; + public static final String FUELED_JETPACK_BURN_TIMER = "FuelBurnTime"; + + private static final EntityEquipmentSlot[] ARMOR_SLOTS = { FEET, LEGS, CHEST, HEAD }; + + public static NBTTagCompound getBehaviorsTag(@NotNull ItemStack stack) { + return stack.getOrCreateSubCompound(BEHAVIORS_TAG_KEY); + } + + public static EntityEquipmentSlot[] getArmorSlots() { + return ARMOR_SLOTS; + } + + public static boolean hasFullSet(@NotNull EntityPlayer player, @Nullable IArmorSet armorSet) { + if (armorSet == null) { + return false; + } + for (EntityEquipmentSlot slot : getArmorSlots()) { + ItemStack armorStack = player.getItemStackFromSlot(slot); + if (armorStack.isEmpty() || !(armorStack.getItem() instanceof IGTArmor gtArmor) || + gtArmor.getArmorSet() != armorSet) { + return false; + } + } + return true; + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/IArmorBehavior.java b/src/main/java/gregtech/api/items/armoritem/IArmorBehavior.java new file mode 100644 index 00000000000..dcf71b84383 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/IArmorBehavior.java @@ -0,0 +1,68 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.util.input.KeyBind; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public interface IArmorBehavior { + + /** + * Called every tick that this behavior's armor item is equipped. + */ + default void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) {} + + /** Called when this behavior's armor item is unequipped. */ + default void onArmorUnequip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) {} + + /** + * Called when this behavior's armor item is equipped, as well as when the player logs into the world or is cloned. + */ + default void onArmorEquip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) {} + + /** Add to this behavior's armor item tooltip. */ + default void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip) {} + + default Set getListenedKeys() { + return Collections.emptySet(); + } + + default void onKeyPressed(@NotNull ItemStack stack, @NotNull EntityPlayer player, KeyBind keyPressed) {} + + default void addBehaviorNBT(@NotNull ItemStack stack, @NotNull NBTTagCompound tag) {} + + /** + * Add a capability to this behavior's armor. + * Recommended to only use this if no other options exist. + * + * @param stack the armor + * @param tag the capability nbt of the item + */ + default ICapabilityProvider createProvider(@NotNull ItemStack stack, @Nullable NBTTagCompound tag) { + return null; + } + + // TODO implement HUD + /** Add to the Armor HUD text. */ + @SideOnly(Side.CLIENT) + default void addHudInformation(@NotNull ItemStack stack, @NotNull List hudText) {} + + /** Get the equipment slot for this behavior's armor item. Provided since the method call is somewhat obscure. */ + default EntityEquipmentSlot getEquipmentSlot(@NotNull ItemStack stack) { + return EntityLiving.getSlotForItemStack(stack); + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/IElectricArmorBehavior.java b/src/main/java/gregtech/api/items/armoritem/IElectricArmorBehavior.java new file mode 100644 index 00000000000..3bb2f0840cd --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/IElectricArmorBehavior.java @@ -0,0 +1,24 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.capability.GregtechCapabilities; +import gregtech.api.capability.IElectricItem; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; + +public interface IElectricArmorBehavior extends IArmorBehavior { + + @Override + default void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + IElectricItem electricItem = stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); + if (electricItem != null) { + onArmorTick(world, player, stack, electricItem); + } + } + + void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack, + @NotNull IElectricItem electricItem); +} diff --git a/src/main/java/gregtech/api/items/armoritem/IGTArmor.java b/src/main/java/gregtech/api/items/armoritem/IGTArmor.java new file mode 100644 index 00000000000..59d11fd08ce --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/IGTArmor.java @@ -0,0 +1,70 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.items.armoritem.armorset.IArmorSet; + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.ISpecialArmor; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public interface IGTArmor extends ISpecialArmor { + + String getDomain(); + + String getId(); + + @NotNull + IGTArmorDefinition getDefinition(); + + @NotNull + List getBehaviors(); + + @NotNull + EntityEquipmentSlot getEquipmentSlot(); + + @Nullable + IArmorSet getArmorSet(); + + /** + * If behavior logic can be run at all. Most commonly used for energy checks on electric armors. + * Typically used externally for behaviors which require event listeners to function properly. + */ + boolean areBehaviorsActive(@NotNull ItemStack stack); + + void onArmorEquip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack); + + void onArmorUnequip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack); + + default @NotNull Item get() { + return (Item) this; + } + + @NotNull + ItemStack getStack(); + + @SideOnly(Side.CLIENT) + default String getModelPath() { + return getDomain() + ":" + "armors/" + getId(); + } + + @SideOnly(Side.CLIENT) + default ModelResourceLocation getModelLocation() { + return new ModelResourceLocation(getModelPath(), "inventory"); + } + + // todo material-based armors + @SideOnly(Side.CLIENT) + default int getColor(ItemStack stack, int tintIndex) { + return 0xFFFFFF; + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/IGTArmorDefinition.java b/src/main/java/gregtech/api/items/armoritem/IGTArmorDefinition.java new file mode 100644 index 00000000000..b49c9ef64d7 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/IGTArmorDefinition.java @@ -0,0 +1,44 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.items.armoritem.armorset.IArmorSet; + +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.IRarity; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +// TODO A lot of these do not need to be in the "definition" class, but in the Item class +public interface IGTArmorDefinition { + + @NotNull + EntityEquipmentSlot getEquippedSlot(); + + @NotNull + List getBehaviors(); + + @Nullable + IArmorSet getArmorSet(); + + /* ArmorProperties */ + double getDamageAbsorption(EntityEquipmentSlot slot, @Nullable DamageSource damageSource); + + @NotNull + List handledUnblockableSources(); + + boolean isEnchantable(); + + int getEnchantability(); + + @NotNull + IRarity getRarity(); + + int getMaxDurability(); + + default boolean hasDurability() { + return getMaxDurability() > 0; + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/ItemGTArmor.java b/src/main/java/gregtech/api/items/armoritem/ItemGTArmor.java new file mode 100644 index 00000000000..e8b3cd9e184 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/ItemGTArmor.java @@ -0,0 +1,302 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.capability.impl.CombinedCapabilityProvider; +import gregtech.api.items.armoritem.armorset.IArmorSet; +import gregtech.api.util.input.IKeyPressedListener; +import gregtech.api.util.input.KeyBind; +import gregtech.common.creativetab.GTCreativeTabs; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnumEnchantmentType; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.NonNullList; +import net.minecraft.world.World; +import net.minecraftforge.common.IRarity; +import net.minecraftforge.common.capabilities.ICapabilityProvider; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +/** For armors which use durability or have infinite durability. */ +public class ItemGTArmor extends ItemArmor implements IGTArmor, IKeyPressedListener { + + private final String domain, id; + private final IGTArmorDefinition armorDefinition; + + public ItemGTArmor(String domain, String id, IGTArmorDefinition armorDefinition) { + super(ArmorMaterial.DIAMOND, 0, armorDefinition.getEquippedSlot()); + this.domain = domain; + this.id = id; + this.armorDefinition = armorDefinition; + setMaxStackSize(1); + setCreativeTab(GTCreativeTabs.TAB_GREGTECH_TOOLS); + setTranslationKey("gt.armor." + id); + setRegistryName(domain, id); + if (armorDefinition.hasDurability()) { + setMaxDamage(armorDefinition.getMaxDurability(), true); + } + } + + @Override + public String getDomain() { + return domain; + } + + @Override + public String getId() { + return id; + } + + @Override + public @NotNull ItemStack getStack() { + ItemStack stack = new ItemStack(get()); + + // Set behaviors + NBTTagCompound behaviorTag = ArmorHelper.getBehaviorsTag(stack); + getBehaviors().forEach(behavior -> behavior.addBehaviorNBT(stack, behaviorTag)); + return stack; + } + + public @NotNull IGTArmorDefinition getDefinition() { + return armorDefinition; + } + + @Override + public @NotNull List getBehaviors() { + return getDefinition().getBehaviors(); + } + + @Override + public @NotNull EntityEquipmentSlot getEquipmentSlot() { + return getDefinition().getEquippedSlot(); + } + + @Override + public @Nullable IArmorSet getArmorSet() { + return getDefinition().getArmorSet(); + } + + @Override + public boolean areBehaviorsActive(@NotNull ItemStack stack) { + return true; + } + + @Override + public ArmorProperties getProperties(EntityLivingBase player, @NotNull ItemStack armor, DamageSource source, + double damage, int slot) { + // todo this is gonna be a huge mess to unravel + return new ArmorProperties(0, 0, 0); + } + + @Override + public int getArmorDisplay(EntityPlayer player, @NotNull ItemStack armor, int slot) { + return (int) Math + .round(20.0F * getDamageModifier() * getDefinition().getDamageAbsorption(getEquipmentSlot(), null)); + } + + @Override + public void damageArmor(EntityLivingBase entity, @NotNull ItemStack stack, @Nullable DamageSource source, + int damage, int slot) { + if (getDefinition().hasDurability()) { + // todo need to do actual damage and save to NBT here, as "default" armor can break + // todo then override in ItemGTElectricArmor can do it as energy instead (or in addition to) + } + } + + @Override + public final @NotNull Item setMaxDamage(int maxDamageIn) { + // block this call from going through because we need additional information + // not yet available to us when MC calls this method initially. + return this; + } + + public void setMaxDamage(int maxDamageIn, @SuppressWarnings("unused") boolean forced) { + super.setMaxDamage(maxDamageIn); + } + + @Override + public boolean getIsRepairable(@NotNull ItemStack toRepair, @NotNull ItemStack repair) { + return false; + } + + @Override + public boolean handleUnblockableDamage(EntityLivingBase entity, @NotNull ItemStack armor, DamageSource source, + double damage, int slot) { + return armorDefinition.handledUnblockableSources().contains(source); + } + + @Override + public void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + if (areBehaviorsActive(stack)) { + for (IArmorBehavior behavior : getDefinition().getBehaviors()) { + behavior.onArmorTick(world, player, stack); + } + } + } + + @Override + public void onArmorUnequip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + for (IArmorBehavior behavior : getDefinition().getBehaviors()) { + if (player instanceof EntityPlayerMP playerMP) { + for (KeyBind keyBind : behavior.getListenedKeys()) { + keyBind.removeListener(playerMP, this); + } + } + behavior.onArmorUnequip(world, player, stack); + } + } + + @Override + public void onArmorEquip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + for (IArmorBehavior behavior : getDefinition().getBehaviors()) { + if (player instanceof EntityPlayerMP playerMP) { + for (KeyBind keyBind : behavior.getListenedKeys()) { + keyBind.registerListener(playerMP, this); + } + } + behavior.onArmorEquip(world, player, stack); + } + } + + @Override + public void onKeyPressed(EntityPlayerMP player, KeyBind keyPressed) { + for (IArmorBehavior behavior : getDefinition().getBehaviors()) { + if (behavior.getListenedKeys().contains(keyPressed)) { + behavior.onKeyPressed(player.getItemStackFromSlot(getEquipmentSlot()), player, keyPressed); + } + } + } + + @Override + public @Nullable String getArmorTexture(@NotNull ItemStack stack, @NotNull Entity entity, + @NotNull EntityEquipmentSlot slot, @NotNull String type) { + return String.format("%s:textures/items/armors/%s.png", getDomain(), getId()); + } + + @Override + public @NotNull IRarity getForgeRarity(@NotNull ItemStack stack) { + return getDefinition().getRarity(); + } + + @Override + public int getItemEnchantability() { + return getDefinition().getEnchantability(); + } + + @Override + public boolean isEnchantable(@NotNull ItemStack stack) { + return getDefinition().isEnchantable(); + } + + @Override + public boolean canApplyAtEnchantingTable(@NotNull ItemStack stack, @NotNull Enchantment enchantment) { + if (enchantment.type == null) return false; + + if (!getDefinition().hasDurability() && enchantment.type == EnumEnchantmentType.BREAKABLE) { + return false; + } + + // todo this should be good enough, but the below might be needed + return super.canApplyAtEnchantingTable(stack, enchantment); + + // return switch (equipmentSlot) { + // case HEAD -> enchantment.type.canEnchantItem(Items.DIAMOND_HELMET); + // case CHEST -> enchantment.type.canEnchantItem(Items.DIAMOND_CHESTPLATE); + // case LEGS -> enchantment.type.canEnchantItem(Items.DIAMOND_LEGGINGS); + // case FEET -> enchantment.type.canEnchantItem(Items.DIAMOND_BOOTS); + // default -> enchantment.isAllowedOnBooks(); + // }; + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip, + @NotNull ITooltipFlag flag) { + // todo armor toughness tooltip + for (IArmorBehavior behavior : getDefinition().getBehaviors()) { + behavior.addInformation(stack, world, tooltip); + } + } + + @Override + public void getSubItems(@NotNull CreativeTabs tab, @NotNull NonNullList items) { + if (this.isInCreativeTab(tab)) { + items.add(getStack()); + } + } + + @Override + public final @Nullable ICapabilityProvider initCapabilities(@NotNull ItemStack stack, + @Nullable NBTTagCompound tag) { + List providers = getCapabilityProviders(stack, tag); + if (providers.isEmpty()) return null; + if (providers.size() == 1) return providers.get(0); + return new CombinedCapabilityProvider(providers); + } + + protected @NotNull List getCapabilityProviders(@NotNull ItemStack stack, + @Nullable NBTTagCompound tag) { + List providers = new ArrayList<>(); + for (IArmorBehavior behavior : getDefinition().getBehaviors()) { + ICapabilityProvider provider = behavior.createProvider(stack, tag); + if (provider != null) { + providers.add(provider); + } + } + return providers; + } + + protected float getDamageModifier() { + return switch (getEquipmentSlot()) { + case HEAD, FEET -> 0.15f; + case CHEST -> 0.4f; + case LEGS -> 0.3f; + default -> 0.0f; + }; + } + + private static EntityEquipmentSlot getSlotByIndex(int index) { + return switch (index) { + case 0 -> EntityEquipmentSlot.FEET; + case 1 -> EntityEquipmentSlot.LEGS; + case 2 -> EntityEquipmentSlot.CHEST; + default -> EntityEquipmentSlot.HEAD; + }; + } + + public static class Builder extends ArmorBuilder { + + public static @NotNull Builder of(@NotNull String domain, @NotNull String id, + @NotNull EntityEquipmentSlot slot) { + return new Builder(domain, id, slot); + } + + private Builder(@NotNull String domain, @NotNull String id, @NotNull EntityEquipmentSlot slot) { + super(domain, id, slot); + } + + @Override + public Supplier supply(IGTArmorDefinition definition) { + return () -> new ItemGTArmor(domain, id, definition); + } + + @Override + public Builder cast(ArmorBuilder builder) { + return (Builder) builder; + } + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/ItemGTElectricArmor.java b/src/main/java/gregtech/api/items/armoritem/ItemGTElectricArmor.java new file mode 100644 index 00000000000..c395b87fa70 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/ItemGTElectricArmor.java @@ -0,0 +1,156 @@ +package gregtech.api.items.armoritem; + +import gregtech.api.GTValues; +import gregtech.api.capability.GregtechCapabilities; +import gregtech.api.capability.IElectricItem; +import gregtech.api.capability.impl.ElectricItem; +import gregtech.api.items.metaitem.ElectricStats; + +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.ICapabilityProvider; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Supplier; + +/** For armors which use power, either instead of or in addition to durability. */ +public class ItemGTElectricArmor extends ItemGTArmor { + + private static final IElectricItem EMPTY_STATS = new ElectricItem(ItemStack.EMPTY, 0, 0, false, false); + + protected final int tier; + protected final long maxCharge; + protected final long energyPerUse; // todo better name + protected final int energyScaleFactor; // todo better name + protected final boolean canChargeExternally; + + public ItemGTElectricArmor(String domain, String id, + IGTArmorDefinition armorDefinition, + int tier, + long maxCharge, + long energyPerUse, + int energyScaleFactor, + boolean canChargeExternally) { + super(domain, id, armorDefinition); + this.tier = tier; + this.maxCharge = maxCharge; + this.energyPerUse = energyPerUse; + this.energyScaleFactor = energyScaleFactor; // was originally 10 for nano, 100 for quantum + this.canChargeExternally = canChargeExternally; + } + + protected @NotNull IElectricItem getElectricItem(ItemStack armor) { + IElectricItem electricItem = armor.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); + return electricItem != null ? electricItem : EMPTY_STATS; + } + + @Override + public void damageArmor(EntityLivingBase entity, @NotNull ItemStack stack, @Nullable DamageSource source, + int damage, int slot) { + IElectricItem electricItem = getElectricItem(stack); + long amountDrawn, amountToDraw = energyPerUse * damage / energyScaleFactor; + amountDrawn = electricItem.discharge(amountToDraw, electricItem.getTier(), true, false, false); + if (amountDrawn < amountToDraw) { + // send remaining damage to durability (will be tested in super if it should be checked) + super.damageArmor(entity, stack, source, + (int) Math.max(1, damage * (amountToDraw - amountDrawn) / amountToDraw), slot); + } + } + + @Override + public int getArmorDisplay(EntityPlayer player, @NotNull ItemStack armor, int slot) { + IElectricItem electricItem = getElectricItem(armor); + if (electricItem.getCharge() < energyPerUse) { + return (int) Math + .round(4.0f * getDamageModifier() * getDefinition().getDamageAbsorption(getEquipmentSlot(), null)); + } + return super.getArmorDisplay(player, armor, slot); + } + + @Override + public boolean areBehaviorsActive(@NotNull ItemStack stack) { + // all behaviors for electric armors need power to work, even if they don't have their own cost + return getElectricItem(stack).getCharge() > 0; + } + + @Override + protected @NotNull List getCapabilityProviders(@NotNull ItemStack stack, + @Nullable NBTTagCompound tag) { + List providers = super.getCapabilityProviders(stack, tag); + ElectricStats stats = new ElectricStats(maxCharge, tier, true, canChargeExternally); + providers.add(stats.createProvider(stack)); + return providers; + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip, + @NotNull ITooltipFlag flag) { + IElectricItem electricItem = getElectricItem(stack); + tooltip.add(I18n.format("metaitem.generic.electric_item.tooltip", + electricItem.getCharge(), + electricItem.getMaxCharge(), + GTValues.VNF[electricItem.getTier()])); + super.addInformation(stack, world, tooltip, flag); + } + + public static class Builder extends ArmorBuilder { + + protected int tier; + protected long maxCharge; + protected long energyPerUse; + protected int energyScaleFactor = 1; // todo, just setting this because of div by 0 + protected boolean canChargeExternally; + + public static @NotNull Builder of(@NotNull String domain, @NotNull String id, + @NotNull EntityEquipmentSlot slot) { + return new Builder(domain, id, slot); + } + + private Builder(@NotNull String domain, @NotNull String id, @NotNull EntityEquipmentSlot slot) { + super(domain, id, slot); + } + + public Builder electric(int tier, long maxCharge) { + this.tier = tier; + this.maxCharge = maxCharge; + return this; + } + + public Builder electricCost(long energyPerUse) { + this.energyPerUse = energyPerUse; + return this; + } + + public Builder electricCost(long energyPerUse, int energyScaleFactor) { + this.energyPerUse = energyPerUse; + this.energyScaleFactor = energyScaleFactor; + return this; + } + + public Builder chargeOtherItems() { + this.canChargeExternally = true; + return this; + } + + @Override + public Supplier supply(IGTArmorDefinition definition) { + return () -> new ItemGTElectricArmor(domain, id, definition, tier, maxCharge, energyPerUse, + energyScaleFactor, canChargeExternally); + } + + @Override + public Builder cast(ArmorBuilder builder) { + return (Builder) builder; + } + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/ItemGTFueledArmor.java b/src/main/java/gregtech/api/items/armoritem/ItemGTFueledArmor.java new file mode 100644 index 00000000000..93581973168 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/ItemGTFueledArmor.java @@ -0,0 +1,4 @@ +package gregtech.api.items.armoritem; + +/** For armors which use a liquid fuel, either instead of or in addition to durability. */ +public class ItemGTFueledArmor {} diff --git a/src/main/java/gregtech/api/items/armoritem/armorset/IArmorSet.java b/src/main/java/gregtech/api/items/armoritem/armorset/IArmorSet.java new file mode 100644 index 00000000000..492865336c9 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/armorset/IArmorSet.java @@ -0,0 +1,16 @@ +package gregtech.api.items.armoritem.armorset; + +import gregtech.api.items.armoritem.ArmorHelper; + +import net.minecraft.entity.player.EntityPlayer; + +import java.util.Set; + +public interface IArmorSet { + + Set getSetBonuses(); + + default boolean hasFullSet(EntityPlayer player) { + return ArmorHelper.hasFullSet(player, this); + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/armorset/ISetBonus.java b/src/main/java/gregtech/api/items/armoritem/armorset/ISetBonus.java new file mode 100644 index 00000000000..d6cb2251847 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/armorset/ISetBonus.java @@ -0,0 +1,3 @@ +package gregtech.api.items.armoritem.armorset; + +public interface ISetBonus {} diff --git a/src/main/java/gregtech/api/items/armoritem/jetpack/IJetpackStats.java b/src/main/java/gregtech/api/items/armoritem/jetpack/IJetpackStats.java new file mode 100644 index 00000000000..136fa96e122 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/jetpack/IJetpackStats.java @@ -0,0 +1,27 @@ +package gregtech.api.items.armoritem.jetpack; + +import net.minecraft.util.EnumParticleTypes; + +import org.jetbrains.annotations.Nullable; + +public interface IJetpackStats { + + double getSprintEnergyModifier(); + + double getSprintSpeedModifier(); + + double getVerticalHoverSpeed(); + + double getVerticalHoverSlowSpeed(); + + double getVerticalAcceleration(); + + double getVerticalSpeed(); + + double getSidewaysSpeed(); + + float getFallDamageReduction(); + + @Nullable + EnumParticleTypes getParticle(); +} diff --git a/src/main/java/gregtech/api/items/armoritem/jetpack/JetpackBehavior.java b/src/main/java/gregtech/api/items/armoritem/jetpack/JetpackBehavior.java new file mode 100644 index 00000000000..26d09623ecc --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/jetpack/JetpackBehavior.java @@ -0,0 +1,149 @@ +package gregtech.api.items.armoritem.jetpack; + +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.IArmorBehavior; +import gregtech.api.util.input.KeyBind; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public abstract class JetpackBehavior implements IArmorBehavior { + + private final IJetpackStats jetpackStats; + + public JetpackBehavior(IJetpackStats jetpackStats) { + this.jetpackStats = jetpackStats; + } + + /** How much Fuel (or Energy) to use per tick while flying. Can be modified by stats in {@link IJetpackStats}. */ + protected abstract int getFuelPerUse(); + + /** Drain the specified amount of Fuel (or Energy) from this Jetpack. */ + protected abstract boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simulate); + + @Override + public Set getListenedKeys() { + return Collections.singleton(KeyBind.ARMOR_HOVER); + } + + @Override + public void onKeyPressed(@NotNull ItemStack stack, @NotNull EntityPlayer player, KeyBind keyPressed) { + if (keyPressed == KeyBind.ARMOR_HOVER) { + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(stack); + boolean wasHover = tag.getBoolean(ArmorHelper.JETPACK_HOVER_KEY); + tag.setBoolean(ArmorHelper.JETPACK_HOVER_KEY, !wasHover); + + if (wasHover) { + player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.disable"), true); + } else { + player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.enable"), true); + } + } + } + + @Override + public void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(stack); + boolean hover = tag.getBoolean(ArmorHelper.JETPACK_HOVER_KEY); + performFlying(player, stack, hover); + } + + /* + * Called every tick, performs flying if the correct keys are pressed. + * Logic from SimplyJetpacks2: + * https://github.com/Tomson124/SimplyJetpacks2/blob/1.12/src/main/java/tonius/simplyjetpacks/item/ItemJetpack.java + */ + private void performFlying(@NotNull EntityPlayer player, @NotNull ItemStack stack, boolean hover) { + double currentAccel = jetpackStats.getVerticalAcceleration() * (player.motionY < 0.3D ? 2.5D : 1.0D); + double currentSpeedVertical = jetpackStats.getVerticalSpeed() * (player.isInWater() ? 0.4D : 1.0D); + boolean flyKeyDown = KeyBind.VANILLA_JUMP.isKeyDown(player); + boolean descendKeyDown = KeyBind.VANILLA_SNEAK.isKeyDown(player); + + if (flyKeyDown || hover && !player.onGround) { + if (!player.isInWater() && !player.isInLava() && drainFuel(stack, getFuelPerUse(), true)) { + drainFuel(stack, + (int) (player.isSprinting() ? + Math.round(getFuelPerUse() * jetpackStats.getSprintEnergyModifier()) : getFuelPerUse()), + false); + + if (flyKeyDown) { + if (!hover) { + player.motionY = Math.min(player.motionY + currentAccel, currentSpeedVertical); + } else { + if (descendKeyDown) player.motionY = Math.min(player.motionY + currentAccel, + jetpackStats.getVerticalHoverSlowSpeed()); + else player.motionY = Math.min(player.motionY + currentAccel, + jetpackStats.getVerticalHoverSpeed()); + } + } else if (descendKeyDown) { + player.motionY = Math.min(player.motionY + currentAccel, -jetpackStats.getVerticalHoverSpeed()); + } else { + player.motionY = Math.min(player.motionY + currentAccel, -jetpackStats.getVerticalHoverSlowSpeed()); + } + float speedSideways = (float) (player.isSneaking() ? jetpackStats.getSidewaysSpeed() * 0.5f : + jetpackStats.getSidewaysSpeed()); + float speedForward = (float) (player.isSprinting() ? + speedSideways * jetpackStats.getSprintSpeedModifier() : speedSideways); + + if (KeyBind.VANILLA_FORWARD.isKeyDown(player)) + player.moveRelative(0, 0, speedForward, speedForward); + if (KeyBind.VANILLA_BACKWARD.isKeyDown(player)) + player.moveRelative(0, 0, -speedSideways, speedSideways * 0.8f); + if (KeyBind.VANILLA_LEFT.isKeyDown(player)) + player.moveRelative(speedSideways, 0, 0, speedSideways); + if (KeyBind.VANILLA_RIGHT.isKeyDown(player)) + player.moveRelative(-speedSideways, 0, 0, speedSideways); + if (!player.getEntityWorld().isRemote) { + player.fallDistance = 0; + } + spawnParticle(player.getEntityWorld(), player, jetpackStats.getParticle()); + } + } + // TODO Reset player floating time? + // TODO Emergency hover? + // TODO Jetpack sfx? + } + + /* Spawn particle behind player with speedY speed */ + private static void spawnParticle(@NotNull World world, EntityPlayer player, EnumParticleTypes type) { + if (type != null && world.isRemote) { + Vec3d forward = player.getForward(); + world.spawnParticle(type, player.posX - forward.x, player.posY + 0.5D, player.posZ - forward.z, 0.0D, -0.6D, + 0.0D); + } + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip) { + addInformation(stack, tooltip); + } + + @Override + public void addHudInformation(@NotNull ItemStack stack, @NotNull List hudText) { + addInformation(stack, hudText); + } + + private void addInformation(ItemStack stack, List tooltip) { + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(stack); + String status; + if (tag.getBoolean(ArmorHelper.JETPACK_HOVER_KEY)) { + status = I18n.format("metaarmor.hud.status.enabled"); + } else { + status = I18n.format("metaarmor.hud.status.disabled"); + } + tooltip.add(I18n.format("metaarmor.hud.hover_mode", status)); + } +} diff --git a/src/main/java/gregtech/api/items/armoritem/package-info.java b/src/main/java/gregtech/api/items/armoritem/package-info.java new file mode 100644 index 00000000000..bddb1531fd6 --- /dev/null +++ b/src/main/java/gregtech/api/items/armoritem/package-info.java @@ -0,0 +1,12 @@ +/** + * Package for the new Armor implementation for GTCEu. + * Old armor implementation can be found in {@link gregtech.api.items.armor}, + * which is slated for removal in v... TODO + * + * TODO Old armor logic should be removed immediately, items should exist + * TODO with the purpose of recipes to convert them to the new items. + * + * @since v... TODO + * @author serenibyss + */ +package gregtech.api.items.armoritem; diff --git a/src/main/java/gregtech/api/items/materialitem/MetaPrefixItem.java b/src/main/java/gregtech/api/items/materialitem/MetaPrefixItem.java index f84e0264ad2..7d77c914187 100644 --- a/src/main/java/gregtech/api/items/materialitem/MetaPrefixItem.java +++ b/src/main/java/gregtech/api/items/materialitem/MetaPrefixItem.java @@ -2,7 +2,8 @@ import gregtech.api.GTValues; import gregtech.api.damagesources.DamageSources; -import gregtech.api.items.armor.ArmorMetaItem; +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.IGTArmor; import gregtech.api.items.metaitem.StandardMetaItem; import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.material.Material; @@ -26,6 +27,7 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -159,11 +161,16 @@ public void onUpdate(@NotNull ItemStack itemStack, @NotNull World worldIn, @NotN if (material == null || !material.hasProperty(PropertyKey.BLAST)) return; float heatDamage = prefix.heatDamageFunction.apply(material.getBlastTemperature()); - ItemStack armor = entity.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - if (!armor.isEmpty() && armor.getItem() instanceof ArmorMetaItem) { - ArmorMetaItem.ArmorMetaValueItem metaValueItem = ((ArmorMetaItem) armor.getItem()) - .getItem(armor); - if (metaValueItem != null) heatDamage *= metaValueItem.getArmorLogic().getHeatResistance(); + for (EntityEquipmentSlot slot : ArmorHelper.getArmorSlots()) { + ItemStack armor = entity.getItemStackFromSlot(slot); + if (!armor.isEmpty() && armor.getItem() instanceof IGTArmor gtArmor) { + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(armor); + if (tag.hasKey(ArmorHelper.HEAT_REDUCTION_KEY) && gtArmor.areBehaviorsActive(armor)) { + float reductionFactor = tag.getFloat(ArmorHelper.HEAT_REDUCTION_KEY); + if (reductionFactor == 0) return; + heatDamage *= reductionFactor; + } + } } if (heatDamage > 0.0) { diff --git a/src/main/java/gregtech/api/items/toolitem/IGTTool.java b/src/main/java/gregtech/api/items/toolitem/IGTTool.java index 94ae45effb9..884454e3838 100644 --- a/src/main/java/gregtech/api/items/toolitem/IGTTool.java +++ b/src/main/java/gregtech/api/items/toolitem/IGTTool.java @@ -82,8 +82,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; -import static gregtech.api.items.armor.IArmorLogic.ATTACK_DAMAGE_MODIFIER; -import static gregtech.api.items.armor.IArmorLogic.ATTACK_SPEED_MODIFIER; import static gregtech.api.items.toolitem.ToolHelper.*; /** diff --git a/src/main/java/gregtech/api/items/toolitem/ToolHelper.java b/src/main/java/gregtech/api/items/toolitem/ToolHelper.java index 8b1a8ef147a..d30a620a8a9 100644 --- a/src/main/java/gregtech/api/items/toolitem/ToolHelper.java +++ b/src/main/java/gregtech/api/items/toolitem/ToolHelper.java @@ -152,6 +152,9 @@ public final class ToolHelper { public static final Supplier SUPPLY_POWER_UNIT_EV = () -> MetaItems.POWER_UNIT_EV.getStackForm(); public static final Supplier SUPPLY_POWER_UNIT_IV = () -> MetaItems.POWER_UNIT_IV.getStackForm(); + public static final UUID ATTACK_DAMAGE_MODIFIER = UUID.fromString("CB3F55D3-645C-4F38-A144-9C13A33DB5CF"); + public static final UUID ATTACK_SPEED_MODIFIER = UUID.fromString("FA233E1C-4180-4288-B05C-BCCE9785ACA3"); + // for retrieving the silk touch drop from a block. Cannot be Access-Transformed because it is a Forge method. private static final MethodHandle GET_SILK_TOUCH_DROP; diff --git a/src/main/java/gregtech/api/util/input/IKeyPressedListener.java b/src/main/java/gregtech/api/util/input/IKeyPressedListener.java new file mode 100644 index 00000000000..1ff03f8ff1b --- /dev/null +++ b/src/main/java/gregtech/api/util/input/IKeyPressedListener.java @@ -0,0 +1,8 @@ +package gregtech.api.util.input; + +import net.minecraft.entity.player.EntityPlayerMP; + +public interface IKeyPressedListener { + + void onKeyPressed(EntityPlayerMP player, KeyBind keyPressed); +} diff --git a/src/main/java/gregtech/api/util/input/KeyBind.java b/src/main/java/gregtech/api/util/input/KeyBind.java index 74ec9442afb..d3db93788d1 100644 --- a/src/main/java/gregtech/api/util/input/KeyBind.java +++ b/src/main/java/gregtech/api/util/input/KeyBind.java @@ -1,9 +1,9 @@ package gregtech.api.util.input; -import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.util.GTLog; -import gregtech.core.network.packets.PacketKeysPressed; +import gregtech.core.network.packets.PacketKeyPressed; +import gregtech.core.network.packets.PacketKeysDown; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; @@ -16,26 +16,32 @@ import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.tuple.MutablePair; +import it.unimi.dsi.fastutil.ints.Int2BooleanMap; +import it.unimi.dsi.fastutil.ints.Int2BooleanOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import java.util.WeakHashMap; import java.util.function.Supplier; public enum KeyBind { + /* Held keys */ VANILLA_JUMP(() -> () -> Minecraft.getMinecraft().gameSettings.keyBindJump), VANILLA_SNEAK(() -> () -> Minecraft.getMinecraft().gameSettings.keyBindSneak), VANILLA_FORWARD(() -> () -> Minecraft.getMinecraft().gameSettings.keyBindForward), VANILLA_BACKWARD(() -> () -> Minecraft.getMinecraft().gameSettings.keyBindBack), VANILLA_LEFT(() -> () -> Minecraft.getMinecraft().gameSettings.keyBindLeft), VANILLA_RIGHT(() -> () -> Minecraft.getMinecraft().gameSettings.keyBindRight), + + /* Pressed keys */ ARMOR_MODE_SWITCH("gregtech.key.armor_mode_switch", KeyConflictContext.IN_GAME, Keyboard.KEY_M), ARMOR_HOVER("gregtech.key.armor_hover", KeyConflictContext.IN_GAME, Keyboard.KEY_H), ARMOR_CHARGING("gregtech.key.armor_charging", KeyConflictContext.IN_GAME, Keyboard.KEY_N), @@ -43,52 +49,13 @@ public enum KeyBind { public static final KeyBind[] VALUES = values(); - public static void init() { - GTLog.logger.info("Registering KeyBinds"); - if (FMLCommonHandler.instance().getSide().isClient()) { - MinecraftForge.EVENT_BUS.register(KeyBind.class); - } - } - - @SubscribeEvent - @SideOnly(Side.CLIENT) - public static void onInputEvent(InputEvent.KeyInputEvent event) { - List updating = new ArrayList<>(); - for (KeyBind keybind : VALUES) { - boolean previousPressed = keybind.isPressed; - boolean previousKeyDown = keybind.isKeyDown; - keybind.isPressed = keybind.isPressed(); - keybind.isKeyDown = keybind.isKeyDown(); - if (previousPressed != keybind.isPressed || previousKeyDown != keybind.isKeyDown) { - updating.add(keybind); - } - } - if (!updating.isEmpty()) { - GregTechAPI.networkHandler.sendToServer(new PacketKeysPressed(updating)); - } - } - - @SideOnly(Side.CLIENT) - public static boolean scrollingUp() { - return Mouse.getEventDWheel() > 0; - } - - @SideOnly(Side.CLIENT) - public static boolean notScrolling() { - return Mouse.getEventDWheel() == 0; - } - - @SideOnly(Side.CLIENT) - public static boolean scrollingDown() { - return Mouse.getEventDWheel() < 0; - } - @SideOnly(Side.CLIENT) private KeyBinding keybinding; @SideOnly(Side.CLIENT) - private boolean isPressed, isKeyDown; + private boolean isKeyDown; - private final WeakHashMap> mapping = new WeakHashMap<>(); + private final WeakHashMap mapping = new WeakHashMap<>(); + private final WeakHashMap> listeners = new WeakHashMap<>(); // For Vanilla/Other Mod keybinds // Double Supplier to keep client classes from loading @@ -98,60 +65,89 @@ public static boolean scrollingDown() { } } - KeyBind(String langKey, int button) { + KeyBind(String langKey, IKeyConflictContext ctx, int button) { if (FMLCommonHandler.instance().getSide().isClient()) { - this.keybinding = new KeyBinding(langKey, button, GTValues.MOD_NAME); + this.keybinding = new KeyBinding(langKey, ctx, button, "GregTech"); ClientRegistry.registerKeyBinding(this.keybinding); } } - KeyBind(String langKey, IKeyConflictContext ctx, int button) { + public static void init() { + GTLog.logger.info("Registering KeyBinds"); if (FMLCommonHandler.instance().getSide().isClient()) { - this.keybinding = new KeyBinding(langKey, ctx, button, GTValues.MOD_NAME); - ClientRegistry.registerKeyBinding(this.keybinding); + MinecraftForge.EVENT_BUS.register(KeyBind.class); } } + /** + * Handle Keys which we track for "holds" on the server, meaning if a key is being pressed + * down for a prolonged period of time. This is a state which gets saved on the server. + */ + @SubscribeEvent @SideOnly(Side.CLIENT) - public KeyBinding toMinecraft() { - return this.keybinding; + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.START) { + Int2BooleanMap updatingKeyDown = new Int2BooleanOpenHashMap(); + for (KeyBind keybind : VALUES) { + boolean previousKeyDown = keybind.isKeyDown; + keybind.isKeyDown = keybind.keybinding.isKeyDown(); + if (previousKeyDown != keybind.isKeyDown) { + updatingKeyDown.put(keybind.ordinal(), keybind.isKeyDown); + } + } + if (!updatingKeyDown.isEmpty()) { + GregTechAPI.networkHandler.sendToServer(new PacketKeysDown(updatingKeyDown)); + } + } } - @SideOnly(Side.CLIENT) - public boolean isPressed() { - return this.keybinding.isPressed(); + public void updateKeyDown(boolean keyDown, EntityPlayerMP player) { + this.mapping.put(player, keyDown); } - @SideOnly(Side.CLIENT) - public boolean isKeyDown() { - return this.keybinding.isKeyDown(); + public boolean isKeyDown(EntityPlayer player) { + if (player.world.isRemote) return keybinding.isKeyDown(); + // potential NPE here on unboxing if it is returned directly + Boolean isKeyDown = mapping.get((EntityPlayerMP) player); + return isKeyDown != null ? isKeyDown : false; } - public void update(boolean pressed, boolean keyDown, EntityPlayerMP player) { - MutablePair pair = this.mapping.get(player); - if (pair == null) { - this.mapping.put(player, MutablePair.of(pressed, keyDown)); - } else { - pair.left = pressed; - pair.right = keyDown; + /** + * Handle Keys which we track for "presses" on the server, meaning a single input which + * sends a packet to the server which informs all listeners. + */ + @SubscribeEvent + @SideOnly(Side.CLIENT) + public static void onInputEvent(InputEvent.KeyInputEvent event) { + IntList updatingPressed = new IntArrayList(); + for (KeyBind keybind : VALUES) { + if (keybind.keybinding.isPressed()) { + updatingPressed.add(keybind.ordinal()); + } + } + if (!updatingPressed.isEmpty()) { + GregTechAPI.networkHandler.sendToServer(new PacketKeyPressed(updatingPressed)); } } - public boolean isPressed(EntityPlayer player) { - if (player.world.isRemote) { - return isPressed(); - } else { - MutablePair pair = this.mapping.get((EntityPlayerMP) player); - return pair != null && pair.left; + public void onKeyPressed(EntityPlayerMP player) { + Set listenerSet = listeners.get(player); + if (listenerSet != null && !listenerSet.isEmpty()) { + for (var listener : listenerSet) { + listener.onKeyPressed(player, this); + } } } - public boolean isKeyDown(EntityPlayer player) { - if (player.world.isRemote) { - return isKeyDown(); - } else { - MutablePair pair = this.mapping.get((EntityPlayerMP) player); - return pair != null && pair.right; + public void registerListener(EntityPlayerMP player, IKeyPressedListener listener) { + Set listenerSet = listeners.computeIfAbsent(player, k -> new HashSet<>()); + listenerSet.add(listener); + } + + public void removeListener(EntityPlayerMP player, IKeyPressedListener listener) { + Set listenerSet = listeners.get(player); + if (listenerSet != null) { + listenerSet.remove(listener); } } } diff --git a/src/main/java/gregtech/asm/hooks/ArmorHooks.java b/src/main/java/gregtech/asm/hooks/ArmorHooks.java deleted file mode 100644 index 5eec5ddeff6..00000000000 --- a/src/main/java/gregtech/asm/hooks/ArmorHooks.java +++ /dev/null @@ -1,26 +0,0 @@ -package gregtech.asm.hooks; - -import gregtech.api.items.armor.IArmorItem; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.NonNullList; - -@SuppressWarnings("unused") -public class ArmorHooks { - - public static void damageArmor(float damage, EntityLivingBase entity, NonNullList inventory, - DamageSource damageSource) { - double armorDamage = Math.max(1.0F, damage / 4.0F); - for (int i = 0; i < inventory.size(); i++) { - ItemStack itemStack = inventory.get(i); - if (itemStack.getItem() instanceof IArmorItem) { - ((IArmorItem) itemStack.getItem()).damageArmor(entity, itemStack, damageSource, (int) armorDamage, i); - if (inventory.get(i).getCount() == 0) { - inventory.set(i, ItemStack.EMPTY); - } - } - } - } -} diff --git a/src/main/java/gregtech/asm/hooks/ArmorRenderHooks.java b/src/main/java/gregtech/asm/hooks/ArmorRenderHooks.java index 57b6728fc31..67f80aabce3 100644 --- a/src/main/java/gregtech/asm/hooks/ArmorRenderHooks.java +++ b/src/main/java/gregtech/asm/hooks/ArmorRenderHooks.java @@ -1,6 +1,6 @@ package gregtech.asm.hooks; -import gregtech.api.items.armor.IArmorItem; +import gregtech.api.items.armor.ArmorMetaItem; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBiped; @@ -18,6 +18,7 @@ @SuppressWarnings("unused") @SideOnly(Side.CLIENT) +@Deprecated public class ArmorRenderHooks { public static boolean shouldNotRenderHeadItem(EntityLivingBase entityLivingBase) { @@ -26,7 +27,8 @@ public static boolean shouldNotRenderHeadItem(EntityLivingBase entityLivingBase) } public static boolean isArmorItem(ItemStack itemStack, EntityEquipmentSlot slot) { - return (itemStack.getItem() instanceof IArmorItem && itemStack.getItem().getEquipmentSlot(itemStack) == slot); + return (itemStack.getItem() instanceof ArmorMetaItem && + itemStack.getItem().getEquipmentSlot(itemStack) == slot); } public static void renderArmorLayer(LayerArmorBase layer, EntityLivingBase entity, float limbSwing, @@ -35,7 +37,6 @@ public static void renderArmorLayer(LayerArmorBase layer, EntityLivin ItemStack itemStack = entity.getItemStackFromSlot(slotIn); if (isArmorItem(itemStack, slotIn)) { - IArmorItem armorItem = (IArmorItem) itemStack.getItem(); ModelBase armorModel = layer.getModelFromSlot(slotIn); if (armorModel instanceof ModelBiped) { armorModel = ForgeHooksClient.getArmorModel(entity, itemStack, slotIn, (ModelBiped) armorModel); @@ -47,17 +48,10 @@ public static void renderArmorLayer(LayerArmorBase layer, EntityLivin GlStateManager.enableBlend(); GlStateManager.blendFunc(SourceFactor.ONE, DestFactor.ONE_MINUS_SRC_ALPHA); - int layers = armorItem.getArmorLayersAmount(itemStack); - for (int layerIndex = 0; layerIndex < layers; layerIndex++) { - int i = armorItem.getArmorLayerColor(itemStack, layerIndex); - float f = (float) (i >> 16 & 255) / 255.0F; - float f1 = (float) (i >> 8 & 255) / 255.0F; - float f2 = (float) (i & 255) / 255.0F; - GlStateManager.color(f, f1, f2, 1.0f); - String type = layerIndex == 0 ? null : "layer_" + layerIndex; - layer.renderer.bindTexture(getArmorTexture(entity, itemStack, slotIn, type)); - armorModel.render(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); - } + GlStateManager.color(1, 1, 1, 1); + layer.renderer.bindTexture(getArmorTexture(entity, itemStack, slotIn)); + armorModel.render(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); + if (itemStack.hasEffect()) { LayerArmorBase.renderEnchantedGlint(layer.renderer, entity, armorModel, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); @@ -70,7 +64,7 @@ private static boolean isLegSlot(EntityEquipmentSlot equipmentSlot) { } private static ResourceLocation getArmorTexture(EntityLivingBase entity, ItemStack itemStack, - EntityEquipmentSlot slot, String type) { + EntityEquipmentSlot slot) { ResourceLocation registryName = itemStack.getItem().getRegistryName(); if (registryName == null) { throw new IllegalArgumentException( @@ -79,7 +73,7 @@ private static ResourceLocation getArmorTexture(EntityLivingBase entity, ItemSta String s1 = String.format("%s:textures/models/armor/%s_layer_%d%s.png", registryName.getNamespace(), registryName.getPath(), - (isLegSlot(slot) ? 2 : 1), type == null ? "" : String.format("_%s", type)); - return new ResourceLocation(ForgeHooksClient.getArmorTexture(entity, itemStack, s1, slot, type)); + (isLegSlot(slot) ? 2 : 1), ""); + return new ResourceLocation(ForgeHooksClient.getArmorTexture(entity, itemStack, s1, slot, null)); } } diff --git a/src/main/java/gregtech/asm/visitors/LayerArmorBaseVisitor.java b/src/main/java/gregtech/asm/visitors/LayerArmorBaseVisitor.java index aef7ff3395e..1e09a9c0446 100644 --- a/src/main/java/gregtech/asm/visitors/LayerArmorBaseVisitor.java +++ b/src/main/java/gregtech/asm/visitors/LayerArmorBaseVisitor.java @@ -5,6 +5,7 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +@Deprecated public class LayerArmorBaseVisitor extends MethodVisitor implements Opcodes { public static final String TARGET_CLASS_NAME = "net/minecraft/client/renderer/entity/layers/LayerArmorBase"; diff --git a/src/main/java/gregtech/asm/visitors/LayerCustomHeadVisitor.java b/src/main/java/gregtech/asm/visitors/LayerCustomHeadVisitor.java index ce253343216..11613c0cb7c 100644 --- a/src/main/java/gregtech/asm/visitors/LayerCustomHeadVisitor.java +++ b/src/main/java/gregtech/asm/visitors/LayerCustomHeadVisitor.java @@ -7,6 +7,7 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +@Deprecated public class LayerCustomHeadVisitor extends SafeMethodVisitor { public static final String TARGET_CLASS_NAME = "net/minecraft/client/renderer/entity/layers/LayerCustomHead"; diff --git a/src/main/java/gregtech/asm/visitors/SpecialArmorApplyVisitor.java b/src/main/java/gregtech/asm/visitors/SpecialArmorApplyVisitor.java deleted file mode 100644 index 4be3efac79d..00000000000 --- a/src/main/java/gregtech/asm/visitors/SpecialArmorApplyVisitor.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.asm.visitors; - -import gregtech.asm.util.ObfMapping; -import gregtech.asm.util.SafeMethodVisitor; - -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -public class SpecialArmorApplyVisitor extends SafeMethodVisitor { - - public static final String TARGET_CLASS_NAME = "net/minecraftforge/common/ISpecialArmor$ArmorProperties"; - public static final ObfMapping TARGET_METHOD = new ObfMapping(TARGET_CLASS_NAME, "applyArmor", - "(Lnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/util/NonNullList;Lnet/minecraft/util/DamageSource;D)F"); - - private static final ObfMapping METHOD_MAPPING = new ObfMapping("net/minecraft/util/CombatRules", "func_189427_a", - "(FFF)F").toRuntime(); - - private static final String ARMOR_HOOKS_OWNER = "gregtech/asm/hooks/ArmorHooks"; - private static final String ARMOR_HOOKS_SIGNATURE = "(FLnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/util/NonNullList;Lnet/minecraft/util/DamageSource;)V"; - private static final String ARMOR_HOOKS_METHOD_NAME = "damageArmor"; - - public SpecialArmorApplyVisitor(MethodVisitor mv) { - super(Opcodes.ASM5, mv); - } - - private static boolean checkTargetInsn(int opcode, String owner, String name, String desc) { - return opcode == Opcodes.INVOKESTATIC && METHOD_MAPPING.s_owner.equals(owner) && - METHOD_MAPPING.matches(name, desc); - } - - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - if (checkTargetInsn(opcode, owner, name, desc)) { - markPatchedSuccessfully(); - super.visitFieldInsn(Opcodes.PUTSTATIC, TARGET_CLASS_NAME, - SpecialArmorClassVisitor.CACHED_TOUGHNESS_FIELD_NAME, "F"); // store armorToughness - super.visitFieldInsn(Opcodes.PUTSTATIC, TARGET_CLASS_NAME, - SpecialArmorClassVisitor.CACHED_TOTAL_ARMOR_FIELD_NAME, "F"); // store totalArmor - super.visitInsn(Opcodes.DUP); // duplicate damage - super.visitVarInsn(Opcodes.ALOAD, 0); // load entity - super.visitVarInsn(Opcodes.ALOAD, 1); // load inventory - super.visitVarInsn(Opcodes.ALOAD, 2); // load damageSource - super.visitMethodInsn(Opcodes.INVOKESTATIC, ARMOR_HOOKS_OWNER, ARMOR_HOOKS_METHOD_NAME, - ARMOR_HOOKS_SIGNATURE, false); // call ArmorHooks - super.visitFieldInsn(Opcodes.GETSTATIC, TARGET_CLASS_NAME, - SpecialArmorClassVisitor.CACHED_TOTAL_ARMOR_FIELD_NAME, "F"); // load totalArmor back - super.visitFieldInsn(Opcodes.GETSTATIC, TARGET_CLASS_NAME, - SpecialArmorClassVisitor.CACHED_TOUGHNESS_FIELD_NAME, "F"); // load armorToughness back - } - super.visitMethodInsn(opcode, owner, name, desc, itf); - } - - @Override - protected String getInjectTargetString() { - return String.format("Patch target: %s; injection point: %s; (point not found)", TARGET_METHOD, METHOD_MAPPING); - } -} diff --git a/src/main/java/gregtech/asm/visitors/SpecialArmorClassVisitor.java b/src/main/java/gregtech/asm/visitors/SpecialArmorClassVisitor.java deleted file mode 100644 index fbc66c71ab1..00000000000 --- a/src/main/java/gregtech/asm/visitors/SpecialArmorClassVisitor.java +++ /dev/null @@ -1,28 +0,0 @@ -package gregtech.asm.visitors; - -import gregtech.asm.util.ObfMapping; -import gregtech.asm.util.TargetClassVisitor; - -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -import java.util.function.Function; - -public class SpecialArmorClassVisitor extends TargetClassVisitor { - - public static final String CACHED_TOUGHNESS_FIELD_NAME = "gregtech__cachedToughness"; - public static final String CACHED_TOTAL_ARMOR_FIELD_NAME = "gregtech__cachedTotalArmor"; - - public SpecialArmorClassVisitor(ClassVisitor cv, ObfMapping methodKey, - Function visitorCreator) { - super(cv, methodKey, visitorCreator); - } - - @Override - public void visitEnd() { - visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE, CACHED_TOUGHNESS_FIELD_NAME, "F", null, null); - visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE, CACHED_TOTAL_ARMOR_FIELD_NAME, "F", null, null); - super.visitEnd(); - } -} diff --git a/src/main/java/gregtech/client/ClientProxy.java b/src/main/java/gregtech/client/ClientProxy.java index 35969198260..ba98c8b9792 100644 --- a/src/main/java/gregtech/client/ClientProxy.java +++ b/src/main/java/gregtech/client/ClientProxy.java @@ -29,6 +29,7 @@ import gregtech.common.blocks.BlockCompressed; import gregtech.common.blocks.BlockFrame; import gregtech.common.blocks.MetaBlocks; +import gregtech.common.items.ArmorItems; import gregtech.common.items.MetaItems; import gregtech.common.items.ToolItems; @@ -112,6 +113,7 @@ public static void registerColors() { MetaBlocks.registerColors(); MetaItems.registerColors(); ToolItems.registerColors(); + ArmorItems.registerColors(); } @SubscribeEvent @@ -133,6 +135,7 @@ public static void registerModels(ModelRegistryEvent event) { MetaBlocks.registerItemModels(); MetaItems.registerModels(); ToolItems.registerModels(); + ArmorItems.registerModels(); } @SubscribeEvent diff --git a/src/main/java/gregtech/common/ArmorEventHandlers.java b/src/main/java/gregtech/common/ArmorEventHandlers.java new file mode 100644 index 00000000000..ccdee5d171b --- /dev/null +++ b/src/main/java/gregtech/common/ArmorEventHandlers.java @@ -0,0 +1,122 @@ +package gregtech.common; + +import gregtech.api.GTValues; +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.IGTArmor; + +import net.minecraft.client.entity.EntityOtherPlayerMP; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent; +import net.minecraftforge.event.entity.living.LivingFallEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import static net.minecraft.inventory.EntityEquipmentSlot.MAINHAND; +import static net.minecraft.inventory.EntityEquipmentSlot.OFFHAND; + +@Mod.EventBusSubscriber(modid = GTValues.MODID) +public class ArmorEventHandlers { + + @SubscribeEvent + public static void onLivingEquipmentChange(LivingEquipmentChangeEvent event) { + EntityEquipmentSlot slot = event.getSlot(); + if (slot == MAINHAND || slot == OFFHAND) { + return; + } + if (!(event.getEntityLiving() instanceof EntityPlayer player)) { + return; + } + // maybe unnecessary sanity check to make sure this same item wasn't immediately re-equipped + if (event.getFrom().isItemEqual(event.getTo())) { + return; + } + + if (event.getFrom().getItem() instanceof IGTArmor armor) { + armor.onArmorUnequip(player.getEntityWorld(), player, event.getFrom()); + } + if (event.getTo().getItem() instanceof IGTArmor armor) { + armor.onArmorEquip(player.getEntityWorld(), player, event.getTo()); + } + } + + @SubscribeEvent(priority = EventPriority.LOW) + public static void onLivingFall(LivingFallEvent event) { + if (event.getEntity() instanceof EntityPlayerMP player) { + if (player.fallDistance < 3.2f) { + return; + } + + for (EntityEquipmentSlot slot : ArmorHelper.getArmorSlots()) { + ItemStack armorStack = player.getItemStackFromSlot(slot); + if (armorStack.isEmpty() || !(armorStack.getItem() instanceof IGTArmor gtArmor)) { + continue; + } + // todo make sure jetpack sets this fall damage key when needed ("flyMode" nbt key previously?) + NBTTagCompound behaviorTag = ArmorHelper.getBehaviorsTag(armorStack); + if (behaviorTag.getBoolean(ArmorHelper.FALL_DAMAGE_KEY)) { + if (gtArmor.areBehaviorsActive(armorStack)) { + gtArmor.damageArmor(player, armorStack, DamageSource.FALL, (int) (player.fallDistance - 1.2f), + slot.getIndex()); + player.fallDistance = 0; + event.setCanceled(true); + return; + } + } + } + } + } + + @SubscribeEvent + @SideOnly(Side.CLIENT) + public static void onClientPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.START && !event.player.isSpectator() && + !(event.player instanceof EntityOtherPlayerMP) && !(event.player instanceof FakePlayer)) { + onPlayerTick(event); + } + } + + @SubscribeEvent + @SideOnly(Side.SERVER) + public static void onServerPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.START && !event.player.isSpectator() && + !(event.player instanceof FakePlayer)) { + onPlayerTick(event); + } + } + + private static final float MAGIC_STEP_HEIGHT = 1.0023f; + + private static void onPlayerTick(TickEvent.PlayerTickEvent event) { + EntityPlayer player = event.player; + + // Step Assist + // for some reason, doing this in ticking and on unequip is not sufficient, this value is somewhat sticky + if (!player.isSneaking()) { + for (EntityEquipmentSlot slot : ArmorHelper.getArmorSlots()) { + ItemStack armorStack = player.getItemStackFromSlot(slot); + if (armorStack.getItem() instanceof IGTArmor gtArmor) { + NBTTagCompound behaviorTag = ArmorHelper.getBehaviorsTag(armorStack); + if (behaviorTag.getBoolean(ArmorHelper.STEP_ASSIST_KEY) && gtArmor.areBehaviorsActive(armorStack)) { + if (player.stepHeight < MAGIC_STEP_HEIGHT) { + player.stepHeight = MAGIC_STEP_HEIGHT; + return; + } + } + } + } + } + if (player.stepHeight == MAGIC_STEP_HEIGHT) { + player.stepHeight = 0.6f; + } + } +} diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 59055bb74e1..a8ad601d57a 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -4,6 +4,7 @@ import gregtech.api.GregTechAPI; import gregtech.api.block.VariantItemBlock; import gregtech.api.block.machines.MachineItemBlock; +import gregtech.api.items.armoritem.IGTArmor; import gregtech.api.items.metaitem.MetaItem; import gregtech.api.items.toolitem.IGTTool; import gregtech.api.metatileentity.registry.MTERegistry; @@ -31,6 +32,7 @@ import gregtech.common.blocks.MetaBlocks; import gregtech.common.blocks.OreItemBlock; import gregtech.common.blocks.StoneVariantBlock; +import gregtech.common.items.ArmorItems; import gregtech.common.items.MetaItems; import gregtech.common.items.ToolItems; import gregtech.common.pipelike.cable.BlockCable; @@ -231,6 +233,9 @@ public static void registerItems(RegistryEvent.Register event) { for (IGTTool tool : ToolItems.getAllTools()) { registry.register(tool.get()); } + for (IGTArmor armor : ArmorItems.getAllArmors()) { + registry.register(armor.get()); + } GTRecipeManager.preLoad(); @@ -332,6 +337,7 @@ public static void registerRecipes(RegistryEvent.Register event) { MetaBlocks.registerOreDict(); OreDictionaryLoader.init(); MaterialInfoLoader.init(); + ArmorItems.registerLegacyConversionRecipes(); // post an event for addons to modify unification data before base GT registers recycling recipes MinecraftForge.EVENT_BUS.post(new GregTechAPI.RegisterEvent<>(null, ItemMaterialInfo.class)); diff --git a/src/main/java/gregtech/common/EventHandlers.java b/src/main/java/gregtech/common/EventHandlers.java index ecbe6b16097..963f4ad504a 100644 --- a/src/main/java/gregtech/common/EventHandlers.java +++ b/src/main/java/gregtech/common/EventHandlers.java @@ -1,53 +1,35 @@ package gregtech.common; import gregtech.api.GTValues; -import gregtech.api.block.IWalkingSpeedBonus; -import gregtech.api.items.armor.ArmorMetaItem; import gregtech.api.items.toolitem.ToolClasses; import gregtech.api.items.toolitem.ToolHelper; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.pipenet.longdist.LongDistanceNetwork; import gregtech.api.pipenet.tile.IPipeTile; import gregtech.api.unification.material.Materials; -import gregtech.api.util.BlockUtility; import gregtech.api.util.CapesRegistry; -import gregtech.api.util.GTUtility; import gregtech.api.util.Mods; import gregtech.api.util.virtualregistry.VirtualEnderRegistry; import gregtech.api.worldgen.bedrockFluids.BedrockFluidVeinSaveData; import gregtech.common.entities.EntityGTExplosive; import gregtech.common.items.MetaItems; -import gregtech.common.items.armor.IStepAssist; -import gregtech.common.items.armor.PowerlessJetpack; import gregtech.common.items.behaviors.ToggleEnergyConsumerBehavior; import gregtech.common.metatileentities.multi.electric.centralmonitor.MetaTileEntityCentralMonitor; -import net.minecraft.block.state.IBlockState; -import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.ai.attributes.IAttributeInstance; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Items; import net.minecraft.init.MobEffects; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.EnumDifficulty; -import net.minecraftforge.client.event.FOVUpdateEvent; -import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.event.entity.living.EnderTeleportEvent; -import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent; -import net.minecraftforge.event.entity.living.LivingFallEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.entity.player.AdvancementEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -60,9 +42,6 @@ import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.ItemHandlerHelper; import appeng.entity.EntitySingularity; @@ -71,7 +50,6 @@ public class EventHandlers { private static final String HAS_TERMINAL = GTValues.MODID + ".terminal"; - private static ItemStack lastFeetEquip = ItemStack.EMPTY; @SubscribeEvent public static void onEndermanTeleportEvent(EnderTeleportEvent event) { @@ -161,168 +139,8 @@ public static void onDestroySpeed(net.minecraftforge.event.entity.player.PlayerE } } - @SubscribeEvent(priority = EventPriority.LOW) - public static void onEntityLivingFallEvent(LivingFallEvent event) { - if (event.getEntity() instanceof EntityPlayerMP player) { - ItemStack armor = player.getItemStackFromSlot(EntityEquipmentSlot.FEET); - ItemStack jet = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST); - - if (player.fallDistance < 3.2f) - return; - - if (!armor.isEmpty() && armor.getItem() instanceof ArmorMetaItem) { - ArmorMetaItem.ArmorMetaValueItem valueItem = ((ArmorMetaItem) armor.getItem()).getItem(armor); - if (valueItem != null) { - valueItem.getArmorLogic().damageArmor(player, armor, DamageSource.FALL, - (int) (player.fallDistance - 1.2f), EntityEquipmentSlot.FEET); - player.fallDistance = 0; - event.setCanceled(true); - } - } else if (!jet.isEmpty() && jet.getItem() instanceof ArmorMetaItem && - GTUtility.getOrCreateNbtCompound(jet).hasKey("flyMode")) { - ArmorMetaItem.ArmorMetaValueItem valueItem = ((ArmorMetaItem) jet.getItem()).getItem(jet); - if (valueItem != null) { - valueItem.getArmorLogic().damageArmor(player, jet, DamageSource.FALL, - (int) (player.fallDistance - 1.2f), EntityEquipmentSlot.FEET); - player.fallDistance = 0; - event.setCanceled(true); - } - } - } - } - - @SubscribeEvent - public static void onLivingEquipmentChangeEvent(LivingEquipmentChangeEvent event) { - EntityEquipmentSlot slot = event.getSlot(); - if (event.getFrom().isEmpty() || slot == EntityEquipmentSlot.MAINHAND || slot == EntityEquipmentSlot.OFFHAND) - return; - - ItemStack stack = event.getFrom(); - if (!(stack.getItem() instanceof ArmorMetaItem) || stack.getItem().equals(event.getTo().getItem())) - return; - - ArmorMetaItem.ArmorMetaValueItem valueItem = ((ArmorMetaItem) stack.getItem()).getItem(stack); - if (valueItem == null) return; - if (valueItem.isItemEqual(MetaItems.NIGHTVISION_GOGGLES.getStackForm()) || - valueItem.isItemEqual(MetaItems.NANO_HELMET.getStackForm()) || - valueItem.isItemEqual(MetaItems.QUANTUM_HELMET.getStackForm())) { - event.getEntityLiving().removePotionEffect(MobEffects.NIGHT_VISION); - } - if (valueItem.isItemEqual(MetaItems.QUANTUM_CHESTPLATE.getStackForm()) || - valueItem.isItemEqual(MetaItems.QUANTUM_CHESTPLATE_ADVANCED.getStackForm())) { - event.getEntity().isImmuneToFire = false; - } - - // Workaround to recipe caching issue with fluid jetpack - // TODO, rewrite logic and remove in armor rewrite - if (valueItem.isItemEqual(MetaItems.SEMIFLUID_JETPACK.getStackForm())) { - ((PowerlessJetpack) valueItem.getArmorLogic()).resetRecipe(); - } - } - - @SuppressWarnings({ "ConstantValue", "deprecation" }) - @SubscribeEvent - public static void onPlayerTick(TickEvent.PlayerTickEvent event) { - EntityPlayer player = event.player; - if (event.phase == TickEvent.Phase.START && !player.world.isRemote) { - IAttributeInstance movementSpeed = player.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED); - if (movementSpeed == null) return; - AttributeModifier modifier = movementSpeed.getModifier(BlockUtility.WALKING_SPEED_UUID); - - double speedBonus; - if (!player.onGround || player.isInWater() || player.isSneaking()) { - speedBonus = 0; - } else { - IBlockState state = player.world.getBlockState(new BlockPos( - player.posX, player.getEntityBoundingBox().minY - 1, player.posZ)); - speedBonus = BlockUtility.WALKING_SPEED_BONUS.getDouble(state); - // { remove this bit while removing IWalkingSpeedBonus - if (speedBonus == 0 && - state.getBlock() instanceof IWalkingSpeedBonus walkingSpeedBonus && - walkingSpeedBonus.getWalkingSpeedBonus() != 1 && - walkingSpeedBonus.bonusSpeedCondition(player) && - walkingSpeedBonus.checkApplicableBlocks(state)) { - speedBonus = walkingSpeedBonus.getWalkingSpeedBonus() - 1; - } - // } - } - if (modifier != null) { - if (speedBonus == modifier.getAmount()) return; - else movementSpeed.removeModifier(BlockUtility.WALKING_SPEED_UUID); - } else { - if (speedBonus == 0) return; - } - if (speedBonus != 0) { - movementSpeed.applyModifier(new AttributeModifier(BlockUtility.WALKING_SPEED_UUID, - "Walking Speed Bonus", speedBonus, 2)); - } - } - } - - @SuppressWarnings({ "lossy-conversions", "ConstantValue" }) - @SubscribeEvent - @SideOnly(Side.CLIENT) - public static void onFOVUpdate(FOVUpdateEvent event) { // this event SUCKS - EntityPlayer player = event.getEntity(); - IAttributeInstance movementSpeed = player.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED); - if (movementSpeed == null || movementSpeed.getModifier(BlockUtility.WALKING_SPEED_UUID) == null) return; - - float originalFov = player.capabilities.isFlying ? 1.1f : 1.0f; - originalFov *= (movementSpeed.getAttributeValue() / player.capabilities.getWalkSpeed() + 1) / 2; - - if (player.capabilities.getWalkSpeed() == 0 || Float.isNaN(originalFov) || Float.isInfinite(originalFov)) { - return; - } - - float newFov = player.capabilities.isFlying ? 1.1f : 1.0f; - newFov *= (computeValueWithoutWalkingSpeed(movementSpeed) / player.capabilities.getWalkSpeed() + 1) / 2; - - event.setNewfov(newFov / originalFov * event.getNewfov()); - } - - /** - * Computes walking speed without boost from {@link BlockUtility#WALKING_SPEED_BONUS}. Skipping parent check stuff - * because movement speed attribute does not have any parent modifier. - */ - private static double computeValueWithoutWalkingSpeed(IAttributeInstance attrib) { - double base = attrib.getBaseValue(); - - for (AttributeModifier m : attrib.getModifiersByOperation(0)) { - base += m.getAmount(); - } - - double applied = base; - - for (AttributeModifier m : attrib.getModifiersByOperation(1)) { - applied += base * m.getAmount(); - } - - for (AttributeModifier m : attrib.getModifiersByOperation(2)) { - if (m.getID() == BlockUtility.WALKING_SPEED_UUID) continue; - applied *= 1 + m.getAmount(); - } - - return attrib.getAttribute().clampValue(applied); - } - - @SubscribeEvent - @SideOnly(Side.CLIENT) - public static void onPlayerTickClient(TickEvent.PlayerTickEvent event) { - if (event.phase == TickEvent.Phase.START && !event.player.isSpectator() && - !(event.player instanceof EntityOtherPlayerMP) && !(event.player instanceof FakePlayer)) { - ItemStack feetEquip = event.player.getItemStackFromSlot(EntityEquipmentSlot.FEET); - if (!lastFeetEquip.getItem().equals(feetEquip.getItem())) { - if (lastFeetEquip.getItem() instanceof ArmorMetaItem) { - ArmorMetaItem.ArmorMetaValueItem valueItem = ((ArmorMetaItem) lastFeetEquip.getItem()) - .getItem(lastFeetEquip); - if (valueItem != null && valueItem.getArmorLogic() instanceof IStepAssist) { - event.player.stepHeight = 0.6f; - } - } - - lastFeetEquip = feetEquip.copy(); - } - } + public static boolean canMineWithPick(String tool) { + return ToolClasses.WRENCH.equals(tool) || ToolClasses.WIRE_CUTTER.equals(tool); } @SubscribeEvent diff --git a/src/main/java/gregtech/common/items/ArmorItems.java b/src/main/java/gregtech/common/items/ArmorItems.java new file mode 100644 index 00000000000..118df03436a --- /dev/null +++ b/src/main/java/gregtech/common/items/ArmorItems.java @@ -0,0 +1,275 @@ +package gregtech.common.items; + +import gregtech.api.GTValues; +import gregtech.api.items.armor.ArmorMetaItem; +import gregtech.api.items.armoritem.ArmorBuilder; +import gregtech.api.items.armoritem.IGTArmor; +import gregtech.api.items.armoritem.ItemGTArmor; +import gregtech.api.items.armoritem.ItemGTElectricArmor; +import gregtech.api.items.metaitem.MetaItem; +import gregtech.api.recipes.RecipeMaps; +import gregtech.api.recipes.ingredients.nbtmatch.NBTCondition; +import gregtech.api.recipes.ingredients.nbtmatch.NBTMatcher; +import gregtech.common.ConfigHolder; +import gregtech.common.items.armor.AdvancedNanoMuscleSuite; +import gregtech.common.items.armor.AdvancedQuarkTechSuite; +import gregtech.common.items.armor.ArmorSet; +import gregtech.common.items.armor.JetpackStats; +import gregtech.common.items.armor.QuarkTechSuite; +import gregtech.common.items.armor.behavior.ElectricJetpackBehavior; +import gregtech.common.items.armor.behavior.FallDamageCancelBehavior; +import gregtech.common.items.armor.behavior.FueledJetpackBehavior; +import gregtech.common.items.armor.behavior.NightvisionBehavior; +import gregtech.common.items.armor.behavior.StepAssistBehavior; + +import net.minecraft.client.Minecraft; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraftforge.client.model.ModelLoader; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class ArmorItems { + + private static final List ARMORS = new ArrayList<>(); + + public static ItemGTElectricArmor NIGHTVISION_GOGGLES; + + public static ItemGTArmor FUELED_JETPACK; + public static ItemGTElectricArmor ELECTRIC_JETPACK; + public static ItemGTElectricArmor ADVANCED_ELECTRIC_JETPACK; + + public static ItemGTElectricArmor NANO_HELMET; + public static ItemGTElectricArmor NANO_CHESTPLATE; + public static ItemGTElectricArmor NANO_LEGGINGS; + public static ItemGTElectricArmor NANO_BOOTS; + public static ItemGTElectricArmor ADVANCED_NANO_CHESTPLATE; + + public static ItemGTElectricArmor QUANTUM_HELMET; + public static ItemGTElectricArmor QUANTUM_CHESTPLATE; + public static ItemGTElectricArmor QUANTUM_LEGGINGS; + public static ItemGTElectricArmor QUANTUM_BOOTS; + public static ItemGTElectricArmor ADVANCED_QUANTUM_CHESTPLATE; + + private ArmorItems() {/**/} + + public static List getAllArmors() { + return ARMORS; + } + + // TODO ArmorProperties values not set here (and their original code was already deleted): + // Electric Jetpack: 0, 0, 0 + // Advanced Electric Jetpack: 0, 0, 0 + // Fueled Jetpack: 0, 0, 0 + + // TODO Other information from deleted files: + // Fueled Jetpack: + // - Default subitem is filled with Diesel + // - Durability bar colors: GradientUtil.getGradient(0xB7AF08, 10) + + public static void init() { + // todo get rid of this config... "stuff" + NIGHTVISION_GOGGLES = register(ItemGTElectricArmor.Builder + .of(GTValues.MODID, "nightvision_goggles", EntityEquipmentSlot.HEAD) + .electric(ConfigHolder.tools.voltageTierNightVision, + 80_000L * (long) Math.max(1, Math.pow(1, ConfigHolder.tools.voltageTierNightVision - 1))) + .electricCost(2) + .behaviors(NightvisionBehavior.INSTANCE)); + + FUELED_JETPACK = register(ItemGTArmor.Builder.of(GTValues.MODID, "fueled_jetpack", EntityEquipmentSlot.CHEST) + .behaviors(new FueledJetpackBehavior(JetpackStats.FUELED, 16000, + FueledJetpackBehavior.COMBUSTION_FUEL_BURN_TIME))); + + ELECTRIC_JETPACK = register(ItemGTElectricArmor.Builder + .of(GTValues.MODID, "electric_jetpack", EntityEquipmentSlot.CHEST) + .electric(ConfigHolder.tools.voltageTierImpeller, + 1_000_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierImpeller - 2))) + .behaviors(new ElectricJetpackBehavior(JetpackStats.ELECTRIC, 30)) + .rarity(EnumRarity.UNCOMMON)); + + ADVANCED_ELECTRIC_JETPACK = register(ItemGTElectricArmor.Builder + .of(GTValues.MODID, "advanced_electric_jetpack", EntityEquipmentSlot.CHEST) + .electric(ConfigHolder.tools.voltageTierAdvImpeller, + 6_400_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierAdvImpeller - 4))) + .behaviors(new ElectricJetpackBehavior(JetpackStats.ADVANCED, 480)) + .rarity(EnumRarity.RARE)); + + int energyPerUse = 512; + int tier = ConfigHolder.tools.voltageTierNanoSuit; + long maxCapacity = 6_400_000L * (long) Math.max(1, Math.pow(4, tier - 3)); + + NANO_HELMET = register(ItemGTElectricArmor.Builder.of(GTValues.MODID, "nano_helmet", EntityEquipmentSlot.HEAD) + .electric(tier, maxCapacity) + .electricCost(energyPerUse) + .behaviors(NightvisionBehavior.INSTANCE) + .rarity(EnumRarity.UNCOMMON) + .armorSet(ArmorSet.NANO)); + + NANO_CHESTPLATE = register( + ItemGTElectricArmor.Builder.of(GTValues.MODID, "nano_chestplate", EntityEquipmentSlot.CHEST) + .electric(tier, maxCapacity) + .electricCost(energyPerUse) + .rarity(EnumRarity.UNCOMMON) + .armorSet(ArmorSet.NANO)); + + NANO_LEGGINGS = register( + ItemGTElectricArmor.Builder.of(GTValues.MODID, "nano_leggings", EntityEquipmentSlot.LEGS) + .electric(tier, maxCapacity) + .electricCost(energyPerUse) + .allowBlocking(DamageSource.FALL) + .rarity(EnumRarity.UNCOMMON) + .armorSet(ArmorSet.NANO)); + + NANO_BOOTS = register(ItemGTElectricArmor.Builder.of(GTValues.MODID, "nano_boots", EntityEquipmentSlot.FEET) + .electric(tier, maxCapacity) + .electricCost(energyPerUse) + .behaviors(StepAssistBehavior.INSTANCE, FallDamageCancelBehavior.INSTANCE) + .allowBlocking(DamageSource.FALL) + .rarity(EnumRarity.UNCOMMON) + .armorSet(ArmorSet.NANO)); + } + + public static > T register(@NotNull ArmorBuilder builder) { + T armor = builder.build(); + ARMORS.add(armor); + return armor; + } + + public static T register(@NotNull T armor) { + ARMORS.add(armor); + return armor; + } + + public static void registerModels() { + ARMORS.forEach(armor -> ModelLoader.setCustomModelResourceLocation(armor.get(), 0, armor.getModelLocation())); + } + + public static void registerColors() { + ARMORS.forEach(armor -> Minecraft.getMinecraft().getItemColors().registerItemColorHandler(armor::getColor, + armor.get())); + } + + // TODO Remove everything below here in v... + + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_NIGHTVISION_GOGGLES; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_NANO_CHESTPLATE; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_NANO_LEGGINGS; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_NANO_BOOTS; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_NANO_HELMET; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_QUANTUM_CHESTPLATE; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_QUANTUM_LEGGINGS; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_QUANTUM_BOOTS; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_QUANTUM_HELMET; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_SEMIFLUID_JETPACK; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_ELECTRIC_JETPACK; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_ELECTRIC_JETPACK_ADVANCED; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_NANO_CHESTPLATE_ADVANCED; + @Deprecated + private static ArmorMetaItem.ArmorMetaValueItem OLD_QUANTUM_CHESTPLATE_ADVANCED; + + // TODO Remove all old armor texture files, change old models to point to new texture location until full removal. + // TODO Rename old armor lang keys (other than names), and move names to a separated section for easy removal. + + @Deprecated + public static void initLegacyArmor() { + ArmorMetaItem.ArmorMetaValueItem> legacyArmor = new ArmorMetaItem<>() { + + @Override + public void registerSubItems() { + // todo call setInvisible() on all of these + OLD_NIGHTVISION_GOGGLES = addItem(1, "nightvision_goggles").setArmorLogic(EntityEquipmentSlot.HEAD, + "nightvision_goggles"); + + OLD_SEMIFLUID_JETPACK = addItem(2, "liquid_fuel_jetpack").setArmorLogic(EntityEquipmentSlot.CHEST, + "fueled_jetpack"); + OLD_ELECTRIC_JETPACK = addItem(3, "electric_jetpack").setArmorLogic(EntityEquipmentSlot.CHEST, + "electric_jetpack"); + OLD_ELECTRIC_JETPACK_ADVANCED = addItem(4, "advanced_electric_jetpack") + .setArmorLogic(EntityEquipmentSlot.CHEST, "advanced_electric_jetpack"); + + OLD_NANO_HELMET = addItem(20, "nms.helmet").setArmorLogic(EntityEquipmentSlot.HEAD, "nano_helmet"); + OLD_NANO_CHESTPLATE = addItem(21, "nms.chestplate").setArmorLogic(EntityEquipmentSlot.CHEST, + "nano_chestplate"); + OLD_NANO_LEGGINGS = addItem(22, "nms.leggings").setArmorLogic(EntityEquipmentSlot.LEGS, + "nano_leggings"); + OLD_NANO_BOOTS = addItem(23, "nms.boots").setArmorLogic(EntityEquipmentSlot.FEET, "nano_boots"); + MetaItems.NANO_CHESTPLATE_ADVANCED = addItem(30, "nms.advanced_chestplate") + .setArmorLogic(new AdvancedNanoMuscleSuite(512, + 12_800_000L * + (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierAdvNanoSuit - 3)), + ConfigHolder.tools.voltageTierAdvNanoSuit)) + .setRarity(EnumRarity.RARE); + + int energyPerUse = 8192; + int tier = ConfigHolder.tools.voltageTierQuarkTech; + long maxCapacity = 100_000_000L * (long) Math.max(1, Math.pow(4, tier - 5)); + MetaItems.QUANTUM_HELMET = addItem(40, "qts.helmet") + .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.HEAD, energyPerUse, maxCapacity, tier)) + .setRarity(EnumRarity.RARE); + MetaItems.QUANTUM_CHESTPLATE = addItem(41, "qts.chestplate") + .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.CHEST, energyPerUse, maxCapacity, tier)) + .setRarity(EnumRarity.RARE); + MetaItems.QUANTUM_LEGGINGS = addItem(42, "qts.leggings") + .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.LEGS, energyPerUse, maxCapacity, tier)) + .setRarity(EnumRarity.RARE); + MetaItems.QUANTUM_BOOTS = addItem(43, "qts.boots") + .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.FEET, energyPerUse, maxCapacity, tier)) + .setRarity(EnumRarity.RARE); + MetaItems.QUANTUM_CHESTPLATE_ADVANCED = addItem(50, "qts.advanced_chestplate") + .setArmorLogic(new AdvancedQuarkTechSuite(energyPerUse, + 1_000_000_000L * + (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierAdvQuarkTech - 6)), + ConfigHolder.tools.voltageTierAdvQuarkTech)) + .setRarity(EnumRarity.EPIC); + } + }; + legacyArmor.setRegistryName("gt_armor"); + } + + // TODO Remove in v... + @Deprecated + public static void registerLegacyConversionRecipes() { + // todo + addConversion(OLD_NIGHTVISION_GOGGLES, NIGHTVISION_GOGGLES.getStack()); + addConversion(OLD_NANO_HELMET, NANO_HELMET.getStack()); + addConversion(OLD_NANO_CHESTPLATE, NANO_CHESTPLATE.getStack()); + addConversion(OLD_NANO_LEGGINGS, NANO_LEGGINGS.getStack()); + addConversion(OLD_NANO_BOOTS, NANO_BOOTS.getStack()); + // addConversion(OLD_QUANTUM_HELMET, QUANTUM_HELMET.getStack()); + // addConversion(OLD_QUANTUM_CHESTPLATE, QUANTUM_CHESTPLATE.getStack()); + // addConversion(OLD_QUANTUM_LEGGINGS, QUANTUM_LEGGINGS.getStack()); + // addConversion(OLD_QUANTUM_BOOTS, QUANTUM_BOOTS.getStack()); + addConversion(OLD_SEMIFLUID_JETPACK, FUELED_JETPACK.getStack()); + addConversion(OLD_ELECTRIC_JETPACK, ELECTRIC_JETPACK.getStack()); + // addConversion(OLD_ELECTRIC_JETPACK_ADVANCED, ADVANCED_ELECTRIC_JETPACK.getStack()); + // addConversion(OLD_NANO_CHESTPLATE_ADVANCED, ADVANCED_NANO_CHESTPLATE.getStack()); + // addConversion(OLD_QUANTUM_CHESTPLATE_ADVANCED, ADVANCED_QUANTUM_CHESTPLATE.getStack()); + } + + @Deprecated + private static void addConversion(MetaItem.MetaValueItem oldArmor, ItemStack newArmor) { + RecipeMaps.ASSEMBLER_RECIPES.recipeBuilder() + .inputNBT(oldArmor, NBTMatcher.ANY, NBTCondition.ANY) + .circuitMeta(20) + .outputs(newArmor) + .duration(100).EUt(7).buildAndRegister(); + } +} diff --git a/src/main/java/gregtech/common/items/MetaItems.java b/src/main/java/gregtech/common/items/MetaItems.java index 303588e6dc8..06149582eaf 100644 --- a/src/main/java/gregtech/common/items/MetaItems.java +++ b/src/main/java/gregtech/common/items/MetaItems.java @@ -11,7 +11,6 @@ import gregtech.api.unification.ore.OrePrefix; import gregtech.api.util.GTLog; import gregtech.client.renderer.handler.FacadeRenderer; -import gregtech.common.items.armor.MetaArmor; import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.ModelResourceLocation; @@ -25,7 +24,11 @@ import com.google.common.base.CaseFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public final class MetaItems { @@ -531,22 +534,11 @@ private MetaItems() {} public static MetaItem.MetaValueItem CLIPBOARD; - public static ArmorMetaItem.ArmorMetaValueItem NIGHTVISION_GOGGLES; - - public static ArmorMetaItem.ArmorMetaValueItem NANO_CHESTPLATE; - public static ArmorMetaItem.ArmorMetaValueItem NANO_LEGGINGS; - public static ArmorMetaItem.ArmorMetaValueItem NANO_BOOTS; - public static ArmorMetaItem.ArmorMetaValueItem NANO_HELMET; - public static ArmorMetaItem.ArmorMetaValueItem QUANTUM_CHESTPLATE; public static ArmorMetaItem.ArmorMetaValueItem QUANTUM_LEGGINGS; public static ArmorMetaItem.ArmorMetaValueItem QUANTUM_BOOTS; public static ArmorMetaItem.ArmorMetaValueItem QUANTUM_HELMET; - public static ArmorMetaItem.ArmorMetaValueItem SEMIFLUID_JETPACK; - public static ArmorMetaItem.ArmorMetaValueItem ELECTRIC_JETPACK; - - public static ArmorMetaItem.ArmorMetaValueItem ELECTRIC_JETPACK_ADVANCED; public static ArmorMetaItem.ArmorMetaValueItem NANO_CHESTPLATE_ADVANCED; public static ArmorMetaItem.ArmorMetaValueItem QUANTUM_CHESTPLATE_ADVANCED; @@ -611,8 +603,6 @@ private MetaItems() {} public static void init() { MetaItem1 first = new MetaItem1(); first.setRegistryName("meta_item_1"); - MetaArmor armor = new MetaArmor(); - armor.setRegistryName("gt_armor"); for (OrePrefix prefix : orePrefixes) { for (MaterialRegistry registry : GregTechAPI.materialManager.getRegistries()) { String regName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, prefix.name()); diff --git a/src/main/java/gregtech/common/items/armor/AdvancedJetpack.java b/src/main/java/gregtech/common/items/armor/AdvancedJetpack.java deleted file mode 100644 index 2b54aa3f9b3..00000000000 --- a/src/main/java/gregtech/common/items/armor/AdvancedJetpack.java +++ /dev/null @@ -1,105 +0,0 @@ -package gregtech.common.items.armor; - -import gregtech.api.capability.GregtechCapabilities; -import gregtech.api.capability.IElectricItem; -import gregtech.api.util.GTUtility; -import gregtech.api.util.input.KeyBind; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.world.World; - -import org.jetbrains.annotations.NotNull; - -public class AdvancedJetpack extends Jetpack { - - public AdvancedJetpack(int energyPerUse, long capacity, int tier) { - super(energyPerUse, capacity, tier); - } - - @Override - public void onArmorTick(World world, EntityPlayer player, @NotNull ItemStack item) { - IElectricItem cont = item.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); - if (cont == null) { - return; - } - NBTTagCompound data = GTUtility.getOrCreateNbtCompound(item); - boolean hoverMode = data.hasKey("hover") && data.getBoolean("hover"); - byte toggleTimer = data.hasKey("toggleTimer") ? data.getByte("toggleTimer") : 0; - - if (toggleTimer == 0 && KeyBind.ARMOR_HOVER.isKeyDown(player)) { - hoverMode = !hoverMode; - toggleTimer = 5; - data.setBoolean("hover", hoverMode); - if (!world.isRemote) { - if (hoverMode) - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.enable"), true); - else - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.disable"), true); - } - } - - performFlying(player, hoverMode, item); - - if (toggleTimer > 0) toggleTimer--; - - data.setBoolean("hover", hoverMode); - data.setByte("toggleTimer", toggleTimer); - player.inventoryContainer.detectAndSendChanges(); - } - - @Override - public double getSprintEnergyModifier() { - return 2.5D; - } - - @Override - public double getSprintSpeedModifier() { - return 1.3D; - } - - @Override - public double getVerticalHoverSpeed() { - return 0.34D; - } - - @Override - public double getVerticalHoverSlowSpeed() { - return 0.03D; - } - - @Override - public double getVerticalAcceleration() { - return 0.13D; - } - - @Override - public double getVerticalSpeed() { - return 0.48D; - } - - @Override - public double getSidewaysSpeed() { - return 0.14D; - } - - @Override - public EnumParticleTypes getParticle() { - return EnumParticleTypes.CLOUD; - } - - @Override - public float getFallDamageReduction() { - return 2.0f; - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - return "gregtech:textures/armor/advanced_jetpack.png"; - } -} diff --git a/src/main/java/gregtech/common/items/armor/AdvancedNanoMuscleSuite.java b/src/main/java/gregtech/common/items/armor/AdvancedNanoMuscleSuite.java index 74c256262e8..2c3aabe25cb 100644 --- a/src/main/java/gregtech/common/items/armor/AdvancedNanoMuscleSuite.java +++ b/src/main/java/gregtech/common/items/armor/AdvancedNanoMuscleSuite.java @@ -13,7 +13,10 @@ import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; @@ -25,7 +28,8 @@ import java.util.Iterator; import java.util.List; -public class AdvancedNanoMuscleSuite extends NanoMuscleSuite implements IJetpack { +@Deprecated +public class AdvancedNanoMuscleSuite extends NanoMuscleSuite { // A replacement for checking the current world time, to get around the gamerule that stops it private long timer = 0L; @@ -43,22 +47,9 @@ public void onArmorTick(World world, EntityPlayer player, @NotNull ItemStack ite } NBTTagCompound data = GTUtility.getOrCreateNbtCompound(item); - boolean hoverMode = data.hasKey("hover") && data.getBoolean("hover"); byte toggleTimer = data.hasKey("toggleTimer") ? data.getByte("toggleTimer") : 0; boolean canShare = data.hasKey("canShare") && data.getBoolean("canShare"); - if (toggleTimer == 0 && KeyBind.ARMOR_HOVER.isKeyDown(player)) { - hoverMode = !hoverMode; - toggleTimer = 5; - data.setBoolean("hover", hoverMode); - if (!world.isRemote) { - if (hoverMode) - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.enable"), true); - else - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.disable"), true); - } - } - if (toggleTimer == 0 && KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; toggleTimer = 5; @@ -76,8 +67,6 @@ else if (canShare) data.setBoolean("canShare", canShare); } - performFlying(player, hoverMode, item); - // Charging mechanics if (canShare && !world.isRemote) { // Check for new things to charge every 5 seconds @@ -125,7 +114,6 @@ else if (canShare) if (toggleTimer > 0) toggleTimer--; data.setBoolean("canShare", canShare); - data.setBoolean("hover", hoverMode); data.setByte("toggleTimer", toggleTimer); player.inventoryContainer.detectAndSendChanges(); @@ -147,12 +135,6 @@ public void addInfo(ItemStack itemStack, List lines) { lines.add(I18n.format("metaarmor.energy_share.tooltip", state)); lines.add(I18n.format("metaarmor.energy_share.tooltip.guide")); - String status = I18n.format("metaarmor.hud.status.disabled"); - if (data.hasKey("hover")) { - if (data.getBoolean("hover")) - status = I18n.format("metaarmor.hud.status.enabled"); - } - lines.add(I18n.format("metaarmor.hud.hover_mode", status)); super.addInfo(itemStack, lines); } @@ -202,12 +184,6 @@ public void drawHUD(ItemStack item) { "metaarmor.hud.status.disabled"; this.HUD.newString(I18n.format("mataarmor.hud.supply_mode", I18n.format(status))); } - - if (data.hasKey("hover")) { - String status = data.getBoolean("hover") ? "metaarmor.hud.status.enabled" : - "metaarmor.hud.status.disabled"; - this.HUD.newString(I18n.format("metaarmor.hud.hover_mode", I18n.format(status))); - } } this.HUD.draw(); this.HUD.reset(); @@ -217,77 +193,4 @@ public void drawHUD(ItemStack item) { public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { return "gregtech:textures/armor/advanced_nano_muscle_suite_1.png"; } - - @Override - public boolean canUseEnergy(@NotNull ItemStack stack, int amount) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return false; - return container.canUse(amount); - } - - @Override - public void drainEnergy(@NotNull ItemStack stack, int amount) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return; - container.discharge(amount, tier, true, false, false); - } - - @Override - public boolean hasEnergy(@NotNull ItemStack stack) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return false; - return container.getCharge() > 0; - } - - private static IElectricItem getIElectricItem(@NotNull ItemStack stack) { - return stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); - } - - @Override - public double getSprintEnergyModifier() { - return 4.0D; - } - - @Override - public double getSprintSpeedModifier() { - return 1.8D; - } - - @Override - public double getVerticalHoverSpeed() { - return 0.4D; - } - - @Override - public double getVerticalHoverSlowSpeed() { - return 0.005D; - } - - @Override - public double getVerticalAcceleration() { - return 0.14D; - } - - @Override - public double getVerticalSpeed() { - return 0.8D; - } - - @Override - public double getSidewaysSpeed() { - return 0.19D; - } - - @Override - public EnumParticleTypes getParticle() { - return null; - } - - @Override - public float getFallDamageReduction() { - return 3.5f; - } } diff --git a/src/main/java/gregtech/common/items/armor/AdvancedQuarkTechSuite.java b/src/main/java/gregtech/common/items/armor/AdvancedQuarkTechSuite.java index a0607a6e825..7738d04f187 100644 --- a/src/main/java/gregtech/common/items/armor/AdvancedQuarkTechSuite.java +++ b/src/main/java/gregtech/common/items/armor/AdvancedQuarkTechSuite.java @@ -14,7 +14,11 @@ import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor.ArmorProperties; @@ -27,7 +31,8 @@ import java.util.Iterator; import java.util.List; -public class AdvancedQuarkTechSuite extends QuarkTechSuite implements IJetpack { +@Deprecated +public class AdvancedQuarkTechSuite extends QuarkTechSuite { // A replacement for checking the current world time, to get around the gamerule that stops it private long timer = 0L; @@ -45,22 +50,9 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack item) { } NBTTagCompound data = GTUtility.getOrCreateNbtCompound(item); - boolean hoverMode = data.hasKey("hover") && data.getBoolean("hover"); byte toggleTimer = data.hasKey("toggleTimer") ? data.getByte("toggleTimer") : 0; boolean canShare = data.hasKey("canShare") && data.getBoolean("canShare"); - if (toggleTimer == 0 && KeyBind.ARMOR_HOVER.isKeyDown(player)) { - hoverMode = !hoverMode; - toggleTimer = 5; - data.setBoolean("hover", hoverMode); - if (!world.isRemote) { - if (hoverMode) - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.enable"), true); - else - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.disable"), true); - } - } - if (toggleTimer == 0 && KeyBind.ARMOR_CHARGING.isKeyDown(player)) { canShare = !canShare; toggleTimer = 5; @@ -78,8 +70,6 @@ else if (canShare) data.setBoolean("canShare", canShare); } - performFlying(player, hoverMode, item); - if (player.isBurning()) player.extinguish(); @@ -130,7 +120,6 @@ else if (canShare) if (toggleTimer > 0) toggleTimer--; data.setBoolean("canShare", canShare); - data.setBoolean("hover", hoverMode); data.setByte("toggleTimer", toggleTimer); player.inventoryContainer.detectAndSendChanges(); @@ -151,12 +140,6 @@ public void addInfo(ItemStack itemStack, List lines) { } lines.add(I18n.format("metaarmor.energy_share.tooltip", state)); lines.add(I18n.format("metaarmor.energy_share.tooltip.guide")); - String status = I18n.format("metaarmor.hud.status.disabled"); - if (data.hasKey("hover")) { - if (data.getBoolean("hover")) - status = I18n.format("metaarmor.hud.status.enabled"); - } - lines.add(I18n.format("metaarmor.hud.hover_mode", status)); super.addInfo(itemStack, lines); } @@ -204,12 +187,6 @@ public void drawHUD(ItemStack item) { "metaarmor.hud.status.disabled"; this.HUD.newString(I18n.format("mataarmor.hud.supply_mode", I18n.format(status))); } - - if (data.hasKey("hover")) { - String status = data.getBoolean("hover") ? "metaarmor.hud.status.enabled" : - "metaarmor.hud.status.disabled"; - this.HUD.newString(I18n.format("metaarmor.hud.hover_mode", I18n.format(status))); - } } this.HUD.draw(); this.HUD.reset(); @@ -244,77 +221,4 @@ public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlo public double getDamageAbsorption() { return 1.5D; } - - @Override - public boolean canUseEnergy(@NotNull ItemStack stack, int amount) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return false; - return container.canUse(amount); - } - - @Override - public void drainEnergy(@NotNull ItemStack stack, int amount) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return; - container.discharge(amount, tier, true, false, false); - } - - @Override - public boolean hasEnergy(@NotNull ItemStack stack) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return false; - return container.getCharge() > 0; - } - - private static IElectricItem getIElectricItem(@NotNull ItemStack stack) { - return stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); - } - - @Override - public double getSprintEnergyModifier() { - return 6.0D; - } - - @Override - public double getSprintSpeedModifier() { - return 2.4D; - } - - @Override - public double getVerticalHoverSpeed() { - return 0.45D; - } - - @Override - public double getVerticalHoverSlowSpeed() { - return 0.0D; - } - - @Override - public double getVerticalAcceleration() { - return 0.15D; - } - - @Override - public double getVerticalSpeed() { - return 0.9D; - } - - @Override - public double getSidewaysSpeed() { - return 0.21D; - } - - @Override - public EnumParticleTypes getParticle() { - return null; - } - - @Override - public float getFallDamageReduction() { - return 8f; - } } diff --git a/src/main/java/gregtech/common/items/armor/ArmorSet.java b/src/main/java/gregtech/common/items/armor/ArmorSet.java new file mode 100644 index 00000000000..429f338f95d --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/ArmorSet.java @@ -0,0 +1,17 @@ +package gregtech.common.items.armor; + +import gregtech.api.items.armoritem.armorset.IArmorSet; +import gregtech.api.items.armoritem.armorset.ISetBonus; + +import java.util.Set; + +public class ArmorSet implements IArmorSet { + + public static final ArmorSet NANO = new ArmorSet(); + public static final ArmorSet QUANTUM = new ArmorSet(); + + @Override + public Set getSetBonuses() { + return null; + } +} diff --git a/src/main/java/gregtech/common/items/armor/IJetpack.java b/src/main/java/gregtech/common/items/armor/IJetpack.java deleted file mode 100644 index 1043a159db7..00000000000 --- a/src/main/java/gregtech/common/items/armor/IJetpack.java +++ /dev/null @@ -1,109 +0,0 @@ -package gregtech.common.items.armor; - -import gregtech.api.items.armor.ArmorUtils; -import gregtech.api.util.input.KeyBind; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumParticleTypes; - -import org.jetbrains.annotations.NotNull; - -/** - * Logic from SimplyJetpacks2: - * https://github.com/Tomson124/SimplyJetpacks2/blob/1.12/src/main/java/tonius/simplyjetpacks/item/ItemJetpack.java - */ -public interface IJetpack { - - default double getSprintEnergyModifier() { - return 1.0D; - } - - default double getSprintSpeedModifier() { - return 1.0D; - } - - default double getVerticalHoverSpeed() { - return 0.18D; - } - - default double getVerticalHoverSlowSpeed() { - return 0.14D; - } - - default double getVerticalAcceleration() { - return 0.1D; - } - - default double getVerticalSpeed() { - return 0.22D; - } - - default double getSidewaysSpeed() { - return 0.0D; - } - - default EnumParticleTypes getParticle() { - return EnumParticleTypes.SMOKE_LARGE; - } - - default float getFallDamageReduction() { - return 0.0f; - } - - int getEnergyPerUse(); - - boolean canUseEnergy(ItemStack stack, int amount); - - void drainEnergy(ItemStack stack, int amount); - - boolean hasEnergy(ItemStack stack); - - default void performFlying(@NotNull EntityPlayer player, boolean hover, ItemStack stack) { - double currentAccel = getVerticalAcceleration() * (player.motionY < 0.3D ? 2.5D : 1.0D); - double currentSpeedVertical = getVerticalSpeed() * (player.isInWater() ? 0.4D : 1.0D); - boolean flyKeyDown = KeyBind.VANILLA_JUMP.isKeyDown(player); - boolean descendKeyDown = KeyBind.VANILLA_SNEAK.isKeyDown(player); - - if (!player.isInWater() && !player.isInLava() && canUseEnergy(stack, getEnergyPerUse())) { - if (flyKeyDown || hover && !player.onGround) { - drainEnergy(stack, (int) (player.isSprinting() ? - Math.round(getEnergyPerUse() * getSprintEnergyModifier()) : getEnergyPerUse())); - - if (hasEnergy(stack)) { - if (flyKeyDown) { - if (!hover) { - player.motionY = Math.min(player.motionY + currentAccel, currentSpeedVertical); - } else { - if (descendKeyDown) - player.motionY = Math.min(player.motionY + currentAccel, getVerticalHoverSlowSpeed()); - else player.motionY = Math.min(player.motionY + currentAccel, getVerticalHoverSpeed()); - } - } else if (descendKeyDown) { - player.motionY = Math.min(player.motionY + currentAccel, -getVerticalHoverSpeed()); - } else { - player.motionY = Math.min(player.motionY + currentAccel, -getVerticalHoverSlowSpeed()); - } - float speedSideways = (float) (player.isSneaking() ? getSidewaysSpeed() * 0.5f : - getSidewaysSpeed()); - float speedForward = (float) (player.isSprinting() ? speedSideways * getSprintSpeedModifier() : - speedSideways); - - if (KeyBind.VANILLA_FORWARD.isKeyDown(player)) - player.moveRelative(0, 0, speedForward, speedForward); - if (KeyBind.VANILLA_BACKWARD.isKeyDown(player)) - player.moveRelative(0, 0, -speedSideways, speedSideways * 0.8f); - if (KeyBind.VANILLA_LEFT.isKeyDown(player)) - player.moveRelative(speedSideways, 0, 0, speedSideways); - if (KeyBind.VANILLA_RIGHT.isKeyDown(player)) - player.moveRelative(-speedSideways, 0, 0, speedSideways); - if (!player.getEntityWorld().isRemote) { - player.fallDistance = 0; - } - - } - ArmorUtils.spawnParticle(player.getEntityWorld(), player, getParticle(), -0.6D); - } - } - } -} diff --git a/src/main/java/gregtech/common/items/armor/IStepAssist.java b/src/main/java/gregtech/common/items/armor/IStepAssist.java deleted file mode 100644 index 944c125737e..00000000000 --- a/src/main/java/gregtech/common/items/armor/IStepAssist.java +++ /dev/null @@ -1,24 +0,0 @@ -package gregtech.common.items.armor; - -import net.minecraft.entity.player.EntityPlayer; - -import org.jetbrains.annotations.NotNull; - -/** - * Logic from EnderIO: - * https://github.com/SleepyTrousers/EnderIO/blob/d6dfb9d3964946ceb9fd72a66a3cff197a51a1fe/enderio-base/src/main/java/crazypants/enderio/base/handler/darksteel/DarkSteelController.java - */ -public interface IStepAssist { - - float MAGIC_STEP_HEIGHT = 1.0023f; - - default void updateStepHeight(@NotNull EntityPlayer player) { - if (!player.isSneaking()) { - if (player.stepHeight < MAGIC_STEP_HEIGHT) { - player.stepHeight = MAGIC_STEP_HEIGHT; - } - } else if (player.stepHeight == MAGIC_STEP_HEIGHT) { - player.stepHeight = 0.6F; - } - } -} diff --git a/src/main/java/gregtech/common/items/armor/Jetpack.java b/src/main/java/gregtech/common/items/armor/Jetpack.java deleted file mode 100644 index ec15c14df85..00000000000 --- a/src/main/java/gregtech/common/items/armor/Jetpack.java +++ /dev/null @@ -1,165 +0,0 @@ -package gregtech.common.items.armor; - -import gregtech.api.capability.GregtechCapabilities; -import gregtech.api.capability.IElectricItem; -import gregtech.api.items.armor.ArmorLogicSuite; -import gregtech.api.items.armor.ArmorUtils; -import gregtech.api.util.GTUtility; -import gregtech.api.util.input.KeyBind; - -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.world.World; -import net.minecraftforge.common.ISpecialArmor.ArmorProperties; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public class Jetpack extends ArmorLogicSuite implements IJetpack { - - @SideOnly(Side.CLIENT) - protected ArmorUtils.ModularHUD HUD; - - public Jetpack(int energyPerUse, long capacity, int tier) { - super(energyPerUse, capacity, tier, EntityEquipmentSlot.CHEST); - if (ArmorUtils.SIDE.isClient() && this.shouldDrawHUD()) { - // noinspection NewExpressionSideOnly - HUD = new ArmorUtils.ModularHUD(); - } - } - - @Override - public void onArmorTick(World world, EntityPlayer player, @NotNull ItemStack stack) { - NBTTagCompound data = GTUtility.getOrCreateNbtCompound(stack); - byte toggleTimer = 0; - boolean hover = false; - if (data.hasKey("toggleTimer")) toggleTimer = data.getByte("toggleTimer"); - if (data.hasKey("hover")) hover = data.getBoolean("hover"); - - if (toggleTimer == 0 && KeyBind.ARMOR_HOVER.isKeyDown(player)) { - hover = !hover; - toggleTimer = 5; - data.setBoolean("hover", hover); - if (!world.isRemote) { - if (hover) - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.enable"), true); - else - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.disable"), true); - } - } - - performFlying(player, hover, stack); - - if (toggleTimer > 0) toggleTimer--; - - data.setBoolean("hover", hover); - data.setByte("toggleTimer", toggleTimer); - player.inventoryContainer.detectAndSendChanges(); - } - - @Override - public boolean canUseEnergy(@NotNull ItemStack stack, int amount) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return false; - return container.canUse(amount); - } - - @Override - public void drainEnergy(@NotNull ItemStack stack, int amount) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return; - container.discharge(amount, tier, true, false, false); - } - - @Override - public boolean hasEnergy(@NotNull ItemStack stack) { - IElectricItem container = getIElectricItem(stack); - if (container == null) - return false; - return container.getCharge() > 0; - } - - private static IElectricItem getIElectricItem(@NotNull ItemStack stack) { - return stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - return "gregtech:textures/armor/jetpack.png"; - } - - @Override - public ArmorProperties getProperties(EntityLivingBase player, @NotNull ItemStack armor, DamageSource source, - double damage, EntityEquipmentSlot equipmentSlot) { - return new ArmorProperties(0, 0, 0); - } - - @SideOnly(Side.CLIENT) - @Override - public void drawHUD(ItemStack item) { - addCapacityHUD(item, this.HUD); - NBTTagCompound data = item.getTagCompound(); - if (data != null) { - if (data.hasKey("hover")) { - String status = (data.getBoolean("hover") ? I18n.format("metaarmor.hud.status.enabled") : - I18n.format("metaarmor.hud.status.disabled")); - String result = I18n.format("metaarmor.hud.hover_mode", status); - this.HUD.newString(result); - } - } - this.HUD.draw(); - this.HUD.reset(); - } - - @Override - public void addInfo(ItemStack itemStack, List lines) { - super.addInfo(itemStack, lines); - NBTTagCompound data = itemStack.getTagCompound(); - if (data != null) { - String status = I18n.format("metaarmor.hud.status.disabled"); - if (data.hasKey("hover")) { - if (data.getBoolean("hover")) - status = I18n.format("metaarmor.hud.status.enabled"); - } - lines.add(I18n.format("metaarmor.hud.hover_mode", status)); - } - } - - @Override - public double getVerticalHoverSlowSpeed() { - return 0.1D; - } - - @Override - public double getVerticalAcceleration() { - return 0.12D; - } - - @Override - public double getVerticalSpeed() { - return 0.3D; - } - - @Override - public double getSidewaysSpeed() { - return 0.08D; - } - - @Override - public EnumParticleTypes getParticle() { - return EnumParticleTypes.SMOKE_NORMAL; - } -} diff --git a/src/main/java/gregtech/common/items/armor/JetpackStats.java b/src/main/java/gregtech/common/items/armor/JetpackStats.java new file mode 100644 index 00000000000..3a47915754a --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/JetpackStats.java @@ -0,0 +1,85 @@ +package gregtech.common.items.armor; + +import gregtech.api.items.armoritem.jetpack.IJetpackStats; + +import net.minecraft.util.EnumParticleTypes; + +import org.jetbrains.annotations.Nullable; + +public enum JetpackStats implements IJetpackStats { + + FUELED(1.0f, 1.0f, 0.18f, 0.14f, 0.1f, 0.22f, 0.0f, 0.0f, EnumParticleTypes.SMOKE_LARGE), + ELECTRIC(1.0f, 1.0f, 0.18f, 0.1f, 0.12f, 0.3f, 0.08f, 0.0f, EnumParticleTypes.SMOKE_NORMAL), + ADVANCED(2.5f, 1.3f, 0.34f, 0.03f, 0.13f, 0.48f, 0.14f, 2.0f, EnumParticleTypes.CLOUD), + NANO(4.0f, 1.8f, 0.4f, 0.005f, 0.14f, 0.8f, 0.19f, 3.5f, null), + QUANTUM(6.0f, 2.4f, 0.45f, 0.0f, 0.15f, 0.9f, 0.21f, 8.0f, null); + + private final float sprintEnergyMod; + private final float sprintSpeedMod; + private final float hoverSpeed; + private final float hoverSlowSpeed; + private final float acceleration; + private final float verticalSpeed; + private final float horizontalSpeed; + private final float fallDamageReduction; + private final EnumParticleTypes particle; + + JetpackStats(float sprintEnergyMod, float sprintSpeedMod, float hoverSpeed, + float hoverSlowSpeed, float acceleration, float verticalSpeed, + float horizontalSpeed, float fallDamageReduction, EnumParticleTypes particle) { + this.sprintEnergyMod = sprintEnergyMod; + this.sprintSpeedMod = sprintSpeedMod; + this.hoverSpeed = hoverSpeed; + this.hoverSlowSpeed = hoverSlowSpeed; + this.acceleration = acceleration; + this.verticalSpeed = verticalSpeed; + this.horizontalSpeed = horizontalSpeed; + this.fallDamageReduction = fallDamageReduction; + this.particle = particle; + } + + @Override + public double getSprintEnergyModifier() { + return sprintEnergyMod; + } + + @Override + public double getSprintSpeedModifier() { + return sprintSpeedMod; + } + + @Override + public double getVerticalHoverSpeed() { + return hoverSpeed; + } + + @Override + public double getVerticalHoverSlowSpeed() { + return hoverSlowSpeed; + } + + @Override + public double getVerticalAcceleration() { + return acceleration; + } + + @Override + public double getVerticalSpeed() { + return verticalSpeed; + } + + @Override + public double getSidewaysSpeed() { + return horizontalSpeed; + } + + @Override + public float getFallDamageReduction() { + return fallDamageReduction; + } + + @Override + public @Nullable EnumParticleTypes getParticle() { + return particle; + } +} diff --git a/src/main/java/gregtech/common/items/armor/MetaArmor.java b/src/main/java/gregtech/common/items/armor/MetaArmor.java deleted file mode 100644 index 1d53bbca1c9..00000000000 --- a/src/main/java/gregtech/common/items/armor/MetaArmor.java +++ /dev/null @@ -1,71 +0,0 @@ -package gregtech.common.items.armor; - -import gregtech.api.items.armor.ArmorMetaItem; -import gregtech.common.ConfigHolder; -import gregtech.common.items.MetaItems; - -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.EnumRarity; - -public class MetaArmor extends ArmorMetaItem.ArmorMetaValueItem> { - - @Override - public void registerSubItems() { - MetaItems.NIGHTVISION_GOGGLES = addItem(1, "nightvision_goggles").setArmorLogic(new NightvisionGoggles(2, - 80_000L * (long) Math.max(1, Math.pow(1, ConfigHolder.tools.voltageTierNightVision - 1)), - ConfigHolder.tools.voltageTierNightVision, EntityEquipmentSlot.HEAD)); - - MetaItems.SEMIFLUID_JETPACK = addItem(2, "liquid_fuel_jetpack").setArmorLogic(new PowerlessJetpack()); - MetaItems.ELECTRIC_JETPACK = addItem(3, "electric_jetpack").setArmorLogic(new Jetpack(30, - 1_000_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierImpeller - 2)), - ConfigHolder.tools.voltageTierImpeller)).setModelAmount(8).setRarity(EnumRarity.UNCOMMON); - MetaItems.ELECTRIC_JETPACK_ADVANCED = addItem(4, "advanced_electric_jetpack") - .setArmorLogic(new AdvancedJetpack(512, - 6_400_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierAdvImpeller - 4)), - ConfigHolder.tools.voltageTierAdvImpeller)) - .setRarity(EnumRarity.RARE); - - int energyPerUse = 512; - int tier = ConfigHolder.tools.voltageTierNanoSuit; - long maxCapacity = 6_400_000L * (long) Math.max(1, Math.pow(4, tier - 3)); - MetaItems.NANO_HELMET = addItem(20, "nms.helmet") - .setArmorLogic(new NanoMuscleSuite(EntityEquipmentSlot.HEAD, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.UNCOMMON); - MetaItems.NANO_CHESTPLATE = addItem(21, "nms.chestplate") - .setArmorLogic(new NanoMuscleSuite(EntityEquipmentSlot.CHEST, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.UNCOMMON); - MetaItems.NANO_LEGGINGS = addItem(22, "nms.leggings") - .setArmorLogic(new NanoMuscleSuite(EntityEquipmentSlot.LEGS, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.UNCOMMON); - MetaItems.NANO_BOOTS = addItem(23, "nms.boots") - .setArmorLogic(new NanoMuscleSuite(EntityEquipmentSlot.FEET, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.UNCOMMON); - MetaItems.NANO_CHESTPLATE_ADVANCED = addItem(30, "nms.advanced_chestplate") - .setArmorLogic(new AdvancedNanoMuscleSuite(energyPerUse, - 12_800_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierAdvNanoSuit - 3)), - ConfigHolder.tools.voltageTierAdvNanoSuit)) - .setRarity(EnumRarity.RARE); - - energyPerUse = 8192; - tier = ConfigHolder.tools.voltageTierQuarkTech; - maxCapacity = 100_000_000L * (long) Math.max(1, Math.pow(4, tier - 5)); - MetaItems.QUANTUM_HELMET = addItem(40, "qts.helmet") - .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.HEAD, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.RARE); - MetaItems.QUANTUM_CHESTPLATE = addItem(41, "qts.chestplate") - .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.CHEST, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.RARE); - MetaItems.QUANTUM_LEGGINGS = addItem(42, "qts.leggings") - .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.LEGS, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.RARE); - MetaItems.QUANTUM_BOOTS = addItem(43, "qts.boots") - .setArmorLogic(new QuarkTechSuite(EntityEquipmentSlot.FEET, energyPerUse, maxCapacity, tier)) - .setRarity(EnumRarity.RARE); - MetaItems.QUANTUM_CHESTPLATE_ADVANCED = addItem(50, "qts.advanced_chestplate") - .setArmorLogic(new AdvancedQuarkTechSuite(energyPerUse, - 1_000_000_000L * - (long) Math.max(1, Math.pow(4, ConfigHolder.tools.voltageTierAdvQuarkTech - 6)), - ConfigHolder.tools.voltageTierAdvQuarkTech)) - .setRarity(EnumRarity.EPIC); - } -} diff --git a/src/main/java/gregtech/common/items/armor/NanoMuscleSuite.java b/src/main/java/gregtech/common/items/armor/NanoMuscleSuite.java index 57be7d1acd4..87ef58586a5 100644 --- a/src/main/java/gregtech/common/items/armor/NanoMuscleSuite.java +++ b/src/main/java/gregtech/common/items/armor/NanoMuscleSuite.java @@ -29,7 +29,8 @@ import java.util.List; -public class NanoMuscleSuite extends ArmorLogicSuite implements IStepAssist { +@Deprecated +public class NanoMuscleSuite extends ArmorLogicSuite { @SideOnly(Side.CLIENT) protected ArmorUtils.ModularHUD HUD; @@ -83,8 +84,6 @@ public void onArmorTick(World world, EntityPlayer player, @NotNull ItemStack ite --toggleTimer; nbtData.setByte("toggleTimer", toggleTimer); } - } else if (SLOT == EntityEquipmentSlot.FEET) { - updateStepHeight(player); } player.inventoryContainer.detectAndSendChanges(); } @@ -147,11 +146,6 @@ public double getDamageAbsorption() { return 1.0D; } - @Override - public float getHeatResistance() { - return 0.75f; - } - @SideOnly(Side.CLIENT) @Override public void drawHUD(ItemStack item) { diff --git a/src/main/java/gregtech/common/items/armor/NightvisionGoggles.java b/src/main/java/gregtech/common/items/armor/NightvisionGoggles.java deleted file mode 100644 index d32d2b0c663..00000000000 --- a/src/main/java/gregtech/common/items/armor/NightvisionGoggles.java +++ /dev/null @@ -1,104 +0,0 @@ -package gregtech.common.items.armor; - -import gregtech.api.capability.GregtechCapabilities; -import gregtech.api.capability.IElectricItem; -import gregtech.api.items.armor.ArmorLogicSuite; -import gregtech.api.util.GTUtility; -import gregtech.api.util.input.KeyBind; - -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.MobEffects; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.world.World; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -public class NightvisionGoggles extends ArmorLogicSuite { - - public NightvisionGoggles(int energyPerUse, long capacity, int voltageTier, EntityEquipmentSlot slot) { - super(energyPerUse, capacity, voltageTier, slot); - } - - @Override - public void onArmorTick(World world, @NotNull EntityPlayer player, @NotNull ItemStack itemStack) { - IElectricItem item = itemStack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); - if (item == null) { - return; - } - NBTTagCompound nbtData = GTUtility.getOrCreateNbtCompound(itemStack); - byte toggleTimer = nbtData.getByte("toggleTimer"); - if (!player.getItemStackFromSlot(EntityEquipmentSlot.HEAD).isItemEqual(itemStack)) { - disableNightVision(world, player, false); - } - if (SLOT == EntityEquipmentSlot.HEAD) { - boolean nightvision = nbtData.getBoolean("Nightvision"); - if (toggleTimer == 0 && KeyBind.ARMOR_MODE_SWITCH.isKeyDown(player)) { - toggleTimer = 5; - if (!nightvision && item.getCharge() >= energyPerUse) { - nightvision = true; - if (!world.isRemote) - player.sendStatusMessage(new TextComponentTranslation("metaarmor.message.nightvision.enabled"), - true); - } else if (nightvision) { - nightvision = false; - disableNightVision(world, player, true); - } else { - if (!world.isRemote) { - player.sendStatusMessage(new TextComponentTranslation("metaarmor.message.nightvision.error"), - true); - } - } - - if (!world.isRemote) { - nbtData.setBoolean("Nightvision", nightvision); - } - } - - if (nightvision && !world.isRemote && item.getCharge() >= energyPerUse) { - player.removePotionEffect(MobEffects.BLINDNESS); - player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, 999999, 0, true, false)); - item.discharge((energyPerUse), this.tier, true, false, false); - } - - if (toggleTimer > 0) --toggleTimer; - - nbtData.setByte("toggleTimer", toggleTimer); - } - player.inventoryContainer.detectAndSendChanges(); - } - - public static void disableNightVision(@NotNull World world, EntityPlayer player, boolean sendMsg) { - if (!world.isRemote) { - player.removePotionEffect(MobEffects.NIGHT_VISION); - if (sendMsg) - player.sendStatusMessage(new TextComponentTranslation("metaarmor.message.nightvision.disabled"), true); - } - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - return "gregtech:textures/armor/nightvision_goggles.png"; - } - - @Override - public void addInfo(ItemStack itemStack, List lines) { - super.addInfo(itemStack, lines); - if (SLOT == EntityEquipmentSlot.HEAD) { - NBTTagCompound nbtData = GTUtility.getOrCreateNbtCompound(itemStack); - boolean nv = nbtData.getBoolean("Nightvision"); - if (nv) { - lines.add(I18n.format("metaarmor.message.nightvision.enabled")); - } else { - lines.add(I18n.format("metaarmor.message.nightvision.disabled")); - } - } - } -} diff --git a/src/main/java/gregtech/common/items/armor/PowerlessJetpack.java b/src/main/java/gregtech/common/items/armor/PowerlessJetpack.java deleted file mode 100644 index 0f9e2867193..00000000000 --- a/src/main/java/gregtech/common/items/armor/PowerlessJetpack.java +++ /dev/null @@ -1,339 +0,0 @@ -package gregtech.common.items.armor; - -import gregtech.api.capability.IFilter; -import gregtech.api.capability.impl.GTFluidHandlerItemStack; -import gregtech.api.items.armor.ArmorMetaItem; -import gregtech.api.items.armor.ArmorMetaItem.ArmorMetaValueItem; -import gregtech.api.items.armor.ArmorUtils; -import gregtech.api.items.armor.ISpecialArmorLogic; -import gregtech.api.items.metaitem.stats.*; -import gregtech.api.recipes.Recipe; -import gregtech.api.recipes.RecipeMaps; -import gregtech.api.unification.material.Materials; -import gregtech.api.util.GTUtility; -import gregtech.api.util.GradientUtil; -import gregtech.api.util.input.KeyBind; - -import net.minecraft.client.resources.I18n; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.EntityEquipmentSlot; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.*; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.world.World; -import net.minecraftforge.common.ISpecialArmor; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; -import net.minecraftforge.fluids.capability.IFluidTankProperties; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.awt.*; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class PowerlessJetpack implements ISpecialArmorLogic, IJetpack, IItemHUDProvider { - - public static final int tankCapacity = 16000; - - private Recipe previousRecipe = null; - private Recipe currentRecipe = null; - private int burnTimer = 0; - - @SideOnly(Side.CLIENT) - private ArmorUtils.ModularHUD HUD; - - public PowerlessJetpack() { - if (ArmorUtils.SIDE.isClient()) - // noinspection NewExpressionSideOnly - HUD = new ArmorUtils.ModularHUD(); - } - - @Override - public void onArmorTick(World world, EntityPlayer player, @NotNull ItemStack stack) { - IFluidHandlerItem internalTank = stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, - null); - if (internalTank == null) - return; - - NBTTagCompound data = GTUtility.getOrCreateNbtCompound(stack); - byte toggleTimer = 0; - boolean hover = false; - - if (data.hasKey("burnTimer")) burnTimer = data.getShort("burnTimer"); - if (data.hasKey("toggleTimer")) toggleTimer = data.getByte("toggleTimer"); - if (data.hasKey("hover")) hover = data.getBoolean("hover"); - - if (toggleTimer == 0 && KeyBind.ARMOR_HOVER.isKeyDown(player)) { - hover = !hover; - toggleTimer = 5; - data.setBoolean("hover", hover); - if (!world.isRemote) { - if (hover) - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.enable"), true); - else - player.sendStatusMessage(new TextComponentTranslation("metaarmor.jetpack.hover.disable"), true); - } - } - - // This causes a caching issue. currentRecipe is only set to null in findNewRecipe, so the fuel is never updated - // Rewrite in Armor Rework - if (currentRecipe == null) - findNewRecipe(stack); - - performFlying(player, hover, stack); - - if (toggleTimer > 0) - toggleTimer--; - - data.setBoolean("hover", hover); - data.setShort("burnTimer", (short) burnTimer); - data.setByte("toggleTimer", toggleTimer); - player.inventoryContainer.detectAndSendChanges(); - } - - @Override - public EntityEquipmentSlot getEquipmentSlot(ItemStack itemStack) { - return EntityEquipmentSlot.CHEST; - } - - @Override - public void addToolComponents(@NotNull ArmorMetaValueItem mvi) { - mvi.addComponents(new Behaviour(tankCapacity)); - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) { - return "gregtech:textures/armor/liquid_fuel_jetpack.png"; - } - - @SideOnly(Side.CLIENT) - @Override - public void drawHUD(@NotNull ItemStack item) { - IFluidHandlerItem tank = item.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - if (tank != null) { - IFluidTankProperties[] prop = tank.getTankProperties(); - if (prop[0] != null) { - if (prop[0].getContents() != null) { - if (prop[0].getContents().amount == 0) return; - String formated = String.format("%.1f", - (prop[0].getContents().amount * 100.0F / prop[0].getCapacity())); - this.HUD.newString(I18n.format("metaarmor.hud.fuel_lvl", formated + "%")); - NBTTagCompound data = item.getTagCompound(); - - if (data != null) { - if (data.hasKey("hover")) { - String status = (data.getBoolean("hover") ? I18n.format("metaarmor.hud.status.enabled") : - I18n.format("metaarmor.hud.status.disabled")); - String result = I18n.format("metaarmor.hud.hover_mode", status); - this.HUD.newString(result); - } - } - } - } - } - this.HUD.draw(); - this.HUD.reset(); - } - - @Override - public int getEnergyPerUse() { - return 1; - } - - @Override - public boolean canUseEnergy(ItemStack stack, int amount) { - FluidStack fuel = getFuel(); - if (fuel == null) { - return false; - } - - IFluidHandlerItem fluidHandlerItem = getIFluidHandlerItem(stack); - if (fluidHandlerItem == null) - return false; - - FluidStack fluidStack = fluidHandlerItem.drain(fuel, false); - if (fluidStack == null) - return false; - - return fluidStack.amount >= fuel.amount; - } - - @Override - public void drainEnergy(ItemStack stack, int amount) { - if (this.burnTimer == 0) { - FluidStack fuel = getFuel(); - if (fuel == null) return; - getIFluidHandlerItem(stack).drain(fuel, true); - burnTimer = currentRecipe.getDuration(); - } - this.burnTimer--; - } - - @Override - public boolean hasEnergy(ItemStack stack) { - return burnTimer > 0 || currentRecipe != null; - } - - private static IFluidHandlerItem getIFluidHandlerItem(@NotNull ItemStack stack) { - return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - } - - public void findNewRecipe(@NotNull ItemStack stack) { - IFluidHandlerItem internalTank = getIFluidHandlerItem(stack); - if (internalTank != null) { - FluidStack fluidStack = internalTank.drain(1, false); - if (previousRecipe != null && fluidStack != null && - fluidStack.isFluidEqual(previousRecipe.getFluidInputs().get(0).getInputFluidStack()) && - fluidStack.amount > 0) { - currentRecipe = previousRecipe; - return; - } else if (fluidStack != null) { - Recipe recipe = RecipeMaps.COMBUSTION_GENERATOR_FUELS.find(Collections.emptyList(), - Collections.singletonList(fluidStack), (Objects::nonNull)); - if (recipe != null) { - previousRecipe = recipe; - currentRecipe = previousRecipe; - return; - } - } - } - currentRecipe = null; - } - - public void resetRecipe() { - currentRecipe = null; - previousRecipe = null; - } - - public FluidStack getFuel() { - if (currentRecipe != null) { - return currentRecipe.getFluidInputs().get(0).getInputFluidStack(); - } - - return null; - } - - public ActionResult onRightClick(World world, EntityPlayer player, EnumHand hand) { - if (player.getHeldItem(hand).getItem() instanceof ArmorMetaItem) { - ItemStack armor = player.getHeldItem(hand); - if (armor.getItem() instanceof ArmorMetaItem && player.inventory.armorInventory - .get(getEquipmentSlot(player.getHeldItem(hand)).getIndex()).isEmpty() && !player.isSneaking()) { - player.inventory.armorInventory.set(getEquipmentSlot(player.getHeldItem(hand)).getIndex(), - armor.copy()); - player.setHeldItem(hand, ItemStack.EMPTY); - player.playSound(new SoundEvent(new ResourceLocation("item.armor.equip_generic")), 1.0F, 1.0F); - return ActionResult.newResult(EnumActionResult.SUCCESS, armor); - } - } - - return ActionResult.newResult(EnumActionResult.PASS, player.getHeldItem(hand)); - } - - @Override - public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase player, @NotNull ItemStack armor, - @NotNull DamageSource source, double damage, - EntityEquipmentSlot equipmentSlot) { - int damageLimit = (int) Math.min(Integer.MAX_VALUE, burnTimer * 1.0 / 32 * 25.0); - if (source.isUnblockable()) return new ISpecialArmor.ArmorProperties(0, 0.0, 0); - return new ISpecialArmor.ArmorProperties(0, 0, damageLimit); - } - - @Override - public int getArmorDisplay(EntityPlayer player, @NotNull ItemStack armor, int slot) { - return 0; - } - - public class Behaviour implements IItemDurabilityManager, IItemCapabilityProvider, IItemBehaviour, ISubItemHandler { - - private static final IFilter JETPACK_FUEL_FILTER = new IFilter<>() { - - @Override - public boolean test(@NotNull FluidStack fluidStack) { - return RecipeMaps.COMBUSTION_GENERATOR_FUELS.find(Collections.emptyList(), - Collections.singletonList(fluidStack), (Objects::nonNull)) != null; - } - - @Override - public int getPriority() { - return IFilter.whitelistLikePriority(); - } - }; - - public final int maxCapacity; - private final Pair durabilityBarColors; - - public Behaviour(int internalCapacity) { - this.maxCapacity = internalCapacity; - this.durabilityBarColors = GradientUtil.getGradient(0xB7AF08, 10); - } - - @Override - public double getDurabilityForDisplay(@NotNull ItemStack itemStack) { - IFluidHandlerItem fluidHandlerItem = itemStack - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - if (fluidHandlerItem == null) return 0; - IFluidTankProperties fluidTankProperties = fluidHandlerItem.getTankProperties()[0]; - FluidStack fluidStack = fluidTankProperties.getContents(); - return fluidStack == null ? 0 : (double) fluidStack.amount / (double) fluidTankProperties.getCapacity(); - } - - @Nullable - @Override - public Pair getDurabilityColorsForDisplay(ItemStack itemStack) { - return durabilityBarColors; - } - - @Override - public ICapabilityProvider createProvider(ItemStack itemStack) { - return new GTFluidHandlerItemStack(itemStack, maxCapacity) - .setFilter(JETPACK_FUEL_FILTER); - } - - @Override - public void addInformation(ItemStack itemStack, List lines) { - IItemBehaviour.super.addInformation(itemStack, lines); - NBTTagCompound data = GTUtility.getOrCreateNbtCompound(itemStack); - String status = I18n.format("metaarmor.hud.status.disabled"); - if (data.hasKey("hover")) { - if (data.getBoolean("hover")) - status = I18n.format("metaarmor.hud.status.enabled"); - } - lines.add(I18n.format("metaarmor.hud.hover_mode", status)); - } - - @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { - return onRightClick(world, player, hand); - } - - @Override - public String getItemSubType(ItemStack itemStack) { - return ""; - } - - @Override - public void getSubItems(ItemStack itemStack, CreativeTabs creativeTab, NonNullList subItems) { - ItemStack copy = itemStack.copy(); - IFluidHandlerItem fluidHandlerItem = copy - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - if (fluidHandlerItem != null) { - fluidHandlerItem.fill(Materials.Diesel.getFluid(tankCapacity), true); - subItems.add(copy); - } else { - subItems.add(itemStack); - } - } - } -} diff --git a/src/main/java/gregtech/common/items/armor/QuarkTechSuite.java b/src/main/java/gregtech/common/items/armor/QuarkTechSuite.java index c485f9b3e00..7c28a6ece5e 100644 --- a/src/main/java/gregtech/common/items/armor/QuarkTechSuite.java +++ b/src/main/java/gregtech/common/items/armor/QuarkTechSuite.java @@ -36,7 +36,8 @@ import java.util.List; import java.util.Map; -public class QuarkTechSuite extends ArmorLogicSuite implements IStepAssist { +@Deprecated +public class QuarkTechSuite extends ArmorLogicSuite { protected static final Map potionRemovalCost = new IdentityHashMap<>(); private float charge = 0.0F; @@ -220,7 +221,6 @@ public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { } } } - updateStepHeight(player); } if (ret) { @@ -294,11 +294,6 @@ public double getDamageAbsorption() { return SLOT == EntityEquipmentSlot.CHEST ? 1.2D : 1.0D; } - @Override - public float getHeatResistance() { - return 0.5f; - } - @SideOnly(Side.CLIENT) @Override public void drawHUD(ItemStack item) { diff --git a/src/main/java/gregtech/common/items/armor/behavior/ElectricJetpackBehavior.java b/src/main/java/gregtech/common/items/armor/behavior/ElectricJetpackBehavior.java new file mode 100644 index 00000000000..de33bc395b2 --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/behavior/ElectricJetpackBehavior.java @@ -0,0 +1,38 @@ +package gregtech.common.items.armor.behavior; + +import gregtech.api.capability.GregtechCapabilities; +import gregtech.api.capability.IElectricItem; +import gregtech.api.items.armoritem.jetpack.IJetpackStats; +import gregtech.api.items.armoritem.jetpack.JetpackBehavior; + +import net.minecraft.item.ItemStack; + +import org.jetbrains.annotations.NotNull; + +public class ElectricJetpackBehavior extends JetpackBehavior { + + private final int energyPerUse; + + public ElectricJetpackBehavior(IJetpackStats jetpackStats, int energyPerUse) { + super(jetpackStats); + this.energyPerUse = energyPerUse; + } + + @Override + protected int getFuelPerUse() { + return energyPerUse; + } + + @Override + protected boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simulate) { + IElectricItem electricItem = getElectricItem(stack); + if (electricItem != null) { + return electricItem.discharge(amount, Integer.MAX_VALUE, true, false, simulate) >= amount; + } + return false; + } + + private static IElectricItem getElectricItem(@NotNull ItemStack stack) { + return stack.getCapability(GregtechCapabilities.CAPABILITY_ELECTRIC_ITEM, null); + } +} diff --git a/src/main/java/gregtech/common/items/armor/behavior/FallDamageCancelBehavior.java b/src/main/java/gregtech/common/items/armor/behavior/FallDamageCancelBehavior.java new file mode 100644 index 00000000000..597084a4f24 --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/behavior/FallDamageCancelBehavior.java @@ -0,0 +1,31 @@ +package gregtech.common.items.armor.behavior; + +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.IArmorBehavior; + +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class FallDamageCancelBehavior implements IArmorBehavior { + + public static final FallDamageCancelBehavior INSTANCE = new FallDamageCancelBehavior(); + + protected FallDamageCancelBehavior() {/**/} + + @Override + public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull NBTTagCompound tag) { + tag.setBoolean(ArmorHelper.FALL_DAMAGE_KEY, true); + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip) { + tooltip.add(I18n.format("metaarmor.tooltip.falldamage")); + } +} diff --git a/src/main/java/gregtech/common/items/armor/behavior/FireImmunityBehavior.java b/src/main/java/gregtech/common/items/armor/behavior/FireImmunityBehavior.java new file mode 100644 index 00000000000..a56db595e95 --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/behavior/FireImmunityBehavior.java @@ -0,0 +1,36 @@ +package gregtech.common.items.armor.behavior; + +import gregtech.api.items.armoritem.IArmorBehavior; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class FireImmunityBehavior implements IArmorBehavior { + + public static FireImmunityBehavior INSTANCE = new FireImmunityBehavior(); + + @Override + public void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + player.isImmuneToFire = true; + if (player.isBurning()) { + player.extinguish(); + } + } + + @Override + public void onArmorUnequip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + player.isImmuneToFire = false; + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip) { + tooltip.add(I18n.format("metaarmor.tooltip.burning")); + } +} diff --git a/src/main/java/gregtech/common/items/armor/behavior/FueledJetpackBehavior.java b/src/main/java/gregtech/common/items/armor/behavior/FueledJetpackBehavior.java new file mode 100644 index 00000000000..d50d4bba833 --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/behavior/FueledJetpackBehavior.java @@ -0,0 +1,136 @@ +package gregtech.common.items.armor.behavior; + +import gregtech.api.capability.IFilter; +import gregtech.api.capability.impl.GTFluidHandlerItemStack; +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.jetpack.IJetpackStats; +import gregtech.api.items.armoritem.jetpack.JetpackBehavior; +import gregtech.api.recipes.Recipe; +import gregtech.api.recipes.RecipeMaps; + +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.capability.IFluidTankProperties; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +/** + * Creates a Jetpack which runs on any Fuel in a provided fuel RecipeMap. + */ +public class FueledJetpackBehavior extends JetpackBehavior { + + public static final Function COMBUSTION_FUEL_BURN_TIME = fluidStack -> { + Recipe recipe = RecipeMaps.COMBUSTION_GENERATOR_FUELS.findRecipe( + Integer.MAX_VALUE, + Collections.emptyList(), + Collections.singletonList(fluidStack)); + return recipe != null ? recipe.getDuration() : 0; + }; + + private final int maxCapacity; + private final Function fuelBurnTimeFunc; + + public FueledJetpackBehavior(IJetpackStats jetpackStats, int maxCapacity, + Function fuelBurnTimeFunc) { + super(jetpackStats); + this.maxCapacity = maxCapacity; + this.fuelBurnTimeFunc = fuelBurnTimeFunc; + } + + @Override + protected int getFuelPerUse() { + return 1; + } + + @Override + protected boolean drainFuel(@NotNull ItemStack stack, int amount, boolean simulate) { + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(stack); + short burnTimer = tag.getShort(ArmorHelper.FUELED_JETPACK_BURN_TIMER); + if (burnTimer > 0) { + if (!simulate) { + tag.setShort(ArmorHelper.FUELED_JETPACK_BURN_TIMER, (short) (burnTimer - 1)); + } + return true; + } + + IFluidHandlerItem fluidHandler = getFluidHandler(stack); + if (fluidHandler == null) return false; + FluidStack fuelStack = fluidHandler.drain(amount, false); + if (fuelStack == null) return false; + + int burnTime = fuelBurnTimeFunc.apply(fuelStack); + if (burnTime <= 0) return false; + + if (!simulate) { + tag.setShort(ArmorHelper.FUELED_JETPACK_BURN_TIMER, (short) burnTime); + fluidHandler.drain(amount, true); + } + return true; + } + + private IFluidHandlerItem getFluidHandler(ItemStack stack) { + return stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + } + + @Override + public void addHudInformation(@NotNull ItemStack stack, @NotNull List hudText) { + IFluidHandlerItem fluidHandler = getFluidHandler(stack); + if (fluidHandler != null) { + IFluidTankProperties[] properties = fluidHandler.getTankProperties(); + if (properties[0] != null) { + FluidStack fuel = properties[0].getContents(); + int capacity = properties[0].getCapacity(); + if (fuel != null && fuel.amount != 0) { + String formatted = String.format("%.1f", fuel.amount * 100.0F / capacity); + hudText.add(I18n.format("metaarmor.hud.fuel_lvl", formatted + "%")); + } + } + } + // call super last so that fuel HUD info is in the same spot that energy would be + super.addHudInformation(stack, hudText); + } + + // todo move this to ItemGTFueledArmor if that ends up staying around + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip) { + IFluidHandlerItem fluidHandler = getFluidHandler(stack); + if (fluidHandler != null) { + IFluidTankProperties prop = fluidHandler.getTankProperties()[0]; + FluidStack fuel = prop.getContents(); + tooltip.add(I18n.format("metaitem.generic.fluid_container.tooltip", + fuel != null ? fuel.amount : 0, + prop.getCapacity(), + fuel != null ? fuel.getLocalizedName() : "")); + } + super.addInformation(stack, world, tooltip); + } + + @Override + public ICapabilityProvider createProvider(@NotNull ItemStack stack, @Nullable NBTTagCompound tag) { + return new GTFluidHandlerItemStack(stack, maxCapacity).setFilter(new FueledJetpackFilter()); + } + + private final class FueledJetpackFilter implements IFilter { + + @Override + public boolean test(@NotNull FluidStack fluidStack) { + return fuelBurnTimeFunc.apply(fluidStack) > 0; + } + + @Override + public int getPriority() { + return IFilter.whitelistLikePriority(); + } + } +} diff --git a/src/main/java/gregtech/common/items/armor/behavior/HeatReductionBehavior.java b/src/main/java/gregtech/common/items/armor/behavior/HeatReductionBehavior.java new file mode 100644 index 00000000000..3c4d5cf261a --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/behavior/HeatReductionBehavior.java @@ -0,0 +1,25 @@ +package gregtech.common.items.armor.behavior; + +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.IArmorBehavior; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import org.jetbrains.annotations.NotNull; + +// todo Nano was 0.75, quantum was 0.5 +// todo tooltip? +public class HeatReductionBehavior implements IArmorBehavior { + + private final float reductionFactor; + + public HeatReductionBehavior(float reductionFactor) { + this.reductionFactor = reductionFactor; + } + + @Override + public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull NBTTagCompound tag) { + tag.setFloat(ArmorHelper.HEAT_REDUCTION_KEY, reductionFactor); + } +} diff --git a/src/main/java/gregtech/common/items/armor/behavior/NightvisionBehavior.java b/src/main/java/gregtech/common/items/armor/behavior/NightvisionBehavior.java new file mode 100644 index 00000000000..db6e7a06ed9 --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/behavior/NightvisionBehavior.java @@ -0,0 +1,84 @@ +package gregtech.common.items.armor.behavior; + +import gregtech.api.capability.IElectricItem; +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.IElectricArmorBehavior; +import gregtech.api.util.input.KeyBind; + +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.MobEffects; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +// All MobEffects warn that they "might be null" for some reason, so suppress it +@SuppressWarnings("ConstantConditions") +public class NightvisionBehavior implements IElectricArmorBehavior { + + public static final NightvisionBehavior INSTANCE = new NightvisionBehavior(); + + protected NightvisionBehavior() {/**/} + + @Override + public Set getListenedKeys() { + return Collections.singleton(KeyBind.ARMOR_MODE_SWITCH); + } + + @Override + public void onKeyPressed(@NotNull ItemStack stack, @NotNull EntityPlayer player, KeyBind keyPressed) { + if (keyPressed == KeyBind.ARMOR_MODE_SWITCH) { + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(stack); + boolean wasEnabled = tag.getBoolean(ArmorHelper.NIGHT_VISION_KEY); + tag.setBoolean(ArmorHelper.NIGHT_VISION_KEY, !wasEnabled); + + if (wasEnabled) { + player.removePotionEffect(MobEffects.NIGHT_VISION); + player.sendStatusMessage(new TextComponentTranslation("metaarmor.message.nightvision.disabled"), true); + } else { + player.sendStatusMessage(new TextComponentTranslation("metaarmor.message.nightvision.enabled"), true); + } + } + } + + @Override + public void onArmorTick(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack, + @NotNull IElectricItem electricItem) { + if (world.isRemote) return; + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(stack); + if (tag.getBoolean(ArmorHelper.NIGHT_VISION_KEY) && electricItem.canUse(2)) { + electricItem.discharge(2, Integer.MAX_VALUE, true, false, false); + player.removePotionEffect(MobEffects.BLINDNESS); + player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, 999999, 0, true, false)); + } + } + + @Override + public void onArmorUnequip(@NotNull World world, @NotNull EntityPlayer player, @NotNull ItemStack stack) { + player.removePotionEffect(MobEffects.NIGHT_VISION); + } + + @Override + public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull NBTTagCompound tag) { + tag.setBoolean(ArmorHelper.NIGHT_VISION_KEY, false); // disabled by default + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip) { + NBTTagCompound tag = ArmorHelper.getBehaviorsTag(stack); + if (tag.getBoolean(ArmorHelper.NIGHT_VISION_KEY)) { + tooltip.add(I18n.format("metaarmor.message.nightvision.enabled")); + } else { + tooltip.add(I18n.format("metaarmor.message.nightvision.disabled")); + } + } +} diff --git a/src/main/java/gregtech/common/items/armor/behavior/StepAssistBehavior.java b/src/main/java/gregtech/common/items/armor/behavior/StepAssistBehavior.java new file mode 100644 index 00000000000..00fa06708cc --- /dev/null +++ b/src/main/java/gregtech/common/items/armor/behavior/StepAssistBehavior.java @@ -0,0 +1,31 @@ +package gregtech.common.items.armor.behavior; + +import gregtech.api.items.armoritem.ArmorHelper; +import gregtech.api.items.armoritem.IArmorBehavior; + +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class StepAssistBehavior implements IArmorBehavior { + + public static final StepAssistBehavior INSTANCE = new StepAssistBehavior(); + + protected StepAssistBehavior() {/**/} + + @Override + public void addBehaviorNBT(@NotNull ItemStack stack, @NotNull NBTTagCompound tag) { + tag.setBoolean(ArmorHelper.STEP_ASSIST_KEY, true); + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip) { + tooltip.add(I18n.format("metaarmor.tooltip.stepassist")); + } +} diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index aecbe907d48..726a8f37388 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -48,6 +48,7 @@ import gregtech.common.command.worldgen.CommandWorldgen; import gregtech.common.covers.CoverBehaviors; import gregtech.common.covers.filter.oreglob.impl.OreGlobParser; +import gregtech.common.items.ArmorItems; import gregtech.common.items.MetaItems; import gregtech.common.items.ToolItems; import gregtech.common.metatileentities.MetaTileEntities; @@ -61,7 +62,8 @@ import gregtech.core.network.packets.PacketClipboardNBTUpdate; import gregtech.core.network.packets.PacketClipboardUIWidgetUpdate; import gregtech.core.network.packets.PacketFluidVeinList; -import gregtech.core.network.packets.PacketKeysPressed; +import gregtech.core.network.packets.PacketKeyPressed; +import gregtech.core.network.packets.PacketKeysDown; import gregtech.core.network.packets.PacketNotifyCapeChange; import gregtech.core.network.packets.PacketPluginSynced; import gregtech.core.network.packets.PacketRecoverMTE; @@ -201,6 +203,8 @@ public void preInit(FMLPreInitializationEvent event) { MetaBlocks.init(); MetaItems.init(); ToolItems.init(); + ArmorItems.init(); + ArmorItems.initLegacyArmor(); GTFluidRegistration.INSTANCE.register(); /* Start CEu MetaTileEntity Registration */ @@ -240,7 +244,8 @@ public void registerPackets() { GregTechAPI.networkHandler.registerPacket(PacketClipboardUIWidgetUpdate.class); GregTechAPI.networkHandler.registerPacket(PacketPluginSynced.class); GregTechAPI.networkHandler.registerPacket(PacketRecoverMTE.class); - GregTechAPI.networkHandler.registerPacket(PacketKeysPressed.class); + GregTechAPI.networkHandler.registerPacket(PacketKeysDown.class); + GregTechAPI.networkHandler.registerPacket(PacketKeyPressed.class); GregTechAPI.networkHandler.registerPacket(PacketFluidVeinList.class); GregTechAPI.networkHandler.registerPacket(PacketNotifyCapeChange.class); GregTechAPI.networkHandler.registerPacket(PacketReloadShaders.class); diff --git a/src/main/java/gregtech/core/network/packets/PacketKeyPressed.java b/src/main/java/gregtech/core/network/packets/PacketKeyPressed.java new file mode 100644 index 00000000000..eadd5350cef --- /dev/null +++ b/src/main/java/gregtech/core/network/packets/PacketKeyPressed.java @@ -0,0 +1,47 @@ +package gregtech.core.network.packets; + +import gregtech.api.network.IPacket; +import gregtech.api.network.IServerExecutor; +import gregtech.api.util.input.KeyBind; + +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.network.PacketBuffer; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; + +public class PacketKeyPressed implements IPacket, IServerExecutor { + + private IntList pressedKeys; + + public PacketKeyPressed() {/**/} + + public PacketKeyPressed(IntList pressedKeys) { + this.pressedKeys = pressedKeys; + } + + @Override + public void encode(PacketBuffer buf) { + buf.writeVarInt(pressedKeys.size()); + for (int key : pressedKeys) { + buf.writeVarInt(key); + } + } + + @Override + public void decode(PacketBuffer buf) { + pressedKeys = new IntArrayList(); + int size = buf.readVarInt(); + for (int i = 0; i < size; i++) { + pressedKeys.add(buf.readVarInt()); + } + } + + @Override + public void executeServer(NetHandlerPlayServer handler) { + KeyBind[] keyBinds = KeyBind.VALUES; + for (int index : pressedKeys) { + keyBinds[index].onKeyPressed(handler.player); + } + } +} diff --git a/src/main/java/gregtech/core/network/packets/PacketKeysDown.java b/src/main/java/gregtech/core/network/packets/PacketKeysDown.java new file mode 100644 index 00000000000..9e6c72a9bc0 --- /dev/null +++ b/src/main/java/gregtech/core/network/packets/PacketKeysDown.java @@ -0,0 +1,49 @@ +package gregtech.core.network.packets; + +import gregtech.api.network.IPacket; +import gregtech.api.network.IServerExecutor; +import gregtech.api.util.input.KeyBind; + +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.network.PacketBuffer; + +import it.unimi.dsi.fastutil.ints.Int2BooleanMap; +import it.unimi.dsi.fastutil.ints.Int2BooleanOpenHashMap; + +public class PacketKeysDown implements IPacket, IServerExecutor { + + private Int2BooleanMap updateKeys; + + @SuppressWarnings("unused") + public PacketKeysDown() {/**/} + + public PacketKeysDown(Int2BooleanMap updateKeys) { + this.updateKeys = updateKeys; + } + + @Override + public void encode(PacketBuffer buf) { + buf.writeVarInt(updateKeys.size()); + for (var entry : updateKeys.int2BooleanEntrySet()) { + buf.writeVarInt(entry.getIntKey()); + buf.writeBoolean(entry.getBooleanValue()); + } + } + + @Override + public void decode(PacketBuffer buf) { + this.updateKeys = new Int2BooleanOpenHashMap(); + int size = buf.readVarInt(); + for (int i = 0; i < size; i++) { + updateKeys.put(buf.readVarInt(), buf.readBoolean()); + } + } + + @Override + public void executeServer(NetHandlerPlayServer handler) { + KeyBind[] keybinds = KeyBind.VALUES; + for (var entry : updateKeys.int2BooleanEntrySet()) { + keybinds[entry.getIntKey()].updateKeyDown(entry.getBooleanValue(), handler.player); + } + } +} diff --git a/src/main/java/gregtech/core/network/packets/PacketKeysPressed.java b/src/main/java/gregtech/core/network/packets/PacketKeysPressed.java deleted file mode 100644 index 8b5d4198f91..00000000000 --- a/src/main/java/gregtech/core/network/packets/PacketKeysPressed.java +++ /dev/null @@ -1,57 +0,0 @@ -package gregtech.core.network.packets; - -import gregtech.api.network.IPacket; -import gregtech.api.network.IServerExecutor; -import gregtech.api.util.input.KeyBind; - -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.network.PacketBuffer; - -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; - -public class PacketKeysPressed implements IPacket, IServerExecutor { - - private Object updateKeys; - - @SuppressWarnings("unused") - public PacketKeysPressed() {} - - public PacketKeysPressed(List updateKeys) { - this.updateKeys = updateKeys; - } - - @Override - public void encode(PacketBuffer buf) { - List updateKeys = (List) this.updateKeys; - buf.writeVarInt(updateKeys.size()); - for (KeyBind keyBind : updateKeys) { - buf.writeVarInt(keyBind.ordinal()); - buf.writeBoolean(keyBind.isPressed()); - buf.writeBoolean(keyBind.isKeyDown()); - } - } - - @Override - public void decode(PacketBuffer buf) { - this.updateKeys = new Pair[KeyBind.VALUES.length]; - Pair[] updateKeys = (Pair[]) this.updateKeys; - int size = buf.readVarInt(); - for (int i = 0; i < size; i++) { - updateKeys[buf.readVarInt()] = Pair.of(buf.readBoolean(), buf.readBoolean()); - } - } - - @Override - public void executeServer(NetHandlerPlayServer handler) { - KeyBind[] keybinds = KeyBind.VALUES; - Pair[] updateKeys = (Pair[]) this.updateKeys; - for (int i = 0; i < updateKeys.length; i++) { - Pair pair = updateKeys[i]; - if (pair != null) { - keybinds[i].update(pair.getLeft(), pair.getRight(), handler.player); - } - } - } -} diff --git a/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java index 8b18ba7a811..a21df46ec48 100644 --- a/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java +++ b/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java @@ -14,6 +14,7 @@ import gregtech.common.blocks.BlockGlassCasing; import gregtech.common.blocks.MetaBlocks; import gregtech.common.crafting.FacadeRecipe; +import gregtech.common.items.ArmorItems; import gregtech.common.items.MetaItems; import gregtech.loaders.recipe.handlers.ToolRecipeHandler; @@ -299,48 +300,47 @@ private static void loadCraftingRecipes() { /////////////////////////////////////////////////// // Armors // /////////////////////////////////////////////////// - ModHandler.addShapedRecipe("nightvision_goggles", MetaItems.NIGHTVISION_GOGGLES.getStackForm(), "CSC", "RBR", + ModHandler.addShapedRecipe("powderbarrel", new ItemStack(MetaBlocks.POWDERBARREL), "PSP", "GGG", "PGP", + 'P', new UnificationEntry(OrePrefix.plate, Wood), + 'S', new ItemStack(Items.STRING), + 'G', new UnificationEntry(OrePrefix.dust, Gunpowder)); + + ModHandler.addShapedRecipe("nightvision_goggles", ArmorItems.NIGHTVISION_GOGGLES.getStack(), "CSC", "RBR", "LdL", 'C', new UnificationEntry(OrePrefix.circuit, Tier.ULV), 'S', new UnificationEntry(OrePrefix.screw, Steel), 'R', new UnificationEntry(OrePrefix.ring, Rubber), 'B', MetaItems.BATTERY_LV_SODIUM, 'L', new UnificationEntry(OrePrefix.lens, Glass)); - ModHandler.addShapedRecipe("fluid_jetpack", MetaItems.SEMIFLUID_JETPACK.getStackForm(), "xCw", "SUS", "RIR", - 'C', new UnificationEntry(OrePrefix.circuit, Tier.LV), 'S', - MetaItems.FLUID_CELL_LARGE_STEEL.getStackForm(), 'U', MetaItems.ELECTRIC_PUMP_LV.getStackForm(), 'R', - new UnificationEntry(OrePrefix.rotor, Lead), 'I', + ModHandler.addShapedRecipe("fueled_jetpack", ArmorItems.FUELED_JETPACK.getStack(), "xCw", "SUS", "RIR", 'C', + new UnificationEntry(OrePrefix.circuit, Tier.LV), 'S', MetaItems.FLUID_CELL_LARGE_STEEL.getStackForm(), + 'U', MetaItems.ELECTRIC_PUMP_LV.getStackForm(), 'R', new UnificationEntry(OrePrefix.rotor, Lead), 'I', new UnificationEntry(OrePrefix.pipeSmallFluid, Potin)); - ModHandler.addShapedRecipe("electric_jetpack", MetaItems.ELECTRIC_JETPACK.getStackForm(), "xCd", "TBT", "I I", - 'C', new UnificationEntry(OrePrefix.circuit, Tier.MV), 'T', MetaItems.POWER_THRUSTER.getStackForm(), - 'B', MetaItems.BATTERY_MV_LITHIUM.getStackForm(), 'I', + ModHandler.addShapedRecipe("electric_jetpack", ArmorItems.ELECTRIC_JETPACK.getStack(), "xCd", "TBT", "I I", 'C', + new UnificationEntry(OrePrefix.circuit, Tier.MV), 'T', MetaItems.POWER_THRUSTER.getStackForm(), 'B', + MetaItems.BATTERY_MV_LITHIUM.getStackForm(), 'I', new UnificationEntry(OrePrefix.wireGtDouble, AnnealedCopper)); - ModHandler.addShapedRecipe("electric_jetpack_advanced", MetaItems.ELECTRIC_JETPACK_ADVANCED.getStackForm(), - "xJd", "TBT", "WCW", 'J', MetaItems.ELECTRIC_JETPACK.getStackForm(), 'T', + ModHandler.addShapedRecipe("electric_jetpack_advanced", ArmorItems.ADVANCED_ELECTRIC_JETPACK.getStack(), "xJd", + "TBT", "WCW", 'J', ArmorItems.ELECTRIC_JETPACK.getStack(), 'T', MetaItems.POWER_THRUSTER_ADVANCED.getStackForm(), 'B', ENERGIUM_CRYSTAL.getStackForm(), 'W', new UnificationEntry(OrePrefix.wireGtQuadruple, Gold), 'C', new UnificationEntry(OrePrefix.circuit, Tier.HV)); - ModHandler.addShapedRecipe("nano_helmet", MetaItems.NANO_HELMET.getStackForm(), "PPP", "PNP", "xEd", 'P', - MetaItems.CARBON_FIBER_PLATE.getStackForm(), 'N', MetaItems.NIGHTVISION_GOGGLES.getStackForm(), 'E', + ModHandler.addShapedRecipe("nano_helmet", ArmorItems.NANO_HELMET.getStack(), "PPP", "PNP", "xEd", 'P', + MetaItems.CARBON_FIBER_PLATE.getStackForm(), 'N', ArmorItems.NIGHTVISION_GOGGLES.getStack(), 'E', MetaItems.ENERGIUM_CRYSTAL.getStackForm()); - ModHandler.addShapedRecipe("nano_chestplate", MetaItems.NANO_CHESTPLATE.getStackForm(), "PEP", "PPP", "PPP", - 'P', MetaItems.CARBON_FIBER_PLATE.getStackForm(), 'E', MetaItems.ENERGIUM_CRYSTAL.getStackForm()); - ModHandler.addShapedRecipe("nano_leggings", MetaItems.NANO_LEGGINGS.getStackForm(), "PPP", "PEP", "PxP", 'P', + ModHandler.addShapedRecipe("nano_chestplate", ArmorItems.NANO_CHESTPLATE.getStack(), "PEP", "PPP", "PPP", 'P', + MetaItems.CARBON_FIBER_PLATE.getStackForm(), 'E', MetaItems.ENERGIUM_CRYSTAL.getStackForm()); + ModHandler.addShapedRecipe("nano_leggings", ArmorItems.NANO_LEGGINGS.getStack(), "PPP", "PEP", "PxP", 'P', MetaItems.CARBON_FIBER_PLATE.getStackForm(), 'E', MetaItems.ENERGIUM_CRYSTAL.getStackForm()); - ModHandler.addShapedRecipe("nano_boots", MetaItems.NANO_BOOTS.getStackForm(), "PxP", "PEP", 'P', + ModHandler.addShapedRecipe("nano_boots", ArmorItems.NANO_BOOTS.getStack(), "PxP", "PEP", 'P', MetaItems.CARBON_FIBER_PLATE.getStackForm(), 'E', MetaItems.ENERGIUM_CRYSTAL.getStackForm()); ModHandler.addShapedRecipe("nano_chestplate_advanced", MetaItems.NANO_CHESTPLATE_ADVANCED.getStackForm(), "xJd", - "PNP", "WCW", 'J', MetaItems.ELECTRIC_JETPACK_ADVANCED.getStackForm(), 'P', - MetaItems.LOW_POWER_INTEGRATED_CIRCUIT.getStackForm(), 'N', MetaItems.NANO_CHESTPLATE.getStackForm(), - 'W', new UnificationEntry(OrePrefix.wireGtQuadruple, Platinum), 'C', + "PNP", "WCW", 'J', ArmorItems.ADVANCED_ELECTRIC_JETPACK.getStack(), 'P', + MetaItems.LOW_POWER_INTEGRATED_CIRCUIT.getStackForm(), 'N', ArmorItems.NANO_CHESTPLATE.getStack(), 'W', + new UnificationEntry(OrePrefix.wireGtQuadruple, Platinum), 'C', new UnificationEntry(OrePrefix.circuit, Tier.IV)); ModHandler.addShapedRecipe("gravitation_engine", MetaItems.GRAVITATION_ENGINE.getStackForm(), "ESE", "POP", "ESE", 'E', MetaItems.EMITTER_LuV.getStackForm(), 'S', new UnificationEntry(OrePrefix.wireGtQuadruple, Osmium), 'P', new UnificationEntry(OrePrefix.plateDouble, Iridium), 'O', MetaItems.ENERGY_LAPOTRONIC_ORB.getStackForm()); - - ModHandler.addShapedRecipe("powderbarrel", new ItemStack(MetaBlocks.POWDERBARREL), "PSP", "GGG", "PGP", - 'P', new UnificationEntry(OrePrefix.plate, Wood), - 'S', new ItemStack(Items.STRING), - 'G', new UnificationEntry(OrePrefix.dust, Gunpowder)); } private static void registerFacadeRecipe(Material material, int facadeAmount) { diff --git a/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java b/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java index 13606711c42..37326354113 100644 --- a/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java +++ b/src/main/java/gregtech/loaders/recipe/MachineRecipeLoader.java @@ -17,12 +17,19 @@ import gregtech.api.unification.stack.UnificationEntry; import gregtech.api.util.Mods; import gregtech.common.ConfigHolder; -import gregtech.common.blocks.*; +import gregtech.common.blocks.BlockAsphalt; +import gregtech.common.blocks.BlockCleanroomCasing; +import gregtech.common.blocks.BlockFusionCasing; +import gregtech.common.blocks.BlockGlassCasing; +import gregtech.common.blocks.BlockLamp; import gregtech.common.blocks.BlockMachineCasing.MachineCasingType; import gregtech.common.blocks.BlockMetalCasing.MetalCasingType; import gregtech.common.blocks.BlockTurbineCasing.TurbineCasingType; import gregtech.common.blocks.BlockWireCoil.CoilType; +import gregtech.common.blocks.MetaBlocks; +import gregtech.common.blocks.StoneVariantBlock; import gregtech.common.blocks.StoneVariantBlock.StoneVariant; +import gregtech.common.items.ArmorItems; import gregtech.common.items.MetaItems; import gregtech.common.metatileentities.MetaTileEntities; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumChest; @@ -1397,8 +1404,8 @@ private static void registerNBTRemoval() { ORE_DICTIONARY_FILTER.getStackForm(), ORE_DICTIONARY_FILTER); // Jetpacks - ModHandler.addShapelessRecipe("fluid_jetpack_clear", SEMIFLUID_JETPACK.getStackForm(), - SEMIFLUID_JETPACK.getStackForm()); + ModHandler.addShapelessRecipe("fueled_jetpack_nbt", ArmorItems.FUELED_JETPACK.getStack(), + ArmorItems.FUELED_JETPACK.getStack()); // ClipBoard ModHandler.addShapelessNBTClearingRecipe("clipboard_nbt", CLIPBOARD.getStackForm(), CLIPBOARD.getStackForm()); diff --git a/src/main/java/gregtech/mixins/forge/SpecialArmorPropertiesMixin.java b/src/main/java/gregtech/mixins/forge/SpecialArmorPropertiesMixin.java deleted file mode 100644 index 668335c9b4c..00000000000 --- a/src/main/java/gregtech/mixins/forge/SpecialArmorPropertiesMixin.java +++ /dev/null @@ -1,38 +0,0 @@ -package gregtech.mixins.forge; - -import gregtech.api.items.armor.IArmorItem; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.NonNullList; -import net.minecraftforge.common.ISpecialArmor; - -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(ISpecialArmor.ArmorProperties.class) -public class SpecialArmorPropertiesMixin { - - @ModifyExpressionValue(method = "applyArmor", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/util/CombatRules;getDamageAfterAbsorb(FFF)F"), - remap = false) - private static float adjustArmorAbsorption(float originalDamage, EntityLivingBase entity, - NonNullList inventory, - DamageSource damageSource, double damage) { - double armorDamage = Math.max(1.0F, damage / 4.0F); - for (int i = 0; i < inventory.size(); i++) { - ItemStack itemStack = inventory.get(i); - if (itemStack.getItem() instanceof IArmorItem) { - ((IArmorItem) itemStack.getItem()).damageArmor(entity, itemStack, damageSource, (int) armorDamage, i); - if (inventory.get(i).getCount() == 0) { - inventory.set(i, ItemStack.EMPTY); - } - } - } - - return originalDamage; - } -} diff --git a/src/main/java/gregtech/mixins/minecraft/LayerArmorBaseMixin.java b/src/main/java/gregtech/mixins/minecraft/LayerArmorBaseMixin.java index 7363d82d575..42832a53ad0 100644 --- a/src/main/java/gregtech/mixins/minecraft/LayerArmorBaseMixin.java +++ b/src/main/java/gregtech/mixins/minecraft/LayerArmorBaseMixin.java @@ -1,6 +1,6 @@ package gregtech.mixins.minecraft; -import gregtech.api.items.armor.IArmorItem; +import gregtech.api.items.armoritem.IGTArmor; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBiped; @@ -19,6 +19,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LayerArmorBase.class) +@Deprecated public class LayerArmorBaseMixin { @Inject(method = "renderArmorLayer", at = @At("TAIL")) @@ -27,7 +28,7 @@ public void renderGTArmor(EntityLivingBase entityLivingBaseIn, float limbSwing, EntityEquipmentSlot slotIn, CallbackInfo ci) { ItemStack itemStack = entityLivingBaseIn.getItemStackFromSlot(slotIn); - if ((itemStack.getItem() instanceof IArmorItem armorItem && + if ((itemStack.getItem() instanceof IGTArmor armorItem && itemStack.getItem().getEquipmentSlot(itemStack) == slotIn)) { @SuppressWarnings("unchecked") LayerArmorBase layer = (LayerArmorBase) (Object) this; @@ -43,18 +44,21 @@ public void renderGTArmor(EntityLivingBase entityLivingBaseIn, float limbSwing, GlStateManager.enableBlend(); GlStateManager.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - int layers = armorItem.getArmorLayersAmount(itemStack); - for (int layerIndex = 0; layerIndex < layers; layerIndex++) { - int i = armorItem.getArmorLayerColor(itemStack, layerIndex); - float f = (float) (i >> 16 & 255) / 255.0F; - float f1 = (float) (i >> 8 & 255) / 255.0F; - float f2 = (float) (i & 255) / 255.0F; - GlStateManager.color(f, f1, f2, 1.0f); - String type = layerIndex == 0 ? null : "layer_" + layerIndex; - layer.renderer.bindTexture(gregTechCEu$getArmorTexture(entityLivingBaseIn, itemStack, slotIn, type)); - armorModel.render(entityLivingBaseIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, - scale); - } + // TODO, old implementation, still needed with new system? + /* + * int layers = armorItem.getArmorLayersAmount(itemStack); + * for (int layerIndex = 0; layerIndex < layers; layerIndex++) { + * int i = armorItem.getArmorLayerColor(itemStack, layerIndex); + * float f = (float) (i >> 16 & 255) / 255.0F; + * float f1 = (float) (i >> 8 & 255) / 255.0F; + * float f2 = (float) (i & 255) / 255.0F; + * GlStateManager.color(f, f1, f2, 1.0f); + * String type = layerIndex == 0 ? null : "layer_" + layerIndex; + * layer.renderer.bindTexture(gregTechCEu$getArmorTexture(entityLivingBaseIn, itemStack, slotIn, type)); + * armorModel.render(entityLivingBaseIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, + * scale); + * } + */ if (itemStack.hasEffect()) { LayerArmorBase.renderEnchantedGlint(layer.renderer, entityLivingBaseIn, armorModel, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); diff --git a/src/main/java/gregtech/mixins/minecraft/LayerCustomHeadMixin.java b/src/main/java/gregtech/mixins/minecraft/LayerCustomHeadMixin.java index d6f69a7d3bb..29f6bf69fc0 100644 --- a/src/main/java/gregtech/mixins/minecraft/LayerCustomHeadMixin.java +++ b/src/main/java/gregtech/mixins/minecraft/LayerCustomHeadMixin.java @@ -1,6 +1,6 @@ package gregtech.mixins.minecraft; -import gregtech.api.items.armor.IArmorItem; +import gregtech.api.items.armoritem.IGTArmor; import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; @@ -16,6 +16,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(LayerCustomHead.class) +@Deprecated public class LayerCustomHeadMixin { @WrapOperation(method = "doRenderLayer", @@ -32,7 +33,7 @@ public void shouldNotRenderHead(ItemRenderer instance, EntityLivingBase entityli @Unique private static boolean gregTechCEu$shouldNotRenderHeadItem(EntityLivingBase entityLivingBase) { ItemStack itemStack = entityLivingBase.getItemStackFromSlot(EntityEquipmentSlot.HEAD); - return (itemStack.getItem() instanceof IArmorItem && + return (itemStack.getItem() instanceof IGTArmor && itemStack.getItem().getEquipmentSlot(itemStack) == EntityEquipmentSlot.HEAD); } } diff --git a/src/main/resources/assets/gregtech/blockstates/metaitems/fueled_jetpack.json b/src/main/resources/assets/gregtech/blockstates/metaitems/fueled_jetpack.json new file mode 100644 index 00000000000..3734aa63b1f --- /dev/null +++ b/src/main/resources/assets/gregtech/blockstates/metaitems/fueled_jetpack.json @@ -0,0 +1,14 @@ +{ + "forge_marker": 1, + "variants": { + "inventory": { + "model": "forge:forgebucket", + "textures": { + "base": "gregtech:items/armors/fueled_jetpack_item_base", + "fluid": "gregtech:items/armors/fueled_jetpack_item_overlay", + "cover": "gregtech:items/armors/fueled_jetpack_item_base" + }, + "transform": "forge:default-item" + } + } +} diff --git a/src/main/resources/assets/gregtech/blockstates/metaitems/liquid_fuel_jetpack.json b/src/main/resources/assets/gregtech/blockstates/metaitems/liquid_fuel_jetpack.json index 0bb8886d305..3734aa63b1f 100644 --- a/src/main/resources/assets/gregtech/blockstates/metaitems/liquid_fuel_jetpack.json +++ b/src/main/resources/assets/gregtech/blockstates/metaitems/liquid_fuel_jetpack.json @@ -1,14 +1,14 @@ -{ - "forge_marker": 1, - "variants": { - "inventory": { - "model": "forge:forgebucket", - "textures": { - "base": "gregtech:items/metaitems/liquid_fuel_jetpack/base", - "fluid": "gregtech:items/metaitems/liquid_fuel_jetpack/overlay", - "cover": "gregtech:items/metaitems/liquid_fuel_jetpack/base" - }, - "transform": "forge:default-item" - } - } -} \ No newline at end of file +{ + "forge_marker": 1, + "variants": { + "inventory": { + "model": "forge:forgebucket", + "textures": { + "base": "gregtech:items/armors/fueled_jetpack_item_base", + "fluid": "gregtech:items/armors/fueled_jetpack_item_overlay", + "cover": "gregtech:items/armors/fueled_jetpack_item_base" + }, + "transform": "forge:default-item" + } + } +} diff --git a/src/main/resources/assets/gregtech/models/item/armors/advanced_electric_jetpack.json b/src/main/resources/assets/gregtech/models/item/armors/advanced_electric_jetpack.json new file mode 100644 index 00000000000..a958e2a4d2d --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/armors/advanced_electric_jetpack.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/advanced_electric_jetpack_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/armors/electric_jetpack.json b/src/main/resources/assets/gregtech/models/item/armors/electric_jetpack.json new file mode 100644 index 00000000000..db09ceba20e --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/armors/electric_jetpack.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/electric_jetpack_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/armors/nano_boots.json b/src/main/resources/assets/gregtech/models/item/armors/nano_boots.json new file mode 100644 index 00000000000..78082b982b9 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/armors/nano_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/nano_boots_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/armors/nano_chestplate.json b/src/main/resources/assets/gregtech/models/item/armors/nano_chestplate.json new file mode 100644 index 00000000000..b0e51acccbf --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/armors/nano_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/nano_chestplate_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/armors/nano_helmet.json b/src/main/resources/assets/gregtech/models/item/armors/nano_helmet.json new file mode 100644 index 00000000000..09ed3ac9c14 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/armors/nano_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/nano_helmet_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/armors/nano_leggings.json b/src/main/resources/assets/gregtech/models/item/armors/nano_leggings.json new file mode 100644 index 00000000000..e4e47de8747 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/armors/nano_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/nano_leggings_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/armors/nightvision_goggles.json b/src/main/resources/assets/gregtech/models/item/armors/nightvision_goggles.json new file mode 100644 index 00000000000..22ed5f71345 --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/armors/nightvision_goggles.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/nightvision_goggles_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/advanced_electric_jetpack.json b/src/main/resources/assets/gregtech/models/item/metaitems/advanced_electric_jetpack.json index 678e92893c0..a958e2a4d2d 100644 --- a/src/main/resources/assets/gregtech/models/item/metaitems/advanced_electric_jetpack.json +++ b/src/main/resources/assets/gregtech/models/item/metaitems/advanced_electric_jetpack.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "gregtech:items/metaitems/advanced_electric_jetpack" + "layer0": "gregtech:items/armors/advanced_electric_jetpack_item" } } diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack.json new file mode 100644 index 00000000000..db09ceba20e --- /dev/null +++ b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gregtech:items/armors/electric_jetpack_item" + } +} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/1.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/1.json deleted file mode 100644 index 6ba004805e3..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/1" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/2.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/2.json deleted file mode 100644 index 04e088f4000..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/2" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/3.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/3.json deleted file mode 100644 index a48465c33aa..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/3" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/4.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/4.json deleted file mode 100644 index c648761a6ed..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/4" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/5.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/5.json deleted file mode 100644 index 3ee3aa36fa8..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/5.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/5" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/6.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/6.json deleted file mode 100644 index 68d683ba1bc..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/6.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/6" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/7.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/7.json deleted file mode 100644 index 783351abf76..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/7.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/7" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/8.json b/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/8.json deleted file mode 100644 index 580429a9fc5..00000000000 --- a/src/main/resources/assets/gregtech/models/item/metaitems/electric_jetpack/8.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "gregtech:items/metaitems/electric_jetpack/8" - } -} diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/nightvision_goggles.json b/src/main/resources/assets/gregtech/models/item/metaitems/nightvision_goggles.json index 9a0f438eb6e..22ed5f71345 100644 --- a/src/main/resources/assets/gregtech/models/item/metaitems/nightvision_goggles.json +++ b/src/main/resources/assets/gregtech/models/item/metaitems/nightvision_goggles.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "gregtech:items/metaitems/nightvision_goggles" + "layer0": "gregtech:items/armors/nightvision_goggles_item" } } diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/nms.boots.json b/src/main/resources/assets/gregtech/models/item/metaitems/nms.boots.json index 13ce1fd00a5..78082b982b9 100644 --- a/src/main/resources/assets/gregtech/models/item/metaitems/nms.boots.json +++ b/src/main/resources/assets/gregtech/models/item/metaitems/nms.boots.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "gregtech:items/metaitems/nms.boots" + "layer0": "gregtech:items/armors/nano_boots_item" } } diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/nms.chestplate.json b/src/main/resources/assets/gregtech/models/item/metaitems/nms.chestplate.json index b1df3c537c3..b0e51acccbf 100644 --- a/src/main/resources/assets/gregtech/models/item/metaitems/nms.chestplate.json +++ b/src/main/resources/assets/gregtech/models/item/metaitems/nms.chestplate.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "gregtech:items/metaitems/nms.chestplate" + "layer0": "gregtech:items/armors/nano_chestplate_item" } } diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/nms.helmet.json b/src/main/resources/assets/gregtech/models/item/metaitems/nms.helmet.json index 68dc953dc08..09ed3ac9c14 100644 --- a/src/main/resources/assets/gregtech/models/item/metaitems/nms.helmet.json +++ b/src/main/resources/assets/gregtech/models/item/metaitems/nms.helmet.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "gregtech:items/metaitems/nms.helmet" + "layer0": "gregtech:items/armors/nano_helmet_item" } } diff --git a/src/main/resources/assets/gregtech/models/item/metaitems/nms.leggings.json b/src/main/resources/assets/gregtech/models/item/metaitems/nms.leggings.json index fc796d867f9..e4e47de8747 100644 --- a/src/main/resources/assets/gregtech/models/item/metaitems/nms.leggings.json +++ b/src/main/resources/assets/gregtech/models/item/metaitems/nms.leggings.json @@ -1,6 +1,6 @@ { "parent": "item/generated", "textures": { - "layer0": "gregtech:items/metaitems/nms.leggings" + "layer0": "gregtech:items/armors/nano_leggings_item" } } diff --git a/src/main/resources/assets/gregtech/textures/armor/nano_muscule_suite_1.png b/src/main/resources/assets/gregtech/textures/armor/nano_muscule_suite_1.png deleted file mode 100644 index 283b916f81c..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/armor/nano_muscule_suite_1.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/armor/advanced_jetpack.png b/src/main/resources/assets/gregtech/textures/items/armors/advanced_electric_jetpack.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/armor/advanced_jetpack.png rename to src/main/resources/assets/gregtech/textures/items/armors/advanced_electric_jetpack.png diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/advanced_electric_jetpack.png b/src/main/resources/assets/gregtech/textures/items/armors/advanced_electric_jetpack_item.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/advanced_electric_jetpack.png rename to src/main/resources/assets/gregtech/textures/items/armors/advanced_electric_jetpack_item.png diff --git a/src/main/resources/assets/gregtech/textures/armor/jetpack.png b/src/main/resources/assets/gregtech/textures/items/armors/electric_jetpack.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/armor/jetpack.png rename to src/main/resources/assets/gregtech/textures/items/armors/electric_jetpack.png diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/8.png b/src/main/resources/assets/gregtech/textures/items/armors/electric_jetpack_item.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/8.png rename to src/main/resources/assets/gregtech/textures/items/armors/electric_jetpack_item.png diff --git a/src/main/resources/assets/gregtech/textures/armor/liquid_fuel_jetpack.png b/src/main/resources/assets/gregtech/textures/items/armors/fueled_jetpack.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/armor/liquid_fuel_jetpack.png rename to src/main/resources/assets/gregtech/textures/items/armors/fueled_jetpack.png diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/liquid_fuel_jetpack/base.png b/src/main/resources/assets/gregtech/textures/items/armors/fueled_jetpack_item_base.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/liquid_fuel_jetpack/base.png rename to src/main/resources/assets/gregtech/textures/items/armors/fueled_jetpack_item_base.png diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/liquid_fuel_jetpack/overlay.png b/src/main/resources/assets/gregtech/textures/items/armors/fueled_jetpack_item_overlay.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/liquid_fuel_jetpack/overlay.png rename to src/main/resources/assets/gregtech/textures/items/armors/fueled_jetpack_item_overlay.png diff --git a/src/main/resources/assets/gregtech/textures/items/armors/nano_boots.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_boots.png new file mode 100644 index 00000000000..13f1c5d1b77 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/items/armors/nano_boots.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/nms.boots.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_boots_item.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/nms.boots.png rename to src/main/resources/assets/gregtech/textures/items/armors/nano_boots_item.png diff --git a/src/main/resources/assets/gregtech/textures/items/armors/nano_chestplate.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_chestplate.png new file mode 100644 index 00000000000..516d04a10bd Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/items/armors/nano_chestplate.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/nms.chestplate.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_chestplate_item.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/nms.chestplate.png rename to src/main/resources/assets/gregtech/textures/items/armors/nano_chestplate_item.png diff --git a/src/main/resources/assets/gregtech/textures/items/armors/nano_helmet.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_helmet.png new file mode 100644 index 00000000000..ec965ca315a Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/items/armors/nano_helmet.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/nms.helmet.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_helmet_item.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/nms.helmet.png rename to src/main/resources/assets/gregtech/textures/items/armors/nano_helmet_item.png diff --git a/src/main/resources/assets/gregtech/textures/armor/nano_muscule_suite_2.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_leggings.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/armor/nano_muscule_suite_2.png rename to src/main/resources/assets/gregtech/textures/items/armors/nano_leggings.png diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/nms.leggings.png b/src/main/resources/assets/gregtech/textures/items/armors/nano_leggings_item.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/nms.leggings.png rename to src/main/resources/assets/gregtech/textures/items/armors/nano_leggings_item.png diff --git a/src/main/resources/assets/gregtech/textures/armor/nightvision_goggles.png b/src/main/resources/assets/gregtech/textures/items/armors/nightvision_goggles.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/armor/nightvision_goggles.png rename to src/main/resources/assets/gregtech/textures/items/armors/nightvision_goggles.png diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/nightvision_goggles.png b/src/main/resources/assets/gregtech/textures/items/armors/nightvision_goggles_item.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/items/metaitems/nightvision_goggles.png rename to src/main/resources/assets/gregtech/textures/items/armors/nightvision_goggles_item.png diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/1.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/1.png deleted file mode 100644 index 463f9c28f56..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/1.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/2.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/2.png deleted file mode 100644 index cbc900c6451..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/2.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/3.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/3.png deleted file mode 100644 index 0228c230ac5..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/3.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/4.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/4.png deleted file mode 100644 index 6fc7edd974a..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/4.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/5.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/5.png deleted file mode 100644 index c5462c966bc..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/5.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/6.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/6.png deleted file mode 100644 index 5d9b3bf9918..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/6.png and /dev/null differ diff --git a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/7.png b/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/7.png deleted file mode 100644 index e398fdd9373..00000000000 Binary files a/src/main/resources/assets/gregtech/textures/items/metaitems/electric_jetpack/7.png and /dev/null differ diff --git a/src/main/resources/mixins.gregtech.forge.json b/src/main/resources/mixins.gregtech.forge.json index 81605c0c9dc..545bb5d5ce1 100644 --- a/src/main/resources/mixins.gregtech.forge.json +++ b/src/main/resources/mixins.gregtech.forge.json @@ -5,8 +5,7 @@ "minVersion": "0.8", "compatibilityLevel": "JAVA_8", "mixins" : [ - "ModelLoaderRegistryMixin", - "SpecialArmorPropertiesMixin" + "ModelLoaderRegistryMixin" ], "client": [], "server": []