返回提交历史
Modified
gradle.properties
+1
-1
Modified
src/main/java/com/xfestudio/mydimension/MyDimensionEvents.java
+26
-84
Modified
src/main/java/com/xfestudio/mydimension/item/RiftItem.java
+43
-0
XFEstudio/MyDimension
修复部分问题
44edea4
代码差异
3 个文件
+70
-85
@@ -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
@@ -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
}
@@ -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
}