json数据格式为:

1、 JsonFileUtil.java

 package com.sklm.lhb.json;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; public class JsonFileUtil { /**
* 生成.json格式文件
* @param jsonString json内容
* @param filePath 文件路径
* @param fileName json文件名称
* @return 如果文件创建成功返回true,否则返回false
*/
public static boolean createJsonFile(String jsonString, String filePath, String fileName) {
boolean flag = true;
String fullPath = filePath +File.separator+ fileName + ".json";
try {
File file = new File(fullPath);
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if(file.exists()) {
file.delete();
file.createNewFile();
}else {
file.createNewFile();
} //格式化json字符串
jsonString = JsonFormatTool.formatJson(jsonString); Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
write.write(jsonString);
write.flush();
write.close(); } catch (Exception e) {
flag = false;
e.printStackTrace();
} return flag;
} /**
* 读取json文件
* @param jsonPath 文件路径
* @param jsonName 文件名称
* @return 返回JSONArray,如果发生 异常则返回null
*/
public static JSONArray readJsonToArray(String jsonPath, String jsonName) {
String path = jsonPath+"\\"+jsonName+".json";
try {
JSONParser parse = new JSONParser();
File jsonFile = new File(path);
if(!jsonFile.exists()) {
JsonFileUtil.createJsonFile("[]", jsonPath, jsonName);
}
JSONArray jsonArray = (JSONArray) parse.parse(new FileReader(jsonFile));
return jsonArray;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 读取json文件
* @param jsonPath 文件路径
* @param jsonName 文件名称
* @return 返回JSONObject,如果发生 异常则返回null
*/
public static JSONObject readJsonToObject(String jsonPath, String jsonName) {
String path = jsonPath+"\\"+jsonName+".json";
try {
JSONParser parse = new JSONParser();
File jsonFile = new File(path);
if(!jsonFile.exists()) {
JsonFileUtil.createJsonFile("[]", path, jsonName);
}
JSONObject jsonObject = (JSONObject) parse.parse(new FileReader(jsonFile));
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

2、 JsonFormatTool.java 为json格式转换工具类

 package com.sklm.lhb.json;

 public class JsonFormatTool {

     /**
* 单位缩进字符串。
*/
private static String SPACE = " "; /**
* 返回格式化JSON字符串。
*
* @param json 未格式化的JSON字符串。
* @return 格式化的JSON字符串。
*/
public static String formatJson(String json) {
StringBuffer result = new StringBuffer();
int length = json.length();
int number = 0;
char key = 0; // 遍历输入字符串。
for (int i = 0; i < length; i++) {
// 1、获取当前字符。
key = json.charAt(i); // 2、如果当前字符是前方括号、前花括号做如下处理:
if ((key == '[') || (key == '{')) {
// (1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
result.append('\n');
result.append(indent(number));
} // (2)打印:当前字符。
result.append(key); // (3)前方括号、前花括号,的后面必须换行。打印:换行。
result.append('\n'); // (4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
number++;
result.append(indent(number)); // (5)进行下一次循环。
continue;
} // 3、如果当前字符是后方括号、后花括号做如下处理:
if ((key == ']') || (key == '}')) {
// (1)后方括号、后花括号,的前面必须换行。打印:换行。
result.append('\n'); // (2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
number--;
result.append(indent(number)); // (3)打印:当前字符。
result.append(key); // (4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
result.append('\n');
} // (5)继续下一次循环。
continue;
} // 4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
if ((key == ',')) {
result.append(key);
result.append('\n');
result.append(indent(number));
continue;
} // 5、打印:当前字符。
result.append(key);
} return result.toString();
} /**
* 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
*
* @param number 缩进次数。
* @return 指定缩进次数的字符串。
*/
private static String indent(int number) {
StringBuffer result = new StringBuffer();
for (int i = 0; i < number; i++) {
result.append(SPACE);
}
return result.toString();
}
}

3、 PersionalChestToken.java口令实现类

 package com.sklm.lhb.chestHandler;

 import java.util.List;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Chest;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; import com.sklm.lhb.persionalChest.PersionalChest; public class PersionalChestToken { /**
* 添加物品口令
* @param player 口令所有者
* @param block 要添加的口令的方块
*/
@SuppressWarnings("unchecked")
public void addToken(Player player, Block block) {
if(block.getState().getType()==Material.CHEST) {
List<MetadataValue> metaList = player.getMetadata("persionalChest");
String persionalChestMsg = null;
if(metaList.size() == 1) {
persionalChestMsg = metaList.get(0).asString();
JSONParser parse = new JSONParser();
try {
JSONArray jsonArray = (JSONArray) parse.parse(persionalChestMsg);
JSONObject jsonObject = new JSONObject();
jsonObject.put("holder", player.getName());
jsonObject.put("world", block.getLocation().getWorld().getName());
jsonObject.put("x", block.getLocation().getBlockX());
jsonObject.put("y", block.getLocation().getBlockY());
jsonObject.put("z", block.getLocation().getBlockZ());
jsonArray.add(jsonObject);
player.removeMetadata("persionalChest", PersionalChest.instance);
player.setMetadata("persionalChest", new FixedMetadataValue(PersionalChest.instance, jsonArray.toJSONString()));
} catch (ParseException e) {
e.printStackTrace();
}
}else if(metaList.size() == 0) {
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("holder", player.getName());
jsonObject.put("world", block.getLocation().getWorld().getName());
jsonObject.put("x", block.getLocation().getBlockX());
jsonObject.put("y", block.getLocation().getBlockY());
jsonObject.put("z", block.getLocation().getBlockZ());
jsonArray.add(jsonObject);
player.removeMetadata("persionalChest", PersionalChest.instance);
player.setMetadata("persionalChest", new FixedMetadataValue(PersionalChest.instance, jsonArray.toJSONString()));
}
}
} /**
* 敲碎物品时移除口令,如果该玩家没有权限敲碎该物品,则口令不会移除
* @param player 敲碎物品的玩家
* @param block 敲碎的物品
* @param event 敲碎物品检测事件
* @return 如果口令移除成功返回true,否则返回false
*/
@SuppressWarnings("unchecked")
public boolean removeToken(Player player, Block block) {
boolean flag = true;
if(block.getState().getType() == Material.CHEST) {
Chest persionalChest = (Chest) block.getState();
ItemStack[] itemAll = persionalChest.getBlockInventory().getContents();
for (ItemStack itemStack : itemAll) {
if(itemStack != null && itemStack.getType() != Material.AIR) {
flag = false;
}
}
List<MetadataValue> metaList = player.getMetadata("persionalChest");
if(metaList != null && metaList.size() == 1 && !metaList.get(0).asString().equals("[]")) {
JSONParser parse = new JSONParser();
try {
JSONArray jsonArray = (JSONArray) parse.parse(metaList.get(0).asString());
JSONObject blockJson = new JSONObject();
blockJson.put("holder", player.getName());
blockJson.put("world", block.getLocation().getWorld().getName());
blockJson.put("x", block.getLocation().getBlockX());
blockJson.put("y", block.getLocation().getBlockY());
blockJson.put("z", block.getLocation().getBlockZ());
if(jsonArray.toJSONString().contains(blockJson.toJSONString())) {
String jsonStr = jsonArray.toJSONString().replace(blockJson.toJSONString(), "").trim();
if(jsonStr.contains("},,{")) {
jsonStr = jsonStr.replace("},,{", "},{");
}else if(jsonStr.contains("[,{")) {
jsonStr = jsonStr.replace("[,{", "[{");
}else if(jsonStr.contains("},]")) {
jsonStr = jsonStr.replace("},]", "}]");
}
player.removeMetadata("persionalChest", PersionalChest.instance);
player.setMetadata("persionalChest", new FixedMetadataValue(PersionalChest.instance, jsonStr));
}else {
flag = false;
}
} catch (ParseException e) {
flag = false;
e.printStackTrace();
}
}else {
flag = false;
}
}
return flag;
} /**
* 检测口令是否正确,如果正确可以操作方块,否则无法操作方块
* @param player 要操作方块的玩家
* @param block 要操作的方块
* @return 如果口令正确返回true,否则返回false
*/
@SuppressWarnings("unchecked")
public boolean checkToken(Player player, Block block) {
boolean flag = true;
if(block.getState().getType() == Material.CHEST) {
List<MetadataValue> metaList = player.getMetadata("persionalChest");
if(metaList !=null && metaList.size()==1 && !metaList.get(0).asString().equals("[]")) {
JSONParser parse = new JSONParser();
try {
JSONArray jsonArray = (JSONArray) parse.parse(metaList.get(0).asString());
JSONObject blockJson = new JSONObject();
blockJson.put("holder", player.getName());
blockJson.put("world", block.getLocation().getWorld().getName());
blockJson.put("x", block.getLocation().getBlockX());
blockJson.put("y", block.getLocation().getBlockY());
blockJson.put("z", block.getLocation().getBlockZ());
if(!jsonArray.toJSONString().contains(blockJson.toJSONString())) {
flag = false;
}
} catch (ParseException e) {
flag = false;
e.printStackTrace();
}
}else {
flag = false;
}
}
return flag;
}
}

4、PersionalChestToken类调用

 package com.sklm.lhb.chestHandler;
import java.util.List; import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.json.simple.JSONArray; import com.sklm.lhb.json.JsonFileUtil;
import com.sklm.lhb.persionalChest.PersionalChest;
public class ChestActionHandler implements Listener { @EventHandler
public void playerPlaceChest(BlockPlaceEvent event) {
Player player = event.getPlayer();
Block block = event.getBlockPlaced();
new PersionalChestToken().addToken(player, block);
} @EventHandler
public void playerBreakChest(BlockBreakEvent event) {
Block block = event.getBlock();
Player player = event.getPlayer();
PersionalChestToken token = new PersionalChestToken();
boolean correct = token.removeToken(player, block);
if(!correct && !player.isOp()) {
event.setCancelled(true);
player.sendMessage(PersionalChest.languageSection.getString("persionalChest.permission"));
} } @EventHandler
public void playerOpenChest(PlayerInteractEvent event) {
Player player = event.getPlayer();
Block block = event.getClickedBlock();
if(event.getAction() == Action.RIGHT_CLICK_BLOCK) {
PersionalChestToken token = new PersionalChestToken();
boolean correct = token.checkToken(player, block);
if(!correct && !player.isOp()) {
event.setCancelled(true);
player.sendMessage(PersionalChest.languageSection.getString("persionalChest.permission"));
}
}
} @EventHandler
public void playerJoinEvent(PlayerJoinEvent event) {
Player player = event.getPlayer();
JSONArray jsonArray = JsonFileUtil.readJsonToArray(PersionalChest.getPath()+"player\\", player.getName());
if(jsonArray != null) {
player.setMetadata("persionalChest", new FixedMetadataValue(PersionalChest.instance, jsonArray.toJSONString()));
}
} @EventHandler
public void playerQueryGame(PlayerQuitEvent event) {
Player player = event.getPlayer();
List<MetadataValue> metaList = player.getMetadata("persionalChest");
if(metaList.size() == 1) {
JsonFileUtil.createJsonFile(metaList.get(0).asString(), PersionalChest.getPath()+"player\\", player.getName());
}
} }

Bukkit私人背包实现的更多相关文章

  1. day116:MoFang:显示背包解锁/未解锁格子数&显示背包的道具物品&背包解锁

    目录 1.显示背包的已解锁/未解锁格子数 2.显示背包中的道具物品 3.用户购买道具的时候,判断背包存储是否达到上限 4.道具也可以使用积分购买 5.在商城界面根据金额/积分显示不同商品 6.背包解锁 ...

  2. IOS学习之-私人通讯录

    通过一段时间IOS的学习完成了一个简单的应用,"私人通讯录". 运行效果如下图: 1.登录页 2.通讯录列表 3.添加 4.编辑 5.删除 6.注销 总视图结构如下图: 总结本程序 ...

  3. 创建docker私人仓库

    关于创建docker私人仓库 1.1.           安装步骤 1.1.1.            直接从公共库上面下载register镜像在本地执行 1.1.1.1.             ...

  4. 【USACO 3.1】Stamps (完全背包)

    题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...

  5. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  6. HDU2159 二维完全背包

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. CF2.D 并查集+背包

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses time limit per test 1 second memory limit p ...

  8. UVALive 4870 Roller Coaster --01背包

    题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F ,     D -= K 问在D小于等于一定限度的时 ...

  9. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

随机推荐

  1. 辅助排序和Mapreduce整体流程

    一.辅助排序 需求:先有一个订单数据文件,包含了订单id.商品id.商品价格,要求将订单id正序,商品价格倒序,且生成结果文件个数为订单id的数量,每个结果文件中只要一条该订单最贵商品的数据. 思路: ...

  2. Typescript高级类型与泛型难点详解

    最近做的TS分享,到了高级类型这一块.通过琢磨和实验还是挖掘出了一些深层的东西,在此处做一下记录,也分享给各位热爱前端的小伙伴.   其实在学习TS之前就要明确以下几点:   1. typescrip ...

  3. 2019-2-25SqlServer 中所有表、列、视图、索引、主键、外键等常用sql

    sp_help Accounts_Users     其中Accounts_Users 表示表名 sp_columns Accounts_Users exec  sp_helpconstraint   ...

  4. django——简介

    1.django的介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVT的软件设计模式,即模型Model,视图View和模板Template.它最初是被开发来用于管理劳伦 ...

  5. h5中不能用js来直接获取网络码和机器码的。

    h5中不能用js来获取mac的.是可以获取ip的.代码  <script>var fso = new ActiveXObject("Scripting.FileSystemObj ...

  6. web.xml配置文件的简单说明

    简单说一下,web.xml的加载过程.当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的 ...

  7. (87)Wangdao.com第二十天_JavaScript document 节点对象

    document 节点对象, 代表整个文档,每张网页都有自己的 document 对象. window.document 当浏览器开始加载文档时就存在了 正常的网页使用 document 或者 win ...

  8. ServletRegistrationBean的源码摘要

    感觉ServletRegistrationBean在Springboot中是一个可以看懂的类,好像作用就相当于@Controoller注解, package org.springframework.b ...

  9. [Educational Round 5][Codeforces 616F. Expensive Strings]

    这题调得我心疲力竭...Educational Round 5就过一段时间再发了_(:з」∠)_ 先后找了三份AC代码对拍,结果有两份都会在某些数据上出点问题...这场的数据有点水啊_(:з」∠)_[ ...

  10. 用JS编写个人所得税计算器

    编写 “个人所得税计算器”函数 计算个税的方法: 3500 以下免征 3500 ~ 5000 部分 缴纳 3% 5000 ~ 9000 部分 缴纳 10% 9000 以上部分 缴纳 20% 代码如下: ...