返回提交历史
Modified
gradle.properties
+1
-1
Modified
src/main/java/com/xfestudio/mydimension/item/RiftItem.java
+70
-2
XFEstudio/MyDimension
完善模组
e52297b
代码差异
2 个文件
+71
-3
@@ -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
@@ -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
}