Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 2575|回复: 19

[插件开发教程] [Tutorial][Bukkit][CPS]可能是最简单的Scoreboard教程

[复制链接]
602723113 当前离线
积分
5236
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2014-8-7
查看详细资料
 楼主| 发表于 2020-3-18 21:30:11 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 602723113 于 2020-3-22 16:17 编辑

目录:
  • 导读
  • Scoreboard的基本概念
  • 使用Scoreboard进行展示数据给玩家
  • 制作无闪计分板
  • 如何使用Minecraft自带的Team

导读
好久没有更新教程了,woc昨天就发过教程(锡兰梗
本教程使用的 PaperSpigot1.15.2-R0.1-SNAPSHOT 核心 在阅读之前请确保你具有Java基础的知识(别问,问就挨打)
To 读者: 本教程适合所有年龄向的人,因为我们是面向剪切板编程

Scoreboard的基本概念
在教程开始前我们来了解一下Scoreboard  
  • 记分板(Scoreboard)系统是一套通过命令操纵的复杂游戏机制。主要为地图作者与服务器运营者准备,记分板可用多种形式追踪、设置并列出玩家及实体的分数。
  • 记分项(Objective)由名称(name)、显示名称(display name)、准则(criteria)以及每位玩家(及实体UUID)所对应的整数数据组成。分数的范围为-2,147,483,6482,147,483,647没有小数。
  • 准则(criteria)
  • 显示位置(DisplaySlot)

若读者有制作CB的经验,那么上方的基本概念可以跳过

在有了上方对记分板的基本概念后,我们来查询一下Bukkit API中对Scoreboard的包装
我吹爆中文BukkitAPI

可以在上方的Javadoc的查询知道,在Bukkit当中,所有关于Scoreboard的操作都被放到 org.bukkit.scoreboard 包下了,之后我们就来看一下,要怎么正确的使用一个记分板吧

在阅读教程之前我强烈建议先看一看中文MinecraftWiki再来阅读本文


使用Scoreboard进行展示数据给玩家
接下来我们就来看看如何进行操作 首先我们需要的是ScoreboardManager这个接口的对象,怎么获取呢?我可以通过下方代码实现
  1. ScoreboardManager manager = Bukkit.getScoreboardManager();
复制代码
在Bukkit这个静态类中,BukkitAPI已经帮我们造好了轮子,我们可以直接使用 接下来我们就需要得到一个叫 Scoreboard 接口的对象,我们可以通过manager里的方法来进行获得
  1. Scoreboard scoreboard = manager.getNewScoreboard();
复制代码
为什么要用 getNewScoreboard() 呢?
因为这样我们只会新建出一个Scoreboard,这个Scoreboard是不会受原版指令的限制的Scoreboard

之后我们需要新建一个计分项,也就是Objective,接下来看我的操作
  1. Objective objective = scoreboard.registerNewObjective("内部名字", "dummy", "§a我是展示名~~");
复制代码
首先我们看上面的三个参数,name,criteria,displayName,那么对应过来的就是计分项的内部名字和准则与展示名
  • 内部名字: 用于scoreboard.getObjective()时填入, 可直接获取Objective
  • 准则: 此 Objective 的准则,表示只能通过插件修改分数
  • 展示名: 也就是计分板头上的那个标题,比如下图的 Scoreboard 就是展示名
    scoreboard.png

为什么要写 dummy 呢?
因为 dummy 型的准则更适合于插件开发, 并且它不会被玩家死亡或击杀变动

之后我们给Objective设置显示的位置
  1. objective.setDisplaySlot(DisplaySlot.SIDEBAR);
复制代码
我们来解释一下这个显示位置的问题: DisplaySlot这个枚举列举了所有Objective可以存在的地方
  • PLAYER_LIST (玩家Tab里)
  • SIDEBAR(侧边栏)
  • BELOW_NAME (玩家头上NameTag的下面)
那么接下来我们就要往 Objective 里添加Score了
  1. Score score = objective.getScore("内容");
  2. score.setScore(12345);
复制代码
之后我们就可以给玩家设置上我们的Scoreboard (如果没有做这一步,并且事先也未给玩家设置Scoreboard的话,会导致无法显示与使用!)
  1. Player player = 我也不知道这个player要从哪引用;
  2. player.setScoreboard(scoreboard);
复制代码
完整代码
  1. ScoreboardManager manager = Bukkit.getScoreboardManager();
  2. // 建立新Scoreboard
  3. Scoreboard scoreboard = manager.getNewScoreboard();
  4. // 注册新的记分项
  5. Objective objective = scoreboard.registerNewObjective("内部名字", "dummy", "§a我是展示名~~");
  6. // 设置记分项展示位置
  7. objective.setDisplaySlot(DisplaySlot.SIDEBAR);
  8. // 给记分项增加 内容与对应的分数
  9. Score score = objective.getScore("内容");
  10. score.setScore(12345);
  11. // 设置计分板
  12. Player player = 我也不知道这个player要从哪引用;
  13. player.setScoreboard(scoreboard);
复制代码
具体效果:
我是展示名.png


制作无闪计分板
问题引入: 那么在经过了上面的实例之后我相信,大部分人都已经学会了如何简易的给玩家设置计分板,但是当我们在做一些动态的计分板的时候,会出现闪烁的问题,那么这是怎么出现的呢? 就拿我们刚才的代码来说,如果我们想更改计分板的内容,我们只能通过
  1. scoreboard.resetScores("内容");
复制代码
这样的方式才能删除一个Score,那么就有人说了
  • 诶呀为什么不直接clear或者reset呢? 我也想啊,只可惜Minecraft的计分板就是这么设计的,所以我们如果想更换内容就得先 resetScores() 之后再 objective.getScore() 才能进行更换
  • 然后这时候又有人说了,那我重新的getNewScoreboard不就好了吗? 诶呀,你自己看看我们上面所写的代码,我们还要注册个新的Objective,之后设置一大堆东西,然后才能开始设置Score,这里面的实现早已就产生了上百的ms,所以这个方**导致闪烁的问题
  • 然后这个时候lz就说了,诶呀为什么不用resetScores填入内容之后,再getScore来设置呢? 诶呀,这样的话其实还是会导致在 resetScores 的时候出现部分闪屏的内容,属于假无闪!,具体思路是:

  • 1. 首先我们在 objective.getScore 时顺便将内容存入一个作为cache的List中
  • 在下一次我们想要修改时,遍历这个 cache 的List,之后resetScores
  • 最后再使用 objective.getScore 添加数据

那么这时候我们就会出现一个问题,既然我们不能用 resetScores,那么我们应当怎么写呢? 这里我要感谢 (#6楼)[ 提示给我的方法,所以这里我对解决方案进行更改

那么这里是我的解决方案: 我们通过使用Team的特性来写,Team这个东西其实是,在下面的一部分,但是为了做出无闪的效果,这里提前说一下思路就行

  • 在Team中有setPrefix和setSuffix的方法,通过这两个方法我们可以直接修改前后缀
  • 如果我们新建15个队伍,然后给每个队伍只addEntry(name),我们为了做出name不显示的效果,我们可以使用颜色代码 §X 的形式做出不显示的效果来实现
  • 之后我们给每个队伍设置不同的prefix和suffix,这样就可以达到不通过resetScore来设置内容

我们来看下面的实例
实例:制作一个实时显示时间的计分板

  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. import java.util.List;

  4. import org.bukkit.Bukkit;
  5. import org.bukkit.ChatColor;
  6. import org.bukkit.entity.Player;
  7. import org.bukkit.plugin.Plugin;
  8. import org.bukkit.scheduler.BukkitTask;
  9. import org.bukkit.scoreboard.DisplaySlot;
  10. import org.bukkit.scoreboard.Objective;
  11. import org.bukkit.scoreboard.Scoreboard;
  12. import org.bukkit.scoreboard.Team;

  13. import com.google.common.collect.Lists;

  14. public class MyScoreboard {

  15.         private Scoreboard scoreboard;
  16.         private Objective objective;
  17.         private String title;
  18.         private Player player;
  19.         private boolean isRun;
  20.         private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  21.         private SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss");
  22.         // 用作runnable的主类实例
  23.         private Plugin plugin;
  24.         /**
  25.          * 用于保存所有的Team
  26.          */
  27.         private List<Team> timers;
  28.         private BukkitTask task;

  29.         public MyScoreboard(Plugin plugin, Player player, String title) {
  30.                 this.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
  31.                 this.title = title;
  32.                 this.objective = scoreboard.registerNewObjective(player.getName(), "dummy", this.title.replace("&", "§"));
  33.                 objective.setDisplaySlot(DisplaySlot.SIDEBAR);

  34.                 this.player = player;
  35.                 this.isRun = false;
  36.                 this.plugin = plugin;
  37.                 timers = Lists.newArrayList();
  38.         }

  39.         public void startShowing() {
  40.                 // 判断是否已经在运行
  41.                 if (isRun) {
  42.                         return;
  43.                 }
  44.                 if (player == null || !player.isOnline()) {
  45.                         return;
  46.                 }
  47.                 isRun = true;
  48.                 player.setScoreboard(scoreboard);

  49.                 // 用于保存前15位的内容
  50.                 List<String> tempList = Lists.newArrayList();
  51.                 for (int i = 0; i <= 15; i++) {
  52.                         tempList.add("§" + ChatColor.values()[i].getChar());
  53.                 }

  54.                 for (int i = 0; i <= 15; i++) {
  55.                         // 注册Team时使用 数字的形式就行
  56.                         Team timer = scoreboard.registerNewTeam("" + i);
  57.                         // addEntry只是作为一个标识符, 用于getScore时的识别
  58.                         timer.addEntry(tempList.get(i));
  59.                         // getScore 刚才的标识符
  60.                         objective.getScore(tempList.get(i)).setScore(i);

  61.                         timers.add(timer);
  62.                 }

  63.                 task = Bukkit.getScheduler().runTaskTimer(plugin, () -> {
  64.                         if (!isRun) {
  65.                                 return;
  66.                         }

  67.                         for (int i = 0; i < timers.size(); i++) {
  68.                                 Team timer = timers.get(i); // 获取每个Team
  69.                                 Date date = new Date();
  70.                                 // 设置前缀
  71.                                 timer.setPrefix(tempList.get(i) + format.format(date));
  72.                                 // 设置后缀
  73.                                 timer.setSuffix(tempList.get(i) + " " + format2.format(date));
  74.                         }
  75.                        
  76.                 }, 0L, 20L);
  77.         }

  78.         public void turnOff() {
  79.                 isRun = false;
  80.                 task.cancel();
  81.         }
  82. }
复制代码
具体效果:
5.gif

请不要在意时间,是星空的测试机的锅,我是早睡早起的四好青年


如何使用Minecraft自带的Team
Team这个东西其实是比较适合Minecraft的(不然干嘛是Mojang自己做的),因为这个东西你可以设置很多内容,比如说
  • COLLISION_RULE(体积碰撞):你可以设置相同队伍可以没有体积碰撞
  • DEATH_MESSAGE_VISIBILITY(死亡信息可见性):你可以设置相同队伍才可以看见玩家的死亡信息
  • NAME_TAG_VISIBILITY(玩家头顶名字可见性):你可以设置相同队伍才可以看见头顶名字
  • CanSeeFriendlyInvisibles(是否可以看到自己队伍的人隐身
  • AllowFriendlyFire(是否可以友军开火
    再也不需要EntityDamageByEntityEvent了!
  • Color 队伍颜色
  • Prefix 队伍前缀,可以直接设置到玩家的NameTag上
  • Suffix 队伍后缀,可以直接设置到玩家的NameTag上

版本变换:其实在1.13的版本之后Team就更改了一下,主要的就是更改了Prefix和Suffix字符还有DisplayName的长度的限制,因为1.13以后的版本,这些内容改用json来储存
1.13以前 设置Prefix和Suffix只能在16个字符以内 而在1.13以后,设置Prefix和Suffix可以在64个字符以内了 并且DisplayName也从32个字符长度增长到128个字符
此外对于Team就没有更多的API更新了

那么接下来我们就来看看Team是如何使用的 首先我们需要建立一个新的Scoreboard
  1. Scoreboard teamScoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
复制代码
之后我们来新建两个队伍,红队蓝队
  1. Team redTeam = teamScoreboard.registerNewTeam("RED");
  2. Team blueTeam = teamScoreboard.registerNewTeam("BLUE");
复制代码
在上面的代码我们要注意,RED和BLUE其实是队伍的内部名字,不做显示用
之后我们来给它设置别的内容
  1. // 设置显示名
  2. redTeam.setDisplayName("红队");
  3. blueTeam.setDisplayName("蓝队");

  4. // 设置队伍颜色
  5. redTeam.setColor(ChatColor.RED);
  6. blueTeam.setColor(ChatColor.BLUE);

  7. // 对于自己的队伍进行NameTag显示, 而对其他队伍关闭 -> 制作出类似吃鸡队友的感觉
  8. // 这里的FOR_OTHER_TEAM表示的意思是只对其他队伍 关闭
  9. redTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.FOR_OTHER_TEAMS);
  10. blueTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.FOR_OTHER_TEAMS);

  11. // 对于自己的队伍开启防碰撞体积, 而对其他队伍开启体积碰撞
  12. // 这里的FOR_OWN_TEAM表示的意思是只对本队 关闭
  13. redTeam.setOption(Option.COLLISION_RULE, OptionStatus.FOR_OWN_TEAM);
  14. blueTeam.setOption(Option.COLLISION_RULE, OptionStatus.FOR_OWN_TEAM);

  15. // 设置同队可看见隐身
  16. redTeam.setCanSeeFriendlyInvisibles(true);
  17. blueTeam.setCanSeeFriendlyInvisibles(true);

  18. // 取消队伤
  19. redTeam.setAllowFriendlyFire(false);
  20. blueTeam.setAllowFriendlyFire(false);

  21. // 设置前缀
  22. redTeam.setPrefix("§c红队 - ");
  23. blueTeam.setPrefix("§8蓝队 - ");
复制代码
之后我们就建立了两个Team,之后我们得需要给他们增加玩家
  1. redTeam.addEntry("Zoyn");
  2. blueTeam.addEntry("Alex");
复制代码
我们在上方的代码中, 给红队添加了一名队员, Zoyn 给蓝队添加了一名队员, Alex

这里要注意的是,给队伍增加队员不是调用 addPlayer(OfflinePlayer player) 这个已经弃用的方法,因为你放在Team里的可以不只是Player,所以我们只用放入玩家名就好  

之后我们给这两个队员设置好Scoreboard(如果没有做这个操作,可能会导致不显示!
  1. Player zoyn = ?
  2. Player alex = ?
  3. zoyn.setScoreboard(teamScoreboard);
  4. alex.setScoreboard(teamScoreboard);
复制代码
完整代码:
  1. Scoreboard teamScoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
  2. Team redTeam = teamScoreboard.registerNewTeam("RED");
  3. Team blueTeam = teamScoreboard.registerNewTeam("BLUE");

  4. // 设置显示名
  5. redTeam.setDisplayName("红队");
  6. blueTeam.setDisplayName("蓝队");

  7. // 设置队伍颜色
  8. redTeam.setColor(ChatColor.RED);
  9. blueTeam.setColor(ChatColor.BLUE);

  10. // 对于自己的队伍进行NameTag显示, 而对其他队伍关闭 -> 制作出类似吃鸡队友的感觉
  11. // 这里的FOR_OTHER_TEAM表示的意思是只对其他队伍 关闭
  12. redTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.FOR_OTHER_TEAMS);
  13. blueTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.FOR_OTHER_TEAMS);

  14. // 对于自己的队伍开启防碰撞体积, 而对其他队伍开启体积碰撞
  15. // 这里的FOR_OWN_TEAM表示的意思是只对本队 关闭
  16. redTeam.setOption(Option.COLLISION_RULE, OptionStatus.FOR_OWN_TEAM);
  17. blueTeam.setOption(Option.COLLISION_RULE, OptionStatus.FOR_OWN_TEAM);

  18. // 设置同队可看见隐身
  19. redTeam.setCanSeeFriendlyInvisibles(true);
  20. blueTeam.setCanSeeFriendlyInvisibles(true);

  21. // 取消队伤
  22. redTeam.setAllowFriendlyFire(false);
  23. blueTeam.setAllowFriendlyFire(false);

  24. // 设置前缀
  25. redTeam.setPrefix("§c红队-");
  26. blueTeam.setPrefix("§9蓝队-");

  27. redTeam.addEntry("Zoyn");
  28. blueTeam.addEntry("Alex");

  29. Player zoyn = ?
  30. Player alex = ?
  31. zoyn.setScoreboard(teamScoreboard);
  32. alex.setScoreboard(teamScoreboard);
复制代码
实际效果:
Zoyn视角

file_1584582395000.jpg


Alex视角

alex.png


当他们两者在同一队伍时

file_1584582395000.jpg



为了方便读者测试,我写了一个测试类来给读者测试

使用方法:
1.注册指令 teams (当然你也可以自己改)
2.reload之后第一次输入请输入 /teams init 进行队伍初始化
3.在指令中的队伍名,只有 RED 和 BLUE

实例:一个使用Scoreboard#Team的内容来写一个组队系统
  1. import org.bukkit.Bukkit;
  2. import org.bukkit.ChatColor;
  3. import org.bukkit.command.Command;
  4. import org.bukkit.command.CommandExecutor;
  5. import org.bukkit.command.CommandSender;
  6. import org.bukkit.entity.Player;
  7. import org.bukkit.scoreboard.Scoreboard;
  8. import org.bukkit.scoreboard.Team;
  9. import org.bukkit.scoreboard.Team.Option;
  10. import org.bukkit.scoreboard.Team.OptionStatus;

  11. public class TeamCommand implements CommandExecutor {

  12.     private Scoreboard teamScoreboard;

  13.     @Override
  14.     public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
  15.         if (cmd.getName().equalsIgnoreCase("teams")) {
  16.             if (args.length == 0) {
  17.                 sender.sendMessage("/teams init 初始化");
  18.                 sender.sendMessage("/teams list 列出所有队伍");
  19.                 sender.sendMessage("/teams set <玩家名> <队伍名> 将玩家的队伍进行设置");
  20.                 sender.sendMessage("/teams prefix <队伍名> <前缀名> 将玩家的队伍进行前缀的设置");
  21.                 sender.sendMessage("/teams suffix <队伍名> <前缀名> 将玩家的队伍进行前缀的设置");
  22.                 return true;
  23.             }

  24.             if (args[0].equalsIgnoreCase("init")) {
  25.                 teamScoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
  26.                 Team redTeam = teamScoreboard.registerNewTeam("RED");
  27.                 Team blueTeam = teamScoreboard.registerNewTeam("BLUE");

  28.                 // 设置显示名
  29.                 redTeam.setDisplayName("红队");
  30.                 blueTeam.setDisplayName("蓝队");

  31.                 // 设置队伍颜色
  32.                 redTeam.setColor(ChatColor.RED);
  33.                 blueTeam.setColor(ChatColor.BLUE);

  34.                 // 对于自己的队伍进行NameTag显示, 而对其他队伍关闭 -> 制作出类似吃鸡队友的感觉
  35.                 // 这里的FOR_OTHER_TEAM表示的意思是只对其他队伍 关闭
  36.                 redTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.FOR_OTHER_TEAMS);
  37.                 blueTeam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.FOR_OTHER_TEAMS);

  38.                 // 对于自己的队伍开启防碰撞体积, 而对其他队伍开启体积碰撞
  39.                 // 这里的FOR_OWN_TEAM表示的意思是只对本队 关闭
  40.                 redTeam.setOption(Option.COLLISION_RULE, OptionStatus.FOR_OWN_TEAM);
  41.                 blueTeam.setOption(Option.COLLISION_RULE, OptionStatus.FOR_OWN_TEAM);

  42.                 // 由于只做演示, 所以这里的sender我直接强转得到
  43.                 Player player = (Player) sender;
  44.                 player.setScoreboard(teamScoreboard);
  45.                 sender.sendMessage("§a操作成功!");
  46.                 return true;
  47.             }

  48.             if (args[0].equalsIgnoreCase("list")) {
  49.                 teamScoreboard.getTeams().forEach(team -> {
  50.                     sender.sendMessage("名字: " + team.getName());
  51.                     sender.sendMessage("展示名: " + team.getDisplayName());
  52.                     sender.sendMessage("已有队员: ");
  53.                     team.getEntries().forEach(player -> {
  54.                         sender.sendMessage(" - " + player);
  55.                     });
  56.                     sender.sendMessage("=====================");
  57.                 });
  58.                 sender.sendMessage("§a操作成功!");
  59.                 return true;
  60.             }

  61.             if (args[0].equalsIgnoreCase("set")) {
  62.                 Player entry = Bukkit.getPlayer(args[1]);
  63.                 if (entry == null || !entry.isOnline()) {
  64.                     sender.sendMessage("玩家不在线!");
  65.                     return true;
  66.                 }
  67.                 Team playerTeam = teamScoreboard.getEntryTeam(entry.getName());
  68.                 Team team = teamScoreboard.getTeam(args[2]);

  69.                 if (playerTeam != null) {
  70.                     // 将玩家离开之前的队伍
  71.                     playerTeam.removeEntry(args[1]);
  72.                 }

  73.                 // 将玩家加入选定的队伍
  74.                 team.addEntry(args[1]);

  75.                 // 对选中的人设置计分板, 不然会导致无法显示的问题
  76.                 entry.setScoreboard(teamScoreboard);
  77.                 sender.sendMessage("§a操作成功!");
  78.                 return true;
  79.             }

  80.             if (args[0].equalsIgnoreCase("prefix")) {
  81.                 Team team = teamScoreboard.getTeam(args[1]);
  82.                 team.setPrefix(ChatColor.translateAlternateColorCodes('&', args[2]));
  83.                 sender.sendMessage("§a操作成功!");
  84.                 return true;
  85.             }

  86.             if (args[0].equalsIgnoreCase("suffix")) {
  87.                 Team team = teamScoreboard.getTeam(args[1]);
  88.                 team.setSuffix(ChatColor.translateAlternateColorCodes('&', args[2]));
  89.                 sender.sendMessage("§a操作成功!");
  90.                 return true;
  91.             }
  92.         }
  93.         return true;
  94.     }
