返回提交历史
Modified
README.md
+7
-4
Modified
gradle.properties
+1
-1
Modified
src/main/java/com/xfestudio/mydimension/MyDimension.java
+7
-0
Modified
src/main/java/com/xfestudio/mydimension/MyDimensionEvents.java
+15
-15
Added
src/main/java/com/xfestudio/mydimension/client/RiftActionScreen.java
+55
-0
Added
src/main/java/com/xfestudio/mydimension/client/RiftClient.java
+9
-0
Added
src/main/java/com/xfestudio/mydimension/item/RiftAction.java
+56
-0
Modified
src/main/java/com/xfestudio/mydimension/item/RiftItem.java
+123
-29
Added
src/main/java/com/xfestudio/mydimension/network/ModNetwork.java
+28
-0
Added
src/main/java/com/xfestudio/mydimension/network/SetRiftActionPacket.java
+48
-0
Modified
src/main/java/com/xfestudio/mydimension/world/ModDimensions.java
+55
-0
Modified
src/main/resources/assets/mydimension/lang/en_us.json
+12
-2
Modified
src/main/resources/assets/mydimension/lang/zh_cn.json
+12
-2
Added
src/main/resources/data/mydimension/dimension/mirror_mind.json
+11
-0
Added
src/main/resources/data/mydimension/dimension/nature_mind.json
+26
-0
Added
src/main/resources/data/mydimension/dimension/water_mind.json
+26
-0
Added
src/main/resources/data/mydimension/dimension_type/mirror_mind.json
+25
-0
Added
src/main/resources/data/mydimension/dimension_type/nature_mind.json
+25
-0
Added
src/main/resources/data/mydimension/dimension_type/water_mind.json
+25
-0
Added
src/main/resources/data/mydimension/worldgen/biome/nature_mind.json
+26
-0
Added
src/main/resources/data/mydimension/worldgen/biome/water_mind.json
+24
-0
XFEstudio/MyDimension
添加多个心境维度
f56275e
代码差异
21 个文件
+616
-53
@@ -1,13 +1,16 @@
1
1
# 我的维度
2
2
3
Forge 1.20.1 模组,添加裂罅物品与空灵心境维度。
3
Forge 1.20.1 模组,添加裂罅物品与多个心境维度。
4
4
5
5
## 内容
6
6
7
- 裂罅:手持右键可在任意维度进入空灵心境,在空灵心境中右键返回主世界。
7
- 裂罅:Shift + 右键打开动作轮盘;选择后,普通右键执行当前动作。
8
8
- 配方:4 个黑色带釉陶瓦按上下左右十字形摆放,中间留空。
9
- 空灵心境:新的超平坦维度,底部 3 层石头、上方 3 层泥土、顶层 3 层石英块。
10
- 维度限制:空灵心境内不会生成生物;在该维度内的玩家不能被其他玩家用 `/tp` 或 `/teleport` 传送。
9
- 空灵心境:超平坦维度,底部 60 层石头、3 层泥土、3 层石英块。
10
- 镜之心境:使用与主世界相同的地形生成配置和世界种子。
11
- 水之心境:底部 20 层石头、5 层砂砾、50 层水。
12
- 自然心境:草原超平坦,50 层石头、9 层泥土、1 层草方块。
13
- 维度限制:心境维度内不会自然生成生物;在心境内的玩家不能被其他玩家用 `/tp` 或 `/teleport` 传送。
11
14
12
15
## 构建
13
16
@@ -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.2.2
14
mod_version=1.3.0
15
15
mod_group_id=com.xfestudio.mydimension
16
16
maven_group=com.xfestudio
17
17
archives_base_name=mydimension
@@ -1,8 +1,10 @@
1
1
package com.xfestudio.mydimension;
2
2
3
3
import com.mojang.logging.LogUtils;
4
import com.xfestudio.mydimension.network.ModNetwork;
4
5
import com.xfestudio.mydimension.registry.ModItems;
5
6
import net.minecraftforge.common.MinecraftForge;
7
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
6
8
import net.minecraftforge.eventbus.api.IEventBus;
7
9
import net.minecraftforge.fml.common.Mod;
8
10
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
@@ -18,6 +20,11 @@ public class MyDimension {
18
20
19
21
ModItems.register(modEventBus);
20
22
modEventBus.addListener(ModItems::addCreative);
23
modEventBus.addListener(this::commonSetup);
21
24
MinecraftForge.EVENT_BUS.register(new MyDimensionEvents());
22
25
}
26
27
private void commonSetup(FMLCommonSetupEvent event) {
28
event.enqueueWork(ModNetwork::register);
29
}
23
30
}
@@ -2,6 +2,7 @@ package com.xfestudio.mydimension;
2
2
3
3
import com.mojang.brigadier.StringReader;
4
4
import com.mojang.brigadier.exceptions.CommandSyntaxException;
5
import com.xfestudio.mydimension.item.RiftAction;
5
6
import com.xfestudio.mydimension.item.RiftItem;
6
7
import com.xfestudio.mydimension.registry.ModItems;
7
8
import com.xfestudio.mydimension.world.ModDimensions;
@@ -47,7 +48,7 @@ public class MyDimensionEvents {
47
48
48
49
@SubscribeEvent
49
50
public void preventSpawnPlacementInEtherealMind(MobSpawnEvent.PositionCheck event) {
50
if (event.getLevel().getLevel().dimension().equals(ModDimensions.ETHEREAL_MIND)
51
if (ModDimensions.isMindDimension(event.getLevel().getLevel().dimension())
51
52
&& shouldBlockSpawn(event.getEntity(), event.getSpawnType())) {
52
53
event.setResult(Event.Result.DENY);
53
54
}
@@ -56,7 +57,7 @@ public class MyDimensionEvents {
56
57
@SubscribeEvent
57
58
public void preventNaturalSpawnsInEtherealMind(MobSpawnEvent.FinalizeSpawn event) {
58
59
Mob entity = event.getEntity();
59
if (event.getLevel().getLevel().dimension().equals(ModDimensions.ETHEREAL_MIND)
60
if (ModDimensions.isMindDimension(event.getLevel().getLevel().dimension())
60
61
&& shouldBlockSpawn(entity, event.getSpawnType())) {
61
62
event.setSpawnCancelled(true);
62
63
}
@@ -76,7 +77,7 @@ public class MyDimensionEvents {
76
77
}
77
78
78
79
for (ServerPlayer mentionedPlayer : parseMentionedPlayers(source, input.substring(command.length()).trim())) {
79
if (!mentionedPlayer.getUUID().equals(sourcePlayer.getUUID()) && mentionedPlayer.level().dimension().equals(ModDimensions.ETHEREAL_MIND)) {
80
if (!mentionedPlayer.getUUID().equals(sourcePlayer.getUUID()) && ModDimensions.isMindDimension(mentionedPlayer.level().dimension())) {
80
81
source.sendFailure(Component.translatable("message.mydimension.protected_tp", mentionedPlayer.getDisplayName()));
81
82
event.setCanceled(true);
82
83
return;
@@ -86,11 +87,11 @@ public class MyDimensionEvents {
86
87
87
88
@SubscribeEvent
88
89
public void finishSleepInEtherealMind(SleepFinishedTimeEvent event) {
89
if (!(event.getLevel() instanceof ServerLevel level) || !level.dimension().equals(ModDimensions.ETHEREAL_MIND)) {
90
if (!(event.getLevel() instanceof ServerLevel level) || !ModDimensions.isMindDimension(level.dimension())) {
90
91
return;
91
92
}
92
93
93
makeEtherealMorning(level, event.getNewTime());
94
makeMindMorning(level, event.getNewTime());
94
95
}
95
96
96
97
private static String firstWord(String input) {
@@ -98,15 +99,14 @@ public class MyDimensionEvents {
98
99
return space < 0 ? input : input.substring(0, space);
99
100
}
100
101
101
private static void makeEtherealMorning(ServerLevel etherealMind, long morning) {
102
ServerLevel overworld = etherealMind.getServer().overworld();
103
overworld.setDayTime(morning);
104
overworld.setWeatherParameters(CLEAR_WEATHER_DURATION, 0, false, false);
105
syncEtherealMindWeather(etherealMind);
106
syncEtherealMindTime(etherealMind);
102
private static void makeMindMorning(ServerLevel level, long morning) {
103
level.setDayTime(morning);
104
level.setWeatherParameters(CLEAR_WEATHER_DURATION, 0, false, false);
105
syncMindWeather(level);
106
syncMindTime(level);
107
107
}
108
108
109
private static void syncEtherealMindWeather(ServerLevel level) {
109
private static void syncMindWeather(ServerLevel level) {
110
110
level.setRainLevel(0.0F);
111
111
level.setThunderLevel(0.0F);
112
112
level.getServer().getPlayerList().broadcastAll(
@@ -123,7 +123,7 @@ public class MyDimensionEvents {
123
123
);
124
124
}
125
125
126
private static void syncEtherealMindTime(ServerLevel level) {
126
private static void syncMindTime(ServerLevel level) {
127
127
level.getServer().getPlayerList().broadcastAll(
128
128
new ClientboundSetTimePacket(level.getGameTime(), level.getDayTime(), level.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)),
129
129
level.dimension()
@@ -131,7 +131,7 @@ public class MyDimensionEvents {
131
131
}
132
132
133
133
private static void sendTargetToEtherealMind(PlayerInteractEvent event, Entity targetEntity) {
134
if (event.getHand() != InteractionHand.MAIN_HAND || !event.getEntity().isShiftKeyDown()) {
134
if (event.getHand() != InteractionHand.MAIN_HAND || event.getEntity().isShiftKeyDown()) {
135
135
return;
136
136
}
137
137
@@ -140,7 +140,7 @@ public class MyDimensionEvents {
140
140
}
141
141
142
142
ItemStack stack = player.getMainHandItem();
143
if (!stack.is(ModItems.RIFT.get())) {
143
if (!stack.is(ModItems.RIFT.get()) || RiftItem.getSelectedAction(stack) != RiftAction.SEND_MOB) {
144
144
return;
145
145
}
146
146
@@ -0,0 +1,55 @@
1
package com.xfestudio.mydimension.client;
2
3
import com.xfestudio.mydimension.item.RiftAction;
4
import com.xfestudio.mydimension.network.ModNetwork;
5
import com.xfestudio.mydimension.network.SetRiftActionPacket;
6
import net.minecraft.client.gui.GuiGraphics;
7
import net.minecraft.client.gui.components.Button;
8
import net.minecraft.client.gui.screens.Screen;
9
import net.minecraft.network.chat.Component;
10
11
public class RiftActionScreen extends Screen {
12
private static final int BUTTON_WIDTH = 104;
13
private static final int BUTTON_HEIGHT = 20;
14
private static final int RADIUS = 72;
15
16
public RiftActionScreen() {
17
super(Component.translatable("screen.mydimension.rift_actions"));
18
}
19
20
@Override
21
protected void init() {
22
RiftAction[] actions = RiftAction.values();
23
int centerX = width / 2;
24
int centerY = height / 2;
25
26
for (int i = 0; i < actions.length; i++) {
27
RiftAction action = actions[i];
28
double angle = -Math.PI / 2.0D + (Math.PI * 2.0D * i / actions.length);
29
int x = centerX + (int) Math.round(Math.cos(angle) * RADIUS) - BUTTON_WIDTH / 2;
30
int y = centerY + (int) Math.round(Math.sin(angle) * RADIUS) - BUTTON_HEIGHT / 2;
31
addRenderableWidget(Button.builder(action.displayName(), button -> select(action))
32
.bounds(x, y, BUTTON_WIDTH, BUTTON_HEIGHT)
33
.build());
34
}
35
}
36
37
@Override
38
public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) {
39
renderBackground(graphics);
40
graphics.drawCenteredString(font, title, width / 2, height / 2 - 8, 0xFFFFFF);
41
super.render(graphics, mouseX, mouseY, partialTick);
42
}
43
44
@Override
45
public boolean isPauseScreen() {
46
return false;
47
}
48
49
private void select(RiftAction action) {
50
ModNetwork.CHANNEL.sendToServer(new SetRiftActionPacket(action));
51
if (minecraft != null) {
52
minecraft.setScreen(null);
53
}
54
}
55
}
@@ -0,0 +1,9 @@
1
package com.xfestudio.mydimension.client;
2
3
import net.minecraft.client.Minecraft;
4
5
public class RiftClient {
6
public static void openActionScreen() {
7
Minecraft.getInstance().setScreen(new RiftActionScreen());
8
}
9
}
@@ -0,0 +1,56 @@
1
package com.xfestudio.mydimension.item;
2
3
import com.xfestudio.mydimension.world.ModDimensions;
4
import net.minecraft.network.chat.Component;
5
import net.minecraft.resources.ResourceKey;
6
import net.minecraft.world.level.Level;
7
8
import java.util.Locale;
9
10
public enum RiftAction {
11
ETHEREAL_MIND("ethereal_mind", "action.mydimension.ethereal_mind", ModDimensions.ETHEREAL_MIND),
12
MIRROR_MIND("mirror_mind", "action.mydimension.mirror_mind", ModDimensions.MIRROR_MIND),
13
WATER_MIND("water_mind", "action.mydimension.water_mind", ModDimensions.WATER_MIND),
14
NATURE_MIND("nature_mind", "action.mydimension.nature_mind", ModDimensions.NATURE_MIND),
15
SEND_MOB("send_mob", "action.mydimension.send_mob", null);
16
17
private final String id;
18
private final String translationKey;
19
private final ResourceKey<Level> targetDimension;
20
21
RiftAction(String id, String translationKey, ResourceKey<Level> targetDimension) {
22
this.id = id;
23
this.translationKey = translationKey;
24
this.targetDimension = targetDimension;
25
}
26
27
public String id() {
28
return id;
29
}
30
31
public Component displayName() {
32
return Component.translatable(translationKey);
33
}
34
35
public ResourceKey<Level> targetDimension() {
36
return targetDimension;
37
}
38
39
public boolean teleportsPlayer() {
40
return targetDimension != null;
41
}
42
43
public static RiftAction byId(String id) {
44
for (RiftAction action : values()) {
45
if (action.id.equals(id)) {
46
return action;
47
}
48
}
49
50
try {
51
return valueOf(id.toUpperCase(Locale.ROOT));
52
} catch (IllegalArgumentException ignored) {
53
return ETHEREAL_MIND;
54
}
55
}
56
}
@@ -1,7 +1,9 @@
1
1
package com.xfestudio.mydimension.item;
2
2
3
import com.xfestudio.mydimension.client.RiftClient;
3
4
import com.xfestudio.mydimension.world.ModDimensions;
4
5
import net.minecraft.core.BlockPos;
6
import net.minecraft.core.registries.Registries;
5
7
import net.minecraft.nbt.CompoundTag;
6
8
import net.minecraft.network.chat.Component;
7
9
import net.minecraft.resources.ResourceKey;
@@ -20,19 +22,23 @@ import net.minecraft.world.entity.projectile.ProjectileUtil;
20
22
import net.minecraft.world.item.Item;
21
23
import net.minecraft.world.item.ItemStack;
22
24
import net.minecraft.world.level.Level;
25
import net.minecraft.world.level.levelgen.Heightmap;
23
26
import net.minecraft.world.level.portal.PortalInfo;
24
27
import net.minecraft.world.phys.AABB;
25
28
import net.minecraft.world.phys.EntityHitResult;
26
29
import net.minecraft.world.phys.Vec3;
30
import net.minecraftforge.api.distmarker.Dist;
27
31
import net.minecraftforge.common.util.ITeleporter;
32
import net.minecraftforge.fml.DistExecutor;
28
33
29
34
import java.util.function.Function;
30
35
31
36
public class RiftItem extends Item {
32
37
public static final double ETHEREAL_SURFACE_Y = 66.0D;
33
38
public static final String IMPORTED_TO_ETHEREAL_MIND = "mydimension_imported_to_ethereal_mind";
39
private static final String SELECTED_ACTION_TAG = "SelectedAction";
34
40
private static final String RETURN_POINT_TAG = "ReturnPoint";
35
private static final String ETHEREAL_POINT_TAG = "EtherealPoint";
41
private static final String MIND_POINTS_TAG = "MindPoints";
36
42
private static final String RETURN_DIMENSION_TAG = "Dimension";
37
43
private static final String RETURN_X_TAG = "X";
38
44
private static final String RETURN_Y_TAG = "Y";
@@ -49,17 +55,11 @@ public class RiftItem extends Item {
49
55
ItemStack stack = player.getItemInHand(hand);
50
56
if (player.isShiftKeyDown()) {
51
57
if (level.isClientSide()) {
58
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> RiftClient::openActionScreen);
52
59
return InteractionResultHolder.sidedSuccess(stack, true);
53
60
}
54
61
55
if (player instanceof ServerPlayer serverPlayer) {
56
LivingEntity target = findLookedAtLivingEntity(serverPlayer);
57
if (target != null && sendToEtherealMind(serverPlayer, target, stack)) {
58
return InteractionResultHolder.consume(stack);
59
}
60
}
61
62
return InteractionResultHolder.pass(stack);
62
return InteractionResultHolder.consume(stack);
63
63
}
64
64
65
65
if (level.isClientSide()) {
@@ -67,7 +67,7 @@ public class RiftItem extends Item {
67
67
}
68
68
69
69
if (player instanceof ServerPlayer serverPlayer) {
70
teleport(serverPlayer);
70
executeSelectedAction(serverPlayer, stack);
71
71
serverPlayer.getCooldowns().addCooldown(this, 40);
72
72
}
73
73
@@ -76,7 +76,19 @@ public class RiftItem extends Item {
76
76
77
77
@Override
78
78
public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity target, InteractionHand hand) {
79
if (hand != InteractionHand.MAIN_HAND || !player.isShiftKeyDown()) {
79
if (hand != InteractionHand.MAIN_HAND) {
80
return InteractionResult.PASS;
81
}
82
83
if (player.isShiftKeyDown()) {
84
if (player.level().isClientSide()) {
85
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> RiftClient::openActionScreen);
86
return InteractionResult.SUCCESS;
87
}
88
return InteractionResult.CONSUME;
89
}
90
91
if (getSelectedAction(stack) != RiftAction.SEND_MOB) {
80
92
return InteractionResult.PASS;
81
93
}
82
94
@@ -91,13 +103,39 @@ public class RiftItem extends Item {
91
103
return InteractionResult.CONSUME;
92
104
}
93
105
94
private static void teleport(ServerPlayer player) {
106
public static void setSelectedAction(ItemStack stack, RiftAction action) {
107
stack.getOrCreateTag().putString(SELECTED_ACTION_TAG, action.id());
108
}
109
110
public static RiftAction getSelectedAction(ItemStack stack) {
111
CompoundTag tag = stack.getTag();
112
if (tag == null || !tag.contains(SELECTED_ACTION_TAG)) {
113
return RiftAction.ETHEREAL_MIND;
114
}
115
116
return RiftAction.byId(tag.getString(SELECTED_ACTION_TAG));
117
}
118
119
private static void executeSelectedAction(ServerPlayer player, ItemStack stack) {
120
RiftAction action = getSelectedAction(stack);
121
if (action == RiftAction.SEND_MOB) {
122
LivingEntity target = findLookedAtLivingEntity(player);
123
if (target == null || !sendToEtherealMind(player, target, stack)) {
124
player.displayClientMessage(Component.translatable("message.mydimension.no_mob_target"), true);
125
}
126
return;
127
}
128
129
teleport(player, stack, action.targetDimension());
130
}
131
132
private static void teleport(ServerPlayer player, ItemStack stack, ResourceKey<Level> selectedDimension) {
95
133
ServerLevel currentLevel = player.serverLevel();
96
boolean inEtherealMind = currentLevel.dimension().equals(ModDimensions.ETHEREAL_MIND);
97
ItemStack stack = player.getMainHandItem();
98
ReturnPoint returnPoint = inEtherealMind ? readPoint(stack, RETURN_POINT_TAG) : null;
99
ReturnPoint etherealPoint = inEtherealMind ? null : readPoint(stack, ETHEREAL_POINT_TAG);
100
ServerLevel targetLevel = inEtherealMind ? getReturnLevel(player, returnPoint) : player.getServer().getLevel(ModDimensions.ETHEREAL_MIND);
134
ResourceKey<Level> currentDimension = currentLevel.dimension();
135
boolean returningFromSelectedMind = currentDimension.equals(selectedDimension);
136
ReturnPoint returnPoint = returningFromSelectedMind ? readPoint(stack, RETURN_POINT_TAG) : null;
137
ReturnPoint mindPoint = returningFromSelectedMind ? null : readMindPoint(stack, selectedDimension);
138
ServerLevel targetLevel = returningFromSelectedMind ? getReturnLevel(player, returnPoint) : player.getServer().getLevel(selectedDimension);
101
139
102
140
if (targetLevel == null) {
103
141
player.displayClientMessage(Component.translatable("message.mydimension.missing_dimension"), true);
@@ -106,11 +144,11 @@ public class RiftItem extends Item {
106
144
107
145
double x = player.getX();
108
146
double z = player.getZ();
109
double y = inEtherealMind ? overworldSpawnY(targetLevel) : ETHEREAL_SURFACE_Y;
147
double y = returningFromSelectedMind ? overworldSpawnY(targetLevel) : safeEntryY(targetLevel, selectedDimension, x, z);
110
148
float yRot = player.getYRot();
111
149
float xRot = player.getXRot();
112
150
113
if (inEtherealMind) {
151
if (returningFromSelectedMind) {
114
152
if (returnPoint != null) {
115
153
x = returnPoint.x();
116
154
y = returnPoint.y();
@@ -123,18 +161,23 @@ public class RiftItem extends Item {
123
161
z = spawn.getZ() + 0.5D;
124
162
}
125
163
} else {
126
writePoint(stack, RETURN_POINT_TAG, player);
127
if (etherealPoint != null) {
128
x = etherealPoint.x();
129
y = etherealPoint.y();
130
z = etherealPoint.z();
131
yRot = etherealPoint.yRot();
132
xRot = etherealPoint.xRot();
164
if (!ModDimensions.isMindDimension(currentDimension)) {
165
writePoint(stack, RETURN_POINT_TAG, player);
166
} else {
167
writeMindPoint(stack, currentDimension, player);
168
}
169
170
if (mindPoint != null) {
171
x = mindPoint.x();
172
y = mindPoint.y();
173
z = mindPoint.z();
174
yRot = mindPoint.yRot();
175
xRot = mindPoint.xRot();
133
176
}
134
177
}
135
178
136
if (inEtherealMind) {
137
writePoint(stack, ETHEREAL_POINT_TAG, player);
179
if (returningFromSelectedMind) {
180
writeMindPoint(stack, currentDimension, player);
138
181
}
139
182
140
183
targetLevel.playSound(null, player.blockPosition(), SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1.0F, 1.0F);
@@ -146,6 +189,17 @@ public class RiftItem extends Item {
146
189
return level.getSharedSpawnPos().getY() + 1.0D;
147
190
}
148
191
192
private static double safeEntryY(ServerLevel level, ResourceKey<Level> dimension, double x, double z) {
193
int blockX = (int) Math.floor(x);
194
int blockZ = (int) Math.floor(z);
195
int height = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, blockX, blockZ);
196
if (height > level.getMinBuildHeight()) {
197
return height + 1.0D;
198
}
199
200
return ModDimensions.entryHeight(dimension);
201
}
202
149
203
public static boolean sendToEtherealMind(ServerPlayer player, LivingEntity target, ItemStack stack) {
150
204
ServerLevel targetLevel = player.getServer().getLevel(ModDimensions.ETHEREAL_MIND);
151
205
if (targetLevel == null) {
@@ -203,6 +257,23 @@ public class RiftItem extends Item {
203
257
stack.getOrCreateTag().put(tagName, point);
204
258
}
205
259
260
private static void writeMindPoint(ItemStack stack, ResourceKey<Level> dimension, ServerPlayer player) {
261
CompoundTag mindPoints = stack.getOrCreateTag().getCompound(MIND_POINTS_TAG);
262
writePointToTag(mindPoints, dimension.location().toString(), player);
263
stack.getOrCreateTag().put(MIND_POINTS_TAG, mindPoints);
264
}
265
266
private static void writePointToTag(CompoundTag parent, String tagName, ServerPlayer player) {
267
CompoundTag point = new CompoundTag();
268
point.putString(RETURN_DIMENSION_TAG, player.level().dimension().location().toString());
269
point.putDouble(RETURN_X_TAG, player.getX());
270
point.putDouble(RETURN_Y_TAG, player.getY());
271
point.putDouble(RETURN_Z_TAG, player.getZ());
272
point.putFloat(RETURN_Y_ROT_TAG, player.getYRot());
273
point.putFloat(RETURN_X_ROT_TAG, player.getXRot());
274
parent.put(tagName, point);
275
}
276
206
277
private static ReturnPoint readPoint(ItemStack stack, String tagName) {
207
278
CompoundTag tag = stack.getTag();
208
279
if (tag == null || !tag.contains(tagName, CompoundTag.TAG_COMPOUND)) {
@@ -216,7 +287,30 @@ public class RiftItem extends Item {
216
287
}
217
288
218
289
return new ReturnPoint(
219
ResourceKey.create(net.minecraft.core.registries.Registries.DIMENSION, dimension),
290
ResourceKey.create(Registries.DIMENSION, dimension),
291
point.getDouble(RETURN_X_TAG),
292
point.getDouble(RETURN_Y_TAG),
293
point.getDouble(RETURN_Z_TAG),
294
point.getFloat(RETURN_Y_ROT_TAG),
295
point.getFloat(RETURN_X_ROT_TAG)
296
);
297
}
298
299
private static ReturnPoint readMindPoint(ItemStack stack, ResourceKey<Level> dimension) {
300
CompoundTag tag = stack.getTag();
301
if (tag == null || !tag.contains(MIND_POINTS_TAG, CompoundTag.TAG_COMPOUND)) {
302
return null;
303
}
304
305
CompoundTag mindPoints = tag.getCompound(MIND_POINTS_TAG);
306
String tagName = dimension.location().toString();
307
if (!mindPoints.contains(tagName, CompoundTag.TAG_COMPOUND)) {
308
return null;
309
}
310
311
CompoundTag point = mindPoints.getCompound(tagName);
312
return new ReturnPoint(
313
dimension,
220
314
point.getDouble(RETURN_X_TAG),
221
315
point.getDouble(RETURN_Y_TAG),
222
316
point.getDouble(RETURN_Z_TAG),
@@ -0,0 +1,28 @@
1
package com.xfestudio.mydimension.network;
2
3
import com.xfestudio.mydimension.MyDimension;
4
import net.minecraft.resources.ResourceLocation;
5
import net.minecraftforge.network.NetworkRegistry;
6
import net.minecraftforge.network.simple.SimpleChannel;
7
8
public class ModNetwork {
9
private static final String PROTOCOL_VERSION = "1";
10
11
public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(
12
new ResourceLocation(MyDimension.MOD_ID, "main"),
13
() -> PROTOCOL_VERSION,
14
PROTOCOL_VERSION::equals,
15
PROTOCOL_VERSION::equals
16
);
17
18
public static void register() {
19
int id = 0;
20
CHANNEL.registerMessage(
21
id,
22
SetRiftActionPacket.class,
23
SetRiftActionPacket::encode,
24
SetRiftActionPacket::decode,
25
SetRiftActionPacket::handle
26
);
27
}
28
}
@@ -0,0 +1,48 @@
1
package com.xfestudio.mydimension.network;
2
3
import com.xfestudio.mydimension.item.RiftAction;
4
import com.xfestudio.mydimension.item.RiftItem;
5
import com.xfestudio.mydimension.registry.ModItems;
6
import net.minecraft.network.FriendlyByteBuf;
7
import net.minecraft.server.level.ServerPlayer;
8
import net.minecraft.world.InteractionHand;
9
import net.minecraft.world.item.ItemStack;
10
import net.minecraftforge.network.NetworkEvent;
11
12
import java.util.function.Supplier;
13
14
public class SetRiftActionPacket {
15
private final RiftAction action;
16
17
public SetRiftActionPacket(RiftAction action) {
18
this.action = action;
19
}
20
21
public static void encode(SetRiftActionPacket packet, FriendlyByteBuf buffer) {
22
buffer.writeEnum(packet.action);
23
}
24
25
public static SetRiftActionPacket decode(FriendlyByteBuf buffer) {
26
return new SetRiftActionPacket(buffer.readEnum(RiftAction.class));
27
}
28
29
public static void handle(SetRiftActionPacket packet, Supplier<NetworkEvent.Context> contextSupplier) {
30
NetworkEvent.Context context = contextSupplier.get();
31
context.enqueueWork(() -> {
32
ServerPlayer player = context.getSender();
33
if (player == null) {
34
return;
35
}
36
37
setIfRift(player.getItemInHand(InteractionHand.MAIN_HAND), packet.action);
38
setIfRift(player.getItemInHand(InteractionHand.OFF_HAND), packet.action);
39
});
40
context.setPacketHandled(true);
41
}
42
43
private static void setIfRift(ItemStack stack, RiftAction action) {
44
if (stack.is(ModItems.RIFT.get())) {
45
RiftItem.setSelectedAction(stack, action);
46
}
47
}
48
}
@@ -7,6 +7,9 @@ import net.minecraft.core.registries.Registries;
7
7
import net.minecraft.world.level.Level;
8
8
import net.minecraft.world.level.dimension.DimensionType;
9
9
10
import java.util.Map;
11
import java.util.Set;
12
10
13
public class ModDimensions {
11
14
public static final ResourceKey<Level> ETHEREAL_MIND = ResourceKey.create(
12
15
Registries.DIMENSION,
@@ -17,4 +20,56 @@ public class ModDimensions {
17
20
Registries.DIMENSION_TYPE,
18
21
new ResourceLocation(MyDimension.MOD_ID, "ethereal_mind")
19
22
);
23
24
public static final ResourceKey<Level> MIRROR_MIND = ResourceKey.create(
25
Registries.DIMENSION,
26
new ResourceLocation(MyDimension.MOD_ID, "mirror_mind")
27
);
28
29
public static final ResourceKey<DimensionType> MIRROR_MIND_TYPE = ResourceKey.create(
30
Registries.DIMENSION_TYPE,
31
new ResourceLocation(MyDimension.MOD_ID, "mirror_mind")
32
);
33
34
public static final ResourceKey<Level> WATER_MIND = ResourceKey.create(
35
Registries.DIMENSION,
36
new ResourceLocation(MyDimension.MOD_ID, "water_mind")
37
);
38
39
public static final ResourceKey<DimensionType> WATER_MIND_TYPE = ResourceKey.create(
40
Registries.DIMENSION_TYPE,
41
new ResourceLocation(MyDimension.MOD_ID, "water_mind")
42
);
43
44
public static final ResourceKey<Level> NATURE_MIND = ResourceKey.create(
45
Registries.DIMENSION,
46
new ResourceLocation(MyDimension.MOD_ID, "nature_mind")
47
);
48
49
public static final ResourceKey<DimensionType> NATURE_MIND_TYPE = ResourceKey.create(
50
Registries.DIMENSION_TYPE,
51
new ResourceLocation(MyDimension.MOD_ID, "nature_mind")
52
);
53
54
private static final Set<ResourceKey<Level>> MIND_DIMENSIONS = Set.of(
55
ETHEREAL_MIND,
56
MIRROR_MIND,
57
WATER_MIND,
58
NATURE_MIND
59
);
60
61
private static final Map<ResourceKey<Level>, Double> ENTRY_HEIGHTS = Map.of(
62
ETHEREAL_MIND, 66.0D,
63
MIRROR_MIND, 80.0D,
64
WATER_MIND, 76.0D,
65
NATURE_MIND, 61.0D
66
);
67
68
public static boolean isMindDimension(ResourceKey<Level> dimension) {
69
return MIND_DIMENSIONS.contains(dimension);
70
}
71
72
public static double entryHeight(ResourceKey<Level> dimension) {
73
return ENTRY_HEIGHTS.getOrDefault(dimension, 80.0D);
74
}
20
75
}
@@ -1,7 +1,17 @@
1
1
{
2
2
"item.mydimension.rift": "Rift",
3
3
"dimension.mydimension.ethereal_mind": "Ethereal Mind",
4
"dimension.mydimension.mirror_mind": "Mirror Mind",
5
"dimension.mydimension.water_mind": "Water Mind",
6
"dimension.mydimension.nature_mind": "Nature Mind",
7
"screen.mydimension.rift_actions": "Rift",
8
"action.mydimension.ethereal_mind": "Go to Ethereal Mind",
9
"action.mydimension.mirror_mind": "Go to Mirror Mind",
10
"action.mydimension.water_mind": "Go to Water Mind",
11
"action.mydimension.nature_mind": "Go to Nature Mind",
12
"action.mydimension.send_mob": "Send Mob",
4
13
"message.mydimension.already_in_ethereal_mind": "That mob is already in Ethereal Mind",
5
"message.mydimension.missing_dimension": "The Ethereal Mind dimension is not loaded",
6
"message.mydimension.protected_tp": "%s is in Ethereal Mind and cannot be teleported by another player"
14
"message.mydimension.no_mob_target": "No mob target selected",
15
"message.mydimension.missing_dimension": "The target mind dimension is not loaded",
16
"message.mydimension.protected_tp": "%s is in a mind dimension and cannot be teleported by another player"
7
17
}