Skip to content

Commit 09354ee

Browse files
committed
r/place 2023 :D
1 parent f665f1e commit 09354ee

File tree

12 files changed

+61
-616
lines changed

12 files changed

+61
-616
lines changed

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<dependency>
4444
<groupId>io.papermc.paper</groupId>
4545
<artifactId>paper-api</artifactId>
46-
<version>1.17.1-R0.1-SNAPSHOT</version>
46+
<version>1.20.1-R0.1-SNAPSHOT</version>
4747
<scope>provided</scope>
4848
</dependency>
4949
<dependency>
@@ -55,19 +55,19 @@
5555
<dependency>
5656
<groupId>dev.cerus.maps</groupId>
5757
<artifactId>common</artifactId>
58-
<version>2.0.0-SNAPSHOT-pre2</version>
58+
<version>3.7.1</version>
5959
<scope>provided</scope>
6060
</dependency>
6161
<dependency>
6262
<groupId>dev.cerus.maps</groupId>
6363
<artifactId>plugin</artifactId>
64-
<version>2.0.0-SNAPSHOT-pre2</version>
64+
<version>3.7.1</version>
6565
<scope>provided</scope>
6666
</dependency>
6767
<dependency>
6868
<groupId>org.bukkit</groupId>
6969
<artifactId>craftbukkit</artifactId>
70-
<version>1.16.5-R0.1-SNAPSHOT</version>
70+
<version>1.20.1-R0.1-SNAPSHOT</version>
7171
<scope>provided</scope>
7272
</dependency>
7373
</dependencies>

src/main/java/dev/cerus/minecraftplace/MinecraftPlacePlugin.java

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package dev.cerus.minecraftplace;
22

3-
import co.aikar.commands.BukkitCommandManager;
43
import com.google.gson.JsonArray;
54
import com.google.gson.JsonElement;
65
import com.google.gson.JsonObject;
@@ -14,13 +13,6 @@
1413
import dev.cerus.minecraftplace.reddit.canvas.Palette;
1514
import dev.cerus.minecraftplace.reddit.client.PlaceSocketClient;
1615
import dev.cerus.minecraftplace.reddit.worker.CanvasUpdateWorker;
17-
import dev.cerus.minecraftplace.world.BlockColorCache;
18-
import dev.cerus.minecraftplace.world.BlockUpdateTask;
19-
import dev.cerus.minecraftplace.world.ChunkListener;
20-
import dev.cerus.minecraftplace.world.PlayerChunkController;
21-
import dev.cerus.minecraftplace.world.RPlaceCommand;
22-
import dev.cerus.minecraftplace.world.RPlaceGenerator;
23-
import dev.cerus.minecraftplace.world.WorldContext;
2416
import java.awt.Color;
2517
import java.io.IOException;
2618
import java.util.HashMap;
@@ -29,11 +21,6 @@
2921
import java.util.Set;
3022
import java.util.function.Consumer;
3123
import org.bukkit.Bukkit;
32-
import org.bukkit.Difficulty;
33-
import org.bukkit.GameRule;
34-
import org.bukkit.World;
35-
import org.bukkit.WorldCreator;
36-
import org.bukkit.WorldType;
3724
import org.bukkit.plugin.PluginManager;
3825
import org.bukkit.plugin.java.JavaPlugin;
3926

@@ -59,37 +46,6 @@ public void onEnable() {
5946
final PluginManager pluginManager = this.getServer().getPluginManager();
6047
pluginManager.registerEvents(new JoinListener(this), this);
6148

62-
// Generate world
63-
if (this.getConfig().getBoolean("world.enable")) {
64-
final BukkitCommandManager commandManager = new BukkitCommandManager(this);
65-
commandManager.registerCommand(new RPlaceCommand());
66-
67-
this.paletteConfigCallbacks.add(palette ->
68-
this.getServer().getScheduler().runTask(this, () -> {
69-
final String worldName = this.getConfig().getString("world.name");
70-
71-
final BlockColorCache blockColorCache = new BlockColorCache(palette);
72-
final WorldContext worldContext = new WorldContext(this, 16 * 8, 4, 16 * 8);
73-
final PlayerChunkController playerChunkController = new PlayerChunkController();
74-
75-
final World placeWorld = this.getServer().createWorld(new WorldCreator(worldName)
76-
.environment(World.Environment.NORMAL)
77-
.generateStructures(false)
78-
.generator(new RPlaceGenerator(this, blockColorCache, worldContext))
79-
.type(WorldType.FLAT));
80-
placeWorld.setGameRule(GameRule.DO_MOB_SPAWNING, false);
81-
placeWorld.setGameRule(GameRule.DO_TRADER_SPAWNING, false);
82-
placeWorld.setGameRule(GameRule.DO_PATROL_SPAWNING, false);
83-
placeWorld.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false);
84-
placeWorld.setGameRule(GameRule.DO_WEATHER_CYCLE, false);
85-
placeWorld.setDifficulty(Difficulty.PEACEFUL);
86-
placeWorld.setTime(6000);
87-
88-
pluginManager.registerEvents(new ChunkListener(worldContext, placeWorld, this, blockColorCache, playerChunkController), this);
89-
Bukkit.getScheduler().runTaskTimerAsynchronously(this, new BlockUpdateTask(this, playerChunkController, blockColorCache), 0, 10);
90-
}));
91-
}
92-
9349
// Enable fast graphics and start update task
9450
Bukkit.getScheduler().runTaskLater(this, () ->
9551
MapScreenRegistry.getScreens().stream()
@@ -163,7 +119,7 @@ private void startClient(final RedditAuthenticator.Token token) throws Interrupt
163119
}
164120

