|
1 | 1 | package com.lovetropics.extras.item.sensor;
|
2 | 2 |
|
| 3 | +import com.lovetropics.lib.codec.MoreCodecs; |
| 4 | +import com.lovetropics.lib.permission.PermissionsApi; |
| 5 | +import com.lovetropics.lib.permission.role.Role; |
| 6 | +import com.lovetropics.lib.permission.role.RoleReader; |
3 | 7 | import com.mojang.serialization.Codec;
|
4 | 8 | import com.mojang.serialization.codecs.RecordCodecBuilder;
|
5 | 9 | import io.netty.buffer.ByteBuf;
|
|
8 | 12 | import net.minecraft.resources.ResourceLocation;
|
9 | 13 | import net.minecraft.server.level.ServerPlayer;
|
10 | 14 |
|
| 15 | +import java.util.List; |
11 | 16 | import java.util.Optional;
|
12 | 17 |
|
13 | 18 | public record PlayerSensor(
|
14 |
| - String tag, |
| 19 | + List<String> tags, |
| 20 | + List<String> roles, |
15 | 21 | Appearance appearance
|
16 | 22 | ) {
|
17 | 23 | public static final Codec<PlayerSensor> CODEC = RecordCodecBuilder.create(i -> i.group(
|
18 |
| - Codec.STRING.fieldOf("tag").forGetter(PlayerSensor::tag), |
| 24 | + MoreCodecs.listOrUnit(Codec.STRING).optionalFieldOf("tag", List.of()).forGetter(PlayerSensor::tags), |
| 25 | + MoreCodecs.listOrUnit(Codec.STRING).optionalFieldOf("roles", List.of()).forGetter(PlayerSensor::roles), |
19 | 26 | Appearance.CODEC.fieldOf("appearance").forGetter(PlayerSensor::appearance)
|
20 | 27 | ).apply(i, PlayerSensor::new));
|
21 | 28 |
|
22 | 29 | public static final StreamCodec<ByteBuf, PlayerSensor> STREAM_CODEC = StreamCodec.composite(
|
23 |
| - ByteBufCodecs.STRING_UTF8, PlayerSensor::tag, |
| 30 | + ByteBufCodecs.STRING_UTF8.apply(ByteBufCodecs.list()), PlayerSensor::tags, |
| 31 | + ByteBufCodecs.STRING_UTF8.apply(ByteBufCodecs.list()), PlayerSensor::roles, |
24 | 32 | Appearance.STREAM_CODEC, PlayerSensor::appearance,
|
25 | 33 | PlayerSensor::new
|
26 | 34 | );
|
27 | 35 |
|
28 | 36 | public boolean matches(ServerPlayer player) {
|
29 |
| - return player.getTags().contains(tag); |
| 37 | + for (String tag : tags) { |
| 38 | + if (player.getTags().contains(tag)) { |
| 39 | + return true; |
| 40 | + } |
| 41 | + } |
| 42 | + if (!roles.isEmpty()) { |
| 43 | + RoleReader reader = PermissionsApi.lookup().byPlayer(player); |
| 44 | + for (String roleId : roles) { |
| 45 | + Role role = PermissionsApi.provider().get(roleId); |
| 46 | + if (reader.has(role)) { |
| 47 | + return true; |
| 48 | + } |
| 49 | + } |
| 50 | + } |
| 51 | + return false; |
30 | 52 | }
|
31 | 53 |
|
32 | 54 | public record Appearance(
|
|
0 commit comments