mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-27 07:27:15 +01:00
Tag me back
- Backtanks now keep track of item capability data in their placed block #6186 - Backtanks no longer ask for an unobtainable item when placed with a Schematicannon
This commit is contained in:
parent
54f760feb1
commit
15f426d9c6
6 changed files with 99 additions and 104 deletions
|
@ -3329,7 +3329,7 @@ c2b075008849e152f20e8da946e89c9722325df6 data/create/loot_tables/blocks/content_
|
|||
69b4b25d7d271458177fbbaeba2c797daccc38a2 data/create/loot_tables/blocks/contraption_controls.json
|
||||
28856dc862efc6bcc421d035d26386740458f868 data/create/loot_tables/blocks/controller_rail.json
|
||||
2c2785e39e1891dff2c50cba93e814b56d935154 data/create/loot_tables/blocks/controls.json
|
||||
830949a5dc64982392db2c1f651d2a9d0ff659a8 data/create/loot_tables/blocks/copper_backtank.json
|
||||
ac15351000c44cf0924e8e3b3c6d92e3d54bb084 data/create/loot_tables/blocks/copper_backtank.json
|
||||
6697e619d5c6dcb81aad4f5c88ba319d13665b35 data/create/loot_tables/blocks/copper_bars.json
|
||||
8010db6b2427536c74312c85425b3ba83abc363c data/create/loot_tables/blocks/copper_casing.json
|
||||
ea5fb942c8dfb792daac538e09d286ac120aa199 data/create/loot_tables/blocks/copper_door.json
|
||||
|
@ -3590,7 +3590,7 @@ afdff197c9d1a6940e988c00435135f9705fd0e5 data/create/loot_tables/blocks/metal_gi
|
|||
b83a90fbe83906b171fc0de6bdc2d9aa3a8c542e data/create/loot_tables/blocks/millstone.json
|
||||
5c1df8443043b3fe3b665dba348e2ff188bcbe31 data/create/loot_tables/blocks/minecart_anchor.json
|
||||
1e73d28fdd2e54910074aeadbe5617425a8ae656 data/create/loot_tables/blocks/mysterious_cuckoo_clock.json
|
||||
9be92bab82bc1e83533f1d4679b09bd0513b07eb data/create/loot_tables/blocks/netherite_backtank.json
|
||||
188de41337119f55117c48eeb8d31cdf12cebd76 data/create/loot_tables/blocks/netherite_backtank.json
|
||||
2e21a06c0d671e543bffecb0b67d97b51fa83ddc data/create/loot_tables/blocks/nixie_tube.json
|
||||
f6b4095a518a01081f3663d7268d67063bdb44ee data/create/loot_tables/blocks/nozzle.json
|
||||
d378be8f13fc7ed625813eae3a50b68e8706a297 data/create/loot_tables/blocks/oak_window.json
|
||||
|
|
|
@ -13,16 +13,12 @@
|
|||
"source": "block_entity",
|
||||
"ops": [
|
||||
{
|
||||
"source": "FullNBT",
|
||||
"source": "VanillaTag",
|
||||
"target": "{}",
|
||||
"op": "merge"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "minecraft:copy_name",
|
||||
"source": "block_entity"
|
||||
},
|
||||
{
|
||||
"function": "minecraft:copy_nbt",
|
||||
"source": "block_entity",
|
||||
|
@ -33,17 +29,6 @@
|
|||
"op": "replace"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "minecraft:copy_nbt",
|
||||
"source": "block_entity",
|
||||
"ops": [
|
||||
{
|
||||
"source": "Enchantments",
|
||||
"target": "Enchantments",
|
||||
"op": "replace"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "create:copper_backtank"
|
||||
|
|
|
@ -13,16 +13,12 @@
|
|||
"source": "block_entity",
|
||||
"ops": [
|
||||
{
|
||||
"source": "FullNBT",
|
||||
"source": "VanillaTag",
|
||||
"target": "{}",
|
||||
"op": "merge"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "minecraft:copy_name",
|
||||
"source": "block_entity"
|
||||
},
|
||||
{
|
||||
"function": "minecraft:copy_nbt",
|
||||
"source": "block_entity",
|
||||
|
@ -33,17 +29,6 @@
|
|||
"op": "replace"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "minecraft:copy_nbt",
|
||||
"source": "block_entity",
|
||||
"ops": [
|
||||
{
|
||||
"source": "Enchantments",
|
||||
"target": "Enchantments",
|
||||
"op": "replace"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "create:netherite_backtank"
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
package com.simibubi.create.content.equipment.armor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.simibubi.create.AllBlockEntityTypes;
|
||||
import com.simibubi.create.AllEnchantments;
|
||||
import com.simibubi.create.AllShapes;
|
||||
import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock;
|
||||
import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement;
|
||||
import com.simibubi.create.content.schematics.requirement.ItemRequirement;
|
||||
import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType;
|
||||
import com.simibubi.create.foundation.block.IBE;
|
||||
|
||||
import net.minecraft.core.BlockPos;
|
||||
|
@ -13,8 +17,6 @@ import net.minecraft.core.Direction;
|
|||
import net.minecraft.core.Direction.Axis;
|
||||
import net.minecraft.core.NonNullList;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.ListTag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.sounds.SoundSource;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
|
@ -34,6 +36,7 @@ import net.minecraft.world.level.LevelAccessor;
|
|||
import net.minecraft.world.level.LevelReader;
|
||||
import net.minecraft.world.level.block.Block;
|
||||
import net.minecraft.world.level.block.SimpleWaterloggedBlock;
|
||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.block.state.StateDefinition.Builder;
|
||||
|
@ -41,13 +44,14 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
|||
import net.minecraft.world.level.material.FluidState;
|
||||
import net.minecraft.world.level.material.Fluids;
|
||||
import net.minecraft.world.level.pathfinder.PathComputationType;
|
||||
import net.minecraft.world.level.storage.loot.LootContext;
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
|
||||
public class BacktankBlock extends HorizontalKineticBlock
|
||||
implements IBE<BacktankBlockEntity>, SimpleWaterloggedBlock {
|
||||
public class BacktankBlock extends HorizontalKineticBlock implements IBE<BacktankBlockEntity>, SimpleWaterloggedBlock, ISpecialBlockItemRequirement {
|
||||
|
||||
public BacktankBlock(Properties properties) {
|
||||
super(properties);
|
||||
|
@ -81,8 +85,8 @@ public class BacktankBlock extends HorizontalKineticBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState,
|
||||
LevelAccessor world, BlockPos pos, BlockPos neighbourPos) {
|
||||
public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, LevelAccessor world,
|
||||
BlockPos pos, BlockPos neighbourPos) {
|
||||
if (state.getValue(BlockStateProperties.WATERLOGGED))
|
||||
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world));
|
||||
return state;
|
||||
|
@ -114,17 +118,46 @@ public class BacktankBlock extends HorizontalKineticBlock
|
|||
if (stack == null)
|
||||
return;
|
||||
withBlockEntityDo(worldIn, pos, be -> {
|
||||
be.setCapacityEnchantLevel(EnchantmentHelper.getItemEnchantmentLevel(AllEnchantments.CAPACITY.get(), stack));
|
||||
be.setAirLevel(stack.getOrCreateTag()
|
||||
.getInt("Air"));
|
||||
if (stack.isEnchanted())
|
||||
be.setEnchantmentTag(stack.getEnchantmentTags());
|
||||
be.setCapacityEnchantLevel(
|
||||
EnchantmentHelper.getItemEnchantmentLevel(AllEnchantments.CAPACITY.get(), stack));
|
||||
CompoundTag vanillaTag = stack.getOrCreateTag();
|
||||
be.setAirLevel(vanillaTag.getInt("Air"));
|
||||
if (stack.hasCustomHoverName())
|
||||
be.setCustomName(stack.getHoverName());
|
||||
be.setFullNbt(stack.getOrCreateTag());
|
||||
|
||||
CompoundTag nbt = stack.serializeNBT();
|
||||
CompoundTag forgeCapsTag = nbt.contains("ForgeCaps") ? nbt.getCompound("ForgeCaps") : null;
|
||||
be.setTags(vanillaTag, forgeCapsTag);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
// Re-adding ForgeCaps to item here as there is no loot function that can modify
|
||||
// outside of the vanilla tag
|
||||
public List<ItemStack> getDrops(BlockState pState, LootContext.Builder pBuilder) {
|
||||
List<ItemStack> lootDrops = super.getDrops(pState, pBuilder);
|
||||
|
||||
BlockEntity blockEntity = pBuilder.getOptionalParameter(LootContextParams.BLOCK_ENTITY);
|
||||
if (!(blockEntity instanceof BacktankBlockEntity bbe))
|
||||
return lootDrops;
|
||||
|
||||
CompoundTag forgeCapsTag = bbe.getForgeCapsTag();
|
||||
if (forgeCapsTag == null)
|
||||
return lootDrops;
|
||||
|
||||
return lootDrops.stream()
|
||||
.map(stack -> {
|
||||
if (!(stack.getItem() instanceof BacktankItem))
|
||||
return stack;
|
||||
|
||||
ItemStack modifiedStack = new ItemStack(stack.getItem(), stack.getCount(), forgeCapsTag.copy());
|
||||
modifiedStack.setTag(stack.getTag());
|
||||
return modifiedStack;
|
||||
})
|
||||
.toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
|
||||
BlockHitResult hit) {
|
||||
|
@ -151,32 +184,21 @@ public class BacktankBlock extends HorizontalKineticBlock
|
|||
@Override
|
||||
public ItemStack getCloneItemStack(BlockGetter blockGetter, BlockPos pos, BlockState state) {
|
||||
Item item = asItem();
|
||||
if (item instanceof BacktankItem.BacktankBlockItem placeable) {
|
||||
if (item instanceof BacktankItem.BacktankBlockItem placeable)
|
||||
item = placeable.getActualItem();
|
||||
}
|
||||
|
||||
ItemStack stack = new ItemStack(item);
|
||||
Optional<BacktankBlockEntity> blockEntityOptional = getBlockEntityOptional(blockGetter, pos);
|
||||
|
||||
CompoundTag tag = blockEntityOptional.map(BacktankBlockEntity::getFullNbt).orElse(stack.getOrCreateTag());
|
||||
|
||||
CompoundTag forgeCapsTag = blockEntityOptional.map(BacktankBlockEntity::getForgeCapsTag)
|
||||
.orElse(null);
|
||||
CompoundTag vanillaTag = blockEntityOptional.map(BacktankBlockEntity::getVanillaTag)
|
||||
.orElse(new CompoundTag());
|
||||
int air = blockEntityOptional.map(BacktankBlockEntity::getAirLevel)
|
||||
.orElse(0);
|
||||
tag.putInt("Air", air);
|
||||
|
||||
ListTag enchants = blockEntityOptional.map(BacktankBlockEntity::getEnchantmentTag)
|
||||
.orElse(new ListTag());
|
||||
if (!enchants.isEmpty()) {
|
||||
ListTag enchantmentTagList = stack.getEnchantmentTags();
|
||||
enchantmentTagList.addAll(enchants);
|
||||
tag.put("Enchantments", enchantmentTagList);
|
||||
}
|
||||
|
||||
Component customName = blockEntityOptional.map(BacktankBlockEntity::getCustomName)
|
||||
.orElse(null);
|
||||
if (customName != null)
|
||||
stack.setHoverName(customName);
|
||||
stack.setTag(tag);
|
||||
ItemStack stack = new ItemStack(item, 1, forgeCapsTag);
|
||||
vanillaTag.putInt("Air", air);
|
||||
stack.setTag(vanillaTag);
|
||||
return stack;
|
||||
}
|
||||
|
||||
|
@ -201,4 +223,12 @@ public class BacktankBlock extends HorizontalKineticBlock
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) {
|
||||
Item item = asItem();
|
||||
if (item instanceof BacktankItem.BacktankBlockItem placeable)
|
||||
item = placeable.getActualItem();
|
||||
return new ItemRequirement(ItemUseType.CONSUME, item);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,6 +2,8 @@ package com.simibubi.create.content.equipment.armor;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.simibubi.create.AllBlocks;
|
||||
import com.simibubi.create.AllItems;
|
||||
import com.simibubi.create.AllSoundEvents;
|
||||
|
@ -16,8 +18,6 @@ import net.minecraft.core.BlockPos;
|
|||
import net.minecraft.core.Direction.Axis;
|
||||
import net.minecraft.core.particles.ParticleTypes;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.nbt.ListTag;
|
||||
import net.minecraft.nbt.Tag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.Nameable;
|
||||
|
@ -35,23 +35,25 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable
|
|||
private Component customName;
|
||||
|
||||
private int capacityEnchantLevel;
|
||||
private ListTag enchantmentTag;
|
||||
|
||||
private CompoundTag fullNbt;
|
||||
private CompoundTag vanillaTag;
|
||||
private CompoundTag forgeCapsTag;
|
||||
|
||||
public BacktankBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||
super(type, pos, state);
|
||||
defaultName = getDefaultName(state);
|
||||
enchantmentTag = new ListTag();
|
||||
fullNbt = new CompoundTag();
|
||||
vanillaTag = new CompoundTag();
|
||||
forgeCapsTag = null;
|
||||
}
|
||||
|
||||
public static Component getDefaultName(BlockState state) {
|
||||
if (AllBlocks.NETHERITE_BACKTANK.has(state)) {
|
||||
AllItems.NETHERITE_BACKTANK.get().getDescription();
|
||||
AllItems.NETHERITE_BACKTANK.get()
|
||||
.getDescription();
|
||||
}
|
||||
|
||||
return AllItems.COPPER_BACKTANK.get().getDescription();
|
||||
return AllItems.COPPER_BACKTANK.get()
|
||||
.getDescription();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -118,23 +120,29 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable
|
|||
compound.putInt("Air", airLevel);
|
||||
compound.putInt("Timer", airLevelTimer);
|
||||
compound.putInt("CapacityEnchantment", capacityEnchantLevel);
|
||||
|
||||
if (this.customName != null)
|
||||
compound.putString("CustomName", Component.Serializer.toJson(this.customName));
|
||||
compound.put("Enchantments", enchantmentTag);
|
||||
compound.put("FullNBT", fullNbt);
|
||||
|
||||
compound.put("VanillaTag", vanillaTag);
|
||||
if (forgeCapsTag != null)
|
||||
compound.put("ForgeCapsTag", forgeCapsTag);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void read(CompoundTag compound, boolean clientPacket) {
|
||||
super.read(compound, clientPacket);
|
||||
int prev = airLevel;
|
||||
capacityEnchantLevel = compound.getInt("CapacityEnchantment");
|
||||
airLevel = compound.getInt("Air");
|
||||
airLevelTimer = compound.getInt("Timer");
|
||||
enchantmentTag = compound.getList("Enchantments", Tag.TAG_COMPOUND);
|
||||
this.fullNbt = compound.getCompound("FullNBT");
|
||||
capacityEnchantLevel = compound.getInt("CapacityEnchantment");
|
||||
|
||||
if (compound.contains("CustomName", 8))
|
||||
this.customName = Component.Serializer.fromJson(compound.getString("CustomName"));
|
||||
|
||||
vanillaTag = compound.getCompound("VanillaTag");
|
||||
forgeCapsTag = compound.contains("ForgeCapsTag") ? compound.getCompound("ForgeCapsTag") : null;
|
||||
|
||||
if (prev != 0 && prev != airLevel && airLevel == BacktankUtil.maxAir(capacityEnchantLevel) && clientPacket)
|
||||
playFilledEffect();
|
||||
}
|
||||
|
@ -154,8 +162,7 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable
|
|||
|
||||
@Override
|
||||
public Component getName() {
|
||||
return this.customName != null ? this.customName
|
||||
: defaultName;
|
||||
return this.customName != null ? this.customName : defaultName;
|
||||
}
|
||||
|
||||
public int getAirLevel() {
|
||||
|
@ -171,30 +178,21 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable
|
|||
this.customName = customName;
|
||||
}
|
||||
|
||||
public Component getCustomName() {
|
||||
return customName;
|
||||
}
|
||||
|
||||
public ListTag getEnchantmentTag() {
|
||||
return enchantmentTag;
|
||||
}
|
||||
|
||||
public void setEnchantmentTag(ListTag enchantmentTag) {
|
||||
this.enchantmentTag = enchantmentTag;
|
||||
}
|
||||
|
||||
public void setCapacityEnchantLevel(int capacityEnchantLevel) {
|
||||
this.capacityEnchantLevel = capacityEnchantLevel;
|
||||
}
|
||||
|
||||
public CompoundTag getFullNbt()
|
||||
{
|
||||
return fullNbt;
|
||||
|
||||
public void setTags(CompoundTag vanillaTag, @Nullable CompoundTag forgeCapsTag) {
|
||||
this.vanillaTag = vanillaTag;
|
||||
this.forgeCapsTag = forgeCapsTag;
|
||||
}
|
||||
|
||||
public void setFullNbt(CompoundTag fullNbt)
|
||||
{
|
||||
this.fullNbt = fullNbt;
|
||||
public CompoundTag getVanillaTag() {
|
||||
return vanillaTag;
|
||||
}
|
||||
|
||||
public CompoundTag getForgeCapsTag() {
|
||||
return forgeCapsTag;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -435,13 +435,10 @@ public class BuilderTransformers {
|
|||
.when(survivesExplosion)
|
||||
.setRolls(ConstantValue.exactly(1))
|
||||
.add(LootItem.lootTableItem(drop.get())
|
||||
.apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY)
|
||||
.copy("FullNBT", "{}", CopyNbtFunction.MergeStrategy.MERGE))
|
||||
.apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY))
|
||||
.apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY)
|
||||
.copy("Air", "Air"))
|
||||
.copy("VanillaTag", "{}", CopyNbtFunction.MergeStrategy.MERGE))
|
||||
.apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY)
|
||||
.copy("Enchantments", "Enchantments")))));
|
||||
.copy("Air", "Air")))));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue