modifing events
This commit is contained in:
parent
02473d1fb1
commit
636a007f62
10
inc/event.h
10
inc/event.h
|
@ -10,12 +10,12 @@ private:
|
||||||
jobject input; //original Event object (type CppEvent)
|
jobject input; //original Event object (type CppEvent)
|
||||||
std::map<std::string, void*> data;
|
std::map<std::string, void*> data;
|
||||||
public:
|
public:
|
||||||
jobject getMap(JNIEnv* env);
|
virtual jobject getMap(JNIEnv* env);
|
||||||
const std::string& getName() const;
|
virtual const std::string& getName() const;
|
||||||
void* getData(JNIEnv* env, const std::string& name);
|
virtual void* getData(JNIEnv* env, const std::string& name);
|
||||||
void setData(const std::string& name, void* data);
|
virtual void setData(const std::string& name, void* data);
|
||||||
|
|
||||||
void reapply(JNIEnv* env, jobject jevent);
|
virtual void reapply(JNIEnv* env, jobject jevent);
|
||||||
|
|
||||||
Event(JNIEnv* env, jobject jevent);
|
Event(JNIEnv* env, jobject jevent);
|
||||||
//virtual ~Event();
|
//virtual ~Event();
|
||||||
|
|
|
@ -18,6 +18,7 @@ extern jfieldID EVENTDATAF;
|
||||||
extern jfieldID EVENTNAMEF;
|
extern jfieldID EVENTNAMEF;
|
||||||
extern jmethodID MAPGET;
|
extern jmethodID MAPGET;
|
||||||
extern jmethodID MAPPUT;
|
extern jmethodID MAPPUT;
|
||||||
|
extern jmethodID MAPCLEAR;
|
||||||
extern jmethodID LISTENERCONTR;
|
extern jmethodID LISTENERCONTR;
|
||||||
extern jmethodID LISTENERSMALLCONTR;
|
extern jmethodID LISTENERSMALLCONTR;
|
||||||
|
|
||||||
|
@ -32,8 +33,9 @@ enum JNIDATA : long {
|
||||||
JNI_EVENTNAMEFIELD = 32 | JNI_EVENTCLASS,
|
JNI_EVENTNAMEFIELD = 32 | JNI_EVENTCLASS,
|
||||||
JNI_MAPGETMETH = 64 | JNI_MAPCLASS,
|
JNI_MAPGETMETH = 64 | JNI_MAPCLASS,
|
||||||
JNI_MAPPUTMETH = 128 | JNI_MAPCLASS,
|
JNI_MAPPUTMETH = 128 | JNI_MAPCLASS,
|
||||||
JNI_LISTENERCONSTR = 256 | JNI_LISTENERCLASS,
|
JNI_MAPCLEARMETH = 256 | JNI_MAPCLASS,
|
||||||
JNI_LISTENERSMALLCONSTR = 512 | JNI_LISTENERCLASS,
|
JNI_LISTENERCONSTR = 512 | JNI_LISTENERCLASS,
|
||||||
|
JNI_LISTENERSMALLCONSTR = 1024 | JNI_LISTENERCLASS,
|
||||||
|
|
||||||
JNI_EVENT = JNI_EVENTCLASS | JNI_EVENTDATAFIELD | JNI_EVENTNAMEFIELD,
|
JNI_EVENT = JNI_EVENTCLASS | JNI_EVENTDATAFIELD | JNI_EVENTNAMEFIELD,
|
||||||
JNI_MAP = JNI_MAPCLASS | JNI_MAPGETMETH | JNI_MAPPUTMETH,
|
JNI_MAP = JNI_MAPCLASS | JNI_MAPGETMETH | JNI_MAPPUTMETH,
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
class CppPlugin;
|
class CppPlugin;
|
||||||
|
|
||||||
//function pointer
|
//function pointer
|
||||||
typedef void (*eventfptr)(CppPlugin*, Event*);
|
typedef void (*eventfptr)(JNIEnv*, CppPlugin*, Event*);
|
||||||
typedef CppPlugin* (*initfptr)();
|
typedef CppPlugin* (*initfptr)();
|
||||||
|
|
||||||
class CppPlugin {
|
class CppPlugin {
|
||||||
|
|
|
@ -12,23 +12,31 @@ const std::string& Event::getName() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void* Event::getData(JNIEnv* env, const std::string& name) {
|
void* Event::getData(JNIEnv* env, const std::string& name) {
|
||||||
std::cout << "Try to access " << name << std::endl;
|
DEB("Try to access " << name);
|
||||||
|
load(env, JNI_MAP);
|
||||||
//search in map
|
//search in map
|
||||||
auto it = data.find(name);
|
auto it = data.find(name);
|
||||||
if(it == data.end()) {
|
if(it == data.end()) {
|
||||||
|
DEB("Not in map");
|
||||||
|
|
||||||
//search in original object
|
//search in original object
|
||||||
//construct string
|
//construct string
|
||||||
jstring term = env->NewStringUTF(name.c_str());
|
jstring term = env->NewStringUTF(name.c_str());
|
||||||
|
|
||||||
//call data.get()
|
//call data.get()
|
||||||
|
DEB("Access Java-Map");
|
||||||
jobject map = getMap(env);
|
jobject map = getMap(env);
|
||||||
jobject content = env->CallObjectMethod(map, MAPGET, term);
|
jobject content = env->CallObjectMethod(map, MAPGET, term);
|
||||||
|
DEB("Got " << content);
|
||||||
|
|
||||||
//data.insert for next time
|
//data.insert for next time
|
||||||
data.insert({name, content});
|
data.insert({name, content});
|
||||||
|
|
||||||
//delete string
|
//delete string
|
||||||
|
DEB("Delete REF");
|
||||||
env->DeleteLocalRef(term);
|
env->DeleteLocalRef(term);
|
||||||
|
|
||||||
|
return content;
|
||||||
} else {
|
} else {
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
@ -38,13 +46,18 @@ void* Event::getData(JNIEnv* env, const std::string& name) {
|
||||||
|
|
||||||
void Event::setData(const std::string& name, void* d) {
|
void Event::setData(const std::string& name, void* d) {
|
||||||
//just put it in the map
|
//just put it in the map
|
||||||
data.insert({name, d});
|
data.erase(name); //delete old
|
||||||
|
data.insert({name, d});//insert new
|
||||||
}
|
}
|
||||||
|
|
||||||
void Event::reapply(JNIEnv* env, jobject jevent) {
|
void Event::reapply(JNIEnv* env, jobject jevent) {
|
||||||
jobject map = getMap(env);
|
jobject map = getMap(env);
|
||||||
|
|
||||||
|
//clear old map
|
||||||
|
env->CallObjectMethod(map, MAPCLEAR);
|
||||||
|
|
||||||
for(auto it : data) {
|
for(auto it : data) {
|
||||||
std::cout << "write back to java: " << it.first << std::endl;
|
std::cout << "write back to java: " << it.first << " Value: " << it.second << std::endl;
|
||||||
jstring key = env->NewStringUTF(it.first.c_str());
|
jstring key = env->NewStringUTF(it.first.c_str());
|
||||||
|
|
||||||
env->CallObjectMethod(map, MAPPUT, key, it.second);
|
env->CallObjectMethod(map, MAPPUT, key, it.second);
|
||||||
|
|
|
@ -17,6 +17,7 @@ jfieldID EVENTDATAF;
|
||||||
jfieldID EVENTNAMEF;
|
jfieldID EVENTNAMEF;
|
||||||
jmethodID MAPGET;
|
jmethodID MAPGET;
|
||||||
jmethodID MAPPUT;
|
jmethodID MAPPUT;
|
||||||
|
jmethodID MAPCLEAR;
|
||||||
jmethodID LISTENERCONTR;
|
jmethodID LISTENERCONTR;
|
||||||
jmethodID LISTENERSMALLCONTR;
|
jmethodID LISTENERSMALLCONTR;
|
||||||
|
|
||||||
|
@ -84,12 +85,14 @@ void load(JNIEnv* env, long data) {
|
||||||
MAPGET = env->GetMethodID(MAPCLASS, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
|
MAPGET = env->GetMethodID(MAPCLASS, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
|
||||||
if(data & JNI_MAPPUTMETH)
|
if(data & JNI_MAPPUTMETH)
|
||||||
MAPPUT = env->GetMethodID(MAPCLASS, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
MAPPUT = env->GetMethodID(MAPCLASS, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||||
|
if(data & JNI_MAPCLEARMETH)
|
||||||
|
MAPCLEAR = env->GetMethodID(MAPCLASS, "clear", "()V");
|
||||||
if(data & JNI_LISTENERCONSTR)
|
if(data & JNI_LISTENERCONSTR)
|
||||||
LISTENERCONTR = env->GetMethodID(LISTENERCLASS, "<init>", "(Ljava/lang/String;J)V");
|
LISTENERCONTR = env->GetMethodID(LISTENERCLASS, "<init>", "(Ljava/lang/String;J)V");
|
||||||
if(data & JNI_LISTENERSMALLCONSTR)
|
if(data & JNI_LISTENERSMALLCONSTR)
|
||||||
LISTENERSMALLCONTR = env->GetMethodID(LISTENERCLASS, "<init>", "()V");
|
LISTENERSMALLCONTR = env->GetMethodID(LISTENERCLASS, "<init>", "()V");
|
||||||
|
|
||||||
DEB("find methods: " << (!!MAPGET) << (!!MAPPUT) << (!!LISTENERCONTR) << (!!LISTENERSMALLCONTR));
|
DEB("find methods: " << (!!MAPGET) << (!!MAPPUT) << (!!MAPCLEAR) << (!!LISTENERCONTR) << (!!LISTENERSMALLCONTR));
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_init_1(JNIEnv* env, jobject thisobj) {
|
JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_init_1(JNIEnv* env, jobject thisobj) {
|
||||||
|
@ -187,7 +190,7 @@ JNIEXPORT jobject JNICALL Java_de_mrbesen_cppplugins_CppPlugin_fireEvent(JNIEnv*
|
||||||
Event event(env, jevent);
|
Event event(env, jevent);
|
||||||
|
|
||||||
//call it
|
//call it
|
||||||
f(plugin, &event);
|
f(env, plugin, &event);
|
||||||
|
|
||||||
//put changed fields back in the jevent
|
//put changed fields back in the jevent
|
||||||
event.reapply(env, jevent);
|
event.reapply(env, jevent);
|
||||||
|
|
|
@ -19,7 +19,7 @@ public class CppEvent {
|
||||||
System.out.println("cppifying event: " + e.getClass().getSimpleName());
|
System.out.println("cppifying event: " + e.getClass().getSimpleName());
|
||||||
CppEvent cppe = new CppEvent(e.getClass().getSimpleName());
|
CppEvent cppe = new CppEvent(e.getClass().getSimpleName());
|
||||||
|
|
||||||
for(Field field : e.getClass().getFields()) {
|
for(Field field : e.getClass().getDeclaredFields()) {
|
||||||
System.out.println("try to read Field: " + field.getName());
|
System.out.println("try to read Field: " + field.getName());
|
||||||
if(!field.isAccessible()) field.setAccessible(true);
|
if(!field.isAccessible()) field.setAccessible(true);
|
||||||
|
|
||||||
|
@ -34,19 +34,21 @@ public class CppEvent {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void uncppify(CppEvent cppe, Event original) {
|
public static void uncppify(CppEvent cppe, Event original) {
|
||||||
System.out.println("uncppifying event: " + original.getClass().getSimpleName());
|
System.out.println("uncppifying event: " + original.getClass().getSimpleName() + " values: " + cppe.data.size());
|
||||||
if(!original.getClass().getSimpleName().equals(cppe.name))
|
if(!original.getClass().getSimpleName().equals(cppe.name))
|
||||||
throw new IllegalArgumentException("CppEvent does not match original event type!");
|
throw new IllegalArgumentException("CppEvent does not match original event type!");
|
||||||
|
|
||||||
for(Field field : original.getClass().getFields()) {
|
for(Field field : original.getClass().getDeclaredFields()) {
|
||||||
System.out.println("try to set Field: " + field.getName());
|
System.out.println("try to set Field: " + field.getName());
|
||||||
if(!field.isAccessible()) field.setAccessible(true);
|
|
||||||
|
|
||||||
Object value = cppe.data.get(field.getName());
|
Object value = cppe.data.get(field.getName());
|
||||||
if(value == null) {
|
if(value == null) {
|
||||||
System.out.println("Data not available - skip");
|
System.out.println("Data not available - skip");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
System.out.println("value: " + value);
|
||||||
|
|
||||||
|
if(!field.isAccessible()) field.setAccessible(true);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
field.set(original, value);
|
field.set(original, value);
|
||||||
|
|
|
@ -9,6 +9,7 @@ import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.generator.ChunkGenerator;
|
import org.bukkit.generator.ChunkGenerator;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.bukkit.plugin.PluginDescriptionFile;
|
import org.bukkit.plugin.PluginDescriptionFile;
|
||||||
|
|
|
@ -6,14 +6,6 @@
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
void eventJoin(CppPlugin* pl, Event* e) {
|
|
||||||
std::cout << "join " << e->getName() << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void eventQuit(CppPlugin* pl, Event* e) {
|
|
||||||
std::cout << "quit " << e->getName() << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyPlugin : public CppPlugin {
|
class MyPlugin : public CppPlugin {
|
||||||
public:
|
public:
|
||||||
virtual void onLoad();
|
virtual void onLoad();
|
||||||
|
@ -39,6 +31,18 @@ CppPlugin* init() {
|
||||||
return new MyPlugin();
|
return new MyPlugin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void eventJoin(JNIEnv* env, CppPlugin* pl, Event* e) {
|
||||||
|
jstring msg = (jstring) e->getData(env, "joinMessage");
|
||||||
|
std::string jmsg(env->GetStringUTFChars(msg, 0));
|
||||||
|
std::cout << "join " << e->getName() << " old join message: " << jmsg << std::endl;
|
||||||
|
jstring newmsg = env->NewStringUTF("Ein Spieler ist dem Spiel beigetreten!");
|
||||||
|
e->setData("joinMessage", newmsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void eventQuit(JNIEnv* env, CppPlugin* pl, Event* e) {
|
||||||
|
std::cout << "quit " << e->getName() << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
std::map<std::string, eventfptr> MyPlugin::getEvents() {
|
std::map<std::string, eventfptr> MyPlugin::getEvents() {
|
||||||
std::cout << "MyPlugin::getEvents" << std::endl;
|
std::cout << "MyPlugin::getEvents" << std::endl;
|
||||||
std::map<std::string, eventfptr> out;
|
std::map<std::string, eventfptr> out;
|
||||||
|
@ -46,10 +50,5 @@ std::map<std::string, eventfptr> MyPlugin::getEvents() {
|
||||||
out.insert({"PlayerQuitEvent", eventQuit});
|
out.insert({"PlayerQuitEvent", eventQuit});
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
std::map<std::string, eventfptr> MyPlugin::getEvents() {
|
|
||||||
return std::map<std::string, eventfptr>();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
}//extern "C"
|
}//extern "C"
|
Loading…
Reference in New Issue