Skip to content

Commit 6d6614a

Browse files
authored
Merge pull request #260 from KosmX/velocity
Velocity plugin, proxy plugin warning
2 parents 757be8c + 27ad0fc commit 6d6614a

File tree

8 files changed

+381
-0
lines changed

8 files changed

+381
-0
lines changed

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ else {
140140
task buildAll{
141141
dependsOn(':bukkit:build')
142142
dependsOn(':bungee:build')
143+
dependsOn(':velocity:build')
143144
dependsOn(':16:buildAll', ':18:buildAll', ':19:buildAll')
144145
}
145146

@@ -153,6 +154,7 @@ task collectArtifacts{
153154
dependsOn('cleanupArtifacts')
154155
dependsOn(':bukkit:copyArtifacts')
155156
dependsOn(':bungee:copyArtifacts')
157+
dependsOn(':velocity:copyArtifacts')
156158
dependsOn(':16:copyArtifacts', ':18:copyArtifacts', ':19:copyArtifacts')
157159
doLast {
158160
releaseArtifacts = project.getProjectDir().toPath().resolve("artifacts").toFile().listFiles()

bungee/src/main/java/io/github/kosmx/emotes/bungee/BungeeWrapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public void onEnable() {
3333
getProxy().getPluginManager().registerListener(this, networkPlay);
3434
super.onEnable();
3535
getLogger().info("Loading Emotecraft as a bukkit plugin...");
36+
getLogger().warning("Emotecraft is meant to be used on a server, not on a proxy.");
37+
getLogger().warning("Certain features will be unavailable, like server-side API.");
3638
}
3739

3840
@Override

settings.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,8 @@ include 'bukkit:debug'
5353

5454
//Bungee plugin stuff
5555
include 'bungee'
56+
57+
//Velocity plugin stuff
58+
include 'velocity'
59+
5660
//*/

velocity/build.gradle

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
plugins {
2+
id 'java'
3+
}
4+
5+
version 'unspecified'
6+
7+
project.archivesBaseName = project.archives_base_name
8+
project.version = project.mod_version
9+
10+
repositories {
11+
mavenCentral()
12+
13+
maven {
14+
name = 'velocitypowered-repo'
15+
url = 'https://nexus.velocitypowered.com/repository/maven-public/'
16+
}
17+
}
18+
19+
configurations {
20+
compileModule
21+
22+
compileClasspath.extendsFrom compileModule
23+
runtimeClasspath.extendsFrom compileModule
24+
}
25+
26+
dependencies {
27+
28+
compileOnly 'com.velocitypowered:velocity-api:3.0.0'
29+
annotationProcessor 'com.velocitypowered:velocity-api:3.0.0'
30+
31+
compileModule(project(':emotesAPI'))
32+
compileModule(project(':executor'))
33+
compileModule(project(':emotesServer'))
34+
compileModule(project(':emotesMain')) { transitive = false }
35+
}
36+
37+
jar {
38+
from {
39+
configurations.compileModule.collect() { it.isDirectory() ? it : zipTree(it) }
40+
}
41+
dependsOn(':emotesMain:build')
42+
classifier "velocity"
43+
}
44+
45+
task copyArtifacts {
46+
dependsOn('build')
47+
doLast {
48+
copy {
49+
from "${project.buildDir}/libs/${project.archives_base_name}-${project.mod_version}-velocity.jar"
50+
into "${rootProject.projectDir}/artifacts"
51+
}
52+
}
53+
}
54+
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package io.github.kosmx.emotes.velocity;
2+
3+
import com.google.inject.Inject;
4+
import com.velocitypowered.api.event.Subscribe;
5+
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
6+
import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
7+
import com.velocitypowered.api.plugin.Plugin;
8+
import com.velocitypowered.api.proxy.ProxyServer;
9+
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
10+
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
11+
import io.github.kosmx.emotes.common.CommonData;
12+
import io.github.kosmx.emotes.executor.EmoteInstance;
13+
import io.github.kosmx.emotes.server.config.Serializer;
14+
import io.github.kosmx.emotes.server.serializer.UniversalEmoteSerializer;
15+
import io.github.kosmx.emotes.velocity.executor.VelocityInstance;
16+
import io.github.kosmx.emotes.velocity.network.ServerSideEmotePlay;
17+
18+
import java.util.logging.Logger;
19+
20+
@Plugin(
21+
id = "emotecraft",
22+
version = "unspecified",
23+
name = "emotecraft"
24+
)
25+
public class VelocityWrapper {
26+
27+
public final static ChannelIdentifier EmotePacket =
28+
MinecraftChannelIdentifier.create(CommonData.MOD_ID, CommonData.playEmoteID);
29+
30+
public final static ChannelIdentifier GeyserPacket =
31+
MinecraftChannelIdentifier.create("geyser", "emote");
32+
33+
private final ProxyServer server;
34+
private final Logger logger;
35+
36+
private ServerSideEmotePlay networkPlay;
37+
38+
@Inject
39+
public VelocityWrapper(ProxyServer server, Logger logger) {
40+
this.server = server;
41+
this.logger = logger;
42+
}
43+
44+
@Subscribe
45+
public void init(ProxyInitializeEvent event) {
46+
if (CommonData.isLoaded) {
47+
logger.warning("Emotecraft is loaded multiple times, please load it only once!");
48+
this.shutdown(); // disable itself.
49+
} else {
50+
CommonData.isLoaded = true;
51+
}
52+
EmoteInstance.instance = new VelocityInstance(logger::log);
53+
Serializer.INSTANCE = new Serializer(); // it does register itself
54+
EmoteInstance.config = Serializer.getConfig();
55+
UniversalEmoteSerializer.loadEmotes();
56+
this.networkPlay = new ServerSideEmotePlay(server);
57+
server.getEventManager().register(this, networkPlay);
58+
logger.info("Loading Emotecraft as a velocity plugin...");
59+
60+
logger.warning("Emotecraft is meant to be used on a server, not on a proxy.");
61+
logger.warning("Certain features will be unavailable, like server-side API.");
62+
}
63+
64+
public void shutdown() {
65+
server.getChannelRegistrar().unregister(EmotePacket);
66+
}
67+
68+
@Subscribe
69+
public void shutdown(ProxyShutdownEvent event) {
70+
shutdown();
71+
}
72+
73+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.github.kosmx.emotes.velocity.executor;
2+
3+
import io.github.kosmx.emotes.executor.EmoteInstance;
4+
import io.github.kosmx.emotes.executor.Logger;
5+
import io.github.kosmx.emotes.executor.dataTypes.IClientMethods;
6+
import io.github.kosmx.emotes.executor.dataTypes.IDefaultTypes;
7+
import io.github.kosmx.emotes.executor.dataTypes.IGetters;
8+
9+
import java.nio.file.Path;
10+
import java.nio.file.Paths;
11+
12+
public class VelocityInstance extends EmoteInstance {
13+
14+
private final Logger logger;
15+
16+
public VelocityInstance(Logger logger) {
17+
this.logger = logger;
18+
}
19+
20+
@Override
21+
public Logger getLogger() {
22+
return logger;
23+
}
24+
25+
@Override
26+
public IDefaultTypes getDefaults() {
27+
return null;
28+
}
29+
30+
@Override
31+
public IGetters getGetters() {
32+
return null;
33+
}
34+
35+
@Override
36+
public IClientMethods getClientMethods() {
37+
return null;
38+
}
39+
40+
@Override
41+
public boolean isClient() {
42+
return false;
43+
}
44+
45+
@Override
46+
public Path getGameDirectory() {
47+
return Paths.get("");
48+
}
49+
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package io.github.kosmx.emotes.velocity.network;
2+
3+
import com.velocitypowered.api.event.Subscribe;
4+
import com.velocitypowered.api.event.connection.DisconnectEvent;
5+
import com.velocitypowered.api.event.connection.PluginMessageEvent;
6+
import com.velocitypowered.api.event.connection.PostLoginEvent;
7+
import com.velocitypowered.api.proxy.Player;
8+
import com.velocitypowered.api.proxy.ProxyServer;
9+
import io.github.kosmx.emotes.common.network.EmotePacket;
10+
import io.github.kosmx.emotes.common.network.GeyserEmotePacket;
11+
import io.github.kosmx.emotes.common.network.objects.NetData;
12+
import io.github.kosmx.emotes.executor.EmoteInstance;
13+
import io.github.kosmx.emotes.server.network.AbstractServerEmotePlay;
14+
import io.github.kosmx.emotes.server.network.IServerNetworkInstance;
15+
import io.github.kosmx.emotes.velocity.VelocityWrapper;
16+
import org.jetbrains.annotations.Nullable;
17+
18+
import java.util.HashMap;
19+
import java.util.UUID;
20+
import java.util.logging.Level;
21+
22+
public class ServerSideEmotePlay extends AbstractServerEmotePlay<Player> {
23+
24+
private final ProxyServer server;
25+
private final HashMap<UUID, VelocityNetworkInstance> player_database = new HashMap<>();
26+
27+
public ServerSideEmotePlay(ProxyServer server) {
28+
this.server = server;
29+
server.getChannelRegistrar().register(VelocityWrapper.EmotePacket);
30+
server.getChannelRegistrar().register(VelocityWrapper.GeyserPacket);
31+
}
32+
33+
@Subscribe
34+
public void receivePluginMessage(PluginMessageEvent event) {
35+
event.setResult(PluginMessageEvent.ForwardResult.handled());
36+
if (event.getIdentifier().equals(VelocityWrapper.EmotePacket)) {
37+
if (event.getSource() instanceof Player) {
38+
Player player = (Player) event.getSource();
39+
40+
VelocityNetworkInstance playerNetwork = player_database.getOrDefault(player.getUniqueId(), null);
41+
if (playerNetwork != null) {
42+
// Let the common server logic process the message
43+
try {
44+
this.receiveMessage(event.getData(), player, playerNetwork);
45+
} catch (Exception e) {
46+
e.printStackTrace();
47+
}
48+
} else {
49+
EmoteInstance.instance.getLogger().log(Level.WARNING, "Player: " + player.getUsername() + " is not registered");
50+
}
51+
} else {
52+
EmoteInstance.instance.getLogger().log(Level.WARNING, "Uhh oh, sender is not a player");
53+
}
54+
}
55+
else if (event.getIdentifier().equals(VelocityWrapper.GeyserPacket)) {
56+
if (event.getSource() instanceof Player) {
57+
Player player = (Player) event.getSource();
58+
59+
receiveGeyserMessage(player, event.getData());
60+
} else {
61+
EmoteInstance.instance.getLogger().log(Level.WARNING, "Uhh oh, sender is not a player");
62+
}
63+
}
64+
else {
65+
event.setResult(PluginMessageEvent.ForwardResult.forward());
66+
}
67+
}
68+
69+
@Subscribe
70+
public void join(PostLoginEvent event) {
71+
this.player_database.put(event.getPlayer().getUniqueId(), new VelocityNetworkInstance(event.getPlayer()));
72+
}
73+
74+
@Subscribe
75+
public void leave(DisconnectEvent event) {
76+
Player player = event.getPlayer();
77+
78+
VelocityNetworkInstance instance = this.player_database.remove(player.getUniqueId());
79+
if (instance != null)
80+
instance.closeConnection();
81+
}
82+
83+
@Override
84+
protected UUID getUUIDFromPlayer(Player player) {
85+
return player.getUniqueId();
86+
}
87+
88+
@Override
89+
protected Player getPlayerFromUUID(UUID player) {
90+
return server.getPlayer(player).orElse(null);
91+
}
92+
93+
@Override
94+
protected long getRuntimePlayerID(Player player) {
95+
return player.getUniqueId().getMostSignificantBits() & Long.MAX_VALUE;
96+
}
97+
98+
@Override
99+
protected IServerNetworkInstance getPlayerNetworkInstance(Player player) {
100+
return player_database.get(getUUIDFromPlayer(player));
101+
}
102+
103+
@Override
104+
protected void sendForEveryoneElse(GeyserEmotePacket packet, Player player) {
105+
for (Player player1 : server.getAllPlayers()) {
106+
if (player1 != player) {
107+
try {
108+
player1.sendPluginMessage(VelocityWrapper.GeyserPacket, packet.write());
109+
} catch (Exception e) {
110+
e.printStackTrace();
111+
}
112+
}
113+
}
114+
}
115+
116+
@Override
117+
protected void sendForEveryoneElse(NetData data, @Nullable GeyserEmotePacket emotePacket, Player player) {
118+
for (Player player1 : server.getAllPlayers()) {
119+
if (player1 != player) {
120+
try {
121+
player1.sendPluginMessage(VelocityWrapper.EmotePacket, new EmotePacket.Builder(data).build().write().array());
122+
} catch (Exception e) {
123+
e.printStackTrace();
124+
}
125+
}
126+
}
127+
}
128+
129+
@Override
130+
protected void sendForPlayerInRange(NetData data, Player player, UUID target) {
131+
sendForPlayer(data, player, target);
132+
}
133+
134+
@Override
135+
protected void sendForPlayer(NetData data, Player player, UUID target) {
136+
Player targetPlayer = getPlayerFromUUID(target);
137+
try {
138+
targetPlayer.sendPluginMessage(VelocityWrapper.EmotePacket, new EmotePacket.Builder(data).build().write().array());
139+
} catch (Exception e) {
140+
e.printStackTrace();
141+
}
142+
}
143+
}

0 commit comments

Comments
 (0)