Skip to content

Commit d942ba0

Browse files
committed
Add MobVisibility item component
1 parent d724d75 commit d942ba0

6 files changed

Lines changed: 87 additions & 0 deletions

File tree

‎paper-api/src/main/java/io/papermc/paper/datacomponent/DataComponentTypes.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.papermc.paper.datacomponent.item.LodestoneTracker;
2828
import io.papermc.paper.datacomponent.item.MapDecorations;
2929
import io.papermc.paper.datacomponent.item.MapId;
30+
import io.papermc.paper.datacomponent.item.MobVisibility;
3031
import io.papermc.paper.datacomponent.item.OminousBottleAmplifier;
3132
import io.papermc.paper.datacomponent.item.PiercingWeapon;
3233
import io.papermc.paper.datacomponent.item.PotDecorations;
@@ -393,6 +394,7 @@ public final class DataComponentTypes {
393394
public static final DataComponentType.Valued<DyeColor> SHULKER_COLOR = valued("shulker/color");
394395
public static final DataComponentType.NonValued WAXED = unvalued("waxed");
395396
public static final DataComponentType.Valued<DyeColor> CUSHION_COLOR = valued("cushion/color");
397+
public static final DataComponentType.Valued<MobVisibility> MOB_VISIBILITY = valued("mob_visibility");
396398

397399
private static DataComponentType.NonValued unvalued(@KeyPattern.Value final String key) {
398400
final DataComponentType dataComponentType = Registry.DATA_COMPONENT_TYPE.getOrThrow(Key.key(Key.MINECRAFT_NAMESPACE, key));

‎paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemComponentTypesBridge.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.bukkit.JukeboxSong;
1212
import org.bukkit.block.BlockType;
1313
import org.bukkit.damage.DamageType;
14+
import org.bukkit.entity.EntityType;
1415
import org.bukkit.inventory.EquipmentSlot;
1516
import org.bukkit.inventory.ItemStack;
1617
import org.bukkit.inventory.ItemType;
@@ -129,4 +130,6 @@ static ItemComponentTypesBridge bridge() {
129130
KineticWeapon.Condition kineticWeaponCondition(int maxDurationTicks, float minSpeed, float minRelativeSpeed);
130131

131132
SulfurCubeContent sulfurCubeContent(ItemStack absorbedItem);
133+
134+
MobVisibility mobVisibility(RegistryKeySet<EntityType> targetingEntityTypes, float visibility);
132135
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.papermc.paper.datacomponent.item;
2+
3+
import io.papermc.paper.datacomponent.DataComponentTypes;
4+
import io.papermc.paper.registry.set.RegistryKeySet;
5+
import org.bukkit.entity.EntityType;
6+
import org.jetbrains.annotations.ApiStatus;
7+
import org.jetbrains.annotations.Contract;
8+
import org.jetbrains.annotations.Range;
9+
import org.jspecify.annotations.NullMarked;
10+
11+
/**
12+
* Represents the visibility percentage provided by an item with the appropriate {@link DataComponentTypes#EQUIPPABLE} component,
13+
* modifying the range at which mobs are able to detect an entity.
14+
*
15+
* @see io.papermc.paper.datacomponent.DataComponentTypes#MOB_VISIBILITY
16+
*/
17+
@NullMarked
18+
@ApiStatus.NonExtendable
19+
public interface MobVisibility {
20+
21+
static MobVisibility mobVisibility(RegistryKeySet<EntityType> targetingEntityTypes, @Range(from = 0, to = 10) float visibility) {
22+
return ItemComponentTypesBridge.bridge().mobVisibility(targetingEntityTypes, visibility);
23+
}
24+
25+
/**
26+
* Gets the set of entity types that this item modifies the visibility for.
27+
*
28+
* @return the set of entity types
29+
*/
30+
@Contract(pure = true)
31+
RegistryKeySet<EntityType> targetingEntityTypes();
32+
33+
/**
34+
* Gets the visibility provided by this item, modifying the range at which mobs are able to detect an entity.
35+
*
36+
* @return the visibility
37+
*/
38+
@Contract(pure = true)
39+
@Range(from = 0, to = 10) float visibility();
40+
}

‎paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io.papermc.paper.datacomponent.item.PaperLodestoneTracker;
2929
import io.papermc.paper.datacomponent.item.PaperMapDecorations;
3030
import io.papermc.paper.datacomponent.item.PaperMapId;
31+
import io.papermc.paper.datacomponent.item.PaperMobVisibility;
3132
import io.papermc.paper.datacomponent.item.PaperOminousBottleAmplifier;
3233
import io.papermc.paper.datacomponent.item.PaperPiercingWeapon;
3334
import io.papermc.paper.datacomponent.item.PaperPotDecorations;
@@ -216,6 +217,7 @@ public static void bootstrap() {
216217
register(DataComponents.SHULKER_COLOR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData()));
217218
registerUntyped(DataComponents.WAXED);
218219
register(DataComponents.CUSHION_COLOR, nms -> DyeColor.getByWoolData((byte) nms.getId()), api -> net.minecraft.world.item.DyeColor.byId(api.getWoolData()));
220+
register(DataComponents.MOB_VISIBILITY, PaperMobVisibility::new);
219221

220222
for (final ResourceKey<DataComponentType<?>> key : BuiltInRegistries.DATA_COMPONENT_TYPE.registryKeySet()) {
221223
if (!ADAPTERS.containsKey(key)) {

‎paper-server/src/main/java/io/papermc/paper/datacomponent/item/ItemComponentTypesBridgesImpl.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import com.destroystokyo.paper.profile.PlayerProfile;
44
import com.google.common.base.Preconditions;
5+
import io.papermc.paper.registry.RegistryKey;
56
import io.papermc.paper.registry.data.util.Conversions;
67
import io.papermc.paper.registry.set.PaperRegistrySets;
78
import io.papermc.paper.registry.set.RegistryKeySet;
89
import io.papermc.paper.text.Filtered;
10+
import java.util.stream.Collectors;
911
import net.kyori.adventure.key.Key;
1012
import net.kyori.adventure.util.TriState;
1113
import net.minecraft.core.registries.Registries;
@@ -14,6 +16,7 @@
1416
import org.bukkit.block.BlockType;
1517
import org.bukkit.craftbukkit.inventory.CraftItemStack;
1618
import org.bukkit.damage.DamageType;
19+
import org.bukkit.entity.EntityType;
1720
import org.bukkit.inventory.EquipmentSlot;
1821
import org.bukkit.inventory.ItemStack;
1922
import org.bukkit.inventory.ItemType;
@@ -288,4 +291,14 @@ public SulfurCubeContent sulfurCubeContent(final ItemStack absorbedItem) {
288291
Preconditions.checkArgument(!absorbedItem.isEmpty(), "absorbedItem cannot be empty");
289292
return new PaperSulfurCubeContent(new net.minecraft.world.item.component.SulfurCubeContent(CraftItemStack.asTemplate(absorbedItem)));
290293
}
294+
295+
@Override
296+
public MobVisibility mobVisibility(final RegistryKeySet<EntityType> targetingEntityTypes, final float visibility) {
297+
Preconditions.checkArgument(targetingEntityTypes != null, "targetingEntityTypes cannot be null");
298+
Preconditions.checkArgument(!targetingEntityTypes.isEmpty(), "targetingEntityTypes cannot be empty");
299+
return new PaperMobVisibility(new net.minecraft.world.item.component.MobVisibility(
300+
PaperRegistrySets.convertToNms(Registries.ENTITY_TYPE, Conversions.global().lookup(), targetingEntityTypes),
301+
requireRange(visibility, "visibility", net.minecraft.world.item.component.MobVisibility.MIN_VISIBILITY, net.minecraft.world.item.component.MobVisibility.MAX_VISIBILITY))
302+
);
303+
}
291304
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.papermc.paper.datacomponent.item;
2+
3+
import io.papermc.paper.registry.RegistryKey;
4+
import io.papermc.paper.registry.set.PaperRegistrySets;
5+
import io.papermc.paper.registry.set.RegistryKeySet;
6+
import org.bukkit.craftbukkit.util.Handleable;
7+
import org.bukkit.entity.EntityType;
8+
9+
public record PaperMobVisibility(
10+
net.minecraft.world.item.component.MobVisibility impl
11+
) implements MobVisibility, Handleable<net.minecraft.world.item.component.MobVisibility> {
12+
13+
@Override
14+
public net.minecraft.world.item.component.MobVisibility getHandle() {
15+
return this.impl;
16+
}
17+
18+
@Override
19+
public RegistryKeySet<EntityType> targetingEntityTypes() {
20+
return PaperRegistrySets.convertToApi(RegistryKey.ENTITY_TYPE, this.impl.targetingEntityTypes());
21+
}
22+
23+
@Override
24+
public float visibility() {
25+
return this.impl.visibility();
26+
}
27+
}

0 commit comments

Comments
 (0)