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

MyDimension

【Java】我的维度模组

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

XFEstudio/MyDimension

添加多个心境维度

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

代码差异

21 个文件 +616 -53
Modified README.md +7 -4
@@ -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
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.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
Modified src/main/java/com/xfestudio/mydimension/MyDimension.java +7 -0
@@ -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 }
Modified src/main/java/com/xfestudio/mydimension/MyDimensionEvents.java +15 -15
@@ -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
Added src/main/java/com/xfestudio/mydimension/client/RiftActionScreen.java +55 -0
@@ -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 }
Added src/main/java/com/xfestudio/mydimension/client/RiftClient.java +9 -0
@@ -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 }
Added src/main/java/com/xfestudio/mydimension/item/RiftAction.java +56 -0
@@ -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 }
Modified src/main/java/com/xfestudio/mydimension/item/RiftItem.java +123 -29
@@ -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),
Added src/main/java/com/xfestudio/mydimension/network/ModNetwork.java +28 -0
@@ -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 }
Added src/main/java/com/xfestudio/mydimension/network/SetRiftActionPacket.java +48 -0
@@ -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 }
Modified src/main/java/com/xfestudio/mydimension/world/ModDimensions.java +55 -0
@@ -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 }
Modified src/main/resources/assets/mydimension/lang/en_us.json +12 -2
@@ -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 }
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