复制代码

这就是BukkitAPI中对 org.bukkit.scoreboard 包的内的所有内容,如果你有相关问题可以回复,一起交流

—— 一个本科人




来自群组: Complex Studio

评分

参与人数 13人气 +17 金粒 +81 宝石 +24 贡献 +2 收起 理由
2571612311 + 15 MCBBS有你更精彩~
乙烯_中国 + 24 MCBBS有你更精彩~
秋韵 + 2 MCBBS有你更精彩~
Ir.Nep + 2 神乎其技!6的飞起!
T_Rax + 1 帮莫老上九级。
利姆露酱 + 1 MCBBS有你更精彩~
狡诈师 + 2 MCBBS有你更精彩~
Rancy. + 6 MCBBS有你更精彩~
海螺螺 + 4 + 40 + 2 MCBBS有你更精彩~ 优秀奖励
William_Shi + 1 Ssssssssssssssssssss
Hueihuea + 20 没人气了
X836696023 + 2 神乎其技!6的飞起!
HotPe_e + 2 MCBBS有你更精彩~

查看全部评分

dousha0v0 当前离线
积分
704
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-2-24
查看详细资料
发表于 2020-3-18 21:32:11 来自手机 | 显示全部楼层
沙发沙发
回复

使用道具 举报

HotPe_e 当前离线
积分
6237
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2014-1-13
查看详细资料
发表于 2020-3-18 21:45:50 | 显示全部楼层
支持莫老带来的 scoreboard 教程
回复

