31
									
								
								.classpath
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								.classpath
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<classpath>
 | 
			
		||||
	<classpathentry kind="src" output="target/classes" path="src/main/java">
 | 
			
		||||
		<attributes>
 | 
			
		||||
			<attribute name="optional" value="true"/>
 | 
			
		||||
			<attribute name="maven.pomderived" value="true"/>
 | 
			
		||||
		</attributes>
 | 
			
		||||
	</classpathentry>
 | 
			
		||||
	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
 | 
			
		||||
		<attributes>
 | 
			
		||||
			<attribute name="maven.pomderived" value="true"/>
 | 
			
		||||
		</attributes>
 | 
			
		||||
	</classpathentry>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 | 
			
		||||
		<attributes>
 | 
			
		||||
			<attribute name="maven.pomderived" value="true"/>
 | 
			
		||||
		</attributes>
 | 
			
		||||
	</classpathentry>
 | 
			
		||||
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
 | 
			
		||||
		<attributes>
 | 
			
		||||
			<attribute name="maven.pomderived" value="true"/>
 | 
			
		||||
		</attributes>
 | 
			
		||||
	</classpathentry>
 | 
			
		||||
	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
 | 
			
		||||
		<attributes>
 | 
			
		||||
			<attribute name="optional" value="true"/>
 | 
			
		||||
			<attribute name="maven.pomderived" value="true"/>
 | 
			
		||||
		</attributes>
 | 
			
		||||
	</classpathentry>
 | 
			
		||||
	<classpathentry kind="output" path="target/classes"/>
 | 
			
		||||
</classpath>
 | 
			
		||||
							
								
								
									
										38
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
# Eclipse stuff
 | 
			
		||||
/.settings
 | 
			
		||||
 | 
			
		||||
# netbeans
 | 
			
		||||
/nbproject
 | 
			
		||||
 | 
			
		||||
# we use maven!
 | 
			
		||||
/build.xml
 | 
			
		||||
 | 
			
		||||
# maven
 | 
			
		||||
/target
 | 
			
		||||
/repo
 | 
			
		||||
 | 
			
		||||
# vim
 | 
			
		||||
.*.sw[a-p]
 | 
			
		||||
 | 
			
		||||
# various other potential build files
 | 
			
		||||
/build
 | 
			
		||||
/bin
 | 
			
		||||
/dist
 | 
			
		||||
/manifest.mf
 | 
			
		||||
 | 
			
		||||
/world
 | 
			
		||||
 | 
			
		||||
# Mac filesystem dust
 | 
			
		||||
*.DS_Store
 | 
			
		||||
 | 
			
		||||
# intellij
 | 
			
		||||
*.iml
 | 
			
		||||
*.ipr
 | 
			
		||||
*.iws
 | 
			
		||||
.idea/
 | 
			
		||||
 | 
			
		||||
# Project Stuff
 | 
			
		||||
/src/main/resources/Soulbound
 | 
			
		||||
 | 
			
		||||
# Atlassian Stuff
 | 
			
		||||
/atlassian-ide-plugin.xml
 | 
			
		||||
							
								
								
									
										23
									
								
								.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.project
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<projectDescription>
 | 
			
		||||
	<name>MiaoScript</name>
 | 
			
		||||
	<comment></comment>
 | 
			
		||||
	<projects>
 | 
			
		||||
	</projects>
 | 
			
		||||
	<buildSpec>
 | 
			
		||||
		<buildCommand>
 | 
			
		||||
			<name>org.eclipse.jdt.core.javabuilder</name>
 | 
			
		||||
			<arguments>
 | 
			
		||||
			</arguments>
 | 
			
		||||
		</buildCommand>
 | 
			
		||||
		<buildCommand>
 | 
			
		||||
			<name>org.eclipse.m2e.core.maven2Builder</name>
 | 
			
		||||
			<arguments>
 | 
			
		||||
			</arguments>
 | 
			
		||||
		</buildCommand>
 | 
			
		||||
	</buildSpec>
 | 
			
		||||
	<natures>
 | 
			
		||||
		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 | 
			
		||||
		<nature>org.eclipse.jdt.core.javanature</nature>
 | 
			
		||||
	</natures>
 | 
			
		||||