165121
if (message.getTypeName().equals("DiffFrameMessageData")
166-
|| message.getTypeName().equals("FullFrameMessageData")) {
122+
|| message.getTypeName().equals("FullFrameMessageData")) {
167123
// These messages contain canvas updates (an url pointing to an image of the canvas)
168124
// These images show either the full or only a few updates tiles.
169125
final String imageUrl = message.get("data.subscribe.data").get("name").getAsString();
@@ -178,9 +134,10 @@ private void startClient(final RedditAuthenticator.Token token) throws Interrupt
178134
final JsonArray colorsArr = dataObj.getAsJsonObject("colorPalette").getAsJsonArray("colors");
179135
for (final JsonElement element : colorsArr) {
180136
final JsonObject colorObj = element.getAsJsonObject();
137+
final String colorString = colorObj.get("hex").getAsString().substring(1);
181138
palette.set(
182139
colorObj.get("index").getAsInt(),
183-
new Color(Integer.parseInt(colorObj.get("hex").getAsString().substring(1), 16), false)
140+
new Color(Integer.parseInt(colorString, 16), false)
184141
);
185142
}
186143

@@ -216,6 +173,8 @@ private void startClient(final RedditAuthenticator.Token token) throws Interrupt
216173

217174
this.paletteConfigCallbacks.forEach(callback -> callback.accept(palette));
218175
this.paletteConfigCallbacks.clear();
176+
177+
this.getLogger().info("Received config, canvas dimensions: " + this.getScreenWidth() + "x" + this.getScreenHeight());
219178
}
220179
});
221180
this.client.start(token.token());

src/main/java/dev/cerus/minecraftplace/map/MapUpdateTask.java

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package dev.cerus.minecraftplace.map;
22

33
import dev.cerus.maps.api.MapScreen;
4-
import dev.cerus.maps.api.graphics.ColorCache;
4+
import dev.cerus.maps.api.graphics.MapGraphics;
55
import dev.cerus.maps.plugin.map.MapScreenRegistry;
66
import dev.cerus.minecraftplace.MinecraftPlacePlugin;
7-
import java.awt.Color;
7+
import dev.cerus.minecraftplace.reddit.canvas.Canvas;
8+
import java.util.Collection;
9+
import java.util.HashMap;
10+
import java.util.HashSet;
811
import java.util.List;
12+
import java.util.Map;
13+
import java.util.Set;
14+
import java.util.UUID;
915
import org.bukkit.Bukkit;
1016
import org.bukkit.entity.Player;
1117

