BukkitTools

前言

测试使用时用的是spigot1.16.5的api。
此文章仅展示一些我平时会写的用法。

0.前置接口

1
2
3
public interface SphereExecute {
void execute(Location center,Location loc); //center中心位置 loc触发位置
}
1
2
3
public interface EntitiesAtExecute {
void execute(Entity target); //对象实体
}
1
2
3
4
5
6
public enum MovementDirection {
FORWARD,
BACKWARD,
LEFT,
RIGHT,
}

1.治愈玩家

根据玩家最大血量治愈百分比血量方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void healEntity(Entity entity, double percentage) {
if (!(entity instanceof LivingEntity)) {
// 如果实体不是LivingEntity类型,无法进行血量恢复
return;
}

LivingEntity livingEntity = (LivingEntity) entity;
double maxHealth = livingEntity.getMaxHealth(); // 获取实体的最大血量
double healAmount = maxHealth * percentage / 100; // 计算恢复的血量数值

double currentHealth = livingEntity.getHealth(); // 获取实体当前血量
double newHealth = Math.min(currentHealth + healAmount, maxHealth); // 计算新的血量,不超过最大血量

livingEntity.setHealth(newHealth); // 设置实体的血量
}

entity所需要治愈的实体
percentage治愈百分比0-100

2.获取周围实体

获取指定位置附加的实体,并进行指定的方法处理

1
2
3
4
5
6
7
8
public void EntitiesAtLocation(Location location, double radius, EntitiesAtExecute entitiesAtExecute) {
for (Entity entity : location.getWorld().getNearbyEntities(location, radius, radius, radius)) {
if (entity instanceof LivingEntity) {
LivingEntity target = (LivingEntity) entity;
entitiesAtExecute.execute(target); //实现自定义方法的处理
}
}
}

location需要获取的中心位置
radius中心位置向外的半径
entitiesAtExecute可自定义的方法

3.对实体施加力

使实体前后左右移动的方法,或者说是施加一个力让玩家弹射出去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void movePlayer(Entity player, double distance, double extraForce, MovementDirection direction) {
Vector playerDirection = player.getLocation().getDirection().normalize();
playerDirection.setY(0); // 忽略垂直方向的移动
playerDirection.multiply(distance);

Vector velocity = player.getVelocity();
switch (direction) {
case FORWARD:
velocity.add(playerDirection.multiply(extraForce));
break;
case BACKWARD:
playerDirection.multiply(-1); // 反向移动
velocity.add(playerDirection.multiply(extraForce));
break;
case LEFT:
Vector left = new Vector(-playerDirection.getZ(), 0, playerDirection.getX()); // 左方向向量
playerDirection.add(left);
velocity.add(playerDirection.multiply(extraForce));
break;
case RIGHT:
Vector right = new Vector(playerDirection.getZ(), 0, -playerDirection.getX()); // 右方向向量
playerDirection.add(right);
velocity.add(playerDirection.multiply(extraForce));
break;
}
player.setVelocity(velocity);
}

player所需要对其操作的实体
distance移动的力
extraForce额外施加的力
direction方向
如果想让实体向上的话可以使用这个这个:

1
2
3
4
5
public void UPlaunchEntity(Entity entity, double power) {
Vector velocity = entity.getVelocity();
velocity.setY(power); // 设置Y方向上的速度,可以根据需要调整
entity.setVelocity(velocity);
}

4.指定实体位置,吸收周围实体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void attractEntities(Entity entity, double attractionRange, double attractionStrength) {
Location entityLocation = entity.getLocation();

// 获取附近的实体
for (Entity nearbyEntity : entity.getNearbyEntities(attractionRange, attractionRange, attractionRange)) {
// 排除实体自身
if (nearbyEntity.equals(entity)) {
continue;
}

Location nearbyLocation = nearbyEntity.getLocation();
Vector direction = entityLocation.toVector().subtract(nearbyLocation.toVector()).normalize();

// 计算实体受到的吸引力
Vector attractionForce = direction.multiply(attractionStrength);

// 将实体移动到目标实体身边
nearbyEntity.setVelocity(attractionForce);
}
}

entity中心实体
attractionRange吸收半径
attractionStrength吸收强度