diff --git a/src/main/java/com/jenny/magic/Magic.java b/src/main/java/com/jenny/magic/Magic.java index ee764ef..027aadc 100644 --- a/src/main/java/com/jenny/magic/Magic.java +++ b/src/main/java/com/jenny/magic/Magic.java @@ -1,9 +1,12 @@ package com.jenny.magic; +import com.jenny.magic.blocks.blocks; +import com.jenny.magic.blocks.conditions.conditions; +import com.jenny.magic.blocks.entities.blockEntities; import com.jenny.magic.config.ConfigServer; import com.jenny.magic.entities.entities; import com.jenny.magic.items.items; -import net.minecraftforge.api.distmarker.Dist; +import com.mojang.logging.LogUtils; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -11,29 +14,39 @@ import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.slf4j.Logger; // The value here should match an entry in the META-INF/mods.toml file @Mod(Magic.MODID) public class Magic { public static final String MODID = "magic"; + private static final Logger LOGGER = LogUtils.getLogger(); public Magic() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); MinecraftForge.EVENT_BUS.register(this); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ConfigServer.SPEC, "magic-server.toml"); entities.register(modEventBus); items.register(modEventBus); + blocks.register(modEventBus); + blockEntities.register(modEventBus); creativeTab.register(modEventBus); - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ConfigServer.SPEC, "magic-server.toml"); } - @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) - public static class ClientModEvents { + @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD) + public static class ModEvents { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { entities.registerRenderers(); } + + @SubscribeEvent + public static void onCommonSetup(FMLCommonSetupEvent event) { + conditions.register(); + } } } diff --git a/src/main/java/com/jenny/magic/blocks/AntiSpawner.java b/src/main/java/com/jenny/magic/blocks/AntiSpawner.java new file mode 100644 index 0000000..7a32f6a --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/AntiSpawner.java @@ -0,0 +1,39 @@ +package com.jenny.magic.blocks; + +import com.jenny.magic.blocks.entities.AntiSpawnerBE; +import com.jenny.magic.blocks.entities.blockEntities; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class AntiSpawner extends BaseEntityBlock { + public static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 16, 16); + + protected AntiSpawner(Properties pProperties) { + super(pProperties); + } + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return new AntiSpawnerBE(pPos, pState); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(@NotNull Level pLevel, @NotNull BlockState pState, @NotNull BlockEntityType pBlockEntityType) { + if (pLevel.isClientSide()) { + return null; + } + + return createTickerHelper(pBlockEntityType, blockEntities.ANTI_SPAWNER_BE.get(), + (pLevel1, pPos, pState1, pBlockEntity) -> pBlockEntity.tick(pLevel1, pPos, pState1)); + } +} diff --git a/src/main/java/com/jenny/magic/blocks/blocks.java b/src/main/java/com/jenny/magic/blocks/blocks.java new file mode 100644 index 0000000..073cef7 --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/blocks.java @@ -0,0 +1,26 @@ +package com.jenny.magic.blocks; + +import com.jenny.magic.items.BlockItemTooltip; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import static com.jenny.magic.Magic.MODID; + +public class blocks { + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID); + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); + + public static final RegistryObject ANTI_SPAWNER = BLOCKS.register("anti_spawner", () -> new AntiSpawner(BlockBehaviour.Properties.of().strength(10.0F, 15.0F))); + public static final RegistryObject ANTI_SPAWNER_ITEM = ITEMS.register("anti_spawner", () -> new BlockItemTooltip(ANTI_SPAWNER.get(), new Item.Properties())); + + + public static void register(IEventBus bus) { + BLOCKS.register(bus); + ITEMS.register(bus); + } +} diff --git a/src/main/java/com/jenny/magic/blocks/conditions/ConfigCondition.java b/src/main/java/com/jenny/magic/blocks/conditions/ConfigCondition.java new file mode 100644 index 0000000..959d6b8 --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/conditions/ConfigCondition.java @@ -0,0 +1,40 @@ +package com.jenny.magic.blocks.conditions; + +import com.google.gson.JsonObject; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.common.crafting.conditions.ICondition; +import net.minecraftforge.common.crafting.conditions.IConditionSerializer; + +import java.util.List; + +import static com.jenny.magic.Magic.MODID; + +public class ConfigCondition implements IConditionSerializer, ICondition { + public ForgeConfigSpec.ConfigValue> list; + public String name; + + public ConfigCondition(String name, ForgeConfigSpec.ConfigValue> configListDisabled) { + this.list = configListDisabled; + this.name = name; + } + + @Override + public void write(JsonObject json, ConfigCondition value) { + } + + @Override + public ConfigCondition read(JsonObject json) { + return this; + } + + @Override + public ResourceLocation getID() { + return new ResourceLocation(MODID, name); + } + + @Override + public boolean test(IContext context) { + return list.get().contains(name); + } +} diff --git a/src/main/java/com/jenny/magic/blocks/conditions/conditions.java b/src/main/java/com/jenny/magic/blocks/conditions/conditions.java new file mode 100644 index 0000000..2d292ee --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/conditions/conditions.java @@ -0,0 +1,27 @@ +package com.jenny.magic.blocks.conditions; + +import com.jenny.magic.blocks.blocks; +import com.jenny.magic.config.ConfigServer; +import com.jenny.magic.items.items; +import net.minecraft.world.item.Item; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.registries.RegistryObject; + +import java.util.ArrayList; +import java.util.List; + +public class conditions { + public static void register() { + for (RegistryObject item : items()) { + String name = item.get().toString(); + System.out.println("test123: " + name); + CraftingHelper.register(new ConfigCondition(name, ConfigServer.C_DISABLED_LIST)); + } + } + + private static List> items() { + ArrayList> l = new ArrayList<>(items.ITEMS.getEntries().stream().toList()); + l.addAll(blocks.ITEMS.getEntries().stream().toList()); + return l; + } +} diff --git a/src/main/java/com/jenny/magic/blocks/entities/AntiSpawnerBE.java b/src/main/java/com/jenny/magic/blocks/entities/AntiSpawnerBE.java new file mode 100644 index 0000000..b099d3f --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/entities/AntiSpawnerBE.java @@ -0,0 +1,30 @@ +package com.jenny.magic.blocks.entities; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; + +public class AntiSpawnerBE extends BlockEntity { + protected final AABB area; + + public AntiSpawnerBE(BlockPos pPos, BlockState pBlockState) { + super(blockEntities.ANTI_SPAWNER_BE.get(), pPos, pBlockState); + area = new AABB(this.getBlockPos()).inflate(32); + } + + public void tick(Level pLevel, BlockPos pPos, BlockState pState) { + if (!pLevel.isClientSide) { + for (Entity e : pLevel.getEntities(null, area)) { + if (e instanceof Monster && ((Monster) e).getSpawnType() == MobSpawnType.NATURAL) { + e.remove(Entity.RemovalReason.KILLED); + e.remove(Entity.RemovalReason.KILLED); + } + } + } + } +} diff --git a/src/main/java/com/jenny/magic/blocks/entities/blockEntities.java b/src/main/java/com/jenny/magic/blocks/entities/blockEntities.java new file mode 100644 index 0000000..1cfeaad --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/entities/blockEntities.java @@ -0,0 +1,24 @@ +package com.jenny.magic.blocks.entities; + +import com.jenny.magic.blocks.blocks; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import static com.jenny.magic.Magic.MODID; + +public class blockEntities { + public static final DeferredRegister> BLOCK_ENTITIES = + DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, MODID); + + public static void register(IEventBus bus) { + BLOCK_ENTITIES.register(bus); + } public static final RegistryObject> ANTI_SPAWNER_BE = + BLOCK_ENTITIES.register("anti_spawner_be", () -> + BlockEntityType.Builder.of(AntiSpawnerBE::new, + blocks.ANTI_SPAWNER.get()).build(null)); + + +} diff --git a/src/main/java/com/jenny/magic/config/ConfigServer.java b/src/main/java/com/jenny/magic/config/ConfigServer.java index 247071d..af24f2f 100644 --- a/src/main/java/com/jenny/magic/config/ConfigServer.java +++ b/src/main/java/com/jenny/magic/config/ConfigServer.java @@ -3,12 +3,16 @@ package com.jenny.magic.config; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.fml.common.Mod; +import java.util.ArrayList; +import java.util.List; + import static com.jenny.magic.Magic.MODID; @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD) public class ConfigServer { public static final ForgeConfigSpec SPEC; public static final ForgeConfigSpec.ConfigValue C_TELEPORT_SCROLL_RANGE, C_TELEPORT_SCROLL_RANGE_RANDOM; + public static final ForgeConfigSpec.ConfigValue> C_DISABLED_LIST; private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); static { @@ -18,7 +22,20 @@ public class ConfigServer { C_TELEPORT_SCROLL_RANGE_RANDOM = BUILDER.comment("maximum range for all teleport scrolls with random targets") .defineInRange("scroll_teleport_random_range", 30000000, 0, 30000000); - + C_DISABLED_LIST = + BUILDER.comment("add any items (without mod ID) from this mod to this list to disable their recipes") + .define("disabled_items", defaultListDisabled()); SPEC = BUILDER.build(); } + + public static boolean isRecipeDisabled(String item) { + return C_DISABLED_LIST.get().contains(item); + } + + private static List defaultListDisabled() { + List l = new ArrayList<>(); + l.add("item_1"); + l.add("item_2"); + return l; + } } diff --git a/src/main/java/com/jenny/magic/creativeTab.java b/src/main/java/com/jenny/magic/creativeTab.java index c3a845a..09231f0 100644 --- a/src/main/java/com/jenny/magic/creativeTab.java +++ b/src/main/java/com/jenny/magic/creativeTab.java @@ -1,5 +1,6 @@ package com.jenny.magic; +import com.jenny.magic.blocks.blocks; import com.jenny.magic.items.items; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -18,6 +19,7 @@ import static com.jenny.magic.Magic.MODID; public class creativeTab { public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID); public static final RegistryObject CREATIVE_TAB = CREATIVE_MODE_TABS.register(MODID, () -> CreativeModeTab.builder().withTabsBefore(CreativeModeTabs.SPAWN_EGGS).icon(() -> items.WAND_HURTFUL.get().getDefaultInstance()).displayItems((parameters, output) -> { + output.acceptAll(Arrays.stream(getBlocks()).toList()); output.acceptAll(Arrays.stream(getItems()).toList()); }).title(Component.literal("Magic")).build()); @@ -34,4 +36,14 @@ public class creativeTab { } return ret; } + + public static ItemStack[] getBlocks() { + ItemStack[] ret = new ItemStack[blocks.ITEMS.getEntries().size()]; + int i = 0; + for (RegistryObject item : blocks.ITEMS.getEntries()) { + ret[i] = item.get().getDefaultInstance(); + i++; + } + return ret; + } } diff --git a/src/main/java/com/jenny/magic/datagen/DataGenerators.java b/src/main/java/com/jenny/magic/datagen/DataGenerators.java index 06a75d2..13228d3 100644 --- a/src/main/java/com/jenny/magic/datagen/DataGenerators.java +++ b/src/main/java/com/jenny/magic/datagen/DataGenerators.java @@ -18,5 +18,6 @@ public class DataGenerators { PackOutput packOutput = generator.getPackOutput(); ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); generator.addProvider(event.includeClient(), new ModItemModelProvider(packOutput, existingFileHelper)); + generator.addProvider(event.includeClient(), new ModBlockStateProvider(packOutput, existingFileHelper)); } } \ No newline at end of file diff --git a/src/main/java/com/jenny/magic/datagen/ModBlockStateProvider.java b/src/main/java/com/jenny/magic/datagen/ModBlockStateProvider.java new file mode 100644 index 0000000..9c70aae --- /dev/null +++ b/src/main/java/com/jenny/magic/datagen/ModBlockStateProvider.java @@ -0,0 +1,86 @@ +package com.jenny.magic.datagen; + +import com.jenny.magic.blocks.blocks; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +import static com.jenny.magic.Magic.MODID; + +public class ModBlockStateProvider extends BlockStateProvider { + public ModBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) { + super(output, MODID, exFileHelper); + } + + @Override + protected void registerStatesAndModels() { + test(blocks.ANTI_SPAWNER); + //blockWithItem(blocks.ANTI_SPAWNER); + } + + private void test(@NotNull RegistryObject blockRegistryObject) { + Block block = blockRegistryObject.get(); + ModelFile model = cube(block); + this.getVariantBuilder(block).forAllStates(blockState -> ConfiguredModel.builder().modelFile(model).build()); + simpleBlockItem(block, model); + } + + private void blockWithItem(@NotNull RegistryObject blockRegistryObject) { + simpleBlockWithItem(blockRegistryObject.get(), cubeAll(blockRegistryObject.get())); + } + + private void SideTop(@NotNull RegistryObject blockRegistryObject) { + simpleBlockWithItem(blockRegistryObject.get(), topSide(blockRegistryObject.get())); + } + + private void blockItem(@NotNull RegistryObject blockRegistryObject) { + simpleBlockItem(blockRegistryObject.get(), new ModelFile.UncheckedModelFile(MODID + + ":block/" + Objects.requireNonNull(ForgeRegistries.BLOCKS.getKey(blockRegistryObject.get())).getPath())); + } + + private void topBottom2Sides(@NotNull RegistryObject blockRegistryObject) { + simpleBlockWithItem(blockRegistryObject.get(), northEastTopBottom(blockRegistryObject.get())); + } + + private ResourceLocation key(Block block) { + return ForgeRegistries.BLOCKS.getKey(block); + } + + private @NotNull String name(Block block) { + return key(block).getPath(); + } + + private ResourceLocation extend(@NotNull ResourceLocation rl, String suffix) { + return new ResourceLocation(rl.getNamespace(), rl.getPath() + suffix); + } + + public void sideTopBottom(@NotNull RegistryObject blockRegistryObject) { + Block block = blockRegistryObject.get(); + ModelFile model = models().cubeBottomTop(name(block), extend(blockTexture(block), "_side"), extend(blockTexture(block), "_bottom"), extend(blockTexture(block), "_top")); + this.getVariantBuilder(block).forAllStates(blockState -> ConfiguredModel.builder().modelFile(model).build()); + simpleBlockItem(block, model); + } + + public ModelFile northEastTopBottom(Block block) { + return models().cube(name(block), extend(blockTexture(block), "_bottom"), extend(blockTexture(block), "_top"), extend(blockTexture(block), "_nw"), extend(blockTexture(block), "_se"), extend(blockTexture(block), "_se"), extend(blockTexture(block), "_nw")).texture("particle", extend(blockTexture(block), "_se")); + } + + public ModelFile cube(Block block) { + return models().cubeAll(name(block), blockTexture(block)); + } + + public ModelFile topSide(Block block) { + return models().cubeColumn(name(block), extend(blockTexture(block), "_side"), extend(blockTexture(block), "_top")); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/jenny/magic/items/BlockItemTooltip.java b/src/main/java/com/jenny/magic/items/BlockItemTooltip.java new file mode 100644 index 0000000..ada625f --- /dev/null +++ b/src/main/java/com/jenny/magic/items/BlockItemTooltip.java @@ -0,0 +1,32 @@ +package com.jenny.magic.items; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.jenny.magic.Magic.MODID; + +public class BlockItemTooltip extends BlockItem { + public BlockItemTooltip(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + @Override + public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) { + String key = String.format("tooltip.%s.%s", MODID, this); + MutableComponent toolTip = Component.translatable(key); + if (!toolTip.getString().equals(key)) { + pTooltipComponents.add(toolTip.withStyle(ChatFormatting.DARK_BLUE)); + super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + } + } +} diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java b/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java new file mode 100644 index 0000000..4e27b77 --- /dev/null +++ b/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java @@ -0,0 +1,67 @@ +package com.jenny.magic.items; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; +import java.util.function.Predicate; + +import static com.jenny.magic.Magic.MODID; + +public class TeleportScrollBiome extends BaseItem { + private final Biome biome; + private final ChatFormatting color; + + public TeleportScrollBiome(Properties pProperties, Biome biome, ChatFormatting color) { + super(pProperties); + this.biome = biome; + this.color = color; + } + + @Override + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, @NotNull Player pPlayer, @NotNull InteractionHand pUsedHand) { + use(pPlayer, pPlayer.getItemInHand(pUsedHand)); + return InteractionResultHolder.success(pPlayer.getItemInHand(pUsedHand)); + } + + @Override + public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) { + use(pContext.getPlayer(), pContext.getItemInHand()); + return InteractionResult.SUCCESS; + } + + protected void use(@NotNull Player player, ItemStack itemStack) { + if (!player.level().isClientSide) { + Predicate> predicate = new Predicate>() { + @Override + public boolean test(@NotNull Holder biomeHolder) { + return Objects.equals(biomeHolder.get().toString(), biome.toString()); + } + }; + Pair> pair = ((ServerLevel) player.level()).findClosestBiome3d(predicate, player.blockPosition(), 69000, 32, 64); + if (pair == null) { + MessageBiomeNotFound(player); + } else { + player.teleportTo(pair.getFirst().getX(), pair.getFirst().getY(), pair.getFirst().getZ()); + } + } + itemStack.shrink(1); + } + + protected void MessageBiomeNotFound(Player player) { + player.sendSystemMessage(Component.translatable(String.format("message.%s.scroll_teleport_biome.not_found", MODID))); + } +} diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollRandomBiome.java b/src/main/java/com/jenny/magic/items/TeleportScrollRandomBiome.java new file mode 100644 index 0000000..87b36b0 --- /dev/null +++ b/src/main/java/com/jenny/magic/items/TeleportScrollRandomBiome.java @@ -0,0 +1,71 @@ +package com.jenny.magic.items; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Objects; +import java.util.function.Predicate; + +public class TeleportScrollRandomBiome extends BaseItem { + public TeleportScrollRandomBiome(Properties pProperties) { + super(pProperties); + } + + @Override + public @NotNull InteractionResultHolder use(@NotNull Level pLevel, @NotNull Player pPlayer, @NotNull InteractionHand pUsedHand) { + use(pPlayer, pPlayer.getItemInHand(pUsedHand)); + return InteractionResultHolder.success(pPlayer.getItemInHand(pUsedHand)); + } + + @Override + public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) { + use(pContext.getPlayer(), pContext.getItemInHand()); + return InteractionResult.SUCCESS; + } + + protected void use(@NotNull Player player, ItemStack itemStack) { + if (!player.level().isClientSide && itemStack.getTag() != null && itemStack.getTag().contains("teleport_biome")) { + Biome biome = ForgeRegistries.BIOMES.getValue(ResourceLocation.parse(itemStack.getTag().getString("teleport_biome"))); + Predicate> predicate = new Predicate>() { + @Override + public boolean test(@NotNull Holder biomeHolder) { + return Objects.equals(biomeHolder.get().toString(), biome.toString()); + } + }; + Pair> pair = ((ServerLevel) player.level()).findClosestBiome3d(predicate, player.blockPosition(), 69000, 32, 64); + if (pair == null) { + System.out.println("error: biome not found"); + } else { + player.teleportTo(pair.getFirst().getX(), pair.getFirst().getY(), pair.getFirst().getZ()); + } + } else { + setBiome(player.level(), itemStack); + } + } + + protected void setBiome(Level level, ItemStack itemStack) { + //ForgeRegistries.BIOMES.getEntries().stream().toList().get().; + Collection list = ForgeRegistries.BIOMES.getValues(); + //String biomeStr = list.get(level.getRandom().nextInt(list.size())).toString(); + + CompoundTag compoundTag = itemStack.getTag(); + compoundTag = compoundTag != null ? compoundTag : new CompoundTag(); + //compoundTag.putString("teleport_biome", biomeStr); + itemStack.setTag(compoundTag); + } +} diff --git a/src/main/java/com/jenny/magic/items/items.java b/src/main/java/com/jenny/magic/items/items.java index e0ef3d8..5637c6c 100644 --- a/src/main/java/com/jenny/magic/items/items.java +++ b/src/main/java/com/jenny/magic/items/items.java @@ -14,6 +14,7 @@ public class items { public static final RegistryObject SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new TeleportScrollPersistent(new Item.Properties().stacksTo(1))); public static final RegistryObject SCROLL_TELEPORT_BRITTLE = ITEMS.register("scroll_teleport_brittle", () -> new TeleportScrollConsumable(new Item.Properties().stacksTo(16))); public static final RegistryObject SCROLL_TELEPORT_RANDOM = ITEMS.register("scroll_teleport_random", () -> new TeleportScrollRandom(new Item.Properties().stacksTo(1))); + public static final RegistryObject SCROLL_TELEPORT_RANDOM_BIOME = ITEMS.register("scroll_teleport_random_biome", () -> new TeleportScrollRandomBiome(new Item.Properties().stacksTo(16))); public static void register(IEventBus bus) { diff --git a/src/main/resources/assets/magic/textures/block/anti_spawner.png b/src/main/resources/assets/magic/textures/block/anti_spawner.png new file mode 100644 index 0000000..9eb3a40 Binary files /dev/null and b/src/main/resources/assets/magic/textures/block/anti_spawner.png differ diff --git a/src/main/resources/assets/magic/textures/item/scroll_teleport_random.png b/src/main/resources/assets/magic/textures/item/scroll_teleport_random.png new file mode 100644 index 0000000..9eb3a40 Binary files /dev/null and b/src/main/resources/assets/magic/textures/item/scroll_teleport_random.png differ diff --git a/src/main/resources/assets/magic/textures/item/scroll_teleport_random_biome.png b/src/main/resources/assets/magic/textures/item/scroll_teleport_random_biome.png new file mode 100644 index 0000000..9eb3a40 Binary files /dev/null and b/src/main/resources/assets/magic/textures/item/scroll_teleport_random_biome.png differ diff --git a/src/main/resources/data/magic/recipes/wand_hurtful_test.json b/src/main/resources/data/magic/recipes/wand_hurtful_test.json new file mode 100644 index 0000000..48bc4f6 --- /dev/null +++ b/src/main/resources/data/magic/recipes/wand_hurtful_test.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "combat", + "ingredients": [ + { + "item": "minecraft:stick" + }, + { + "item": "minecraft:diamond" + } + ], + "result": { + "item": "magic:wand_hurtful" + }, + "conditions": [ + { + "type": "magic:wand_hurtful", + "mod": "magic" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/magic.mixins.json b/src/main/resources/magic.mixins.json index 4824d3c..fbea666 100644 --- a/src/main/resources/magic.mixins.json +++ b/src/main/resources/magic.mixins.json @@ -1,7 +1,7 @@ { "required": true, "minVersion": "0.8", - "package": "com.jenny.magic.mixin", + "package": "com.jenny.magic.mixins", "compatibilityLevel": "JAVA_8", "refmap": "magic.refmap.json", "mixins": [