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

MyDimension

【Java】我的维度模组

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

XFEstudio/MyDimension

完善模组

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

代码差异

2 个文件 +71 -3
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.1.2
14 mod_version=1.1.3
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/item/RiftItem.java +70 -2
@@ -13,9 +13,17 @@ import net.minecraft.world.InteractionResultHolder;
13 13 import net.minecraft.world.entity.Entity;
14 14 import net.minecraft.world.entity.LivingEntity;
15 15 import net.minecraft.world.entity.player.Player;
16 import net.minecraft.world.entity.projectile.ProjectileUtil;
16 17 import net.minecraft.world.item.Item;
17 18 import net.minecraft.world.item.ItemStack;
18 19 import net.minecraft.world.level.Level;
20 import net.minecraft.world.level.portal.PortalInfo;
21 import net.minecraft.world.phys.AABB;
22 import net.minecraft.world.phys.EntityHitResult;
23 import net.minecraft.world.phys.Vec3;
24 import net.minecraftforge.common.util.ITeleporter;
25
26 import java.util.function.Function;
19 27
20 28 public class RiftItem extends Item {
21 29 public static final double ETHEREAL_SURFACE_Y = 66.0D;
@@ -29,6 +37,17 @@ public class RiftItem extends Item {
29 37 public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
30 38 ItemStack stack = player.getItemInHand(hand);
31 39 if (player.isShiftKeyDown()) {
40 if (level.isClientSide()) {
41 return InteractionResultHolder.sidedSuccess(stack, true);
42 }
43
44 if (player instanceof ServerPlayer serverPlayer) {
45 LivingEntity target = findLookedAtLivingEntity(serverPlayer);
46 if (target != null && sendToEtherealMind(serverPlayer, target, stack)) {
47 return InteractionResultHolder.consume(stack);
48 }
49 }
50
32 51 return InteractionResultHolder.pass(stack);
33 52 }
34 53
@@ -103,10 +122,12 @@ public class RiftItem extends Item {
103 122 }
104 123
105 124 target.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
106 Entity moved = target.changeDimension(targetLevel);
125 target.stopRiding();
126 target.ejectPassengers();
127
128 Entity moved = target.changeDimension(targetLevel, new EtherealMindTeleporter(player.getX(), ETHEREAL_SURFACE_Y, player.getZ()));
107 129 if (moved != null) {
108 130 moved.getPersistentData().putBoolean(IMPORTED_TO_ETHEREAL_MIND, true);
109 moved.moveTo(player.getX(), ETHEREAL_SURFACE_Y, player.getZ(), moved.getYRot(), moved.getXRot());
110 131 targetLevel.playSound(null, BlockPos.containing(moved.position()), SoundEvents.ENDERMAN_TELEPORT, SoundSource.NEUTRAL, 1.0F, 1.0F);
111 132 player.getCooldowns().addCooldown(stack.getItem(), 20);
112 133 return true;
@@ -114,4 +135,51 @@ public class RiftItem extends Item {
114 135
115 136 return false;
116 137 }
138
139 private static LivingEntity findLookedAtLivingEntity(ServerPlayer player) {
140 double reach = 6.0D;
141 Vec3 eye = player.getEyePosition();
142 Vec3 look = player.getViewVector(1.0F);
143 Vec3 end = eye.add(look.scale(reach));
144 AABB searchBox = player.getBoundingBox().expandTowards(look.scale(reach)).inflate(1.0D);
145 EntityHitResult hit = ProjectileUtil.getEntityHitResult(
146 player.level(),
147 player,
148 eye,
149 end,
150 searchBox,
151 entity -> entity instanceof LivingEntity && entity.isAlive() && entity.isPickable() && entity != player,
152 0.3F
153 );
154
155 return hit != null && hit.getEntity() instanceof LivingEntity living ? living : null;
156 }
157
158 private static class EtherealMindTeleporter implements ITeleporter {
159 private final double x;
160 private final double y;
161 private final double z;
162
163 private EtherealMindTeleporter(double x, double y, double z) {
164 this.x = x;
165 this.y = y;
166 this.z = z;
167 }
168
169 @Override
170 public PortalInfo getPortalInfo(Entity entity, ServerLevel destinationLevel, Function<ServerLevel, PortalInfo> defaultPortalInfo) {
171 return new PortalInfo(new Vec3(x, y, z), Vec3.ZERO, entity.getYRot(), entity.getXRot());
172 }
173
174 @Override
175 public Entity placeEntity(Entity entity, ServerLevel currentLevel, ServerLevel destinationLevel, float yaw, Function<Boolean, Entity> repositionEntity) {
176 Entity moved = repositionEntity.apply(false);
177 if (moved != null) {
178 moved.moveTo(x, y, z, moved.getYRot(), moved.getXRot());
179 moved.setDeltaMovement(Vec3.ZERO);
180 moved.setPortalCooldown();
181 }
182 return moved;
183 }
184 }
117 185 }