Skip to content

Commit 190bfa1

Browse files
committed
/
1 parent 2b05dda commit 190bfa1

61 files changed

Lines changed: 729 additions & 248 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,33 @@
11
package xyz.bonfiremc.randevents.api.actions.context;
22

3+
import net.minecraft.commands.CommandSourceStack;
34
import net.minecraft.core.BlockPos;
5+
import net.minecraft.nbt.CompoundTag;
46
import net.minecraft.server.level.ServerPlayer;
57
import net.minecraft.world.level.block.entity.BlockEntity;
68
import net.minecraft.world.level.block.state.BlockState;
9+
import net.minecraft.world.phys.Vec3;
710
import org.jspecify.annotations.NonNull;
811
import org.jspecify.annotations.Nullable;
912

1013
public record BlockREContext(@NonNull ServerPlayer player, @NonNull BlockPos blockPos, @NonNull BlockState blockState, @Nullable BlockEntity blockEntity) implements REContext {
1114
@Override
12-
public @NonNull BlockPos preferablePos() {
13-
return this.blockPos;
15+
public @NonNull Vec3 vec() {
16+
return this.blockPos.getCenter();
17+
}
18+
19+
@Override
20+
public void write(CompoundTag tag) {
21+
REContext.super.write(tag);
22+
23+
tag.putInt("block_x", this.blockPos.getX());
24+
tag.putInt("block_y", this.blockPos.getY());
25+
tag.putInt("block_z", this.blockPos.getZ());
26+
tag.putString("block_id", this.blockState.getBlock().builtInRegistryHolder().key().identifier().toString());
27+
}
28+
29+
@Override
30+
public @NonNull CommandSourceStack createCommandSourceStack() {
31+
return REContext.super.createCommandSourceStack().withPosition(this.blockPos.getCenter());
1432
}
1533
}
Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,32 @@
11
package xyz.bonfiremc.randevents.api.actions.context;
22

3-
import net.minecraft.core.BlockPos;
3+
import net.minecraft.commands.CommandSourceStack;
4+
import net.minecraft.nbt.CompoundTag;
45
import net.minecraft.server.level.ServerPlayer;
56
import net.minecraft.world.entity.Entity;
7+
import net.minecraft.world.phys.Vec3;
68
import org.jspecify.annotations.NonNull;
79

810
public record EntityREContext(@NonNull ServerPlayer player, @NonNull Entity entity) implements REContext {
911
@Override
10-
public @NonNull BlockPos preferablePos() {
11-
return entity.blockPosition();
12+
public @NonNull Vec3 vec() {
13+
return this.entity.position();
14+
}
15+
16+
@Override
17+
public void write(CompoundTag tag) {
18+
REContext.super.write(tag);
19+
20+
tag.putDouble("entity_x", this.entity.getX());
21+
tag.putDouble("entity_y", this.entity.getY());
22+
tag.putDouble("entity_z", this.entity.getZ());
23+
tag.putString("entity_uuid", this.entity.getStringUUID());
24+
tag.putString("entity_name", this.entity.getPlainTextName());
25+
tag.putString("entity_id", this.entity.getType().builtInRegistryHolder().key().identifier().toString());
26+
}
27+
28+
@Override
29+
public @NonNull CommandSourceStack createCommandSourceStack() {
30+
return this.entity.createCommandSourceStackForNameResolution(this.player.level()).withSuppressedOutput();
1231
}
1332
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
package xyz.bonfiremc.randevents.api.actions.context;
22

3+
import net.minecraft.nbt.CompoundTag;
34
import net.minecraft.server.level.ServerPlayer;
45
import net.minecraft.world.item.ItemStack;
56
import org.jspecify.annotations.NonNull;
67

78
public record ItemREContext(@NonNull ServerPlayer player, @NonNull ItemStack stack) implements REContext {
9+
@Override
10+
public void write(CompoundTag tag) {
11+
REContext.super.write(tag);
12+
13+
tag.putString("item_id", this.stack.getItem().builtInRegistryHolder().key().identifier().toString());
14+
tag.putInt("item_count", this.stack.getCount());
15+
}
816
}
Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,37 @@
11
package xyz.bonfiremc.randevents.api.actions.context;
22

3-
import net.minecraft.core.BlockPos;
3+
import net.minecraft.commands.CommandSourceStack;
4+
import net.minecraft.nbt.CompoundTag;
45
import net.minecraft.server.level.ServerPlayer;
6+
import net.minecraft.world.phys.Vec3;
57
import org.jspecify.annotations.NonNull;
68

79
public interface REContext {
810
@NonNull ServerPlayer player();
911

1012
@NonNull
11-
default BlockPos preferablePos() {
12-
return this.player().blockPosition();
13+
default Vec3 vec() {
14+
return this.player().position();
15+
}
16+
17+
default void write(CompoundTag tag) {
18+
ServerPlayer player = this.player();
19+
20+
tag.putDouble("player_x", player.getX());
21+
tag.putDouble("player_y", player.getY());
22+
tag.putDouble("player_z", player.getZ());
23+
tag.putString("player_uuid", player.getStringUUID());
24+
tag.putString("player_name", player.getPlainTextName());
25+
26+
Vec3 vec = this.vec();
27+
28+
tag.putDouble("x", vec.x);
29+
tag.putDouble("y", vec.y);
30+
tag.putDouble("z", vec.z);
31+
}
32+
33+
@NonNull
34+
default CommandSourceStack createCommandSourceStack() {
35+
return this.player().createCommandSourceStack().withSuppressedOutput();
1336
}
1437
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package xyz.bonfiremc.randevents.api.event.player;
2+
3+
import net.fabricmc.fabric.api.event.Event;
4+
import net.fabricmc.fabric.api.event.EventFactory;
5+
import net.minecraft.world.entity.player.Player;
6+
import net.minecraft.world.item.ItemStack;
7+
import net.minecraft.world.level.Level;
8+
import org.jspecify.annotations.NonNull;
9+
10+
public interface PlayerConsumeEvent {
11+
Event<@NonNull PlayerConsumeEvent> EVENT = EventFactory.createArrayBacked(PlayerConsumeEvent.class,
12+
callbacks -> ((level, player, stack) -> {
13+
for (PlayerConsumeEvent callback : callbacks) {
14+
callback.onPlayerConsume(level, player, stack);
15+
}
16+
})
17+
);
18+
19+
void onPlayerConsume(Level level, Player player, ItemStack stack);
20+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package xyz.bonfiremc.randevents.api.event.player;
2+
3+
import net.fabricmc.fabric.api.event.Event;
4+
import net.fabricmc.fabric.api.event.EventFactory;
5+
import net.minecraft.core.BlockPos;
6+
import net.minecraft.world.entity.player.Player;
7+
import net.minecraft.world.level.Level;
8+
import net.minecraft.world.level.block.state.BlockState;
9+
import org.jspecify.annotations.NonNull;
10+
11+
public interface PlayerPortalFireEvents {
12+
Event<@NonNull PlayerPortalFireEvents> NETHER = createNew();
13+
14+
private static Event<@NonNull PlayerPortalFireEvents> createNew() {
15+
return EventFactory.createArrayBacked(PlayerPortalFireEvents.class,
16+
callbacks -> ((level, player, blockPos, blockState) -> {
17+
for (PlayerPortalFireEvents callback : callbacks) {
18+
callback.onPortalFire(level, player, blockPos, blockState);
19+
}
20+
})
21+
);
22+
}
23+
24+
void onPortalFire(Level level, Player player, BlockPos blockPos, BlockState blockState);
25+
}

src/main/java/xyz/bonfiremc/randevents/api/resources/RandomEvent.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,36 @@
11
package xyz.bonfiremc.randevents.api.resources;
22

3+
import com.mojang.datafixers.util.Either;
34
import com.mojang.serialization.Codec;
45
import com.mojang.serialization.codecs.RecordCodecBuilder;
56
import net.minecraft.util.StringRepresentable;
67
import org.jspecify.annotations.NonNull;
78
import xyz.bonfiremc.randevents.api.actions.REAction;
89

910
import java.util.List;
11+
import java.util.function.Function;
1012

11-
public record RandomEvent(List<Trigger> triggers, REAction action) {
13+
public record RandomEvent(List<Trigger> triggers, List<REAction> actions) {
1214
public static final Codec<RandomEvent> CODEC = RecordCodecBuilder.create(instance -> instance.group(
1315
Trigger.CODEC.listOf().fieldOf("triggers").forGetter(RandomEvent::triggers),
14-
REAction.CODEC.forGetter(RandomEvent::action)
16+
Codec.mapEither(
17+
REAction.CODEC,
18+
REAction.CODEC.codec().listOf().fieldOf("actions")
19+
).xmap(
20+
either -> either.map(List::of, Function.identity()),
21+
actions -> actions.size() == 1
22+
? Either.left(actions.getFirst())
23+
: Either.right(actions)
24+
).forGetter(RandomEvent::actions)
1525
).apply(instance, RandomEvent::new));
1626

1727
public enum Trigger implements StringRepresentable {
1828
BLOCK_BREAK,
1929
BLOCK_PLACE,
20-
ITEM_USE,
21-
ENTITY_KILL;
30+
ENTITY_KILL,
31+
ITEM_CONSUME,
32+
NETHER_PORTAL,
33+
END_PORTAL;
2234

2335
public static final Codec<Trigger> CODEC = StringRepresentable.fromEnum(Trigger::values);
2436

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package xyz.bonfiremc.randevents.api.tags;
2+
3+
import net.minecraft.core.Registry;
4+
import net.minecraft.core.registries.Registries;
5+
import net.minecraft.resources.ResourceKey;
6+
import net.minecraft.tags.TagKey;
7+
import net.minecraft.world.entity.EntityType;
8+
import net.minecraft.world.item.Item;
9+
import net.minecraft.world.level.block.Block;
10+
import org.jspecify.annotations.NonNull;
11+
import xyz.bonfiremc.randevents.impl.REInitializer;
12+
13+
public class RETags {
14+
public static final TagKey<@NonNull Block> BLOCK_BREAK_BLACKLIST = create(Registries.BLOCK, "block_break_blacklist");
15+
public static final TagKey<@NonNull Block> BLOCK_PLACE_BLACKLIST = create(Registries.BLOCK, "block_place_blacklist");
16+
public static final TagKey<@NonNull EntityType<?>> ENTITY_KILL_BLACKLIST = create(Registries.ENTITY_TYPE, "entity_kill_blacklist");
17+
public static final TagKey<@NonNull Item> ITEM_CONSUME_BLACKLIST = create(Registries.ITEM, "item_consume_blacklist");
18+
19+
private static <T> TagKey<@NonNull T> create(ResourceKey<@NonNull Registry<@NonNull T>> key, String path) {
20+
return TagKey.create(key, REInitializer.id(path));
21+
}
22+
}

src/main/java/xyz/bonfiremc/randevents/impl/REData.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,23 @@
55
import net.minecraft.nbt.NbtOps;
66
import net.minecraft.nbt.Tag;
77
import net.minecraft.resources.Identifier;
8-
import net.minecraft.world.level.Level;
8+
import org.jetbrains.annotations.ApiStatus;
99
import xyz.bonfiremc.randevents.api.resources.RandomEvent;
1010
import xyz.bonfiremc.randevents.impl.resources.RandomEventManager;
1111

12-
import java.util.HashMap;
13-
import java.util.List;
14-
import java.util.Map;
15-
import java.util.Optional;
12+
import java.util.*;
1613
import java.util.function.Function;
1714

15+
@ApiStatus.Internal
1816
public class REData {
17+
private static final Codec<Map<Identifier, Identifier>> ID_MAP_CODEC = Codec.unboundedMap(Identifier.CODEC, Identifier.CODEC).xmap(HashMap::new, Function.identity());
18+
1919
private final Map<RandomEvent.Trigger, Map<Identifier, Identifier>> values;
20-
private final Codec<Map<Identifier, Identifier>> ID_MAP_CODEC = Codec.unboundedMap(Identifier.CODEC, Identifier.CODEC).xmap(HashMap::new, Function.identity());
20+
private final long seed;
2121

2222
public REData() {
2323
this.values = new HashMap<>();
24+
this.seed = 0;
2425
}
2526

2627
public void write(CompoundTag nbt) {
@@ -45,7 +46,7 @@ public void read(CompoundTag nbt) {
4546
}
4647
}
4748

48-
public Optional<RandomEvent> get(RandomEvent.Trigger trigger, Level level, Identifier id) {
49+
public Optional<RandomEvent> get(RandomEvent.Trigger trigger, Identifier id) {
4950
Map<Identifier, Identifier> ids = this.values.computeIfAbsent(trigger, ignored -> new HashMap<>());
5051
RandomEventManager manager = REInitializer.getRandomEventManager();
5152

@@ -71,9 +72,24 @@ public Optional<RandomEvent> get(RandomEvent.Trigger trigger, Level level, Ident
7172
return Optional.empty();
7273
}
7374

74-
Map.Entry<Identifier, RandomEvent> random = candidates.get(level.random.nextInt(candidates.size()));
75-
ids.put(id, random.getKey());
75+
Random random = new Random(this.mixSeed(trigger, id));
76+
77+
Map.Entry<Identifier, RandomEvent> randomEvent = candidates.get(random.nextInt(candidates.size()));
78+
ids.put(id, randomEvent.getKey());
79+
80+
return Optional.of(randomEvent.getValue());
81+
}
82+
83+
private long mixSeed(RandomEvent.Trigger trigger, Identifier id) {
84+
long h = this.seed;
85+
86+
h = h * 31 + trigger.getSerializedName().hashCode();
87+
h = h * 31 + id.toString().hashCode();
88+
89+
h ^= (h << 21);
90+
h ^= (h >>> 35);
91+
h ^= (h << 4);
7692

77-
return Optional.of(random.getValue());
93+
return h;
7894
}
7995
}

0 commit comments

Comments
 (0)