updata tp 1

This commit is contained in:
AlphaAE
2019-05-11 16:30:23 +08:00
parent 32aa6d0f9c
commit d49869a929
8 changed files with 143 additions and 36 deletions

View File

@ -8,6 +8,7 @@ import cn.nukkit.utils.TextFormat;
import com.alphaae.mcpe.servers.MainPlugin; import com.alphaae.mcpe.servers.MainPlugin;
import com.alphaae.mcpe.servers.StaticData; import com.alphaae.mcpe.servers.StaticData;
import com.alphaae.mcpe.servers.model.RePlayer; import com.alphaae.mcpe.servers.model.RePlayer;
import com.alphaae.mcpe.servers.model.UserLocation;
import com.alphaae.mcpe.servers.utils.ChangePlayerCoinUtils; import com.alphaae.mcpe.servers.utils.ChangePlayerCoinUtils;
import java.util.UUID; import java.util.UUID;
@ -34,8 +35,7 @@ public class HiCommand extends Command {
//测试指令 //测试指令
RePlayer rePlayer = StaticData.rePlayerMap.get(uuid); RePlayer rePlayer = StaticData.rePlayerMap.get(uuid);
ChangePlayerCoinUtils.ReduceIcon(rePlayer, 100); ChangePlayerCoinUtils.ReduceIcon(rePlayer, 100);
rePlayer.putUserLocation("坐标1", new UserLocation(player.getX(), player.getY(), player.getZ(), player.getLevel().getName()));
player.dropItem(new Item(347));
return true; return true;
} }
return false; return false;

View File

