Skip to content

Commit ad028ba

Browse files
committed
version 1.0
0 parents  commit ad028ba

8 files changed

Lines changed: 238 additions & 0 deletions

File tree

.gitignore

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
!**/src/main/**/target/
4+
!**/src/test/**/target/
5+
6+
### IntelliJ IDEA ###
7+
.idea/modules.xml
8+
.idea/jarRepositories.xml
9+
.idea/compiler.xml
10+
.idea/libraries/
11+
*.iws
12+
*.iml
13+
*.ipr
14+
15+
### Eclipse ###
16+
.apt_generated
17+
.classpath
18+
.factorypath
19+
.project
20+
.settings
21+
.springBeans
22+
.sts4-cache
23+
24+
### NetBeans ###
25+
/nbproject/private/
26+
/nbbuild/
27+
/dist/
28+
/nbdist/
29+
/.nb-gradle/
30+
build/
31+
!**/src/main/**/build/
32+
!**/src/test/**/build/
33+
34+
### VS Code ###
35+
.vscode/
36+
37+
### Mac OS ###
38+
.DS_Store
39+
40+
lib

.idea/.gitignore

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/encodings.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.MD

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# FixUsernameCheck
2+
3+
这是一个Minecraft服务器补丁,可以禁用玩家游戏名检查,从而可以在服务器中使用中文名
4+
5+
## 使用方法
6+
7+
1. 下载补丁的jar文件
8+
9+
2. 启动服务器时添加`-javaagent:FixUsernameCheck.jar`参数。
10+
如:`java -javaagent:FixUsernameCheck.jar -jar server.jar --nogui`
11+
`FixUsernameCheck.jar`为你的补丁文件,这里与MC服务器核心放置在同一目录下
12+
13+
## 说明
14+
15+
- 如果补丁jar文件放置在其它目录下,请使用相对路径或绝对路径,如:
16+
`java -javaagent:./fix/FixUsernameCheck.jar -jar server.jar --nogui`

pom.xml

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>top.zpian</groupId>
8+
<artifactId>FixUsernameCheck</artifactId>
9+
<version>1.0</version>
10+
11+
<properties>
12+
<maven.compiler.source>17</maven.compiler.source>
13+
<maven.compiler.target>17</maven.compiler.target>
14+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
</properties>
16+
17+
<dependencies>
18+
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm -->
19+
<dependency>
20+
<groupId>org.ow2.asm</groupId>
21+
<artifactId>asm</artifactId>
22+
<version>9.7.1</version>
23+
</dependency>
24+
25+
</dependencies>
26+
27+
<build>
28+
<plugins>
29+
<plugin>
30+
<groupId>org.apache.maven.plugins</groupId>
31+
<artifactId>maven-compiler-plugin</artifactId>
32+
<version>3.11.0</version>
33+
</plugin>
34+
35+
<plugin>
36+
<groupId>org.apache.maven.plugins</groupId>
37+
<artifactId>maven-resources-plugin</artifactId>
38+
<version>3.3.1</version>
39+
</plugin>
40+
41+
<plugin>
42+
<groupId>org.apache.maven.plugins</groupId>
43+
<artifactId>maven-shade-plugin</artifactId>
44+
<version>3.5.1</version>
45+
<executions>
46+
<execution>
47+
<phase>package</phase>
48+
<goals>
49+
<goal>shade</goal>
50+
</goals>
51+
<configuration>
52+
<transformers>
53+
<transformer
54+
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
55+
<manifestEntries>
56+
<Premain-Class>top.zpian.fix_username_check.AgentMain</Premain-Class>
57+
<Agent-Class>top.zpian.fix_username_check.AgentMain</Agent-Class>
58+
<Can-Redefine-Classes>true</Can-Redefine-Classes>
59+
</manifestEntries>
60+
</transformer>
61+
</transformers>
62+
63+
<createDependencyReducedPom>false</createDependencyReducedPom>
64+
<filters>
65+
<filter>
66+
<artifact>org.ow2.asm:asm</artifact>
67+
<excludes>
68+
<exclude>META-INF/MANIFEST.MF</exclude>
69+
<exclude>module-info.class</exclude>
70+
</excludes>
71+
</filter>
72+
</filters>
73+
</configuration>
74+
</execution>
75+
</executions>
76+
</plugin>
77+
</plugins>
78+
</build>
79+
80+
</project>
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package top.zpian.fix_username_check;
2+
3+
import org.objectweb.asm.*;
4+
5+
import java.lang.instrument.ClassFileTransformer;
6+
import java.lang.instrument.IllegalClassFormatException;
7+
import java.lang.instrument.Instrumentation;
8+
import java.security.ProtectionDomain;
9+
10+
public class AgentMain {
11+
public static void premain(String arg, Instrumentation inst) {
12+
13+
System.out.println("FixUsernameCheck - premain");
14+
15+
inst.addTransformer(new ClassFileTransformer() {
16+
@Override
17+
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
18+
19+
// 不是需要的类
20+
if (!className.equals("com/destroystokyo/paper/profile/CraftPlayerProfile")) {
21+
return ClassFileTransformer.super.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
22+
}
23+
24+
System.out.println("Transform class: " + className);
25+
26+
final ClassReader cr = new ClassReader(classfileBuffer);
27+
28+
final ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
29+
30+
cr.accept(new ClassVisitor(Opcodes.ASM9, cw) {
31+
@Override
32+
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
33+
34+
if (!name.equals("createAuthLibProfile")) {
35+
return super.visitMethod(access, name, descriptor, signature, exceptions);
36+
}
37+
38+
System.out.println("Transform method: " + name);
39+
40+
final var mv = super.visitMethod(access, name, descriptor, signature, exceptions);
41+
return new MethodVisitor(Opcodes.ASM9, mv) {
42+
@Override
43+
public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
44+
45+
// System.out.printf("%d %s %s %s %s%n", opcode, owner, name, descriptor, isInterface);
46+
47+
if (opcode == Opcodes.INVOKESTATIC &&
48+
name.equals("checkArgument") &&
49+
owner.equals("com/google/common/base/Preconditions") &&
50+
descriptor.equals("(ZLjava/lang/String;Ljava/lang/Object;)V") && !isInterface
51+
) {
52+
System.out.println("取消静态方法调用: " + owner + "/" + name);
53+
54+
// 弹出参数
55+
this.visitInsn(Opcodes.POP);
56+
this.visitInsn(Opcodes.POP);
57+
this.visitInsn(Opcodes.POP);
58+
59+
return;
60+
}
61+
62+
super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
63+
}
64+
};
65+
}
66+
}, ClassReader.EXPAND_FRAMES);
67+
68+
return cw.toByteArray();
69+
}
70+
});
71+
}
72+
}

0 commit comments

Comments
 (0)