Inject class. Experimenting.
This commit is contained in:
parent
a48f2ae309
commit
4be2b3760a
|
|
@ -4,4 +4,14 @@ plugins {
|
|||
}
|
||||
|
||||
group = "org.adde0109"
|
||||
version = "1.1.7-alpha-bungeecord"
|
||||
version = "1.1.7-alpha-bungeecord"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } // This lets gradle find the BungeeCord files online
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly("net.md-5:bungeecord-api:1.19-R0.1-SNAPSHOT")
|
||||
implementation("org.javassist:javassist:3.29.2-GA")
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package org.adde0109.ambassador;
|
||||
|
||||
import net.md_5.bungee.api.plugin.Plugin;
|
||||
import org.adde0109.ambassador.forgeCommandArgument.Injector;
|
||||
|
||||
public class AmbassadorPlugin extends Plugin {
|
||||
@Override
|
||||
public void onEnable() {
|
||||
// You should not put an enable message in your plugin.
|
||||
// BungeeCord already does so
|
||||
getLogger().info("Yay! It loads!");
|
||||
Injector.inject();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright (C) 2018 Velocity Contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.adde0109.ambassador.forgeCommandArgument;
|
||||
|
||||
import com.mojang.brigadier.StringReader;
|
||||
import com.mojang.brigadier.arguments.ArgumentType;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
|
||||
public class EnumArgumentProperty {
|
||||
|
||||
private final String className;
|
||||
|
||||
public EnumArgumentProperty(String className) {
|
||||
this.className = className;
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return this.className;
|
||||
}
|
||||
|
||||
public String parse(StringReader reader) throws CommandSyntaxException {
|
||||
return reader.readUnquotedString();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* Copyright (C) 2018 Velocity Contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.adde0109.ambassador.forgeCommandArgument;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.md_5.bungee.protocol.DefinedPacket;
|
||||
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
|
||||
/**
|
||||
* An argument property serializer that will serialize and deserialize nothing.
|
||||
*/
|
||||
public class EnumArgumentPropertySerializer {
|
||||
|
||||
public static final EnumArgumentPropertySerializer ENUM;
|
||||
|
||||
static {
|
||||
try {
|
||||
ENUM = new EnumArgumentPropertySerializer();
|
||||
} catch (InvocationTargetException | InstantiationException | IllegalAccessException | ClassNotFoundException |
|
||||
NoSuchMethodException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
EnumArgumentPropertySerializer() throws InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException {
|
||||
Constructor constructor = EnumArgumentPropertySerializer.class.getSuperclass().getDeclaredConstructor(Class.forName("net.md_5.bungee.protocol.packet.Commands$1"));
|
||||
constructor.setAccessible(true);
|
||||
constructor.newInstance(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected Object read(ByteBuf buf) {
|
||||
return new EnumArgumentProperty(DefinedPacket.readString(buf));
|
||||
}
|
||||
|
||||
protected void write(ByteBuf buf, Object t) {
|
||||
DefinedPacket.writeString(((EnumArgumentProperty) t).getClassName(),buf);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
package org.adde0109.ambassador.forgeCommandArgument;
|
||||
|
||||
import javassist.*;
|
||||
import javassist.bytecode.ClassFile;
|
||||
import javassist.expr.MethodCall;
|
||||
import net.md_5.bungee.protocol.Protocol;
|
||||
import net.md_5.bungee.protocol.packet.Commands;
|
||||
import org.adde0109.ambassador.forgeCommandArgument.EnumArgumentPropertySerializer;
|
||||
import org.checkerframework.checker.units.qual.C;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class Injector{
|
||||
|
||||
|
||||
|
||||
static public void inject() {
|
||||
try {
|
||||
Class<?> argumentRegistryClass = Class.forName("net.md_5.bungee.protocol.packet.Commands$ArgumentRegistry");
|
||||
Class<?> networkNodeClass = Class.forName("net.md_5.bungee.protocol.packet.Commands$NetworkNode");
|
||||
Class<?> argumentSerializerClass = Class.forName("net.md_5.bungee.protocol.packet.Commands$ArgumentRegistry$ArgumentSerializer");
|
||||
|
||||
ClassPool.getDefault().insertClassPath(new ClassClassPath(EnumArgumentPropertySerializer.class));
|
||||
ClassPool.getDefault().insertClassPath(new ClassClassPath(EnumArgumentProperty.class));
|
||||
CtClass cc = ClassPool.getDefault().get("org.adde0109.ambassador.forgeCommandArgument.EnumArgumentPropertySerializer");
|
||||
CtClass scc = ClassPool.getDefault().get("net.md_5.bungee.protocol.packet.Commands$ArgumentRegistry$ArgumentSerializer");
|
||||
CtClass newcc = scc.getDeclaringClass().makeNestedClass("EnumArgumentPropertySerializer",true);
|
||||
newcc.addMethod(new CtMethod(cc.getDeclaredMethod("read"), newcc, null));
|
||||
newcc.addMethod(new CtMethod(cc.getDeclaredMethod("write"), newcc, null));
|
||||
newcc.setSuperclass(scc);
|
||||
|
||||
//CtConstructor ctconstructor = new CtConstructor(cc.getDeclaredConstructor(null),newcc,null);
|
||||
//newcc.addConstructor(ctconstructor);
|
||||
Class<?> loaded= newcc.toClass(argumentSerializerClass);
|
||||
|
||||
Method method = argumentRegistryClass.getDeclaredMethod("register",String.class,argumentSerializerClass);
|
||||
//Constructor<?> superconstructor = argumentSerializerClass.getDeclaredConstructors()[0];
|
||||
//method.setAccessible(true);
|
||||
//Constructor<?> constructor = loaded.getDeclaredConstructor();
|
||||
//constructor.setAccessible(true);
|
||||
//method.invoke(null,"forge:enum", constructor.newInstance());
|
||||
|
||||
CtClass dcc = scc.getDeclaringClass();
|
||||
dcc.getClassInitializer().insertAfter("$class.getDeclaredMethod(\"register\",String.class,Class.forName(\"net.md_5.bungee.protocol.packet.Commands$ArgumentRegistry$ArgumentSerializer\"));");
|
||||
dcc.toClass(networkNodeClass);
|
||||
MethodCall
|
||||
} catch (ReflectiveOperationException | NotFoundException | CannotCompileException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
4
ambassador-bungeecord/src/main/resources/plugin.yml
Normal file
4
ambassador-bungeecord/src/main/resources/plugin.yml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
name: Ambassador
|
||||
main: org.adde0109.ambassador.AmbassadorPlugin
|
||||
version: 0.0.0-Bungeecord
|
||||
author: adde0109
|
||||
Loading…
Reference in New Issue
Block a user