Skip to content
This repository has been archived by the owner on Jan 20, 2024. It is now read-only.

Commit

Permalink
Features: add settings for server brand
Browse files Browse the repository at this point in the history
  • Loading branch information
TheFaser committed Aug 27, 2023
1 parent 39ca1bb commit 2bef043
Show file tree
Hide file tree
Showing 11 changed files with 188 additions and 1 deletion.
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -133,5 +133,11 @@
<version>1.25.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.13-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
3 changes: 3 additions & 0 deletions src/main/java/net/flectone/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.flectone.misc.commands.FTabCompleter;
import net.flectone.sqlite.Database;
import net.flectone.sqlite.SQLite;
import net.flectone.testing.ServerBrand;
import net.flectone.tickers.PlayerPingTicker;
import net.flectone.utils.MetricsUtil;
import net.flectone.utils.NMSUtil;
Expand Down Expand Up @@ -61,6 +62,8 @@ public void onEnable() {
PlayerDeathEventListener.reload();
PlayerAdvancementDoneListener.reload();

if (FileManager.config.getBoolean("server.brand.enable")) new ServerBrand();

info("✔ Plugin enabled");

Bukkit.getScheduler().runTaskAsynchronously(this, WebUtil::checkNewerVersion);
Expand Down
6 changes: 5 additions & 1 deletion src/main/java/net/flectone/commands/CommandFlectonechat.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.flectone.misc.commands.FCommand;
import net.flectone.misc.commands.FTabCompleter;
import net.flectone.misc.files.FYamlConfiguration;
import net.flectone.testing.ServerBrand;
import net.flectone.utils.ObjectUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
Expand Down Expand Up @@ -89,6 +90,9 @@ public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command
PlayerDeathEventListener.reload();
PlayerAdvancementDoneListener.reload();

if (config.getBoolean("server.brand.enable"))
ServerBrand.getInstance().updateEveryBrand();

fCommand.sendMeMessage("command.flectonechat.message");

return true;
Expand Down Expand Up @@ -150,7 +154,7 @@ private Object getObject(@NotNull Object object, @NotNull String value) {
if (object instanceof Integer) return Integer.parseInt(value);
if (object instanceof Boolean) return Boolean.parseBoolean(value);

return value;
return value.replace("\\n", System.lineSeparator());
}

@NotNull
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/net/flectone/listeners/PlayerJoinListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.flectone.misc.entity.FEntity;
import net.flectone.misc.entity.FPlayer;
import net.flectone.misc.entity.info.ModInfo;
import net.flectone.testing.ServerBrand;
import net.flectone.utils.ObjectUtil;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
Expand Down Expand Up @@ -43,6 +44,9 @@ public static void sendJoinMessage(@NotNull Player player) {

@EventHandler
public void joinPlayer(@NotNull PlayerJoinEvent event) {
if (config.getBoolean("server.brand.enable"))
ServerBrand.getInstance().setBrand(event.getPlayer());

Player player = event.getPlayer();

FEntity.removeBugEntities(player);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/net/flectone/managers/TickerManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ public static void start() {
addTicker(new PlayerPingTicker());
} else PlayerPingTicker.unregisterPingObjective();

if (config.getBoolean("server.brand.update.enable")) {
addTicker(new ServerBrandTicker());
}

bukkitRunnableList.parallelStream().forEach(FBukkitRunnable::runTaskTimer);
}
}
40 changes: 40 additions & 0 deletions src/main/java/net/flectone/testing/PacketSerializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package net.flectone.testing;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

import java.nio.charset.StandardCharsets;

public class PacketSerializer {

private final byte[] result;

public PacketSerializer(String string) {
ByteBuf buf = Unpooled.buffer();
writeString(string, buf);
result = buf.array();
buf.release();
}

private void writeString(String s, ByteBuf buf) {
byte[] b = s.getBytes(StandardCharsets.UTF_8);
writeVarInt(b.length, buf);
buf.writeBytes(b);
}

private void writeVarInt(int value, ByteBuf output) {
do {
int part = value & 0x7F;
value >>>= 7;
if (value != 0) {
part |= 0x80;
}
output.writeByte(part);
} while (value != 0);
}

public byte[] toArray() {
return result;
}

}
79 changes: 79 additions & 0 deletions src/main/java/net/flectone/testing/ServerBrand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package net.flectone.testing;

import net.flectone.Main;
import net.flectone.managers.FileManager;
import net.flectone.utils.ObjectUtil;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Set;

public class ServerBrand {

private static ServerBrand instance;
private static Field playerChannelsField;
private String channel;

public ServerBrand() {
instance = this;

try {
Class.forName("org.bukkit.entity.Dolphin");
channel = "minecraft:brand";
} catch (ClassNotFoundException ignored) {
channel = "MC|Brand";
}

try {
Method registerMethod = Main.getInstance().getServer().getMessenger().getClass().getDeclaredMethod("addToOutgoing", Plugin.class, String.class);
registerMethod.setAccessible(true);
registerMethod.invoke(Main.getInstance().getServer().getMessenger(), Main.getInstance(), channel);
} catch (ReflectiveOperationException e) {
throw new RuntimeException("Error while attempting to register plugin message channel", e);
}

updateEveryBrand();
}

public static ServerBrand getInstance() {
return instance;
}

public void setBrand(Player player) {
if (playerChannelsField == null) {
try {
playerChannelsField = player.getClass().getDeclaredField("channels");
playerChannelsField.setAccessible(true);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}

try {
Set<String> channels = (Set<String>) playerChannelsField.get(player);
channels.add(channel);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}

updateBrand(player);
}

public void updateBrand(Player player) {
String brandString = FileManager.locale.getStringList("server.brand.message").get(0);
updateBrand(player, brandString);
}

public void updateBrand(Player player, String brandString) {
player.sendPluginMessage(Main.getInstance(), channel,
new PacketSerializer(ObjectUtil.formatString(brandString, player) + ChatColor.RESET).toArray());
}

public void updateEveryBrand() {
Bukkit.getOnlinePlayers().forEach(this::updateBrand);
}
}
30 changes: 30 additions & 0 deletions src/main/java/net/flectone/tickers/ServerBrandTicker.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package net.flectone.tickers;

import net.flectone.managers.FileManager;
import net.flectone.misc.runnables.FBukkitRunnable;
import net.flectone.testing.ServerBrand;
import org.bukkit.Bukkit;

import java.util.ArrayList;
import java.util.List;

public class ServerBrandTicker extends FBukkitRunnable {

private static final List<String> brands = new ArrayList<>();
private static int index = 0;

public ServerBrandTicker() {
super.period = FileManager.config.getInt("server.brand.update.rate");

brands.clear();
brands.addAll(FileManager.locale.getStringList("server.brand.message"));
}

@Override
public void run() {
int nextIndex = index++ % brands.size();

Bukkit.getOnlinePlayers().parallelStream().forEach(player ->
ServerBrand.getInstance().updateBrand(player, brands.get(nextIndex)));
}
}
7 changes: 7 additions & 0 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ tab:
enable: true

server:
brand:
enable: true

update:
enable: true
rate: 20

motd:
messages:
enable: true
Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/language/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
# Second color &&2

server:
brand:
message:
- "&bFlectoneChat"
- "&fFlectoneChat"

motd:
maintenance: "&cThe server is under maintenance"
messages:
Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/language/ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@
# Второй цвет &&2

server:
brand:
message:
- "&bFlectoneChat"
- "&fFlectoneChat"

motd:
maintenance: "&cВ настоящее время проводятся технические работы"
messages:
Expand Down

0 comments on commit 2bef043

Please sign in to comment.