Package net.minecraftforge.common
Class ForgeHooks
- java.lang.Object
-
- net.minecraftforge.common.ForgeHooks
-
public class ForgeHooks extends java.lang.Object
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
ForgeHooks.BiomeCallbackFunction
private static class
ForgeHooks.LootTableContext
-
Field Summary
Fields Modifier and Type Field Description private static org.apache.logging.log4j.util.TriConsumer<Block,ToolType,java.lang.Integer>
blockToolSetter
private static LazyValue<com.mojang.serialization.Codec<SimpleRegistry<Dimension>>>
CODEC
private static java.lang.ThreadLocal<PlayerEntity>
craftingPlayer
private static java.lang.String
DIMENSIONS_KEY
private static java.util.Map<EntityType<? extends LivingEntity>,AttributeModifierMap>
FORGE_ATTRIBUTES
private static org.apache.logging.log4j.Marker
FORGEHOOKS
private static org.apache.logging.log4j.Logger
LOGGER
private static java.lang.ThreadLocal<java.util.Deque<ForgeHooks.LootTableContext>>
lootContext
private static java.lang.String
SEED_KEY
private static java.util.Map<IDataSerializer<?>,DataSerializerEntry>
serializerEntries
private static boolean
toolInit
(package private) static java.util.regex.Pattern
URL_PATTERN
private static java.util.Map<IRegistryDelegate<Item>,java.lang.Integer>
VANILLA_BURNS
private static java.util.Set<java.lang.String>
VANILLA_DIMS
-
Constructor Summary
Constructors Constructor Description ForgeHooks()
-
Method Summary
All Methods Static Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static boolean
canContinueUsing(ItemStack from, ItemStack to)
static boolean
canEntityDestroy(World world, BlockPos pos, LivingEntity entity)
static int
canEntitySpawn(MobEntity entity, IWorld world, double x, double y, double z, AbstractSpawner spawner, SpawnReason spawnReason)
static boolean
canHarvestBlock(BlockState state, PlayerEntity player, IBlockReader world, BlockPos pos)
static FluidAttributes
createVanillaFluidAttributes(Fluid fluid)
static <T> void
deserializeTagAdditions(java.util.List<ITag.ITagEntry> list, com.google.gson.JsonObject json, java.util.List<ITag.Proxy> allList)
static Biome
enhanceBiome(ResourceLocation name, Biome.Climate climate, Biome.Category category, java.lang.Float depth, java.lang.Float scale, BiomeAmbience effects, BiomeGenerationSettings gen, MobSpawnInfo spawns, com.mojang.serialization.codecs.RecordCodecBuilder.Instance<Biome> codec, ForgeHooks.BiomeCallbackFunction callback)
static void
fixNullStructureReferences(IChunk chunk, java.util.Map<Structure<?>,it.unimi.dsi.fastutil.longs.LongSet> structureReferences)
Fixes MC-194811 When a structure mod is removed, this map may contain null keys.static <T> com.mojang.serialization.Dynamic<T>
fixUpDimensionsData(com.mojang.serialization.Dynamic<T> data)
Restores previously "deleted" dimensions to the world.static com.google.common.collect.Multimap<Attribute,AttributeModifier>
getAttributeModifiers(ItemStack stack, EquipmentSlotType equipmentSlot, com.google.common.collect.Multimap<Attribute,AttributeModifier> attributes)
Hook to fireItemAttributeModifierEvent
.static java.util.Map<EntityType<? extends LivingEntity>,AttributeModifierMap>
getAttributesView()
Deprecated.static int
getBurnTime(ItemStack stack)
Deprecated.static int
getBurnTime(ItemStack stack, IRecipeType<?> recipeType)
Gets the burn time of this itemstack.static ItemStack
getContainerItem(ItemStack stack)
static PlayerEntity
getCraftingPlayer()
static CriticalHitEvent
getCriticalHit(PlayerEntity player, Entity target, boolean vanillaCritical, float damageModifier)
static java.lang.String
getDefaultCreatorModId(ItemStack itemStack)
Used as the default implementation ofIForgeItem.getCreatorModId(net.minecraft.item.ItemStack)
.static java.lang.String
getDefaultWorldType()
static double
getEntityVisibilityMultiplier(LivingEntity entity, Entity lookingEntity, double originalMultiplier)
static int
getLootingLevel(Entity target, Entity killer, DamageSource cause)
static int
getLootingLevel(LivingEntity target, DamageSource cause, int level)
private static ForgeHooks.LootTableContext
getLootTableContext()
static java.util.List<java.lang.String>
getModPacks()
static java.util.List<java.lang.String>
getModPacksWithVanilla()
static double
getPlayerVisibilityDistance(PlayerEntity player, double xzDistance, double maxXZDistance)
Deprecated.private static <T,E>
TgetPrivateValue(java.lang.Class<? super E> classToAccess, E instance, int fieldIndex)
static IDataSerializer<?>
getSerializer(int id, IntIdentityHashBiMap<IDataSerializer<?>> vanilla)
static int
getSerializerId(IDataSerializer<?> serializer, IntIdentityHashBiMap<IDataSerializer<?>> vanilla)
(package private) static void
initTools()
static boolean
isLivingOnLadder(BlockState state, World world, BlockPos pos, LivingEntity entity)
Deprecated.UseisLivingOnLadderPos(BlockState, World, BlockPos, LivingEntity)
instead in 1.16.static java.util.Optional<BlockPos>
isLivingOnLadderPos(BlockState state, World world, BlockPos pos, LivingEntity entity)
static boolean
isToolEffective(IWorldReader world, BlockPos pos, ItemStack stack)
static LootTable
loadLootTable(com.google.gson.Gson gson, ResourceLocation name, com.google.gson.JsonElement data, boolean custom, LootTableManager lootTableManager)
static void
modifyAttributes()
Deprecated.static java.util.List<ItemStack>
modifyLoot(java.util.List<ItemStack> list, LootContext context)
Deprecated.UsemodifyLoot(ResourceLocation, List, LootContext)
instead.static java.util.List<ItemStack>
modifyLoot(ResourceLocation lootTableId, java.util.List<ItemStack> generatedLoot, LootContext context)
Handles the modification of loot table drops via the registered Global Loot Modifiers, so that custom effects can be processed.static ITextComponent
newChatWithLinks(java.lang.String string)
static ITextComponent
newChatWithLinks(java.lang.String string, boolean allowMissingHeader)
static void
onAdvancement(ServerPlayerEntity player, Advancement advancement)
static boolean
onAnvilChange(RepairContainer container, ItemStack left, ItemStack right, IInventory outputSlot, java.lang.String name, int baseCost)
Deprecated.static boolean
onAnvilChange(RepairContainer container, ItemStack left, ItemStack right, IInventory outputSlot, java.lang.String name, int baseCost, PlayerEntity player)
static float
onAnvilRepair(PlayerEntity player, ItemStack output, ItemStack left, ItemStack right)
static int
onBlockBreakEvent(World world, GameType gameType, ServerPlayerEntity entityPlayer, BlockPos pos)
static boolean
onChangeGameMode(PlayerEntity player, GameType currentGameMode, GameType newGameMode)
static void
onCropsGrowPost(World worldIn, BlockPos pos, BlockState state)
static boolean
onCropsGrowPre(World worldIn, BlockPos pos, BlockState state, boolean def)
static void
onDifficultyChange(Difficulty difficulty, Difficulty oldDifficulty)
static void
onEmptyClick(PlayerEntity player, Hand hand)
static void
onEmptyLeftClick(PlayerEntity player)
static boolean
onFarmlandTrample(World world, BlockPos pos, BlockState state, float fallDistance, Entity entity)
static ActionResultType
onInteractEntity(PlayerEntity player, Entity entity, Hand hand)
static ActionResultType
onInteractEntityAt(PlayerEntity player, Entity entity, RayTraceResult ray, Hand hand)
static ActionResultType
onInteractEntityAt(PlayerEntity player, Entity entity, Vector3d vec3d, Hand hand)
static ActionResultType
onItemRightClick(PlayerEntity player, Hand hand)
static PlayerInteractEvent.LeftClickBlock
onLeftClickBlock(PlayerEntity player, BlockPos pos, Direction face)
static boolean
onLivingAttack(LivingEntity entity, DamageSource src, float amount)
static float
onLivingDamage(LivingEntity entity, DamageSource src, float amount)
static boolean
onLivingDeath(LivingEntity entity, DamageSource src)
static boolean
onLivingDrops(LivingEntity entity, DamageSource source, java.util.Collection<ItemEntity> drops, int lootingLevel, boolean recentlyHit)
static float[]
onLivingFall(LivingEntity entity, float distance, float damageMultiplier)
static float
onLivingHurt(LivingEntity entity, DamageSource src, float amount)
static void
onLivingJump(LivingEntity entity)
static LivingKnockBackEvent
onLivingKnockBack(LivingEntity target, float strength, double ratioX, double ratioZ)
static void
onLivingSetAttackTarget(LivingEntity entity, LivingEntity target)
static boolean
onLivingUpdate(LivingEntity entity)
static int
onNoteChange(World world, BlockPos pos, BlockState state, int old, int _new)
static boolean
onPickBlock(RayTraceResult target, PlayerEntity player, World world)
Called when a player uses 'pick block', calls new Entity and Block hooks.static ActionResultType
onPlaceItemIntoWorld(ItemUseContext context)
static boolean
onPlayerAttack(LivingEntity entity, DamageSource src, float amount)
static boolean
onPlayerAttackTarget(PlayerEntity player, Entity target)
static ItemEntity
onPlayerTossEvent(PlayerEntity player, ItemStack item, boolean includeName)
static PlayerInteractEvent.RightClickBlock
onRightClickBlock(PlayerEntity player, Hand hand, BlockPos pos, Direction face)
Deprecated.static PlayerInteractEvent.RightClickBlock
onRightClickBlock(PlayerEntity player, Hand hand, BlockPos pos, BlockRayTraceResult hitVec)
static ITextComponent
onServerChatEvent(ServerPlayNetHandler net, java.lang.String raw, ITextComponent comp)
static boolean
onTravelToDimension(Entity entity, RegistryKey<World> dimension)
static AttributeModifierMap
putAttributesOld(EntityType<? extends LivingEntity> type, AttributeModifierMap map)
Deprecated.static java.lang.String
readLootEntryName(com.google.gson.JsonObject json, java.lang.String type)
static java.lang.String
readPoolName(com.google.gson.JsonObject json)
static void
setBlockToolSetter(org.apache.logging.log4j.util.TriConsumer<Block,ToolType,java.lang.Integer> setter)
static void
setCraftingPlayer(PlayerEntity player)
static void
updateBurns()
-
-
-
Field Detail
-
LOGGER
private static final org.apache.logging.log4j.Logger LOGGER
-
FORGEHOOKS
private static final org.apache.logging.log4j.Marker FORGEHOOKS
-
toolInit
private static boolean toolInit
-
URL_PATTERN
static final java.util.regex.Pattern URL_PATTERN
-
craftingPlayer
private static java.lang.ThreadLocal<PlayerEntity> craftingPlayer
-
lootContext
private static java.lang.ThreadLocal<java.util.Deque<ForgeHooks.LootTableContext>> lootContext
-
blockToolSetter
private static org.apache.logging.log4j.util.TriConsumer<Block,ToolType,java.lang.Integer> blockToolSetter
-
serializerEntries
private static final java.util.Map<IDataSerializer<?>,DataSerializerEntry> serializerEntries
-
VANILLA_BURNS
private static final java.util.Map<IRegistryDelegate<Item>,java.lang.Integer> VANILLA_BURNS
-
VANILLA_DIMS
private static final java.util.Set<java.lang.String> VANILLA_DIMS
-
DIMENSIONS_KEY
private static final java.lang.String DIMENSIONS_KEY
- See Also:
- Constant Field Values
-
SEED_KEY
private static final java.lang.String SEED_KEY
- See Also:
- Constant Field Values
-
CODEC
private static final LazyValue<com.mojang.serialization.Codec<SimpleRegistry<Dimension>>> CODEC
-
FORGE_ATTRIBUTES
private static final java.util.Map<EntityType<? extends LivingEntity>,AttributeModifierMap> FORGE_ATTRIBUTES
-
-
Method Detail
-
canContinueUsing
public static boolean canContinueUsing(@Nonnull ItemStack from, @Nonnull ItemStack to)
-
canHarvestBlock
public static boolean canHarvestBlock(@Nonnull BlockState state, @Nonnull PlayerEntity player, @Nonnull IBlockReader world, @Nonnull BlockPos pos)
-
isToolEffective
public static boolean isToolEffective(IWorldReader world, BlockPos pos, @Nonnull ItemStack stack)
-
initTools
static void initTools()
-
onPickBlock
public static boolean onPickBlock(RayTraceResult target, PlayerEntity player, World world)
Called when a player uses 'pick block', calls new Entity and Block hooks.
-
onDifficultyChange
public static void onDifficultyChange(Difficulty difficulty, Difficulty oldDifficulty)
-
onLivingSetAttackTarget
public static void onLivingSetAttackTarget(LivingEntity entity, LivingEntity target)
-
onLivingUpdate
public static boolean onLivingUpdate(LivingEntity entity)
-
onLivingAttack
public static boolean onLivingAttack(LivingEntity entity, DamageSource src, float amount)
-
onPlayerAttack
public static boolean onPlayerAttack(LivingEntity entity, DamageSource src, float amount)
-
onLivingKnockBack
public static LivingKnockBackEvent onLivingKnockBack(LivingEntity target, float strength, double ratioX, double ratioZ)
-
onLivingHurt
public static float onLivingHurt(LivingEntity entity, DamageSource src, float amount)
-
onLivingDamage
public static float onLivingDamage(LivingEntity entity, DamageSource src, float amount)
-
onLivingDeath
public static boolean onLivingDeath(LivingEntity entity, DamageSource src)
-
onLivingDrops
public static boolean onLivingDrops(LivingEntity entity, DamageSource source, java.util.Collection<ItemEntity> drops, int lootingLevel, boolean recentlyHit)
-
onLivingFall
@Nullable public static float[] onLivingFall(LivingEntity entity, float distance, float damageMultiplier)
-
getLootingLevel
public static int getLootingLevel(Entity target, @Nullable Entity killer, DamageSource cause)
-
getLootingLevel
public static int getLootingLevel(LivingEntity target, DamageSource cause, int level)
-
getPlayerVisibilityDistance
@Deprecated public static double getPlayerVisibilityDistance(PlayerEntity player, double xzDistance, double maxXZDistance)
Deprecated.TODO 1.17 remove Unused
-
getEntityVisibilityMultiplier
public static double getEntityVisibilityMultiplier(LivingEntity entity, Entity lookingEntity, double originalMultiplier)
-
isLivingOnLadder
@Deprecated public static boolean isLivingOnLadder(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull LivingEntity entity)
Deprecated.UseisLivingOnLadderPos(BlockState, World, BlockPos, LivingEntity)
instead in 1.16.
-
isLivingOnLadderPos
public static java.util.Optional<BlockPos> isLivingOnLadderPos(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull LivingEntity entity)
-
onLivingJump
public static void onLivingJump(LivingEntity entity)
-
onPlayerTossEvent
@Nullable public static ItemEntity onPlayerTossEvent(@Nonnull PlayerEntity player, @Nonnull ItemStack item, boolean includeName)
-
onServerChatEvent
@Nullable public static ITextComponent onServerChatEvent(ServerPlayNetHandler net, java.lang.String raw, ITextComponent comp)
-
newChatWithLinks
public static ITextComponent newChatWithLinks(java.lang.String string)
-
newChatWithLinks
public static ITextComponent newChatWithLinks(java.lang.String string, boolean allowMissingHeader)
-
onBlockBreakEvent
public static int onBlockBreakEvent(World world, GameType gameType, ServerPlayerEntity entityPlayer, BlockPos pos)
-
onPlaceItemIntoWorld
public static ActionResultType onPlaceItemIntoWorld(@Nonnull ItemUseContext context)
-
onAnvilChange
@Deprecated public static boolean onAnvilChange(RepairContainer container, @Nonnull ItemStack left, @Nonnull ItemStack right, IInventory outputSlot, java.lang.String name, int baseCost)
Deprecated.
-
onAnvilChange
public static boolean onAnvilChange(RepairContainer container, @Nonnull ItemStack left, @Nonnull ItemStack right, IInventory outputSlot, java.lang.String name, int baseCost, PlayerEntity player)
-
onAnvilRepair
public static float onAnvilRepair(PlayerEntity player, @Nonnull ItemStack output, @Nonnull ItemStack left, @Nonnull ItemStack right)
-
setCraftingPlayer
public static void setCraftingPlayer(PlayerEntity player)
-
getCraftingPlayer
public static PlayerEntity getCraftingPlayer()
-
onPlayerAttackTarget
public static boolean onPlayerAttackTarget(PlayerEntity player, Entity target)
-
onTravelToDimension
public static boolean onTravelToDimension(Entity entity, RegistryKey<World> dimension)
-
onInteractEntityAt
public static ActionResultType onInteractEntityAt(PlayerEntity player, Entity entity, RayTraceResult ray, Hand hand)
-
onInteractEntityAt
public static ActionResultType onInteractEntityAt(PlayerEntity player, Entity entity, Vector3d vec3d, Hand hand)
-
onInteractEntity
public static ActionResultType onInteractEntity(PlayerEntity player, Entity entity, Hand hand)
-
onItemRightClick
public static ActionResultType onItemRightClick(PlayerEntity player, Hand hand)
-
onLeftClickBlock
public static PlayerInteractEvent.LeftClickBlock onLeftClickBlock(PlayerEntity player, BlockPos pos, Direction face)
-
onRightClickBlock
@Deprecated public static PlayerInteractEvent.RightClickBlock onRightClickBlock(PlayerEntity player, Hand hand, BlockPos pos, Direction face)
Deprecated.
-
onRightClickBlock
public static PlayerInteractEvent.RightClickBlock onRightClickBlock(PlayerEntity player, Hand hand, BlockPos pos, BlockRayTraceResult hitVec)
-
onEmptyClick
public static void onEmptyClick(PlayerEntity player, Hand hand)
-
onEmptyLeftClick
public static void onEmptyLeftClick(PlayerEntity player)
-
onChangeGameMode
public static boolean onChangeGameMode(PlayerEntity player, GameType currentGameMode, GameType newGameMode)
-
getLootTableContext
private static ForgeHooks.LootTableContext getLootTableContext()
-
loadLootTable
@Nullable public static LootTable loadLootTable(com.google.gson.Gson gson, ResourceLocation name, com.google.gson.JsonElement data, boolean custom, LootTableManager lootTableManager)
-
createVanillaFluidAttributes
public static FluidAttributes createVanillaFluidAttributes(Fluid fluid)
-
getDefaultWorldType
public static java.lang.String getDefaultWorldType()
-
enhanceBiome
public static Biome enhanceBiome(@Nullable ResourceLocation name, Biome.Climate climate, Biome.Category category, java.lang.Float depth, java.lang.Float scale, BiomeAmbience effects, BiomeGenerationSettings gen, MobSpawnInfo spawns, com.mojang.serialization.codecs.RecordCodecBuilder.Instance<Biome> codec, ForgeHooks.BiomeCallbackFunction callback)
-
readPoolName
public static java.lang.String readPoolName(com.google.gson.JsonObject json)
-
readLootEntryName
public static java.lang.String readLootEntryName(com.google.gson.JsonObject json, java.lang.String type)
-
onCropsGrowPre
public static boolean onCropsGrowPre(World worldIn, BlockPos pos, BlockState state, boolean def)
-
onCropsGrowPost
public static void onCropsGrowPost(World worldIn, BlockPos pos, BlockState state)
-
getCriticalHit
@Nullable public static CriticalHitEvent getCriticalHit(PlayerEntity player, Entity target, boolean vanillaCritical, float damageModifier)
-
onAdvancement
public static void onAdvancement(ServerPlayerEntity player, Advancement advancement)
-
getAttributeModifiers
public static com.google.common.collect.Multimap<Attribute,AttributeModifier> getAttributeModifiers(ItemStack stack, EquipmentSlotType equipmentSlot, com.google.common.collect.Multimap<Attribute,AttributeModifier> attributes)
Hook to fireItemAttributeModifierEvent
. Modders should useItemStack.getAttributeModifiers(EquipmentSlotType)
instead.
-
getDefaultCreatorModId
@Nullable public static java.lang.String getDefaultCreatorModId(@Nonnull ItemStack itemStack)
Used as the default implementation ofIForgeItem.getCreatorModId(net.minecraft.item.ItemStack)
. Call that method instead.
-
onFarmlandTrample
public static boolean onFarmlandTrample(World world, BlockPos pos, BlockState state, float fallDistance, Entity entity)
-
setBlockToolSetter
public static void setBlockToolSetter(org.apache.logging.log4j.util.TriConsumer<Block,ToolType,java.lang.Integer> setter)
-
getPrivateValue
private static <T,E> T getPrivateValue(java.lang.Class<? super E> classToAccess, @Nullable E instance, int fieldIndex)
-
onNoteChange
public static int onNoteChange(World world, BlockPos pos, BlockState state, int old, int _new)
-
canEntitySpawn
public static int canEntitySpawn(MobEntity entity, IWorld world, double x, double y, double z, AbstractSpawner spawner, SpawnReason spawnReason)
-
deserializeTagAdditions
public static <T> void deserializeTagAdditions(java.util.List<ITag.ITagEntry> list, com.google.gson.JsonObject json, java.util.List<ITag.Proxy> allList)
-
getSerializer
@Nullable public static IDataSerializer<?> getSerializer(int id, IntIdentityHashBiMap<IDataSerializer<?>> vanilla)
-
getSerializerId
public static int getSerializerId(IDataSerializer<?> serializer, IntIdentityHashBiMap<IDataSerializer<?>> vanilla)
-
canEntityDestroy
public static boolean canEntityDestroy(World world, BlockPos pos, LivingEntity entity)
-
getBurnTime
@Deprecated public static int getBurnTime(ItemStack stack)
Deprecated.
-
getBurnTime
public static int getBurnTime(ItemStack stack, @Nullable IRecipeType<?> recipeType)
Gets the burn time of this itemstack.
-
updateBurns
public static void updateBurns()
-
modifyLoot
@Deprecated public static java.util.List<ItemStack> modifyLoot(java.util.List<ItemStack> list, LootContext context)
Deprecated.UsemodifyLoot(ResourceLocation, List, LootContext)
instead.All loot table drops should be passed to this function so that mod added effects (e.g. smelting enchantments) can be processed.- Parameters:
list
- The loot generatedcontext
- The loot context that generated that loot- Returns:
- The modified list
-
modifyLoot
public static java.util.List<ItemStack> modifyLoot(ResourceLocation lootTableId, java.util.List<ItemStack> generatedLoot, LootContext context)
Handles the modification of loot table drops via the registered Global Loot Modifiers, so that custom effects can be processed.All loot-table generated loot should be passed to this function.
- Parameters:
lootTableId
- The ID of the loot table currently being queriedgeneratedLoot
- The loot generated by the loot tablecontext
- The loot context that generated the loot, unmodified- Returns:
- The modified list of drops
-
getModPacks
public static java.util.List<java.lang.String> getModPacks()
-
getModPacksWithVanilla
public static java.util.List<java.lang.String> getModPacksWithVanilla()
-
fixNullStructureReferences
public static void fixNullStructureReferences(IChunk chunk, java.util.Map<Structure<?>,it.unimi.dsi.fastutil.longs.LongSet> structureReferences)
Fixes MC-194811 When a structure mod is removed, this map may contain null keys. This will make the world unable to save if this persists. If we remove a structure from the save data in this way, we then mark the chunk for saving
-
fixUpDimensionsData
public static <T> com.mojang.serialization.Dynamic<T> fixUpDimensionsData(com.mojang.serialization.Dynamic<T> data)
Restores previously "deleted" dimensions to the world. TheLenientUnboundedMapCodec
prevents this from happening, this is to fix any world from before the fix.
-
getAttributesView
@Deprecated public static java.util.Map<EntityType<? extends LivingEntity>,AttributeModifierMap> getAttributesView()
Deprecated.FOR INTERNAL USE ONLY, DO NOT CALL DIRECTLY
-
putAttributesOld
@Deprecated public static AttributeModifierMap putAttributesOld(EntityType<? extends LivingEntity> type, AttributeModifierMap map)
Deprecated.FOR INTERNAL USE ONLY, DO NOT CALL DIRECTLY ONLY EXISTS FOR LEGACY REASONS SHOULD BE REMOVED IN 1.17
-
modifyAttributes
@Deprecated public static void modifyAttributes()
Deprecated.FOR INTERNAL USE ONLY, DO NOT CALL DIRECTLY
-
-