1
0
mirror of https://e.coding.net/circlecloud/Residence.git synced 2026-02-17 11:39:14 +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.Server;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
@@ -32,10 +34,16 @@ import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
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.EssentialsEcoAdapter;
import com.bekvon.bukkit.residence.economy.TransactionManager;
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.listeners.ResidenceBlockListener;
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.ResidenceManager;
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.WorldEditSelectionManager;
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.earth2me.essentials.Essentials;
import cn.citycraft.PluginHelper.commands.HandlerMainCommand;
import cn.citycraft.PluginHelper.config.FileConfig;
import cn.citycraft.PluginHelper.utils.VersionChecker;
@@ -69,10 +83,13 @@ import cn.citycraft.PluginHelper.utils.VersionChecker;
public class Residence extends JavaPlugin {
public static float bukkitver;
protected static ResidenceManager rmanager;
protected static SelectionManager smanager;
protected static PermissionManager gmanager;
protected static ConfigManager cmanager;
protected static FlagManager fmanager;
protected static TaskManager taskmanager;
protected static ResidenceBlockListener blistener;
protected static ResidencePlayerListener plistener;
protected static ResidenceEntityListener elistener;
@@ -85,7 +102,7 @@ public class Residence extends JavaPlugin {
protected static RentManager rentmanager;
protected static ChatManager chatmanager;
protected static Server server;
protected static HelpEntry helppages;
public static HelpEntry helppages;
protected static Language language;
protected static Logger log;
protected static boolean useWorldEdit;
@@ -96,37 +113,16 @@ public class Residence extends JavaPlugin {
protected static int rentBukkitId = -1;
protected static int healBukkitId = -1;
protected static int autosaveBukkitId = -1;
protected static boolean initsuccess = false;
protected static List<String> resadminToggle;
protected static FileConfig config;
private final static String[] validLanguages = { "English", "Chinese" };
public static boolean initsuccess;
protected HandlerMainCommand hdmcnd;
protected boolean firstenable = true;
protected 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 Map<String, String> deleteConfirm;
public Residence() {
}
@@ -282,6 +278,71 @@ public class Residence extends JavaPlugin {
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
public void onDisable() {
server.getScheduler().cancelTask(autosaveBukkitId);
@@ -325,6 +386,7 @@ public class Residence extends JavaPlugin {
gmanager = new PermissionManager(this.getConfig());
imanager = new WorldItemManager(this.getConfig());
wmanager = new WorldFlagManager(this.getConfig());
chatmanager = new ChatManager();
rentmanager = new RentManager();
for (String lang : validLanguages)
@@ -378,6 +440,8 @@ public class Residence extends JavaPlugin {
tmanager = new TransactionManager(rmanager, gmanager);
if (pmanager == null)
pmanager = new PermissionListManager();
if (taskmanager == null)
taskmanager = new TaskManager(this);
if (firstenable) {
if (!this.isEnabled())
return;
@@ -403,28 +467,35 @@ public class Residence extends JavaPlugin {
if (is1_8())
pm.registerEvents(plistener1_8, this);
pm.registerEvents(elistener, this);
firstenable = false;
} else
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();
if (autosaveInt < 1)
autosaveInt = 1;
autosaveInt = autosaveInt * 60 * 20;
autosaveBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, autoSave, autosaveInt, autosaveInt);
healBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, doHeals, 20, 20);
autosaveInt = autosaveInt < 1 ? 1 : autosaveInt * 60 * 20;
taskmanager.add(server.getScheduler().runTaskTimer(this, new AutoSaveTask(this), autosaveInt, autosaveInt));
if (cmanager.useLeases()) {
int leaseInterval = cmanager.getLeaseCheckInterval();
if (leaseInterval < 1)
leaseInterval = 1;
leaseInterval = leaseInterval * 60 * 20;
leaseBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, leaseExpire, leaseInterval, leaseInterval);
leaseInterval = leaseInterval < 1 ? 1 : leaseInterval * 60 * 20;
taskmanager.add(server.getScheduler().runTaskTimer(this, new LeaseTask(), leaseInterval, leaseInterval));
}
if (cmanager.enabledRentSystem()) {
int rentint = cmanager.getRentCheckInterval();
if (rentint < 1)
rentint = 1;
rentint = rentint * 60 * 20;
rentBukkitId = server.getScheduler().scheduleSyncRepeatingTask(this, rentExpire, rentint, rentint);
rentint = rentint < 1 ? 1 : rentint * 60 * 20;
taskmanager.add(server.getScheduler().runTaskTimer(this, new RentTask(), rentint, rentint));
}
for (Player player : Bukkit.getServer().getOnlinePlayers())
if (Residence.getPermissionManager().isResidenceAdmin(player))
@@ -448,12 +519,12 @@ public class Residence extends JavaPlugin {
@Override
public void reloadConfig() {
config.reload();
}
};
public void reloadPlugin() {
this.onDisable();
this.reloadConfig();
this.onEnable();
PluginManager pm = server.getPluginManager();
pm.disablePlugin(this);
pm.enablePlugin(this);
}
@Override
@@ -461,49 +532,7 @@ public class Residence extends JavaPlugin {
config.save();
}
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 未找到!");
}
private void saveYml() throws IOException {
public void saveYml() throws IOException {
File saveFolder = new File(dataFolder, "Save");
File worldFolder = new File(saveFolder, "Worlds");
worldFolder.mkdirs();
@@ -604,6 +633,48 @@ public class Residence extends JavaPlugin {
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")
private boolean writeDefaultFileFromJar(File writeName, String jarPath, boolean backupOld) {
try {
@@ -648,61 +719,4 @@ public class Residence extends JavaPlugin {
if (this.writeDefaultFileFromJar(outFile, "languagefiles/" + lang + ".yml", true))
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;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -13,11 +12,8 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
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.protection.ClaimedResidence;
import com.bekvon.bukkit.residence.protection.CuboidArea;
@@ -26,183 +22,82 @@ import com.sk89q.worldedit.bukkit.WorldEditPlugin;
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")
private 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("?"))
return commandHelp(args, resadmin, 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("?"))
// return commandHelp(args, resadmin, sender);
int page = 1;
try {
if (args.length > 0)
page = Integer.parseInt(args[args.length - 1]);
} catch (Exception ex) {
}
Player player = null;
// try {
// if (args.length > 0)
// page = Integer.parseInt(args[args.length - 1]);
// } catch (Exception ex) {
// }
Player player = (Player) sender;
PermissionGroup group = null;
String pname = null;
if (sender instanceof Player) {
player = (Player) sender;
group = Residence.getPermissionManager().getGroup(player);
pname = player.getName();
} else
resadmin = true;
if (cmanager.allowAdminsOnly())
if (!resadmin) {
sender.sendMessage(ChatColor.RED + language.getPhrase("AdminOnly"));
return true;
}
if (args.length == 0)
return false;
if (args.length == 0) {
args = new String[1];
args[0] = "?";
}
// if (sender instanceof Player) {
// player = (Player) sender;
// group = Residence.getPermissionManager().getGroup(player);
// pname = player.getName();
// } else
// resadmin = true;
// if (cmanager.allowAdminsOnly())
// if (!resadmin) {
// sender.sendMessage(ChatColor.RED + language.getPhrase("AdminOnly"));
// return true;
// }
// if (args.length == 0)
// return false;
// if (args.length == 0) {
// args = new String[1];
// args[0] = "?";
// }
String cmd = args[0].toLowerCase();
if (cmd.equals("remove") || cmd.equals("delete"))
return commandResRemove(args, resadmin, sender, page);
if (cmd.equals("confirm"))
return commandResConfirm(args, resadmin, sender, page);
if (cmd.equals("version")) {
sender.sendMessage(ChatColor.GRAY + "------------------------------------");
sender.sendMessage(ChatColor.RED + "当前服务器运行的 " + ChatColor.GOLD + "Residence" + ChatColor.RED + " 版本: " + ChatColor.BLUE + this.getDescription().getVersion());
sender.sendMessage(ChatColor.GREEN + "创建者: " + ChatColor.YELLOW + "bekvon");
sender.sendMessage(ChatColor.GREEN + "升级到 1.8 by: " + ChatColor.YELLOW + "DartCZ");
sender.sendMessage(ChatColor.RED + "升级到最新无UUID版本 by: " + ChatColor.YELLOW + "喵♂呜");
String names = null;
List<String> authlist = this.getDescription().getAuthors();
for (String auth : authlist)
if (names == null)
names = auth;
else
names = names + ", " + auth;
sender.sendMessage(ChatColor.GREEN + "作者: " + ChatColor.YELLOW + names);
sender.sendMessage(ChatColor.DARK_AQUA + "插件命令列表,帮助, 请查看wiki:");
sender.sendMessage(ChatColor.GREEN + "http://residencebukkitmod.wikispaces.com/");
sender.sendMessage(ChatColor.AQUA + "重制版本请查看Jenkins:");
sender.sendMessage(ChatColor.BLUE + this.getDescription().getWebsite());
sender.sendMessage(ChatColor.GRAY + "------------------------------------");
return true;
}
if (cmd.equals("setowner") && args.length == 3) {
if (!resadmin) {
sender.sendMessage(ChatColor.RED + language.getPhrase("NoPermission"));
return true;
}
ClaimedResidence area = rmanager.getByName(args[1]);
if (area != null) {
area.getPermissions().setOwner(args[2], true);
if (area.getParent() == null)
sender.sendMessage(ChatColor.GREEN
+ language.getPhrase("ResidenceOwnerChange", ChatColor.YELLOW + " " + args[1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN));
else
sender.sendMessage(ChatColor.GREEN + language.getPhrase("SubzoneOwnerChange",
ChatColor.YELLOW + " " + args[1].split("\\.")[args[1].split("\\.").length - 1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN));
} else
sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence"));
return true;
}
// if (cmd.equals("remove") || cmd.equals("delete"))
// return commandResRemove(args, resadmin, sender, page);
// if (cmd.equals("confirm"))
// return commandResConfirm(args, resadmin, sender, page);
// if (cmd.equals("version")) {
// sender.sendMessage(ChatColor.GRAY + "------------------------------------");
// sender.sendMessage(ChatColor.RED + "当前服务器运行的 " + ChatColor.GOLD + "Residence" + ChatColor.RED + " 版本: " + ChatColor.BLUE + this.getDescription().getVersion());
// sender.sendMessage(ChatColor.GREEN + "创建者: " + ChatColor.YELLOW + "bekvon");
// sender.sendMessage(ChatColor.GREEN + "升级到 1.8 by: " + ChatColor.YELLOW + "DartCZ");
// sender.sendMessage(ChatColor.RED + "升级到最新无UUID版本 by: " + ChatColor.YELLOW + "喵♂呜");
// String names = null;
// List<String> authlist = this.getDescription().getAuthors();
// for (String auth : authlist)
// if (names == null)
// names = auth;
// else
// names = names + ", " + auth;
// sender.sendMessage(ChatColor.GREEN + "作者: " + ChatColor.YELLOW + names);
// sender.sendMessage(ChatColor.DARK_AQUA + "插件命令列表,帮助, 请查看wiki:");
// sender.sendMessage(ChatColor.GREEN + "http://residencebukkitmod.wikispaces.com/");
// sender.sendMessage(ChatColor.AQUA + "重制版本请查看Jenkins:");
// sender.sendMessage(ChatColor.BLUE + this.getDescription().getWebsite());
// sender.sendMessage(ChatColor.GRAY + "------------------------------------");
// return true;
// }
// if (cmd.equals("setowner") && args.length == 3) {
// if (!resadmin) {
// sender.sendMessage(ChatColor.RED + language.getPhrase("NoPermission"));
// return true;
// }
// ClaimedResidence area = rmanager.getByName(args[1]);
// if (area != null) {
// area.getPermissions().setOwner(args[2], true);
// if (area.getParent() == null)
// sender.sendMessage(ChatColor.GREEN
// + language.getPhrase("ResidenceOwnerChange", ChatColor.YELLOW + " " + args[1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN));
// else
// sender.sendMessage(ChatColor.GREEN + language.getPhrase("SubzoneOwnerChange",
// ChatColor.YELLOW + " " + args[1].split("\\.")[args[1].split("\\.").length - 1] + " " + ChatColor.GREEN + "." + ChatColor.YELLOW + args[2] + ChatColor.GREEN));
// } else
// sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence"));
// return true;
// }
if (player == null)
return true;
if (command.getName().equals("resadmin"))
@@ -218,6 +113,9 @@ public class ResidenceCommandListener extends Residence {
if (!resadmin && resadminToggle.contains(player.getName()))
if (!gmanager.isResidenceAdmin(player))
resadminToggle.remove(player.getName());
// 此处开始的命令必须Player执行
if (cmd.equals("select"))
return commandResSelect(args, resadmin, player, page);
if (cmd.equals("create"))
@@ -521,6 +419,110 @@ public class ResidenceCommandListener extends Residence {
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) {
if (args.length == 4)
if (args[1].equals("remove")) {
@@ -620,26 +622,26 @@ public class ResidenceCommandListener extends Residence {
return true;
}
private boolean commandResConfirm(String[] args, boolean resadmin, CommandSender sender, int page) {
Player player = null;
String name = "Console";
if (sender instanceof Player) {
player = (Player) sender;
name = player.getName();
}
if (args.length == 1) {
String area = deleteConfirm.get(name);
if (area == null)
sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence"));
else {
rmanager.removeResidence(player, area, resadmin);
deleteConfirm.remove(name);
if (player == null)
sender.sendMessage(ChatColor.GREEN + Residence.getLanguage().getPhrase("ResidenceRemove", ChatColor.YELLOW + name + ChatColor.GREEN));
}
}
return true;
}
// private boolean commandResConfirm(String[] args, boolean resadmin, CommandSender sender, int page) {
// Player player = null;
// String name = "Console";
// if (sender instanceof Player) {
// player = (Player) sender;
// name = player.getName();
// }
// if (args.length == 1) {
// String area = deleteConfirm.get(name);
// if (area == null)
// sender.sendMessage(ChatColor.RED + language.getPhrase("InvalidResidence"));
// else {
// rmanager.removeResidence(player, area, resadmin);
// deleteConfirm.remove(name);
// if (player == null)
// sender.sendMessage(ChatColor.GREEN + Residence.getLanguage().getPhrase("ResidenceRemove", ChatColor.YELLOW + name + ChatColor.GREEN));
// }
// }
// return true;
// }
private boolean commandResCreate(String[] args, boolean resadmin, Player player, int page) {
if (args.length != 2)
@@ -1081,72 +1083,72 @@ public class ResidenceCommandListener extends Residence {
return false;
}
private boolean commandResRemove(String[] args, boolean resadmin, CommandSender sender, int page) {
Player player = null;
if (sender instanceof Player) {
player = (Player) sender;
if (args.length == 1) {
String area = rmanager.getNameByLoc(player.getLocation());
if (area != null) {
ClaimedResidence res = rmanager.getByName(area);
if (res.getParent() != null) {
String[] split = area.split("\\.");
String words = split[split.length - 1];
if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
deleteConfirm.put(player.getName(), area);
} else
rmanager.removeResidence(player, area, resadmin);
return true;
} else {
if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + area + ChatColor.RED));
deleteConfirm.put(player.getName(), area);
} else
rmanager.removeResidence(player, area, resadmin);
return true;
}
}
return false;
}
}
if (args.length != 2)
return false;
if (player != null) {
if (!deleteConfirm.containsKey(player.getName()) || !args[1].equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
String words = null;
if (rmanager.getByName(args[1]) != null) {
ClaimedResidence res = rmanager.getByName(args[1]);
if (res.getParent() != null) {
String[] split = args[1].split("\\.");
words = split[split.length - 1];
}
}
if (words == null)
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED));
else
player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
deleteConfirm.put(player.getName(), args[1]);
} else
rmanager.removeResidence(player, args[1], resadmin);
} else if (!deleteConfirm.containsKey("Console") || !args[1].equalsIgnoreCase(deleteConfirm.get("Console"))) {
String words = null;
if (rmanager.getByName(args[1]) != null) {
ClaimedResidence res = rmanager.getByName(args[1]);
if (res.getParent() != null) {
String[] split = args[1].split("\\.");
words = split[split.length - 1];
}
}
if (words == null)
server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED));
else
server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
deleteConfirm.put("Console", args[1]);
} else
rmanager.removeResidence(args[1]);
return true;
}
// private boolean commandResRemove(String[] args, boolean resadmin, CommandSender sender, int page) {
// Player player = null;
// if (sender instanceof Player) {
// player = (Player) sender;
// if (args.length == 1) {
// String area = rmanager.getNameByLoc(player.getLocation());
// if (area != null) {
// ClaimedResidence res = rmanager.getByName(area);
// if (res.getParent() != null) {
// String[] split = area.split("\\.");
// String words = split[split.length - 1];
// if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
// player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
// deleteConfirm.put(player.getName(), area);
// } else
// rmanager.removeResidence(player, area, resadmin);
// return true;
// } else {
// if (!deleteConfirm.containsKey(player.getName()) || !area.equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
// player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + area + ChatColor.RED));
// deleteConfirm.put(player.getName(), area);
// } else
// rmanager.removeResidence(player, area, resadmin);
// return true;
// }
// }
// return false;
// }
// }
// if (args.length != 2)
// return false;
// if (player != null) {
// if (!deleteConfirm.containsKey(player.getName()) || !args[1].equalsIgnoreCase(deleteConfirm.get(player.getName()))) {
// String words = null;
// if (rmanager.getByName(args[1]) != null) {
// ClaimedResidence res = rmanager.getByName(args[1]);
// if (res.getParent() != null) {
// String[] split = args[1].split("\\.");
// words = split[split.length - 1];
// }
// }
// if (words == null)
// player.sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED));
// else
// player.sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
// deleteConfirm.put(player.getName(), args[1]);
// } else
// rmanager.removeResidence(player, args[1], resadmin);
// } else if (!deleteConfirm.containsKey("Console") || !args[1].equalsIgnoreCase(deleteConfirm.get("Console"))) {
// String words = null;
// if (rmanager.getByName(args[1]) != null) {
// ClaimedResidence res = rmanager.getByName(args[1]);
// if (res.getParent() != null) {
// String[] split = args[1].split("\\.");
// words = split[split.length - 1];
// }
// }
// if (words == null)
// server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteConfirm", ChatColor.YELLOW + args[1] + ChatColor.RED));
// else
// server.getConsoleSender().sendMessage(ChatColor.RED + language.getPhrase("DeleteSubzoneConfirm", ChatColor.YELLOW + words + ChatColor.RED));
// deleteConfirm.put("Console", args[1]);
// } else
// rmanager.removeResidence(args[1]);
// return true;
// }
private boolean commandResSelect(String[] args, boolean resadmin, Player player, int page) {
PermissionGroup group = Residence.getPermissionManager().getGroup(player);

View File

@@ -16,7 +16,6 @@ import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Damageable;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Hanging;
@@ -73,24 +72,6 @@ public class ResidencePlayerListener implements Listener {
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) {
return currentRes.get(player);
}
@@ -533,12 +514,12 @@ public class ResidencePlayerListener implements Listener {
}
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
|| 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.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()));
|| mat == Material.DARK_OAK_FENCE_GATE));
}
private boolean isCanUseEntity_RClickOnly(Material mat, Block block) {

View File

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

View File

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