diff --git a/src/main/java/com/jenny/magic/Magic.java b/src/main/java/com/jenny/magic/Magic.java index e64db2f..ee764ef 100644 --- a/src/main/java/com/jenny/magic/Magic.java +++ b/src/main/java/com/jenny/magic/Magic.java @@ -1,12 +1,15 @@ package com.jenny.magic; +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 net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; +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.javafmlmod.FMLJavaModLoadingContext; @@ -22,6 +25,7 @@ public class Magic { entities.register(modEventBus); items.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) diff --git a/src/main/java/com/jenny/magic/config/ConfigServer.java b/src/main/java/com/jenny/magic/config/ConfigServer.java new file mode 100644 index 0000000..247071d --- /dev/null +++ b/src/main/java/com/jenny/magic/config/ConfigServer.java @@ -0,0 +1,24 @@ +package com.jenny.magic.config; + +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.fml.common.Mod; + +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; + private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); + + static { + C_TELEPORT_SCROLL_RANGE = + BUILDER.comment("maximum range for all targeted teleport scrolls; 0 = infinite") + .defineInRange("scroll_teleport_range", 0, 0, 60000000); + C_TELEPORT_SCROLL_RANGE_RANDOM = + BUILDER.comment("maximum range for all teleport scrolls with random targets") + .defineInRange("scroll_teleport_random_range", 30000000, 0, 30000000); + + SPEC = BUILDER.build(); + } +} diff --git a/src/main/java/com/jenny/magic/datagen/DataGenerators.java b/src/main/java/com/jenny/magic/datagen/DataGenerators.java new file mode 100644 index 0000000..06a75d2 --- /dev/null +++ b/src/main/java/com/jenny/magic/datagen/DataGenerators.java @@ -0,0 +1,22 @@ +package com.jenny.magic.datagen; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.data.event.GatherDataEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.jetbrains.annotations.NotNull; + +import static com.jenny.magic.Magic.MODID; + +@Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class DataGenerators { + @SubscribeEvent + public static void gatherData(@NotNull GatherDataEvent event) { + DataGenerator generator = event.getGenerator(); + PackOutput packOutput = generator.getPackOutput(); + ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + generator.addProvider(event.includeClient(), new ModItemModelProvider(packOutput, existingFileHelper)); + } +} \ No newline at end of file diff --git a/src/main/java/com/jenny/magic/datagen/ModItemModelProvider.java b/src/main/java/com/jenny/magic/datagen/ModItemModelProvider.java new file mode 100644 index 0000000..c543b89 --- /dev/null +++ b/src/main/java/com/jenny/magic/datagen/ModItemModelProvider.java @@ -0,0 +1,32 @@ +package com.jenny.magic.datagen; + +import com.jenny.magic.items.items; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.RegistryObject; +import org.jetbrains.annotations.NotNull; + +import static com.jenny.magic.Magic.MODID; + +public class ModItemModelProvider extends ItemModelProvider { + public ModItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { + super(output, MODID, existingFileHelper); + } + + @Override + protected void registerModels() { + for (RegistryObject item : items.ITEMS.getEntries()) { + simpleItem(item); + } + } + + private ItemModelBuilder simpleItem(@NotNull RegistryObject item) { + return withExistingParent(item.getId().getPath(), + new ResourceLocation("item/generated")).texture("layer0", + new ResourceLocation(MODID, "item/" + item.getId().getPath())); + } +} diff --git a/src/main/java/com/jenny/magic/items/TeleportScroll.java b/src/main/java/com/jenny/magic/items/TeleportScroll.java index c6609a3..dc141c1 100644 --- a/src/main/java/com/jenny/magic/items/TeleportScroll.java +++ b/src/main/java/com/jenny/magic/items/TeleportScroll.java @@ -1,5 +1,6 @@ package com.jenny.magic.items; +import com.jenny.magic.config.ConfigServer; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.particles.ParticleTypes; @@ -40,35 +41,40 @@ public class TeleportScroll extends BaseItem { return InteractionResult.SUCCESS; } - protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level) { - if (itemStack.getTag() == null) { - itemStack.setTag(new CompoundTag()); - } - if (locationSet(itemStack.getTag()) && !player.isCrouching()) { - if (level.isClientSide) { - spawnParticles(level, player.position().add(0, player.getEyeHeight(), 0), 20, 5, ParticleTypes.POOF, ParticleDirection.INWARD); - } - player.setPos(getLocation(itemStack.getTag())); - if (level.isClientSide) { - spawnParticles(level, player.position().add(0, player.getEyeHeight(), 0), 20, 0.2, ParticleTypes.END_ROD, ParticleDirection.OUTWARD); - } - } else { - itemStack.setTag(setLocation(pos, itemStack.getTag())); - if (level.isClientSide) { - MessageLocationSet(); - } - } + public static String dim(Level level) { + return level.dimension().location().toString(); } private boolean locationSet(@NotNull CompoundTag cTag) { return cTag.contains("teleport_x") && cTag.contains("teleport_y") && cTag.contains("teleport_z"); } - private CompoundTag setLocation(@NotNull Vec3 playerPos, @NotNull CompoundTag cTag) { - cTag.putDouble("teleport_x", playerPos.x); - cTag.putDouble("teleport_y", playerPos.y); - cTag.putDouble("teleport_z", playerPos.z); - return cTag; + protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level) { + if (itemStack.getTag() == null) { + itemStack.setTag(new CompoundTag()); + } + if (locationSet(itemStack.getTag()) && !player.isCrouching()) { + if (dimCheck(player, itemStack.getTag())) { + if (level.isClientSide) { + spawnParticles(level, player.position().add(0, player.getEyeHeight(), 0), 20, 5, ParticleTypes.POOF, ParticleDirection.INWARD); + spawnParticles(level, getLocation(itemStack.getTag()).add(0, player.getEyeHeight(), 0), 20, 0.2, ParticleTypes.END_ROD, ParticleDirection.OUTWARD); + } else { + if (rangeCheck(player.position(), getLocation(itemStack.getTag()))) { + Vec3 vec = getLocation(itemStack.getTag()); + player.teleportTo(vec.x, vec.y, vec.z); + } else { + MessageDist(); + } + } + } else { + MessageWrongDim(); + } + } else { + itemStack.setTag(setLocation(level, player, pos, itemStack.getTag())); + if (level.isClientSide) { + MessageLocationSet(); + } + } } private Vec3 getLocation(@NotNull CompoundTag cTag) { @@ -79,6 +85,18 @@ public class TeleportScroll extends BaseItem { ); } + private CompoundTag setLocation(@NotNull Level level, Player player, @NotNull Vec3 pos, @NotNull CompoundTag cTag) { + cTag.putDouble("teleport_x", pos.x); + cTag.putDouble("teleport_y", pos.y); + cTag.putDouble("teleport_z", pos.z); + cTag.putString("teleport_dim", dim(level)); + return cTag; + } + + protected boolean dimCheck(Player player, CompoundTag cTag) { + return cTag != null && cTag.contains("teleport_dim") && cTag.getString("teleport_dim").equals(dim(player.level())); + } + @Override public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) { if (pStack.getTag() != null && locationSet(pStack.getTag())) { @@ -95,7 +113,19 @@ public class TeleportScroll extends BaseItem { } + protected boolean rangeCheck(@NotNull Vec3 p1, Vec3 p2) { + return ConfigServer.C_TELEPORT_SCROLL_RANGE.get() == 0 || p1.subtract(p2).length() < ConfigServer.C_TELEPORT_SCROLL_RANGE.get(); + } + protected void MessageLocationSet() { Minecraft.getInstance().player.sendSystemMessage(Component.translatable(String.format("message.%s.scroll_teleport.set", MODID))); } + + protected void MessageWrongDim() { + Minecraft.getInstance().player.sendSystemMessage(Component.translatable(String.format("message.%s.scroll_teleport.dim", MODID))); + } + + protected void MessageDist() { + Minecraft.getInstance().player.sendSystemMessage(Component.translatable(String.format("message.%s.scroll_teleport.dist", MODID))); + } } diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollPersistent.java b/src/main/java/com/jenny/magic/items/TeleportScrollPersistent.java new file mode 100644 index 0000000..894ae7d --- /dev/null +++ b/src/main/java/com/jenny/magic/items/TeleportScrollPersistent.java @@ -0,0 +1,23 @@ +package com.jenny.magic.items; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public class TeleportScrollPersistent extends TeleportScroll { + + public TeleportScrollPersistent(Properties pProperties) { + super(pProperties); + } + + @Override + public boolean isFoil(@NotNull ItemStack pStack) { + return true; + } + + @Override + public Component getName(@NotNull ItemStack pStack) { + return Component.translatable(this.getDescriptionId(pStack)).withStyle(ChatFormatting.DARK_PURPLE); + } +} diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollRandom.java b/src/main/java/com/jenny/magic/items/TeleportScrollRandom.java new file mode 100644 index 0000000..1905a06 --- /dev/null +++ b/src/main/java/com/jenny/magic/items/TeleportScrollRandom.java @@ -0,0 +1,104 @@ +package com.jenny.magic.items; + +import com.jenny.magic.config.ConfigServer; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.RandomSource; +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.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.jenny.magic.Magic.MODID; + +public class TeleportScrollRandom extends BaseItem { + public TeleportScrollRandom(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) { + if (itemStack.getTag() != null && itemStack.getTag().contains("teleport_x")) { + Vec3 pos = getPos(itemStack.getTag()); + player.teleportTo(pos.x, pos.y, pos.z); + spawnParticles(player.level(), player.position().add(0, player.getEyeHeight(), 0), 20, 5, ParticleTypes.POOF, ParticleDirection.INWARD); + spawnParticles(player.level(), player.position().add(0, player.getEyeHeight(), 0), 20, 0.2, ParticleTypes.END_ROD, ParticleDirection.OUTWARD); + itemStack.shrink(1); + } else { + int maxDist = ConfigServer.C_TELEPORT_SCROLL_RANGE_RANDOM.get(); + RandomSource rng = player.level().getRandom(); + Vec3 randomLocation = new Vec3( + rng.nextIntBetweenInclusive(-maxDist, maxDist), + 0, + rng.nextIntBetweenInclusive(-maxDist, maxDist) + ); + System.out.println("test123 " + randomLocation.x + ";" + randomLocation.z); + BlockPos blockPos = new BlockPos((int) randomLocation.x, 0, (int) randomLocation.z); + int yMax = player.level().getChunk(((int) randomLocation.x) >> 4, ((int) randomLocation.z) >> 4, ChunkStatus.FULL, true).getHeight(Heightmap.Types.WORLD_SURFACE, ((int) randomLocation.x) % 16, ((int) randomLocation.z) % 16); + randomLocation = randomLocation.add(0, yMax + 1, 0); + spawnParticles(player.level(), player.position().add(0, player.getEyeHeight(), 0), 20, 5, ParticleTypes.POOF, ParticleDirection.INWARD); + spawnParticles(player.level(), randomLocation.add(0, player.getEyeHeight(), 0), 20, 0.2, ParticleTypes.END_ROD, ParticleDirection.OUTWARD); + itemStack.setTag(setPos(player.position(), itemStack.getTag())); + player.teleportTo(randomLocation.x, randomLocation.y, randomLocation.z); + } + } + } + + protected CompoundTag setPos(@NotNull Vec3 pos, CompoundTag compoundTag) { + compoundTag = compoundTag == null ? new CompoundTag() : compoundTag; + compoundTag.putDouble("teleport_x", pos.x); + compoundTag.putDouble("teleport_y", pos.y); + compoundTag.putDouble("teleport_z", pos.z); + return compoundTag; + } + + protected Vec3 getPos(@NotNull CompoundTag compoundTag) { + return new Vec3( + compoundTag.getDouble("teleport_x"), + compoundTag.getDouble("teleport_y"), + compoundTag.getDouble("teleport_z") + ); + } + + @Override + public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) { + if (pStack.getTag() != null && pStack.getTag().contains("teleport_x")) { + String key = String.format("tooltip.%s.%s.back", MODID, this); + MutableComponent toolTip = Component.translatable(key); + if (!toolTip.getString().equals(key)) { + Vec3 pos = getPos(pStack.getTag()); + MutableComponent toolTipPos = Component.literal((int) pos.x + ";" + (int) pos.y + ";" + (int) pos.z); + pTooltipComponents.add(toolTip.withStyle(ChatFormatting.DARK_BLUE).append(toolTipPos.withStyle(ChatFormatting.WHITE))); + } + } else { + super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); + } + } +} diff --git a/src/main/java/com/jenny/magic/items/items.java b/src/main/java/com/jenny/magic/items/items.java index aa08658..e0ef3d8 100644 --- a/src/main/java/com/jenny/magic/items/items.java +++ b/src/main/java/com/jenny/magic/items/items.java @@ -11,8 +11,10 @@ import static com.jenny.magic.Magic.MODID; public class items { public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); public static final RegistryObject WAND_HURTFUL = ITEMS.register("wand_hurtful", () -> new HurtfulWand(new Item.Properties())); - public static final RegistryObject SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new TeleportScroll(new Item.Properties().stacksTo(1))); - public static final RegistryObject SCROLL_TELEPORT_CONSUME = ITEMS.register("scroll_teleport_consume", () -> new TeleportScrollConsumable(new Item.Properties().stacksTo(16))); + 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 void register(IEventBus bus) { ITEMS.register(bus); diff --git a/src/main/resources/assets/magic/lang/en_us.json b/src/main/resources/assets/magic/lang/en_us.json index 4cff07c..5eb2c9e 100644 --- a/src/main/resources/assets/magic/lang/en_us.json +++ b/src/main/resources/assets/magic/lang/en_us.json @@ -1,8 +1,12 @@ { "item.magic.scroll_teleport": "Teleport scroll", - "item.magic.scroll_teleport_consume": "Brittle teleport scroll", - - "tooltip.magic.scroll_teleport.unset": "no location set", - "tooltip.magic.scroll_teleport.set": "teleports to: ", - "message.magic.scroll_teleport.set": "location set" + "item.magic.scroll_teleport_brittle": "Brittle teleport scroll", + "item.magic.scroll_teleport_random": "Random teleport scroll", + "tooltip.magic.scroll_teleport.unset": "No location set", + "tooltip.magic.scroll_teleport.set": "Teleports to: ", + "tooltip.magic.scroll_teleport_random": "Using it a second time teleports you back", + "tooltip.magic.scroll_teleport_random.back": "Will teleport you back to: ", + "message.magic.scroll_teleport.set": "Location set.", + "message.magic.scroll_teleport.dim": "You're not in the same dimension.", + "message.magic.scroll_teleport.dist": "You're too far away" } \ No newline at end of file diff --git a/src/main/resources/assets/magic/textures/item/scroll_teleport.png b/src/main/resources/assets/magic/textures/item/scroll_teleport.png new file mode 100644 index 0000000..1e279df Binary files /dev/null and b/src/main/resources/assets/magic/textures/item/scroll_teleport.png differ diff --git a/src/main/resources/assets/magic/textures/item/scroll_teleport_brittle.png b/src/main/resources/assets/magic/textures/item/scroll_teleport_brittle.png new file mode 100644 index 0000000..9e8f29c Binary files /dev/null and b/src/main/resources/assets/magic/textures/item/scroll_teleport_brittle.png differ diff --git a/src/main/resources/assets/magic/textures/item/wand_hurtful.png b/src/main/resources/assets/magic/textures/item/wand_hurtful.png new file mode 100644 index 0000000..9eb3a40 Binary files /dev/null and b/src/main/resources/assets/magic/textures/item/wand_hurtful.png differ