From d49869a92910ee37cbe261a863384fae93c7ddde Mon Sep 17 00:00:00 2001 From: AlphaAE Date: Sat, 11 May 2019 16:30:23 +0800 Subject: [PATCH] updata tp 1 --- .../mcpe/servers/command/HiCommand.java | 4 +- .../block/joinquit/LoadPlayerDataBlock.java | 11 ++-- .../mcpe/servers/form/FormWindowMeun.java | 14 +++-- .../mcpe/servers/form/FormWindowTeleport.java | 54 +++++++++++++++---- .../alphaae/mcpe/servers/model/RePlayer.java | 12 ++++- .../mcpe/servers/model/UserLocation.java | 28 +++++++++- .../servers/utils/ChangePlayerCoinUtils.java | 6 +-- .../mcpe/servers/utils/PlayerDataUtils.java | 50 +++++++++++++---- 8 files changed, 143 insertions(+), 36 deletions(-) diff --git a/src/com/alphaae/mcpe/servers/command/HiCommand.java b/src/com/alphaae/mcpe/servers/command/HiCommand.java index a58118d..c351cdd 100644 --- a/src/com/alphaae/mcpe/servers/command/HiCommand.java +++ b/src/com/alphaae/mcpe/servers/command/HiCommand.java @@ -8,6 +8,7 @@ import cn.nukkit.utils.TextFormat; import com.alphaae.mcpe.servers.MainPlugin; import com.alphaae.mcpe.servers.StaticData; import com.alphaae.mcpe.servers.model.RePlayer; +import com.alphaae.mcpe.servers.model.UserLocation; import com.alphaae.mcpe.servers.utils.ChangePlayerCoinUtils; import java.util.UUID; @@ -34,8 +35,7 @@ public class HiCommand extends Command { //测试指令 RePlayer rePlayer = StaticData.rePlayerMap.get(uuid); ChangePlayerCoinUtils.ReduceIcon(rePlayer, 100); - - player.dropItem(new Item(347)); + rePlayer.putUserLocation("坐标1", new UserLocation(player.getX(), player.getY(), player.getZ(), player.getLevel().getName())); return true; } return false; diff --git a/src/com/alphaae/mcpe/servers/event/block/joinquit/LoadPlayerDataBlock.java b/src/com/alphaae/mcpe/servers/event/block/joinquit/LoadPlayerDataBlock.java index 7ae3642..a9ee81c 100644 --- a/src/com/alphaae/mcpe/servers/event/block/joinquit/LoadPlayerDataBlock.java +++ b/src/com/alphaae/mcpe/servers/event/block/joinquit/LoadPlayerDataBlock.java @@ -8,6 +8,8 @@ import com.alphaae.mcpe.servers.StaticData; import com.alphaae.mcpe.servers.model.RePlayer; import com.alphaae.mcpe.servers.utils.PlayerDataUtils; +import java.util.UUID; + public class LoadPlayerDataBlock implements JoinQuitEventBlock { @Override @@ -16,18 +18,21 @@ public class LoadPlayerDataBlock implements JoinQuitEventBlock { //读取数据 RePlayer rePlayer = PlayerDataUtils.LoadData(player); + StaticData.rePlayerMap.put(player.getUniqueId(), rePlayer); + //设置玩家部分属性 String title = rePlayer.getTitle(); - player.setNameTag(TextFormat.colorize("&e[" + title + "] &b" + player.getName() + "&f")); player.setDisplayName(TextFormat.colorize("&e[" + title + "] &b" + player.getName() + "&f")); - StaticData.rePlayerMap.put(player.getUniqueId(), rePlayer); } @Override public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); - StaticData.rePlayerMap.remove(player.getUniqueId()); + UUID uuid = player.getUniqueId(); + RePlayer rePlayer = StaticData.rePlayerMap.get(uuid); + PlayerDataUtils.SaveData(rePlayer); + StaticData.rePlayerMap.remove(uuid); } diff --git a/src/com/alphaae/mcpe/servers/form/FormWindowMeun.java b/src/com/alphaae/mcpe/servers/form/FormWindowMeun.java index 9dd65f0..6f92251 100644 --- a/src/com/alphaae/mcpe/servers/form/FormWindowMeun.java +++ b/src/com/alphaae/mcpe/servers/form/FormWindowMeun.java @@ -14,14 +14,18 @@ import com.sun.istack.internal.NotNull; public class FormWindowMeun extends FormWindowSimple implements FormEvent { + private transient Player player; + private transient RePlayer rePlayer; + public FormWindowMeun(@NotNull Player player) { super("我", ""); - RePlayer rePlayer = StaticData.rePlayerMap.get(player.getUniqueId()); - createContents(player, rePlayer); - createButtons(player, rePlayer); + this.player = player; + this.rePlayer = StaticData.rePlayerMap.get(player.getUniqueId()); + createContents(); + initButtons(); } - private void createContents(Player player, RePlayer rePlayer) { + private void createContents() { String name = player.getName(); String content = TextFormat.colorize("&b" + name + "&f\n" + "---------------------------------\n" + @@ -32,7 +36,7 @@ public class FormWindowMeun extends FormWindowSimple implements FormEvent { setContent(content); } - private void createButtons(Player player, RePlayer rePlayer) { + private void initButtons() { addButton(new ElementButton("传送", new ElementButtonImageData(ElementButtonImageData.IMAGE_DATA_TYPE_PATH, "textures/items/ender_pearl.png"))); addButton(new ElementButton("任务", new ElementButtonImageData(ElementButtonImageData.IMAGE_DATA_TYPE_PATH, "textures/items/book_writable.png"))); addButton(new ElementButton("升级", new ElementButtonImageData(ElementButtonImageData.IMAGE_DATA_TYPE_PATH, "textures/items/iron_pickaxe.png"))); diff --git a/src/com/alphaae/mcpe/servers/form/FormWindowTeleport.java b/src/com/alphaae/mcpe/servers/form/FormWindowTeleport.java index e05251d..4d9ec7a 100644 --- a/src/com/alphaae/mcpe/servers/form/FormWindowTeleport.java +++ b/src/com/alphaae/mcpe/servers/form/FormWindowTeleport.java @@ -6,34 +6,52 @@ import cn.nukkit.form.element.ElementButton; import cn.nukkit.form.element.ElementButtonImageData; import cn.nukkit.form.response.FormResponseSimple; import cn.nukkit.form.window.FormWindowSimple; +import cn.nukkit.level.Level; import cn.nukkit.level.Location; import cn.nukkit.level.Position; import cn.nukkit.utils.TextFormat; +import com.alphaae.mcpe.servers.MainPlugin; import com.alphaae.mcpe.servers.StaticData; import com.alphaae.mcpe.servers.event.block.form.FormEvent; import com.alphaae.mcpe.servers.model.RePlayer; +import com.alphaae.mcpe.servers.model.UserLocation; import com.sun.istack.internal.NotNull; +import java.util.Iterator; +import java.util.Map; + public class FormWindowTeleport extends FormWindowSimple implements FormEvent { + private transient Player player; + private transient RePlayer rePlayer; + public FormWindowTeleport(@NotNull Player player) { super("传送地点", ""); - RePlayer rePlayer = StaticData.rePlayerMap.get(player.getUniqueId()); - createContents(player, rePlayer); - createButtons(player, rePlayer); + this.player = player; + this.rePlayer = StaticData.rePlayerMap.get(player.getUniqueId()); + createContents(); + initButtons(); } - private void createContents(Player player, RePlayer rePlayer) { + private void createContents() { } - private void createButtons(Player player, RePlayer rePlayer) { + private void initButtons() { addButton(new ElementButton("返回")); addButton(new ElementButton("上次死亡地点")); addButton(new ElementButton("主城")); - addButton(new ElementButton("")); + Map userLocationMap = rePlayer.getUserLocationMap(); + Iterator iterator = userLocationMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = (Map.Entry) iterator.next(); + String key = (String) entry.getKey(); + UserLocation value = (UserLocation) entry.getValue(); + addButton(new ElementButton(key + " ( " + value.getLevelName() + " )")); + } } public void RespondedEvent(PlayerFormRespondedEvent event) { +// long begin = System.currentTimeMillis(); String clickedText = ((FormResponseSimple) event.getResponse()).getClickedButton().getText(); Player player = event.getPlayer(); if (!event.wasClosed()) { @@ -41,16 +59,32 @@ public class FormWindowTeleport extends FormWindowSimple implements FormEvent { case "返回": FormWindowMeun formWindowMeun = new FormWindowMeun(player); player.showFormWindow(formWindowMeun); - break; + return; case "上次死亡地点": player.sendMessage("" + player.getLevel().getName()); - break; + return; case "主城": Position spawnLocation = player.getLevel().getSpawnLocation(); player.teleport(spawnLocation); - break; - + return; } + Map userLocationMap = rePlayer.getUserLocationMap(); + Iterator iterator = userLocationMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = (Map.Entry) iterator.next(); + String key = (String) entry.getKey(); + UserLocation value = (UserLocation) entry.getValue(); + if (clickedText.equals(key + " ( " + value.getLevelName() + " )")) { + Level level = MainPlugin.getPlugin().getServer().getLevelByName(value.getLevelName()); + Position position = new Position(value.getX(), value.getY(), value.getZ(), level); + player.teleport(position); +// long time = System.currentTimeMillis() - begin; +// MainPlugin.getPlugin().getServer().getLogger().info("耗时:" + time + " ms"); + return; + } + } + + } } diff --git a/src/com/alphaae/mcpe/servers/model/RePlayer.java b/src/com/alphaae/mcpe/servers/model/RePlayer.java index 211f620..9bee22f 100644 --- a/src/com/alphaae/mcpe/servers/model/RePlayer.java +++ b/src/com/alphaae/mcpe/servers/model/RePlayer.java @@ -1,11 +1,12 @@ package com.alphaae.mcpe.servers.model; -import java.io.Serializable; +import com.google.gson.Gson; + import java.util.HashMap; import java.util.Map; import java.util.UUID; -public class RePlayer implements Serializable { +public class RePlayer { private UUID uuid; //称号 private String title; @@ -66,5 +67,12 @@ public class RePlayer implements Serializable { } } + public String getJSONData() { + return (new Gson()).toJson(this); + } + + public static RePlayer decodeObject(String json) { + return (new Gson()).fromJson(json, RePlayer.class); + } } \ No newline at end of file diff --git a/src/com/alphaae/mcpe/servers/model/UserLocation.java b/src/com/alphaae/mcpe/servers/model/UserLocation.java index 3eb2d86..6ccdf72 100644 --- a/src/com/alphaae/mcpe/servers/model/UserLocation.java +++ b/src/com/alphaae/mcpe/servers/model/UserLocation.java @@ -2,6 +2,32 @@ package com.alphaae.mcpe.servers.model; import java.io.Serializable; -public class UserLocation implements Serializable { +public class UserLocation { + private double x; + private double y; + private double z; + private String levelName; + public UserLocation(double x, double y, double z, String levelName) { + this.x = x; + this.y = y; + this.z = z; + this.levelName = levelName; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public String getLevelName() { + return levelName; + } } diff --git a/src/com/alphaae/mcpe/servers/utils/ChangePlayerCoinUtils.java b/src/com/alphaae/mcpe/servers/utils/ChangePlayerCoinUtils.java index 8397f91..4ad671d 100644 --- a/src/com/alphaae/mcpe/servers/utils/ChangePlayerCoinUtils.java +++ b/src/com/alphaae/mcpe/servers/utils/ChangePlayerCoinUtils.java @@ -11,7 +11,7 @@ public class ChangePlayerCoinUtils { int userCoin = rePlayer.getCoin(); int newCoin = userCoin + count; rePlayer.setCoin(newCoin); - return PlayerDataUtils.ChangeData(rePlayer); + return PlayerDataUtils.SaveData(rePlayer); } public static boolean ReduceIcon(RePlayer rePlayer, int count) { @@ -19,7 +19,7 @@ public class ChangePlayerCoinUtils { int newCoin = userCoin - count; if (newCoin >= 0) { rePlayer.setCoin(newCoin); - return PlayerDataUtils.ChangeData(rePlayer); + return PlayerDataUtils.SaveData(rePlayer); } Player player = MainPlugin.getPlugin().getServer().getPlayer(rePlayer.getUuid()).get(); player.sendMessage(TextFormat.colorize("&4硬币不足")); @@ -34,7 +34,7 @@ public class ChangePlayerCoinUtils { if (newCoin1 >= 0) { rePlayer1.setCoin(newCoin1); rePlayer2.setCoin(newCoin2); - return PlayerDataUtils.ChangeData(rePlayer1) & PlayerDataUtils.ChangeData(rePlayer2); + return PlayerDataUtils.SaveData(rePlayer1) & PlayerDataUtils.SaveData(rePlayer2); } Player player = MainPlugin.getPlugin().getServer().getPlayer(rePlayer1.getUuid()).get(); player.sendMessage(TextFormat.colorize("&4硬币不足")); diff --git a/src/com/alphaae/mcpe/servers/utils/PlayerDataUtils.java b/src/com/alphaae/mcpe/servers/utils/PlayerDataUtils.java index 64def40..62a301d 100644 --- a/src/com/alphaae/mcpe/servers/utils/PlayerDataUtils.java +++ b/src/com/alphaae/mcpe/servers/utils/PlayerDataUtils.java @@ -4,8 +4,14 @@ import cn.nukkit.Player; import cn.nukkit.item.Item; import com.alphaae.mcpe.servers.MainPlugin; import com.alphaae.mcpe.servers.model.RePlayer; +import com.alphaae.mcpe.servers.model.UserLocation; import java.io.*; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.channels.FileChannel; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; import java.util.UUID; public class PlayerDataUtils { @@ -23,12 +29,34 @@ public class PlayerDataUtils { public static RePlayer LoadData(Player player) { UUID uuid = player.getUniqueId(); try { +// long begin = System.currentTimeMillis(); File playerDataFile = new File(PLAYER_DATA_FOLDER, uuid.toString() + FILE_TYPE); if (!playerDataFile.exists()) { - CreateNewPlayerData(player); + if (!CreateNewPlayerData(player)) + return null; } - ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(playerDataFile)); - RePlayer rePlayer = (RePlayer) inputStream.readObject(); + //NIOs + StringBuilder json = new StringBuilder(); + Charset charset = Charset.forName("UTF-8"); + CharsetDecoder decoder = charset.newDecoder(); + FileInputStream inputStream = new FileInputStream(playerDataFile); + FileChannel channel = inputStream.getChannel(); + ByteBuffer byteBuffer = ByteBuffer.allocate(1024); //初始化缓冲区大小 + CharBuffer charBuffer = CharBuffer.allocate(1024); + channel.read(byteBuffer); //将文件通道里面的字节读到缓冲区中 + byteBuffer.flip(); //将position置为0,limit放到position位置 + decoder.decode(byteBuffer, charBuffer, false); //解码 + charBuffer.flip(); + while (charBuffer.hasRemaining()) { + json.append(charBuffer.get()); + } + channel.close(); + inputStream.close(); + + RePlayer rePlayer = RePlayer.decodeObject(json.toString()); //解码对象 + MainPlugin.getPlugin().getServer().getLogger().info("" + rePlayer.getJSONData()); +// long time = System.currentTimeMillis() - begin; +// MainPlugin.getPlugin().getServer().getLogger().info("角色数据载入耗时:" + time + " ms"); return rePlayer; } catch (Exception e) { e.printStackTrace(); @@ -36,12 +64,16 @@ public class PlayerDataUtils { return null; } - public static boolean ChangeData(RePlayer rePlayer) { + public static boolean SaveData(RePlayer rePlayer) { File playerDataFile = new File(PLAYER_DATA_FOLDER, rePlayer.getUuid().toString() + FILE_TYPE); try { - ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(playerDataFile, false)); - outputStream.writeObject(rePlayer); + //NIO + FileOutputStream outputStream = new FileOutputStream(playerDataFile); + FileChannel channel = outputStream.getChannel(); + ByteBuffer buffer = ByteBuffer.wrap(rePlayer.getJSONData().getBytes("UTF-8")); + channel.write(buffer); + channel.close(); outputStream.close(); return true; } catch (IOException e) { @@ -57,12 +89,10 @@ public class PlayerDataUtils { player.getInventory().addItem(new Item(347)); RePlayer rePlayer = new RePlayer(uuid, "新火", 2000); + File playerDataFile = new File(PLAYER_DATA_FOLDER, uuid.toString() + FILE_TYPE); playerDataFile.createNewFile(); - ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(playerDataFile)); - outputStream.writeObject(rePlayer); - outputStream.close(); - return true; + return SaveData(rePlayer); } catch (IOException e) { e.printStackTrace(); }