Skip to content

Commit 9983e29

Browse files
committed
keep track of playing tracks
1 parent f3848e9 commit 9983e29

File tree

5 files changed

+77
-16
lines changed

5 files changed

+77
-16
lines changed

src/client/java/fn10/musicexpansion/MusicExpandedClient.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package fn10.musicexpansion;
22

3-
import java.nio.channels.Channel;
3+
import java.util.HashMap;
44
import java.util.Optional;
55

66
import fn10.musicexpansion.items.CompactDiscItem;
@@ -18,19 +18,22 @@
1818
import net.minecraft.client.renderer.chunk.ChunkSectionLayer;
1919
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
2020
import net.minecraft.client.resources.sounds.SoundInstance;
21-
import net.minecraft.client.sounds.SoundEngine.PlayResult;
2221
import net.minecraft.sounds.SoundEvent;
23-
import net.minecraft.world.phys.Vec3;
2422

2523
public class MusicExpandedClient implements ClientModInitializer {
24+
25+
public static HashMap<Integer, SoundInstance> TRACK_INSTANCES = new HashMap<>();
26+
2627
@Override
2728
public void onInitializeClient() {
2829
ClientPlayNetworking.registerGlobalReceiver(ClientBoundCDTrackPlayPayload.ID, (payload, contxt) -> {
2930
Minecraft client = contxt.client();
3031
Optional<SoundEvent> optionalEvent = payload.event().unwrap().right();
3132
SoundEvent event = optionalEvent.orElseThrow();
3233
SoundInstance instance = SimpleSoundInstance.forJukeboxSong(event, payload.pos().getCenter());
33-
PlayResult play = client.getSoundManager().play(instance);
34+
client.getSoundManager().play(instance);
35+
36+
TRACK_INSTANCES.put(payload.id(), instance);
3437
});
3538
ItemTooltipCallback.EVENT.register((stack, context, tooltipType, lines) -> {
3639
if (stack.is(MusicExpandedItems.CD)) {

src/main/java/fn10/musicexpansion/blocks/entity/StereoBlockEntity.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fn10.musicexpansion.blocks.entity;
22

3+
import java.util.Iterator;
34
import java.util.List;
45

56
import fn10.musicexpansion.blocks.DiscBurnerBlock;
@@ -14,16 +15,21 @@
1415
import net.minecraft.core.NonNullList;
1516
import net.minecraft.nbt.CompoundTag;
1617
import net.minecraft.network.chat.Component;
18+
import net.minecraft.world.ContainerHelper;
1719
import net.minecraft.world.entity.player.Inventory;
1820
import net.minecraft.world.inventory.AbstractContainerMenu;
1921
import net.minecraft.world.item.ItemStack;
2022
import net.minecraft.world.level.Level;
2123
import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
2224
import net.minecraft.world.level.block.state.BlockState;
25+
import net.minecraft.world.level.storage.ValueInput;
26+
import net.minecraft.world.level.storage.ValueOutput;
27+
import net.minecraft.world.level.storage.ValueOutput.TypedOutputList;
2328

2429
public class StereoBlockEntity extends BaseContainerBlockEntity {
2530
public NonNullList<ItemStack> inventory;
2631
public boolean playing = false;
32+
private Integer currentlyPlayingId = -1;
2733

2834
public StereoBlockEntity(BlockPos blockPos, BlockState blockState) {
2935
super(MusicExpandedBlockEntitys.STEREO_BENTITY, blockPos, blockState);
@@ -37,9 +43,10 @@ public void putInCD(ItemStack stack) {
3743
}
3844

3945
public void play(int tracki) {
46+
if (currentlyPlayingId != -1) return;
4047
List<String> songList = inventory.get(0).get(MusicExpandedItemComponents.CD_SONGS);
4148
CDTrack track = CDTracks.getTrackFromId(songList.get(tracki));
42-
track.play(level, worldPosition);
49+
currentlyPlayingId = track.play(level, worldPosition);
4350
}
4451

4552
@Override
@@ -68,6 +75,24 @@ protected void setItems(NonNullList<ItemStack> nonNullList) {
6875
inventory = nonNullList;
6976
}
7077

78+
@Override
79+
protected void saveAdditional(ValueOutput output) {
80+
output.putBoolean("playing", playing);
81+
output.putInt("currentlyPlayingId", currentlyPlayingId);
82+
ContainerHelper.saveAllItems(output, inventory);
83+
84+
super.saveAdditional(output);
85+
}
86+
87+
@Override
88+
protected void loadAdditional(ValueInput input) {
89+
super.loadAdditional(input);
90+
91+
playing = input.getBooleanOr("playing", false);
92+
currentlyPlayingId = input.getIntOr("currentlyPlayingId", -1);
93+
ContainerHelper.loadAllItems(input, inventory);
94+
}
95+
7196
@Override
7297
public CompoundTag getUpdateTag(HolderLookup.Provider registryLookup) {
7398
return saveWithoutMetadata(registryLookup);

src/main/java/fn10/musicexpansion/music/CDTrack.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,31 @@ public CDTrack(SoundEvent sound) {
1818
this.event = sound;
1919
}
2020

21-
public void play(Level level, BlockPos pos) {
22-
if (level instanceof ServerLevel)
21+
/**
22+
* Plays this track in the given level and pos. This then sends packets to all
23+
* clients.
24+
*
25+
* @param level The level this is happening in.
26+
* @param pos The position this track should play
27+
* @return The id of the playing track. This is how we keep track of the playing
28+
* tracks. This value is -1 if this function fails
29+
*/
30+
public Integer play(Level level, BlockPos pos) {
31+
try {
32+
if (!(level instanceof ServerLevel))
33+
return -1;
34+
Integer id = CDTracks.createNewCDTrackId();
2335
for (ServerPlayer plr : ((ServerLevel) level).players()) {
24-
ClientBoundCDTrackPlayPayload payload = new ClientBoundCDTrackPlayPayload(pos, Holder.direct(event));
36+
ClientBoundCDTrackPlayPayload payload = new ClientBoundCDTrackPlayPayload(pos, Holder.direct(event),
37+
id);
2538
ServerPlayNetworking.send(plr, payload);
2639
}
40+
CDTracks.ACTIVE_CD_TRACK_IDS.add(id);
41+
return id;
42+
} catch (Exception e) {
43+
e.printStackTrace();
44+
return -1;
45+
}
2746
}
2847

2948
public boolean equals(CDTrack other) {

src/main/java/fn10/musicexpansion/music/CDTracks.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package fn10.musicexpansion.music;
22

3+
import java.util.HashMap;
34
import java.util.Map;
5+
import java.util.Random;
6+
import java.util.UUID;
47
import java.util.Map.Entry;
8+
import java.util.random.RandomGenerator;
59

10+
import net.minecraft.core.NonNullList;
611
import net.minecraft.sounds.SoundEvents;
7-
import net.minecraft.world.level.block.entity.JukeboxBlockEntity;
812

913
public class CDTracks {
1014

@@ -13,17 +17,26 @@ public class CDTracks {
1317
public static final CDTrack C418_11 = new CDTrack(SoundEvents.MUSIC_DISC_11.value());
1418

1519
private static final Map<String, CDTrack> TRACK_IDS = Map.of(
16-
"cat", C418_CAT,
17-
"13", C418_13,
18-
"11", C418_11
19-
);
20+
"cat", C418_CAT,
21+
"13", C418_13,
22+
"11", C418_11);
23+
24+
protected static final NonNullList<Integer> ACTIVE_CD_TRACK_IDS = NonNullList.create();
25+
26+
public static Integer createNewCDTrackId() {
27+
Integer canadite = Random.from(RandomGenerator.getDefault()).nextInt(0, Integer.MAX_VALUE);
28+
if (ACTIVE_CD_TRACK_IDS.contains(canadite))
29+
return createNewCDTrackId();
30+
else
31+
return createNewCDTrackId();
32+
}
2033

2134
public static CDTrack getTrackFromId(String id) {
2235
return TRACK_IDS.get(id);
2336
}
2437

2538
public static String getIdFromTrack(CDTrack track) {
26-
for (Entry<String,CDTrack> set : TRACK_IDS.entrySet()) {
39+
for (Entry<String, CDTrack> set : TRACK_IDS.entrySet()) {
2740
if (set.getValue().equals(track)) {
2841
return set.getKey();
2942
}

src/main/java/fn10/musicexpansion/music/network/ClientBoundCDTrackPlayPayload.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@
44
import net.minecraft.core.BlockPos;
55
import net.minecraft.core.Holder;
66
import net.minecraft.network.RegistryFriendlyByteBuf;
7+
import net.minecraft.network.codec.ByteBufCodecs;
78
import net.minecraft.network.codec.StreamCodec;
89
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
910
import net.minecraft.resources.Identifier;
1011
import net.minecraft.sounds.SoundEvent;
1112

12-
public record ClientBoundCDTrackPlayPayload(BlockPos pos, Holder<SoundEvent> event) implements CustomPacketPayload {
13+
public record ClientBoundCDTrackPlayPayload(BlockPos pos, Holder<SoundEvent> event, Integer id) implements CustomPacketPayload {
1314
public static final Identifier CDTRACK_PLAY_PAYLOAD_ID = Identifier.fromNamespaceAndPath(MusicExpanded.MOD_ID,
1415
"play_cd_track");
1516
public static final CustomPacketPayload.Type<ClientBoundCDTrackPlayPayload> ID = new CustomPacketPayload.Type<>(
1617
CDTRACK_PLAY_PAYLOAD_ID);
1718
public static final StreamCodec<RegistryFriendlyByteBuf, ClientBoundCDTrackPlayPayload> CODEC = StreamCodec
1819
.composite(BlockPos.STREAM_CODEC, ClientBoundCDTrackPlayPayload::pos, SoundEvent.STREAM_CODEC,
19-
ClientBoundCDTrackPlayPayload::event, ClientBoundCDTrackPlayPayload::new);
20+
ClientBoundCDTrackPlayPayload::event, ByteBufCodecs.INT, ClientBoundCDTrackPlayPayload::id, ClientBoundCDTrackPlayPayload::new);
2021

2122
@Override
2223
public Type<? extends CustomPacketPayload> type() {

0 commit comments

Comments
 (0)