diff --git a/src/main/cpp/inc/libplugin.h b/src/main/cpp/inc/libplugin.h index f72efe7..0f5d01b 100644 --- a/src/main/cpp/inc/libplugin.h +++ b/src/main/cpp/inc/libplugin.h @@ -19,6 +19,7 @@ extern jclass CMDCLASS; extern jclass BUKKITCLASS; extern jclass CBSERVERCLASS; extern jclass CMDMAPCLASS; +extern jclass CMDSENDERCLASS; extern jfieldID EVENTDATAF; extern jfieldID EVENTNAMEF; @@ -33,6 +34,7 @@ extern jmethodID LISTENERCONTR; extern jmethodID LISTENERSMALLCONTR; extern jmethodID CMDCONSTR; extern jmethodID CMDMAPREGISTER; +extern jmethodID CMDSENDERSEND; void load(JNIEnv* env, long data); @@ -46,8 +48,9 @@ enum JNIDATA : long { JNI_BUKKITCLASS = JNI_CMDCLASS << 1, JNI_CBSERVERCLASS = JNI_BUKKITCLASS << 1, JNI_CMDMAPCLASS = JNI_CBSERVERCLASS << 1, + JNI_CMDSENDERCLASS = JNI_CMDMAPCLASS << 1, - JNI_EVENTDATAFIELD = JNI_CMDMAPCLASS << 1, + JNI_EVENTDATAFIELD = JNI_CMDSENDERCLASS << 1, JNI_EVENTNAMEFIELD = JNI_EVENTDATAFIELD << 1, JNI_PLUGINIDFIELD = JNI_EVENTNAMEFIELD << 1, JNI_BUKKITSERVFIELD = JNI_PLUGINIDFIELD << 1, @@ -60,12 +63,13 @@ enum JNIDATA : long { JNI_LISTENERSMALLCONSTR = JNI_LISTENERCONSTR << 1, JNI_CMDCONSTR = JNI_LISTENERSMALLCONSTR << 1, JNI_CMDMAPREGISTERMETH = JNI_CMDCONSTR << 1, + JNI_CMDSENDERSENDMETH = JNI_CMDMAPREGISTERMETH << 1, JNI_EVENT = JNI_EVENTCLASS | JNI_EVENTDATAFIELD | JNI_EVENTNAMEFIELD, JNI_MAP = JNI_MAPCLASS | JNI_MAPGETMETH | JNI_MAPPUTMETH, JNI_LISTENER = JNI_LISTENERCLASS | JNI_LISTENERCONSTR | JNI_LISTENERSMALLCONSTR, - JNI_ALL = 0xFFFFFFFFFFFFFF // current count: 20, max count:56 + JNI_ALL = 0xFFFFFFFFFFFFFF // current count: 22, max count:56 }; class CppPlugin; diff --git a/src/main/cpp/inc/plugin.h b/src/main/cpp/inc/plugin.h index 413c026..577dbe4 100644 --- a/src/main/cpp/inc/plugin.h +++ b/src/main/cpp/inc/plugin.h @@ -33,4 +33,53 @@ bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr fun inline bool registerCmd(JNIEnv* env, CppPlugin* plugin, const char* cname, cmdfptr function) { std::string n(cname); return registerCmd( env, plugin, n, function); -} \ No newline at end of file +} + +void send(JNIEnv* env, jobject sender, const char* text); + +inline void send(JNIEnv* env, jobject sender, const std::string& text) { + send(env, sender, text.c_str()); +} + +enum Color : char { + BLACK = '0', + DARK_BLUE = '1', + DARK_GREEN = '2', + DARK_AQUA = '3', + DARK_RED = '4', + DARK_PURPLE = '5', + GOLD = '6', + GRAY = '7', + DARK_GRAY = '8', + BLUE = '9', + GREEN = 'a', + AQUA = 'b', + RED = 'c', + LIGHT_PURPLE = 'd', + YELLOW = 'e', + WHITE = 'f', + MAGIC = 'k', + BOLD = 'l', + STRIKETHROUGH = 'm', + UNDERLINE = 'n', + ITALIC = 'o', + RESET = 'r' +}; +const char COLORCHAR = '§'; +inline std::string operator+(const Color c, const std::string& r) { + std::string out(1, COLORCHAR); + return out + ((char) c) + r; +} + +inline std::string operator+(const Color c, const char* r) { + std::string out(1, COLORCHAR); + return out + ((char) c) + r; +} + +inline std::string operator+(const std::string& r, const Color c) { + return r + COLORCHAR + (char) c; +} + +inline std::string operator+(const char* r, const Color c) { + return r + COLORCHAR + (char) c; +} diff --git a/src/main/cpp/src/libplugin.cpp b/src/main/cpp/src/libplugin.cpp index 94cdec9..98a1f3f 100644 --- a/src/main/cpp/src/libplugin.cpp +++ b/src/main/cpp/src/libplugin.cpp @@ -18,6 +18,7 @@ jclass CMDCLASS; jclass BUKKITCLASS; jclass CBSERVERCLASS; jclass CMDMAPCLASS; +jclass CMDSENDERCLASS; jfieldID EVENTDATAF; jfieldID EVENTNAMEF; @@ -32,6 +33,7 @@ jmethodID LISTENERCONTR; jmethodID LISTENERSMALLCONTR; jmethodID CMDCONSTR; jmethodID CMDMAPREGISTER; +jmethodID CMDSENDERSEND; std::vector plugins; @@ -71,6 +73,8 @@ void load(JNIEnv* env, long data) { CBSERVERCLASS = env->FindClass("org/bukkit/craftbukkit/v1_12_R1/CraftServer"); if(data & (JNI_CMDMAPCLASS | JNI_CMDMAPREGISTERMETH)) CMDMAPCLASS = env->FindClass("org/bukkit/command/SimpleCommandMap"); + if(data & (JNI_CMDSENDERCLASS | JNI_CMDSENDERSENDMETH)) + CMDSENDERCLASS = env->FindClass("org/bukkit/command/CommandSender"); if(data & JNI_EVENTDATAFIELD) EVENTDATAF = env->GetFieldID(EVENTCLASS, "data", "Ljava/util/Map;"); @@ -97,6 +101,8 @@ void load(JNIEnv* env, long data) { CMDCONSTR = env->GetMethodID(CMDCLASS, "", "(Ljava/lang/String;JI)V"); if(data & JNI_CMDMAPREGISTERMETH) CMDMAPREGISTER = env->GetMethodID(CMDMAPCLASS, "register", "(Ljava/lang/String;Lorg/bukkit/command/Command;)Z"); + if(data & JNI_CMDSENDERSENDMETH) + CMDSENDERSEND = env->GetMethodID(CMDSENDERCLASS, "sendMessage", "(Ljava/lang/String;)V"); if(((!CPPPLUGINCLASS) + (!EVENTCLASS) + (!MAPCLASS) + (!LISTENERCLASS) + (!CMDCLASS) + (!BUKKITCLASS) + (!CBSERVERCLASS) + (!CMDMAPCLASS)//wenn eins == nullptr ist -> wird zu 1 -> endergebniss != 0 -> fehler @@ -300,19 +306,23 @@ bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr fun // create cnd jstring name = env->NewStringUTF(cname.c_str()); - DEB("name converted"); jobject cmd = env->NewObject(CMDCLASS, CMDCONSTR, name, reinterpret_cast(function), plugin->id); - DEB("cmd created"); + env->DeleteLocalRef(name); //call register // ((CraftServer) Bukkit.getServer()).getCommandMap().register(fallbackprefix, cmd); jobject jserver = env->GetStaticObjectField(BUKKITCLASS, BUKKITSERVER); - DEB("got server"); jobject cmdmap = env->GetObjectField(jserver, SERVERCMDMAP); - DEB("cmdmap"); jstring fallbackprefix = env->NewStringUTF(plugin->name.c_str()); - DEB("prefix created"); return env->CallBooleanMethod(cmdmap, CMDMAPREGISTER, fallbackprefix, cmd); } +void send(JNIEnv* env, jobject sender, const char* text) { + load(env, JNI_CMDSENDERSENDMETH); + + jstring jtext = env->NewStringUTF(text); + env->CallVoidMethod(sender, CMDSENDERSEND, jtext); + env->DeleteLocalRef(jtext); +} + diff --git a/src/main/java/de/mrbesen/cppplugins/CppPlugin.java b/src/main/java/de/mrbesen/cppplugins/CppPlugin.java index 3650799..4db8b9c 100644 --- a/src/main/java/de/mrbesen/cppplugins/CppPlugin.java +++ b/src/main/java/de/mrbesen/cppplugins/CppPlugin.java @@ -2,6 +2,7 @@ package de.mrbesen.cppplugins; import lombok.Getter; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/testplugins/03simpleCmd/src/plugin.cpp b/testplugins/03simpleCmd/src/plugin.cpp index c328ccc..62229cd 100644 --- a/testplugins/03simpleCmd/src/plugin.cpp +++ b/testplugins/03simpleCmd/src/plugin.cpp @@ -13,6 +13,7 @@ bool hicmd(JNIEnv* env, CppPlugin* plugin, jobject sender, jobject cmd, std::str for(std::string& arg : args) { std::cout << arg << std::endl; } + send(env, sender, Color::AQUA + "Hiiiiii\n" + Color::GREEN + "Nuttöööö"); return true; }