1
0
mirror of https://e.coding.net/circlecloud/Residence.git synced 2025-11-26 22:06:07 +00:00

clean up and update...

This commit is contained in:
502647092
2015-09-23 20:55:27 +08:00
parent b8b86f4de9
commit f0db5f19ee
6 changed files with 1005 additions and 1050 deletions

View File

@@ -24,6 +24,8 @@ import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -32,10 +34,16 @@ import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import com.bekvon.bukkit.residence.chat.ChatManager; import com.bekvon.bukkit.residence.chat.ChatManager;
import com.bekvon.bukkit.residence.commandmain.CommandRc;
import com.bekvon.bukkit.residence.commandmain.CommandRes;
import com.bekvon.bukkit.residence.commandmain.CommandResLoad;
import com.bekvon.bukkit.residence.commandmain.CommandResReload;
import com.bekvon.bukkit.residence.commandmain.CommandResWorld;
import com.bekvon.bukkit.residence.economy.EconomyInterface; import com.bekvon.bukkit.residence.economy.EconomyInterface;
import com.bekvon.bukkit.residence.economy.EssentialsEcoAdapter; import com.bekvon.bukkit.residence.economy.EssentialsEcoAdapter;
import com.bekvon.bukkit.residence.economy.TransactionManager; import com.bekvon.bukkit.residence.economy.TransactionManager;
import com.bekvon.bukkit.residence.economy.rent.RentManager; import com.bekvon.bukkit.residence.economy.rent.RentManager;
import com.bekvon.bukkit.residence.event.ResidenceCommandEvent;
import com.bekvon.bukkit.residence.itemlist.WorldItemManager; import com.bekvon.bukkit.residence.itemlist.WorldItemManager;
import com.bekvon.bukkit.residence.listeners.ResidenceBlockListener; import com.bekvon.bukkit.residence.listeners.ResidenceBlockListener;
import com.bekvon.bukkit.residence.listeners.ResidenceEntityListener; import com.bekvon.bukkit.residence.listeners.ResidenceEntityListener;
@@ -49,6 +57,11 @@ import com.bekvon.bukkit.residence.protection.LeaseManager;
import com.bekvon.bukkit.residence.protection.PermissionListManager; import com.bekvon.bukkit.residence.protection.PermissionListManager;
import com.bekvon.bukkit.residence.protection.ResidenceManager; import com.bekvon.bukkit.residence.protection.ResidenceManager;
import com.bekvon.bukkit.residence.protection.WorldFlagManager; import com.bekvon.bukkit.residence.protection.WorldFlagManager;
import com.bekvon.bukkit.residence.runnable.AutoSaveTask;
import com.bekvon.bukkit.residence.runnable.HealTask;
import com.bekvon.bukkit.residence.runnable.LeaseTask;
import com.bekvon.bukkit.residence.runnable.RentTask;
import com.bekvon.bukkit.residence.runnable.TaskManager;
import com.bekvon.bukkit.residence.selection.SelectionManager; import com.bekvon.bukkit.residence.selection.SelectionManager;
import com.bekvon.bukkit.residence.selection.WorldEditSelectionManager; import com.bekvon.bukkit.residence.selection.WorldEditSelectionManager;
import com.bekvon.bukkit.residence.text.Language; import com.bekvon.bukkit.residence.text.Language;
@@ -58,6 +71,7 @@ import com.bekvon.bukkit.residence.utils.DataBackup;
import com.bekvon.bukkit.residence.vaultinterface.ResidenceVaultAdapter; import com.bekvon.bukkit.residence.vaultinterface.ResidenceVaultAdapter;
import com.earth2me.essentials.Essentials; import com.earth2me.essentials.Essentials;
import cn.citycraft.PluginHelper.commands.HandlerMainCommand;
import cn.citycraft.PluginHelper.config.FileConfig; import cn.citycraft.PluginHelper.config.FileConfig;
import cn.citycraft.PluginHelper.utils.VersionChecker; import cn.citycraft.PluginHelper.utils.VersionChecker;
@@ -69,10 +83,13 @@ import cn.citycraft.PluginHelper.utils.VersionChecker;
public class Residence extends JavaPlugin { public class Residence extends JavaPlugin {
public static float bukkitver; public static float bukkitver;
protected static ResidenceManager rmanager; protected static ResidenceManager rmanager;
protected static SelectionManager smanager; protected static SelectionManager smanager;
protected static PermissionManager gmanager; protected static PermissionManager gmanager;
protected static ConfigManager cmanager; protected static ConfigManager cmanager;
protected static FlagManager fmanager;
protected static TaskManager taskmanager;
protected static ResidenceBlockListener blistener; protected static ResidenceBlockListener blistener;
protected static ResidencePlayerListener plistener; protected static ResidencePlayerListener plistener;
protected static ResidenceEntityListener elistener; protected static ResidenceEntityListener elistener;
@@ -85,7 +102,7 @@ public class Residence extends JavaPlugin {
protected static RentManager rentmanager; protected static RentManager rentmanager;
protected static ChatManager chatmanager; protected static ChatManager chatmanager;
protected static Server server; protected static Server server;
protected static HelpEntry helppages; public static HelpEntry helppages;
protected static Language language; protected static Language language;
protected static Logger log; protected static Logger log;
protected static boolean useWorldEdit; protected static boolean useWorldEdit;
@@ -96,37 +113,16 @@ public class Residence extends JavaPlugin {
protected static int rentBukkitId = -1; protected static int rentBukkitId = -1;
protected static int healBukkitId = -1; protected static int healBukkitId = -1;
protected static int autosaveBukkitId = -1; protected static int autosaveBukkitId = -1;
protected static boolean initsuccess = false;
protected static List<String> resadminToggle; protected static List<String> resadminToggle;
protected static FileConfig config; protected static FileConfig config;
private final static String[] validLanguages = { "English", "Chinese" }; private final static String[] validLanguages = { "English", "Chinese" };
public static boolean initsuccess;
protected HandlerMainCommand hdmcnd;
protected boolean firstenable = true; protected boolean firstenable = true;
protected Map<String, String> deleteConfirm; public Map<String, String> deleteConfirm;
private Runnable doHeals = () -> plistener.doHeals();
private Runnable rentExpire = () -> {
rentmanager.checkCurrentRents();
if (cmanager.showIntervalMessages())
getLog().info(" - Rent Expirations checked!");
};
private Runnable leaseExpire = () -> {
leasemanager.doExpirations();
if (cmanager.showIntervalMessages())
getLog().info(" - Lease Expirations checked!");
};
private Runnable autoSave = () -> {
try {
if (initsuccess)
saveYml();
} catch (Exception ex) {
getLog().warning("领地数据保存错误,可能造成部分领地丢失,请尝试恢复备份文件!");
}
};
public Residence() { public Residence() {
} }
@@ -282,6 +278,71 @@ public class Residence extends JavaPlugin {
language = Language.parseText(langconfig, "Language"); language = Language.parseText(langconfig, "Language");
} }
@SuppressWarnings("unchecked")
public boolean loadYml() throws Exception {
File saveFolder = new File(dataFolder, "Save");
try {
File worldFolder = new File(saveFolder, "Worlds");
if (!saveFolder.isDirectory()) {
this.getLogger().warning("领地数据保存目录不存在...");
this.getLogger().warning("请重新启动服务器生成新的文件...");
return true;
}
YMLSaveHelper yml;
File loadFile;
long time = System.currentTimeMillis();
HashMap<String, Object> worlds = new HashMap<String, Object>();
for (World world : server.getWorlds()) {
loadFile = new File(worldFolder, "res_" + world.getName() + ".yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
worlds.put(world.getName(), yml.getRoot().get("Residences"));
}
}
rmanager = ResidenceManager.load(worlds);
loadFile = new File(saveFolder, "forsale.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
tmanager = TransactionManager.load((Map<?, ?>) yml.getRoot().get("Economy"), gmanager, rmanager);
}
loadFile = new File(saveFolder, "leases.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
leasemanager = LeaseManager.load((Map<String, Long>) yml.getRoot().get("Leases"), rmanager);
}
loadFile = new File(saveFolder, "permlists.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
pmanager = PermissionListManager.load((Map<String, Object>) yml.getRoot().get("PermissionLists"));
}
loadFile = new File(saveFolder, "rent.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
rentmanager = RentManager.load((Map<String, Object>) yml.getRoot().get("RentSystem"));
}
this.getLogger().info("从配置文件中读取领地数据,耗时" + ((float) (System.currentTimeMillis() - time) / 1000) + " 秒)");
return true;
} catch (Exception ex) {
this.getLogger().warning("领地数据载入时发生错误,请报告以下内容给作者: ");
this.getLogger().warning("错误: " + ex);
throw ex;
}
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
ResidenceCommandEvent cevent = new ResidenceCommandEvent(command.getName(), args, sender);
server.getPluginManager().callEvent(cevent);
if (cevent.isCancelled())
return true;
return hdmcnd.onCommand(sender, command, label, args);
}
@Override @Override
public void onDisable() { public void onDisable() {
server.getScheduler().cancelTask(autosaveBukkitId); server.getScheduler().cancelTask(autosaveBukkitId);
@@ -325,6 +386,7 @@ public class Residence extends JavaPlugin {
gmanager = new PermissionManager(this.getConfig()); gmanager = new PermissionManager(this.getConfig());
imanager = new WorldItemManager(this.getConfig()); imanager = new WorldItemManager(this.getConfig());
wmanager = new WorldFlagManager(this.getConfig()); wmanager = new WorldFlagManager(this.getConfig());
chatmanager = new ChatManager(); chatmanager = new ChatManager();
rentmanager = new RentManager(); rentmanager = new RentManager();
for (String lang : validLanguages) for (String lang : validLanguages)
@@ -378,6 +440,8 @@ public class Residence extends JavaPlugin {
tmanager = new TransactionManager(rmanager, gmanager); tmanager = new TransactionManager(rmanager, gmanager);
if (pmanager == null) if (pmanager == null)
pmanager = new PermissionListManager(); pmanager = new PermissionListManager();
if (taskmanager == null)
taskmanager = new TaskManager(this);
if (firstenable) { if (firstenable) {
if (!this.isEnabled()) if (!this.isEnabled())
return; return;
@@ -403,28 +467,35 @@ public class Residence extends JavaPlugin {
if (is1_8()) if (is1_8())
pm.registerEvents(plistener1_8, this); pm.registerEvents(plistener1_8, this);
pm.registerEvents(elistener, this); pm.registerEvents(elistener, this);
firstenable = false; firstenable = false;
} else } else
plistener.reload(); plistener.reload();
fmanager = new FlagManager(this);
fmanager.init();
taskmanager.add(server.getScheduler().runTaskTimer(this, new HealTask(), 20, 20));
HandlerMainCommand hdmcnd = new HandlerMainCommand(this);
hdmcnd.registerCommand(new CommandRc(this));
hdmcnd.registerCommand(new CommandRes(this));
hdmcnd.registerCommand(new CommandResLoad(this));
hdmcnd.registerCommand(new CommandResReload(this));
hdmcnd.registerCommand(new CommandResWorld(this));
int autosaveInt = cmanager.getAutoSaveInterval(); int autosaveInt = cmanager.getAutoSaveInterval();
if (autosaveInt < 1) autosaveInt = autosaveInt < 1 ? 1 : autosaveInt * 60 * 20;
autosaveInt = 1; taskmanager.add(server.getScheduler().runTaskTimer(this, new AutoSaveTask(this), autosaveInt, autosaveInt));
autosaveInt = autosaveInt * 60 * 20;
autosaveBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, autoSave, autosaveInt, autosaveInt);
healBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, doHeals, 20, 20);
if (cmanager.useLeases()) { if (cmanager.useLeases()) {
int leaseInterval = cmanager.getLeaseCheckInterval(); int leaseInterval = cmanager.getLeaseCheckInterval();
if (leaseInterval < 1) leaseInterval = leaseInterval < 1 ? 1 : leaseInterval * 60 * 20;
leaseInterval = 1; taskmanager.add(server.getScheduler().runTaskTimer(this, new LeaseTask(), leaseInterval, leaseInterval));
leaseInterval = leaseInterval * 60 * 20;
leaseBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, leaseExpire, leaseInterval, leaseInterval);
} }
if (cmanager.enabledRentSystem()) { if (cmanager.enabledRentSystem()) {
int rentint = cmanager.getRentCheckInterval(); int rentint = cmanager.getRentCheckInterval();
if (rentint < 1) rentint = rentint < 1 ? 1 : rentint * 60 * 20;
rentint = 1; taskmanager.add(server.getScheduler().runTaskTimer(this, new RentTask(), rentint, rentint));
rentint = rentint * 60 * 20;
rentBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, rentExpire, rentint, rentint);
} }
for (Player player : Bukkit.getServer().getOnlinePlayers()) for (Player player : Bukkit.getServer().getOnlinePlayers())
if (Residence.getPermissionManager().isResidenceAdmin(player)) if (Residence.getPermissionManager().isResidenceAdmin(player))
@@ -448,12 +519,12 @@ public class Residence extends JavaPlugin {
@Override @Override
public void reloadConfig() { public void reloadConfig() {
config.reload(); config.reload();
} };
public void reloadPlugin() { public void reloadPlugin() {
this.onDisable(); PluginManager pm = server.getPluginManager();
this.reloadConfig(); pm.disablePlugin(this);
this.onEnable(); pm.enablePlugin(this);
} }
@Override @Override
@@ -461,49 +532,7 @@ public class Residence extends JavaPlugin {
config.save(); config.save();
} }
private boolean checkNewLanguageVersion(String lang) throws IOException, FileNotFoundException, InvalidConfigurationException { public void saveYml() throws IOException {
File outFile = new File(new File(this.getDataFolder(), "Language"), lang + ".yml");
File checkFile = new File(new File(this.getDataFolder(), "Language"), "temp-" + lang + ".yml");
if (outFile.isFile()) {
FileConfig testconfig = new FileConfig(this, outFile);
int oldversion = testconfig.getInt("FieldsVersion", 0);
if (!this.writeDefaultFileFromJar(checkFile, "languagefiles/" + lang + ".yml", false))
return false;
FileConfig testconfig2 = new FileConfig(this, checkFile);
testconfig2.load(checkFile);
int newversion = testconfig2.getInt("FieldsVersion", oldversion);
if (checkFile.isFile())
checkFile.delete();
if (newversion > oldversion)
return true;
return false;
}
return true;
};
private void loadEssentialsEconomy() {
Plugin p = getServer().getPluginManager().getPlugin("Essentials");
if (p != null) {
economy = new EssentialsEcoAdapter((Essentials) p);
this.getLogger().info("成功关联Essentials Economy!");
} else
this.getLogger().info("Essentials Economy 未找到!");
}
private void loadVaultEconomy() {
Plugin p = getServer().getPluginManager().getPlugin("Vault");
if (p != null) {
ResidenceVaultAdapter vault = new ResidenceVaultAdapter(getServer());
if (vault.economyOK()) {
this.getLogger().info("发现 Vault 使用经济系统: " + vault.getEconomyName());
economy = vault;
} else
this.getLogger().info("发现 Vault, 但是 Vault 未找到经济系统...");
} else
this.getLogger().info("Vault 未找到!");
}
private void saveYml() throws IOException {
File saveFolder = new File(dataFolder, "Save"); File saveFolder = new File(dataFolder, "Save");
File worldFolder = new File(saveFolder, "Worlds"); File worldFolder = new File(saveFolder, "Worlds");
worldFolder.mkdirs(); worldFolder.mkdirs();
@@ -604,6 +633,48 @@ public class Residence extends JavaPlugin {
this.getLogger().info(" - 保存插件数据..."); this.getLogger().info(" - 保存插件数据...");
} }
private boolean checkNewLanguageVersion(String lang) throws IOException, FileNotFoundException, InvalidConfigurationException {
File outFile = new File(new File(this.getDataFolder(), "Language"), lang + ".yml");
File checkFile = new File(new File(this.getDataFolder(), "Language"), "temp-" + lang + ".yml");
if (outFile.isFile()) {
FileConfig testconfig = new FileConfig(this, outFile);
int oldversion = testconfig.getInt("FieldsVersion", 0);
if (!this.writeDefaultFileFromJar(checkFile, "languagefiles/" + lang + ".yml", false))
return false;
FileConfig testconfig2 = new FileConfig(this, checkFile);
testconfig2.load(checkFile);
int newversion = testconfig2.getInt("FieldsVersion", oldversion);
if (checkFile.isFile())
checkFile.delete();
if (newversion > oldversion)
return true;
return false;
}
return true;
}
private void loadEssentialsEconomy() {
Plugin p = getServer().getPluginManager().getPlugin("Essentials");
if (p != null) {
economy = new EssentialsEcoAdapter((Essentials) p);
this.getLogger().info("成功关联Essentials Economy!");
} else
this.getLogger().info("Essentials Economy 未找到!");
}
private void loadVaultEconomy() {
Plugin p = getServer().getPluginManager().getPlugin("Vault");
if (p != null) {
ResidenceVaultAdapter vault = new ResidenceVaultAdapter(getServer());
if (vault.economyOK()) {
this.getLogger().info("发现 Vault 使用经济系统: " + vault.getEconomyName());
economy = vault;
} else
this.getLogger().info("发现 Vault, 但是 Vault 未找到经济系统...");
} else
this.getLogger().info("Vault 未找到!");
}
@SuppressWarnings("resource") @SuppressWarnings("resource")
private boolean writeDefaultFileFromJar(File writeName, String jarPath, boolean backupOld) { private boolean writeDefaultFileFromJar(File writeName, String jarPath, boolean backupOld) {
try { try {
@@ -648,61 +719,4 @@ public class Residence extends JavaPlugin {
if (this.writeDefaultFileFromJar(outFile, "languagefiles/" + lang + ".yml", true)) if (this.writeDefaultFileFromJar(outFile, "languagefiles/" + lang + ".yml", true))
this.getLogger().info("保存默认 " + lang + " 语言文件..."); this.getLogger().info("保存默认 " + lang + " 语言文件...");
} }
@SuppressWarnings("unchecked")
protected boolean loadYml() throws Exception {
File saveFolder = new File(dataFolder, "Save");
try {
File worldFolder = new File(saveFolder, "Worlds");
if (!saveFolder.isDirectory()) {
this.getLogger().warning("领地数据保存目录不存在...");
this.getLogger().warning("请重新启动服务器生成新的文件...");
return true;
}
YMLSaveHelper yml;
File loadFile;
long time = System.currentTimeMillis();
HashMap<String, Object> worlds = new HashMap<String, Object>();
for (World world : server.getWorlds()) {
loadFile = new File(worldFolder, "res_" + world.getName() + ".yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
worlds.put(world.getName(), yml.getRoot().get("Residences"));
}
}
rmanager = ResidenceManager.load(worlds);
loadFile = new File(saveFolder, "forsale.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
tmanager = TransactionManager.load((Map<?, ?>) yml.getRoot().get("Economy"), gmanager, rmanager);
}
loadFile = new File(saveFolder, "leases.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
leasemanager = LeaseManager.load((Map<String, Long>) yml.getRoot().get("Leases"), rmanager);
}
loadFile = new File(saveFolder, "permlists.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
pmanager = PermissionListManager.load((Map<String, Object>) yml.getRoot().get("PermissionLists"));
}
loadFile = new File(saveFolder, "rent.yml");
if (loadFile.isFile()) {
yml = new YMLSaveHelper(loadFile);
yml.load();
rentmanager = RentManager.load((Map<String, Object>) yml.getRoot().get("RentSystem"));
}
this.getLogger().info("从配置文件中读取领地数据,耗时" + ((float) (System.currentTimeMillis() - time) / 1000) + " 秒)");
// System.out.print("[Residence] Loaded...");
return true;
} catch (Exception ex) {
this.getLogger().warning("领地数据载入时发生错误,请报告以下内容给作者: ");
this.getLogger().warning("错误: " + ex);
throw ex;
}
}
} }

View File

@@ -3,7 +3,6 @@
*/ */
package com.bekvon.bukkit.residence; package com.bekvon.bukkit.residence;
import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -13,11 +12,8 @@ import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.bekvon.bukkit.residence.chat.ChatChannel;
import com.bekvon.bukkit.residence.event.ResidenceCommandEvent;
import com.bekvon.bukkit.residence.permissions.PermissionGroup; import com.bekvon.bukkit.residence.permissions.PermissionGroup;
import com.bekvon.bukkit.residence.protection.ClaimedResidence; import com.bekvon.bukkit.residence.protection.ClaimedResidence;
import com.bekvon.bukkit.residence.protection.CuboidArea; import com.bekvon.bukkit.residence.protection.CuboidArea;
@@ -26,183 +22,82 @@ import com.sk89q.worldedit.bukkit.WorldEditPlugin;
public class ResidenceCommandListener extends Residence { public class ResidenceCommandListener extends Residence {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
ResidenceCommandEvent cevent = new ResidenceCommandEvent(command.getName(), args, sender);
server.getPluginManager().callEvent(cevent);
if (cevent.isCancelled())
return true;
if (command.getName().equals("resreload") && args.length == 0) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (Residence.getPermissionManager().isResidenceAdmin(player)) {
this.reloadPlugin();
sender.sendMessage(ChatColor.GREEN + "[Residence] 重载配置文件.");
System.out.println("[Residence] 重载 by " + player.getName() + ".");
}
} else {
this.reloadPlugin();
System.out.println("[Residence] 重载 by 控制台.");
}
return true;
}
if (command.getName().equals("resload")) {
if (!(sender instanceof Player) || sender instanceof Player && gmanager.isResidenceAdmin((Player) sender))
try {
this.loadYml();
sender.sendMessage(ChatColor.GREEN + "[Residence] 从配置保存文件重新载入数据...");
} catch (Exception ex) {
sender.sendMessage(ChatColor.RED + "[Residence] 无法从配置保存文件重新载入数据, 请查看控制台异常信息!");
sender.sendMessage(ChatColor.RED + "[Residence] 异常: " + ex.getMessage());
Logger.getLogger(Residence.class.getName()).log(Level.SEVERE, null, ex);
}
return true;
} else if (command.getName().equals("resworld")) {
if (args.length == 2 && args[0].equalsIgnoreCase("remove"))
if (sender instanceof ConsoleCommandSender) {
rmanager.removeAllFromWorld(sender, args[1]);
return true;
} else
sender.sendMessage(ChatColor.RED + "当前命令必须从控制台执行.");
return false;
} else if (command.getName().equals("rc")) {
if (sender instanceof Player) {
Player player = (Player) sender;
String pname = player.getName();
if (cmanager.chatEnabled()) {
if (args.length == 0)
plistener.tooglePlayerResidenceChat(player);
else {
String area = plistener.getCurrentResidenceName(pname);
if (area != null) {
ChatChannel channel = chatmanager.getChannel(area);
if (channel != null) {
String message = "";
for (String arg : args)
message = message + " " + arg;
channel.chat(pname, message);
} else
player.sendMessage(ChatColor.RED + language.getPhrase("InvalidChannel"));
} else
player.sendMessage(ChatColor.RED + language.getPhrase("NotInResidence"));
}
} else
player.sendMessage(ChatColor.RED + language.getPhrase("ChatDisabled"));
}
return true;
} else if (command.getName().equals("res") || command.getName().equals("residence") || command.getName().equals("resadmin")) {
boolean resadmin = false;
if (sender instanceof Player) {
if (command.getName().equals("resadmin") && gmanager.isResidenceAdmin((Player) sender))
resadmin = true;
if (command.getName().equals("resadmin") && !gmanager.isResidenceAdmin((Player) sender)) {
((Player) sender).sendMessage(ChatColor.RED + language.getPhrase("NonAdmin"));
return true;
}
} else
resadmin = true;
return commandRes(args, resadmin, command, sender);
}
return super.onCommand(sender, command, label, args);
}
private boolean commandHelp(String[] args, boolean resadmin, CommandSender sender) {
if (helppages != null) {
String helppath = "res";
for (String arg : args) {
if (arg.equalsIgnoreCase("?"))
break;
helppath = helppath + "." + arg;
}
int page = 1;
if (!args[args.length - 1].equalsIgnoreCase("?"))
try {
page = Integer.parseInt(args[args.length - 1]);
} catch (Exception ex) {
sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidHelp"));
}
if (helppages.containesEntry(helppath)) {
helppages.printHelp(sender, page, helppath);
return true;
}
}
return false;
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private boolean commandRes(String[] args, boolean resadmin, Command command, CommandSender sender) { public boolean commandRes(String[] args, boolean resadmin, Command command, CommandSender sender) {
if (args.length > 0 && args[args.length - 1].equalsIgnoreCase("?") || args.length > 1 && args[args.length - 2].equals("?")) // if (args.length > 0 && args[args.length - 1].equalsIgnoreCase("?") || args.length > 1 && args[args.length - 2].equals("?"))
return commandHelp(args, resadmin, sender); // return commandHelp(args, resadmin, sender);
int page = 1; int page = 1;
try { // try {
if (args.length > 0) // if (args.length > 0)
page = Integer.parseInt(args[args.length - 1]); // page = Integer.parseInt(args[args.length - 1]);
} catch (Exception ex) { // } catch (Exception ex) {
} // }
Player player = null; Player player = (Player) sender;
PermissionGroup group = null; PermissionGroup group = null;
String pname = null; String pname = null;
if (sender instanceof Player) { // if (sender instanceof Player) {
player = (Player) sender; // player = (Player) sender;
group = Residence.getPermissionManager().getGroup(player); // group = Residence.getPermissionManager().getGroup(player);
pname = player.getName(); // pname = player.getName();
} else // } else
resadmin = true; // resadmin = true;
if (cmanager.allowAdminsOnly()) // if (cmanager.allowAdminsOnly())
if (!resadmin) { // if (!resadmin) {
sender.sendMessage(ChatColor.RED + language.getPhrase("AdminOnly")); // sender.sendMessage(ChatColor.RED + language.getPhrase("AdminOnly"));
return true; // return true;
} // }
if (args.length == 0) // if (args.length == 0)
return false; // return false;
if (args.length == 0) { // if (args.length == 0) {
args = new String[1]; // args = new String[1];
args[0] = "?"; // args[0] = "?";
} // }
String cmd = args[0].toLowerCase(); String cmd = args[0].toLowerCase();
if (cmd.equals("remove") || cmd.equals("delete"))
return commandResRemove(args, resadmin, sender, page); // if (cmd.equals("remove") || cmd.equals("delete"))
if (cmd.equals("confirm")) // return commandResRemove(args, resadmin, sender, page);
return commandResConfirm(args, resadmin, sender, page); // if (cmd.equals("confirm"))
if (cmd.equals("version")) { // return commandResConfirm(args, resadmin, sender, page);
sender.sendMessage(ChatColor.GRAY + "------------------------------------"); // if (cmd.equals("version")) {
sender.sendMessage(ChatColor.RED + "当前服务器运行的 " + ChatColor.GOLD + "Residence" + ChatColor.RED + " 版本: " + ChatColor.BLUE + this.getDescription().getVersion()); // sender.sendMessage(ChatColor.GRAY + "------------------------------------");
sender.sendMessage(ChatColor.GREEN + "创建者: " + ChatColor.YELLOW + "bekvon"); // sender.sendMessage(ChatColor.RED + "当前服务器运行的 " + ChatColor.GOLD + "Residence" + ChatColor.RED + " 版本: " + ChatColor.BLUE + this.getDescription().getVersion());
sender.sendMessage(ChatColor.GREEN + "升级到 1.8 by: " + ChatColor.YELLOW + "DartCZ"); // sender.sendMessage(ChatColor.GREEN + "创建者: " + ChatColor.YELLOW + "bekvon");
sender.sendMessage(ChatColor.RED + "升级到最新无UUID版本 by: " + ChatColor.YELLOW + "喵♂呜"); // sender.sendMessage(ChatColor.GREEN + "升级到 1.8 by: " + ChatColor.YELLOW + "DartCZ");
String names = null; // sender.sendMessage(ChatColor.RED + "升级到最新无UUID版本 by: " + ChatColor.YELLOW + "喵♂呜");
List<String> authlist = this.getDescription().getAuthors(); // String names = null;
for (String auth : authlist) // List<String> authlist = this.getDescription().getAuthors();
if (names == null) // for (String auth : authlist)
names = auth; // if (names == null)
else // names = auth;
names = names + ", " + auth; // else
sender.sendMessage(ChatColor.GREEN + "作者: " + ChatColor.YELLOW + names); // names = names + ", " + auth;
sender.sendMessage(ChatColor.DARK_AQUA + "插件命令列表,帮助, 请查看wiki:"); // sender.sendMessage(ChatColor.GREEN + "作者: " + ChatColor.YELLOW + names);
sender.sendMessage(ChatColor.GREEN + "http://residencebukkitmod.wikispaces.com/"); // sender.sendMessage(ChatColor.DARK_AQUA + "插件命令列表,帮助, 请查看wiki:");
sender.sendMessage(ChatColor.AQUA + "重制版本请查看Jenkins:"); // sender.sendMessage(ChatColor.GREEN + "http://residencebukkitmod.wikispaces.com/");
sender.sendMessage(ChatColor.BLUE + this.getDescription().getWebsite()); // sender.sendMessage(ChatColor.AQUA + "重制版本请查看Jenkins:");
sender.sendMessage(ChatColor.GRAY + "------------------------------------"); // sender.sendMessage(ChatColor.BLUE + this.getDescription().getWebsite());
return true; // sender.sendMessage(ChatColor.GRAY + "------------------------------------");
} // return true;
if (cmd.equals("setowner") && args.length == 3) { // }
if (!resadmin) { // if (cmd.equals("setowner") && args.length == 3) {
sender.sendMessage(ChatColor.RED + language.getPhrase("NoPermission")); // if (!resadmin) {
return true; // sender.sendMessage(ChatColor.RED + language.getPhrase("NoPermission"));
} // return true;
ClaimedResidence area = rmanager.getByName(args[1]); // }
if (area != null) { // ClaimedResidence area = rmanager.getByName(args[1]);
area.getPermissions().setOwner(args[2], true); // if (area != null) {
if (area.getParent() == null) // area.getPermissions().setOwner(args[2], true);
sender.sendMessage(ChatColor.GREEN // if (area.getParent() == null)
+ language.getPhrase("ResidenceOwnerChange", ChatColor.YELLOW + " " + args[1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN)); // sender.sendMessage(ChatColor.GREEN
else // + language.getPhrase("ResidenceOwnerChange", ChatColor.YELLOW + " " + args[1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN));
sender.sendMessage(ChatColor.GREEN + language.getPhrase("SubzoneOwnerChange", // else
ChatColor.YELLOW + " " + args[1].split("\\.")[args[1].split("\\.").length - 1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN)); // sender.sendMessage(ChatColor.GREEN + language.getPhrase("SubzoneOwnerChange",
} else // ChatColor.YELLOW + " " + args[1].split("\\.")[args[1].split("\\.").length - 1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN));
sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); // } else
return true; // sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence"));
} // return true;
// }
if (player == null) if (player == null)
return true; return true;
if (command.getName().equals("resadmin")) if (command.getName().equals("resadmin"))
@@ -218,6 +113,9 @@ public class ResidenceCommandListener extends Residence {
if (!resadmin && resadminToggle.contains(player.getName())) if (!resadmin && resadminToggle.contains(player.getName()))
if (!gmanager.isResidenceAdmin(player)) if (!gmanager.isResidenceAdmin(player))
resadminToggle.remove(player.getName()); resadminToggle.remove(player.getName());
// 此处开始的命令必须Player执行
if (cmd.equals("select")) if (cmd.equals("select"))
return commandResSelect(args, resadmin, player, page); return commandResSelect(args, resadmin, player, page);
if (cmd.equals("create")) if (cmd.equals("create"))
@@ -521,6 +419,110 @@ public class ResidenceCommandListener extends Residence {
return false; return false;
} }
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return true;
// ResidenceCommandEvent cevent = new ResidenceCommandEvent(command.getName(), args, sender);
// server.getPluginManager().callEvent(cevent);
// if (cevent.isCancelled())
// return true;
// if (command.getName().equals("resreload") && args.length == 0) {
// if (sender instanceof Player) {
// Player player = (Player) sender;
// if (Residence.getPermissionManager().isResidenceAdmin(player)) {
// this.reloadPlugin();
// sender.sendMessage(ChatColor.GREEN + "[Residence] 重载配置文件.");
// System.out.println("[Residence] 重载 by " + player.getName() + ".");
// }
// } else {
// this.reloadPlugin();
// System.out.println("[Residence] 重载 by 控制台.");
// }
// return true;
// }
// if (command.getName().equals("resload")) {
// if (!(sender instanceof Player) || sender instanceof Player && gmanager.isResidenceAdmin((Player) sender))
// try {
// this.loadYml();
// sender.sendMessage(ChatColor.GREEN + "[Residence] 从配置保存文件重新载入数据...");
// } catch (Exception ex) {
// sender.sendMessage(ChatColor.RED + "[Residence] 无法从配置保存文件重新载入数据, 请查看控制台异常信息!");
// sender.sendMessage(ChatColor.RED + "[Residence] 异常: " + ex.getMessage());
// Logger.getLogger(Residence.class.getName()).log(Level.SEVERE, null, ex);
// }
// return true;
// } else if (command.getName().equals("resworld")) {
// if (args.length == 2 && args[0].equalsIgnoreCase("remove"))
// if (sender instanceof ConsoleCommandSender) {
// rmanager.removeAllFromWorld(sender, args[1]);
// return true;
// } else
// sender.sendMessage(ChatColor.RED + "当前命令必须从控制台执行.");
// return false;
// } else if (command.getName().equals("rc")) {
// if (sender instanceof Player) {
// Player player = (Player) sender;
// String pname = player.getName();
// if (cmanager.chatEnabled()) {
// if (args.length == 0)
// plistener.tooglePlayerResidenceChat(player);
// else {
// String area = plistener.getCurrentResidenceName(pname);
// if (area != null) {
// ChatChannel channel = chatmanager.getChannel(area);
// if (channel != null) {
// String message = "";
// for (String arg : args)
// message = message + " " + arg;
// channel.chat(pname, message);
// } else
// player.sendMessage(ChatColor.RED + language.getPhrase("InvalidChannel"));
// } else
// player.sendMessage(ChatColor.RED + language.getPhrase("NotInResidence"));
// }
// } else
// player.sendMessage(ChatColor.RED + language.getPhrase("ChatDisabled"));
// }
// return true;
// } else if (command.getName().equals("res") || command.getName().equals("residence") || command.getName().equals("resadmin")) {
// boolean resadmin = false;
// if (sender instanceof Player) {
// if (command.getName().equals("resadmin") && gmanager.isResidenceAdmin((Player) sender))
// resadmin = true;
// if (command.getName().equals("resadmin") && !gmanager.isResidenceAdmin((Player) sender)) {
// ((Player) sender).sendMessage(ChatColor.RED + language.getPhrase("NonAdmin"));
// return true;
// }
// } else
// resadmin = true;
// return commandRes(args, resadmin, command, sender);
// }
// return super.onCommand(sender, command, label, args);
}
// private boolean commandHelp(String[] args, boolean resadmin, CommandSender sender) {
// if (helppages != null) {
// String helppath = "res";
// for (String arg : args) {
// if (arg.equalsIgnoreCase("?"))
// break;
// helppath = helppath + "." + arg;
// }
// int page = 1;
// if (!args[args.length - 1].equalsIgnoreCase("?"))
// try {
// page = Integer.parseInt(args[args.length - 1]);
// } catch (Exception ex) {
// sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidHelp"));
// }
// if (helppages.containesEntry(helppath)) {
// helppages.printHelp(sender, page, helppath);
// return true;
// }
// }
// return false;
// }
private boolean commandResArea(String[] args, boolean resadmin, Player player, int page) { private boolean commandResArea(String[] args, boolean resadmin, Player player, int page) {
if (args.length == 4) if (args.length == 4)
if (args[1].equals("remove")) { if (args[1].equals("remove")) {
@@ -620,26 +622,26 @@ public class ResidenceCommandListener extends Residence {
return true; return true;
} }
private boolean commandResConfirm(String[] args, boolean resadmin, CommandSender sender, int page) { // private boolean commandResConfirm(String[] args, boolean resadmin, CommandSender sender, int page) {
Player player = null; // Player player = null;
String name = "Console"; // String name = "Console";
if (sender instanceof Player) { // if (sender instanceof Player) {
player = (Player) sender; // player = (Player) sender;
name = player.getName(); // name = player.getName();
} // }
if (args.length == 1) { // if (args.length == 1) {
String area = deleteConfirm.get(name); // String area = deleteConfirm.get(name);
if (area == null) // if (area == null)
sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence")); // sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence"));
else { // else {
rmanager.removeResidence(player, area, resadmin); // rmanager.removeResidence(player, area, resadmin);
deleteConfirm.remove(name); // deleteConfirm.remove(name);
if (player == null) // if (player == null)
sender.sendMessage(ChatColor.GREEN + Residence.getLanguage().getPhrase("ResidenceRemove", ChatColor.YELLOW + name + ChatColor.GREEN)); // sender.sendMessage(ChatColor.GREEN + Residence.getLanguage().getPhrase("ResidenceRemove", ChatColor.YELLOW + name + ChatColor.GREEN));
} // }
} // }
return true; // return true;
} // }
private boolean commandResCreate(String[] args, boolean resadmin, Player player, int page) { private boolean commandResCreate(String[] args, boolean resadmin, Player player, int page) {
if (args.length != 2) if (args.length != 2)
@@ -1081,72 +1083,72 @@ public class ResidenceCommandListener extends Residence {
return false; return false;
} }
private boolean commandResRemove(String[] args, boolean resadmin, CommandSender sender, int page) { // private boolean commandResRemove(String[] args, boolean resadmin, CommandSender sender, int page) {
Player player = null; // Player player = null;
if (sender instanceof Player) { // if (sender instanceof Player) {
player = (Player) sender; // player = (Player) sender;
if (args.length == 1) { // if (args.length == 1) {
String area = rmanager.getNameByLoc(player.getLocation()); // String area = rmanager.getNameByLoc(player.getLocation());
if (area != null) { // if (area != null) {
ClaimedResidence res = rmanager.getByName(area); // ClaimedResidence res = rmanager.getByName(area);
if (res.getParent() != null) { // if (res.getParent() != null) {
String[] split = area.split("\\."); // String[] split = area.split("\\.");
String words = split[split.length - 1]; // String words = split[split.length - 1];
if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) { // if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED)); // player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
deleteConfirm.put(player.getName(), area); // deleteConfirm.put(player.getName(), area);
} else // } else
rmanager.removeResidence(player, area, resadmin); // rmanager.removeResidence(player, area, resadmin);
return true; // return true;
} else { // } else {
if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) { // if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + area + ChatColor.RED)); // player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + area + ChatColor.RED));
deleteConfirm.put(player.getName(), area); // deleteConfirm.put(player.getName(), area);
} else // } else
rmanager.removeResidence(player, area, resadmin); // rmanager.removeResidence(player, area, resadmin);
return true; // return true;
} // }
} // }
return false; // return false;
} // }
} // }
if (args.length != 2) // if (args.length != 2)
return false; // return false;
if (player != null) { // if (player != null) {
if (!deleteConfirm.containsKey(player.getName()) || !args[1].equalsIgnoreCase(deleteConfirm.get(player.getName()))) { // if (!deleteConfirm.containsKey(player.getName()) || !args[1].equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
String words = null; // String words = null;
if (rmanager.getByName(args[1]) != null) { // if (rmanager.getByName(args[1]) != null) {
ClaimedResidence res = rmanager.getByName(args[1]); // ClaimedResidence res = rmanager.getByName(args[1]);
if (res.getParent() != null) { // if (res.getParent() != null) {
String[] split = args[1].split("\\."); // String[] split = args[1].split("\\.");
words = split[split.length - 1]; // words = split[split.length - 1];
} // }
} // }
if (words == null) // if (words == null)
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED)); // player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED));
else // else
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED)); // player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
deleteConfirm.put(player.getName(), args[1]); // deleteConfirm.put(player.getName(), args[1]);
} else // } else
rmanager.removeResidence(player, args[1], resadmin); // rmanager.removeResidence(player, args[1], resadmin);
} else if (!deleteConfirm.containsKey("Console") || !args[1].equalsIgnoreCase(deleteConfirm.get("Console"))) { // } else if (!deleteConfirm.containsKey("Console") || !args[1].equalsIgnoreCase(deleteConfirm.get("Console"))) {
String words = null; // String words = null;
if (rmanager.getByName(args[1]) != null) { // if (rmanager.getByName(args[1]) != null) {
ClaimedResidence res = rmanager.getByName(args[1]); // ClaimedResidence res = rmanager.getByName(args[1]);
if (res.getParent() != null) { // if (res.getParent() != null) {
String[] split = args[1].split("\\."); // String[] split = args[1].split("\\.");
words = split[split.length - 1]; // words = split[split.length - 1];
} // }
} // }
if (words == null) // if (words == null)
server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED)); // server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED));
else // else
server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED)); // server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
deleteConfirm.put("Console", args[1]); // deleteConfirm.put("Console", args[1]);
} else // } else
rmanager.removeResidence(args[1]); // rmanager.removeResidence(args[1]);
return true; // return true;
} // }
private boolean commandResSelect(String[] args, boolean resadmin, Player player, int page) { private boolean commandResSelect(String[] args, boolean resadmin, Player player, int page) {
PermissionGroup group = Residence.getPermissionManager().getGroup(player); PermissionGroup group = Residence.getPermissionManager().getGroup(player);

View File

@@ -16,7 +16,6 @@ import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Damageable;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Hanging; import org.bukkit.entity.Hanging;
@@ -73,24 +72,6 @@ public class ResidencePlayerListener implements Listener {
lastUpdate.put(player.getName(), System.currentTimeMillis()); lastUpdate.put(player.getName(), System.currentTimeMillis());
} }
public void doHeals() {
try {
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
String resname = Residence.getPlayerListener().getCurrentResidenceName(player.getName());
ClaimedResidence res = null;
if (resname != null)
res = Residence.getResidenceManager().getByName(resname);
if (res != null && res.getPermissions().has("healing", false)) {
Damageable damage = player;
double health = damage.getHealth();
if (health < 20 && !player.isDead())
player.setHealth(health + 1);
}
}
} catch (Exception ex) {
}
}
public String getCurrentResidenceName(String player) { public String getCurrentResidenceName(String player) {
return currentRes.get(player); return currentRes.get(player);
} }
@@ -533,12 +514,12 @@ public class ResidencePlayerListener implements Listener {
} }
private boolean isCanUseEntity_BothClick(Material mat, Block block) { private boolean isCanUseEntity_BothClick(Material mat, Block block) {
return mat == Material.LEVER || mat == Material.STONE_BUTTON || mat == Material.WOOD_BUTTON || mat == Material.WOODEN_DOOR return mat == Material.LEVER || mat == Material.STONE_BUTTON || mat == Material.WOOD_BUTTON || mat == Material.WOODEN_DOOR || mat == Material.TRAP_DOOR || mat == Material.FENCE_GATE
|| mat == Material.PISTON_BASE || mat == Material.PISTON_STICKY_BASE || mat == Material.DRAGON_EGG
|| Residence.getConfigManager().getCustomBothClick().contains(Integer.valueOf(block.getTypeId()))
|| (Residence.is1_8() && (mat == Material.SPRUCE_DOOR || mat == Material.BIRCH_DOOR || mat == Material.JUNGLE_DOOR || mat == Material.ACACIA_DOOR || mat == Material.DARK_OAK_DOOR || (Residence.is1_8() && (mat == Material.SPRUCE_DOOR || mat == Material.BIRCH_DOOR || mat == Material.JUNGLE_DOOR || mat == Material.ACACIA_DOOR || mat == Material.DARK_OAK_DOOR
|| mat == Material.SPRUCE_FENCE_GATE || mat == Material.BIRCH_FENCE_GATE || mat == Material.JUNGLE_FENCE_GATE || mat == Material.ACACIA_FENCE_GATE || mat == Material.SPRUCE_FENCE_GATE || mat == Material.BIRCH_FENCE_GATE || mat == Material.JUNGLE_FENCE_GATE || mat == Material.ACACIA_FENCE_GATE
|| mat == Material.DARK_OAK_FENCE_GATE)) || mat == Material.DARK_OAK_FENCE_GATE));
|| mat == Material.TRAP_DOOR || mat == Material.FENCE_GATE || mat == Material.PISTON_BASE || mat == Material.PISTON_STICKY_BASE || mat == Material.DRAGON_EGG
|| Residence.getConfigManager().getCustomBothClick().contains(Integer.valueOf(block.getTypeId()));
} }
private boolean isCanUseEntity_RClickOnly(Material mat, Block block) { private boolean isCanUseEntity_RClickOnly(Material mat, Block block) {

View File

@@ -147,7 +147,9 @@ public class FlagPermissions {
addResidenceOnlyFlag("spread"); addResidenceOnlyFlag("spread");
addResidenceOnlyFlag("hidden"); addResidenceOnlyFlag("hidden");
addResidenceOnlyFlag("witherdamage"); addResidenceOnlyFlag("witherdamage");
addPlayerOrGroupOnlyFlag("admin"); addPlayerOrGroupOnlyFlag("admin");
addFlagToFlagGroup("redstone", "note"); addFlagToFlagGroup("redstone", "note");
addFlagToFlagGroup("redstone", "pressure"); addFlagToFlagGroup("redstone", "pressure");
addFlagToFlagGroup("redstone", "lever"); addFlagToFlagGroup("redstone", "lever");
@@ -164,6 +166,7 @@ public class FlagPermissions {
addFlagToFlagGroup("trusted", "move"); addFlagToFlagGroup("trusted", "move");
addFlagToFlagGroup("fire", "ignite"); addFlagToFlagGroup("fire", "ignite");
addFlagToFlagGroup("fire", "firespread"); addFlagToFlagGroup("fire", "firespread");
addMaterialToUseFlag(Material.DIODE, "diode"); addMaterialToUseFlag(Material.DIODE, "diode");
addMaterialToUseFlag(Material.DIODE_BLOCK_OFF, "diode"); addMaterialToUseFlag(Material.DIODE_BLOCK_OFF, "diode");
addMaterialToUseFlag(Material.DIODE_BLOCK_ON, "diode"); addMaterialToUseFlag(Material.DIODE_BLOCK_ON, "diode");

View File

@@ -1,565 +1,521 @@
# NOTE: 'If you want to modify this file, it is HIGHLY recommended that you make a copy
# of this file and modify that instead. This file will be updated automatically by Residence
# when a newer version is detected, and your changes will be overwritten. Once you
# have a copy of this file, change the Language: 'option under the Residence config.yml
# to whatever you named your copy.
Version: 22 Version: 22
FieldsVersion: 23 FieldsVersion: 23
Language: Language:
# The below lines represent various messages residence sends to the players. InvalidResidence: 无效的领地...
# Note that some messages have variables such as %1 that are inserted at runtime. InvalidSubzone: 无效的附属领地...
# Version 1 Fields InvalidDirection: 无效的方向...
InvalidResidence: '无效的领地...' InvalidChannel: 无效频道...
InvalidSubzone: '无效的附属领地...' InvalidAmount: 无效数量...
InvalidDirection: '无效的方向...' InvalidCost: 无效的花费金额...
InvalidChannel: '无效频道...' InvalidDays: 无效的天数...
InvalidAmount: '无效数量...' InvalidMaterial: 无效的材料...
InvalidCost: '无效的花费金额...' InvalidBoolean: 无效值必须是布尔值true(t)或者false(f)。
InvalidDays: '无效的天数...' InvalidArea: 无效的区域...
InvalidMaterial: '无效的材料...' InvalidGroup: 无效的权限组...
InvalidBoolean: '无效值必须是布尔值true(t)或者false(f)。' InvalidMessageType: 消息类型必须enter(进入)或remove(离开)。
InvalidArea: '无效的区域...' InvalidList: 未知列表的类型,必须是黑名单中的类型.
InvalidGroup: '无效的权限组...' InvalidFlag: 权限不存在...
InvalidMessageType: '消息类型必须enter(进入)或remove(离开)。' InvalidFlagState: 无效的权限状态必须是true(t)开启false(f)关闭,或者 remove(r)移除。
InvalidList: '无效的清单...' AreaExists: 区域名字已经存在。
InvalidFlag: '权限不存在...' AreaCreate: 领地ID %1 创建成功
InvalidFlagState: '无效的权限状态必须是true(t)开启false(f)关闭,或者 remove(r)移除。' AreaDiffWorld: 区域与领地是在一个不同的世界。
AreaExists: '区域名字已经存在。' AreaCollision: 区域与领地 %1 冲突。
AreaCreate: '领地ID %1 创建成功' AreaSubzoneCollision: 区域和附属领地 %1 冲突。
AreaDiffWorld: '区域与领地是在一个不同的世界。' AreaNonExist: 区域不存在。
AreaCollision: '区域与领地 %1 冲突。' AreaInvalidName: 区域名无效...
AreaSubzoneCollision: '区域和附属领地 %1 冲突。' AreaRename: 区域名从 %1 更改到 %2
AreaNonExist: '区域不存在。' AreaRemove: 移除区域 %1 ...
AreaInvalidName: '区域名无效...' AreaRemoveLast: 不能把最后一个区域从领地中移除。
AreaRename: '区域名从 %1 更改到 %2' AreaNotWithinParent: 这个区域不在父区域之内。
AreaRemove: '移除区域 %1 ...' AreaUpdate: 区域已更新...
AreaRemoveLast: '不能把最后一个区域从领地中移除。' AreaMaxPhysical: 你已经达到你的领地所允许的最大区域。
AreaNotWithinParent: '这个区域不在父区域之内。' AreaSizeLimit: 区域的大小超出你允许的范围上限。
AreaUpdate: '区域已更新...' AreaHighLimit: 你不能保护这样高的领地,你的上限是 %1 。
AreaMaxPhysical: '你已经达到你的领地所允许的最大区域。' AreaLowLimit: 你不能保护这样深的领地,你的上限是 %1 。
AreaSizeLimit: '区域的大小超出你允许的范围上限。' NotInResidence: 你不在一个领地里。
AreaHighLimit: '你不能保护这样高的领地,你的上限是 %1 。' InResidence: 你正站在领地 %1
AreaLowLimit: '你不能保护这样深的领地,你的上限是 %1 。' ResidenceOwnerChange: 领地的拥有者从玩家 %1 改为玩家 %2 。
NotInResidence: '你不在一个领地里。' NonAdmin: 你不是领地的管理员。
InResidence: '你正站在领地 %1 里。' AdminOnly: 只有管理员才能使用这个命令。
ResidenceOwnerChange: '领地的拥有者从玩家 %1 改为玩家 %2 。' ChatDisabled: 领地聊天已关闭...
NonAdmin: '你不是领地的管理员。' SubzoneRename: 附属领地 %1 已重命名为 %2 。
AdminOnly: '只有管理员才能使用这个命令。' SubzoneRemove: 附属领地 %1 已移除.
ChatDisabled: '领地聊天已关闭...' SubzoneCreate: 创建附属领地 %1 。
SubzoneRename: '附属领地 %1 已重命名为 %2 。' SubzoneCreateFail: 不能创建附属领地 %1
SubzoneRemove: '附属领地 %1 已移除.' SubzoneExists: 附属领地 %1 已经存在。
SubzoneCreate: '创建附属领地 %1 。' SubzoneCollide: 附属领地与另一个附属领地 %1 冲突
SubzoneCreateFail: '不能创建附属领地 %1 。' SubzoneMaxDepth: 您已达到了系统允许的最大分区深度。
SubzoneExists: '附属领地 %1 已经存在。' SubzoneSelectInside: 两个选择点必须在领地内。
SubzoneCollide: '附属领地与另一个附属领地 %1 冲突。' SelectPoints: 在用这个命令之前,请先用选择工具选取两个点!
SubzoneMaxDepth: '您已达到了系统允许的最大分区深度。' SelectionSuccess: 选择成功!
SubzoneSelectInside: '两个选择点必须在领地内。' SelectionFail: 无效的选择命令...
SelectPoints: '在用这个命令之前,请先用选择工具选取两个点!' SelectionBedrock: 扩大到允许的最低高度。
SelectionSuccess: '选择成功!' SelectionSky: 扩大到允许的最高高度。
SelectionFail: '无效的选择命令...' SelectionArea: 在领地 %2 中选择区域 %1 。
SelectionBedrock: '扩大到允许的最低高度。' SelectDiabled: 你没有圈地权限。
SelectionSky: '扩大到允许的最高高度。' NoPermission: 你没有使用此命令的权限。
SelectionArea: '在领地 %2 中选择区域 %1 。' OwnerNoPermission: 所有者无此命令的权限。
SelectDiabled: '你没有圈地权限。' ParentNoPermission: 你没有改变父区域的权限。
NoPermission: '你没有使用此命令的权限。' MessageChange: 消息已设置...
OwnerNoPermission: '所有者无此命令的权限。' FlagSet: 权限已设置...
ParentNoPermission: '你没有改变父区域的权限。' FlagCheckTrue: 权限 %1 为玩家 %2 在领地 %3 设置,值为=%4 。
MessageChange: '消息已设置...' FlagCheckFalse: 权限 %1 未为玩家 %2 在领地中设置。
FlagSet: '权限已设置...' FlagsCleared: 权限已清除。
FlagCheckTrue: '权限 %1 为玩家 %2 在领地 %3 设置,值为=%4 。' FlagsDefault: 权限已设置为默认。
FlagCheckFalse: '权限 %1 未为玩家 %2 在领地中设置。' Usage: 命令用法
FlagsCleared: '权限已清除。' InvalidHelp: 无效的帮助页...
FlagsDefault: '权限已设置为默认。' SubCommands: 子命令
Usage: '命令用法' MaterialGet: 材料名称为ID %1 是 %2 。
InvalidHelp: '无效的帮助页...' MarketDisabled: 市场功能已禁用!
SubCommands: '子命令' MarketList: 市场列表
InvalidList: '未知列表的类型,必须是黑名单中的类型.' SelectionTool: 选择工具
MaterialGet: '材料名称为ID %1 是 %2 。' InfoTool: 信息工具
MarketDisabled: '市场功能已禁用!' NoBankAccess: 你没有银行权限...
MarketList: '市场列表' NotEnoughMoney: 你没有足够的钱。
SelectionTool: '选择工具' BankNoMoney: 在银行里没有足够的钱。
InfoTool: '信息工具' BankDeposit: 你存 %1 元到领地银行。
NoBankAccess: '你没有银行权限...' BankWithdraw: 你取出 %1 元从领地银行。
NotEnoughMoney: '你没有足够的钱。' MoneyCharged: 支出 %1 元从 %2 帐户。
BankNoMoney: '在银行里没有足够的钱。' MoneyCredit: 收入 %1 元从 %2 帐户。
BankDeposit: '你存 %1 元到领地银行。' RentDisabled: 出租被禁用...
BankWithdraw: '你取出 %1 元从领地银行。' RentReleaseInvalid: 领地 %1 没有被租用或者被出租。
MoneyCharged: '支出 %1 元从 %2 帐户。' RentSellFail: 不能出售一个被租出去的领地。
MoneyCredit: '收入 %1 元从 %2 帐户。' SellRentFail: 当前领地在出售不能出租领地。
RentDisabled: '租凭系统已关闭。' OwnerBuyFail: 无法购买自己的土地!
RentReleaseInvalid: '领地 %1 没有被租用或者被出租。' OwnerRentFail: 不能租你自己的土地!
RentSellFail: '不能出售一个被租出去的领地。' AlreadySellFail: 领地已经出售!
SellRentFail: '当前领地在出售不能出租领地。' ResidenceBought: 你已经买下了领地 %1
OwnerBuyFail: '无法购买自己的土地!' ResidenceBuy: 玩家 %1 从你那买下了领地 %2 。
OwnerRentFail: '不能租你自己的土地!' ResidenceBuyTooBig: 此领地已超过系统允许的最大领域。
AlreadySellFail: '领地已经出售!' ResidenceNotForSale: 领地没有用于出售。
ResidenceBought: '你已经买下了领地 %1 ' ResidenceForSale: 现在以 %2 销售领地 %1
ResidenceBuy: '玩家 %1 从你那买下了领地 %2 。' ResidenceStopSelling: 领地不再销售。
ResidenceBuyTooBig: '此领地已超过系统允许的最大领域。' ResidenceTooMany: 已达到系统允许领地的最大上限。
ResidenceNotForSale: '领地没有用于出售。' ResidenceMaxRent: 已达到系统允许你租用领地的最大上限。
ResidenceForSale: '现在以 %2 销售领地 %1 。' ResidenceAlreadyRent: 领地已经被租用...
ResidenceStopSelling: '领地不再销售。' ResidenceNotForRent: 领地不用于出租...
ResidenceTooMany: '已达到系统允许领地的最大上限。' ResidenceNotRented: 领地没有被租用。
ResidenceMaxRent: '已达到系统允许你租用领地的最大上限。' ResidenceUnrent: 领地 %1 已不再出租。
ResidenceAlreadyRent: '领地已经被租用...' ResidenceRemoveRentable: 领地 %1 不再出租。
ResidenceNotForRent: '领地不用于出租...' ResidenceForRentSuccess: 领地 %1 现在租金为 %2 ,每次 %3 天。
ResidenceNotRented: '领地没有被租用。' ResidenceRentSuccess: 你已经租用领地 %1 %2 天...
ResidenceUnrent: '领地 %1 已不再出租。' ResidenceAlreadyRented: 领地 %1 ,目前已出租给 %2 。
ResidenceRemoveRentable: '领地 %1 不再出租。' ResidenceAlreadyExists: 领地 %1 已存在。
ResidenceForRentSuccess: '领地 %1 现在租金为 %2 ,每次 %3 天。' ResidenceCreate: 你创建了领地 %1
ResidenceRentSuccess: '你已经租用领地 %1 %2 天...' ResidenceRename: 领地 %1 已改名为 %2 。
ResidenceAlreadyRented: '领地 %1 ,目前已出租给 %2 。' ResidenceRemove: 领地 %1 已经被移除...
ResidenceAlreadyExists: '领地 %1 已存在。'
ResidenceCreate: '你创建了领地 %1 '
ResidenceRename: '领地 %1 已改名为 %2 。'
ResidenceRemove: '领地 %1 已经被移除...'
RentDisabled: '出租被禁用...'
RentDisableRenew: '%1 自动到期续约已关闭' RentDisableRenew: '%1 自动到期续约已关闭'
RentEnableRenew: '%1 自动到期续约已开启.' RentEnableRenew: '%1 自动到期续约已开启.'
RentableDisableRenew: '%1 更新可租用状态关闭.' RentableDisableRenew: '%1 更新可租用状态关闭.'
RentableEnableRenew: '%1 更新可租用状态开启.' RentableEnableRenew: '%1 更新可租用状态开启.'
LandForSale: '出售土地' LandForSale: 出售土地
SellAmount: '销售金额' SellAmount: 销售金额
LeaseExpire: '租赁到期时间' LeaseExpire: 租约期满
RentExpire: '租金到期时间' RentExpire: 租金到期时间
RentableAutoRenew: '自动更新可出租的土地' RentableAutoRenew: 自动更新可出租的土地
RentAutoRenew: '租借自动更新' RentAutoRenew: 租借自动更新
RentableLand: '可供出租土地' RentableLand: 可供出租土地
ListMaterialAdd: '%1 添加到领地 %2' ListMaterialAdd: '%1 添加到领地 %2'
ListMaterialRemove: '%1 已从领地 %2 移除' ListMaterialRemove: '%1 已从领地 %2 移除'
ItemBlacklisted: '你不能在这使用被禁止的物品.' ItemBlacklisted: 你不能在这使用被禁止的物品.
RentedModifyDeny: '不能修改一个租来的领地.' RentedModifyDeny: 不能修改一个租来的领地.
WorldPVPDisabled: '当前世界的PvP被禁止.' WorldPVPDisabled: 当前世界的PvP被禁止.
NoPVPZone: '没有PVP的区域.' NoPVPZone: 没有PVP的区域.
FlagDeny: '你没有拥有领地 %1 的权限.' FlagDeny: 你没有拥有领地 %1 的权限.
FlagSetDeny: '所有者不能使用这个权限 %1' FlagSetDeny: 所有者不能使用这个权限 %1
SelectPoint: '选择了 %1 的选择点' SelectPoint: 选择了 %1 的选择点
ResidenceChat: '领地聊天切换到 %1 ' ResidenceChat: '领地聊天切换到 %1 '
ResidenceMoveDeny: '你没有领地 %1 的移动权限' ResidenceMoveDeny: 你没有领地 %1 的移动权限
TeleportDeny: '你没有传送权限。' TeleportDeny: 你没有传送权限。
TeleportSuccess: '已传送!' TeleportSuccess: 已传送!
TeleportNear: '已传送到领地的附近。' TeleportNear: 已传送到领地的附近。
TeleportNoFlag: '对不起,你没有传送权限去目标领地。' TeleportNoFlag: 对不起,你没有传送权限去目标领地。
SetTeleportLocation: '传送点已设置...' SetTeleportLocation: 传送点已设置...
HelpPageHeader: '帮助页 - %1 - 第 %2页 共 %3页' HelpPageHeader: 帮助页 - %1 - 第 %2页 共 %3页
ListExists: '列表已经存在...' ListExists: 列表已经存在...
ListRemoved: '列表被移除...' ListRemoved: 列表被移除...
ListCreate: '已创建列表 %1' ListCreate: 已创建列表 %1
LeaseRenew: '租赁有效期至 %1到期' LeaseRenew: 租赁有效期至 %1到期
LeaseRenewMax: '租赁最大的允许值' LeaseRenewMax: 租赁最大的允许值
LeaseNotExpire: '没有这样的租赁或者租赁未到期.' LeaseNotExpire: 没有这样的租赁或者租赁未到期.
LeaseRenewalCost: '更新区域 %1 的花费是 %2' LeaseRenewalCost: 更新区域 %1 的花费是 %2
LeaseInfinite: '租赁时间已设置为无限...' LeaseInfinite: 租赁时间已设置为无限...
PermissionsApply: '权限已应用到领地.' PermissionsApply: 权限已应用到领地.
PhysicalAreas: '物理区域' PhysicalAreas: 物理区域
CurrentArea: '当前区域' CurrentArea: 当前区域
LeaseExpire: '租约期满' NotOnline: 目标玩家必须在线.
NotOnline: '目标玩家必须在线.' ResidenceGiveLimits: 无法给予目标玩家,因为这超过了目标玩家的上线
ResidenceGiveLimits: '无法给予目标玩家,因为这超过了目标玩家的上线' ResidenceGive: 你把领地 %1 给了玩家 %2
ResidenceGive: '你把领地 %1 给了玩家 %2' ResidenceRecieve: 你从玩家 %2 那里接收到了 %1 领地
ResidenceRecieve: '你从玩家 %2 那里接收到了 %1 领地' ResidenceListAllEmpty: 在这个服务器上没有任何的领地...
#Version 4 New Fields InvalidPage: 无效页数...
#ResidenceListAll: 'Residences - <Page %1 of %2> - removed, use GenericPage now NextPage: 下一页
ResidenceListAllEmpty: '在这个服务器上没有任何的领地...' RemovePlayersResidences: 删除了所有这个玩家的领地 %1
InvalidPage: '无效页数...' GenericPage: 页数 %1 / %2
NextPage: '下一页' ResidenceRentedBy: 被 %1 租用
#Version 10 New Fields InvalidCharacters: 侦测到无效名字...
RemovePlayersResidences: '删除了所有这个玩家的领地 %1' InvalidNameCharacters: 名字里包含非法字符...
GenericPage: '页数 %1 / %2' DeleteConfirm: 你确定要删除领地 %1 吗?输入"/res confirm"来确定。
#Version 11 New Fields SelectTooHigh: 警告!你所划分的领地大小已超过服务器限制!
ResidenceRentedBy: '被 %1 租用' SelectTooLow: 警告!你所划分的领地大小已超过服务器限制!
#Version 14 New Fields WorldEditNotFound: 未发现WorldEdit插件。
InvalidCharacters: '侦测到无效名字...' NoResHere: 没有人在这里设置了领地。
InvalidNameCharacters: '名字里包含非法字符...' DeleteSubzoneConfirm: 你确定要删除分区 %1 吗?输入“/res confirm”来确定。
#Version 15 New Fields SubzoneOwnerChange: 分区 %1 所有者改为 %2
DeleteConfirm: '你确定要删除领地 %1 吗?输入"/res confirm"来确定。' CoordsTop: X:%1 Y:%2 Z:%3
#Version 18 New Fields CoordsBottom: X:%1 Y:%2 Z:%3
SelectTooHigh: '警告!你所划分的领地大小已超过服务器限制!' AdminToggle: Automatic resadmin toggle turned %1
SelectTooLow: '警告!你所划分的领地大小已超过服务器限制!' NoSpawn: You do not have move permissions at your spawn point. Relocating
WorldEditNotFound: '未发现WorldEdit插件。' CompassTargetReset: 你的指南针指向已重置
#Version 19 New Fields CompassTargetSet: 你的指南针现在指向领地 %1
NoResHere: '没有人在这里设置了领地。' Description: 描述
DeleteSubzoneConfirm: '你确定要删除分区 %1 吗?输入“/res confirm”来确定。' Land: 土地
#Version 20 New Fields Cost: 花费
SubzoneOwnerChange: '分区 %1 所有者改为 %2' Selection: 选择
CoordsTop: 'X:%1 Y:%2 Z:%3' Total: 总计
CoordsBottom: 'X:%1 Y:%2 Z:%3' Size: 尺寸
#Version 21 New Fields Expanding: 扩张
AdminToggle: 'Automatic resadmin toggle turned %1' Shifting:
#Version 22 New Fields Up:
NoSpawn: 'You do not have move permissions at your spawn point. Relocating' Down:
CompassTargetReset: '你的指南针指向已重置' Error: 错误
CompassTargetSet: '你的指南针现在指向领地 %1' Flags: 权限
Your: 你的
Group:
#The below lines are mostly a word bank for various uses. Others: 其他人
#Version 1 Fields Primary: 第一个
Description: '描述' Secondary: 第二个
Land: '土地' Moved: 移动
Cost: '花费' Status: 状态
Selection: '选择' Available: 可用
Total: '总计' true: 开启
Size: '尺寸' false: 关闭
Expanding: '扩张' Name: 名字
Shifting: '移' Lists: 列表
Up: '上' Residences: 领地
Down: '下' Residence: 领地
Error: '错误' Count: 统计
Flags: '权限' Owner: 所有者
Your: '你的' World: 世界
Group: '组' Subzones: 附属领地
Others: '其他人' CoordsT: 顶坐标
Primary: '第一个' CoordsB: 底部的坐标
Secondary: '第二个' TurnOn:
Selection: '选择' TurnOff:
Moved: '移动'
Status: '状态'
Available: '可用'
On: '开启'
Off: '关闭'
Name: '名字'
Lists: '列表'
Residences: '领地'
Residence: '领地'
Count: '统计'
Owner: '所有者'
#Version 4 Fields
World: '世界'
#Version 12 Fields
Subzones: '附属领地'
#Version 20 Fields
CoordsT: '顶坐标'
CoordsB: '底部的坐标'
#Version 22 Fields
TurnOn: '开'
TurnOff: '关'
# This is the help / usage messages for each command.
# It follows this format:
# <Command>
# Description: '<general description of command, one line of text>
# Info: '<extra info lines to describe the command, list of text>
# SubCommands:
# <SubCommands> - these follow the same format, and each sub command can have its own subcommands
# When a user gets help for a command (adds a ? mark on the end), first its Info lines are printed, then its sub commands are printed below that
# Pages are automatically generated if the total lines of text exceeds 6 (will be configurable later).
# Add a page number after the ? mark to see that page.
HelpLinesPerPage: 7 HelpLinesPerPage: 7
CommandHelp: #this is just a holder node, that holds the entire help CommandHelp:
Description: '领地插件相关帮助 - 汉化 By: 喵♂呜' Description: '领地插件相关帮助 - 汉化 By: 喵♂呜'
SubCommands: #this is the actual beginning of all commands
res: #main residence command
Description: '领地插件相关帮助 - 汉化 By: 喵♂呜'
Info:
- '如果有疑问在这里找不到欢迎访问Wiki'
- '地址residencebukkitmod.wikispaces.com (英文)'
- '输入/[命令] ? <页面>获得更多信息'
SubCommands: SubCommands:
select: #selection commands res:
Description: '选区命令' Description: '领地插件相关帮助 - 汉化 By: 喵♂呜'
Info: Info:
- '选择此命令的使用范围领地.' - 如果有疑问在这里找不到欢迎访问Wiki
- '/res select [x] [y] [z] - 选择一个区块在中间, 你的半径.' - 地址residencebukkitmod.wikispaces.com (英文)
- 输入/[命令] ? <页面>获得更多信息
SubCommands:
select:
Description: 选区命令
Info:
- 选择此命令的使用范围领地.
- /res select <长> <宽> <高> - 以自己为中心的半径范围.
SubCommands: SubCommands:
coords: coords:
Description: '显示选定的坐标.' Description: 显示选定的坐标.
Info: Info:
- 'Usage: /res select coords' - '用法: /res select coords'
size: size:
Description: '显示选定的领地大小.' Description: 显示选定的领地大小.
Info: Info:
- 'Usage: /res select size' - '用法: /res select size'
cost: cost:
Description: '显示选定的领地需缴纳金.' Description: 显示选定的领地需缴纳金.
Info: Info:
- 'Usage: /res select cost' - '用法: /res select cost'
vert: vert:
Description: '调整选区至最大允许值.' Description: 调整高度选区至最大允许值.
Info: Info:
- 'Usage: /res select vert' - '用法: /res select vert'
- 'Will expand selection as high and as low as allowed.' - 扩大到允许的最高和最低高度.
sky: sky:
Description: '调整选区到最大高度.' Description: 调整选区到最大高度.
Info: Info:
- 'Usage: /res select sky' - '用法: /res select sky'
- 'Expands as high as your allowed to go.' - 扩大到允许的最高高度.
bedrock: bedrock:
Description: '调整选区到基岩底层.' Description: 调整选区到基岩底层.
Info: Info:
- 'Usage: /res select bedrock' - '用法: /res select bedrock'
- 'Expands as low as your allowed to go.' - 扩大到允许的最低高度.
expand: expand:
Description: 'Expand selection in a direction.' Description: 扩大选区.
Info: Info:
- 'Usage: /res select expand <amount>' - '用法: /res select expand <amount>'
- 'Expands <amount> in the direction your looking.' - 根据你面朝的方向进行扩大,<amount>填写扩大的数值.
shift: shift:
Description: 'Shift selection in a direction' Description: 移动所选区域
Info: Info:
- 'Usage: /res select shift <amount>' - '用法: /res select shift <amount>'
- 'Pushes your selection by <amount> in the direction your looking.' - 根据你面朝的方向移动选区,<amount>填写移动的格数.
chunk: chunk:
Description: '选取你所在的Chunk区域.' Description: 选取你所在的Chunk区域.
Info: Info:
- 'Usage: /res select chunk' - '用法: /res select chunk'
- 'Selects the chunk your currently standing in.' - 选择你所在的区块(16x16).
residence: residence:
Description: 'Select a existing area in a residence.' Description: Select a existing area in a residence.
Info: Info:
- 'Usage /res select <Residence> <AreaID>' - 用法 /res select <Residence> <AreaID>
- 'Selects a existing area in a residence.' - Selects a existing area in a residence.
worldedit: worldedit:
Description: '设置选区为WorldEdit的已选择区域.' Description: 设置选区为WorldEdit的已选择区域.
Info: Info:
- 'Usage /res select worldedit' - 用法 /res select worldedit
- '设置领地的选区为WorldEdit的已选择区域.' - 设置领地的选区为WorldEdit的已选择区域.
create: #creation command create:
Description: '创建领地' Description: 创建领地
Info: Info:
- Usage: '/res create <领地名字>' - '用法: /res create <领地名字>'
remove: #remove command remove:
Description: '删除领地' Description: 删除领地
Info: Info:
- 'Usage: /res remove <领地名字>' - '用法: /res remove <领地名字>'
removeall: removeall:
Description: '删除某位玩家所属的全部领地.' Description: 删除某位玩家所属的全部领地.
Info: Info:
- 'Usage: /res removeall [owner]' - '用法: /res removeall [owner]'
- '移除某一个玩家的所有领地.' - 移除某一个玩家的所有领地.
- '必须使用 /resadmin 如果你是移除别人的领地.' - 必须使用 /resadmin 如果你是移除别人的领地.
confirm: confirm:
Description: '确认领地的删除操作.' Description: 确认领地的删除操作.
info:
- 'Usage: /res confirm'
- '确认你要删除某个领地'
subzone:
Description: '在某个领地里创建附属领地.'
Info: Info:
- 'Usage: /res subzone <领地名> [附属领地名]' - '用法: /res confirm'
- '如果领地名为空,那么将以你所在的领地为主' - 确认你要删除某个领地
subzone:
Description: 在某个领地里创建附属领地.
Info:
- '用法: /res subzone <领地名> [附属领地名]'
- 如果领地名为空,那么将以你所在的领地为主
area: area:
Description: '管理一个领地的物理区域.' Description: 管理一个领地的物理区域.
SubCommands: SubCommands:
list: list:
Description: List physical areas in a residence Description: List physical areas in a residence
Info: Info:
- Usage: /res area list [residence] <page> - '用法: /res area list [residence] <page>'
listall: listall:
Description: List coordinates and other info for areas Description: List coordinates and other info for areas
Info: Info:
- Usage: /res area listall [residence] <page> - '用法: /res area listall [residence] <page>'
add: add:
Description: Add physical areas to a residence Description: Add physical areas to a residence
Info: Info:
- Usage: /res area add [residence] [areaID] - '用法: /res area add [residence] [areaID]'
- You must first select two points first. - You must first select two points first.
remove: remove:
Description: Remove physical areas from a residence Description: Remove physical areas from a residence
Info: Info:
- Usage: /res area remove [residence] [areaID] - '用法: /res area remove [residence] [areaID]'
replace: replace:
Description: Replace physical areas in a residence Description: Replace physical areas in a residence
Info: Info:
- Usage: /res area replace [residence] [areaID] - '用法: /res area replace [residence] [areaID]'
- You must first select two points first. - You must first select two points first.
- Replacing a area will charge the difference in size if the new area is bigger. - Replacing a area will charge the difference in size if the new area is bigger.
info: info:
Description: '显示某个领地的信息.' Description: 显示某个领地的信息.
Info: Info:
- Usage: /res info <领地名> - '用法: /res info <领地名>'
- 如果领地名为空,将以你所处的领地为主 - 如果领地名为空,将以你所处的领地为主
limits: limits:
Description: 显示领地功能限制. Description: 显示领地功能限制.
Info: Info:
- Usage: /res limits - '用法: /res limits'
- 显示你在创建或管理领地时对部分功能的限制. - 显示你在创建或管理领地时对部分功能的限制.
message: message:
Description: 设置领地进入/离开信息. Description: 设置领地进入/离开信息.
Info: Info:
- 'Usage: /res message <领地名> [enter/leave] [信息]' - '用法: /res message <领地名> [enter/leave] [信息]'
- '设置某个领地的进入/离开信息.' - 设置某个领地的进入/离开信息.
- 'Usage: /res message <领地名> remove [enter/leave]' - '用法: /res message <领地名> remove [enter/leave]'
- '删除某个领地的进入/离开信息.' - 删除某个领地的进入/离开信息.
lease: lease:
Description: '管理领地的出租.' Description: 管理领地的出租.
Info: Info:
- 'Usage: /res lease [renew/cost] [residence].' - '用法: /res lease [renew/cost] [领地名].'
- '/res lease cost will show the cost of renewing a residence lease.' - /res lease cost will show the cost of renewing a residence lease.
- '/res lease renew will renew the residence provided you have enough money.' - /res lease renew will renew the residence provided you have enough money.
SubCommands: SubCommands:
set: set:
Description: Set the lease time (admin only) Description: Set the lease time (admin only)
Info: Info:
- Usage: /resadmin lease set [residence] [#days/infinite] - '用法: /resadmin lease set [residence] [#days/infinite]'
- Sets the lease time to a specified number of days, or infinite. - Sets the lease time to a specified number of days, or infinite.
bank: bank:
Description: '管理领地的金钱.' Description: 管理领地的金钱.
Info: Info:
- 'Usage: /res bank [deposit/withdraw] [amount]' - '用法: /res bank [deposit/withdraw] [amount]'
- 'You must be standing in a Residence' - You must be standing in a Residence
- 'You must have the +bank flag.' - You must have the +bank flag.
tp: tp:
Description: '传送到某个领地.' Description: 传送到某个领地.
Info: Info:
- 'Usage: /res tp [领地名].' - '用法: /res tp [领地名].'
- '将你传送到某个领地,前提对应领地允许传送或你是对应领地的主人.' - '将你传送到某个领地,前提对应领地允许传送或你是对应领地的主人.'
- 'Your permission group must also be allowed to teleport by the server admin.' - 'Your permission group must also be allowed to teleport by the server admin.'
tpset: tpset:
Description: '设置某个领地的传送目标.' Description: 设置某个领地的传送目标.
Info: Info:
- Usage: /res tpset - '用法: /res tpset'
- This will set the teleport location for a residence to where your standing. - 'This will set the teleport location for a residence to where your standing.'
- You must be standing in the residence to use this command. - 'You must be standing in the residence to use this command.'
- You must also be the owner or have the +admin flag for the residence. - 'You must also be the owner or have the +admin flag for the residence.'
set: set:
Description: '设置领地的全局属性.' Description: 设置领地的全局属性.
Info: Info:
- Usage: /res set <residence> [flag] [true/false/remove] - '用法: /res set <residence> [flag] [true/false/remove]'
- To see a list of flags, use /res flags ? - 'To see a list of flags, use /res flags ?'
- These flags apply to any players who do not have the flag applied specifically to them. (see /res pset ?) - 'These flags apply to any players who do not have the flag applied specifically to them. (see /res pset ?)'
pset: pset:
Description: '设置某个人的领地属性.' Description: 设置某个人的领地属性.
Info: Info:
- Usage: /res pset <residence> [player] [flag] [true/false/remove] - '用法: /res pset <residence> [player] [flag] [true/false/remove]'
- Usage: /res pset <residence> [player] removeall - '用法: /res pset <residence> [player] removeall'
- To see a list of flags, use /res flags ? - 'To see a list of flags, use /res flags ?'
gset: gset:
Description: '设置某个组的领地属性.' Description: 设置某个组的领地属性.
Info: Info:
- Usage: /res gset <residence> [group] [flag] [true/false/remove] - '用法: /res gset <residence> [group] [flag] [true/false/remove]'
- To see a list of flags, use /res flags ? - To see a list of flags, use /res flags ?
lset: lset:
Description: '改变黑名单和忽略列表.' Description: 改变黑名单和忽略列表.
Info: Info:
- Usage: /res lset <residence> [blacklist/ignorelist] [material] - '用法: /res lset <residence> [blacklist/ignorelist] [material]'
- Usage: /res lset <residence> info - '用法: /res lset <residence> info'
- Blacklisting a material prevents it from being placed in the residence. - 'Blacklisting a material prevents it from being placed in the residence.'
- Ignorelist causes a specific material to not be protected by Residence. - 'Ignorelist causes a specific material to not be protected by Residence.'
flags: flags:
Description: 例举所有可配置属性 Description: 例举所有可配置属性
Info: Info:
- '对于属性的值, true代表允许, false代表阻止.' - 对于属性的值, true代表允许, false代表阻止.
- 'build - 允许或禁止玩家放置破坏方块' - build - 允许或禁止玩家放置破坏方块
- 'use - 允许或禁止玩家使用门、按钮、拉杆等' - use - 允许或禁止玩家使用门、按钮、拉杆等
- 'move - 允许或禁止玩家进入此领地或在此领地活动' - move - 允许或禁止玩家进入此领地或在此领地活动
- 'container - 允许或禁止玩家使用熔炉、箱子、发射器等' - container - 允许或禁止玩家使用熔炉、箱子、发射器等
- 'trusted - 同时配置 build, use, move, container 和 tp 属性' - trusted - 同时配置 build, use, move, container 和 tp 属性
- 'place - 允许或禁止玩家放置方块, 覆盖build属性.' - place - 允许或禁止玩家放置方块, 覆盖build属性.
- 'destroy - 允许或禁止玩家破坏方块, 覆盖build属性.' - destroy - 允许或禁止玩家破坏方块, 覆盖build属性.
- 'pvp - 允许或禁止玩家在领地内PVP' - pvp - 允许或禁止玩家在领地内PVP
- 'tp - 允许或禁止玩家传送到领地.' - tp - 允许或禁止玩家传送到领地.
- 'admin - 允许或禁止玩家管理领地属性.' - admin - 允许或禁止玩家管理领地属性.
- 'subzone - 允许或禁止玩家在领地内创建子领地.' - subzone - 允许或禁止玩家在领地内创建子领地.
- 'monsters - 允许或禁止领地内刷怪' - monsters - 允许或禁止领地内刷怪
- 'animals - 允许或禁止领地内刷动物.' - animals - 允许或禁止领地内刷动物.
- 'healing - 允许或禁止领地内生命回复' - healing - 允许或禁止领地内生命回复
- 'tnt - 允许或禁止领地内TNT爆炸' - tnt - 允许或禁止领地内TNT爆炸
- 'creeper - 允许或禁止领地内苦力怕爆炸' - creeper - 允许或禁止领地内苦力怕爆炸
- 'ignite - allows or denys fire ignition.' - ignite - allows or denys fire ignition.
- 'firespread - allows or denys fire spread.' - firespread - allows or denys fire spread.
- 'bucket - 允许或禁止领地内使用桶.' - bucket - 允许或禁止领地内使用桶.
- 'flow - 允许或禁止领地内液体流动.' - flow - 允许或禁止领地内液体流动.
- 'lavaflow - 允许或禁止领地内岩浆流动,覆盖flow属性' - lavaflow - 允许或禁止领地内岩浆流动,覆盖flow属性
- 'waterflow - 允许或禁止领地内水流动,覆盖flow属性' - waterflow - 允许或禁止领地内水流动,覆盖flow属性
- 'damage - 允许或禁止领地内所有的实体伤害.' - damage - 允许或禁止领地内所有的实体伤害.
- 'piston - 允许或禁止领地内活塞推动或吸方块.' - piston - 允许或禁止领地内活塞推动或吸方块.
- 'hidden - hides residence from list or listall commands.' - hidden - hides residence from list or listall commands.
- 'cake - 允许或禁止领地内吃蛋糕' - cake - 允许或禁止领地内吃蛋糕
- 'lever - 允许或禁止领地内使用拉杆' - lever - 允许或禁止领地内使用拉杆
- 'button - 允许或禁止领地内使用按钮' - button - 允许或禁止领地内使用按钮
- 'diode - 允许或禁止领地内使用红石中继器' - diode - 允许或禁止领地内使用红石中继器
- 'door - 允许或禁止领地内使用门(铁门,木门,活板门,栅栏门)' - door - 允许或禁止领地内使用门(铁门,木门,活板门,栅栏门)
- 'table - 允许或禁止领地内使用工作台' - table - 允许或禁止领地内使用工作台
- 'enchant - 允许或禁止领地内使用附魔台' - enchant - 允许或禁止领地内使用附魔台
- 'brew - 允许或禁止领地内使用铁毡' - brew - 允许或禁止领地内使用铁毡
- 'bed - 允许或禁止领地内使用床' - bed - 允许或禁止领地内使用床
- 'pressure - allows or denys players to use pressure plates' - pressure - 允许或拒绝玩家使用压力板
- 'note - 允许或禁止领地内使用音符盒' - note - 允许或禁止领地内使用音符盒
- 'redstone - 同时配置 lever, diode, button, pressure, note 属性' - redstone - 同时配置 lever, diode, button, pressure, note 属性
- 'craft - 同时配置 table, enchant, brew 属性' - craft - 同时配置 table, enchant, brew 属性
- ''
list: list:
Description: 查看某个玩家领地 Description: 查看某个玩家领地
Info: Info:
- Usage: /res list <player> <page> - '用法: /res list <player> <page>'
- Lists all the residences you own. - '列出某个玩家的所有领地.'
- To list everyones residences, use /res listall. - '列出所有玩家的领地, 请使用 /res listall.'
listall: listall:
Description: 查看所有玩家领地 Description: 查看所有玩家领地
Info: Info:
- Usage: /res listall <page> - '用法: /res listall <page>'
- Lists all residences on the server. - '列出所有玩家的领地.'
sublist: sublist:
Description: 查看领地内的子区域 Description: 查看领地内的子区域
Info: Info:
- Usage: /res sublist <residence> <page> - '用法: /res sublist <residence> <page>'
- List subzones within a residence. - '查看领地内的子区域.'
default: default:
Description: 重置领地属性为默认. Description: 重置领地属性为默认.
Info: Info:
- Usage: /res default <residence> - '用法: /res default <residence>'
- Resets the flags on a residence to their default. You must be the owner or an admin to do this. - '重置领地属性为默认.'
rename: rename:
Description: 重命名领地. Description: 重命名领地.
Info: Info:
- Usage: /res rename [OldName] [NewName] - '用法: /res rename [OldName] [NewName]'
- You must be the owner or an admin to do this. - You must be the owner or an admin to do this.
- The name must not already be taken by another residence. - The name must not already be taken by another residence.
mirror: mirror:
Description: 复制某个领地的属性 Description: 复制某个领地的属性
Info: Info:
- Usage: /res mirror [Source Residence] [Target Residence] - '用法: /res mirror [Source Residence] [Target Residence]'
- Mirrors flags from one residence to another. You must be owner of both or a admin to do this. - Mirrors flags from one residence to another. You must be owner of both or a admin to do this.
market: market:
Description: 购买, 出售, 或 租借 领地 Description: 购买, 出售, 或 租借 领地
Info: Info:
- Usage: /res market ? for more info - '用法: /res market ? for more info'
SubCommands: SubCommands:
info: info:
Description: Get economy info on residence Description: Get economy info on residence
Info: Info:
- Usage: /res market info [residence] - '用法: /res market info [residence]'
- Shows if the Residence is for sale or for rent, and the cost. - Shows if the Residence is for sale or for rent, and the cost.
list: list:
Description: Lists rentable and for sale residences. Description: Lists rentable and for sale residences.
Info: Info:
- Usage: /res market list - '用法: /res market list'
sell: sell:
Description: Sell a residence Description: Sell a residence
Info: Info:
- Usage: /res market sell [residence] [amount] - '用法: /res market sell [residence] [amount]'
- Puts a residence for sale for [amount] of money. - Puts a residence for sale for [amount] of money.
- Another player can buy the residence with /res market buy - Another player can buy the residence with /res market buy
buy: buy:
Description: Buy a residence Description: Buy a residence
Info: Info:
- Usage: /res market buy [residence] - '用法: /res market buy [residence]'
- Buys a Residence if its for sale. - Buys a Residence if its for sale.
unsell: unsell:
Description: Stops selling a residence Description: Stops selling a residence
Info: Info:
- Usage: /res market unsell [residence] - '用法: /res market unsell [residence]'
rent: rent:
Description: Rent a residence Description: Rent a residence
Info: Info:
- Usage: /res market rent [residence] <autorenew> - '用法: /res market rent [residence] <autorenew>'
- Rents a residence. Autorenew can be either true or false. If true, the residence will be automatically re-rented upon expire if the residence owner has allowed it. - Rents a residence. Autorenew can be either true or false. If true, the residence will be automatically re-rented upon expire if the residence owner has allowed it.
rentable: rentable:
Description: Make a residence rentable. Description: Make a residence rentable.
Info: Info:
- Usage: /res market rentable [residence] [cost] [days] <repeat> - '用法: /res market rentable [residence] [cost] [days] <repeat>'
- Makes a residence rentable for [cost] money for every [days] number of days. If <repeat> is true, the residence will automatically be able to be rented again after the current rent expires. - Makes a residence rentable for [cost] money for every [days] number of days. If <repeat> is true, the residence will automatically be able to be rented again after the current rent expires.
release: release:
Description: Remove a residence from rent or rentable. Description: Remove a residence from rent or rentable.
Info: Info:
- Usage: /res market release [residence] - '用法: /res market release [residence]'
- If you are the renter, this command releases the rent on the house for you. - If you are the renter, this command releases the rent on the house for you.
- If you are the owner, this command makes the residence not for rent anymore. - If you are the owner, this command makes the residence not for rent anymore.
current: current:
Description: Show residence your currently in. Description: Show residence your currently in.
Info: Info:
- Usage: /res current - '用法: /res current'
lists: lists:
Description: Predefined permission lists Description: Predefined permission lists
Info: Info:
@@ -568,51 +524,51 @@ CommandHelp: #this is just a holder node, that holds the entire help
add: add:
Description: Add a list Description: Add a list
Info: Info:
- Usage: /res lists add <listname> - '用法: /res lists add <listname>'
remove: remove:
Description: Remove a list Description: Remove a list
Info: Info:
- Usage: /res lists remove <listname> - '用法: /res lists remove <listname>'
apply: apply:
Description: Apply a list to a residence Description: Apply a list to a residence
Info: Info:
- Usage: /res lists apply <listname> <residence> - '用法: /res lists apply <listname> <residence>'
set: set:
Description: Set a flag Description: Set a flag
Info: Info:
- Usage: /res lists set <listname> <flag> <value> - '用法: /res lists set <listname> <flag> <value>'
pset: pset:
Description: Set a player flag Description: Set a player flag
Info: Info:
- Usage: /res lists pset <listname> <player> <flag> <value> - '用法: /res lists pset <listname> <player> <flag> <value>'
gset: gset:
Description: Set a group flag Description: Set a group flag
Info: Info:
- Usage: /res lists gset <listname> <group> <flag> <value> - '用法: /res lists gset <listname> <group> <flag> <value>'
view: view:
Description: View a list. Description: View a list.
Info: Info:
- Usage: /res lists view <listname> - '用法: /res lists view <listname>'
server: server:
Description: 设置某个领地为服务器所属(仅限管理员使用) Description: 设置某个领地为服务器所属(仅限管理员使用)
Info: Info:
- Usage: /resadmin server [residence] - '用法: /resadmin server [领地名]'
- 可以让某个领地变为服务器所属 - 可以让某个领地变为服务器所属
setowner: setowner:
Description: 设置某个领地的所有者(仅限管理员使用) Description: 设置某个领地的所有者(仅限管理员使用)
Info: Info:
- Usage: /resadmin setowner [领地名] [玩家] - '用法: /resadmin setowner [领地名] [玩家]'
resreload: resreload:
Description: 重新加载插件配置(仅限管理员使用) Description: 重新加载插件配置(仅限管理员使用)
Info: Info:
- Usage: /resreload - '用法: /resreload'
resload: resload:
Description: 载入已保存的配置文件 (不安全, 仅限管理员使用). Description: 载入已保存的配置文件 (不安全, 仅限管理员使用).
Info: Info:
- Usage: /resload - '用法: /resload'
- UNSAFE command, does not save residences first. - UNSAFE command, does not save residences first.
- Loads the residence save file after you have made changes. - Loads the residence save file after you have made changes.
version: version:
Description: 显示领地插件的版本信息 Description: 显示领地插件的版本信息
Info: Info:
- Usage: /res version - '用法: /res version'

View File

@@ -7,15 +7,14 @@ authors: [bekvon,nate302,t00thpick1,喵♂呜]
contributors: [lemon42,smbarbour,inorixu,Shayana_fr] contributors: [lemon42,smbarbour,inorixu,Shayana_fr]
softdepend: [Vault,Essentials,RealPlugin,BOSEconomy,iConomy,bPermissions,PermissionsBukkit,Permissions,WorldEdit] softdepend: [Vault,Essentials,RealPlugin,BOSEconomy,iConomy,bPermissions,PermissionsBukkit,Permissions,WorldEdit]
commands: commands:
res:
description: Manage Residences
usage: §c使用/res ? 获取更多帮助.
residence: residence:
description: Manage Residences description: 管理领地.
usage: §c使用/residence ? 获取更多帮助. aliese: [res]
usage: §c使用/res ? 或 /residence ? 或 /resadmin ? 获取更多帮助.
resadmin: resadmin:
description: Residence admin functions. description: 管理员命令 管理领地.
usage: §c使用/res ? or /resadmin ? 获取更多帮助. permission: residence.admin
usage: §c使用/res ? 或 /residence ? 或 /resadmin ? 获取更多帮助.
resreload: resreload:
description: 重载领地插件. description: 重载领地插件.
usage: §c使用/resreload usage: §c使用/resreload
@@ -30,7 +29,7 @@ commands:
usage: §c使用/resworld remove [world] 移除世界所有领地. usage: §c使用/resworld remove [world] 移除世界所有领地.
permissions: permissions:
residence.admin: residence.admin:
description: Gives you access to /resadmin description: 允许使用 /resadmin.
default: op default: op
residence.admin.tp: residence.admin.tp:
description: Allows to override tp flag description: Allows to override tp flag