Compare commits
2
Commits
d3a684b6e4
...
7f308bfa00
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7f308bfa00 | ||
|
|
bfbdfd2199 |
No files matched your search
@@ -5,6 +5,7 @@
|
|||||||
## 功能特性
|
## 功能特性
|
||||||
|
|
||||||
- 🕊️ **自由飞行** — 通过命令开启/关闭创造模式飞行能力
|
- 🕊️ **自由飞行** — 通过命令开启/关闭创造模式飞行能力
|
||||||
|
- ⚡ **飞行速度调节** — 通过命令在 0.1–2.0 范围内自定义飞行速度
|
||||||
- 🛡️ **摔落保护** — 飞行状态下免疫摔落伤害
|
- 🛡️ **摔落保护** — 飞行状态下免疫摔落伤害
|
||||||
- 💾 **状态持久化** — 重新加入服务器时自动恢复飞行状态
|
- 💾 **状态持久化** — 重新加入服务器时自动恢复飞行状态
|
||||||
- 👥 **多玩家支持** — 管理员可为其他玩家切换飞行状态
|
- 👥 **多玩家支持** — 管理员可为其他玩家切换飞行状态
|
||||||
@@ -36,12 +37,23 @@
|
|||||||
- 如果当前未飞行,执行后**开启飞行**
|
- 如果当前未飞行,执行后**开启飞行**
|
||||||
- 如果当前正在飞行,执行后**关闭飞行**
|
- 如果当前正在飞行,执行后**关闭飞行**
|
||||||
|
|
||||||
### `/fly <player>`
|
### `/fly speed <0.1-2.0>`
|
||||||
|
|
||||||
|
设置自己的飞行速度,范围为 0.1 到 2.0(默认 0.05)。所有玩家均可执行。
|
||||||
|
|
||||||
|
```
|
||||||
|
/fly speed 1.5
|
||||||
|
```
|
||||||
|
|
||||||
|
- 数值越大飞行越快,2.0 为允许的最大速度
|
||||||
|
- 设置后立即生效,无需重新开启飞行
|
||||||
|
|
||||||
|
### `/fly player <player>`
|
||||||
|
|
||||||
切换指定玩家的飞行状态。需要 OP 权限(权限等级 2)。
|
切换指定玩家的飞行状态。需要 OP 权限(权限等级 2)。
|
||||||
|
|
||||||
```
|
```
|
||||||
/fly Steve
|
/fly player Steve
|
||||||
```
|
```
|
||||||
|
|
||||||
- 如果目标玩家未飞行,执行后**为其开启飞行**
|
- 如果目标玩家未飞行,执行后**为其开启飞行**
|
||||||
@@ -59,17 +71,25 @@
|
|||||||
- **双击空格** — 切换飞行/普通状态
|
- **双击空格** — 切换飞行/普通状态
|
||||||
3. 再次输入 `/fly` 关闭飞行,回到普通模式
|
3. 再次输入 `/fly` 关闭飞行,回到普通模式
|
||||||
|
|
||||||
|
### 飞行速度
|
||||||
|
|
||||||
|
使用 `/fly speed <数值>` 调整飞行速度(0.1–2.0):
|
||||||
|
|
||||||
|
- `/fly speed 0.5` — 较慢的飞行速度
|
||||||
|
- `/fly speed 1.0` — 中速
|
||||||
|
- `/fly speed 2.0` — 最快速度
|
||||||
|
|
||||||
### 管理员操作
|
### 管理员操作
|
||||||
|
|
||||||
作为服务器管理员,你可以为其他玩家管理飞行权限:
|
作为服务器管理员,你可以为其他玩家管理飞行权限:
|
||||||
|
|
||||||
```
|
```
|
||||||
/fly <玩家名>
|
/fly player <玩家名>
|
||||||
```
|
```
|
||||||
|
|
||||||
例如:
|
例如:
|
||||||
- `/fly Steve` — 为 Steve 开启飞行
|
- `/fly player Steve` — 为 Steve 开启飞行
|
||||||
- `/fly Alex` — 关闭 Alex 的飞行
|
- `/fly player Alex` — 关闭 Alex 的飞行
|
||||||
|
|
||||||
### 摔落保护
|
### 摔落保护
|
||||||
|
|
||||||
@@ -91,7 +111,7 @@ A: 不会。飞行状态下免疫所有摔落伤害,关闭飞行后恢复正
|
|||||||
|
|
||||||
### Q: 普通玩家可以使用 `/fly` 吗?
|
### Q: 普通玩家可以使用 `/fly` 吗?
|
||||||
|
|
||||||
A: 可以。`/fly` 命令对所有玩家开放,无需 OP 权限。但 `/fly <player>` 需要 OP 权限。
|
A: 可以。`/fly` 与 `/fly speed` 命令对所有玩家开放,无需 OP 权限。但 `/fly player <player>` 需要 OP 权限。
|
||||||
|
|
||||||
### Q: 这个模组需要安装在客户端还是服务端?
|
### Q: 这个模组需要安装在客户端还是服务端?
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'net.fabricmc.fabric-loom-remap' version "${loom_version}"
|
id 'fabric-loom' version "${loom_version}"
|
||||||
id 'maven-publish'
|
id 'maven-publish'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ loader_version=0.19.5
|
|||||||
loom_version=1.18-SNAPSHOT
|
loom_version=1.18-SNAPSHOT
|
||||||
|
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
version=1.0.0
|
version=1.1.0-1.21.8
|
||||||
group=top.gtb520.java.mods.openfly
|
group=top.gtb520.java.mods.openfly
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package top.gtb520.java.mods.openfly.Commands;
|
package top.gtb520.java.mods.openfly.Commands;
|
||||||
|
|
||||||
import com.mojang.brigadier.Command;
|
import com.mojang.brigadier.Command;
|
||||||
|
import com.mojang.brigadier.arguments.FloatArgumentType;
|
||||||
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
|
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
|
||||||
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents;
|
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents;
|
||||||
import net.minecraft.command.argument.EntityArgumentType;
|
import net.minecraft.command.argument.EntityArgumentType;
|
||||||
@@ -17,6 +18,10 @@ public class fly {
|
|||||||
// 记录开启了飞行的玩家UUID
|
// 记录开启了飞行的玩家UUID
|
||||||
private static final Set<UUID> flyingPlayers = new HashSet<>();
|
private static final Set<UUID> flyingPlayers = new HashSet<>();
|
||||||
|
|
||||||
|
// 飞行速度范围(/fly speed 参数范围)
|
||||||
|
public static final float MIN_FLY_SPEED = 0.1F;
|
||||||
|
public static final float MAX_FLY_SPEED = 2.0F;
|
||||||
|
|
||||||
public static void register() {
|
public static void register() {
|
||||||
// 注册命令
|
// 注册命令
|
||||||
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
|
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
|
||||||
@@ -40,24 +45,42 @@ public class fly {
|
|||||||
}
|
}
|
||||||
return Command.SINGLE_SUCCESS;
|
return Command.SINGLE_SUCCESS;
|
||||||
})
|
})
|
||||||
// /fly <player> - 切换指定玩家的飞行状态(需要OP权限)
|
// /fly speed <0.1-2.0> - 设置自己的飞行速度(所有玩家可用)
|
||||||
.then(CommandManager.argument("player", EntityArgumentType.player())
|
.then(CommandManager.literal("speed")
|
||||||
.requires(source -> source.hasPermissionLevel(2))
|
.then(CommandManager.argument("speed", FloatArgumentType.floatArg(MIN_FLY_SPEED, MAX_FLY_SPEED))
|
||||||
.executes(context -> {
|
.executes(context -> {
|
||||||
ServerPlayerEntity targetPlayer = EntityArgumentType.getPlayer(context, "player");
|
ServerPlayerEntity player = context.getSource().getPlayer();
|
||||||
UUID playerId = targetPlayer.getUuid();
|
if (player == null) {
|
||||||
|
context.getSource().sendFeedback(() -> Text.literal("该命令只能由玩家执行"), false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (flyingPlayers.contains(playerId)) {
|
float speed = FloatArgumentType.getFloat(context, "speed");
|
||||||
disableFly(targetPlayer);
|
player.getAbilities().setFlySpeed(speed);
|
||||||
context.getSource().sendFeedback(
|
player.sendAbilitiesUpdate();
|
||||||
() -> Text.literal("已禁用玩家 " + targetPlayer.getName().getString() + " 的飞行"), true);
|
context.getSource().sendFeedback(
|
||||||
} else {
|
() -> Text.literal("飞行速度已设置为 " + String.format("%.2f", speed)), false);
|
||||||
enableFly(targetPlayer);
|
return Command.SINGLE_SUCCESS;
|
||||||
context.getSource().sendFeedback(
|
})))
|
||||||
() -> Text.literal("已启用玩家 " + targetPlayer.getName().getString() + " 的飞行"), true);
|
// /fly player <player> - 切换指定玩家的飞行状态(需要OP权限)
|
||||||
}
|
.then(CommandManager.literal("player")
|
||||||
return Command.SINGLE_SUCCESS;
|
.requires(source -> source.hasPermissionLevel(2))
|
||||||
}))
|
.then(CommandManager.argument("player", EntityArgumentType.player())
|
||||||
|
.executes(context -> {
|
||||||
|
ServerPlayerEntity targetPlayer = EntityArgumentType.getPlayer(context, "player");
|
||||||
|
UUID playerId = targetPlayer.getUuid();
|
||||||
|
|
||||||
|
if (flyingPlayers.contains(playerId)) {
|
||||||
|
disableFly(targetPlayer);
|
||||||
|
context.getSource().sendFeedback(
|
||||||
|
() -> Text.literal("已禁用玩家 " + targetPlayer.getName().getString() + " 的飞行"), true);
|
||||||
|
} else {
|
||||||
|
enableFly(targetPlayer);
|
||||||
|
context.getSource().sendFeedback(
|
||||||
|
() -> Text.literal("已启用玩家 " + targetPlayer.getName().getString() + " 的飞行"), true);
|
||||||
|
}
|
||||||
|
return Command.SINGLE_SUCCESS;
|
||||||
|
})))
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user