@@ -14,6 +20,9 @@
1420
*/
1521
public class MapUpdateTask implements Runnable {
1622

23+
private static final double MAX_DIST = Math.pow(32, 2);
24+
25+
private final Map<Integer, Set<UUID>> screenViewerMap = new HashMap<>();
1726
private final MinecraftPlacePlugin plugin;
1827

1928
public MapUpdateTask(final MinecraftPlacePlugin plugin) {
@@ -31,22 +40,37 @@ public void run() {
3140
return;
3241
}
3342

43+
final Collection<Canvas> canvases = this.plugin.getCanvasMap().values();
44+
3445
// Update screens
35-
for (final MapScreen mapScreen : screens) {
36-
this.plugin.getCanvasMap().forEach((integer, canvas) -> {
37-
final int baseX = canvas.getX() + 24;
38-
final int baseY = canvas.getY() + 24;
39-
40-
for (int x = 0; x < canvas.getWidth(); x++) {
41-
for (int y = 0; y < canvas.getHeight(); y++) {
42-
final Color pixel = canvas.getPixel(x, y);
43-
final byte mapColor = ColorCache.rgbToMap(pixel.getRed(), pixel.getGreen(), pixel.getBlue());
44-
mapScreen.getGraphics().setPixel(baseX + x, baseY + y, mapColor);
45-
}
46+
for (final MapScreen screen : screens) {
47+
for (final Canvas canvas : canvases) {
48+
final MapGraphics<?, ?> graphics = screen.getGraphics();
49+
graphics.place(canvas.getData(), canvas.getX(), canvas.getY());
50+
}
51+
52+
final Collection<Player> receivers = new HashSet<>();
53+
for (final Player player : Bukkit.getOnlinePlayers()) {
54+
final Set<UUID> viewers = this.screenViewerMap.computeIfAbsent(screen.getId(), $ -> new HashSet<>());
55+
final double dist = player.getLocation().distanceSquared(screen.getLocation());
56+
if (viewers.contains(player.getUniqueId()) && dist > MAX_DIST) {
57+
// Remove
58+
viewers.remove(player.getUniqueId());
59+
screen.destroyFrames(player);
60+
} else if (!viewers.contains(player.getUniqueId()) && dist < MAX_DIST) {
61+
// Add
62+
viewers.add(player.getUniqueId());
63+
screen.spawnFrames(player);
64+
screen.sendMaps(true, player);
65+
}
66+
if (viewers.contains(player.getUniqueId())) {
67+
// Update
68+
receivers.add(player);
4669
}
47-
});
48-
mapScreen.sendMaps(false);
49-
mapScreen.sendFrames(Bukkit.getOnlinePlayers().toArray(new Player[0]));
70+
}
71+
if (!receivers.isEmpty()) {
72+
screen.sendMaps(false, receivers);
73+
}
5074
}
5175
}
5276

src/main/java/dev/cerus/minecraftplace/reddit/canvas/Canvas.java

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package dev.cerus.minecraftplace.reddit.canvas;
22

3-
import dev.cerus.maps.api.MapColor;
43
import dev.cerus.maps.api.graphics.ColorCache;
4+
import dev.cerus.maps.api.graphics.MapGraphics;
5+
import dev.cerus.maps.api.graphics.StandaloneMapGraphics;
56
import java.awt.Color;
67

78
/**
@@ -14,15 +15,15 @@ public class Canvas {
1415
private final int y;
1516
private final int width;
1617
private final int height;
17-
private final byte[] data;
18+
private final MapGraphics<?, ?> data;
1819

1920
public Canvas(final Palette palette, final int x, final int y, final int width, final int height) {
2021
this.palette = palette;
2122
this.x = x;
2223
this.y = y;
2324
this.width = width;
2425
this.height = height;
25-
this.data = new byte[width * height];
26+
this.data = StandaloneMapGraphics.standalone(width, height);
2627
}
2728

2829
/**
@@ -34,40 +35,13 @@ public Canvas(final Palette palette, final int x, final int y, final int width,
3435
* @param force Ignore palette restrictions
3536
*/
3637
public void setPixel(final int x, final int y, final Color color, final boolean force) {
37-
this.data[this.index(x, y)] = force
38+
/*this.data[this.index(x, y)] = force
3839
? (ColorCache.rgbToMap(color.getRed(), color.getGreen(), color.getBlue()))
39-
: ((byte) this.palette.getIndex(color));
40+
: ((byte) this.palette.getIndex(color));*/
41+
this.data.setPixel(x, y, ColorCache.rgbToMap(color.getRed(), color.getGreen(), color.getBlue()));
4042
}
4143

42-
/**
43-
* Get a pixel at the specified coordinates
44-
*
45-
* @param x The x coordinate
46-
* @param y The y coordinate
47-
*
48-
* @return The pixel
49-
*/
50-
public Color getPixel(final int x, final int y) {
51-
final Color paletteColor = this.palette.getColor(this.data[this.index(x, y)]);
52-
if (paletteColor == null) {
53-
return MapColor.mapColorToRgb(this.data[this.index(x, y)]);
54-
}
55-
return paletteColor;
56-
}
57-
58-
/**
59-
* x & y to array index
60-
*
61-
* @param x X coordinate
62-
* @param y Y coordinate
63-
*
64-
* @return Array index
65-
*/
66-
private int index(final int x, final int y) {
67-
return x + y * Math.max(this.width, this.height);
68-
}
69-
70-
public byte[] getData() {
44+
public MapGraphics<?, ?> getData() {
7145
return this.data;
7246
}
7347

src/main/java/dev/cerus/minecraftplace/reddit/client/PlaceSocketClient.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public class PlaceSocketClient extends WebSocketClient {
2222
private static final String SOCKET_URL = "wss://gql-realtime-2.reddit.com/query";
2323
private static final String MSG_STOP = "{\"id\":\"%d\",\"type\":\"stop\"}";
2424
private static final String MSG_AUTH = "{\"type\":\"connection_init\",\"payload\":{\"Authorization\":\"Bearer %s\"}}";
25-
private static final String MSG_CONFIG = "{\"id\":\"%d\",\"type\":\"start\",\"payload\":{\"variables\":{\"input\":{\"channel\":{\"teamOwner\":\"AFD2022\",\"category\":\"CONFIG\"}}},\"extensions\":{},\"operationName\":\"configuration\",\"query\":\"subscription configuration($input: SubscribeInput!) {\\n subscribe(input: $input) {\\n id\\n ... on BasicMessage {\\n data {\\n __typename\\n ... on ConfigurationMessageData {\\n colorPalette {\\n colors {\\n hex\\n index\\n __typename\\n }\\n __typename\\n }\\n canvasConfigurations {\\n index\\n dx\\n dy\\n __typename\\n }\\n canvasWidth\\n canvasHeight\\n __typename\\n }\\n }\\n __typename\\n }\\n __typename\\n }\\n}\\n\"}}";
26-
private static final String MSG_SUB_CANVAS = "{\"id\":\"%d\",\"type\":\"start\",\"payload\":{\"variables\":{\"input\":{\"channel\":{\"teamOwner\":\"AFD2022\",\"category\":\"CANVAS\",\"tag\":\"%d\"}}},\"extensions\":{},\"operationName\":\"replace\",\"query\":\"subscription replace($input: SubscribeInput!) {\\n subscribe(input: $input) {\\n id\\n ... on BasicMessage {\\n data {\\n __typename\\n ... on FullFrameMessageData {\\n __typename\\n name\\n timestamp\\n }\\n ... on DiffFrameMessageData {\\n __typename\\n name\\n currentTimestamp\\n previousTimestamp\\n }\\n }\\n __typename\\n }\\n __typename\\n }\\n}\\n\"}}";
25+
private static final String MSG_CONFIG = "{\"id\":\"%d\",\"type\":\"start\",\"payload\":{\"variables\":{\"input\":{\"channel\":{\"teamOwner\":\"GARLICBREAD\",\"category\":\"CONFIG\"}}},\"extensions\":{},\"operationName\":\"configuration\",\"query\":\"subscription configuration($input: SubscribeInput!) {\\n subscribe(input: $input) {\\n id\\n ... on BasicMessage {\\n data {\\n __typename\\n ... on ConfigurationMessageData {\\n colorPalette {\\n colors {\\n hex\\n index\\n __typename\\n }\\n __typename\\n }\\n canvasConfigurations {\\n index\\n dx\\n dy\\n __typename\\n }\\n activeZone {\\n topLeft {\\n x\\n y\\n __typename\\n }\\n bottomRight {\\n x\\n y\\n __typename\\n }\\n __typename\\n }\\n canvasWidth\\n canvasHeight\\n adminConfiguration {\\n maxAllowedCircles\\n maxUsersPerAdminBan\\n __typename\\n }\\n __typename\\n }\\n }\\n __typename\\n }\\n __typename\\n }\\n}\\n\"}}";
26+
private static final String MSG_SUB_CANVAS = "{\"id\":\"%d\",\"type\":\"start\",\"payload\":{\"variables\":{\"input\":{\"channel\":{\"teamOwner\":\"GARLICBREAD\",\"category\":\"CANVAS\",\"tag\":\"%d\"}}},\"extensions\":{},\"operationName\":\"replace\",\"query\":\"subscription replace($input: SubscribeInput!) {\\n subscribe(input: $input) {\\n id\\n ... on BasicMessage {\\n data {\\n __typename\\n ... on FullFrameMessageData {\\n __typename\\n name\\n timestamp\\n }\\n ... on DiffFrameMessageData {\\n __typename\\n name\\n currentTimestamp\\n previousTimestamp\\n }\\n }\\n __typename\\n }\\n __typename\\n }\\n}\\n\"}}";
2727

2828
private final Set<Consumer<String>> rawMessageHandlers = new HashSet<>();
2929
private final Set<Consumer<Message>> messageHandlers = new HashSet<>();
@@ -34,7 +34,7 @@ public class PlaceSocketClient extends WebSocketClient {
3434
public PlaceSocketClient() {
3535
super(
3636
URI.create(SOCKET_URL),
37-
Map.of("Origin", "https://hot-potato.reddit.com") // Required or else we get 401
37+
Map.of("Origin", "https://garlic-bread.reddit.com") // Required or else we get 401
3838
);
3939
}
4040

@@ -145,7 +145,7 @@ public void onMessage(final String s) {
145145
if (parsedMsg.isJsonObject()) {
146146
final JsonObject parsedMsgObj = parsedMsg.getAsJsonObject();
147147
if (parsedMsgObj.has("id")
148-
&& parsedMsgObj.has("type")) {
148+
&& parsedMsgObj.has("type")) {
149149
final Message message = new Message(parsedMsgObj);
150150
this.messageHandlers.forEach(handler -> handler.accept(message));
151151
}

src/main/java/dev/cerus/minecraftplace/world/BlockColorCache.java

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)