Skip to content
This repository has been archived by the owner on Aug 31, 2019. It is now read-only.

Custom text rendering API #225

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
158 changes: 158 additions & 0 deletions Bukkit/0097-SportBukkit.patch
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,161 @@ diff --git a/README.md b/README.md
======
A plugin API for [Minecraft](https://minecraft.net/) servers, currently maintained by [SpigotMC](http://www.spigotmc.org/).

diff --git a/src/main/java/org/bukkit/BukkitRuntime.java b/src/main/java/org/bukkit/BukkitRuntime.java
--- a/src/main/java/org/bukkit/BukkitRuntime.java
+++ b/src/main/java/org/bukkit/BukkitRuntime.java
@@ -8,6 +8,7 @@ import org.bukkit.potion.PotionBrewRegistry;
import org.bukkit.potion.PotionEffectRegistry;
import org.bukkit.registry.Key;
import org.bukkit.geometry.VectorFactory;
+import tc.oc.minecraft.api.text.TextRenderContext;

public interface BukkitRuntime {

@@ -39,4 +40,8 @@ public interface BukkitRuntime {
PotionBrewRegistry potionRegistry();

PotionEffectRegistry potionEffectRegistry();
+
+ default TextRenderContext textRenderContext() {
+ return (text, viewer) -> text;
+ }
}
diff --git a/src/main/java/org/bukkit/ServerModule.java b/src/main/java/org/bukkit/ServerModule.java
--- a/src/main/java/org/bukkit/ServerModule.java
+++ b/src/main/java/org/bukkit/ServerModule.java
@@ -16,8 +16,10 @@ import org.bukkit.plugin.messaging.Messenger;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scoreboard.ScoreboardManager;
import tc.oc.inject.SingletonModule;
+import tc.oc.minecraft.api.command.Console;
import tc.oc.minecraft.api.plugin.PluginFinder;
import tc.oc.minecraft.api.server.LocalServer;
+import tc.oc.minecraft.api.text.TextRenderContext;

/**
* Bindings for things that belong to a {@link Server}.
@@ -35,7 +37,7 @@ public class ServerModule extends SingletonModule {
bind(tc.oc.minecraft.api.server.Server.class).to(LocalServer.class);
bind(LocalServer.class).to(Server.class);
bind(BukkitRuntime.class).to(Server.class);
- bind(tc.oc.minecraft.api.command.ConsoleCommandSender.class).to(ConsoleCommandSender.class);
+ bind(Console.class).to(ConsoleCommandSender.class);
bind(PluginFinder.class).to(PluginManager.class);
}

@@ -85,6 +87,11 @@ public class ServerModule extends SingletonModule {
}

@Provides
+ TextRenderContext textRenderContext(Server server) {
+ return server.textRenderContext();
+ }
+
+ @Provides
Collection<World> worlds(Server server) {
return server.worldsById().values();
}
diff --git a/src/main/java/org/bukkit/command/ConsoleCommandSender.java b/src/main/java/org/bukkit/command/ConsoleCommandSender.java
--- a/src/main/java/org/bukkit/command/ConsoleCommandSender.java
+++ b/src/main/java/org/bukkit/command/ConsoleCommandSender.java
@@ -1,6 +1,7 @@
package org.bukkit.command;

import org.bukkit.conversations.Conversable;
+import tc.oc.minecraft.api.command.Console;

-public interface ConsoleCommandSender extends CommandSender, Conversable, tc.oc.minecraft.api.command.ConsoleCommandSender {
+public interface ConsoleCommandSender extends CommandSender, Conversable, Console {
}
diff --git a/src/main/java/org/bukkit/plugin/Plugin.java b/src/main/java/org/bukkit/plugin/Plugin.java
--- a/src/main/java/org/bukkit/plugin/Plugin.java
+++ b/src/main/java/org/bukkit/plugin/Plugin.java
@@ -2,7 +2,10 @@ package org.bukkit.plugin;

import java.io.File;
import java.io.InputStream;
+import java.util.Collection;
+import java.util.Collections;
import java.util.logging.Logger;
+import javax.inject.Provider;

import org.bukkit.Server;
import org.bukkit.command.TabExecutor;
@@ -11,6 +14,7 @@ import org.bukkit.event.EventRegistry;
import org.bukkit.generator.ChunkGenerator;

import com.avaje.ebean.EbeanServer;
+import tc.oc.minecraft.api.text.TextRenderer;

/**
* Represents a Plugin
@@ -98,6 +102,10 @@ public interface Plugin extends TabExecutor, tc.oc.minecraft.api.plugin.Plugin,
*/
EventRegistry eventRegistry();

+ default Collection<Provider<TextRenderer>> textRenderers() {
+ return Collections.emptyList();
+ }
+
/**
* Returns the Server instance currently running this plugin
*
diff --git a/src/main/java/org/bukkit/plugin/PluginBase.java b/src/main/java/org/bukkit/plugin/PluginBase.java
--- a/src/main/java/org/bukkit/plugin/PluginBase.java
+++ b/src/main/java/org/bukkit/plugin/PluginBase.java
@@ -1,5 +1,6 @@
package org.bukkit.plugin;

+import java.util.Collection;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Provider;
@@ -9,6 +10,7 @@ import org.bukkit.event.EventRegistry;
import org.bukkit.permissions.Permission;
import tc.oc.minecraft.api.event.ListenerContext;
import tc.oc.exception.ExceptionHandler;
+import tc.oc.minecraft.api.text.TextRenderer;

/**
* Represents a base {@link Plugin}
@@ -25,6 +27,7 @@ public abstract class PluginBase implements Plugin {

@Inject private Set<Permission> permissions;
@Inject private Provider<ListenerContext> listenerContext;
+ @Inject private Provider<Collection<Provider<TextRenderer>>> textRenderers;

protected void assertInjected() {
if(injector == null) {
@@ -50,6 +53,12 @@ public abstract class PluginBase implements Plugin {
return exceptionHandler;
}

+ @Override
+ public Collection<Provider<TextRenderer>> textRenderers() {
+ assertInjected();
+ return textRenderers.get();
+ }
+
protected final void preEnable() {
permissions.forEach(pluginManager::addPermission);
listenerContext.get().enable();
diff --git a/src/main/java/org/bukkit/plugin/PluginModule.java b/src/main/java/org/bukkit/plugin/PluginModule.java
--- a/src/main/java/org/bukkit/plugin/PluginModule.java
+++ b/src/main/java/org/bukkit/plugin/PluginModule.java
@@ -11,6 +11,7 @@ import tc.oc.minecraft.api.event.ListenerBinder;
import tc.oc.exception.ExceptionHandler;
import tc.oc.minecraft.api.plugin.PluginDescription;
import tc.oc.minecraft.api.scheduler.Scheduler;
+import tc.oc.minecraft.api.text.TextRendererBinder;

/**
* Bindings for things belonging to a particular {@link Plugin}.
@@ -26,6 +27,7 @@ public class PluginModule extends ProtectedModule {
// Ensure these collections have bindings
new PermissionBinder(binder());
new ListenerBinder(binder());
+ new TextRendererBinder(binder());

bind(tc.oc.minecraft.api.plugin.Plugin.class).to(Plugin.class);
bind(PluginDescription.class).to(PluginDescriptionFile.class);
223 changes: 223 additions & 0 deletions CraftBukkit/0001-Import-necessary-NMS-classes.patch
Original file line number Diff line number Diff line change
Expand Up @@ -3186,6 +3186,146 @@ index 0000000..9d23a64
+ packetlistenerplayout.a(this);
+ }
+}
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutBoss.java b/src/main/java/net/minecraft/server/PacketPlayOutBoss.java
new file mode 100644
index 0000000..ba14c69
--- /dev/null
+++ b/src/main/java/net/minecraft/server/PacketPlayOutBoss.java
@@ -0,0 +1,134 @@
+package net.minecraft.server;
+
+import java.io.IOException;
+import java.util.UUID;
+
+public class PacketPlayOutBoss implements Packet<PacketListenerPlayOut> {
+
+ private UUID a;
+ private PacketPlayOutBoss.Action b;
+ private IChatBaseComponent c;
+ private float d;
+ private BossBattle.BarColor e;
+ private BossBattle.BarStyle f;
+ private boolean g;
+ private boolean h;
+ private boolean i;
+
+ public PacketPlayOutBoss() {}
+
+ public PacketPlayOutBoss(PacketPlayOutBoss.Action packetplayoutboss_action, BossBattle bossbattle) {
+ this.b = packetplayoutboss_action;
+ this.a = bossbattle.d();
+ this.c = bossbattle.e();
+ this.d = bossbattle.getProgress();
+ this.e = bossbattle.g();
+ this.f = bossbattle.h();
+ this.g = bossbattle.i();
+ this.h = bossbattle.j();
+ this.i = bossbattle.k();
+ }
+
+ public void a(PacketDataSerializer packetdataserializer) throws IOException {
+ this.a = packetdataserializer.i();
+ this.b = (PacketPlayOutBoss.Action) packetdataserializer.a(PacketPlayOutBoss.Action.class);
+ switch (this.b) {
+ case ADD:
+ this.c = packetdataserializer.f();
+ this.d = packetdataserializer.readFloat();
+ this.e = (BossBattle.BarColor) packetdataserializer.a(BossBattle.BarColor.class);
+ this.f = (BossBattle.BarStyle) packetdataserializer.a(BossBattle.BarStyle.class);
+ this.a(packetdataserializer.readUnsignedByte());
+
+ case REMOVE:
+ default:
+ break;
+
+ case UPDATE_PCT:
+ this.d = packetdataserializer.readFloat();
+ break;
+
+ case UPDATE_NAME:
+ this.c = packetdataserializer.f();
+ break;
+
+ case UPDATE_STYLE:
+ this.e = (BossBattle.BarColor) packetdataserializer.a(BossBattle.BarColor.class);
+ this.f = (BossBattle.BarStyle) packetdataserializer.a(BossBattle.BarStyle.class);
+ break;
+
+ case UPDATE_PROPERTIES:
+ this.a(packetdataserializer.readUnsignedByte());
+ }
+
+ }
+
+ private void a(int i) {
+ this.g = (i & 1) > 0;
+ this.h = (i & 2) > 0;
+ this.i = (i & 2) > 0;
+ }
+
+ public void b(PacketDataSerializer packetdataserializer) throws IOException {
+ packetdataserializer.a(this.a);
+ packetdataserializer.a((Enum) this.b);
+ switch (this.b) {
+ case ADD:
+ packetdataserializer.a(this.c);
+ packetdataserializer.writeFloat(this.d);
+ packetdataserializer.a((Enum) this.e);
+ packetdataserializer.a((Enum) this.f);
+ packetdataserializer.writeByte(this.j());
+
+ case REMOVE:
+ default:
+ break;
+
+ case UPDATE_PCT:
+ packetdataserializer.writeFloat(this.d);
+ break;
+
+ case UPDATE_NAME:
+ packetdataserializer.a(this.c);
+ break;
+
+ case UPDATE_STYLE:
+ packetdataserializer.a((Enum) this.e);
+ packetdataserializer.a((Enum) this.f);
+ break;
+
+ case UPDATE_PROPERTIES:
+ packetdataserializer.writeByte(this.j());
+ }
+
+ }
+
+ private int j() {
+ int i = 0;
+
+ if (this.g) {
+ i |= 1;
+ }
+
+ if (this.h) {
+ i |= 2;
+ }
+
+ if (this.i) {
+ i |= 2;
+ }
+
+ return i;
+ }
+
+ public void a(PacketListenerPlayOut packetlistenerplayout) {
+ packetlistenerplayout.a(this);
+ }
+
+ public static enum Action {
+
+ ADD, REMOVE, UPDATE_PCT, UPDATE_NAME, UPDATE_STYLE, UPDATE_PROPERTIES;
+
+ private Action() {}
+ }
+}
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutChat.java b/src/main/java/net/minecraft/server/PacketPlayOutChat.java
new file mode 100644
index 0000000..24462f1
Expand Down Expand Up @@ -3274,6 +3414,89 @@ index 0000000..1678628
+ packetlistenerplayout.a(this);
+ }
+}
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutCombatEvent.java b/src/main/java/net/minecraft/server/PacketPlayOutCombatEvent.java
new file mode 100644
index 0000000..46885f9
--- /dev/null
+++ b/src/main/java/net/minecraft/server/PacketPlayOutCombatEvent.java
@@ -0,0 +1,77 @@
+package net.minecraft.server;
+
+import java.io.IOException;
+
+public class PacketPlayOutCombatEvent implements Packet<PacketListenerPlayOut> {
+
+ public PacketPlayOutCombatEvent.EnumCombatEventType a;
+ public int b;
+ public int c;
+ public int d;
+ public IChatBaseComponent e;
+
+ public PacketPlayOutCombatEvent() {}
+
+ public PacketPlayOutCombatEvent(CombatTracker combattracker, PacketPlayOutCombatEvent.EnumCombatEventType packetplayoutcombatevent_enumcombateventtype) {
+ this(combattracker, packetplayoutcombatevent_enumcombateventtype, true);
+ }
+
+ public PacketPlayOutCombatEvent(CombatTracker combattracker, PacketPlayOutCombatEvent.EnumCombatEventType packetplayoutcombatevent_enumcombateventtype, boolean flag) {
+ this.a = packetplayoutcombatevent_enumcombateventtype;
+ EntityLiving entityliving = combattracker.c();
+
+ switch (packetplayoutcombatevent_enumcombateventtype) {
+ case END_COMBAT:
+ this.d = combattracker.f();
+ this.c = entityliving == null ? -1 : entityliving.getId();
+ break;
+
+ case ENTITY_DIED:
+ this.b = combattracker.h().getId();
+ this.c = entityliving == null ? -1 : entityliving.getId();
+ if (flag) {
+ this.e = combattracker.getDeathMessage();
+ } else {
+ this.e = new ChatComponentText("");
+ }
+ }
+
+ }
+
+ public void a(PacketDataSerializer packetdataserializer) throws IOException {
+ this.a = (PacketPlayOutCombatEvent.EnumCombatEventType) packetdataserializer.a(PacketPlayOutCombatEvent.EnumCombatEventType.class);
+ if (this.a == PacketPlayOutCombatEvent.EnumCombatEventType.END_COMBAT) {
+ this.d = packetdataserializer.g();
+ this.c = packetdataserializer.readInt();
+ } else if (this.a == PacketPlayOutCombatEvent.EnumCombatEventType.ENTITY_DIED) {
+ this.b = packetdataserializer.g();
+ this.c = packetdataserializer.readInt();
+ this.e = packetdataserializer.f();
+ }
+
+ }
+
+ public void b(PacketDataSerializer packetdataserializer) throws IOException {
+ packetdataserializer.a((Enum) this.a);
+ if (this.a == PacketPlayOutCombatEvent.EnumCombatEventType.END_COMBAT) {
+ packetdataserializer.d(this.d);
+ packetdataserializer.writeInt(this.c);
+ } else if (this.a == PacketPlayOutCombatEvent.EnumCombatEventType.ENTITY_DIED) {
+ packetdataserializer.d(this.b);
+ packetdataserializer.writeInt(this.c);
+ packetdataserializer.a(this.e);
+ }
+
+ }
+
+ public void a(PacketListenerPlayOut packetlistenerplayout) {
+ packetlistenerplayout.a(this);
+ }
+
+ public static enum EnumCombatEventType {
+
+ ENTER_COMBAT, END_COMBAT, ENTITY_DIED;
+
+ private EnumCombatEventType() {}
+ }
+}
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutCustomSoundEffect.java b/src/main/java/net/minecraft/server/PacketPlayOutCustomSoundEffect.java
new file mode 100644
index 0000000..8a19c73
Expand Down