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

MyDimension

【Java】我的维度模组

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

XFEstudio/MyDimension

优化传送锚点贴图,优化传送锚点的视觉效果 现在玩家在心境内不会窒息而死,在水下挖掘速度也不会受到任何影响

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

代码差异

8 个文件 +278 -1
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.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
Modified src/main/java/com/xfestudio/mydimension/MyDimension.java +2 -0
@@ -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);
Modified src/main/java/com/xfestudio/mydimension/MyDimensionEvents.java +61 -0
@@ -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);
Added src/main/java/com/xfestudio/mydimension/client/ModClientEvents.java +16 -0
@@ -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 }
Added src/main/java/com/xfestudio/mydimension/client/RiftAnchorRenderer.java +58 -0
@@ -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 }
Added src/main/java/com/xfestudio/mydimension/registry/ModEntities.java +29 -0
@@ -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 }
Added src/main/java/com/xfestudio/mydimension/world/entity/RiftAnchorEntity.java +111 -0
@@ -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 }
Added src/main/resources/assets/mydimension/textures/entity/rift_anchor.png +0 -0
二进制文件已变更,无法进行逐行预览。