使用道具 举报

William_Shi 当前离线
积分
3426
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2017-10-8
查看详细资料
发表于 2020-3-18 23:10:35 | 显示全部楼层
支持莫老!
我当时翻了pvpin实例
但苦于实例不够丰富
动态更新的程序设计还是没做的特别好
这篇教程很棒!
回复

使用道具 举报

呜喵喵 当前离线
积分
137
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-3-16
查看详细资料
发表于 2020-3-18 23:52:06 | 显示全部楼层
6666可以
回复

使用道具 举报

Karlatemp 当前离线
积分
2028
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-6-17
查看详细资料
发表于 2020-3-19 03:14:27 来自手机 | 显示全部楼层
在?无闪为啥不用team set prefix/suffix

评分

参与人数 1人气 +2 收起 理由
602723113 + 2 MCBBS有你更精彩~

查看全部评分

回复

使用道具 举报

我当时死了 当前离线
积分
8
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2016-1-22
查看详细资料
发表于 2020-3-21 16:07:28 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

q229196637 当前离线
积分
547
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2018-1-29
查看详细资料
发表于 2020-3-22 00:53:13 | 显示全部楼层
楼主 您好,这里我遇到一下Team的问题,如果可以能不能加你QQ学习一下?或者我QQ也行 QQ:229196637
回复

