返回提交历史
Modified
build.gradle
+90
-1
Modified
src/main/java/com/xfestudio/mydimension/item/RiftItem.java
+17
-12
Added
src/main/java/com/xfestudio/mydimension/world/MindInstances.java
+72
-0
Modified
src/main/java/com/xfestudio/mydimension/world/ModDimensions.java
+46
-2
Deleted
src/main/resources/data/mydimension/dimension/ethereal_mind.json
+0
-26
Deleted
src/main/resources/data/mydimension/dimension/mirror_mind.json
+0
-11
Deleted
src/main/resources/data/mydimension/dimension/nature_mind.json
+0
-26
Deleted
src/main/resources/data/mydimension/dimension/water_mind.json
+0
-26
XFEstudio/MyDimension
现在维度面向单人
263c53f
代码差异
8 个文件
+225
-104
@@ -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 = [
@@ -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);
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}