mirror of
https://github.com/asofold/CompatNoCheatPlus.git
synced 2024-11-24 12:16:46 +01:00
initial version on server
This commit is contained in:
commit
981bc7d28f
4
CompatNoCheatPlus/.gitignore
vendored
Normal file
4
CompatNoCheatPlus/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/.settings
|
||||||
|
/.classpath
|
||||||
|
/.project
|
||||||
|
/jar_desc.jardesc
|
18
CompatNoCheatPlus/cncp_lists.txt
Normal file
18
CompatNoCheatPlus/cncp_lists.txt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CompatNoCheatPlus lists file
|
||||||
|
-------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
STACK
|
||||||
|
---------
|
||||||
|
?(add) more intricate load order stuff ?
|
||||||
|
!(add) Limit blockbreaking speed by mcmmo (config) !
|
||||||
|
|
||||||
|
|
||||||
|
***
|
||||||
|
!(add) reload command
|
||||||
|
|
||||||
|
|
||||||
|
VERSION HISTORY
|
||||||
|
---------------------------
|
||||||
|
(0.0.0) [initial version]
|
9
CompatNoCheatPlus/plugin.yml
Normal file
9
CompatNoCheatPlus/plugin.yml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
name: CompatNoCheatPlus
|
||||||
|
main: me.asofold.bukkit.cncp.CompatNoCheatPlus
|
||||||
|
version: 0.0.0 beta
|
||||||
|
depend:
|
||||||
|
- NoCheatPlus
|
||||||
|
softdepend:
|
||||||
|
- mcMMO
|
||||||
|
- PluginLibSharedLibrary
|
||||||
|
- CustomPlg
|
@ -0,0 +1,252 @@
|
|||||||
|
package me.asofold.bukkit.cncp;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import me.asofold.bukkit.cncp.config.compatlayer.CompatConfig;
|
||||||
|
import me.asofold.bukkit.cncp.config.compatlayer.NewConfig;
|
||||||
|
import me.asofold.bukkit.cncp.hooks.Hook;
|
||||||
|
import me.asofold.bukkit.cncp.hooks.mcmmo.HookmcMMO;
|
||||||
|
import me.asofold.bukkit.cncp.setttings.GroupHooks;
|
||||||
|
import me.asofold.bukkit.cncp.setttings.Settings;
|
||||||
|
import me.asofold.bukkit.cncp.utils.Utils;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Server;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.PluginManager;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
|
|
||||||
|
import fr.neatmonster.nocheatplus.checks.Check;
|
||||||
|
import fr.neatmonster.nocheatplus.checks.CheckEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quick attempt to provide compatibility to NoCheatPlus for some other plugins that change the vanilla game mechanichs, for instance by fast block breaking.
|
||||||
|
* @author mc_dev
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class CompatNoCheatPlus extends JavaPlugin implements Listener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Storage of hooks that are called for all events.
|
||||||
|
*/
|
||||||
|
private static final ArrayList<Hook> hooksAll = new ArrayList<Hook>(10);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Storage of hooks that are called for certain groups and checks.
|
||||||
|
*/
|
||||||
|
private static final Map<String, GroupHooks> hooksGroups = new HashMap<String, GroupHooks>(20);
|
||||||
|
|
||||||
|
private final Settings settings = new Settings();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag if plugin is enabled.
|
||||||
|
*/
|
||||||
|
private static boolean enabled = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Experimental: static method to enable this plugin, only enables if it is not already enabled.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean enableCncp(){
|
||||||
|
if (enabled) return true;
|
||||||
|
return enablePlugin("CompatNoCheatPlus");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static method to enable a plugin (might also be useful for hooks).
|
||||||
|
* @param plgName
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean enablePlugin(String plgName) {
|
||||||
|
PluginManager pm = Bukkit.getPluginManager();
|
||||||
|
Plugin plugin = pm.getPlugin(plgName);
|
||||||
|
if (plugin == null) return false;
|
||||||
|
if (pm.isPluginEnabled(plugin)) return true;
|
||||||
|
pm.enablePlugin(plugin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static method to disable a plugin (might also be useful for hooks).
|
||||||
|
* @param plgName
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean disablePlugin(String plgName){
|
||||||
|
PluginManager pm = Bukkit.getPluginManager();
|
||||||
|
Plugin plugin = pm.getPlugin(plgName);
|
||||||
|
if (plugin == null) return false;
|
||||||
|
if (!pm.isPluginEnabled(plugin)) return true;
|
||||||
|
pm.disablePlugin(plugin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API to add a hook.
|
||||||
|
* @param hook
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean addHook(Hook hook){
|
||||||
|
if (!enabled) return false;
|
||||||
|
Listener[] listeners = hook.getListeners();
|
||||||
|
if (listeners != null){
|
||||||
|
// attempt to register events:
|
||||||
|
PluginManager pm = Bukkit.getPluginManager();
|
||||||
|
Plugin plg = pm.getPlugin("CompatNoCheatPlus");
|
||||||
|
if (plg == null) return false;
|
||||||
|
for (Listener listener : listeners) {
|
||||||
|
pm.registerEvents(listener, plg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String[][] specs = hook.getCheckSpec();
|
||||||
|
if (specs == null) hooksAll.add(hook);
|
||||||
|
else{
|
||||||
|
for (String[] spec : specs){
|
||||||
|
String group = spec[0].trim().toLowerCase();
|
||||||
|
GroupHooks gh = hooksGroups.get(group);
|
||||||
|
if (gh == null){
|
||||||
|
gh = new GroupHooks();
|
||||||
|
hooksGroups.put(group, gh);
|
||||||
|
}
|
||||||
|
if (spec.length == 1) gh.all.add(hook);
|
||||||
|
else{
|
||||||
|
for (int i = 1; i < spec.length; i++){
|
||||||
|
String check = spec[i].trim().toLowerCase();
|
||||||
|
ArrayList<Hook> hooks = gh.byCheck.get(check);
|
||||||
|
if (hooks == null){
|
||||||
|
hooks = new ArrayList<Hook>(10);
|
||||||
|
gh.byCheck.put(check, hooks);
|
||||||
|
}
|
||||||
|
hooks.add(hook);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("[cncp] Added hook: "+hook.getHookName() + " / " + hook.getHookVersion());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void clearHooks() {
|
||||||
|
hooksAll.clear();
|
||||||
|
hooksGroups.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add standard hooks if available.
|
||||||
|
*/
|
||||||
|
private void addAvailableHooks() {
|
||||||
|
try{
|
||||||
|
addHook(new HookmcMMO());
|
||||||
|
}
|
||||||
|
catch (Throwable t){}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEnable() {
|
||||||
|
// cleanup
|
||||||
|
clearHooks();
|
||||||
|
// Settings:
|
||||||
|
settings.clear();
|
||||||
|
reloadSettings();
|
||||||
|
// Register own listener:
|
||||||
|
final PluginManager pm = getServer().getPluginManager();
|
||||||
|
pm.registerEvents(this, this);
|
||||||
|
super.onEnable();
|
||||||
|
enabled = true;
|
||||||
|
// Add Hooks:
|
||||||
|
addAvailableHooks();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean reloadSettings() {
|
||||||
|
final Set<String> oldForceEnableLater = new HashSet<String>();
|
||||||
|
oldForceEnableLater.addAll(settings.forceEnableLater);
|
||||||
|
// Read and apply config to settings:
|
||||||
|
File file = new File(getDataFolder() , "cncp.yml");
|
||||||
|
CompatConfig cfg = new NewConfig(file);
|
||||||
|
cfg.load();
|
||||||
|
if (Settings.addDefaults(cfg)) cfg.save();
|
||||||
|
settings.fromConfig(cfg);
|
||||||
|
// Re-enable plugins that were not yet on the list:
|
||||||
|
Server server = getServer();
|
||||||
|
BukkitScheduler sched = server.getScheduler();
|
||||||
|
for (String plgName : settings.forceEnableLater){
|
||||||
|
if (!oldForceEnableLater.remove(plgName)) oldForceEnableLater.add(plgName);
|
||||||
|
}
|
||||||
|
if (!oldForceEnableLater.isEmpty()){
|
||||||
|
System.out.println("[cncp] Schedule task to re-enable plugins later...");
|
||||||
|
sched.scheduleSyncDelayedTask(this, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// (Later maybe re-enabling this plugin could be added.)
|
||||||
|
// TODO: log levels !
|
||||||
|
for (String plgName : oldForceEnableLater){
|
||||||
|
try{
|
||||||
|
if (disablePlugin(plgName)){
|
||||||
|
if (enablePlugin(plgName)) System.out.println("[cncp] Re-enabled plugin: " + plgName);
|
||||||
|
else System.out.println("[cncp] Could not re-enable plugin: "+plgName);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
System.out.println("[cncp] Could not disable plugin (already disabled?): "+plgName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Throwable t){
|
||||||
|
// TODO: maybe log ?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
enabled = false;
|
||||||
|
clearHooks();
|
||||||
|
super.onDisable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled=true)
|
||||||
|
final void onCheckFail(final CheckEvent event){
|
||||||
|
// Check hooks, most specific first:
|
||||||
|
final Check check = event.getCheck();
|
||||||
|
final String gn = check.getGroup();
|
||||||
|
final String cn = check.getName();
|
||||||
|
final GroupHooks gh = hooksGroups.get(gn.trim().toLowerCase());
|
||||||
|
if (gh != null){
|
||||||
|
final ArrayList<Hook> hooks = gh.byCheck.get(cn.trim().toLowerCase());
|
||||||
|
if (hooks != null) applyHooks(gn, cn, event, hooks);
|
||||||
|
if (event.isCancelled()) return;
|
||||||
|
if (!gh.all.isEmpty()) applyHooks(gn, cn, event, gh.all);
|
||||||
|
}
|
||||||
|
if (event.isCancelled()) return;
|
||||||
|
if (!hooksAll.isEmpty()) applyHooks(gn, cn, event, hooksAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final void applyHooks(final String group, final String check, final CheckEvent event, final ArrayList<Hook> hooks) {
|
||||||
|
for (int i = 0; i < hooks.size(); i++){
|
||||||
|
if (event.isCancelled()) return;
|
||||||
|
final Hook hook = hooks.get(i);
|
||||||
|
try{
|
||||||
|
hook.processEvent(group, check, event);
|
||||||
|
}
|
||||||
|
catch (final Throwable t){
|
||||||
|
final Logger logger = getServer().getLogger();
|
||||||
|
logger.warning("[cncp][" + group + "/" + check + "] Unexpected exception on for hook ("+hook.getHookName()+" / "+hook.getHookVersion()+"):");
|
||||||
|
// TODO: maybe add more info about the CheckEvent ?
|
||||||
|
logger.warning(Utils.toString(t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
package me.asofold.bukkit.cncp.config.compatlayer;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some generic checks and stuff using getString, hasEntry, getStringList, ...
|
||||||
|
* @author mc_dev
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class AbstractConfig implements CompatConfig {
|
||||||
|
|
||||||
|
protected char sep = '.';
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean getBoolean(String path, Boolean defaultValue) {
|
||||||
|
String val = getString(path, null);
|
||||||
|
if ( val == null ) return defaultValue;
|
||||||
|
try{
|
||||||
|
// return Boolean.parseBoolean(val);
|
||||||
|
String t = val.trim().toLowerCase();
|
||||||
|
if ( t.equals("true")) return true;
|
||||||
|
else if ( t.equals("false")) return false;
|
||||||
|
else return defaultValue;
|
||||||
|
} catch( NumberFormatException exc){
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double getDouble(String path, Double defaultValue) {
|
||||||
|
String val = getString(path, null);
|
||||||
|
if ( val == null ) return defaultValue;
|
||||||
|
try{
|
||||||
|
return Double.parseDouble(val);
|
||||||
|
} catch( NumberFormatException exc){
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getLong(String path, Long defaultValue) {
|
||||||
|
String val = getString(path, null);
|
||||||
|
if ( val == null ) return defaultValue;
|
||||||
|
try{
|
||||||
|
return Long.parseLong(val);
|
||||||
|
} catch( NumberFormatException exc){
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getInt(String path, Integer defaultValue) {
|
||||||
|
String val = getString(path, null);
|
||||||
|
if ( val == null ) return defaultValue;
|
||||||
|
try{
|
||||||
|
return Integer.parseInt(val);
|
||||||
|
} catch( NumberFormatException exc){
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> getIntList(String path, List<Integer> defaultValue){
|
||||||
|
if ( !hasEntry(path) ) return defaultValue;
|
||||||
|
List<String> strings = getStringList(path, null);
|
||||||
|
if ( strings == null ) return defaultValue;
|
||||||
|
List<Integer> out = new LinkedList<Integer>();
|
||||||
|
for ( String s : strings){
|
||||||
|
try{
|
||||||
|
out.add(Integer.parseInt(s));
|
||||||
|
} catch(NumberFormatException exc){
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Double> getDoubleList(String path, List<Double> defaultValue) {
|
||||||
|
if ( !hasEntry(path) ) return defaultValue;
|
||||||
|
List<String> strings = getStringList(path, null);
|
||||||
|
if ( strings == null ) return defaultValue;
|
||||||
|
List<Double> out = new LinkedList<Double>();
|
||||||
|
for ( String s : strings){
|
||||||
|
try{
|
||||||
|
out.add(Double.parseDouble(s));
|
||||||
|
} catch(NumberFormatException exc){
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getStringKeys(String path, boolean deep) {
|
||||||
|
if (deep) return getStringKeysDeep(path);
|
||||||
|
Set<String> keys = new HashSet<String>();
|
||||||
|
keys.addAll(getStringKeys(path));
|
||||||
|
return keys;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getStringKeysDeep(String path) {
|
||||||
|
// NOTE: pretty inefficient, but aimed at seldomly read sections.
|
||||||
|
Map<String, Object> values = getValuesDeep();
|
||||||
|
Set<String> out = new HashSet<String>();
|
||||||
|
final int len = path.length();
|
||||||
|
for (String key : values.keySet()){
|
||||||
|
if (!key.startsWith(path)) continue;
|
||||||
|
else if (key.length() == len) continue;
|
||||||
|
else if (key.charAt(len) == sep) out.add(key);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object get(String path, Object defaultValue) {
|
||||||
|
return getProperty(path, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(String path, Object value) {
|
||||||
|
setProperty(path, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(String path) {
|
||||||
|
removeProperty(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean getBoolean(String path) {
|
||||||
|
return getBoolean(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double getDouble(String path) {
|
||||||
|
return getDouble(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Double> getDoubleList(String path) {
|
||||||
|
return getDoubleList(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getInt(String path) {
|
||||||
|
return getInt(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> getIntList(String path) {
|
||||||
|
return getIntList(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getInteger(String path) {
|
||||||
|
return getInt(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> getIntegerList(String path) {
|
||||||
|
return getIntList(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getString(String path) {
|
||||||
|
return getString(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getStringList(String path) {
|
||||||
|
return getStringList(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object get(String path) {
|
||||||
|
return getProperty(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getProperty(String path) {
|
||||||
|
return getProperty(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(String path) {
|
||||||
|
return hasEntry(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getInteger(String path, Integer defaultValue) {
|
||||||
|
return getInt(path, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> getIntegerList(String path, List<Integer> defaultValue) {
|
||||||
|
return getIntList(path, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getLong(String path) {
|
||||||
|
return getLong(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,220 @@
|
|||||||
|
package me.asofold.bukkit.cncp.config.compatlayer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.Configuration;
|
||||||
|
import org.bukkit.configuration.ConfigurationOptions;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.configuration.MemoryConfiguration;
|
||||||
|
|
||||||
|
public abstract class AbstractNewConfig extends AbstractConfig {
|
||||||
|
File file = null;
|
||||||
|
MemoryConfiguration config = null;
|
||||||
|
|
||||||
|
public AbstractNewConfig(File file){
|
||||||
|
this.file = file;
|
||||||
|
this.config = new MemoryConfiguration();
|
||||||
|
setOptions(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasEntry(String path) {
|
||||||
|
return config.contains(path) || (config.get(path) != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getString(String path, String defaultValue) {
|
||||||
|
if (!hasEntry(path)) return defaultValue;
|
||||||
|
return config.getString(path, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getStringKeys(String path) {
|
||||||
|
// TODO policy: only strings or all keys as strings ?
|
||||||
|
List<String> out = new LinkedList<String>();
|
||||||
|
List<Object> keys = getKeys(path);
|
||||||
|
if ( keys == null ) return out;
|
||||||
|
for ( Object obj : keys){
|
||||||
|
if ( obj instanceof String ) out.add((String) obj);
|
||||||
|
else{
|
||||||
|
try{
|
||||||
|
out.add(obj.toString());
|
||||||
|
} catch ( Throwable t){
|
||||||
|
// ignore.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Object> getKeys(String path) {
|
||||||
|
List<Object> out = new LinkedList<Object>();
|
||||||
|
Set<String> keys;
|
||||||
|
if ( path == null) keys = config.getKeys(false);
|
||||||
|
else{
|
||||||
|
ConfigurationSection sec = config.getConfigurationSection(path);
|
||||||
|
if (sec == null) return out;
|
||||||
|
keys = sec.getKeys(false);
|
||||||
|
}
|
||||||
|
if ( keys == null) return out;
|
||||||
|
out.addAll(keys);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Object> getKeys() {
|
||||||
|
return getKeys(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getProperty(String path, Object defaultValue) {
|
||||||
|
Object obj = config.get(path);
|
||||||
|
if ( obj == null ) return defaultValue;
|
||||||
|
else return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getStringKeys() {
|
||||||
|
return getStringKeys(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setProperty(String path, Object obj) {
|
||||||
|
config.set(path, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getStringList(String path, List<String> defaultValue) {
|
||||||
|
if ( !hasEntry(path)) return defaultValue;
|
||||||
|
List<String> out = new LinkedList<String>();
|
||||||
|
List<String> entries = config.getStringList(path);
|
||||||
|
if ( entries == null ) return defaultValue;
|
||||||
|
for ( String entry : entries){
|
||||||
|
if ( entry instanceof String) out.add(entry);
|
||||||
|
else{
|
||||||
|
try{
|
||||||
|
out.add(entry.toString());
|
||||||
|
} catch (Throwable t){
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeProperty(String path) {
|
||||||
|
// VERY EXPENSIVE
|
||||||
|
MemoryConfiguration temp = new MemoryConfiguration();
|
||||||
|
setOptions(temp);
|
||||||
|
Map<String, Object> values = config.getValues(true);
|
||||||
|
values.remove(path);
|
||||||
|
for ( String p : values.keySet()){
|
||||||
|
temp.set(p, values.get(p));
|
||||||
|
}
|
||||||
|
config = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean getBoolean(String path, Boolean defaultValue) {
|
||||||
|
if (!config.contains(path)) return defaultValue;
|
||||||
|
String val = config.getString(path, null);
|
||||||
|
if (val != null){
|
||||||
|
if (val.equalsIgnoreCase("true")) return true;
|
||||||
|
else if (val.equalsIgnoreCase("false")) return false;
|
||||||
|
else return defaultValue;
|
||||||
|
}
|
||||||
|
Boolean res = defaultValue;
|
||||||
|
if ( val == null ){
|
||||||
|
if ( defaultValue == null) defaultValue = false;
|
||||||
|
res = config.getBoolean(path, defaultValue);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Double getDouble(String path, Double defaultValue) {
|
||||||
|
if (!config.contains(path)) return defaultValue;
|
||||||
|
Double res = super.getDouble(path, null);
|
||||||
|
if ( res == null ) res = config.getDouble(path, ConfigUtil.canaryDouble);
|
||||||
|
if ( res == ConfigUtil.canaryDouble) return defaultValue;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getLong(String path, Long defaultValue) {
|
||||||
|
if (!config.contains(path)) return defaultValue;
|
||||||
|
Long res = super.getLong(path, null);
|
||||||
|
if ( res == null ) res = config.getLong(path, ConfigUtil.canaryLong);
|
||||||
|
if ( res == ConfigUtil.canaryLong) return defaultValue;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getInt(String path, Integer defaultValue) {
|
||||||
|
if (!config.contains(path)) return defaultValue;
|
||||||
|
Integer res = super.getInt(path, null);
|
||||||
|
if ( res == null ) res = config.getInt(path, ConfigUtil.canaryInt);
|
||||||
|
if ( res == ConfigUtil.canaryInt) return defaultValue;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> getIntList(String path, List<Integer> defaultValue) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return super.getIntList(path, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Double> getDoubleList(String path, List<Double> defaultValue) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return super.getDoubleList(path, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void addAll(Configuration source, Configuration target){
|
||||||
|
Map<String, Object> all = source.getValues(true);
|
||||||
|
for ( String path: all.keySet()){
|
||||||
|
target.set(path, source.get(path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setOptions(Configuration cfg){
|
||||||
|
ConfigurationOptions opt = cfg.options();
|
||||||
|
opt.pathSeparator(this.sep);
|
||||||
|
//opt.copyDefaults(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setPathSeparatorChar(char sep) {
|
||||||
|
this.sep = sep;
|
||||||
|
setOptions(config);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,128 @@
|
|||||||
|
package me.asofold.bukkit.cncp.config.compatlayer;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CONVENTIONS:
|
||||||
|
* - Return strings if objects can be made strings.
|
||||||
|
* - No exceptions, rather leave elements out of lists.
|
||||||
|
* - Lists of length 0 and null can not always be distinguished (?->extra safe wrapper ?)
|
||||||
|
* - All contents are treated alike, even if given as a string (!): true and 'true', 1 and '1'
|
||||||
|
* @author mc_dev
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface CompatConfig {
|
||||||
|
|
||||||
|
// Boolean
|
||||||
|
/**
|
||||||
|
* Only accepts true and false , 'true' and 'false'.
|
||||||
|
* @param path
|
||||||
|
* @param defaultValue
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Boolean getBoolean(String path, Boolean defaultValue);
|
||||||
|
public Boolean getBoolean(String path);
|
||||||
|
|
||||||
|
// Long
|
||||||
|
public Long getLong(String path);
|
||||||
|
public Long getLong(String path, Long defaultValue);
|
||||||
|
|
||||||
|
// Double
|
||||||
|
public Double getDouble(String path);
|
||||||
|
public Double getDouble(String path, Double defaultValue);
|
||||||
|
public List<Double> getDoubleList(String path);
|
||||||
|
public List<Double> getDoubleList(String path , List<Double> defaultValue);
|
||||||
|
|
||||||
|
// Integer (abbreviation)
|
||||||
|
public Integer getInt(String path);
|
||||||
|
public Integer getInt(String path, Integer defaultValue);
|
||||||
|
public List<Integer> getIntList(String path);
|
||||||
|
public List<Integer> getIntList(String path, List<Integer> defaultValue);
|
||||||
|
// Integer (full name)
|
||||||
|
public Integer getInteger(String path);
|
||||||
|
public Integer getInteger(String path, Integer defaultValue);
|
||||||
|
public List<Integer> getIntegerList(String path);
|
||||||
|
public List<Integer> getIntegerList(String path, List<Integer> defaultValue);
|
||||||
|
|
||||||
|
// String
|
||||||
|
public String getString(String path);
|
||||||
|
public String getString(String path, String defaultValue);
|
||||||
|
public List<String> getStringList(String path);
|
||||||
|
public List<String> getStringList(String path, List<String> defaultValue);
|
||||||
|
|
||||||
|
// Generic methods:
|
||||||
|
public Object get(String path);
|
||||||
|
public Object get(String path, Object defaultValue);
|
||||||
|
public Object getProperty(String path);
|
||||||
|
public Object getProperty(String path, Object defaultValue);
|
||||||
|
public void set(String path, Object value);
|
||||||
|
public void setProperty(String path, Object value);
|
||||||
|
public void remove(String path);
|
||||||
|
public void removeProperty(String path);
|
||||||
|
|
||||||
|
// Contains/has
|
||||||
|
public boolean hasEntry(String path);
|
||||||
|
public boolean contains(String path);
|
||||||
|
|
||||||
|
// Keys (Object): [possibly deprecated]
|
||||||
|
/**
|
||||||
|
* @deprecated Seems not to be supported anymore by new configuration, use getStringKeys(String path);
|
||||||
|
* @param path
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Object> getKeys(String path);
|
||||||
|
/**
|
||||||
|
* @deprecated Seems not to be supported anymore by new configuration, use getStringKeys();
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<Object> getKeys();
|
||||||
|
|
||||||
|
// Keys (String):
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return never null
|
||||||
|
*/
|
||||||
|
public List<String> getStringKeys();
|
||||||
|
|
||||||
|
public List<String> getStringKeys(String path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all keys from the section (deep or shallow).
|
||||||
|
* @param path
|
||||||
|
* @param deep
|
||||||
|
* @return Never null.
|
||||||
|
*/
|
||||||
|
public Set<String> getStringKeys(String path, boolean deep);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convenience method.
|
||||||
|
* @param path
|
||||||
|
* @return never null
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public Set<String> getStringKeysDeep(String path);
|
||||||
|
|
||||||
|
// Values:
|
||||||
|
/**
|
||||||
|
* Equivalent to new config: values(true)
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Map<String, Object> getValuesDeep();
|
||||||
|
|
||||||
|
// Technical / IO:
|
||||||
|
/**
|
||||||
|
* False if not supported.
|
||||||
|
* @param sep
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean setPathSeparatorChar(char sep);
|
||||||
|
|
||||||
|
public void load();
|
||||||
|
|
||||||
|
public boolean save();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,116 @@
|
|||||||
|
package me.asofold.bukkit.cncp.config.compatlayer;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ConfigUtil {
|
||||||
|
|
||||||
|
public static final int canaryInt = Integer.MIN_VALUE +7;
|
||||||
|
public static final long canaryLong = Long.MIN_VALUE + 7L;
|
||||||
|
public static final double canaryDouble = Double.MIN_VALUE*.7;
|
||||||
|
|
||||||
|
public static String stringPath( String path){
|
||||||
|
return stringPath(path, '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String stringPath( String path , char sep ){
|
||||||
|
String useSep = (sep=='.')?"\\.":""+sep;
|
||||||
|
String[] split = path.split(useSep);
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append(stringPart(split[0]));
|
||||||
|
for (int i = 1; i<split.length; i++){
|
||||||
|
builder.append(sep+stringPart(split[i]));
|
||||||
|
}
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aimed at numbers in paths.
|
||||||
|
* @param cfg
|
||||||
|
* @param path
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String bestPath(CompatConfig cfg, String path){
|
||||||
|
return bestPath(cfg, path, '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aimed at numbers in paths.
|
||||||
|
* @param cfg
|
||||||
|
* @param path
|
||||||
|
* @param sep
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String bestPath(CompatConfig cfg, String path, char sep){
|
||||||
|
String useSep = (sep=='.')?"\\.":""+sep;
|
||||||
|
String[] split = path.split(useSep);
|
||||||
|
String res;
|
||||||
|
if (cfg.hasEntry(split[0]) )res = split[0];
|
||||||
|
else{
|
||||||
|
res = stringPart(split[0]);
|
||||||
|
if ( !cfg.hasEntry(res)) return path;
|
||||||
|
}
|
||||||
|
for (int i = 1; i<split.length; i++){
|
||||||
|
if (cfg.hasEntry(res+sep+split[i]) ) res += sep+split[i];
|
||||||
|
else{
|
||||||
|
res += sep+stringPart(split[i]);
|
||||||
|
if ( !cfg.hasEntry(res)) return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String stringPart(String input){
|
||||||
|
try{
|
||||||
|
Double.parseDouble(input);
|
||||||
|
return "'"+input+"'";
|
||||||
|
} catch (NumberFormatException e){
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
Long.parseLong(input);
|
||||||
|
return "'"+input+"'";
|
||||||
|
} catch (NumberFormatException e){
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
Integer.parseInt(input);
|
||||||
|
return "'"+input+"'";
|
||||||
|
} catch (NumberFormatException e){
|
||||||
|
}
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean forceDefaults(CompatConfig defaults, CompatConfig config){
|
||||||
|
Map<String ,Object> all = defaults.getValuesDeep();
|
||||||
|
boolean changed = false;
|
||||||
|
for ( String path : all.keySet()){
|
||||||
|
if ( !config.hasEntry(path)){
|
||||||
|
config.setProperty(path, defaults.getProperty(path, null));
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add StringList entries to a set.
|
||||||
|
* @param cfg
|
||||||
|
* @param path
|
||||||
|
* @param set
|
||||||
|
* @param clear If to clear the set.
|
||||||
|
* @param trim
|
||||||
|
* @param lowerCase
|
||||||
|
*/
|
||||||
|
public static void readStringSetFromList(CompatConfig cfg, String path, Set<String> set, boolean clear, boolean trim, boolean lowerCase){
|
||||||
|
if (clear) set.clear();
|
||||||
|
List<String> tempList = cfg.getStringList(path , null);
|
||||||
|
if (tempList != null){
|
||||||
|
for (String entry : tempList){
|
||||||
|
if (trim) entry = entry.trim();
|
||||||
|
if (lowerCase) entry = entry.toLowerCase();
|
||||||
|
set.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package me.asofold.bukkit.cncp.config.compatlayer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.MemoryConfiguration;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
|
public class NewConfig extends AbstractNewConfig{
|
||||||
|
|
||||||
|
|
||||||
|
public NewConfig(File file) {
|
||||||
|
super(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load(){
|
||||||
|
config = new MemoryConfiguration();
|
||||||
|
setOptions(config);
|
||||||
|
FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
|
||||||
|
setOptions(cfg);
|
||||||
|
addAll(cfg, config);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean save(){
|
||||||
|
YamlConfiguration cfg = new YamlConfiguration();
|
||||||
|
setOptions(cfg);
|
||||||
|
addAll(config, cfg);
|
||||||
|
try{
|
||||||
|
cfg.save(file);
|
||||||
|
return true;
|
||||||
|
} catch (Throwable t){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> getValuesDeep() {
|
||||||
|
return config.getValues(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package me.asofold.bukkit.cncp.hooks;
|
||||||
|
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend this to make sure that future changes will not break your hooks.<br>
|
||||||
|
* Probable changes:<br>
|
||||||
|
* - Adding onReload method.
|
||||||
|
* @author mc_dev
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class AbstractHook implements Hook{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[][] getCheckSpec() {
|
||||||
|
// Handle all CheckEvents (improbable).
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Listener[] getListeners() {
|
||||||
|
// No listeners (improbable).
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
53
CompatNoCheatPlus/src/me/asofold/bukkit/cncp/hooks/Hook.java
Normal file
53
CompatNoCheatPlus/src/me/asofold/bukkit/cncp/hooks/Hook.java
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package me.asofold.bukkit.cncp.hooks;
|
||||||
|
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import fr.neatmonster.nocheatplus.checks.CheckEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for hooking into another plugin.<br>
|
||||||
|
*
|
||||||
|
* @author mc_dev
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface Hook{
|
||||||
|
/**
|
||||||
|
* Must not cause exceptions.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getHookName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Must not cause exceptions.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getHookVersion();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the specification for which checks to call this.<br>
|
||||||
|
* <hr>
|
||||||
|
* The return value should be an array of arrays, each of which specifies the group name and the check names within that group.<br>
|
||||||
|
* You can return null to register for ALL checks.<br>
|
||||||
|
* You can just register the group name to get all checks for that group.<br>
|
||||||
|
* <hr>
|
||||||
|
* Currently group and check names are processed with trim().toLowerCase() !
|
||||||
|
* @return (see description)
|
||||||
|
*/
|
||||||
|
public String[][] getCheckSpec();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get listener instances to be registered with cncp.
|
||||||
|
* @return null if unused.
|
||||||
|
*/
|
||||||
|
public Listener[] getListeners();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will only be called if the event has not yet been cancelled !<br>
|
||||||
|
* Cancel the event, and no further hooks will process this.
|
||||||
|
* @param group Name of check group
|
||||||
|
* @param check Name of check .
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
public void processEvent(final String group, final String check, final CheckEvent event);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,151 @@
|
|||||||
|
package me.asofold.bukkit.cncp.hooks.mcmmo;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import me.asofold.bukkit.cncp.hooks.AbstractHook;
|
||||||
|
import me.asofold.bukkit.cncp.utils.PluginGetter;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import com.gmail.nossr50.mcMMO;
|
||||||
|
import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
|
||||||
|
import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
|
||||||
|
import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
|
||||||
|
|
||||||
|
import fr.neatmonster.nocheatplus.checks.CheckEvent;
|
||||||
|
import fr.neatmonster.nocheatplus.players.NCPPlayer;
|
||||||
|
|
||||||
|
public final class HookmcMMO extends AbstractHook implements Listener {
|
||||||
|
|
||||||
|
private static final Map<String, Integer> cancelChecksBlockBreak = new HashMap<String, Integer>();
|
||||||
|
private static final Map<String, Integer> cancelChecksBlockDamage = new HashMap<String, Integer>();
|
||||||
|
private static final Map<String, Integer> cancelChecksDamage = new HashMap<String, Integer>();
|
||||||
|
static{
|
||||||
|
cancelChecksBlockBreak.put("fastbreak", 2);
|
||||||
|
cancelChecksBlockDamage.put("fastbreak", 1);
|
||||||
|
cancelChecksDamage.put("angle", 1);
|
||||||
|
cancelChecksDamage.put("speed", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private final PluginGetter<mcMMO> fetch = new PluginGetter<mcMMO>("mcMMO");
|
||||||
|
|
||||||
|
private String cancel = null;
|
||||||
|
private long cancelTicks = 0;
|
||||||
|
|
||||||
|
private final Map<String, Integer> cancelChecks = new HashMap<String, Integer>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getHookName() {
|
||||||
|
return "mcMMO(default)";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getHookVersion() {
|
||||||
|
return "0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[][] getCheckSpec() {
|
||||||
|
return new String[][]{
|
||||||
|
{"blockbreak", "fastbreak"},
|
||||||
|
{"fight", "angle", "speed"},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Listener[] getListeners() {
|
||||||
|
fetch.fetchPlugin();
|
||||||
|
return new Listener[]{this, fetch};
|
||||||
|
}
|
||||||
|
|
||||||
|
private final void setPlayer(final Entity entity, Map<String, Integer> cancelChecks){
|
||||||
|
if (entity instanceof Player){
|
||||||
|
setPlayer((Player) entity, cancelChecks);
|
||||||
|
}
|
||||||
|
// no projectiles etc.
|
||||||
|
}
|
||||||
|
|
||||||
|
private final void setPlayer(final Player player, Map<String, Integer> cancelChecks){
|
||||||
|
cancel = player.getName();
|
||||||
|
cancelTicks = player.getTicksLived();
|
||||||
|
this.cancelChecks.clear();
|
||||||
|
this.cancelChecks.putAll(cancelChecks);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.LOWEST)
|
||||||
|
final void onDamageLowest(final FakeEntityDamageByEntityEvent event){
|
||||||
|
// TODO might change with API
|
||||||
|
setPlayer(event.getDamager(), cancelChecksDamage);
|
||||||
|
// System.out.println("Damage: "+cancel +" / "+event.getEntity().getLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
// @EventHandler(priority=EventPriority.MONITOR)
|
||||||
|
// final void onDamageMonitor(final FakeEntityDamageByEntityEvent event){
|
||||||
|
// cancel = null;
|
||||||
|
// }
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.LOWEST)
|
||||||
|
final void onBlockBreakLowest(final FakeBlockBreakEvent event){
|
||||||
|
setPlayer(event.getPlayer(), cancelChecksBlockBreak);
|
||||||
|
// System.out.println("BlockBreak: "+cancel + " / " + event.getBlock());
|
||||||
|
}
|
||||||
|
|
||||||
|
// @EventHandler(priority=EventPriority.MONITOR)
|
||||||
|
// final void onBlockBreakMonitor(final FakeBlockBreakEvent event){
|
||||||
|
// cancel = null;
|
||||||
|
// }
|
||||||
|
|
||||||
|
@EventHandler(priority=EventPriority.LOWEST)
|
||||||
|
final void onBlockDamageLowest(final FakeBlockDamageEvent event){
|
||||||
|
setPlayer(event.getPlayer(), cancelChecksBlockDamage);
|
||||||
|
// System.out.println("BlockDamage: "+cancel + " / insta=" + event.getInstaBreak() + "/" + event.getBlock());
|
||||||
|
}
|
||||||
|
|
||||||
|
// @EventHandler(priority=EventPriority.MONITOR)
|
||||||
|
// final void onBlockDamageMonitor(final FakeBlockDamageEvent event){
|
||||||
|
// cancel = null;
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processEvent(final String group, final String check, final CheckEvent event) {
|
||||||
|
// System.out.println("[cncp] Handle event: " + event.getEventName());
|
||||||
|
if (cancel == null){
|
||||||
|
// System.out.println("[cncp] Return on cancel == null: "+event.getPlayer().getName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final NCPPlayer ncpPlayer = event.getPlayer();
|
||||||
|
|
||||||
|
final String name = ncpPlayer.getName();
|
||||||
|
if (cancel.equals(name)){
|
||||||
|
final Player player = ncpPlayer.getBukkitPlayer();
|
||||||
|
if (player == null || player.getTicksLived() != cancelTicks){
|
||||||
|
// System.out.println("[cncp] No cancel (ticks/player): "+event.getPlayer().getName());
|
||||||
|
cancel = null;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
final Integer n = cancelChecks.get(check);
|
||||||
|
if (n == null){
|
||||||
|
// System.out.println("[cncp] Expired("+check+"): "+event.getPlayer().getName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (n > 0){
|
||||||
|
// System.out.println("Check with n = "+n);
|
||||||
|
if (n == 1) cancelChecks.remove(check);
|
||||||
|
else cancelChecks.put(check, n - 1);
|
||||||
|
}
|
||||||
|
// else: allow arbitrary numbers
|
||||||
|
// System.out.println("[cncp] Cancel: "+event.getPlayer().getName());
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package me.asofold.bukkit.cncp.setttings;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import me.asofold.bukkit.cncp.hooks.Hook;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check group specific lists of hooks.
|
||||||
|
* @author mc_dev
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public final class GroupHooks {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hooks that want all.
|
||||||
|
*/
|
||||||
|
public final ArrayList<Hook> all = new ArrayList<Hook>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hooks that want a certain check.<br>
|
||||||
|
*/
|
||||||
|
public final Map<String , ArrayList<Hook>> byCheck = new HashMap<String, ArrayList<Hook>>(10);
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package me.asofold.bukkit.cncp.setttings;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import me.asofold.bukkit.cncp.config.compatlayer.CompatConfig;
|
||||||
|
import me.asofold.bukkit.cncp.config.compatlayer.ConfigUtil;
|
||||||
|
import me.asofold.bukkit.cncp.config.compatlayer.NewConfig;
|
||||||
|
|
||||||
|
public class Settings {
|
||||||
|
public Set<String> forceEnableLater = new HashSet<String>();
|
||||||
|
|
||||||
|
|
||||||
|
public static CompatConfig getDefaultConfig(){
|
||||||
|
CompatConfig cfg = new NewConfig(null);
|
||||||
|
List<String> tempList = new LinkedList<String>();
|
||||||
|
tempList.add("NoCheatPlus");
|
||||||
|
cfg.set("plugins.force-enable-later", tempList);
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean addDefaults(CompatConfig cfg){
|
||||||
|
return ConfigUtil.forceDefaults(getDefaultConfig(), cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean fromConfig(CompatConfig cfg){
|
||||||
|
// plugins to force enabling after this plugin.
|
||||||
|
ConfigUtil.readStringSetFromList(cfg, "plugins.force-enable-later", forceEnableLater, true, true, false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
forceEnableLater.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
package me.asofold.bukkit.cncp.utils;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.server.PluginEnableEvent;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple plugin fetching.
|
||||||
|
* @author mc_dev
|
||||||
|
*
|
||||||
|
* @param <T>
|
||||||
|
*/
|
||||||
|
public final class PluginGetter<T extends Plugin> implements Listener{
|
||||||
|
private T plugin = null;
|
||||||
|
private final String pluginName;
|
||||||
|
public PluginGetter(final String pluginName){
|
||||||
|
this.pluginName = pluginName;
|
||||||
|
fetchPlugin();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch from Bukkit and set , might set to null, though.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public final void fetchPlugin() {
|
||||||
|
final Plugin ref = Bukkit.getPluginManager().getPlugin(pluginName);
|
||||||
|
plugin = (T) ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
final void onPluginEnable(final PluginEnableEvent event){
|
||||||
|
final Plugin ref = event.getPlugin();
|
||||||
|
if (plugin.getName().equals(pluginName)) plugin = (T) ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For convenience with chaining: getX = new PluginGetter<X>("X").registerEvents(this);
|
||||||
|
* @param other
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public final PluginGetter<T> registerEvents(final Plugin other){
|
||||||
|
Bukkit.getPluginManager().registerEvents(this, plugin);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final T getPlugin(){
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package me.asofold.bukkit.cncp.utils;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
public class Utils {
|
||||||
|
|
||||||
|
public static final String toString(final Throwable t) {
|
||||||
|
final Writer buf = new StringWriter(500);
|
||||||
|
final PrintWriter writer = new PrintWriter(buf);
|
||||||
|
t.printStackTrace(writer);
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user