|
1 | 1 | package cn.nukkit; |
2 | 2 |
|
3 | 3 | import cn.nukkit.api.PowerNukkitDifference; |
4 | | -import cn.nukkit.network.protocol.AdventureSettingsPacket; |
| 4 | +import cn.nukkit.api.Since; |
| 5 | +import cn.nukkit.network.protocol.UpdateAbilitiesPacket; |
| 6 | +import cn.nukkit.network.protocol.UpdateAdventureSettingsPacket; |
| 7 | +import cn.nukkit.network.protocol.types.AbilityLayer; |
| 8 | +import cn.nukkit.network.protocol.types.PlayerAbility; |
5 | 9 |
|
6 | 10 | import java.util.EnumMap; |
7 | 11 | import java.util.Map; |
@@ -42,59 +46,102 @@ public AdventureSettings set(Type type, boolean value) { |
42 | 46 |
|
43 | 47 | public boolean get(Type type) { |
44 | 48 | Boolean value = this.values.get(type); |
45 | | - |
46 | 49 | return value == null ? type.getDefaultValue() : value; |
47 | 50 | } |
48 | 51 |
|
49 | 52 | @PowerNukkitDifference( |
50 | 53 | info = "Players in spectator mode will be flagged as member even if they are OP due to a client-side limitation", |
51 | 54 | since = "1.3.1.2-PN") |
52 | 55 | public void update() { |
53 | | - AdventureSettingsPacket pk = new AdventureSettingsPacket(); |
54 | | - for (Type t : Type.values()) { |
55 | | - pk.setFlag(t.getId(), get(t)); |
| 56 | + UpdateAbilitiesPacket packet = new UpdateAbilitiesPacket(); |
| 57 | + packet.setEntityId(player.getId()); |
| 58 | + packet.setCommandPermission(player.isOp() ? UpdateAbilitiesPacket.CommandPermission.OPERATOR : UpdateAbilitiesPacket.CommandPermission.NORMAL); |
| 59 | + packet.setPlayerPermission(player.isOp() && !player.isSpectator() ? UpdateAbilitiesPacket.PlayerPermission.OPERATOR : UpdateAbilitiesPacket.PlayerPermission.MEMBER); |
| 60 | + |
| 61 | + AbilityLayer layer = new AbilityLayer(); |
| 62 | + layer.setLayerType(AbilityLayer.Type.BASE); |
| 63 | + layer.getAbilitiesSet().addAll(PlayerAbility.VALUES); |
| 64 | + |
| 65 | + for (Type type : Type.values()) { |
| 66 | + if (type.isAbility() && this.get(type)) { |
| 67 | + layer.getAbilityValues().add(type.getAbility()); |
| 68 | + } |
| 69 | + } |
| 70 | + |
| 71 | + // Because we send speed |
| 72 | + layer.getAbilityValues().add(PlayerAbility.WALK_SPEED); |
| 73 | + layer.getAbilityValues().add(PlayerAbility.FLY_SPEED); |
| 74 | + |
| 75 | + if (player.isCreative()) { // Make sure player can interact with creative menu |
| 76 | + layer.getAbilityValues().add(PlayerAbility.INSTABUILD); |
| 77 | + } |
| 78 | + |
| 79 | + if (player.isOp()) { |
| 80 | + layer.getAbilityValues().add(PlayerAbility.OPERATOR_COMMANDS); |
56 | 81 | } |
57 | 82 |
|
58 | | - pk.commandPermission = (player.isOp() ? AdventureSettingsPacket.PERMISSION_OPERATOR : AdventureSettingsPacket.PERMISSION_NORMAL); |
59 | | - pk.playerPermission = (player.isOp() && !player.isSpectator() ? Player.PERMISSION_OPERATOR : Player.PERMISSION_MEMBER); |
60 | | - pk.entityUniqueId = player.getId(); |
| 83 | + layer.setWalkSpeed(Player.DEFAULT_SPEED); |
| 84 | + layer.setFlySpeed(Player.DEFAULT_FLY_SPEED); |
| 85 | + packet.getAbilityLayers().add(layer); |
61 | 86 |
|
62 | | - Server.broadcastPacket(player.getViewers().values(), pk); |
63 | | - player.dataPacket(pk); |
| 87 | + UpdateAdventureSettingsPacket adventurePacket = new UpdateAdventureSettingsPacket(); |
| 88 | + adventurePacket.setAutoJump(get(Type.AUTO_JUMP)); |
| 89 | + adventurePacket.setImmutableWorld(get(Type.WORLD_IMMUTABLE)); |
| 90 | + adventurePacket.setNoMvP(get(Type.NO_MVP)); |
| 91 | + adventurePacket.setNoPvM(get(Type.NO_PVM)); |
| 92 | + adventurePacket.setShowNameTags(get(Type.SHOW_NAME_TAGS)); |
64 | 93 |
|
| 94 | + player.dataPacket(packet); |
| 95 | + player.dataPacket(adventurePacket); |
65 | 96 | player.resetInAirTicks(); |
66 | 97 | } |
67 | 98 |
|
68 | 99 | public enum Type { |
69 | | - WORLD_IMMUTABLE(AdventureSettingsPacket.WORLD_IMMUTABLE, false), |
70 | | - AUTO_JUMP(AdventureSettingsPacket.AUTO_JUMP, true), |
71 | | - ALLOW_FLIGHT(AdventureSettingsPacket.ALLOW_FLIGHT, false), |
72 | | - NO_CLIP(AdventureSettingsPacket.NO_CLIP, false), |
73 | | - WORLD_BUILDER(AdventureSettingsPacket.WORLD_BUILDER, true), |
74 | | - FLYING(AdventureSettingsPacket.FLYING, false), |
75 | | - MUTED(AdventureSettingsPacket.MUTED, false), |
76 | | - BUILD_AND_MINE(AdventureSettingsPacket.BUILD_AND_MINE, true), |
77 | | - DOORS_AND_SWITCHED(AdventureSettingsPacket.DOORS_AND_SWITCHES, true), |
78 | | - OPEN_CONTAINERS(AdventureSettingsPacket.OPEN_CONTAINERS, true), |
79 | | - ATTACK_PLAYERS(AdventureSettingsPacket.ATTACK_PLAYERS, true), |
80 | | - ATTACK_MOBS(AdventureSettingsPacket.ATTACK_MOBS, true), |
81 | | - OPERATOR(AdventureSettingsPacket.OPERATOR, false), |
82 | | - TELEPORT(AdventureSettingsPacket.TELEPORT, false); |
83 | | - |
84 | | - private final int id; |
| 100 | + WORLD_IMMUTABLE(false), |
| 101 | + NO_PVM(false), |
| 102 | + NO_MVP(PlayerAbility.INVULNERABLE, false), |
| 103 | + SHOW_NAME_TAGS(false), |
| 104 | + AUTO_JUMP(true), |
| 105 | + ALLOW_FLIGHT(PlayerAbility.MAY_FLY, false), |
| 106 | + NO_CLIP(PlayerAbility.NO_CLIP, false), |
| 107 | + WORLD_BUILDER(PlayerAbility.WORLD_BUILDER, false), |
| 108 | + FLYING(PlayerAbility.FLYING, false), |
| 109 | + MUTED(PlayerAbility.MUTED, false), |
| 110 | + MINE(PlayerAbility.MINE, true), |
| 111 | + DOORS_AND_SWITCHED(PlayerAbility.DOORS_AND_SWITCHES, true), |
| 112 | + OPEN_CONTAINERS(PlayerAbility.OPEN_CONTAINERS, true), |
| 113 | + ATTACK_PLAYERS(PlayerAbility.ATTACK_PLAYERS, true), |
| 114 | + ATTACK_MOBS(PlayerAbility.ATTACK_MOBS, true), |
| 115 | + OPERATOR(PlayerAbility.OPERATOR_COMMANDS, false), |
| 116 | + TELEPORT(PlayerAbility.TELEPORT, false), |
| 117 | + BUILD(PlayerAbility.BUILD, true), |
| 118 | + |
| 119 | + @Deprecated |
| 120 | + DEFAULT_LEVEL_PERMISSIONS(null, false); |
| 121 | + |
| 122 | + private final PlayerAbility ability; |
85 | 123 | private final boolean defaultValue; |
86 | 124 |
|
87 | | - Type(int id, boolean defaultValue) { |
88 | | - this.id = id; |
| 125 | + Type(boolean defaultValue) { |
89 | 126 | this.defaultValue = defaultValue; |
| 127 | + this.ability = null; |
90 | 128 | } |
91 | 129 |
|
92 | | - public int getId() { |
93 | | - return id; |
| 130 | + Type(PlayerAbility ability, boolean defaultValue) { |
| 131 | + this.ability = ability; |
| 132 | + this.defaultValue = defaultValue; |
94 | 133 | } |
95 | 134 |
|
96 | 135 | public boolean getDefaultValue() { |
97 | 136 | return this.defaultValue; |
98 | 137 | } |
| 138 | + |
| 139 | + public PlayerAbility getAbility() { |
| 140 | + return this.ability; |
| 141 | + } |
| 142 | + |
| 143 | + public boolean isAbility() { |
| 144 | + return this.ability != null; |
| 145 | + } |
99 | 146 | } |
100 | 147 | } |
0 commit comments