Jump to content

Soft-fur dragon

Members
  • Posts

    31
  • Joined

  • Last visited

Everything posted by Soft-fur dragon

  1. I want to create custom command with custom attribute. That attribute represents String from some collection. Which options this command should support: /research clear /research clear <player> /research clear <player> <research> /research add <research> /research add <research> <player> I used class ParticleCommand as example Almost everything works fine, but minecraft doesn't want to recognize my argument input as valid, while suggestion list works fine. I keep getting that error in chat when trying to execute my command with that argument My code: ResearchCommand package arcanacraft.commands; import arcanacraft.capabilities.ResearchCapability; import arcanacraft.capabilities.ResearchCapabilityProvider; import arcanacraft.network.PacketHandler; import arcanacraft.network.PacketProperties; import arcanacraft.research.Research; import com.mojang.brigadier.CommandDispatcher; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.command.arguments.EntityArgument; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.util.LazyOptional; public class ResearchCommand { public static void register(CommandDispatcher<CommandSource> dispatcher) { dispatcher.register(Commands.literal("research").requires(commandSource -> commandSource.hasPermissionLevel(2)) .then(Commands.literal("clear") .executes(context -> clearAll(context.getSource(), context.getSource().asPlayer())) .then(Commands.argument("target", EntityArgument.player()) .executes(context -> clearAll(context.getSource(), EntityArgument.getPlayer(context, "target"))) .then(Commands.argument("research", ResearchArgument.research()) .executes(context -> clear(context.getSource(), ResearchArgument.getResearch(context, "research"), EntityArgument.getPlayer(context, "target"))) ) ) ).then(Commands.literal("add") .then(Commands.argument("research", ResearchArgument.research()) .executes(context -> add(context.getSource(), ResearchArgument.getResearch(context, "research"), context.getSource().asPlayer())) .then(Commands.argument("target", EntityArgument.player()) .executes(context -> add(context.getSource(), ResearchArgument.getResearch(context, "research"), EntityArgument.getPlayer(context, "target"))) ) ) ) ); } private static int clearAll(CommandSource source, PlayerEntity player) { LazyOptional<ResearchCapability> capability = player.getCapability(ResearchCapabilityProvider.RESEARCH_CAPABILITY); capability.ifPresent(researchCapability -> { researchCapability.clearAll(); PacketHandler.SendMessage(ResearchCapabilityProvider.INFO, player, ResearchCapability.SIGNAL_SYNC, new PacketProperties().NBT(researchCapability.write()).ToPlayer((ServerPlayerEntity) player)); }); source.sendFeedback(new TranslationTextComponent("commands.research.clear.all", player.getDisplayName()), true); return 1; } private static int clear(CommandSource source, Research research, PlayerEntity player) { LazyOptional<ResearchCapability> capability = player.getCapability(ResearchCapabilityProvider.RESEARCH_CAPABILITY); capability.ifPresent(researchCapability -> { researchCapability.clear(research); PacketHandler.SendMessage(ResearchCapabilityProvider.INFO, player, ResearchCapability.SIGNAL_SYNC, new PacketProperties().NBT(researchCapability.write()).ToPlayer((ServerPlayerEntity) player)); }); source.sendFeedback(new TranslationTextComponent("commands.research.clear.specific", new TranslationTextComponent(research.name), player.getDisplayName()), true); return 1; } private static int add(CommandSource source, Research research, PlayerEntity player) { LazyOptional<ResearchCapability> capability = player.getCapability(ResearchCapabilityProvider.RESEARCH_CAPABILITY); capability.ifPresent(researchCapability -> { researchCapability.advance(research); PacketHandler.SendMessage(ResearchCapabilityProvider.INFO, player, ResearchCapability.SIGNAL_SYNC, new PacketProperties().NBT(researchCapability.write()).ToPlayer((ServerPlayerEntity) player)); }); source.sendFeedback(new TranslationTextComponent("commands.research.add", new TranslationTextComponent(research.name), player.getDisplayName()), true); return 1; } } ResearchArgument package arcanacraft.commands; import arcanacraft.research.Research; import arcanacraft.research.ResearchRegistry; import com.google.common.collect.ImmutableList; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.command.ISuggestionProvider; import net.minecraft.util.text.TranslationTextComponent; import java.util.Collection; import java.util.concurrent.CompletableFuture; public class ResearchArgument implements ArgumentType<Research> { public static final DynamicCommandExceptionType RESEARCH_NOT_FOUND = new DynamicCommandExceptionType((research) -> new TranslationTextComponent("commands.research.notFound", research) ); @Override public Research parse(StringReader reader) throws CommandSyntaxException { String name = reader.getString().substring(reader.getCursor()); Research research = ResearchRegistry.INSTANCE.getResearch(name); if (research != null) { return research; } else { throw RESEARCH_NOT_FOUND.create(name); } } public static <S> Research getResearch(CommandContext<S> context, String name) { return context.getArgument(name, Research.class); } public static ResearchArgument research() { return new ResearchArgument(); } @Override public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) { return ISuggestionProvider.suggest(ResearchRegistry.INSTANCE.getKeys(), builder); } @Override public Collection<String> getExamples() { return ImmutableList.of(ResearchRegistry.INSTANCE.getKeys().stream().findFirst().get()); } }
  2. Ok, I found it. Inside my cauldron TileEntity you can see onLoad function. Inside it I call UpdateHeat function, which calls world.getBlockState. I tried to debug this code and it seems like it freezes on trying to load chunk to get BlockState on that position. Bug? Or is there another way to get block data on world startup
  3. Well, that was pretty obvious, but thanks First problem is solved. However, world is still being broken. This is what I see when I'm trying to open it. The game freezes in this state
  4. I followed recommendations in this thread and finally got my new cauldron block in game. However, now it's missing from its default creative tab (brewing). I also added TileEntity to my block and now world stopped loading at all, if it have at least one cauldron tile entity in it ☠️ Block registry package arcanacraft.blocks; import arcanacraft.Registries; import arcanacraft.item.ItemRegistry; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.CauldronBlock; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.material.MaterialColor; import net.minecraftforge.common.ToolType; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ObjectHolder; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class BlockRegistry { public static final RegistryObject<ModBlock> ARCANIUM_BLOCK = Registries.BLOCKS.register("arcanium_block", () -> new ModBlock(ItemRegistry.ARCANIUM_BLOCK::get, AbstractBlock.Properties.create(Material.IRON).harvestTool(ToolType.PICKAXE).setRequiresTool().hardnessAndResistance(5.0f, 6.0f))); public static final RegistryObject<Pedestal> COBBLESTONE_PEDESTAL = Registries.BLOCKS.register("cobblestone_pedestal", () -> new Pedestal(ItemRegistry.COBBLESTONE_PEDESTAL::get, AbstractBlock.Properties.create(Material.ROCK).harvestTool(ToolType.PICKAXE).setRequiresTool().hardnessAndResistance(2.0f, 6.0f))); //public static final RegistryObject<Condenser> QUARTZ_CONDENSER = Registries.BLOCKS.register("quartz_condenser", () -> new Condenser(ItemRegistry.QUARTZ_CONDENSER::get, AbstractBlock.Properties.create(Material.WOOD).doesNotBlockMovement().zeroHardnessAndResistance())); public static final RegistryObject<Chains> CHAINS = Registries.BLOCKS.register("chains", () -> new Chains(AbstractBlock.Properties.create(Material.IRON, MaterialColor.AIR).setRequiresTool().hardnessAndResistance(5.0F, 6.0F).sound(SoundType.CHAIN).notSolid())); // Registries.BLOCKS.register("cauldron", () -> new Cauldron(AbstractBlock.Properties.create(Material.IRON, MaterialColor.STONE).setRequiresTool().hardnessAndResistance(2.0F).notSolid())); public static final RegistryObject<CauldronBlock> ADVANCED_CAULDRON = Registries.BLOCKS.register("advanced_cauldron", () -> new CauldronBlock(AbstractBlock.Properties.create(Material.IRON, MaterialColor.STONE).setRequiresTool().hardnessAndResistance(2.0F).notSolid())); @ObjectHolder("minecraft:cauldron") public static final Block CAULDRON = null; public static void Register() { } @SubscribeEvent public static void ReplaceVanilla(final RegistryEvent.Register<Block> event) { event.getRegistry().registerAll( new Cauldron(AbstractBlock.Properties.create(Material.IRON, MaterialColor.STONE).setRequiresTool().hardnessAndResistance(2.0F).notSolid()).setRegistryName("minecraft:cauldron") ); } } New cauldron class package arcanacraft.blocks; import arcanacraft.tile_entities.CauldronEntity; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.CauldronBlock; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; public class Cauldron extends CauldronBlock { public static Map<Block, Float> HEATERS = new HashMap<Block, Float>() {{ put(Blocks.LAVA, 5.0f); put(Blocks.TORCH, 1.0f); }}; public Cauldron(Properties properties) { super(properties); } @Override public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) { if (!world.isRemote()) { BlockState newState = world.getBlockState(neighbor); if (neighbor == pos.add(0, -1, 0)) { TileEntity entity = world.getTileEntity(pos); if (entity instanceof CauldronEntity) { CauldronEntity cauldron = (CauldronEntity) entity; cauldron.UpdateHeat(); } } } } @Override public void setWaterLevel(World worldIn, BlockPos pos, BlockState state, int level) { super.setWaterLevel(worldIn, pos, state, level); if (!worldIn.isRemote) { TileEntity entity = worldIn.getTileEntity(pos); if (entity instanceof CauldronEntity) { CauldronEntity cauldron = (CauldronEntity) entity; cauldron.SetWaterLevel(level); } } } @Override public boolean hasTileEntity(BlockState state) { return true; } @Nullable @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return new CauldronEntity(); } } Cauldron tile entity package arcanacraft.tile_entities; import arcanacraft.blocks.Cauldron; import arcanacraft.network.INetworkable; import arcanacraft.network.PacketHandler; import arcanacraft.network.PacketProperties; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import javax.annotation.Nullable; public class CauldronEntity extends TileEntity implements ITickableTileEntity, INetworkable { public static final int SIGNAL_BOIL = 0; public static final int SIGNAL_COOL = 1; float heat = 0.0f; float waterHeat = 0.0f; float boilHeat = 0.0f; float Clamp(float v, float min, float max) { return Math.max(min, Math.min(v, max)); } public CauldronEntity() { super(TileEntityRegistry.CAULDRON.get()); } @Override public void tick() { if (!world.isRemote) { float heatBefore = waterHeat; waterHeat = Clamp(waterHeat + heat, 0, boilHeat); if (heatBefore != waterHeat) { if (waterHeat == boilHeat && boilHeat != 0.0f) { Boil(); PacketHandler.SendMessage(this, SIGNAL_BOIL, new PacketProperties().InChunkAt(world, pos)); } else if (waterHeat == 0) { Cool(); PacketHandler.SendMessage(this, SIGNAL_COOL, new PacketProperties().InChunkAt(world, pos)); } } } } @Override public void onLoad() { super.onLoad(); UpdateHeat(); SetWaterLevel(world.getBlockState(pos).get(Cauldron.LEVEL)); } public void UpdateHeat() { Block heater = world.getBlockState(pos.add(0, -1, 0)).getBlock(); heat = Cauldron.HEATERS.getOrDefault(heater, -5.0f); } public void SetWaterLevel(int waterLevel) { boilHeat = waterLevel * 100.0f; } void Boil() { } void Cool() { } @Override public void HandleMessage(int type, @Nullable CompoundNBT msg, @Nullable ServerPlayerEntity sender) { if (type == SIGNAL_BOIL) { Boil(); } else if (type == SIGNAL_COOL) { Cool(); } } @Override public CompoundNBT write(CompoundNBT compound) { super.write(compound); compound.putFloat("waterHeat", waterHeat); return compound; } @Override public void read(BlockState state, CompoundNBT nbt) { super.read(state, nbt); waterHeat = nbt.getFloat("waterHeat"); } }
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.