random teleport scroll
This commit is contained in:
parent
a93b0858bc
commit
43b806a0b3
@ -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)
|
||||
|
24
src/main/java/com/jenny/magic/config/ConfigServer.java
Normal file
24
src/main/java/com/jenny/magic/config/ConfigServer.java
Normal 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();
|
||||
}
|
||||
}
|
22
src/main/java/com/jenny/magic/datagen/DataGenerators.java
Normal file
22
src/main/java/com/jenny/magic/datagen/DataGenerators.java
Normal 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));
|
||||
}
|
||||
}
|
@ -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()));
|
||||
}
|
||||
}
|
@ -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<Component> 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)));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
104
src/main/java/com/jenny/magic/items/TeleportScrollRandom.java
Normal file
104
src/main/java/com/jenny/magic/items/TeleportScrollRandom.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -11,8 +11,10 @@ import static com.jenny.magic.Magic.MODID;
|
||||
public class items {
|
||||
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> SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new TeleportScroll(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 = ITEMS.register("scroll_teleport", () -> new TeleportScrollPersistent(new Item.Properties().stacksTo(1)));
|
||||
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) {
|
||||
ITEMS.register(bus);
|
||||
|
@ -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"
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 163 B |
Binary file not shown.
After Width: | Height: | Size: 508 B |
BIN
src/main/resources/assets/magic/textures/item/wand_hurtful.png
Normal file
BIN
src/main/resources/assets/magic/textures/item/wand_hurtful.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 97 B |
Loading…
x
Reference in New Issue
Block a user