</projectDescription>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								lib/PlaceholderAPI.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/PlaceholderAPI.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										113
									
								
								pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								pom.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
			
		||||
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
	<modelVersion>4.0.0</modelVersion>
 | 
			
		||||
	<groupId>pw.yumc</groupId>
 | 
			
		||||
	<artifactId>MiaoScript</artifactId>
 | 
			
		||||
	<version>1.0</version>
 | 
			
		||||
	<build>
 | 
			
		||||
		<finalName>${project.name}</finalName>
 | 
			
		||||
		<resources>
 | 
			
		||||
			<resource>
 | 
			
		||||
				<directory>src/main/resources</directory>
 | 
			
		||||
				<filtering>true</filtering>
 | 
			
		||||
			</resource>
 | 
			
		||||
		</resources>
 | 
			
		||||
		<plugins>
 | 
			
		||||
			<plugin>
 | 
			
		||||
				<artifactId>maven-compiler-plugin</artifactId>
 | 
			
		||||
				<version>3.3</version>
 | 
			
		||||
				<configuration>
 | 
			
		||||
					<source>1.7</source>
 | 
			
		||||
					<target>1.7</target>
 | 
			
		||||
				</configuration>
 | 
			
		||||
			</plugin>
 | 
			
		||||
			<plugin>
 | 
			
		||||
				<groupId>org.apache.maven.plugins</groupId>
 | 
			
		||||
				<artifactId>maven-shade-plugin</artifactId>
 | 
			
		||||
				<version>2.3</version>
 | 
			
		||||
				<configuration>
 | 
			
		||||
					<createDependencyReducedPom>false</createDependencyReducedPom>
 | 
			
		||||
					<minimizeJar>true</minimizeJar>
 | 
			
		||||
					<artifactSet>
 | 
			
		||||
						<includes>
 | 
			
		||||
							<include>pw.yumc:YumCore</include>
 | 
			
		||||
							<include>cn.citycraft:PluginHelper</include>
 | 
			
		||||
						</includes>
 | 
			
		||||
					</artifactSet>
 | 
			
		||||
					<relocations>
 | 
			
		||||
						<relocation>
 | 
			
		||||
							<pattern>pw.yumc.YumCore</pattern>
 | 
			
		||||
							<shadedPattern>${project.groupId}.${project.artifactId}</shadedPattern>
 | 
			
		||||
						</relocation>
 | 
			
		||||
						<relocation>
 | 
			
		||||
							<pattern>cn.citycraft.PluginHelper</pattern>
 | 
			
		||||
							<shadedPattern>${project.groupId}.${project.artifactId}</shadedPattern>
 | 
			
		||||
						</relocation>
 | 
			
		||||
					</relocations>
 | 
			
		||||
				</configuration>
 | 
			
		||||
				<executions>
 | 
			
		||||
					<execution>
 | 
			
		||||
						<phase>package</phase>
 | 
			
		||||
						<goals>
 | 
			
		||||
							<goal>shade</goal>
 | 
			
		||||
						</goals>
 | 
			
		||||
					</execution>
 | 
			
		||||
				</executions>
 | 
			
		||||
			</plugin>
 | 
			
		||||
		</plugins>
 | 
			
		||||
	</build>
 | 
			
		||||
	<ciManagement>
 | 
			
		||||
		<system>Jenkins</system>
 | 
			
		||||
		<url>http://ci.yumc.pw/job/${project.artifactId}/</url>
 | 
			
		||||
	</ciManagement>
 | 
			
		||||
	<properties>
 | 
			
		||||
		<update.description></update.description>
 | 
			
		||||
		<update.changes></update.changes>
 | 
			
		||||
		<env.GIT_COMMIT>DEBUG</env.GIT_COMMIT>
 | 
			
		||||
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 | 
			
		||||
	</properties>
 | 
			
		||||
	<repositories>
 | 
			
		||||
		<repository>
 | 
			
		||||
			<id>spigot-repo</id>
 | 
			
		||||
			<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
 | 
			
		||||
		</repository>
 | 
			
		||||
		<repository>
 | 
			
		||||
			<id>yumc-repo</id>
 | 
			
		||||
			<url>http://repo.yumc.pw/content/groups/public/</url>
 | 
			
		||||
		</repository>
 | 
			
		||||
	</repositories>
 | 
			
		||||
	<distributionManagement>
 | 
			
		||||
		<repository>
 | 
			
		||||
			<id>jtb</id>
 | 
			
		||||
			<name>YUMC</name>
 | 
			
		||||
			<url>http://repo.yumc.pw/content/repositories/yumcenter/</url>
 | 
			
		||||
		</repository>
 | 
			
		||||
	</distributionManagement>
 | 
			
		||||
	<dependencies>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>org.spigotmc</groupId>
 | 
			
		||||
			<artifactId>spigot-api</artifactId>
 | 
			
		||||
			<type>jar</type>
 | 
			
		||||
			<version>1.10.2-R0.1-SNAPSHOT</version>
 | 
			
		||||
		</dependency>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>cn.citycraft</groupId>
 | 
			
		||||
			<artifactId>PluginHelper</artifactId>
 | 
			
		||||
			<type>jar</type>
 | 
			
		||||
			<version>1.0</version>
 | 
			
		||||
		</dependency>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>pw.yumc</groupId>
 | 
			
		||||
			<artifactId>YumCore</artifactId>
 | 
			
		||||
			<type>jar</type>
 | 
			
		||||
			<version>1.0</version>
 | 
			
		||||
		</dependency>
 | 
			
		||||
		<dependency>
 | 
			
		||||
			<groupId>pw.yumc</groupId>
 | 
			
		||||
			<artifactId>PlaceholderAPI</artifactId>
 | 
			
		||||
			<version>1.0</version>
 | 
			
		||||
			<scope>system</scope>
 | 
			
		||||
			<systemPath>${project.basedir}/lib/PlaceholderAPI.jar</systemPath>
 | 
			
		||||
		</dependency>
 | 
			
		||||
	</dependencies>
 | 
			
		||||
</project>
 | 
			
		||||
							
								
								
									
										127
									
								
								src/main/java/pw/yumc/MiaoScript/MiaoScript.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								src/main/java/pw/yumc/MiaoScript/MiaoScript.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,127 @@
 | 
			
		||||
package pw.yumc.MiaoScript;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.configuration.file.FileConfiguration;
 | 
			
		||||
import org.bukkit.event.HandlerList;
 | 
			
		||||
import org.bukkit.plugin.java.JavaPlugin;
 | 
			
		||||
 | 
			
		||||
import me.clip.placeholderapi.PlaceholderAPI;
 | 
			
		||||
import pw.yumc.MiaoScript.commands.MSCommands;
 | 
			
		||||
import pw.yumc.MiaoScript.data.DataManager;
 | 
			
		||||
import pw.yumc.MiaoScript.event.EventManager;
 | 
			
		||||
import pw.yumc.MiaoScript.middleware.EventMiddleware;
 | 
			
		||||
import pw.yumc.MiaoScript.script.ScriptManager;
 | 
			
		||||
import pw.yumc.MiaoScript.script.ScriptPlaceholder;
 | 
			
		||||
import pw.yumc.YumCore.config.FileConfig;
 | 
			
		||||
 | 
			
		||||
public class MiaoScript extends JavaPlugin {
 | 
			
		||||
    private FileConfig config;
 | 
			
		||||
    private DataManager dataManager;
 | 
			
		||||
    private EventManager eventManager;
 | 
			
		||||
    private EventMiddleware eventMiddleware;
 | 
			
