




- package net.berry64.SteadyShotAddons.MCBG;
- import java.io.File;
- import org.bukkit.Location;
- import org.bukkit.configuration.file.YamlConfiguration;
- import org.bukkit.entity.Player;
- import org.bukkit.event.Listener;
- import org.bukkit.scheduler.BukkitRunnable;
- import org.bukkit.scheduler.BukkitTask;
- import net.berry64.SteadyShot.Arenas.ArenaBase;
- import net.berry64.SteadyShot.Arenas.ArenaState;
- public class MCBGArena extends ArenaBase implements Listener{
- Location lobbyLocation = null;
- BukkitTask timer = null;
-
- @Override
- public boolean startUp() {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public void shutDown() {
- // TODO Auto-generated method stub
-
- }
- @Override
- public boolean edit(Player editor, String[] args) {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public boolean addPlayer(Player p) {
- if(players.size() >= maxPlayers || state == ArenaState.IN_GAME) //检测玩家数量&竞技场状态
- return false;
-
- if(players.size() <= 0) //更改状态
- state = ArenaState.WAITING;
-
- listAdd(p);
- this.sendMessage("§6"+p.getName()+" §a加入了游戏,当前人数 §e"+players.size()+"§a/§6 "+maxPlayers);
- if(timer == null && players.size() >= minPlayers) {
- this.sendMessage("§a游戏将会在 §660 §a秒后开始");
- timer = new BukkitRunnable() {
- int secsleft = 60; //一分钟
-
- @Override
- public void run() {
- for(Player p : players) {
- p.setLevel(secsleft); //玩家经验条等级设置为倒计时器
- }
- if(secsleft <= 0) { //到时间
- beginGame(); //private方法
- timer = null; // 方便判断
- this.cancel(); //取消计时器
- }
- }
-
- }.runTaskTimer(MCBGMain.instance, 0L, 20L); //每20ticks(约1秒)计时一次
- }
- p.teleport(lobbyLocation); //传送至大厅
- p.getInventory().clear();
- return true;
- }
- //其他一些系统默认没有更改的方法就没有写上了
- lobby:
- #bukkit自己直接储存location,将会包含X,Y,Z,世界和角度,这里是大厅传送点
- map:
- world: 世界名
- 1:
- X:
- Z:
- 2:
- X:
- Z:
这里为了方便操作,我们创建两个class第一个是CornerArea, 也就是通过两个角落生成的长方形面积
- class CornerArea {
- int ax,az,bx,bz;
-
- public CornerArea(int x1,int z1,int x2,int z2) {
- ax = x1;
- az = z1;
- bx = x2;
- bz = z2;
- }
- public void setCorner(Location loc, int point) {
- if(point == 1) {
- ax = loc.getBlockX();
- az = loc.getBlockZ();
- } else {
- bx = loc.getBlockX();
- bz = loc.getBlockZ();
- }
- }
- public void setCorners(int x1, int z1, int x2, int z2) {
- ax = x1;
- az = z1;
- bx = x2;
- bz = z2;
- }
- public int getBaseX() {
- return Math.min(ax, bx);
- }
- public int getBaseZ() {
- return Math.min(az, bz);
- }
- public int getSizeX() {
- return Math.abs(ax-bx);
- }
- public int getSizeZ() {
- return Math.abs(az-bz);
- }
- public int getRandomCenterX(int margins) {
- return getBaseX()+margins+(int)(Math.random()*(getSizeX()-(2*margins)));
- }
- public int getRandomCenterZ(int margins) {
- return getBaseZ()+margins+(int)(Math.random()*(getSizeZ()-(2*margins)));
- }
- public CenterArea getCenterArea() {
- return new CenterArea(getBaseX()+(getSizeX()/2), getBaseZ()+(getSizeZ()/2), getSizeX()/2, getSizeZ()/2);
- }
-
- public void paintEdges(paintType t) {
- if(t == paintType.RED) {
-
- }
- else if(t==paintType.WHITE) {
-
- }
- else if(t == paintType.REMOVE) {
-
- }
- }
- enum paintType{
- RED,
- WHITE,
- REMOVE;
- }
- }
- class CenterArea {
- int cx,cz,xr,zr;
-
- public CenterArea(int centerx,int centerz, int rangex, int rangez) {
- cx = centerx;
- cz = centerz;
- xr = rangex;
- zr = rangez;
- }
- public void setCenter(int x, int z) {
- cx = x;
- cz = z;
- }
- public void setRange(int rangex,int rangez) {
- xr = rangex;
- zr = rangez;
- }
- public CornerArea getCornerArea() {
- return new CornerArea(cx-xr,cz-zr,cx+xr,cz+zr);
- }
- }
然后编辑地图部分:
- @Override
- public boolean edit(Player editor, String[] args) {
- if(args.length <= 0)
- editor.sendMessage("§c错误:请输入可以识别的指令"); //排除arrayindexoutofbounds
-
- else if(args[0].equalsIgnoreCase("setlobby")) {
- lobbyLocation = editor.getLocation(); //免去设置后需要重读文件
- yml.set("lobby", editor.getLocation()); //bukkit可以直接储存location信息
- save(); //刚刚写的储存文件的方法,可以直接用yml.save(f)代替
- editor.sendMessage("§a成功设置 §6大厅");
- }
-
- else if(args[0].equalsIgnoreCase("setWorld")) {
- //设置世界
- if(args.length > 1) {
- yml.set("map.world", args[1]);
- world = args[1];
- editor.sendMessage("§a成功设置,如果输入的世界不存在将会报错");
- } else {
- yml.set("map.world", editor.getWorld().getName());
- world = editor.getWorld().getName();
- editor.sendMessage("§a成功设置为当前世界");
- }
- save();
- }
-
- else if(args[0].equalsIgnoreCase("setmap")) {
- if(args.length > 1) {
- int loc = 1;
-
- try { loc = Integer.valueOf(args[1]); } catch (NumberFormatException e) {editor.sendMessage("§c你必须输入一个数字!"); return true;}
- if(loc <= 0 || loc >= 3) {editor.sendMessage("§c数字必须为1或2"); return true;}
-
- gameboard.setCorner(editor.getLocation(), loc);
- yml.set("map."+loc+".x", editor.getLocation().getBlockX());
- yml.set("map."+loc+".z", editor.getLocation().getBlockZ());
- save();
- editor.sendMessage("§a设置成功");
- } else {
- editor.sendMessage("§c使用方法: §esetmap [1/2]");
- }
- }
-
- else {
- editor.sendMessage("§c错误: 未识别的命令");
- }
- return true; //信仰:永不return false
- }
- @Override
- public boolean loadArena() {
- lobbyLocation = (Location) yml.get("lobby"); //大厅
-
- world = yml.getString("map.world"); //变量world赋值(刚刚定义的一个string)
- int x1 = yml.getInt("map.1.x"); int z1 = yml.getInt("map.1.z");
- int x2 = yml.getInt("map.2.x"); int z2 = yml.getInt("map.2.z");
- gameboard = new CornerArea(x1,z1,x2,z2);
- return true;
- }
- private void beginGame() {
- state = ArenaState.IN_GAME; //设定状态为游戏中(至此游戏已经开始)
- int x = x1+(x2-x1)/5+(int)(Math.random()*(x2-x1-(x2-x1)/5)); //x2-x1获取竞技场宽度,随机生成但不太靠边缘,距离边缘1/5距离
- int z = z1+(z2-z1)/5+(int)(Math.random()*(z2-z1-(z2-z1)/5)); //同上,这部分可能有点复杂,仔细想想就好了
-
- //在y=175生成一个5*5的玻璃平台
- World w = MCBGMain.instance.getServer().getWorld(world);
- for(int i = x-2; i <= x+2; i++) {
- for(int k = z-2; k <= z+2; k++) {
- w.getBlockAt(i,175,k).setType(Material.GLASS);
- }
- }
-
- for(Player p:players) {
- p.teleport(new Location(w,x,176,z)); //传送所有玩家
- p.getInventory().setChestplate(new ItemStack(Material.ELYTRA, 1)); //给予玩家翅膀并装备到胸甲栏
- }
- }