@ -8,6 +8,8 @@ import com.alphaae.mcpe.servers.StaticData;
import com.alphaae.mcpe.servers.model.RePlayer; import com.alphaae.mcpe.servers.model.RePlayer;
import com.alphaae.mcpe.servers.utils.PlayerDataUtils; import com.alphaae.mcpe.servers.utils.PlayerDataUtils;
import java.util.UUID;
public class LoadPlayerDataBlock implements JoinQuitEventBlock { public class LoadPlayerDataBlock implements JoinQuitEventBlock {
@Override @Override
@ -16,18 +18,21 @@ public class LoadPlayerDataBlock implements JoinQuitEventBlock {
//读取数据 //读取数据
RePlayer rePlayer = PlayerDataUtils.LoadData(player); RePlayer rePlayer = PlayerDataUtils.LoadData(player);
StaticData.rePlayerMap.put(player.getUniqueId(), rePlayer);
//设置玩家部分属性
String title = rePlayer.getTitle(); String title = rePlayer.getTitle();
player.setNameTag(TextFormat.colorize("&e[" + title + "] &b" + player.getName() + "&f")); player.setNameTag(TextFormat.colorize("&e[" + title + "] &b" + player.getName() + "&f"));
player.setDisplayName(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 @Override
public void onPlayerQuit(PlayerQuitEvent event) { public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer(); 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);
} }

View File

@ -14,14 +14,18 @@ import com.sun.istack.internal.NotNull;
public class FormWindowMeun extends FormWindowSimple implements FormEvent { public class FormWindowMeun extends FormWindowSimple implements FormEvent {
private transient Player player;
private transient RePlayer rePlayer;
public FormWindowMeun(@NotNull Player player) { public FormWindowMeun(@NotNull Player player) {
super("", ""); super("", "");
RePlayer rePlayer = StaticData.rePlayerMap.get(player.getUniqueId()); this.player = player;
createContents(player, rePlayer); this.rePlayer = StaticData.rePlayerMap.get(player.getUniqueId());
createButtons(player, rePlayer); createContents();
initButtons();
} }
private void createContents(Player player, RePlayer rePlayer) { private void createContents() {
String name = player.getName(); String name = player.getName();
String content = TextFormat.colorize("&b" + name + "&f\n" + String content = TextFormat.colorize("&b" + name + "&f\n" +
"---------------------------------\n" + "---------------------------------\n" +
@ -32,7 +36,7 @@ public class FormWindowMeun extends FormWindowSimple implements FormEvent {
setContent(content); 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/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/book_writable.png")));
addButton(new ElementButton("升级", new ElementButtonImageData(ElementButtonImageData.IMAGE_DATA_TYPE_PATH, "textures/items/iron_pickaxe.png"))); addButton(new ElementButton("升级", new ElementButtonImageData(ElementButtonImageData.IMAGE_DATA_TYPE_PATH, "textures/items/iron_pickaxe.png")));

View File

@ -6,34 +6,52 @@ import cn.nukkit.form.element.ElementButton;
import cn.nukkit.form.element.ElementButtonImageData; import cn.nukkit.form.element.ElementButtonImageData;
import cn.nukkit.form.response.FormResponseSimple; import cn.nukkit.form.response.FormResponseSimple;
import cn.nukkit.form.window.FormWindowSimple; import cn.nukkit.form.window.FormWindowSimple;
import cn.nukkit.level.Level;
import cn.nukkit.level.Location; import cn.nukkit.level.Location;
import cn.nukkit.level.Position; import cn.nukkit.level.Position;
import cn.nukkit.utils.TextFormat; import cn.nukkit.utils.TextFormat;
import com.alphaae.mcpe.servers.MainPlugin;
import com.alphaae.mcpe.servers.StaticData; import com.alphaae.mcpe.servers.StaticData;
import com.alphaae.mcpe.servers.event.block.form.FormEvent; import com.alphaae.mcpe.servers.event.block.form.FormEvent;
import com.alphaae.mcpe.servers.model.RePlayer; import com.alphaae.mcpe.servers.model.RePlayer;
import com.alphaae.mcpe.servers.model.UserLocation;
import com.sun.istack.internal.NotNull; import com.sun.istack.internal.NotNull;
import java.util.Iterator;
import java.util.Map;
public class FormWindowTeleport extends FormWindowSimple implements FormEvent { public class FormWindowTeleport extends FormWindowSimple implements FormEvent {
private transient Player player;
private transient RePlayer rePlayer;
public FormWindowTeleport(@NotNull Player player) { public FormWindowTeleport(@NotNull Player player) {
super("传送地点", ""); super("传送地点", "");
RePlayer rePlayer = StaticData.rePlayerMap.get(player.getUniqueId()); this.player = player;
createContents(player, rePlayer); this.rePlayer = StaticData.rePlayerMap.get(player.getUniqueId());
createButtons(player, rePlayer); 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("上次死亡地点"));
addButton(new ElementButton("主城")); addButton(new ElementButton("主城"));
addButton(new ElementButton("")); Map<String, UserLocation> 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) { public void RespondedEvent(PlayerFormRespondedEvent event) {
// long begin = System.currentTimeMillis();
String clickedText = ((FormResponseSimple) event.getResponse()).getClickedButton().getText(); String clickedText = ((FormResponseSimple) event.getResponse()).getClickedButton().getText();
Player player = event.getPlayer(); Player player = event.getPlayer();
if (!event.wasClosed()) { if (!event.wasClosed()) {
@ -41,16 +59,32 @@ public class FormWindowTeleport extends FormWindowSimple implements FormEvent {
case "返回": case "返回":
FormWindowMeun formWindowMeun = new FormWindowMeun(player); FormWindowMeun formWindowMeun = new FormWindowMeun(player);
player.showFormWindow(formWindowMeun); player.showFormWindow(formWindowMeun);
break; return;
case "上次死亡地点": case "上次死亡地点":
player.sendMessage("" + player.getLevel().getName()); player.sendMessage("" + player.getLevel().getName());
break; return;
case "主城": case "主城":
Position spawnLocation = player.getLevel().getSpawnLocation(); Position spawnLocation = player.getLevel().getSpawnLocation();
player.teleport(spawnLocation); player.teleport(spawnLocation);
break; return;
} }
Map<String, UserLocation> 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;
}
}
} }
} }

View File

@ -1,11 +1,12 @@
package com.alphaae.mcpe.servers.model; package com.alphaae.mcpe.servers.model;
import java.io.Serializable; import com.google.gson.Gson;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
public class RePlayer implements Serializable { public class RePlayer {
private UUID uuid; private UUID uuid;
//称号 //称号
private String title; 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);
}
} }

View File

@ -2,6 +2,32 @@ package com.alphaae.mcpe.servers.model;
import java.io.Serializable; 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;
}
} }

View File

@ -11,7 +11,7 @@ public class ChangePlayerCoinUtils {
int userCoin = rePlayer.getCoin(); int userCoin = rePlayer.getCoin();
int newCoin = userCoin + count; int newCoin = userCoin + count;
rePlayer.setCoin(newCoin); rePlayer.setCoin(newCoin);
return PlayerDataUtils.ChangeData(rePlayer); return PlayerDataUtils.SaveData(rePlayer);
} }
public static boolean ReduceIcon(RePlayer rePlayer, int count) { public static boolean ReduceIcon(RePlayer rePlayer, int count) {
@ -19,7 +19,7 @@ public class ChangePlayerCoinUtils {
int newCoin = userCoin - count; int newCoin = userCoin - count;
if (newCoin >= 0) { if (newCoin >= 0) {
rePlayer.setCoin(newCoin); rePlayer.setCoin(newCoin);
return PlayerDataUtils.ChangeData(rePlayer); return PlayerDataUtils.SaveData(rePlayer);
} }
Player player = MainPlugin.getPlugin().getServer().getPlayer(rePlayer.getUuid()).get(); Player player = MainPlugin.getPlugin().getServer().getPlayer(rePlayer.getUuid()).get();
player.sendMessage(TextFormat.colorize("&4硬币不足")); player.sendMessage(TextFormat.colorize("&4硬币不足"));
@ -34,7 +34,7 @@ public class ChangePlayerCoinUtils {
if (newCoin1 >= 0) { if (newCoin1 >= 0) {
rePlayer1.setCoin(newCoin1); rePlayer1.setCoin(newCoin1);
rePlayer2.setCoin(newCoin2); 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 player = MainPlugin.getPlugin().getServer().getPlayer(rePlayer1.getUuid()).get();
player.sendMessage(TextFormat.colorize("&4硬币不足")); player.sendMessage(TextFormat.colorize("&4硬币不足"));

View File

@ -4,8 +4,14 @@ import cn.nukkit.Player;
import cn.nukkit.item.Item; import cn.nukkit.item.Item;
import com.alphaae.mcpe.servers.MainPlugin; import com.alphaae.mcpe.servers.MainPlugin;
import com.alphaae.mcpe.servers.model.RePlayer; import com.alphaae.mcpe.servers.model.RePlayer;
import com.alphaae.mcpe.servers.model.UserLocation;
import java.io.*; 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; import java.util.UUID;
public class PlayerDataUtils { public class PlayerDataUtils {
@ -23,12 +29,34 @@ public class PlayerDataUtils {
public static RePlayer LoadData(Player player) { public static RePlayer LoadData(Player player) {
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
try { try {
// long begin = System.currentTimeMillis();
File playerDataFile = new File(PLAYER_DATA_FOLDER, uuid.toString() + FILE_TYPE); File playerDataFile = new File(PLAYER_DATA_FOLDER, uuid.toString() + FILE_TYPE);
if (!playerDataFile.exists()) { if (!playerDataFile.exists()) {
CreateNewPlayerData(player); if (!CreateNewPlayerData(player))
return null;
} }
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(playerDataFile)); //NIOs
RePlayer rePlayer = (RePlayer) inputStream.readObject(); 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置为0limit放到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; return rePlayer;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -36,12 +64,16 @@ public class PlayerDataUtils {
return null; 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); File playerDataFile = new File(PLAYER_DATA_FOLDER, rePlayer.getUuid().toString() + FILE_TYPE);
try { try {
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(playerDataFile, false)); //NIO
outputStream.writeObject(rePlayer); 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(); outputStream.close();
return true; return true;
} catch (IOException e) { } catch (IOException e) {
@ -57,12 +89,10 @@ public class PlayerDataUtils {
player.getInventory().addItem(new Item(347)); player.getInventory().addItem(new Item(347));
RePlayer rePlayer = new RePlayer(uuid, "新火", 2000); RePlayer rePlayer = new RePlayer(uuid, "新火", 2000);
File playerDataFile = new File(PLAYER_DATA_FOLDER, uuid.toString() + FILE_TYPE); File playerDataFile = new File(PLAYER_DATA_FOLDER, uuid.toString() + FILE_TYPE);
playerDataFile.createNewFile(); playerDataFile.createNewFile();
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(playerDataFile)); return SaveData(rePlayer);
outputStream.writeObject(rePlayer);
outputStream.close();
return true;
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }