random teleport scroll

This commit is contained in:
Jenny 2025-03-21 00:59:11 +01:00
parent a93b0858bc
commit 43b806a0b3
Signed by: Jenny
GPG Key ID: 2072A14E40940632
12 changed files with 275 additions and 30 deletions

View File

@ -1,12 +1,15 @@
package com.jenny.magic; package com.jenny.magic;
import com.jenny.magic.config.ConfigServer;
import com.jenny.magic.entities.entities; import com.jenny.magic.entities.entities;
import com.jenny.magic.items.items; import com.jenny.magic.items.items;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod; 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.FMLClientSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
@ -22,6 +25,7 @@ public class Magic {
entities.register(modEventBus); entities.register(modEventBus);
items.register(modEventBus); items.register(modEventBus);
creativeTab.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) @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)

View File

@ -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<Integer> 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();
}
}

View File

@ -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));
}
}

View File

@ -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> item : items.ITEMS.getEntries()) {
simpleItem(item);
}
}
private ItemModelBuilder simpleItem(@NotNull RegistryObject<Item> item) {
return withExistingParent(item.getId().getPath(),
new ResourceLocation("item/generated")).texture("layer0",
new ResourceLocation(MODID, "item/" + item.getId().getPath()));
}
}

View File

@ -1,5 +1,6 @@
package com.jenny.magic.items; package com.jenny.magic.items;
import com.jenny.magic.config.ConfigServer;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
@ -40,35 +41,40 @@ public class TeleportScroll extends BaseItem {
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level) { public static String dim(Level level) {
if (itemStack.getTag() == null) { return level.dimension().location().toString();
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();
}
}
} }
private boolean locationSet(@NotNull CompoundTag cTag) { private boolean locationSet(@NotNull CompoundTag cTag) {
return cTag.contains("teleport_x") && cTag.contains("teleport_y") && cTag.contains("teleport_z"); return cTag.contains("teleport_x") && cTag.contains("teleport_y") && cTag.contains("teleport_z");
} }
private CompoundTag setLocation(@NotNull Vec3 playerPos, @NotNull CompoundTag cTag) { protected void use(Vec3 pos, Player player, @NotNull ItemStack itemStack, Level level) {
cTag.putDouble("teleport_x", playerPos.x); if (itemStack.getTag() == null) {
cTag.putDouble("teleport_y", playerPos.y); itemStack.setTag(new CompoundTag());
cTag.putDouble("teleport_z", playerPos.z); }
return cTag; 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) { 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 @Override
public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List<Component> pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) { public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List<Component> pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) {
if (pStack.getTag() != null && locationSet(pStack.getTag())) { 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() { protected void MessageLocationSet() {
Minecraft.getInstance().player.sendSystemMessage(Component.translatable(String.format("message.%s.scroll_teleport.set", MODID))); 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)));
}
} }

View File

@ -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);
}
}

View File

@ -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<ItemStack> 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<Component> 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);
}
}
}

View File

@ -11,8 +11,10 @@ import static com.jenny.magic.Magic.MODID;
public class items { public class items {
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
public static final RegistryObject<Item> WAND_HURTFUL = ITEMS.register("wand_hurtful", () -> new HurtfulWand(new Item.Properties())); public static final RegistryObject<Item> WAND_HURTFUL = ITEMS.register("wand_hurtful", () -> new HurtfulWand(new Item.Properties()));
public static final RegistryObject<Item> SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new TeleportScroll(new Item.Properties().stacksTo(1))); public static final RegistryObject<Item> SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new TeleportScrollPersistent(new Item.Properties().stacksTo(1)));
public static final RegistryObject<Item> SCROLL_TELEPORT_CONSUME = ITEMS.register("scroll_teleport_consume", () -> new TeleportScrollConsumable(new Item.Properties().stacksTo(16))); public static final RegistryObject<Item> SCROLL_TELEPORT_BRITTLE = ITEMS.register("scroll_teleport_brittle", () -> new TeleportScrollConsumable(new Item.Properties().stacksTo(16)));
public static final RegistryObject<Item> SCROLL_TELEPORT_RANDOM = ITEMS.register("scroll_teleport_random", () -> new TeleportScrollRandom(new Item.Properties().stacksTo(1)));
public static void register(IEventBus bus) { public static void register(IEventBus bus) {
ITEMS.register(bus); ITEMS.register(bus);

View File

@ -1,8 +1,12 @@
{ {
"item.magic.scroll_teleport": "Teleport scroll", "item.magic.scroll_teleport": "Teleport scroll",
"item.magic.scroll_teleport_consume": "Brittle teleport scroll", "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.unset": "No location set",
"tooltip.magic.scroll_teleport.set": "teleports to: ", "tooltip.magic.scroll_teleport.set": "Teleports to: ",
"message.magic.scroll_teleport.set": "location set" "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"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B