		||||
    private ScriptManager scriptManager;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FileConfiguration getConfig() {
 | 
			
		||||
        return config;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 数据管理
 | 
			
		||||
     */
 | 
			
		||||
    public DataManager getDataManager() {
 | 
			
		||||
        return dataManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 事件管理
 | 
			
		||||
     */
 | 
			
		||||
    public EventManager getEventManager() {
 | 
			
		||||
        return eventManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 事件中间件
 | 
			
		||||
     */
 | 
			
		||||
    public EventMiddleware getEventMiddleware() {
 | 
			
		||||
        return eventMiddleware;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 脚本管理
 | 
			
		||||
     */
 | 
			
		||||
    public ScriptManager getScriptManager() {
 | 
			
		||||
        return scriptManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 载入数据与配置
 | 
			
		||||
     */
 | 
			
		||||
    public void loadConfig() {
 | 
			
		||||
        dataManager = new DataManager(new FileConfig("data.yml"));
 | 
			
		||||
        eventManager = new EventManager(new FileConfig("event.yml"));
 | 
			
		||||
        scriptManager = new ScriptManager(new FileConfig("script.yml"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 注册事件
 | 
			
		||||
     */
 | 
			
		||||
    public void loadEvents() {
 | 
			
		||||
        eventManager.registerAll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onEnable() {
 | 
			
		||||
        new MSCommands();
 | 
			
		||||
        loadConfig();
 | 
			
		||||
        loadEvents();
 | 
			
		||||
        register();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onLoad() {
 | 
			
		||||
        saveDefault();
 | 
			
		||||
        config = new FileConfig();
 | 
			
		||||
        eventMiddleware = new EventMiddleware();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 注册变量
 | 
			
		||||
     */
 | 
			
		||||
    public void register() {
 | 
			
		||||
        PlaceholderAPI.registerPlaceholderHook("miaoscript", new ScriptPlaceholder());
 | 
			
		||||
        PlaceholderAPI.registerPlaceholderHook("ms", new ScriptPlaceholder());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 重新载入
 | 
			
		||||
     */
 | 
			
		||||
    public void reload() {
 | 
			
		||||
        HandlerList.unregisterAll(this);
 | 
			
		||||
        onLoad();
 | 
			
		||||
        loadConfig();
 | 
			
		||||
        loadEvents();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存默认文件
 | 
			
		||||
     */
 | 
			
		||||
    private void saveDefault() {
 | 
			
		||||
        saveJs("bed.js");
 | 
			
		||||
        saveJs("welcome.js");
 | 
			
		||||
        saveJs("checkchat.js");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存案例
 | 
			
		||||
     *
 | 
			
		||||
     * @param name
 | 
			
		||||
     *            JS文件名称
 | 
			
		||||
     */
 | 
			
		||||
    private void saveJs(final String name) {
 | 
			
		||||
        if (!new File(getDataFolder(), "js" + File.separatorChar + name).exists()) {
 | 
			
		||||
            saveResource("js" + File.separatorChar + name, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										48
									
								
								src/main/java/pw/yumc/MiaoScript/commands/MSCommands.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/main/java/pw/yumc/MiaoScript/commands/MSCommands.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
package pw.yumc.MiaoScript.commands;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.MiaoScript.MiaoScript;
 | 
			
		||||
import pw.yumc.MiaoScript.event.EventInfo;
 | 
			
		||||
import pw.yumc.MiaoScript.event.EventManager;
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
import pw.yumc.YumCore.commands.CommandArgument;
 | 
			
		||||
import pw.yumc.YumCore.commands.CommandExecutor;
 | 
			
		||||
import pw.yumc.YumCore.commands.CommandManager;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Cmd;
 | 
			
		||||
import pw.yumc.YumCore.commands.annotation.Help;
 | 
			
		||||
 | 
			
		||||
public class MSCommands implements CommandExecutor {
 | 
			
		||||
    MiaoScript plugin = P.getPlugin();
 | 
			
		||||
 | 
			
		||||
    public MSCommands() {
 | 
			
		||||
        new CommandManager("ms", this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Cmd(permission = "MiaoScript.debug")
 | 
			
		||||
    @Help("切换调试模式")
 | 
			
		||||
    public void debug(final CommandArgument e) {
 | 
			
		||||
        EventManager.debug = !EventManager.debug;
 | 
			
		||||
        e.getSender().sendMessage("§6调试模式: " + (EventManager.debug ? "§a开启" : "§c关闭"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Cmd(permission = "MiaoScript.listen")
 | 
			
		||||
    @Help("查看监听列表")
 | 
			
		||||
    public void listen(final CommandArgument e) {
 | 
			
		||||
        final CommandSender sender = e.getSender();
 | 
			
		||||
        for (final EventInfo ei : plugin.getEventManager().getEvents().values()) {
 | 
			
		||||
            sender.sendMessage(String.format("§6名称: §a%s §6事件: §a%s §6优先级: §a%s", ei.getName(), ei.getClazz().substring(ei.getClazz().lastIndexOf(".") + 1), ei.getPriority()));
 | 
			
		||||
            sender.sendMessage("§6脚本列表: ");
 | 
			
		||||
            for (final String script : ei.getScripts()) {
 | 
			
		||||
                sender.sendMessage(String.format("§6- §e%s", script));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Cmd(permission = "MiaoScript.reload")
 | 
			
		||||
    @Help("重载配置文件")
 | 
			
		||||
    public void reload(final CommandArgument e) {
 | 
			
		||||
        plugin.reload();
 | 
			
		||||
        e.getSender().sendMessage("§a配置文件已重新载入!");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								src/main/java/pw/yumc/MiaoScript/data/DataManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/main/java/pw/yumc/MiaoScript/data/DataManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
package pw.yumc.MiaoScript.data;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.config.FileConfig;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 数据管理
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * @since 2016年8月25日 上午2:02:03
 | 
			
		||||
 */
 | 
			
		||||
public class DataManager {
 | 
			
		||||
    FileConfig data;
 | 
			
		||||
 | 
			
		||||
    public DataManager(final FileConfig config) {
 | 
			
		||||
        this.data = config;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 数据配置
 | 
			
		||||
     */
 | 
			
		||||
    public FileConfig getData() {
 | 
			
		||||
        return data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 保存数据
 | 
			
		||||
     */
 | 
			
		||||
    public void save() {
 | 
			
		||||
        data.save();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										76
									
								
								src/main/java/pw/yumc/MiaoScript/event/EventInfo.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								src/main/java/pw/yumc/MiaoScript/event/EventInfo.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
package pw.yumc.MiaoScript.event;
 | 
			
		||||
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.config.ConfigNode;
 | 
			
		||||
import pw.yumc.YumCore.config.InjectConfigurationSection;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 事件信息
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * @since 2016年8月24日 下午1:06:34
 | 
			
		||||
 */
 | 
			
		||||
public class EventInfo extends InjectConfigurationSection {
 | 
			
		||||
    private transient String name;
 | 
			
		||||
    @ConfigNode(path = "class")
 | 
			
		||||
    private String clazz;
 | 
			
		||||
    private String priority;
 | 
			
		||||
    private List<String> scripts;
 | 
			
		||||
 | 
			
		||||
    public EventInfo(final String name, final ConfigurationSection config) {
 | 
			
		||||
        super(config);
 | 
			
		||||
        this.name = name;
 | 
			
		||||
        clearEmpty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 清理空字串脚本
 | 
			
		||||
     *
 | 
			
		||||
     * @param scripts
 | 
			
		||||
     *            脚本
 | 
			
		||||
     * @return 整理后的脚本
 | 
			
		||||
     */
 | 
			
		||||
    public void clearEmpty() {
 | 
			
		||||
        final Set<String> cq = new HashSet<>();
 | 
			
		||||
        for (final String s : scripts) {
 | 
			
		||||
            if (!s.trim().isEmpty()) {
 | 
			
		||||
                cq.add(s);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        scripts = new LinkedList<>(cq);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 获得类名称
 | 
			
		||||
     */
 | 
			
		||||
    public String getClazz() {
 | 
			
		||||
        return clazz;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 事件显示名称
 | 
			
		||||
     */
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 监听等级
 | 
			
		||||
     */
 | 
			
		||||
    public String getPriority() {
 | 
			
		||||
        return priority == null || "".equalsIgnoreCase(priority) ? "NORMAL" : priority;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 获得执行的脚本
 | 
			
		||||
     */
 | 
			
		||||
    public List<String> getScripts() {
 | 
			
		||||
        return scripts;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										168
									
								
								src/main/java/pw/yumc/MiaoScript/event/EventManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/main/java/pw/yumc/MiaoScript/event/EventManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
			
		||||
package pw.yumc.MiaoScript.event;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
import org.bukkit.event.Event;
 | 
			
		||||
import org.bukkit.event.EventException;
 | 
			
		||||
import org.bukkit.event.EventPriority;
 | 
			
		||||
import org.bukkit.event.Listener;
 | 
			
		||||
import org.bukkit.event.player.PlayerEvent;
 | 
			
		||||
import org.bukkit.plugin.EventExecutor;
 | 
			
		||||
 | 
			
		||||
import me.clip.placeholderapi.PlaceholderAPI;
 | 
			
		||||
import pw.yumc.MiaoScript.MiaoScript;
 | 
			
		||||
import pw.yumc.YumCore.bukkit.Log;
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 脚本管理
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * @since 2016年8月24日 下午12:51:48
 | 
			
		||||
 */
 | 
			
		||||
public class EventManager implements Listener {
 | 
			
		||||
    public static boolean debug = false;
 | 
			
		||||
    private static String identifier = "%s_%s";
 | 
			
		||||
    private final MiaoScript plugin = P.getPlugin();
 | 
			
		||||
    /**
 | 
			
		||||
     * 未处理的数据
 | 
			
		||||
     */
 | 
			
		||||
    private final List<EventInfo> eventInfos = new ArrayList<>();
 | 
			
		||||
    /**
 | 
			
		||||
     * 处理后的数据
 | 
			
		||||
     */
 | 
			
		||||
    private final Map<String, EventInfo> events = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    public EventManager(final ConfigurationSection config) {
 | 
			
		||||
        for (final String event : config.getKeys(false)) {
 | 
			
		||||
            final ConfigurationSection e = config.getConfigurationSection(event);
 | 
			
		||||
            if (e == null) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            eventInfos.add(new EventInfo(event, e));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void debug(final String msg) {
 | 
			
		||||
        if (debug) {
 | 
			
		||||
            Log.info(msg);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得事件信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param event
 | 
			
		||||
     *            事件
 | 
			
		||||
     * @param priority
 | 
			
		||||
     *            事件等级
 | 
			
		||||
     * @return 事件处理信息
 | 
			
		||||
     */
 | 
			
		||||
    public EventInfo getEvent(final Event event, final EventPriority priority) {
 | 
			
		||||
        return getEvent(getIdentifier(event.getClass(), priority));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得事件信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param name
 | 
			
		||||
     *            事件占位符
 | 
			
		||||
     * @return 事件处理信息
 | 
			
		||||
     */
 | 
			
		||||
    public EventInfo getEvent(final String name) {
 | 
			
		||||
        return events.get(name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 获得注册的事件
 | 
			
		||||
     */
 | 
			
		||||
    public Map<String, EventInfo> getEvents() {
 | 
			
		||||
        return events;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得占位符
 | 
			
		||||
     *
 | 
			
		||||
     * @param event
 | 
			
		||||
     *            事件
 | 
			
		||||
     * @param priority
 | 
			
		||||
     *            优先级
 | 
			
		||||
     * @return 占位符
 | 
			
		||||
     */
 | 
			
		||||
    public String getIdentifier(final Class<? extends Event> event, final EventPriority priority) {
 | 
			
		||||
        return String.format(identifier, event.getSimpleName(), priority.name());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 调试
 | 
			
		||||
     *
 | 
			
		||||
     * @param ei
 | 
			
		||||
     *            事件信息
 | 
			
		||||
     */
 | 
			
		||||
    public void printInfo(final EventInfo ei) {
 | 
			
		||||
        debug(String.format("名称: %s 事件: %s 优先级: %s", ei.getName(), ei.getClazz().substring(ei.getClazz().lastIndexOf(".") + 1), ei.getPriority()));
 | 
			
		||||
        debug("脚本列表: ");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 注册事件
 | 
			
		||||
     *
 | 
			
		||||
     * @param eventInfo
 | 
			
		||||
     *            事件信息
 | 
			
		||||
     */
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public boolean register(final EventInfo eventInfo) {
 | 
			
		||||
        try {
 | 
			
		||||
            final Class<? extends Event> clazz = (Class<? extends Event>) Class.forName(eventInfo.getClazz());
 | 
			
		||||
            final EventPriority priority = EventPriority.valueOf(eventInfo.getPriority());
 | 
			
		||||
            events.put(getIdentifier(clazz, priority), eventInfo);
 | 
			
		||||
            Bukkit.getPluginManager().registerEvent(clazz, this, priority, new EventExecutor() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void execute(final Listener listener, final Event event) throws EventException {
 | 
			
		||||
                    final EventInfo ei = plugin.getEventManager().getEvent(event, priority);
 | 
			
		||||
                    if (ei == null) {
 | 
			
		||||
                        Log.debug(String.format("事件 %s_%s 未找到对应处理脚本!", event.getEventName(), priority.name()));
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                    debug("========== MiaoScript Debug ==========");
 | 
			
		||||
                    printInfo(ei);
 | 
			
		||||
                    if (event instanceof PlayerEvent) {
 | 
			
		||||
                        final PlayerEvent pe = (PlayerEvent) event;
 | 
			
		||||
                        for (final String script : ei.getScripts()) {
 | 
			
		||||
                            final String result = PlaceholderAPI.setPlaceholders(plugin.getEventMiddleware().generate(pe), script);
 | 
			
		||||
                            debug(String.format("- %s 返回值: %s", script, result));
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                    } else {
 | 
			
		||||
                        Log.debug(String.format("事件 %s 未继承 PlayerEvent 可能无法正常调用!", event.getEventName()));
 | 
			
		||||
                    }
 | 
			
		||||
                    debug("========== MiaoScript Debug ==========");
 | 
			
		||||
                }
 | 
			
		||||
            }, plugin);
 | 
			
		||||
            return true;
 | 
			
		||||
        } catch (final ClassNotFoundException e) {
 | 
			
		||||
            Log.warning(String.format("事件 %s 的监听类 %s 未找到!", eventInfo.getName(), eventInfo.getClazz()));
 | 
			
		||||
        } catch (final Exception e) {
 | 
			
		||||
            Log.warning(String.format("事件 %s 的注册失败 %s: %s!", eventInfo.getName(), e.getClass().getName(), e.getMessage()));
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 注册所有事件
 | 
			
		||||
     */
 | 
			
		||||
    public void registerAll() {
 | 
			
		||||
        int count = 0;
 | 
			
		||||
        for (final EventInfo ei : eventInfos) {
 | 
			
		||||
            if (!ei.getScripts().isEmpty() && register(ei)) {
 | 
			
		||||
                count++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        Log.info(String.format("已注册 %s 个事件...", count));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										117
									
								
								src/main/java/pw/yumc/MiaoScript/middleware/EventMiddleware.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/main/java/pw/yumc/MiaoScript/middleware/EventMiddleware.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
			
		||||
package pw.yumc.MiaoScript.middleware;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.Event;
 | 
			
		||||
import org.bukkit.event.player.PlayerEvent;
 | 
			
		||||
import org.bukkit.metadata.MetadataValue;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 事件处理中间件
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * @since 2016年8月25日 上午12:45:39
 | 
			
		||||
 */
 | 
			
		||||
public class EventMiddleware {
 | 
			
		||||
    public static String key = "EventMiddleware";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生成代理玩家
 | 
			
		||||
     *
 | 
			
		||||
     * @param event
 | 
			
		||||
     *            事件
 | 
			
		||||
     * @return 处理后的Player
 | 
			
		||||
     */
 | 
			
		||||
    public Player generate(final PlayerEvent event) {
 | 
			
		||||
        final Player player = event.getPlayer();
 | 
			
		||||
        player.setMetadata(key, new EventMetaData(event));
 | 
			
		||||
        return player;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得玩家数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param player
 | 
			
		||||
     *            代理玩家
 | 
			
		||||
     * @return 事件数据
 | 
			
		||||
     */
 | 
			
		||||
    public Event get(final Player player) {
 | 
			
		||||
        for (final MetadataValue mv : player.getMetadata(key)) {
 | 
			
		||||
            if (mv.getOwningPlugin().getName().equals(P.getName())) {
 | 
			
		||||
                player.removeMetadata(key, P.instance);
 | 
			
		||||
                return (Event) mv.value();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 事件源信息
 | 
			
		||||
     *
 | 
			
		||||
     * @author 喵♂呜
 | 
			
		||||
     * @since 2016年8月25日 上午12:47:53
 | 
			
		||||
     */
 | 
			
		||||
    public class EventMetaData implements MetadataValue {
 | 
			
		||||
        Event event;
 | 
			
		||||
 | 
			
		||||
        public EventMetaData(final Event event) {
 | 
			
		||||
            this.event = event;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public boolean asBoolean() {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public byte asByte() {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public double asDouble() {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public float asFloat() {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int asInt() {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public long asLong() {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public short asShort() {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public String asString() {
 | 
			
		||||
            return event.getEventName();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public Plugin getOwningPlugin() {
 | 
			
		||||
            return P.instance;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void invalidate() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public Object value() {
 | 
			
		||||
            return event;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										88
									
								
								src/main/java/pw/yumc/MiaoScript/script/ScriptInfo.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/main/java/pw/yumc/MiaoScript/script/ScriptInfo.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
package pw.yumc.MiaoScript.script;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.nio.charset.Charset;
 | 
			
		||||
import java.nio.file.Files;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
 | 
			
		||||
import pw.yumc.YumCore.bukkit.Log;
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
import pw.yumc.YumCore.config.InjectConfigurationSection;
 | 
			
		||||
import pw.yumc.YumCore.config.Nullable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 脚本信息
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * @since 2016年8月24日 下午12:52:09
 | 
			
		||||
 */
 | 
			
		||||
public class ScriptInfo extends InjectConfigurationSection {
 | 
			
		||||
    public transient static final File dir = new File(P.getDataFolder(), "js");
 | 
			
		||||
    public transient static Charset UTF_8 = Charset.forName("UTF-8");
 | 
			
		||||
 | 
			
		||||
    static {
 | 
			
		||||
        if (!dir.exists()) {
 | 
			
		||||
            dir.mkdirs();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String expression;
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private String type;
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private String trueResult;
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private String falseResult;
 | 
			
		||||
 | 
			
		||||
    public ScriptInfo(final ConfigurationSection config) {
 | 
			
		||||
        super(config);
 | 
			
		||||
        if ("boolean".equalsIgnoreCase(type) && (trueResult == null || falseResult == null)) {
 | 
			
		||||
            Log.warning(String.format("脚本 %s 返回缺少返回结果!", config.getCurrentPath()));
 | 
			
		||||
        }
 | 
			
		||||
        if (expression.startsWith("file:")) {
 | 
			
		||||
            final String fileName = expression.substring(5).trim();
 | 
			
		||||
            try {
 | 
			
		||||
                final File file = new File(dir, fileName);
 | 
			
		||||
                if (!file.exists()) {
 | 
			
		||||
                    file.createNewFile();
 | 
			
		||||
                    Log.warning(String.format("JS文件 %s 不存在 已创建新文件 请添加脚本信息!", fileName));
 | 
			
		||||
                } else {
 | 
			
		||||
                    expression = new String(Files.readAllBytes(file.toPath()), UTF_8);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (final IOException e) {
 | 
			
		||||
                Log.warning(String.format("JS文件 %s 读取失败 异常: %s", fileName, e.getMessage()));
 | 
			
		||||
                expression = "";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 表达式
 | 
			
		||||
     */
 | 
			
		||||
    public String getExpression() {
 | 
			
		||||
        return expression;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return False返回值
 | 
			
		||||
     */
 | 
			
		||||
    public String getFalseResult() {
 | 
			
		||||
        return falseResult;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return True返回值
 | 
			
		||||
     */
 | 
			
		||||
    public String getTrueResult() {
 | 
			
		||||
        return trueResult;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return 类型
 | 
			
		||||
     */
 | 
			
		||||
    public String getType() {
 | 
			
		||||
        return type;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								src/main/java/pw/yumc/MiaoScript/script/ScriptManager.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/main/java/pw/yumc/MiaoScript/script/ScriptManager.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
package pw.yumc.MiaoScript.script;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.configuration.ConfigurationSection;
 | 
			
		||||
 | 
			
		||||
import cn.citycraft.PluginHelper.kit.Log;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 脚本管理
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * @since 2016年8月24日 下午12:51:48
 | 
			
		||||
 */
 | 
			
		||||
public class ScriptManager {
 | 
			
		||||
    Map<String, ScriptInfo> scripts = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
    public ScriptManager(final ConfigurationSection config) {
 | 
			
		||||
        final Set<String> keys = config.getKeys(false);
 | 
			
		||||
        for (final String key : keys) {
 | 
			
		||||
            scripts.put(key, new ScriptInfo(config.getConfigurationSection(key)));
 | 
			
		||||
        }
 | 
			
		||||
        Log.info(String.format("已加载 %s 个变量...", keys.size()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取脚本信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param name
 | 
			
		||||
     *            获得脚本
 | 
			
		||||
     * @return 脚本信息
 | 
			
		||||
     */
 | 
			
		||||
    public ScriptInfo getScript(final String name) {
 | 
			
		||||
        return scripts.get(name);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,91 @@
 | 
			
		||||
package pw.yumc.MiaoScript.script;
 | 
			
		||||
 | 
			
		||||
import java.util.WeakHashMap;
 | 
			
		||||
 | 
			
		||||
import javax.script.ScriptEngine;
 | 
			
		||||
import javax.script.ScriptEngineManager;
 | 
			
		||||
import javax.script.ScriptException;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.Event;
 | 
			
		||||
 | 
			
		||||
import me.clip.placeholderapi.PlaceholderAPI;
 | 
			
		||||
import me.clip.placeholderapi.PlaceholderHook;
 | 
			
		||||
import pw.yumc.MiaoScript.MiaoScript;
 | 
			
		||||
import pw.yumc.YumCore.bukkit.Log;
 | 
			
		||||
import pw.yumc.YumCore.bukkit.P;
 | 
			
		||||
import pw.yumc.YumCore.config.PlayerConfig;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 脚本执行
 | 
			
		||||
 *
 | 
			
		||||
 * @author 喵♂呜
 | 
			
		||||
 * @since 2016年8月24日 下午12:51:59
 | 
			
		||||
 */
 | 
			
		||||
public class ScriptPlaceholder extends PlaceholderHook {
 | 
			
		||||
    private static String invalid = "无效的脚本: %s";
 | 
			
		||||
    private static String typeError = "脚本 %s 返回值错误";
 | 
			
		||||
    private static String EMPTY = "";
 | 
			
		||||
    private final MiaoScript plugin = P.getPlugin();
 | 
			
		||||
    private ScriptEngine engine;
 | 
			
		||||
    private final WeakHashMap<String, PlayerConfig> playerdatas = new WeakHashMap<>();
 | 
			
		||||
 | 
			
		||||
    public ScriptPlaceholder() {
 | 
			
		||||
        this("javascript");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ScriptPlaceholder(final String engineType) {
 | 
			
		||||
        try {
 | 
			
		||||
            engine = new ScriptEngineManager().getEngineByName(engineType);
 | 
			
		||||
        } catch (final NullPointerException ex) {
 | 
			
		||||
            Log.warning("无效的解析引擎! 已设为默认值 'javascript'");
 | 
			
		||||
            engine = new ScriptEngineManager().getEngineByName("javascript");
 | 
			
		||||
        }
 | 
			
		||||
        engine.put("Bukkit", Bukkit.getServer());
 | 
			
		||||
        engine.put("Server", Bukkit.getServer());
 | 
			
		||||
        engine.put("Data", plugin.getDataManager().getData());
 | 
			
		||||
        engine.put("Prefix", Log.getPrefix());
 | 
			
		||||
        engine.put("Log", P.getLogger());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String onPlaceholderRequest(final Player p, final String key) {
 | 
			
		||||
        final ScriptInfo script = plugin.getScriptManager().getScript(key);
 | 
			
		||||
        if (script == null) {
 | 
			
		||||
            return EMPTY;
 | 
			
		||||
        }
 | 
			
		||||
        String expression = script.getExpression();
 | 
			
		||||
        expression = PlaceholderAPI.setPlaceholders(p, expression);
 | 
			
		||||
        try {
 | 
			
		||||
            engine.put("Player", p);
 | 
			
		||||
            if (!playerdatas.containsKey(p.getName())) {
 | 
			
		||||
                playerdatas.put(p.getName(), new PlayerConfig(p));
 | 
			
		||||
            }
 | 
			
		||||
            engine.put("PlayerData", playerdatas.get(p.getName()));
 | 
			
		||||
            final Event event = plugin.getEventMiddleware().get(p);
 | 
			
		||||
            if (event != null) {
 | 
			
		||||
                engine.put("Event", event);
 | 
			
		||||
            }
 | 
			
		||||
            Object result = engine.eval(expression);
 | 
			
		||||
            if (result == null) {
 | 
			
		||||
                return EMPTY;
 | 
			
		||||
            }
 | 
			
		||||
            if ("boolean".equalsIgnoreCase(script.getType())) {
 | 
			
		||||
                if (!(result instanceof Boolean)) {
 | 
			
		||||
                    return String.format(typeError, key);
 | 
			
		||||
                }
 | 
			
		||||
                if (((Boolean) result).booleanValue()) {
 | 
			
		||||
                    result = script.getTrueResult();
 | 
			
		||||
                } else {
 | 
			
		||||
                    result = script.getFalseResult();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return PlaceholderAPI.setPlaceholders(p, String.valueOf(result));
 | 
			
		||||
        } catch (final ScriptException ex) {
 | 
			
		||||
            Log.warning(String.format("脚本 %s 格式错误...", key));
 | 
			
		||||
            ex.printStackTrace();
 | 
			
		||||
            return String.format(invalid, key);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										0
									
								
								src/main/resources/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/main/resources/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										3
									
								
								src/main/resources/data.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/main/resources/data.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
dirList:
 | 
			
		||||
- 你妈逼
 | 
			
		||||
- 我操
 | 
			
		||||
							
								
								
									
										32
									
								
								src/main/resources/event.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/main/resources/event.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
PlayerJoin:
 | 
			
		||||
  #Event Class Full Name
 | 
			
		||||
  class: org.bukkit.event.player.PlayerJoinEvent
 | 
			
		||||
  #EventPriority Allow Value: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
 | 
			
		||||
  priority: LOWEST
 | 
			
		||||
  #Script List
 | 
			
		||||
  scripts:
 | 
			
		||||
  - '%ms_welcome%'
 | 
			
		||||
PlayerDrop:
 | 
			
		||||
  #Event Class Full Name
 | 
			
		||||
  class: org.bukkit.event.player.PlayerDropItemEvent
 | 
			
		||||
  #EventPriority Allow Value: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
 | 
			
		||||
  priority: LOWEST
 | 
			
		||||
  #Script List
 | 
			
		||||
  scripts:
 | 
			
		||||
  - '%ms_checkDrop%'
 | 
			
		||||
PlayerChat:
 | 
			
		||||
  #Event Class Full Name
 | 
			
		||||
  class: org.bukkit.event.player.AsyncPlayerChatEvent
 | 
			
		||||
  #EventPriority Allow Value: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
 | 
			
		||||
  priority: LOWEST
 | 
			
		||||
  #Script List
 | 
			
		||||
  scripts:
 | 
			
		||||
  - '%ms_checkChat%'
 | 
			
		||||
PlayerCommandPreprocess:
 | 
			
		||||
  #Event Class Full Name
 | 
			
		||||
  class: org.bukkit.event.player.PlayerCommandPreprocessEvent
 | 
			
		||||
  #EventPriority Allow Value: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
 | 
			
		||||
  priority: LOWEST
 | 
			
		||||
  #Script List
 | 
			
		||||
  scripts:
 | 
			
		||||
  - '%ms_bed%'
 | 
			
		||||
							
								
								
									
										20
									
								
								src/main/resources/js/bed.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/main/resources/js/bed.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
var msg = Event.getMessage();
 | 
			
		||||
var command = msg.substring(1);
 | 
			
		||||
switch (command) {
 | 
			
		||||
case "setbed":
 | 
			
		||||
	Event.setCancelled(true);
 | 
			
		||||
	PlayerData.set("bed", Player.getLocation());
 | 
			
		||||
	PlayerData.save();
 | 
			
		||||
	Player.sendMessage(Prefix + "&a您的床位设置成功 使用&b/gobed &a即可回家!");
 | 
			
		||||
	break;
 | 
			
		||||
case "gobed":
 | 
			
		||||
	Event.setCancelled(true);
 | 
			
		||||
	if (PlayerData.isSet("bed")) {
 | 
			
		||||
		Player.teleport(PlayerData.getLocation("bed"));
 | 
			
		||||
		Player.sendMessage(Prefix + "&a已传送您回床!");
 | 
			
		||||
	} else {
 | 
			
		||||
		Player.sendMessage(Prefix + "&c请先使用 &b/setbed &c设置您的床位!");
 | 
			
		||||
	}
 | 
			
		||||
default:
 | 
			
		||||
	break;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								src/main/resources/js/checkchat.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/main/resources/js/checkchat.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
var dirs = Data.getStringList("dirChat");
 | 
			
		||||
var msg = Event.getMessage();
 | 
			
		||||
for (i in dirs) {
 | 
			
		||||
	if (msg.contains(dirs[i])) {
 | 
			
		||||
		Event.setCancelled(true);
 | 
			
		||||
		Player.sendMessage("&6[&b警告&6] &c请不要讲脏话!");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								src/main/resources/js/welcome.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/main/resources/js/welcome.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
if( Player.getName() == "Mr_jtb" ){
 | 
			
		||||
	Bukkit.broadcastMessage("&6[&a公告&6] &c热烈欢迎  &aMiaoScript &c作者 &b喵♂呜&c!");
 | 
			
		||||
} else {
 | 
			
		||||
	Player.sendMessage("&6[&bMiaoScript&6] &c欢迎来到 &b" + Bukkit.getServerName() + " &c服务器!");
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								src/main/resources/plugin.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/main/resources/plugin.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
name: ${project.artifactId}
 | 
			
		||||
description: ${project.description}
 | 
			
		||||
main: ${project.groupId}.${project.artifactId}.${project.artifactId}
 | 
			
		||||
version: ${project.version}-git-${env.GIT_COMMIT}
 | 
			
		||||
author: 喵♂呜
 | 
			
		||||
website: ${ciManagement.url}
 | 
			
		||||
depend:
 | 
			
		||||
- PlaceholderAPI
 | 
			
		||||
commands:
 | 
			
		||||
  ${project.artifactId}:
 | 
			
		||||
    description: ${project.artifactId} - ${project.description}
 | 
			
		||||
    aliases:
 | 
			
		||||
    - ms
 | 
			
		||||
    usage: §b使用/${project.artifactId} help 查看帮助!
 | 
			
		||||
    permission: ${project.artifactId}.reload
 | 
			
		||||
    permission-message: §c你没有 <permission> 的权限来执行此命令!
 | 
			
		||||
permissions:
 | 
			
		||||
  ${project.artifactId}.use:
 | 
			
		||||
    description: ${project.artifactId} 使用!
 | 
			
		||||
    default: true
 | 
			
		||||
  ${project.artifactId}.reload:
 | 
			
		||||
    description: 重新载入插件!
 | 
			
		||||
    default: op
 | 
			
		||||
							
								
								
									
										86
									
								
								src/main/resources/script.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/main/resources/script.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
#脚本名称
 | 
			
		||||
#xxxxx:
 | 
			
		||||
#  脚本表达式
 | 
			
		||||
#  expression: | [这里写"|"则下方缩进均为一行 请看案例]
 | 
			
		||||
#    if( x = y ) {
 | 
			
		||||
#      省略代码
 | 
			
		||||
#    }
 | 
			
		||||
#  expression: "Player.getDisplayName()"
 | 
			
		||||
#  PS: JS表达式 支持调用Bukkit的内部方法
 | 
			
		||||
#      当前支持Bukkit(Server),Player,Event
 | 
			
		||||
#      Bukkit(或Server): 调用的是服务器数据
 | 
			
		||||
#      - getOnlinePlayer().size(): 在线玩家数量
 | 
			
		||||
#      - broadcastMessage('xxx'): 公告xxx
 | 
			
		||||
#      - getConsoleSender(): 获得控制台
 | 
			
		||||
#      - dispatchCommand(Bukkit.getConsoleSender(),"xxx"): 控制台执行xxx命令
 | 
			
		||||
#      - dispatchCommand(Player,"xxx"): 玩家执行xxx命令
 | 
			
		||||
#      更多的方法请查询: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Bukkit.html
 | 
			
		||||
#
 | 
			
		||||
#      Player: 调用玩家对象 常用方法有: 
 | 
			
		||||
#      - getName(): 玩家名称
 | 
			
		||||
#      - getDisplayName(): 玩家显示名称
 | 
			
		||||
#      - hasPermission("xxx"): 判断玩家是否有xxx权限
 | 
			
		||||
#      - sendMessage("xxx"): 向玩家发送xxx消息
 | 
			
		||||
#      - isOp():是否为OP
 | 
			
		||||
#      - setFlying(true 或  false): 设置飞行
 | 
			
		||||
#      - setHealth(20): 设置玩家血量
 | 
			
		||||
#      更多的方法请查询: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/Player.html
 | 
			
		||||
#
 | 
			
		||||
#      Event: 调用事件 不同事件有不同的参数 常用方法如下:
 | 
			
		||||
#      - setCancelled(true): 用于取消事件
 | 
			
		||||
#      更多的方法请查询: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerEvent.html
 | 
			
		||||
#      
 | 
			
		||||
#      [Data, PlayerData(玩家数据)]: 调用数据存储 若崩服数据可能丢失
 | 
			
		||||
#      - set("key","value"): 保存一条键为key值为value的数据
 | 
			
		||||
#      - get("key"): 获得键为key的值
 | 
			
		||||
#      - getStringList("dirChat"): 获得键为dirChat的字符串列表
 | 
			
		||||
#      - save(): 保存数据到硬盘
 | 
			
		||||
#      更多的方法请查询: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/configuration/ConfigurationSection.html
 | 
			
		||||
#      
 | 
			
		||||
#      Log: 调用插件日志系统
 | 
			
		||||
#      - info("xxx"): 输出信息xxx到日志
 | 
			
		||||
#      - warning("xxx"): 输出警告xxx
 | 
			
		||||
#      更多的方法请查询: http://docs.oracle.com/javase/7/docs/api/java/util/logging/Logger.html
 | 
			
		||||
# 
 | 
			
		||||
#  type: "boolean" 或 "string" 不写 默认为string
 | 
			
		||||
#  #下面两个参数 当type为boolean时才有效
 | 
			
		||||
#  trueResult: '&c管理员' [脚本返回True时的返回值]
 | 
			
		||||
#  falseResult: '&a玩家' [脚本返回False时的返回值]
 | 
			
		||||
#
 | 
			
		||||
#脚本名称
 | 
			
		||||
welcome:
 | 
			
		||||
  #脚本表达式
 | 
			
		||||
  expression: 'file: welcome.js'
 | 
			
		||||
#物品丢弃检测
 | 
			
		||||
checkDrop:
 | 
			
		||||
  expression: |
 | 
			
		||||
    if( Event.getItemDrop().getItemStack().getType().name().contains("DIAMOND") ){
 | 
			
		||||
      Player.sendMessage("&6[&b警告&6] &c您可能丢弃了一件贵重物品!");
 | 
			
		||||
    }
 | 
			
		||||
#聊天检测
 | 
			
		||||
checkChat:
 | 
			
		||||
  expression: 'file: checkchat.js'
 | 
			
		||||
#获得玩家前缀    
 | 
			
		||||
getPrefix:
 | 
			
		||||
  expression: Player.isOp()
 | 
			
		||||
  #脚本返回值
 | 
			
		||||
  type: boolean
 | 
			
		||||
  #脚本返回True时的返回值
 | 
			
		||||
  trueResult: '&c管理员'
 | 
			
		||||
  #脚本返回False时的返回值
 | 
			
		||||
  falseResult: '&a玩家'
 | 
			
		||||
#获取玩家的显示名称
 | 
			
		||||
getDisplayName:
 | 
			
		||||
  expression: Player.getDisplayName()
 | 
			
		||||
  type: string
 | 
			
		||||
#开启玩家飞行模式
 | 
			
		||||
flyon:
 | 
			
		||||
  expression: 'Player.setAllowFlight(true);Player.sendMessage("&6[&bMiaoScript&6] &a已为您开启飞行模式!")'
 | 
			
		||||
#关闭玩家飞行模式
 | 
			
		||||
flyoff:
 | 
			
		||||
  expression: |
 | 
			
		||||
    Player.setAllowFlight(false);
 | 
			
		||||
    Player.sendMessage("&6[&bMiaoScript&6] &a已为您关闭飞行模式!");
 | 
			
		||||
#设置床
 | 
			
		||||
bed: 
 | 
			
		||||
  expression: 'file: bed.js'
 | 
			
		||||
		Reference in New Issue
	
	Block a user