XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

MyDimension

【Java】我的维度模组

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/MyDimension

修复部分问题

44edea4
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

3 个文件 +70 -85
Modified gradle.properties +1 -1
@@ -11,7 +11,7 @@ loader_version_range=[47,)
11 11 mod_id=mydimension
12 12 mod_name=\u6211\u7684\u7ef4\u5ea6
13 13 mod_license=CC0-1.0
14 mod_version=1.1.0
14 mod_version=1.1.1
15 15 mod_group_id=com.xfestudio.mydimension
16 16 maven_group=com.xfestudio
17 17 archives_base_name=mydimension
Modified src/main/java/com/xfestudio/mydimension/MyDimensionEvents.java +26 -84
@@ -3,92 +3,36 @@ package com.xfestudio.mydimension;
3 3 import com.mojang.brigadier.StringReader;
4 4 import com.mojang.brigadier.exceptions.CommandSyntaxException;
5 5 import com.xfestudio.mydimension.item.RiftItem;
6 import com.xfestudio.mydimension.registry.ModItems;
7 6 import com.xfestudio.mydimension.world.ModDimensions;
8 import net.minecraft.core.BlockPos;
9 7 import net.minecraft.commands.CommandSourceStack;
10 8 import net.minecraft.commands.arguments.EntityArgument;
11 9 import net.minecraft.commands.arguments.selector.EntitySelector;
12 10 import net.minecraft.network.chat.Component;
13 import net.minecraft.server.level.ServerLevel;
14 11 import net.minecraft.server.level.ServerPlayer;
15 import net.minecraft.sounds.SoundEvents;
16 import net.minecraft.sounds.SoundSource;
17 import net.minecraft.world.InteractionHand;
18 import net.minecraft.world.InteractionResult;
19 import net.minecraft.world.entity.Entity;
20 import net.minecraft.world.entity.LivingEntity;
21 12 import net.minecraft.world.entity.Mob;
22 import net.minecraft.world.item.ItemStack;
23 import net.minecraft.world.level.Level;
24 13 import net.minecraftforge.event.CommandEvent;
25 import net.minecraftforge.event.entity.EntityJoinLevelEvent;
26 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
27 import net.minecraftforge.eventbus.api.EventPriority;
14 import net.minecraftforge.event.entity.living.MobSpawnEvent;
15 import net.minecraftforge.eventbus.api.Event;
28 16 import net.minecraftforge.eventbus.api.SubscribeEvent;
29 17
30 18 import java.util.Collection;
31 19 import java.util.Locale;
32 20
33 21 public class MyDimensionEvents {
34 private static final String IMPORTED_TO_ETHEREAL_MIND = "mydimension_imported_to_ethereal_mind";
35
36 22 @SubscribeEvent
37 public void preventMobsInEtherealMind(EntityJoinLevelEvent event) {
38 Entity entity = event.getEntity();
39 if (event.getLevel().dimension().equals(ModDimensions.ETHEREAL_MIND)
40 && entity instanceof Mob
41 && !entity.getPersistentData().getBoolean(IMPORTED_TO_ETHEREAL_MIND)) {
42 event.setCanceled(true);
23 public void preventSpawnPlacementInEtherealMind(MobSpawnEvent.PositionCheck event) {
24 if (event.getLevel().getLevel().dimension().equals(ModDimensions.ETHEREAL_MIND)
25 && !event.getEntity().getPersistentData().getBoolean(RiftItem.IMPORTED_TO_ETHEREAL_MIND)) {
26 event.setResult(Event.Result.DENY);
43 27 }
44 28 }
45 29
46 @SubscribeEvent(priority = EventPriority.HIGHEST)
47 public void sendMobToEtherealMind(PlayerInteractEvent.EntityInteract event) {
48 sendTargetToEtherealMind(event, event.getTarget());
49 }
50
51 @SubscribeEvent(priority = EventPriority.HIGHEST)
52 public void sendSpecificMobToEtherealMind(PlayerInteractEvent.EntityInteractSpecific event) {
53 sendTargetToEtherealMind(event, event.getTarget());
54 }
55
56 private static void sendTargetToEtherealMind(PlayerInteractEvent event, Entity targetEntity) {
57 if (event.getHand() != InteractionHand.MAIN_HAND || !event.getEntity().isShiftKeyDown()) {
58 return;
59 }
60
61 if (!(event.getEntity() instanceof ServerPlayer player) || !(targetEntity instanceof LivingEntity target) || target instanceof ServerPlayer) {
62 return;
63 }
64
65 ItemStack stack = player.getMainHandItem();
66 if (!stack.is(ModItems.RIFT.get())) {
67 return;
68 }
69
70 event.setCancellationResult(InteractionResult.SUCCESS);
71 event.setCanceled(true);
72
73 ServerLevel targetLevel = player.getServer().getLevel(ModDimensions.ETHEREAL_MIND);
74 if (targetLevel == null) {
75 player.displayClientMessage(Component.translatable("message.mydimension.missing_dimension"), true);
76 event.setCancellationResult(InteractionResult.FAIL);
77 return;
78 }
79
80 if (target.level().dimension().equals(ModDimensions.ETHEREAL_MIND)) {
81 player.displayClientMessage(Component.translatable("message.mydimension.already_in_ethereal_mind"), true);
82 return;
83 }
84
85 target.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
86 Entity moved = target.changeDimension(targetLevel);
87 if (moved != null) {
88 moved.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
89 moved.moveTo(player.getX(), RiftItem.ETHEREAL_SURFACE_Y, player.getZ(), moved.getYRot(), moved.getXRot());
90 targetLevel.playSound(null, BlockPos.containing(moved.position()), SoundEvents.ENDERMAN_TELEPORT, SoundSource.NEUTRAL, 1.0F, 1.0F);
91 player.getCooldowns().addCooldown(stack.getItem(), 20);
30 @SubscribeEvent
31 public void preventNaturalSpawnsInEtherealMind(MobSpawnEvent.FinalizeSpawn event) {
32 Mob entity = event.getEntity();
33 if (event.getLevel().getLevel().dimension().equals(ModDimensions.ETHEREAL_MIND)
34 && !entity.getPersistentData().getBoolean(RiftItem.IMPORTED_TO_ETHEREAL_MIND)) {
35 event.setSpawnCancelled(true);
92 36 }
93 37 }
94 38
@@ -105,14 +49,9 @@ public class MyDimensionEvents {
105 49 return;
106 50 }
107 51
108 Collection<ServerPlayer> targets = parseExplicitPlayerTargets(source, input.substring(command.length()).trim());
109 if (targets == null) {
110 return;
111 }
112
113 for (ServerPlayer target : targets) {
114 if (!target.getUUID().equals(sourcePlayer.getUUID()) && target.level().dimension().equals(ModDimensions.ETHEREAL_MIND)) {
115 source.sendFailure(Component.translatable("message.mydimension.protected_tp", target.getDisplayName()));
52 for (ServerPlayer mentionedPlayer : parseMentionedPlayers(source, input.substring(command.length()).trim())) {
53 if (!mentionedPlayer.getUUID().equals(sourcePlayer.getUUID()) && mentionedPlayer.level().dimension().equals(ModDimensions.ETHEREAL_MIND)) {
54 source.sendFailure(Component.translatable("message.mydimension.protected_tp", mentionedPlayer.getDisplayName()));
116 55 event.setCanceled(true);
117 56 return;
118 57 }
@@ -124,17 +63,20 @@ public class MyDimensionEvents {
124 63 return space < 0 ? input : input.substring(0, space);
125 64 }
126 65
127 private static Collection<ServerPlayer> parseExplicitPlayerTargets(CommandSourceStack source, String arguments) {
66 private static Collection<ServerPlayer> parseMentionedPlayers(CommandSourceStack source, String arguments) {
67 java.util.Set<ServerPlayer> players = new java.util.HashSet<>();
128 68 if (arguments.isBlank()) {
129 return null;
69 return players;
130 70 }
131 71
132 try {
133 StringReader reader = new StringReader(arguments);
134 EntitySelector selector = EntityArgument.players().parse(reader);
135 return selector.findPlayers(source);
136 } catch (CommandSyntaxException ignored) {
137 return null;
72 for (String argument : arguments.split("\\s+")) {
73 try {
74 StringReader reader = new StringReader(argument);
75 EntitySelector selector = EntityArgument.players().parse(reader);
76 players.addAll(selector.findPlayers(source));
77 } catch (CommandSyntaxException ignored) {
78 }
138 79 }
80 return players;
139 81 }
140 82 }
Modified src/main/java/com/xfestudio/mydimension/item/RiftItem.java +43 -0
@@ -8,7 +8,10 @@ import net.minecraft.server.level.ServerPlayer;
8 8 import net.minecraft.sounds.SoundEvents;
9 9 import net.minecraft.sounds.SoundSource;
10 10 import net.minecraft.world.InteractionHand;
11 import net.minecraft.world.InteractionResult;
11 12 import net.minecraft.world.InteractionResultHolder;
13 import net.minecraft.world.entity.Entity;
14 import net.minecraft.world.entity.LivingEntity;
12 15 import net.minecraft.world.entity.player.Player;
13 16 import net.minecraft.world.item.Item;
14 17 import net.minecraft.world.item.ItemStack;
@@ -16,6 +19,7 @@ import net.minecraft.world.level.Level;
16 19
17 20 public class RiftItem extends Item {
18 21 public static final double ETHEREAL_SURFACE_Y = 66.0D;
22 public static final String IMPORTED_TO_ETHEREAL_MIND = "mydimension_imported_to_ethereal_mind";
19 23
20 24 public RiftItem(Properties properties) {
21 25 super(properties);
@@ -40,6 +44,23 @@ public class RiftItem extends Item {
40 44 return InteractionResultHolder.sidedSuccess(stack, false);
41 45 }
42 46
47 @Override
48 public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity target, InteractionHand hand) {
49 if (hand != InteractionHand.MAIN_HAND || !player.isShiftKeyDown()) {
50 return InteractionResult.PASS;
51 }
52
53 if (player.level().isClientSide()) {
54 return InteractionResult.SUCCESS;
55 }
56
57 if (player instanceof ServerPlayer serverPlayer) {
58 sendToEtherealMind(serverPlayer, target, stack);
59 }
60
61 return InteractionResult.CONSUME;
62 }
63
43 64 private static void teleport(ServerPlayer player) {
44 65 ServerLevel currentLevel = player.serverLevel();
45 66 boolean inEtherealMind = currentLevel.dimension().equals(ModDimensions.ETHEREAL_MIND);
@@ -68,4 +89,26 @@ public class RiftItem extends Item {
68 89 private static double overworldSpawnY(ServerLevel level) {
69 90 return level.getSharedSpawnPos().getY() + 1.0D;
70 91 }
92
93 private static void sendToEtherealMind(ServerPlayer player, LivingEntity target, ItemStack stack) {
94 ServerLevel targetLevel = player.getServer().getLevel(ModDimensions.ETHEREAL_MIND);
95 if (targetLevel == null) {
96 player.displayClientMessage(Component.translatable("message.mydimension.missing_dimension"), true);
97 return;
98 }
99
100 if (target.level().dimension().equals(ModDimensions.ETHEREAL_MIND)) {
101 player.displayClientMessage(Component.translatable("message.mydimension.already_in_ethereal_mind"), true);
102 return;
103 }
104
105 target.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
106 Entity moved = target.changeDimension(targetLevel);
107 if (moved != null) {
108 moved.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
109 moved.moveTo(player.getX(), ETHEREAL_SURFACE_Y, player.getZ(), moved.getYRot(), moved.getXRot());
110 targetLevel.playSound(null, BlockPos.containing(moved.position()), SoundEvents.ENDERMAN_TELEPORT, SoundSource.NEUTRAL, 1.0F, 1.0F);
111 player.getCooldowns().addCooldown(stack.getItem(), 20);
112 }
113 }
71 114 }