Skip to content

Commit 7abe65b

Browse files
MrHell228aromaa
andauthored
Add DefaultedTag (#2592)
* add DefaultedTag * generate tags using DefaultedTag * simplify generics in RegistryTypes --------- Co-authored-by: aromaa <me@joniaromaa.fi>
1 parent 267c5df commit 7abe65b

13 files changed

Lines changed: 638 additions & 582 deletions

File tree

src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageType.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.spongepowered.api.entity.Entity;
3030
import org.spongepowered.api.event.cause.entity.damage.source.DamageSource;
3131
import org.spongepowered.api.registry.DefaultedRegistryValue;
32-
import org.spongepowered.api.tag.Tag;
3332
import org.spongepowered.api.tag.Taggable;
3433
import org.spongepowered.api.util.CopyableBuilder;
3534
import org.spongepowered.api.util.Nameable;
@@ -65,15 +64,6 @@ static Builder builder() {
6564
*/
6665
double exhaustion();
6766

68-
/**
69-
* Checks whether this damage types matches a damage type tag.
70-
*
71-
* @param tag The tag to check.
72-
* @return true if this damage type matches the damage type tag.
73-
*/
74-
@Override
75-
boolean is(Tag<DamageType> tag);
76-
7767
/**
7868
* Returns the damage scaling.
7969
*

src/main/java/org/spongepowered/api/registry/Registry.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030

3131
import java.util.Objects;
3232
import java.util.Optional;
33-
import java.util.Set;
3433
import java.util.stream.Stream;
3534

3635
/**
@@ -128,7 +127,7 @@ default <V extends T> Optional<V> findValue(final RegistryKey<T> key) {
128127
*
129128
* @return The registered types associated with given tag
130129
*/
131-
<V extends T> Set<V> taggedValues(Tag<T> tag);
130+
<V extends T> Stream<V> taggedValues(Tag<T> tag);
132131

133132
/**
134133
* Gets the tags associated with this registry.

src/main/java/org/spongepowered/api/registry/RegistryTypes.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
*/
2525
package org.spongepowered.api.registry;
2626

27-
import org.checkerframework.checker.nullness.qual.NonNull;
2827
import org.spongepowered.api.ResourceKey;
2928
import org.spongepowered.api.Sponge;
3029
import org.spongepowered.api.advancement.Advancement;
@@ -103,7 +102,6 @@
103102
import org.spongepowered.api.effect.potion.PotionEffectType;
104103
import org.spongepowered.api.effect.sound.SoundType;
105104
import org.spongepowered.api.effect.sound.music.MusicDisc;
106-
import org.spongepowered.api.entity.Entity;
107105
import org.spongepowered.api.entity.EntityCategory;
108106
import org.spongepowered.api.entity.EntityType;
109107
import org.spongepowered.api.entity.ai.goal.GoalExecutorType;
@@ -234,7 +232,7 @@ public final class RegistryTypes {
234232

235233
public static final DefaultedRegistryType<EntityCategory> ENTITY_CATEGORY = RegistryTypes.spongeKeyInGame("mob_category");
236234

237-
public static final DefaultedRegistryType<EntityType<? extends @NonNull Entity>> ENTITY_TYPE = RegistryTypes.minecraftKeyInGame("entity_type");
235+
public static final DefaultedRegistryType<EntityType<?>> ENTITY_TYPE = RegistryTypes.minecraftKeyInGame("entity_type");
238236

239237
public static final DefaultedRegistryType<Feature> FEATURE = RegistryTypes.minecraftKeyInServer("worldgen/configured_feature");
240238

@@ -270,7 +268,7 @@ public final class RegistryTypes {
270268

271269
public static final DefaultedRegistryType<PotionType> POTION_TYPE = RegistryTypes.minecraftKeyInGame("potion");
272270

273-
public static final DefaultedRegistryType<RecipeType<? extends @NonNull Recipe<?>>> RECIPE_TYPE = RegistryTypes.minecraftKeyInGame("recipe_type");
271+
public static final DefaultedRegistryType<RecipeType<?>> RECIPE_TYPE = RegistryTypes.minecraftKeyInGame("recipe_type");
274272

275273
public static final DefaultedRegistryType<SoundType> SOUND_TYPE = RegistryTypes.minecraftKeyInGame("sound_event");
276274

@@ -284,7 +282,7 @@ public final class RegistryTypes {
284282

285283
public static final DefaultedRegistryType<StructureType> STRUCTURE_TYPE = RegistryTypes.minecraftKeyInGame("worldgen/structure_type");
286284

287-
public static final DefaultedRegistryType<Trigger<? extends @NonNull Object>> TRIGGER = RegistryTypes.minecraftKeyInGame("trigger_type");
285+
public static final DefaultedRegistryType<Trigger<?>> TRIGGER = RegistryTypes.minecraftKeyInGame("trigger_type");
288286

289287
public static final DefaultedRegistryType<TrimMaterial> TRIM_MATERIAL = RegistryTypes.minecraftKeyInServer("trim_material");
290288

@@ -337,7 +335,7 @@ public final class RegistryTypes {
337335

338336
public static final DefaultedRegistryType<CommandRegistrarType<?>> COMMAND_REGISTRAR_TYPE = RegistryTypes.spongeKeyInGame("command_registrar_type");
339337

340-
public static final DefaultedRegistryType<CommandTreeNodeType<? extends @NonNull Object>> COMMAND_TREE_NODE_TYPE = RegistryTypes.spongeKeyInServer("command_tree_node_type");
338+
public static final DefaultedRegistryType<CommandTreeNodeType<?>> COMMAND_TREE_NODE_TYPE = RegistryTypes.spongeKeyInServer("command_tree_node_type");
341339

342340
public static final DefaultedRegistryType<ComparatorMode> COMPARATOR_MODE = RegistryTypes.spongeKeyInGame("comparator_mode");
343341

src/main/java/org/spongepowered/api/tag/BiomeTags.java

Lines changed: 72 additions & 72 deletions
Large diffs are not rendered by default.

src/main/java/org/spongepowered/api/tag/BlockTypeTags.java

Lines changed: 188 additions & 188 deletions
Large diffs are not rendered by default.

src/main/java/org/spongepowered/api/tag/DamageTypeTags.java

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -37,76 +37,76 @@
3737
@RegistryScopes(scopes = RegistryScope.GAME)
3838
public final class DamageTypeTags {
3939

40-
public static final Tag<DamageType> ALWAYS_HURTS_ENDER_DRAGONS = DamageTypeTags.key(ResourceKey.minecraft("always_hurts_ender_dragons"));
40+
public static final DefaultedTag<DamageType> ALWAYS_HURTS_ENDER_DRAGONS = DamageTypeTags.key(ResourceKey.minecraft("always_hurts_ender_dragons"));
4141

42-
public static final Tag<DamageType> ALWAYS_KILLS_ARMOR_STANDS = DamageTypeTags.key(ResourceKey.minecraft("always_kills_armor_stands"));
42+
public static final DefaultedTag<DamageType> ALWAYS_KILLS_ARMOR_STANDS = DamageTypeTags.key(ResourceKey.minecraft("always_kills_armor_stands"));
4343

44-
public static final Tag<DamageType> ALWAYS_MOST_SIGNIFICANT_FALL = DamageTypeTags.key(ResourceKey.minecraft("always_most_significant_fall"));
44+
public static final DefaultedTag<DamageType> ALWAYS_MOST_SIGNIFICANT_FALL = DamageTypeTags.key(ResourceKey.minecraft("always_most_significant_fall"));
4545

46-
public static final Tag<DamageType> ALWAYS_TRIGGERS_SILVERFISH = DamageTypeTags.key(ResourceKey.minecraft("always_triggers_silverfish"));
46+
public static final DefaultedTag<DamageType> ALWAYS_TRIGGERS_SILVERFISH = DamageTypeTags.key(ResourceKey.minecraft("always_triggers_silverfish"));
4747

48-
public static final Tag<DamageType> AVOIDS_GUARDIAN_THORNS = DamageTypeTags.key(ResourceKey.minecraft("avoids_guardian_thorns"));
48+
public static final DefaultedTag<DamageType> AVOIDS_GUARDIAN_THORNS = DamageTypeTags.key(ResourceKey.minecraft("avoids_guardian_thorns"));
4949

50-
public static final Tag<DamageType> BURN_FROM_STEPPING = DamageTypeTags.key(ResourceKey.minecraft("burn_from_stepping"));
50+
public static final DefaultedTag<DamageType> BURN_FROM_STEPPING = DamageTypeTags.key(ResourceKey.minecraft("burn_from_stepping"));
5151

52-
public static final Tag<DamageType> BURNS_ARMOR_STANDS = DamageTypeTags.key(ResourceKey.minecraft("burns_armor_stands"));
52+
public static final DefaultedTag<DamageType> BURNS_ARMOR_STANDS = DamageTypeTags.key(ResourceKey.minecraft("burns_armor_stands"));
5353

54-
public static final Tag<DamageType> BYPASSES_ARMOR = DamageTypeTags.key(ResourceKey.minecraft("bypasses_armor"));
54+
public static final DefaultedTag<DamageType> BYPASSES_ARMOR = DamageTypeTags.key(ResourceKey.minecraft("bypasses_armor"));
5555

56-
public static final Tag<DamageType> BYPASSES_EFFECTS = DamageTypeTags.key(ResourceKey.minecraft("bypasses_effects"));
56+
public static final DefaultedTag<DamageType> BYPASSES_EFFECTS = DamageTypeTags.key(ResourceKey.minecraft("bypasses_effects"));
5757

58-
public static final Tag<DamageType> BYPASSES_ENCHANTMENTS = DamageTypeTags.key(ResourceKey.minecraft("bypasses_enchantments"));
58+
public static final DefaultedTag<DamageType> BYPASSES_ENCHANTMENTS = DamageTypeTags.key(ResourceKey.minecraft("bypasses_enchantments"));
5959

60-
public static final Tag<DamageType> BYPASSES_INVULNERABILITY = DamageTypeTags.key(ResourceKey.minecraft("bypasses_invulnerability"));
60+
public static final DefaultedTag<DamageType> BYPASSES_INVULNERABILITY = DamageTypeTags.key(ResourceKey.minecraft("bypasses_invulnerability"));
6161

62-
public static final Tag<DamageType> BYPASSES_RESISTANCE = DamageTypeTags.key(ResourceKey.minecraft("bypasses_resistance"));
62+
public static final DefaultedTag<DamageType> BYPASSES_RESISTANCE = DamageTypeTags.key(ResourceKey.minecraft("bypasses_resistance"));
6363

64-
public static final Tag<DamageType> BYPASSES_SHIELD = DamageTypeTags.key(ResourceKey.minecraft("bypasses_shield"));
64+
public static final DefaultedTag<DamageType> BYPASSES_SHIELD = DamageTypeTags.key(ResourceKey.minecraft("bypasses_shield"));
6565

66-
public static final Tag<DamageType> BYPASSES_WOLF_ARMOR = DamageTypeTags.key(ResourceKey.minecraft("bypasses_wolf_armor"));
66+
public static final DefaultedTag<DamageType> BYPASSES_WOLF_ARMOR = DamageTypeTags.key(ResourceKey.minecraft("bypasses_wolf_armor"));
6767

68-
public static final Tag<DamageType> CAN_BREAK_ARMOR_STAND = DamageTypeTags.key(ResourceKey.minecraft("can_break_armor_stand"));
68+
public static final DefaultedTag<DamageType> CAN_BREAK_ARMOR_STAND = DamageTypeTags.key(ResourceKey.minecraft("can_break_armor_stand"));
6969

70-
public static final Tag<DamageType> DAMAGES_HELMET = DamageTypeTags.key(ResourceKey.minecraft("damages_helmet"));
70+
public static final DefaultedTag<DamageType> DAMAGES_HELMET = DamageTypeTags.key(ResourceKey.minecraft("damages_helmet"));
7171

72-
public static final Tag<DamageType> IGNITES_ARMOR_STANDS = DamageTypeTags.key(ResourceKey.minecraft("ignites_armor_stands"));
72+
public static final DefaultedTag<DamageType> IGNITES_ARMOR_STANDS = DamageTypeTags.key(ResourceKey.minecraft("ignites_armor_stands"));
7373

74-
public static final Tag<DamageType> IS_DROWNING = DamageTypeTags.key(ResourceKey.minecraft("is_drowning"));
74+
public static final DefaultedTag<DamageType> IS_DROWNING = DamageTypeTags.key(ResourceKey.minecraft("is_drowning"));
7575

76-
public static final Tag<DamageType> IS_EXPLOSION = DamageTypeTags.key(ResourceKey.minecraft("is_explosion"));
76+
public static final DefaultedTag<DamageType> IS_EXPLOSION = DamageTypeTags.key(ResourceKey.minecraft("is_explosion"));
7777

78-
public static final Tag<DamageType> IS_FALL = DamageTypeTags.key(ResourceKey.minecraft("is_fall"));
78+
public static final DefaultedTag<DamageType> IS_FALL = DamageTypeTags.key(ResourceKey.minecraft("is_fall"));
7979

80-
public static final Tag<DamageType> IS_FIRE = DamageTypeTags.key(ResourceKey.minecraft("is_fire"));
80+
public static final DefaultedTag<DamageType> IS_FIRE = DamageTypeTags.key(ResourceKey.minecraft("is_fire"));
8181

82-
public static final Tag<DamageType> IS_FREEZING = DamageTypeTags.key(ResourceKey.minecraft("is_freezing"));
82+
public static final DefaultedTag<DamageType> IS_FREEZING = DamageTypeTags.key(ResourceKey.minecraft("is_freezing"));
8383

84-
public static final Tag<DamageType> IS_LIGHTNING = DamageTypeTags.key(ResourceKey.minecraft("is_lightning"));
84+
public static final DefaultedTag<DamageType> IS_LIGHTNING = DamageTypeTags.key(ResourceKey.minecraft("is_lightning"));
8585

86-
public static final Tag<DamageType> IS_PLAYER_ATTACK = DamageTypeTags.key(ResourceKey.minecraft("is_player_attack"));
86+
public static final DefaultedTag<DamageType> IS_PLAYER_ATTACK = DamageTypeTags.key(ResourceKey.minecraft("is_player_attack"));
8787

88-
public static final Tag<DamageType> IS_PROJECTILE = DamageTypeTags.key(ResourceKey.minecraft("is_projectile"));
88+
public static final DefaultedTag<DamageType> IS_PROJECTILE = DamageTypeTags.key(ResourceKey.minecraft("is_projectile"));
8989

90-
public static final Tag<DamageType> MACE_SMASH = DamageTypeTags.key(ResourceKey.minecraft("mace_smash"));
90+
public static final DefaultedTag<DamageType> MACE_SMASH = DamageTypeTags.key(ResourceKey.minecraft("mace_smash"));
9191

92-
public static final Tag<DamageType> NO_ANGER = DamageTypeTags.key(ResourceKey.minecraft("no_anger"));
92+
public static final DefaultedTag<DamageType> NO_ANGER = DamageTypeTags.key(ResourceKey.minecraft("no_anger"));
9393

94-
public static final Tag<DamageType> NO_IMPACT = DamageTypeTags.key(ResourceKey.minecraft("no_impact"));
94+
public static final DefaultedTag<DamageType> NO_IMPACT = DamageTypeTags.key(ResourceKey.minecraft("no_impact"));
9595

96-
public static final Tag<DamageType> NO_KNOCKBACK = DamageTypeTags.key(ResourceKey.minecraft("no_knockback"));
96+
public static final DefaultedTag<DamageType> NO_KNOCKBACK = DamageTypeTags.key(ResourceKey.minecraft("no_knockback"));
9797

98-
public static final Tag<DamageType> PANIC_CAUSES = DamageTypeTags.key(ResourceKey.minecraft("panic_causes"));
98+
public static final DefaultedTag<DamageType> PANIC_CAUSES = DamageTypeTags.key(ResourceKey.minecraft("panic_causes"));
9999

100-
public static final Tag<DamageType> PANIC_ENVIRONMENTAL_CAUSES = DamageTypeTags.key(ResourceKey.minecraft("panic_environmental_causes"));
100+
public static final DefaultedTag<DamageType> PANIC_ENVIRONMENTAL_CAUSES = DamageTypeTags.key(ResourceKey.minecraft("panic_environmental_causes"));
101101

102-
public static final Tag<DamageType> WITCH_RESISTANT_TO = DamageTypeTags.key(ResourceKey.minecraft("witch_resistant_to"));
102+
public static final DefaultedTag<DamageType> WITCH_RESISTANT_TO = DamageTypeTags.key(ResourceKey.minecraft("witch_resistant_to"));
103103

104-
public static final Tag<DamageType> WITHER_IMMUNE_TO = DamageTypeTags.key(ResourceKey.minecraft("wither_immune_to"));
104+
public static final DefaultedTag<DamageType> WITHER_IMMUNE_TO = DamageTypeTags.key(ResourceKey.minecraft("wither_immune_to"));
105105

106106
private DamageTypeTags() {
107107
}
108108

109-
private static Tag<DamageType> key(final ResourceKey key) {
110-
return Tag.of(RegistryTypes.DAMAGE_TYPE, key);
109+
private static DefaultedTag<DamageType> key(final ResourceKey key) {
110+
return DefaultedTag.of(RegistryTypes.DAMAGE_TYPE, key);
111111
}
112112
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* This file is part of SpongeAPI, licensed under the MIT License (MIT).
3+
*
4+
* Copyright (c) SpongePowered <https://www.spongepowered.org>
5+
* Copyright (c) contributors
6+
*
7+
* Permission is hereby granted, free of charge, to any person obtaining a copy
8+
* of this software and associated documentation files (the "Software"), to deal
9+
* in the Software without restriction, including without limitation the rights
10+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11+
* copies of the Software, and to permit persons to whom the Software is
12+
* furnished to do so, subject to the following conditions:
13+
*
14+
* The above copyright notice and this permission notice shall be included in
15+
* all copies or substantial portions of the Software.
16+
*
17+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23+
* THE SOFTWARE.
24+
*/
25+
package org.spongepowered.api.tag;
26+
27+
import org.spongepowered.api.ResourceKey;
28+
import org.spongepowered.api.registry.DefaultedRegistryType;
29+
import org.spongepowered.api.registry.RegistryHolder;
30+
import org.spongepowered.api.registry.ValueNotFoundException;
31+
32+
import java.util.function.Supplier;
33+
import java.util.stream.Stream;
34+
35+
/**
36+
* A {@link Tag} paired with the {@link RegistryHolder}.
37+
*/
38+
public interface DefaultedTag<T> extends Tag<T> {
39+
40+
static <T> DefaultedTag<T> of(final DefaultedRegistryType<T> registryType, final ResourceKey location) {
41+
return Tag.of(registryType, location).asDefaultedTag(registryType.defaultHolder());
42+
}
43+
44+
Supplier<RegistryHolder> defaultHolder();
45+
46+
/**
47+
* Returns the {@link Stream} of values tagged by this tag.
48+
*
49+
* <p>Great care needs to be made in calling this method with any uncertainty as to
50+
* if the {@link #registry()} will exist in the holder. Should the key lack a value,
51+
* a {@link ValueNotFoundException} will be thrown. Therefore, it is advised to call
52+
* {@link #findValues()} instead.</p>
53+
*
54+
* @return The {@link Stream} of values
55+
*/
56+
default Stream<T> values() {
57+
return this.defaultHolder().get().registry(this.registry()).taggedValues(this);
58+
}
59+
60+
/**
61+
* Returns the {@link Stream} of values tagged by this tag in the holder
62+
* if it contains this tag's {@link #registry()}, or {@link Stream#empty()} otherwise.
63+
*
64+
* @return The {@link Stream} of values
65+
*/
66+
default Stream<T> findValues() {
67+
return this.defaultHolder().get().findRegistry(this.registry()).map(r -> r.taggedValues(this)).orElseGet(Stream::empty);
68+
}
69+
70+
/**
71+
* Returns whether this tag is associated with the given value.
72+
*
73+
* @param value The value
74+
* @return true if this tag is associated with the given value
75+
*/
76+
boolean contains(T value);
77+
}

0 commit comments

Comments
 (0)