返回提交历史
Modified
gradle.properties
+1
-1
Modified
src/main/java/com/xfestudio/mydimension/MyDimension.java
+2
-0
Modified
src/main/java/com/xfestudio/mydimension/MyDimensionEvents.java
+61
-0
Added
src/main/java/com/xfestudio/mydimension/client/ModClientEvents.java
+16
-0
Added
src/main/java/com/xfestudio/mydimension/client/RiftAnchorRenderer.java
+58
-0
Added
src/main/java/com/xfestudio/mydimension/registry/ModEntities.java
+29
-0
Added
src/main/java/com/xfestudio/mydimension/world/entity/RiftAnchorEntity.java
+111
-0
Added
src/main/resources/assets/mydimension/textures/entity/rift_anchor.png
+0
-0
XFEstudio/MyDimension
优化传送锚点贴图,优化传送锚点的视觉效果 现在玩家在心境内不会窒息而死,在水下挖掘速度也不会受到任何影响
c3abee9
代码差异
8 个文件
+278
-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.3.3
14
mod_version=1.3.4
15
15
mod_group_id=com.xfestudio.mydimension
16
16
maven_group=com.xfestudio
17
17
archives_base_name=mydimension
@@ -2,6 +2,7 @@ package com.xfestudio.mydimension;
2
2
3
3
import com.mojang.logging.LogUtils;
4
4
import com.xfestudio.mydimension.network.ModNetwork;
5
import com.xfestudio.mydimension.registry.ModEntities;
5
6
import com.xfestudio.mydimension.registry.ModItems;
6
7
import net.minecraftforge.common.MinecraftForge;
7
8
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
@@ -18,6 +19,7 @@ public class MyDimension {
18
19
public MyDimension() {
19
20
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
20
21
22
ModEntities.register(modEventBus);
21
23
ModItems.register(modEventBus);
22
24
modEventBus.addListener(ModItems::addCreative);
23
25
modEventBus.addListener(this::commonSetup);
@@ -4,8 +4,10 @@ import com.mojang.brigadier.StringReader;
4
4
import com.mojang.brigadier.exceptions.CommandSyntaxException;
5
5
import com.xfestudio.mydimension.item.RiftAction;
6
6
import com.xfestudio.mydimension.item.RiftItem;
7
import com.xfestudio.mydimension.registry.ModEntities;
7
8
import com.xfestudio.mydimension.registry.ModItems;
8
9
import com.xfestudio.mydimension.world.ModDimensions;
10
import com.xfestudio.mydimension.world.entity.RiftAnchorEntity;
9
11
import net.minecraft.commands.CommandSourceStack;
10
12
import net.minecraft.commands.arguments.EntityArgument;
11
13
import net.minecraft.commands.arguments.selector.EntitySelector;
@@ -24,9 +26,11 @@ import net.minecraft.world.entity.Mob;
24
26
import net.minecraft.world.entity.MobSpawnType;
25
27
import net.minecraft.world.item.ItemStack;
26
28
import net.minecraft.world.level.GameRules;
29
import net.minecraft.tags.FluidTags;
27
30
import net.minecraftforge.event.CommandEvent;
28
31
import net.minecraftforge.event.TickEvent;
29
32
import net.minecraftforge.event.entity.living.MobSpawnEvent;
33
import net.minecraftforge.event.entity.player.PlayerEvent;
30
34
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
31
35
import net.minecraftforge.event.level.SleepFinishedTimeEvent;
32
36
import net.minecraftforge.eventbus.api.Event;
@@ -106,6 +110,7 @@ public class MyDimensionEvents {
106
110
107
111
MinecraftServer server = event.getServer();
108
112
for (ServerPlayer owner : server.getPlayerList().getPlayers()) {
113
refreshAnchorEntities(server, owner);
109
114
for (RiftItem.AnchorPoint anchor : RiftItem.readAnchors(owner)) {
110
115
ServerLevel level = server.getLevel(anchor.dimension());
111
116
if (level == null || !ModDimensions.isMindDimension(level.dimension())) {
@@ -119,6 +124,62 @@ public class MyDimensionEvents {
119
124
}
120
125
}
121
126
127
@SubscribeEvent
128
public void keepMindPlayersBreathing(TickEvent.PlayerTickEvent event) {
129
if (event.phase != TickEvent.Phase.END || event.player.level().isClientSide() || !ModDimensions.isMindDimension(event.player.level().dimension())) {
130
return;
131
}
132
133
event.player.setAirSupply(event.player.getMaxAirSupply());
134
}
135
136
@SubscribeEvent
137
public void keepUnderwaterMiningFastInMind(PlayerEvent.BreakSpeed event) {
138
if (!ModDimensions.isMindDimension(event.getEntity().level().dimension()) || !event.getEntity().isEyeInFluid(FluidTags.WATER)) {
139
return;
140
}
141
142
event.setNewSpeed(event.getNewSpeed() * 5.0F);
143
}
144
145
private static void refreshAnchorEntities(MinecraftServer server, ServerPlayer owner) {
146
java.util.List<RiftItem.AnchorPoint> anchors = RiftItem.readAnchors(owner);
147
for (ServerLevel level : server.getAllLevels()) {
148
for (Entity entity : level.getAllEntities()) {
149
if (entity instanceof RiftAnchorEntity anchorEntity && owner.getUUID().equals(anchorEntity.owner()) && !matchesAnyAnchor(anchorEntity, anchors)) {
150
anchorEntity.discard();
151
}
152
}
153
}
154
155
for (RiftItem.AnchorPoint anchor : anchors) {
156
ServerLevel level = server.getLevel(anchor.dimension());
157
if (level != null && ModDimensions.isMindDimension(level.dimension()) && !hasAnchorEntity(level, owner, anchor)) {
158
level.addFreshEntity(new RiftAnchorEntity(level, owner.getUUID(), anchor.x(), anchor.y(), anchor.z()));
159
}
160
}
161
}
162
163
private static boolean hasAnchorEntity(ServerLevel level, ServerPlayer owner, RiftItem.AnchorPoint anchor) {
164
for (RiftAnchorEntity entity : level.getEntities(ModEntities.RIFT_ANCHOR.get(), entity -> owner.getUUID().equals(entity.owner()) && samePosition(entity, anchor))) {
165
return true;
166
}
167
return false;
168
}
169
170
private static boolean matchesAnyAnchor(RiftAnchorEntity entity, java.util.List<RiftItem.AnchorPoint> anchors) {
171
for (RiftItem.AnchorPoint anchor : anchors) {
172
if (entity.level().dimension().equals(anchor.dimension()) && samePosition(entity, anchor)) {
173
return true;
174
}
175
}
176
return false;
177
}
178
179
private static boolean samePosition(Entity entity, RiftItem.AnchorPoint anchor) {
180
return entity.distanceToSqr(anchor.x(), anchor.y(), anchor.z()) < 0.04D;
181
}
182
122
183
private static String firstWord(String input) {
123
184
int space = input.indexOf(' ');
124
185
return space < 0 ? input : input.substring(0, space);
@@ -0,0 +1,16 @@
1
package com.xfestudio.mydimension.client;
2
3
import com.xfestudio.mydimension.MyDimension;
4
import com.xfestudio.mydimension.registry.ModEntities;
5
import net.minecraftforge.api.distmarker.Dist;
6
import net.minecraftforge.client.event.EntityRenderersEvent;
7
import net.minecraftforge.eventbus.api.SubscribeEvent;
8
import net.minecraftforge.fml.common.Mod;
9
10
@Mod.EventBusSubscriber(modid = MyDimension.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
11
public class ModClientEvents {
12
@SubscribeEvent
13
public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) {
14
event.registerEntityRenderer(ModEntities.RIFT_ANCHOR.get(), RiftAnchorRenderer::new);
15
}
16
}
@@ -0,0 +1,58 @@
1
package com.xfestudio.mydimension.client;
2
3
import com.mojang.blaze3d.vertex.PoseStack;
4
import com.mojang.blaze3d.vertex.VertexConsumer;
5
import com.xfestudio.mydimension.MyDimension;
6
import com.xfestudio.mydimension.world.entity.RiftAnchorEntity;
7
import net.minecraft.client.renderer.MultiBufferSource;
8
import net.minecraft.client.renderer.RenderType;
9
import net.minecraft.client.renderer.entity.EntityRenderer;
10
import net.minecraft.client.renderer.entity.EntityRendererProvider;
11
import net.minecraft.client.renderer.texture.OverlayTexture;
12
import net.minecraft.resources.ResourceLocation;
13
import org.joml.Matrix3f;
14
import org.joml.Matrix4f;
15
16
public class RiftAnchorRenderer extends EntityRenderer<RiftAnchorEntity> {
17
private static final ResourceLocation TEXTURE = new ResourceLocation(MyDimension.MOD_ID, "textures/entity/rift_anchor.png");
18
19
public RiftAnchorRenderer(EntityRendererProvider.Context context) {
20
super(context);
21
shadowRadius = 0.0F;
22
}
23
24
@Override
25
public void render(RiftAnchorEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) {
26
poseStack.pushPose();
27
poseStack.translate(0.0D, 0.9D + Math.sin((entity.tickCount + partialTick) * 0.08D) * 0.08D, 0.0D);
28
poseStack.mulPose(entityRenderDispatcher.cameraOrientation());
29
poseStack.scale(1.05F, 1.05F, 1.05F);
30
31
VertexConsumer consumer = buffer.getBuffer(RenderType.entityTranslucent(TEXTURE));
32
PoseStack.Pose pose = poseStack.last();
33
Matrix4f matrix = pose.pose();
34
Matrix3f normal = pose.normal();
35
vertex(consumer, matrix, normal, -0.5F, -0.5F, 0.0F, 0.0F, packedLight);
36
vertex(consumer, matrix, normal, 0.5F, -0.5F, 1.0F, 0.0F, packedLight);
37
vertex(consumer, matrix, normal, 0.5F, 0.5F, 1.0F, 1.0F, packedLight);
38
vertex(consumer, matrix, normal, -0.5F, 0.5F, 0.0F, 1.0F, packedLight);
39
40
poseStack.popPose();
41
super.render(entity, entityYaw, partialTick, poseStack, buffer, packedLight);
42
}
43
44
@Override
45
public ResourceLocation getTextureLocation(RiftAnchorEntity entity) {
46
return TEXTURE;
47
}
48
49
private static void vertex(VertexConsumer consumer, Matrix4f matrix, Matrix3f normal, float x, float y, float u, float v, int packedLight) {
50
consumer.vertex(matrix, x, y, 0.0F)
51
.color(255, 255, 255, 220)
52
.uv(u, v)
53
.overlayCoords(OverlayTexture.NO_OVERLAY)
54
.uv2(packedLight)
55
.normal(normal, 0.0F, 1.0F, 0.0F)
56
.endVertex();
57
}
58
}
@@ -0,0 +1,29 @@
1
package com.xfestudio.mydimension.registry;
2
3
import com.xfestudio.mydimension.MyDimension;
4
import com.xfestudio.mydimension.world.entity.RiftAnchorEntity;
5
import net.minecraft.world.entity.EntityType;
6
import net.minecraft.world.entity.MobCategory;
7
import net.minecraftforge.eventbus.api.IEventBus;
8
import net.minecraftforge.registries.DeferredRegister;
9
import net.minecraftforge.registries.ForgeRegistries;
10
import net.minecraftforge.registries.RegistryObject;
11
12
public class ModEntities {
13
public static final DeferredRegister<EntityType<?>> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, MyDimension.MOD_ID);
14
15
public static final RegistryObject<EntityType<RiftAnchorEntity>> RIFT_ANCHOR = ENTITIES.register(
16
"rift_anchor",
17
() -> EntityType.Builder.<RiftAnchorEntity>of(RiftAnchorEntity::new, MobCategory.MISC)
18
.sized(0.8F, 1.2F)
19
.clientTrackingRange(64)
20
.updateInterval(20)
21
.noSummon()
22
.noSave()
23
.build("rift_anchor")
24
);
25
26
public static void register(IEventBus eventBus) {
27
ENTITIES.register(eventBus);
28
}
29
}
@@ -0,0 +1,111 @@
1
package com.xfestudio.mydimension.world.entity;
2
3
import com.xfestudio.mydimension.registry.ModEntities;
4
import net.minecraft.nbt.CompoundTag;
5
import net.minecraft.network.protocol.Packet;
6
import net.minecraft.network.protocol.game.ClientGamePacketListener;
7
import net.minecraft.network.syncher.SynchedEntityData;
8
import net.minecraft.core.BlockPos;
9
import net.minecraft.world.entity.Entity;
10
import net.minecraft.world.entity.EntityType;
11
import net.minecraft.world.level.Level;
12
import net.minecraft.world.level.block.Blocks;
13
import net.minecraft.world.level.block.LightBlock;
14
import net.minecraft.world.level.block.state.BlockState;
15
import net.minecraftforge.network.NetworkHooks;
16
17
import java.util.UUID;
18
19
public class RiftAnchorEntity extends Entity {
20
private static final String OWNER_TAG = "Owner";
21
private UUID owner;
22
23
public RiftAnchorEntity(EntityType<? extends RiftAnchorEntity> entityType, Level level) {
24
super(entityType, level);
25
noPhysics = true;
26
setNoGravity(true);
27
setGlowingTag(true);
28
}
29
30
public RiftAnchorEntity(Level level, UUID owner, double x, double y, double z) {
31
this(ModEntities.RIFT_ANCHOR.get(), level);
32
this.owner = owner;
33
setPos(x, y, z);
34
}
35
36
@Override
37
public void tick() {
38
super.tick();
39
setGlowingTag(true);
40
setDeltaMovement(0.0D, 0.0D, 0.0D);
41
if (!level().isClientSide()) {
42
placeLight();
43
}
44
}
45
46
@Override
47
protected void defineSynchedData() {
48
}
49
50
@Override
51
protected void readAdditionalSaveData(CompoundTag tag) {
52
if (tag.hasUUID(OWNER_TAG)) {
53
owner = tag.getUUID(OWNER_TAG);
54
}
55
}
56
57
@Override
58
protected void addAdditionalSaveData(CompoundTag tag) {
59
if (owner != null) {
60
tag.putUUID(OWNER_TAG, owner);
61
}
62
}
63
64
@Override
65
public boolean isPickable() {
66
return false;
67
}
68
69
@Override
70
public boolean isPushable() {
71
return false;
72
}
73
74
@Override
75
public void remove(RemovalReason reason) {
76
clearLight();
77
super.remove(reason);
78
}
79
80
@Override
81
public Packet<ClientGamePacketListener> getAddEntityPacket() {
82
return NetworkHooks.getEntitySpawningPacket(this);
83
}
84
85
public UUID owner() {
86
return owner;
87
}
88
89
private void placeLight() {
90
BlockPos pos = lightPos();
91
BlockState state = level().getBlockState(pos);
92
if (state.isAir() || state.is(Blocks.LIGHT)) {
93
level().setBlock(pos, Blocks.LIGHT.defaultBlockState().setValue(LightBlock.LEVEL, 15), 3);
94
}
95
}
96
97
private void clearLight() {
98
if (level().isClientSide()) {
99
return;
100
}
101
102
BlockPos pos = lightPos();
103
if (level().getBlockState(pos).is(Blocks.LIGHT)) {
104
level().removeBlock(pos, false);
105
}
106
}
107
108
private BlockPos lightPos() {
109
return BlockPos.containing(getX(), getY() + 1.0D, getZ());
110
}
111
}
二进制文件已变更,无法进行逐行预览。