Skip to content

Commit dde811d

Browse files
committed
implement Worlds MessageReceiver and sendBookView
1 parent a865595 commit dde811d

File tree

3 files changed

+53
-17
lines changed

3 files changed

+53
-17
lines changed

src/main/java/org/spongepowered/common/mixin/api/mcp/entity/player/EntityPlayerMPMixin_API.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@
139139
import java.time.Instant;
140140
import java.time.temporal.ChronoUnit;
141141
import java.util.Collection;
142+
import java.util.Collections;
142143
import java.util.List;
143144
import java.util.Locale;
144145
import java.util.Optional;
@@ -231,7 +232,7 @@ public void sendBookView(final BookView bookView) {
231232
// Don't bother sending messages to fake players
232233
return;
233234
}
234-
BookFaker.fakeBookView(bookView, this);
235+
BookFaker.fakeBookView(bookView, Collections.singletonList(this));
235236
}
236237

237238
@Override

src/main/java/org/spongepowered/common/mixin/api/mcp/world/WorldMixin_API.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,11 @@
9393
import org.spongepowered.api.entity.projectile.EnderPearl;
9494
import org.spongepowered.api.entity.projectile.source.ProjectileSource;
9595
import org.spongepowered.api.service.context.Context;
96+
import org.spongepowered.api.text.BookView;
9697
import org.spongepowered.api.text.Text;
98+
import org.spongepowered.api.text.channel.MessageChannel;
9799
import org.spongepowered.api.text.chat.ChatType;
100+
import org.spongepowered.api.text.chat.ChatTypes;
98101
import org.spongepowered.api.text.title.Title;
99102
import org.spongepowered.api.util.AABB;
100103
import org.spongepowered.api.util.Direction;
@@ -126,6 +129,7 @@
126129
import org.spongepowered.common.bridge.world.chunk.ChunkBridge;
127130
import org.spongepowered.common.mixin.core.network.play.server.SPacketBlockChangeAccessor;
128131
import org.spongepowered.common.registry.provider.DirectionFacingProvider;
132+
import org.spongepowered.common.util.BookFaker;
129133
import org.spongepowered.common.util.Constants;
130134
import org.spongepowered.common.util.VecHelper;
131135
import org.spongepowered.common.world.SpongeDimension;
@@ -532,9 +536,27 @@ public void sendMessage(ChatType type, Text message) {
532536
checkNotNull(type, "type");
533537
checkNotNull(message, "message");
534538

535-
for (Player player : this.getPlayers()) {
536-
player.sendMessage(type, message);
539+
this.getMessageChannel().send(message, type);
540+
}
541+
542+
@Override
543+
public void sendMessage(Text message) {
544+
this.sendMessage(ChatTypes.CHAT, message);
545+
}
546+
547+
private MessageChannel impl$messageChannel;
548+
549+
@Override
550+
public MessageChannel getMessageChannel() {
551+
if (this.impl$messageChannel == null) {
552+
return MessageChannel.fixed(this.getPlayers());
537553
}
554+
return this.impl$messageChannel;
555+
}
556+
557+
@Override
558+
public void setMessageChannel(MessageChannel channel) {
559+
this.impl$messageChannel = channel;
538560
}
539561

540562
@Override
@@ -546,6 +568,12 @@ public void sendTitle(Title title) {
546568
}
547569
}
548570

571+
@Override
572+
public void sendBookView(BookView bookView) {
573+
checkNotNull(bookView, "bookView");
574+
BookFaker.fakeBookView(bookView, this.getPlayers());
575+
}
576+
549577
@Override
550578
public void resetTitle() {
551579
getPlayers().forEach(Player::resetTitle);
@@ -1150,4 +1178,6 @@ public boolean validateRawData(int x, int y, int z, DataView container) {
11501178
public void setRawData(int x, int y, int z, DataView container) throws InvalidDataException {
11511179
throw new UnsupportedOperationException(); // TODO Data API
11521180
}
1181+
11531182
}
1183+

src/main/java/org/spongepowered/common/util/BookFaker.java

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,33 +39,38 @@
3939
import org.spongepowered.api.text.BookView;
4040
import org.spongepowered.common.item.inventory.util.ItemStackUtil;
4141

42+
import java.util.Collection;
43+
4244
public class BookFaker {
4345

4446
public static final int WINDOW_PLAYER_INVENTORY = 0;
4547

46-
public static void fakeBookView(BookView bookView, Player player) {
47-
EntityPlayerMP mcPlayer = (EntityPlayerMP) player;
48-
NetHandlerPlayServer receiver = mcPlayer.connection;
48+
public static void fakeBookView(BookView bookView, Collection<Player> players) {
4949

5050
// First we need to send a fake a Book ItemStack with the BookView's
5151
// contents to the player's hand
52-
ItemStack item = ItemStack.of(ItemTypes.WRITTEN_BOOK, 1);
52+
final ItemStack item = ItemStack.of(ItemTypes.WRITTEN_BOOK, 1);
5353
item.offer(Keys.DISPLAY_NAME, bookView.getTitle());
5454
item.offer(Keys.BOOK_AUTHOR, bookView.getAuthor());
5555
item.offer(Keys.BOOK_PAGES, bookView.getPages());
5656

57-
InventoryPlayer inventory = mcPlayer.inventory;
58-
int bookSlot = inventory.mainInventory.size() + inventory.currentItem;
59-
receiver.sendPacket(new SPacketSetSlot(WINDOW_PLAYER_INVENTORY, bookSlot, ItemStackUtil.toNative(item)));
57+
for (Player player : players) {
58+
final EntityPlayerMP mcPlayer = (EntityPlayerMP) player;
59+
final NetHandlerPlayServer receiver = mcPlayer.connection;
60+
61+
final InventoryPlayer inventory = mcPlayer.inventory;
62+
final int bookSlot = inventory.mainInventory.size() + inventory.currentItem;
63+
receiver.sendPacket(new SPacketSetSlot(WINDOW_PLAYER_INVENTORY, bookSlot, ItemStackUtil.toNative(item)));
6064

61-
// Next we tell the client to open the Book GUI
62-
PacketBuffer packetbuffer = new PacketBuffer(Unpooled.buffer());
63-
packetbuffer.writeEnumValue(EnumHand.MAIN_HAND);
64-
receiver.sendPacket(new SPacketCustomPayload("MC|BOpen", packetbuffer));
65+
// Next we tell the client to open the Book GUI
66+
final PacketBuffer packetbuffer = new PacketBuffer(Unpooled.buffer());
67+
packetbuffer.writeEnumValue(EnumHand.MAIN_HAND);
68+
receiver.sendPacket(new SPacketCustomPayload("MC|BOpen", packetbuffer));
6569

66-
// Now we can remove the fake Book since it's contents will have already
67-
// been transferred to the GUI
68-
receiver.sendPacket(new SPacketSetSlot(WINDOW_PLAYER_INVENTORY, bookSlot, inventory.getCurrentItem()));
70+
// Now we can remove the fake Book since it's contents will have already
71+
// been transferred to the GUI
72+
receiver.sendPacket(new SPacketSetSlot(WINDOW_PLAYER_INVENTORY, bookSlot, inventory.getCurrentItem()));
73+
}
6974
}
7075

7176
}

0 commit comments

Comments
 (0)