Skip to content

Commit 46a3385

Browse files
authored
Merge pull request #90 from OneLiteFeatherNET/feature/add-gameevents-support
Implement game tags and game events
2 parents 2c4e9e7 + ef26c50 commit 46a3385

File tree

7 files changed

+308
-2
lines changed

7 files changed

+308
-2
lines changed

code-generators/src/main/java/net/minestom/codegen/Generators.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public static void main(String[] args) {
3030
// Static registries
3131
generator.generate(resource("blocks.json"), "net.minestom.server.instance.block", "Block", "BlockImpl", "Blocks");
3232
generator.generate(resource("items.json"), "net.minestom.server.item", "Material", "MaterialImpl", "Materials");
33+
generator.generate(resource("game_events.json"), "net.minestom.server.game", "GameEvent", "GameEventImpl", "GameEvents");
3334
generator.generate(resource("entities.json"), "net.minestom.server.entity", "EntityType", "EntityTypeImpl", "EntityTypes");
3435
generator.generate(resource("potion_effects.json"), "net.minestom.server.potion", "PotionEffect", "PotionEffectImpl", "PotionEffects");
3536
generator.generate(resource("potions.json"), "net.minestom.server.potion", "PotionType", "PotionTypeImpl", "PotionTypes");
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package net.minestom.server.game;
2+
3+
/**
4+
* Code autogenerated, do not edit!
5+
*/
6+
@SuppressWarnings("unused")
7+
interface GameEvents {
8+
GameEvent BLOCK_ACTIVATE = GameEventImpl.get("minecraft:block_activate");
9+
10+
GameEvent BLOCK_ATTACH = GameEventImpl.get("minecraft:block_attach");
11+
12+
GameEvent BLOCK_CHANGE = GameEventImpl.get("minecraft:block_change");
13+
14+
GameEvent BLOCK_CLOSE = GameEventImpl.get("minecraft:block_close");
15+
16+
GameEvent BLOCK_DEACTIVATE = GameEventImpl.get("minecraft:block_deactivate");
17+
18+
GameEvent BLOCK_DESTROY = GameEventImpl.get("minecraft:block_destroy");
19+
20+
GameEvent BLOCK_DETACH = GameEventImpl.get("minecraft:block_detach");
21+
22+
GameEvent BLOCK_OPEN = GameEventImpl.get("minecraft:block_open");
23+
24+
GameEvent BLOCK_PLACE = GameEventImpl.get("minecraft:block_place");
25+
26+
GameEvent CONTAINER_CLOSE = GameEventImpl.get("minecraft:container_close");
27+
28+
GameEvent CONTAINER_OPEN = GameEventImpl.get("minecraft:container_open");
29+
30+
GameEvent DRINK = GameEventImpl.get("minecraft:drink");
31+
32+
GameEvent EAT = GameEventImpl.get("minecraft:eat");
33+
34+
GameEvent ELYTRA_GLIDE = GameEventImpl.get("minecraft:elytra_glide");
35+
36+
GameEvent ENTITY_DAMAGE = GameEventImpl.get("minecraft:entity_damage");
37+
38+
GameEvent ENTITY_DIE = GameEventImpl.get("minecraft:entity_die");
39+
40+
GameEvent ENTITY_DISMOUNT = GameEventImpl.get("minecraft:entity_dismount");
41+
42+
GameEvent ENTITY_INTERACT = GameEventImpl.get("minecraft:entity_interact");
43+
44+
GameEvent ENTITY_MOUNT = GameEventImpl.get("minecraft:entity_mount");
45+
46+
GameEvent ENTITY_PLACE = GameEventImpl.get("minecraft:entity_place");
47+
48+
GameEvent ENTITY_ACTION = GameEventImpl.get("minecraft:entity_action");
49+
50+
GameEvent EQUIP = GameEventImpl.get("minecraft:equip");
51+
52+
GameEvent EXPLODE = GameEventImpl.get("minecraft:explode");
53+
54+
GameEvent FLAP = GameEventImpl.get("minecraft:flap");
55+
56+
GameEvent FLUID_PICKUP = GameEventImpl.get("minecraft:fluid_pickup");
57+
58+
GameEvent FLUID_PLACE = GameEventImpl.get("minecraft:fluid_place");
59+
60+
GameEvent HIT_GROUND = GameEventImpl.get("minecraft:hit_ground");
61+
62+
GameEvent INSTRUMENT_PLAY = GameEventImpl.get("minecraft:instrument_play");
63+
64+
GameEvent ITEM_INTERACT_FINISH = GameEventImpl.get("minecraft:item_interact_finish");
65+
66+
GameEvent ITEM_INTERACT_START = GameEventImpl.get("minecraft:item_interact_start");
67+
68+
GameEvent JUKEBOX_PLAY = GameEventImpl.get("minecraft:jukebox_play");
69+
70+
GameEvent JUKEBOX_STOP_PLAY = GameEventImpl.get("minecraft:jukebox_stop_play");
71+
72+
GameEvent LIGHTNING_STRIKE = GameEventImpl.get("minecraft:lightning_strike");
73+
74+
GameEvent NOTE_BLOCK_PLAY = GameEventImpl.get("minecraft:note_block_play");
75+
76+
GameEvent PRIME_FUSE = GameEventImpl.get("minecraft:prime_fuse");
77+
78+
GameEvent PROJECTILE_LAND = GameEventImpl.get("minecraft:projectile_land");
79+
80+
GameEvent PROJECTILE_SHOOT = GameEventImpl.get("minecraft:projectile_shoot");
81+
82+
GameEvent SCULK_SENSOR_TENDRILS_CLICKING = GameEventImpl.get("minecraft:sculk_sensor_tendrils_clicking");
83+
84+
GameEvent SHEAR = GameEventImpl.get("minecraft:shear");
85+
86+
GameEvent SHRIEK = GameEventImpl.get("minecraft:shriek");
87+
88+
GameEvent SPLASH = GameEventImpl.get("minecraft:splash");
89+
90+
GameEvent STEP = GameEventImpl.get("minecraft:step");
91+
92+
GameEvent SWIM = GameEventImpl.get("minecraft:swim");
93+
94+
GameEvent TELEPORT = GameEventImpl.get("minecraft:teleport");
95+
96+
GameEvent UNEQUIP = GameEventImpl.get("minecraft:unequip");
97+
98+
GameEvent RESONATE_1 = GameEventImpl.get("minecraft:resonate_1");
99+
100+
GameEvent RESONATE_2 = GameEventImpl.get("minecraft:resonate_2");
101+
102+
GameEvent RESONATE_3 = GameEventImpl.get("minecraft:resonate_3");
103+
104+
GameEvent RESONATE_4 = GameEventImpl.get("minecraft:resonate_4");
105+
106+
GameEvent RESONATE_5 = GameEventImpl.get("minecraft:resonate_5");
107+
108+
GameEvent RESONATE_6 = GameEventImpl.get("minecraft:resonate_6");
109+
110+
GameEvent RESONATE_7 = GameEventImpl.get("minecraft:resonate_7");
111+
112+
GameEvent RESONATE_8 = GameEventImpl.get("minecraft:resonate_8");
113+
114+
GameEvent RESONATE_9 = GameEventImpl.get("minecraft:resonate_9");
115+
116+
GameEvent RESONATE_10 = GameEventImpl.get("minecraft:resonate_10");
117+
118+
GameEvent RESONATE_11 = GameEventImpl.get("minecraft:resonate_11");
119+
120+
GameEvent RESONATE_12 = GameEventImpl.get("minecraft:resonate_12");
121+
122+
GameEvent RESONATE_13 = GameEventImpl.get("minecraft:resonate_13");
123+
124+
GameEvent RESONATE_14 = GameEventImpl.get("minecraft:resonate_14");
125+
126+
GameEvent RESONATE_15 = GameEventImpl.get("minecraft:resonate_15");
127+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package net.minestom.server.game;
2+
3+
import net.minestom.server.registry.Registry;
4+
import net.minestom.server.registry.StaticProtocolObject;
5+
import net.minestom.server.utils.NamespaceID;
6+
import org.jetbrains.annotations.Contract;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
9+
10+
import java.util.Collection;
11+
12+
/**
13+
* Represents a game event.
14+
* Used for a wide variety of events, from weather to bed use to game mode to demo messages.
15+
*
16+
* @version 1.0.0
17+
* @since 1.6.0
18+
* @author themeinerlp
19+
*/
20+
public sealed interface GameEvent extends StaticProtocolObject permits GameEventImpl {
21+
22+
/**
23+
* Returns the game event registry.
24+
*
25+
* @return the game event registry or null if not found
26+
*/
27+
@Contract(pure = true)
28+
@Nullable
29+
Registry.GameEventEntry registry();
30+
31+
/**
32+
* Gets the namespace ID of this game event.
33+
*
34+
* @return the namespace ID
35+
*/
36+
@Override
37+
@NotNull
38+
NamespaceID namespace();
39+
40+
/**
41+
* Gets the game events from the registry.
42+
*
43+
* @return the game events
44+
*/
45+
static @NotNull Collection<@NotNull GameEvent> values() {
46+
return GameEventImpl.values();
47+
}
48+
49+
/**
50+
* Gets a game event by its namespace ID.
51+
*
52+
* @param namespaceID the namespace ID
53+
* @return the game event or null if not found
54+
*/
55+
static @Nullable GameEvent fromNamespaceId(@NotNull String namespaceID) {
56+
return GameEventImpl.getSafe(namespaceID);
57+
}
58+
59+
/**
60+
* Gets a game event by its namespace ID.
61+
*
62+
* @param namespaceID the namespace ID
63+
* @return the game event or null if not found
64+
*/
65+
static @Nullable GameEvent fromNamespaceId(@NotNull NamespaceID namespaceID) {
66+
return fromNamespaceId(namespaceID.asString());
67+
}
68+
69+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package net.minestom.server.game;
2+
3+
import net.minestom.server.registry.Registry;
4+
import net.minestom.server.utils.NamespaceID;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
import java.util.Collection;
8+
import java.util.concurrent.atomic.AtomicInteger;
9+
10+
/**
11+
* Represents a game event implementation.
12+
* Used for a wide variety of events, from weather to bed use to game mode to demo messages.
13+
*
14+
* @version 1.0.0
15+
* @since 1.6.0
16+
* @author themeinerlp
17+
*/
18+
record GameEventImpl(Registry.GameEventEntry registry, NamespaceID namespace, int id) implements GameEvent {
19+
private static final AtomicInteger INDEX = new AtomicInteger();
20+
private static final Registry.Container<GameEvent> CONTAINER = Registry.createStaticContainer(Registry.Resource.GAMEPLAY_TAGS, GameEventImpl::createImpl);
21+
22+
/**
23+
* Creates a new {@link GameEventImpl} with the given namespace and properties.
24+
*
25+
* @param namespace the namespace
26+
* @param properties the properties
27+
* @return a new {@link GameEventImpl}
28+
*/
29+
private static GameEventImpl createImpl(String namespace, Registry.Properties properties) {
30+
return new GameEventImpl(Registry.gameEventEntry(namespace, properties));
31+
}
32+
33+
/**
34+
* Creates a new {@link GameEventImpl} with the given registry.
35+
*
36+
* @param registry the registry
37+
*/
38+
private GameEventImpl(Registry.GameEventEntry registry) {
39+
this(registry, registry.namespace(), INDEX.getAndIncrement());
40+
}
41+
42+
/**
43+
* Gets the game events from the registry.
44+
*
45+
* @return the game events
46+
*/
47+
static Collection<GameEvent> values() {
48+
return CONTAINER.values();
49+
}
50+
51+
/**
52+
* Gets a game event by its namespace ID.
53+
*
54+
* @param namespace the namespace ID
55+
* @return the game event or null if not found
56+
*/
57+
public static GameEvent get(@NotNull String namespace) {
58+
return CONTAINER.get(namespace);
59+
}
60+
61+
/**
62+
* Gets a game event by its namespace ID.
63+
*
64+
* @param namespace the namespace ID
65+
* @return the game event or null if not found
66+
*/
67+
static GameEvent getSafe(@NotNull String namespace) {
68+
return CONTAINER.getSafe(namespace);
69+
}
70+
}

src/main/java/net/minestom/server/gamedata/tags/Tag.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.minestom.server.MinecraftServer;
66
import net.minestom.server.entity.EntityType;
77
import net.minestom.server.fluid.Fluid;
8+
import net.minestom.server.game.GameEvent;
89
import net.minestom.server.instance.block.Block;
910
import net.minestom.server.item.Material;
1011
import net.minestom.server.registry.DynamicRegistry;
@@ -96,8 +97,8 @@ public enum BasicType {
9697
name -> Objects.requireNonNull(Fluid.fromNamespaceId(name)).id()),
9798
ENTITY_TYPES("minecraft:entity_type", Registry.Resource.ENTITY_TYPE_TAGS,
9899
name -> Objects.requireNonNull(EntityType.fromNamespaceId(name)).id()),
99-
/*GAME_EVENTS("minecraft:game_event", Registry.Resource.GAMEPLAY_TAGS,
100-
name -> Objects.requireNonNull(Fluid.fromNamespaceId(name)).id());*/
100+
GAME_EVENTS("minecraft:game_event", Registry.Resource.GAMEPLAY_TAGS,
101+
name -> Objects.requireNonNull(GameEvent.fromNamespaceId(name)).id()),
101102
SOUND_EVENTS("minecraft:sound_event", null, null), // Seems not to be included in server data
102103
POTION_EFFECTS("minecraft:sound_event", null, null), // Seems not to be included in server data
103104

src/main/java/net/minestom/server/registry/Registry.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ public static VillagerType villagerType(String namespace, @NotNull Properties ma
145145
return new VillagerType(namespace, main, null);
146146
}
147147

148+
public static GameEventEntry gameEventEntry(String namespace, Properties properties) {
149+
return new GameEventEntry(namespace, properties, null);
150+
}
151+
148152
@ApiStatus.Internal
149153
public static Map<String, Map<String, Object>> load(Resource resource) {
150154
Map<String, Map<String, Object>> map = new HashMap<>();
@@ -558,6 +562,12 @@ public boolean hasPrecipitation() {
558562
}
559563
}
560564

565+
public static final record GameEventEntry(NamespaceID namespace, Properties main, Properties custom) implements Entry {
566+
public GameEventEntry(String namespace, Properties main, Properties custom) {
567+
this(NamespaceID.from(namespace), main, custom);
568+
}
569+
}
570+
561571
public static final class MaterialEntry implements Entry {
562572
private final NamespaceID namespace;
563573
private final Properties main;

src/main/java/net/minestom/server/registry/StaticProtocolObject.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,50 @@
66
import org.jetbrains.annotations.Contract;
77
import org.jetbrains.annotations.NotNull;
88

9+
/**
10+
* Represents a static protocol object.
11+
* Used for objects which are not dynamic and are known at compile time.
12+
*
13+
* @version 1.0.0
14+
* @since 1.0.0
15+
* @author themeinerlp
16+
*/
917
public interface StaticProtocolObject extends ProtocolObject, Keyed {
1018

19+
/**
20+
* Gets the namespace ID of this object.
21+
*
22+
* @return the namespace ID
23+
*/
1124
@Contract(pure = true)
1225
@NotNull NamespaceID namespace();
1326

27+
/**
28+
* Gets the name of this object.
29+
*
30+
* @return the name
31+
*/
1432
@Contract(pure = true)
1533
default @NotNull String name() {
1634
return namespace().asString();
1735
}
1836

37+
/**
38+
* Gets the key of this object.
39+
*
40+
* @return the key
41+
*/
1942
@Override
2043
@Contract(pure = true)
2144
default @NotNull Key key() {
2245
return namespace();
2346
}
2447

48+
/**
49+
* Gets the ID of this object.
50+
*
51+
* @return the ID
52+
*/
2553
@Contract(pure = true)
2654
int id();
2755
}

0 commit comments

Comments
 (0)