使用道具 举报

果糖 当前离线
积分
109
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2019-4-5
查看详细资料
发表于 2020-3-22 11:26:28 来自手机 | 显示全部楼层
非常好用
回复

使用道具 举报

ren142716 当前离线
积分
28
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-3-16
查看详细资料
发表于 2020-3-24 11:51:29 来自手机 | 显示全部楼层
我懂了(完全不懂)
回复

使用道具 举报

SCP—Infinity 当前离线
积分
74
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-3-6
查看详细资料
发表于 2020-3-24 17:04:24 来自手机 | 显示全部楼层
666可以可以
回复

使用道具 举报

ZiXuan_love 当前离线
积分
200
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2016-2-5
查看详细资料
头像被屏蔽
发表于 2020-3-24 21:46:37 来自手机 | 显示全部楼层
学到了,我爱喜欢了
回复

使用道具 举报

lll297773943 当前离线
积分
195
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2019-3-8
查看详细资料
发表于 2020-3-25 00:43:13 来自手机 | 显示全部楼层
好厉害呀
回复

使用道具 举报

我叫王小明 当前离线
积分
471
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-9-1
查看详细资料
发表于 2020-3-25 07:49:37 来自手机 | 显示全部楼层
卧槽,正愁买了没啥用
回复

使用道具 举报

walle1996 当前离线
积分
552
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
发表于 2020-3-25 09:19:29 | 显示全部楼层

支持莫老!
动态更新的程序设计还是没做的特别好
这篇教程很棒!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2021-5-14 06:56 , Processed in 0.079030 second(s), Total 37, Slave 31 queries, Release: Build.2021.04.28 1615, Gzip On, Redis On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2020 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表