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

MyDimension

【Java】我的维度模组

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

XFEstudio/MyDimension

现在维度面向单人

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

代码差异

8 个文件 +225 -104
Modified build.gradle +90 -1
@@ -47,13 +47,102 @@ minecraft {
47 47 }
48 48 }
49 49
50 sourceSets.main.resources { srcDir 'src/generated/resources' }
50 def generatedPlayerMindDimensions = layout.buildDirectory.dir('generated/playerMindDimensions')
51
52 tasks.register('generatePlayerMindDimensions') {
53 def outputDir = generatedPlayerMindDimensions
54 outputs.dir(outputDir)
55
56 doLast {
57 def dimensionDir = outputDir.get().dir('data/mydimension/dimension/player_minds').asFile
58 delete(dimensionDir)
59
60 def dimensions = [
61 ethereal_mind: [
62 type : 'mydimension:ethereal_mind',
63 generator: [
64 type : 'minecraft:flat',
65 settings: [
66 biome : 'mydimension:ethereal_mind',
67 features : false,
68 lakes : false,
69 layers : [
70 [block: 'minecraft:stone', height: 60],
71 [block: 'minecraft:dirt', height: 3],
72 [block: 'minecraft:quartz_block', height: 3]
73 ],
74 structure_overrides: []
75 ]
76 ]
77 ],
78 mirror_mind : [
79 type : 'mydimension:mirror_mind',
80 generator: [
81 type : 'mydimension:no_structure_noise',
82 biome_source: [
83 type : 'minecraft:multi_noise',
84 preset: 'minecraft:overworld'
85 ],
86 settings : 'minecraft:overworld'
87 ]
88 ],
89 water_mind : [
90 type : 'mydimension:water_mind',
91 generator: [
92 type : 'minecraft:flat',
93 settings: [
94 biome : 'mydimension:water_mind',
95 features : false,
96 lakes : false,
97 layers : [
98 [block: 'minecraft:stone', height: 20],
99 [block: 'minecraft:gravel', height: 5],
100 [block: 'minecraft:water', height: 50]
101 ],
102 structure_overrides: []
103 ]
104 ]
105 ],
106 nature_mind : [
107 type : 'mydimension:nature_mind',
108 generator: [
109 type : 'minecraft:flat',
110 settings: [
111 biome : 'mydimension:nature_mind',
112 features : false,
113 lakes : false,
114 layers : [
115 [block: 'minecraft:stone', height: 50],
116 [block: 'minecraft:dirt', height: 9],
117 [block: 'minecraft:grass_block', height: 1]
118 ],
119 structure_overrides: []
120 ]
121 ]
122 ]
123 ]
124
125 (0..<32).each { slot ->
126 dimensions.each { name, json ->
127 def file = new File(dimensionDir, "slot_${slot}/${name}.json")
128 file.parentFile.mkdirs()
129 file.text = groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(json)) + System.lineSeparator()
130 }
131 }
132 }
133 }
134
135 sourceSets.main.resources {
136 srcDir 'src/generated/resources'
137 srcDir generatedPlayerMindDimensions
138 }
51 139
52 140 dependencies {
53 141 minecraft "net.minecraftforge:forge:${project.minecraft_version}-${project.forge_version}"
54 142 }
55 143
56 144 tasks.named('processResources', ProcessResources).configure {
145 dependsOn tasks.named('generatePlayerMindDimensions')
57 146 filteringCharset = 'UTF-8'
58 147
59 148 var replaceProperties = [
Modified src/main/java/com/xfestudio/mydimension/item/RiftItem.java +17 -12
@@ -1,6 +1,7 @@
1 1 package com.xfestudio.mydimension.item;
2 2
3 3 import com.xfestudio.mydimension.client.RiftClient;
4 import com.xfestudio.mydimension.world.MindInstances;
4 5 import com.xfestudio.mydimension.world.ModDimensions;
5 6 import net.minecraft.core.BlockPos;
6 7 import net.minecraft.core.registries.Registries;
@@ -139,10 +140,12 @@ public class RiftItem extends Item {
139 140 private static void teleport(ServerPlayer player, ItemStack stack, ResourceKey<Level> selectedDimension) {
140 141 ServerLevel currentLevel = player.serverLevel();
141 142 ResourceKey<Level> currentDimension = currentLevel.dimension();
142 boolean returningFromSelectedMind = currentDimension.equals(selectedDimension);
143 ResourceKey<Level> currentMindBase = ModDimensions.baseMindDimension(currentDimension);
144 boolean returningFromSelectedMind = selectedDimension.equals(currentMindBase);
143 145 ReturnPoint returnPoint = returningFromSelectedMind ? readPoint(stack, RETURN_POINT_TAG) : null;
144 ReturnPoint mindPoint = returningFromSelectedMind ? null : readMindPoint(stack, selectedDimension);
145 ServerLevel targetLevel = returningFromSelectedMind ? getReturnLevel(player, returnPoint) : player.getServer().getLevel(selectedDimension);
146 ResourceKey<Level> targetDimension = returningFromSelectedMind ? null : MindInstances.dimensionFor(player, selectedDimension);
147 ReturnPoint mindPoint = returningFromSelectedMind ? null : readMindPoint(stack, targetDimension);
148 ServerLevel targetLevel = returningFromSelectedMind ? getReturnLevel(player, returnPoint) : player.getServer().getLevel(targetDimension);
146 149
147 150 if (targetLevel == null) {
148 151 player.displayClientMessage(Component.translatable("message.mydimension.missing_dimension"), true);
@@ -151,7 +154,7 @@ public class RiftItem extends Item {
151 154
152 155 double x = player.getX();
153 156 double z = player.getZ();
154 double y = returningFromSelectedMind ? overworldSpawnY(targetLevel) : safeEntryY(targetLevel, selectedDimension, x, z);
157 double y = returningFromSelectedMind ? overworldSpawnY(targetLevel) : safeEntryY(targetLevel, targetDimension, x, z);
155 158 float yRot = player.getYRot();
156 159 float xRot = player.getXRot();
157 160
@@ -208,25 +211,27 @@ public class RiftItem extends Item {
208 211 }
209 212
210 213 public static boolean sendToMind(ServerPlayer player, LivingEntity target, ItemStack stack, ResourceKey<Level> targetDimension) {
211 ServerLevel targetLevel = player.getServer().getLevel(targetDimension);
214 ResourceKey<Level> actualTargetDimension = MindInstances.dimensionFor(player, targetDimension);
215 ServerLevel targetLevel = player.getServer().getLevel(actualTargetDimension);
212 216 if (targetLevel == null) {
213 217 player.displayClientMessage(Component.translatable("message.mydimension.missing_dimension"), true);
214 218 return false;
215 219 }
216 220
217 if (target.level().dimension().equals(targetDimension)) {
218 player.displayClientMessage(Component.translatable("message.mydimension.already_in_target_mind"), true);
219 return false;
220 }
221
222 221 target.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
223 222 target.stopRiding();
224 223 target.ejectPassengers();
225 224
226 AnchorPoint anchor = readAnchor(player, targetDimension);
225 AnchorPoint anchor = readAnchor(player, actualTargetDimension);
227 226 double targetX = anchor != null ? anchor.x() : player.getX();
228 double targetY = anchor != null ? anchor.y() : safeEntryY(targetLevel, targetDimension, player.getX(), player.getZ());
227 double targetY = anchor != null ? anchor.y() : safeEntryY(targetLevel, actualTargetDimension, targetX, player.getZ());
229 228 double targetZ = anchor != null ? anchor.z() : player.getZ();
229
230 if (target.level().dimension().equals(actualTargetDimension)) {
231 player.displayClientMessage(Component.translatable("message.mydimension.already_in_target_mind"), true);
232 return false;
233 }
234
230 235 Entity moved = target.changeDimension(targetLevel, new EtherealMindTeleporter(targetX, targetY, targetZ));
231 236 if (moved != null) {
232 237 moved.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
Added src/main/java/com/xfestudio/mydimension/world/MindInstances.java +72 -0
@@ -0,0 +1,72 @@
1 package com.xfestudio.mydimension.world;
2
3 import net.minecraft.nbt.CompoundTag;
4 import net.minecraft.resources.ResourceKey;
5 import net.minecraft.server.MinecraftServer;
6 import net.minecraft.server.level.ServerPlayer;
7 import net.minecraft.world.level.Level;
8 import net.minecraft.world.level.saveddata.SavedData;
9
10 import java.util.HashMap;
11 import java.util.Map;
12 import java.util.UUID;
13
14 public class MindInstances {
15 public static final int MAX_PLAYER_SLOTS = 32;
16 private static final String DATA_NAME = "mydimension_mind_instances";
17 private static final String NEXT_SLOT_TAG = "NextSlot";
18 private static final String SLOTS_TAG = "Slots";
19
20 public static ResourceKey<Level> dimensionFor(ServerPlayer player, ResourceKey<Level> baseDimension) {
21 return ModDimensions.playerDimension(baseDimension, slotFor(player));
22 }
23
24 public static int slotFor(ServerPlayer player) {
25 return data(player.getServer()).slotFor(player.getUUID());
26 }
27
28 private static MindInstanceData data(MinecraftServer server) {
29 return server.overworld().getDataStorage().computeIfAbsent(MindInstanceData::load, MindInstanceData::new, DATA_NAME);
30 }
31
32 public static class MindInstanceData extends SavedData {
33 private final Map<UUID, Integer> slots = new HashMap<>();
34 private int nextSlot;
35
36 public static MindInstanceData load(CompoundTag tag) {
37 MindInstanceData data = new MindInstanceData();
38 data.nextSlot = tag.getInt(NEXT_SLOT_TAG);
39 CompoundTag slotsTag = tag.getCompound(SLOTS_TAG);
40 for (String key : slotsTag.getAllKeys()) {
41 try {
42 data.slots.put(UUID.fromString(key), slotsTag.getInt(key));
43 } catch (IllegalArgumentException ignored) {
44 }
45 }
46 return data;
47 }
48
49 @Override
50 public CompoundTag save(CompoundTag tag) {
51 tag.putInt(NEXT_SLOT_TAG, nextSlot);
52 CompoundTag slotsTag = new CompoundTag();
53 for (Map.Entry<UUID, Integer> entry : slots.entrySet()) {
54 slotsTag.putInt(entry.getKey().toString(), entry.getValue());
55 }
56 tag.put(SLOTS_TAG, slotsTag);
57 return tag;
58 }
59
60 private int slotFor(UUID owner) {
61 Integer existing = slots.get(owner);
62 if (existing != null) {
63 return existing;
64 }
65
66 int slot = nextSlot++;
67 slots.put(owner, slot);
68 setDirty();
69 return slot;
70 }
71 }
72 }
Modified src/main/java/com/xfestudio/mydimension/world/ModDimensions.java +46 -2
@@ -65,11 +65,55 @@ public class ModDimensions {
65 65 NATURE_MIND, 61.0D
66 66 );
67 67
68 private static final Map<String, ResourceKey<Level>> MIND_IDS = Map.of(
69 "ethereal_mind", ETHEREAL_MIND,
70 "mirror_mind", MIRROR_MIND,
71 "water_mind", WATER_MIND,
72 "nature_mind", NATURE_MIND
73 );
74
68 75 public static boolean isMindDimension(ResourceKey<Level> dimension) {
69 return MIND_DIMENSIONS.contains(dimension);
76 return baseMindDimension(dimension) != null;
77 }
78
79 public static ResourceKey<Level> baseMindDimension(ResourceKey<Level> dimension) {
80 if (MIND_DIMENSIONS.contains(dimension)) {
81 return dimension;
82 }
83
84 ResourceLocation location = dimension.location();
85 if (!MyDimension.MOD_ID.equals(location.getNamespace())) {
86 return null;
87 }
88
89 String path = location.getPath();
90 String prefix = "player_minds/slot_";
91 if (!path.startsWith(prefix)) {
92 return null;
93 }
94
95 int slash = path.indexOf('/', prefix.length());
96 if (slash < 0) {
97 return null;
98 }
99
100 return MIND_IDS.get(path.substring(slash + 1));
101 }
102
103 public static ResourceKey<Level> playerDimension(ResourceKey<Level> baseDimension, int slot) {
104 ResourceKey<Level> base = baseMindDimension(baseDimension);
105 if (base == null) {
106 return baseDimension;
107 }
108
109 return ResourceKey.create(
110 Registries.DIMENSION,
111 new ResourceLocation(MyDimension.MOD_ID, "player_minds/slot_" + slot + "/" + base.location().getPath())
112 );
70 113 }
71 114
72 115 public static double entryHeight(ResourceKey<Level> dimension) {
73 return ENTRY_HEIGHTS.getOrDefault(dimension, 80.0D);
116 ResourceKey<Level> base = baseMindDimension(dimension);
117 return ENTRY_HEIGHTS.getOrDefault(base, 80.0D);
74 118 }
75 119 }
Deleted src/main/resources/data/mydimension/dimension/ethereal_mind.json +0 -26
@@ -1,26 +0,0 @@
1 {
2 "type": "mydimension:ethereal_mind",
3 "generator": {
4 "type": "minecraft:flat",
5 "settings": {
6 "biome": "mydimension:ethereal_mind",
7 "features": false,
8 "lakes": false,
9 "layers": [
10 {
11 "block": "minecraft:stone",
12 "height": 60
13 },
14 {
15 "block": "minecraft:dirt",
16 "height": 3
17 },
18 {
19 "block": "minecraft:quartz_block",
20 "height": 3
21 }
22 ],
23 "structure_overrides": []
24 }
25 }
26 }
Deleted src/main/resources/data/mydimension/dimension/mirror_mind.json +0 -11
@@ -1,11 +0,0 @@
1 {
2 "type": "mydimension:mirror_mind",
3 "generator": {
4 "type": "mydimension:no_structure_noise",
5 "biome_source": {
6 "type": "minecraft:multi_noise",
7 "preset": "minecraft:overworld"
8 },
9 "settings": "minecraft:overworld"
10 }
11 }
Deleted src/main/resources/data/mydimension/dimension/nature_mind.json +0 -26
@@ -1,26 +0,0 @@
1 {
2 "type": "mydimension:nature_mind",
3 "generator": {
4 "type": "minecraft:flat",
5 "settings": {
6 "biome": "mydimension:nature_mind",
7 "features": false,
8 "lakes": false,
9 "layers": [
10 {
11 "block": "minecraft:stone",
12 "height": 50
13 },
14 {
15 "block": "minecraft:dirt",
16 "height": 9
17 },
18 {
19 "block": "minecraft:grass_block",
20 "height": 1
21 }
22 ],
23 "structure_overrides": []
24 }
25 }
26 }
Deleted src/main/resources/data/mydimension/dimension/water_mind.json +0 -26
@@ -1,26 +0,0 @@
1 {
2 "type": "mydimension:water_mind",
3 "generator": {
4 "type": "minecraft:flat",
5 "settings": {
6 "biome": "mydimension:water_mind",
7 "features": false,
8 "lakes": false,
9 "layers": [
10 {
11 "block": "minecraft:stone",
12 "height": 20
13 },
14 {
15 "block": "minecraft:gravel",
16 "height": 5
17 },
18 {
19 "block": "minecraft:water",
20 "height": 50
21 }
22 ],
23 "structure_overrides": []
24 }
25 }
26 }