我的世界好玩的服务器现在玩什么服务器的人多?

大家都在搜:
扫描二维码安装房天下APP
手机浏览器访问房天下
> > 问题详情
为什么玩我的世界一个mod服务器,多人玩着一点都不卡,玩单人就卡成狗一样,这是怎么回事???
,跪谢了~求大神帮忙解决!
浏览次数:0
小伙伴们还在答题的路上,先看看下面这些内容吧~
大家对家用暖气热交换器一定不会陌生,在寒冷的冬天,不管做什么都离不开热水,可是用燃气或者电烧热水又会浪费,很多家庭都会采用暖气热交换器。今天小编就给大家介绍什么是暖气热交换器,它到底有什么优点呢。 []
浏览量:9522
手机动态登录
请输入用户名/邮箱/手机号码!
请输入密码!
没有房天下通行证,
ask:2,asku:0,askr:56,askz:21,askzx0:462,ask0:0,RedisW:0askR:1,askD:0 mz:hit,askU:0,askT:0askA:3
Copyright &
北京拓世宏业科技发展有限公司
Beijing Tuo Shi Hong Ye Science&Technology Development Co.,Ltd 版权所有
违法信息举报邮箱:您的位置:
→ 我的世界服务器创建教程
我的世界服务器创建教程
10:01:03 来源: 作者:佚名 (74)
我的世界以其独特的创造性和开放性,吸引了大量的玩家,在玩腻了一个人的单机模式后,你是不是也会想试试和朋友一起玩呢?这里跑跑车小编就教大家一个简单的服务器创建方法,当然,在创建之前你需要做好一些准备工作哦!首先,你必须要知道一点,那就是服务器的版本必须与游戏本体的版本一致,这点很重要,如果版本不一致,你是不可能登入服务器的。一、准备工作想要创建一个服务器,肯定需要一个服务端,然后就是游戏本体(客户端),这里小编就以1.2.5为例(当然,不同的服务端有不同的架设方法,有些简单有些复杂,这里小编提供的算是比较简单的一种)我的世界1.2.5游戏本体(客户端):游戏名称:我的世界1.2.5女仆+TNT等整合包
游戏大小:
139.0M下载地址: 游戏名称:我的世界1.25神奇宝贝整合包
游戏大小:
191M下载地址: 这两个随便哪一个都行,都是1.2.5版本的。我的世界服务器:
相关补丁下载:
地图+MOD - 21.1M
如果你的朋友跟你不是一个物理局域网(也就是你们不是直接有网线相连),那么你就需要使用虚拟局域网软件来连接你们的电脑虚拟局域网软件:
相关补丁下载:
游戏工具 - 3.0M
好了,准备工作基本完成,现在来试试创建吧!二、创建服务器在下载好上述软件之后,请新建一个文件夹,将下载好的所有文件都放在里面以便操作。接下来安装我的世界,为了方便操作,请把我的世界安装在这个目录下。如图:接下来解压服务器中的1.2.5服务端,并创建一个txt文本,重命名。接下来就是最为重要的部分之一,打开新建文本,复制下列代码到其中,注意要修改一下!这里要特别注意的是,不要文本中选择自动换行,否则会导致代码运行错误,切记!!!@echo off&C:\Program Files\Java\jdk1.6.0_18\bin\java.exe& -Xms512M -Xmx1024M -jar craftbukkit-1.2.5-R5.0.jarpauseC:\Program Files\Java\jdk1.6.0_18\bin\java.exe 这是你的JAVA安装地址,如果你的JAVA装在别的地方,请将这里修成你安装的位置!-Xms512M -Xmx1024M 这是为你的服务器分配内存,基本不用改。-jar 这是JAVA语句,不用管。craftbukkit-1.2.5-R5.0.jar 这是你的服务器的名字,注意不要搞错!做完上述的工作之后,请保存,并将文本的后缀名改成bat。之后双击运行,就会出现一个窗口,如图:窗口中弹出的警告可以无视,你只需要注意最后是不是出现如图的&help&or&?&就行了。在运行过程中,文件夹内会自动生成很多文件,注意这些都是有用的,不要随意删掉了。到这里服务器就算是创建了,不过这时候是连接不上的,必须修改参数才可以,所以我们需要退出,注意,请不要点击&X&退出,也不要Alt+F4强推,请在窗口中输入&stop&退出,切记!!!在文件夹中找到文件server.properties,双击选择以记事本打开,你会看到很多参数,如图:这里解释一下部分参数的作用,注意online-mode必须修改成false。另外,如果你们物理局域网,那么在server-ip后面填上做服务器的机子的IP即可,如果你们不是物理局域网,那么IP不填,如何联机请看下面#Minecraft server properties 无视他就行,只是说明这个是神马东西而已#Mon Nov 21 19:18:32 PST 2011 建立时间(星期几/月/日/时/分/秒/时区/年份)level-name=world 世界的名字,例子:level-name=liuallow-nether=true 是否允许地狱,true(是) false(不是)view-distance=10 观望距离spawn-monsters=true 是否刷怪物,true(是) false(不是)online-mode=true 官网正版认证,true(是) false(不是)&-盗版必选difficulty=1 难度,随便啦gamemode=0 模式,0(生存) 1(创造)spawn-animals=true 刷生物,true(是) false(不是)max-players=20 最多同时在线人数server-ip= 服务器IPpvp=true 玩家VS玩家,true(可以) false(不可以)level-seed= 地图种子,随即不要添server-port=25565 服务器端口,默认25565allow-flight=false 飞行许可,一般都不允许拉,你不想看到玩家在里面乱飞white-list=false 白名单,true(使用) false(不使用)motd=A Minecraft Server 服务器备注修改完成后保存,再次打开服务器,并打开游戏的启动器,这里要注意,使用启动器修改自己的名字,不要出现重复的名字,因为服务器只允许一个ID,所以名字重复的话后一个人会将前一个人挤下服务器,注意!接下来就简单啦,进入游戏,选择多人模式,选择添加服务器,输入服务器IP(就是你在上面填的IP),如图:点击加入服务器就可以联机啦,赶快去试试吧!三、如何使用虚拟局域网软件进行联机如果不是物理局域网该怎么办呢?别急,可以使用虚拟局域网软件将你们连起来,下面小编就教大家如何联机。首先肯定是安装好软件啦,就是上面提到的hamachi(俗称蛤蟆吃)。安装成功后打开会出现如图界面:点击启动,软件就会自动分配一个地址,如果你是服务器,请选择创建新网络,如果你是想加入服务器,请选择加入一个现有网络创建好后如图:注意,记住网络ID(图示为paopaoche)和你创建时设置的密码,当别人加你时,是需要知道你的网络ID和密码的。这里小编做个示范,如图:第二个就是想要进服务器的人,好了,现在按照上面创建的步骤做吧,注意IP不要填哦!做好一切后,打开游戏,进入添加服务器界面,注意此时填的IP就是蛤蟆吃上的IP,比如小编这里就要填25.48.96.194,请特别注意!!!小编认为这样已经很详细了,这里小编发一张联机的图,祝大家能一次成功,玩的愉快!
相关游戏攻略
? ? ? ? ? ? ? ?
本站提供: 好玩的单机游戏,是大型基地网站Copyright &
.All Rights Reserved备案编号:湘ICP备号-1只有认证用户才能操作
为了享受完美体验,赶快去认证吧
0 不知所措史蒂夫
各位大大帮帮忙 我求一个多人的服务器 有的加我QQ:。真心求一个好的服务器 是手机版我的世界哦!
打赏人数0钻石+0理由
阔绰的打赏了钻石&&1&&颗
2 手撸大树史蒂夫
2 手撸大树史蒂夫
我有好多,都是0.11.0的
0 不知所措史蒂夫
说真心话的有木有 你那个我实在进不去
2 手撸大树史蒂夫
知道,我不是说我那个
0 不知所措史蒂夫
我的是0.12.1的 有没有啊
2 手撸大树史蒂夫
我的也是啊—_—
0 不知所措史蒂夫
那我为什么进不去=_=
2 手撸大树史蒂夫
2 手撸大树史蒂夫
我都知道,第一个破死啦,第二个玩不了
0 不知所措史蒂夫
第二个人满了耶 我想加 55555
你需要先登录才能回帖&
剩余2000个字
__Crazyヽ各自安好
俊介君¥黑鲸
欢迎加入麦块社区
30经验值3钻石
要继续支持麦块喔Minecraft 的多人游戏是如何发展起来的?
Tiger Tang,想开发游戏的正太控一枚
这个问题太想自问自答了,因为这段血泪史完全可以写成精彩纷呈的长篇小说!作为在 Minecraft 业界打滚多年的人,必须得给大家侃侃背后的故事!
// Survival Multiplayer 时代(2010)
让时光回溯到五年前的 8 月 9 日的凌晨。我们的故事主角兼 Minecraft 创始人,Markus 'Notch' Persson,正二十四个小时宅在家里,撑着双眼死瞪电脑屏幕,双手则迅速地敲着键盘,废寝忘食地调试着程序。再过一个小时就是 8 月 10 日了,Minecraft 生存多人游戏(Survival Multiplayer,SMP)正式发布的日子。
你看 Notch 这妖魅的小眼神。
Minecraft SMP 的名字听上去很高大上,但其实就是一个叫做 minecraft_server.jar 的文件罢了,小巧绿色又便携。使用方法也非常简单,双击打开,它就会自动在默认端口上设置好一个 Minecraft 的服务器,别人只需凭你的 IP 即可进入。理所当然地,一些基本的命令也包含在其中:/kick 用来踢人,/gamemode 用来从生存转创造...
现在看来,第一个版本的 SMP 相当简陋,但玩家们正沉醉于和朋友一起玩生存的乐趣里,再简陋也赞不绝口。
SMP 的发布,正是迎合 Minecraft 迅猛上升的用户注册量。截至 2010 年 5 月,Minecraft 的付费用户已经达到两万,YouTube 上以 Minecraft 作为关键字的视频日益增长,而此时,这个游戏还只是在 Alpha 阶段!
而 SMP 的出现,更让 Minecraft 的知名度登上又一巅峰:什么!?可以和好基友在开放式的 LEGO 世界里生存、探险、搞基(?);还可以开创造起个斗兽场战个痛或者堆满 TNT 然后炸地图;最给力的是神似编程的红石系统,直接令 Minecraft 一跃成为游戏开发工具!哪个 AAA 级游戏有这么爽的体验?!
即使从五年后看来,SMP 的第一个版本也有相当高的游戏性
在 SMP 发布仅仅两个月后,Minecraft 的付费用户就翻了个 1.5 倍,两个月就赚了一百多万!SMP 的巨大成功并没有让 Notch 怠慢,没过多久就向玩家们宣布了 Beta 版本的到来。而 Notch 也正式注册了 Mojang AB 的商标,为之后发行游戏铺路。
// hMod 时代(2010 ~ 2011)
SMP 好玩归好玩,可是不能在上面装 mod 这一点让不少玩家很苦恼。当然了,可以通过反编译 minecraft_server.jar 修改里面的代码,比如调整一下玩家的默认速度什么的,然后每个玩家一走起路来就跑十公里远,上天入海不是梦。毕竟 Mojang 也没有做什么签名验证,也没什么坑爹的全程联网验证(育碧:...),要修改几个变量然后重新编译,理论上来讲不难啊。
可行归可行,问题是修改起来太麻烦:代码全部被混淆(obfuscated)了!
什么叫代码混淆呢?举个栗子,比如说原本的代码是这样的:
private String playerName = "你爸爸"; // 定义玩家名称
private double health = 20.0D; // 定义玩家血量
private float walkSpeed = 1.2F; // 定义玩家速度
public void chat(String message) { // 定义一个说话的函数
Server.broadcastMessage(this, message); // 向服务器里的函数传递参数
没学过 Java 是不是也很清晰明了?这修改起来还不容易,简直就是填空嘛,小学生都会。
问题是在编译的时候,代码被 Mojang 事先混淆了,可能到你手里的时候就变成这样了:
String a = Base64.decodeFromBase64("5L2g54i454i4");
double b = 20.0D;
float c = 1.2F;
public void d(String a) {
bl.aE(this, a);
尼玛这叫一个狠哪,若是没有原本的代码,你看得懂吗?
你或许说,上面这几行,我也能猜出个大概吧?嗯,b 是血量,因为玩家血量最高就是 20,然后 c 是... bl 是... aE 是...
别忙着翻桌,我们再来看看真实个例,下面是 Minecraft 1.8 里面的 aap 类:
public class aap extends um {
private static final Logger b = ;
public float a = (float) (Math.random() * 3.793D * 2.0D);
private int c;
private int d;
private int e = 5;
private String f;
private String g;
public aap(amp paramamp, double paramDouble1, double paramDouble2, double paramDouble3) {
super(paramamp);
a(0.25F, 0.25F);
b(paramDouble1, paramDouble2, paramDouble3);
this.y = ((float) (Math.random() * 360.0D));
this.v = ((float) (Math.random() * 0.2322D - 0.1161D));
this.w = 0.2322D;
this.x = ((float) (Math.random() * 0.2322D - 0.1161D));
public aap(amp paramamp, double paramDouble1, double paramDouble2, double paramDouble3, aio paramaio) {
this(paramamp, paramDouble1, paramDouble2, paramDouble3);
a(paramaio);
public aap(amp paramamp) {
super(paramamp);
a(0.25F, 0.25F);
a(new aio(apg.a, 0));
protected boolean q_() {
return false;
protected void g() {
F().a(10, 5);
public void j() {
if (k() == null) {
super.j();
if ((this.d & 0) && (this.d != 32767)) {
this.d -= 1;
this.p = this.s;
this.q = this.t;
this.r = this.u;
this.w -= 0.93033D;
this.T = j(this.s, (aL().b + aL().e) / 2.0D, this.u);
d(this.v, this.w, this.x);
int i = ((int) this.p != (int) this.s) || ((int) this.q != (int) this.t) || ((int) this.r != (int) this.u) ? 1 : 0;
if ((i != 0) || (this.W % 25 == 0)) {
if (this.o.p(new dl(this)).c().r() == big.i) {
this.w = 0.2322D;
this.v = ((this.V.nextFloat() - this.V.nextFloat()) * 0.2F);
this.x = ((this.V.nextFloat() - this.V.nextFloat()) * 0.2F);
a("random.fizz", 0.4F, 2.0F + this.V.nextFloat() * 0.4F);
if (!this.o.C) {
float f1 = 0.98F;
if (this.C) {
f1 = this.o.p(new dl(sr.c(this.s), sr.c(aL().b) - 1, sr.c(this.u))).c().K * 0.98F;
this.v *= f1;
this.w *= 0.4863D;
this.x *= f1;
if (this.C) {
this.w *= -0.5D;
if (this.c != -32768) {
this.c += 1;
if ((!this.o.C) && (this.c &= 6000)) {
private void v() {
for (aap localaap : this.o.a(aap.class, aL().b(0.5D, 0.0D, 0.5D))) {
a(localaap);
private boolean a(aap paramaap) {
if (paramaap == this) {
return false;
if ((!paramaap.ad()) || (!ad())) {
return false;
aio localaio1 = k();
aio localaio2 = paramaap.k();
if ((this.d == 32767) || (paramaap.d == 32767)) {
return false;
if ((this.c == -32768) || (paramaap.c == -32768)) {
return false;
if (localaio2.b() != localaio1.b()) {
return false;
if ((localaio2.n() ^ localaio1.n())) {
return false;
if ((localaio2.n()) && (!localaio2.o().equals(localaio1.o()))) {
return false;
if (localaio2.b() == null) {
return false;
if ((localaio2.b().k()) && (localaio2.i() != localaio1.i())) {
return false;
if (localaio2.b & localaio1.b) {
return paramaap.a(this);
if (localaio2.b + localaio1.b & localaio2.c()) {
return false;
localaio2.b += localaio1.b;
paramaap.d = Math.max(paramaap.d, this.d);
paramaap.c = Math.min(paramaap.c, this.c);
paramaap.a(localaio2);
return true;
public void i() {
this.c = 4800;
public boolean T() {
return this.o.a(aL(), big.h, this);
protected void f(int paramInt) {
a(ua.a, paramInt);
public boolean a(ua paramua, float paramFloat) {
if (b(paramua)) {
return false;
if ((k() != null) && (k().b() == aip.bU) && (paramua.c())) {
return false;
this.e = ((int) (this.e - paramFloat));
if (this.e &= 0) {
return false;
public void b(eu parameu) {
parameu.a("Health", (short) (byte) this.e);
parameu.a("Age", (short) this.c);
parameu.a("PickupDelay", (short) this.d);
if (m() != null) {
parameu.a("Thrower", this.f);
if (l() != null) {
parameu.a("Owner", this.g);
if (k() != null) {
parameu.a("Item", k().b(new eu()));
public void a(eu parameu) {
this.e = (parameu.e("Health") & 0xFF);
this.c = parameu.e("Age");
if (parameu.c("PickupDelay")) {
this.d = parameu.e("PickupDelay");
if (parameu.c("Owner")) {
this.g = parameu.j("Owner");
if (parameu.c("Thrower")) {
this.f = parameu.j("Thrower");
eu localeu = parameu.m("Item");
a(aio.a(localeu));
if (k() == null) {
public void d(adq paramadq) {
if (this.o.C) {
aio localaio = k();
int i = localaio.b;
if ((this.d == 0) && ((this.g == null) || (6000 - this.c &= 200) || (this.g.equals(paramadq.b_()))) && (paramadq.bg.a(localaio))) {
if (localaio.b() == ahw.a(apg.r)) {
paramadq.b(rl.g);
if (localaio.b() == ahw.a(apg.s)) {
paramadq.b(rl.g);
if (localaio.b() == aip.aA) {
paramadq.b(rl.t);
if (localaio.b() == aip.i) {
paramadq.b(rl.w);
if (localaio.b() == aip.bq) {
paramadq.b(rl.A);
if ((localaio.b() == aip.i) && (m() != null)) {
adq localadq = this.o.a(m());
if ((localadq != null) && (localadq != paramadq)) {
localadq.b(rl.x);
this.o.a(paramadq, "random.pop", 0.2F, ((this.V.nextFloat() - this.V.nextFloat()) * 0.7F + 1.0F) * 2.0F);
paramadq.a(this, i);
if (localaio.b &= 0) {
public String b_() {
if (i_()) {
return aG();
return eq.a("item." + k().a());
public boolean az() {
return false;
public void c(int paramInt) {
super.c(paramInt);
if (!this.o.C) {
public aio k() {
aio localaio = F().f(10);
if (localaio == null) {
if (this.o != null) {
b.error("Item entity " + D() + " has no item?!");
return new aio(apg.b);
return localaio;
public void a(aio paramaio) {
F().b(10, paramaio);
F().h(10);
public String l() {
return this.g;
public void a(String paramString) {
this.g = paramString;
public String m() {
return this.f;
public void c(String paramString) {
this.f = paramString;
public void o() {
this.d = 10;
public void p() {
this.d = 0;
public void q() {
this.d = 32767;
public void a(int paramInt) {
this.d = paramInt;
public boolean r() {
return this.d & 0;
public void t() {
this.c = -6000;
public void u() {
this.c = 5999;
能猜得出来算你狠。
于是,虽然 SMP 的第三方修改成为可能,但基本没有服主会闲的蛋疼去玩这个。除了代码被混淆之外,由于 Minecraft 长期都是 Notch 一个人开发,所以内部的业务逻辑也写得很乱,或者说实在太有 Notch 特立独行的代码风格了,窝们实在猜不粗来呀!
Notch 表示:“你丫反编译我的代码还瞎逼逼”(设计对白)
不过就是有些人点错天赋了,就在 SMP 发布后没多久的 2010 年年底,一位叫 hey0 的大神在自己的个人网站上发布了 hMod。hMod 一出,激起千层浪,众人纷纷惊呼:民间奇才!
hMod 是个什么玩意儿?我尽量简单地解释一下。以往的 SMP modding 模式(也就是上面提到的,直接修改源代码),我们画个流程图出来:
hMod 的原理,就是将那些不可读的代码,通过 hey0 君敏锐的观察能力,“翻译”成可读而清晰明了的东西。
还记得刚才那堆乱七八糟的代码吗?有兴趣的同学可以自行阅读“翻译”过后的。
(“翻译”这词实际上并不准确,实际上 hMod 是对 SMP 的半封装,详细的技术细节在此略过。)
这实在太伟大了!要在服务器上加入自己原创的内容,顿时简单了起来。
不过如此伟大的 hMod 更新了几个月,原作者就突然潜水,小道消息是说回老家结婚去了,然后由另一位现已就职 Mojang 的大神 Dinnerbone 继续填坑。还没填到一半 Dinnerbone 就不干了:靠,代码真乱!于是拉上几个志同道合的同志一起推翻重做,扛起“翻译”的任务,Bukkit 计划就这么诞生了。
// Bukkit 时代(2011 ~ 2014)
Bukkit 计划实际上分为两部分:Bukkit API 和 CraftBukkit。废话不多说,我们再画个流程图:
原理和 hMod 是一样的,但 Bukkit API 写得更好之余,最重要的成就就是加入了事件系统,不过这个话题说下去完全可以另起炉灶了,所以咱们暂且跳过。
好了我知道你们都在吐槽上面的魔法是什么鬼,那么我尽量简单讲一讲,没有面向对象编程基础的同学可以跳过下面这几段。
Bukkit API 里全部都是抽象的类与方法,打个比方有个方法叫 getOnlinePlayers(),返回当前玩家数量。为什么要抽象?为什么我们不直接整合实现(implementation)?比如我发现下面这行代码就可以返回当前玩家数量,这不搞定了吗,分两步干嘛。
问题是我们的这行代码的基础,是通过破解 Minecraft SMP 的源代码对吧?更准确的说,是通过破解 Minecraft SMP 当前版本的源代码作为基础。而代码混淆这个过程,是每个版本都会重新进行一次的。上面那行代码或许在 Minecraft SMP 1.7 能用,但到 1.8,可能就完全报错了。因为或许在 1.8 里,要获取当前玩家数量的代码是这样的:
所以,在 Bukkit API 的部分里,这个方法是抽象的,留给相应版本的 CraftBukkit 去实现。并且这么一来,有了抽象的接口作为参考,新版本的 SMP 发布时,Bukkit 团队也能更方便地更新 CraftBukkit。在这里也顺便吐槽一下,常常见到有人说用 Bukkit 开服,其实是错的 —— Bukkit 里全是抽象的接口而已,开个鬼啊。正确的说法是用 CraftBukkit 开服(其他服务器端另计)。所以下次你见到谁跟你炫耀说“我会用 Bukkit 开服务器你造吗”,记得高大上的回他一句:“乖,那个叫 CraftBukkit。跟我读,科阿哇夫特巴可以特。”
好了话题扯远了,那么有了 Bukkit 能做些什么呢?能做的事太多了!比如用 Bukkit API 的自定义命令功能,加个叫 /launch 的命令,然后输入 /launch &谁谁谁& 就将目标玩家喷上天,这无论在原生 Minecraft 里或者 SMP 里都是做不到的!
效果请参见左下角~ 这些基于 Bukkit API 的小程序被统称为插件(plugin)。
好了,我知道你们又要吐槽了。
当然不是!这种插件实在太肤浅了,Bukkit API 真正最广泛的应用是用来开发小游戏(minigame)。你没听错,在游戏里开发游戏!只要有足够的人力物力,依靠着 Bukkit API,要弄出个 Minecraft 版《无主之地》或者《使命召唤》是绝对可行的!
国外知名服务器 Hypixel 近日推出的新游戏 Warlords,武器到装备的模型都是完全自制的。Warlords 的核心玩法其实就是抢旗,但又加入了武器收集,附魔系统和角色系统等等,目前平均在线玩家 2000+,称其为小型 PvP 网游也绝不为过。
毫不夸张地说,Warlords 甚至要比 Steam 上不少免费的 FPS 好玩;光是收集要素就足够吸引了!
另一知名大服 Wynncraft,则主打 RPG 玩法,照搬了当今网络上 MMORPG 的很多元素:饶有趣味的任务,广阔宏伟的地图,专门刷经验升级的地城... 倒也弄得趣味横生
我们还是先回到 2011 年,回到 Bukkit 刚刚发展起来的时候吧:那时大众对 Minecraft 多人游戏的概念,还只是停留在与好基友一起玩生存的程度。真正将 Bukkit 计划推向大众视野的,当属在 2011 年发展起来的 MCSG(Minecraft Survival Games)服务器。听过《饥饿游戏》吧?熟悉里面的设定吧?而 MCSG,就是饥饿游戏在 Minecraft 的翻版:24 个玩家在开放式的地图里生存,到处开箱寻找物资,谁生存到最后就赢。SMP 可能也弄得出来,但是想做复杂一点,将箱子的物品完全随机化,或者将玩家数据保存在 mySQL 数据库里,又或者加入一堆炫目的技能,那是 SMP 绝不可及的。而以上这一切,利用 Bukkit API,小 case 啦。
当然 Survival Games 远远没有如今的 Warlords 吸引,但是在当年却可谓掀起了一阵 Minecraft 潮。在 YouTube 上实况大型服务器里游戏的实况主越来越多,即使是如今已经超过千万订阅的 SkyDoesMinecraft —— 就是那个玩了 Flappy Bird 的小伙 —— 也是玩 Minecraft 发家的(好吧,这个看名字就知道)。
好了,我知道你看到这里有点无聊了。所以下面重点来了!!v(??ω??)????
因为也是在 2011 年,一个名为 Buycraft 的东东进入了服主们的视野。Buycraft 是一个 CMS 系统,服务器的玩家可以通过在前端用 Paypal 或者信用卡购买东西,来获得服务器上的增值服务。用 Minecraft 赚钱不再是梦!
真是爆炸性的大新闻。
(超燃 BGM 响起)
这岂止是爆炸性,简直是历史性!!!这不正是现在手游最喜欢加入的课金系统吗?!!
你嫌你的装备太差吗??
你觉得打怪升级太慢吗???
你羡慕那些满身神装的高富帅吗????
快来买 VIP 会员吧!!!!!!
一个月只需 10 美刀,即可让你得到最尊贵的享受!!!!!!!!!!!
两倍金钱!!!
三倍经验!!!!
换装系统!!!!!
宠物陪伴!!!!!!
房间防踢!!!!!!!
非 VIP 说话全是灰色的!!!!买了 VIP 你就算骂脏话我们也帮你加个白色高亮!!!!!!还有高端洋气上档次 VIP 字样的前缀!!!!!
别人死了最多就一句死亡信息!!!!!!!!你死掉我们在你死亡的地点放个七彩烟花!!!!!!!!!让整个世界都知道你死了!!!!!!!!!!!
于是,Minecraft 的多人游戏到这里已经完全发展起轻工业来了,首先是开发难度低兼成本小,插件还不一定要自己开发,网上现成的一堆,实在不行开价让别人来做;然后就等着收钱吧,五十美刀一个月的 VIP 照样有人买!
Bukkit 计划也从此声名大噪,越来越多的热心人士加入了开发行列,每一个更新都是无数服主欢呼的时刻。和 SMP 一样简单的开服流程也让服务器越来越多,保守估计也有几十万 —— 甚至有了 Minecraft Server List,Minecraft Servers 这样的网站,只是列出互联网上公开的服务器地址,同时暗中通过竞价为某些服务器提升排名,一个月就能赚上万。
吃惊吧?更恐怖的在后头呢。刚才提到过的,2012 年迅速崛起的小游戏服务器 Hypixel,也是通过增值内容付费的方式,赚了个盆满钵满!根据我一位认识 Hypixel 开发者的外国朋友的可信消息,高峰期的 Hypixel,日均 30000+ 玩家,一年的净利润 $1000000+。除以 12,一个月九万多美元,也即五十七万人民币。
一个月五十七万。 一个月五十七万。 一个月五十七万。 一个月五十七万。 一个月五十七万。
可能有人会质疑以上的数字,那么我晒晒亲身经历吧:学生党一枚,有多年编程基础,闲着没事也写写插件。我曾经在 2013 年 9 月在一家名为 Minecade 属下的 SkyDoesMinecraft 服务器工作过三个月,月薪一千。2014 年年尾帮 ArkhamNetwork 服务器做过外包项目,六百。
还有一些零零碎碎的小项目,在此不表。而无论是 Minecade 还是 ArkhamNetwork,甚至还挤不进大服务器的行列。可以想像得见一线服务器的员工们,一个月能赚多少了!
所以说如今 Minecraft 的多人游戏完全是一条成熟的产业线,服主带着充足的资金聘请员工,为服务器开发高质量内容吸引玩家;玩家则购买增值内容甚至主动捐款来令服务器盈利。这样的良性循环在整个游戏界来讲都是很难得的。
与此同时,单人游戏的体验也在稳速提高,1.5 的红石更新,1.6 的马匹更新,1.7 的世界观更新,而勤快追上步伐的 Bukkit 计划又让服务器们得以争先抢后地在 CraftBukkit 新版本发布的第一时间更新服务器上的内容,为的就是吸引人流。
原本就蓬勃的 Minecraft 游戏界在 2013 年进入了黄金时代。有充足的利润打底,服务器们开发的新内容一次比一次高质量,Quakecraft、Hide and Seek、Prison、Factions、Arcade 等游戏模式的名字已经深入民心,玩家们也乐意付钱,于是两边和乐融融,近年来游戏业流行的 Freemium 的模式竟然在他们身上得到最好的实现。Minecraft 在这一年突破 1000 万销量,很大程度上要归功于辛勤的服主们。
黄金时代终究是要过去的。狂喜的人们似乎没有发现,一朵乌云已经慢慢逼近......
// 辉煌背后
Bukkit 时代看似辉煌,但实际上有不少隐患出现:
第一是 Bukkit 本身的衰落。2012 年 2 月,Bukkit 的开发团队(Dinnerbone,EvilSeph,Grum,Tahg)收到来自 Mojang 的 offer,于是欣然应邀加盟 Mojang;作为条件,他们不能再开发 Bukkit,而是负责开发新版本的 SMP 和其他与 Minecraft 有关的工作,比如编写 Plugin API。
Dinnerbone 和 Grum 这两位可以说是对整个 Bukkit 计划贡献最大的人,反编译和反混淆由 Grum 全权负责,然后 Dinnerbone 则接过代码坐在电脑桌前除了上厕所外不停歇地码上二三十个小时(这就是爱啊 &3),为的就是以最快的速度将新版本的 Bukkit API 和 CraftBukkit 呈现在大众面前。如今他们走了,虽然有人接班,但是他们都没有了 Dinnerbone 和 Grum 的那份旁人难以理解的激情,更新对他们来说更像是一份义务而不是责任。这也不能怪他们,但伴之而来的就是 CraftBukkit 的更新越来越慢,当初两天就能更新完,现在要花上两个月;而Bukkit 在 1.5 后鲜有再加入新的 API,意思就是上文提到的“翻译”活越来越少人肯去做,导致许多 SMP 的新功能都无法单纯地利用 Bukkit API 实现,必须还得配合之前提到的那种直接修改源代码的蛋疼方法...
作为过来人,我可以肯定地告诉你们:阅读 Minecraft 的源代码太蛋疼了...
第二是收费泛滥。服务器们收费的方式推陈出新,以 Hypixel 为例,VIP 出完了出 VIP+,VIP+ 出完了出 MVP,MVP 出完了再出 MVP+...
几十美金几十美金地收... 国内一线 MMO 都没这么贵啊!
就算玩家们乐意,他们的家长也不乐意呀!不少熊孩子一个月花了几千美刀在 Minecraft 上,而家长们又怎会了解 Bukkit 服务器们的商业模式,于是出现了家长们愤怒地在 Twitter 上向 Notch 投诉并要求全额退款,否则要将 Mojang 告上法庭的啼笑皆非的情况。
Mojang 躺着也中枪:关我屁事啊!?
第三是版权问题。CraftBukkit 内置了 Minecraft 反编译过后的源代码,无形中已经侵犯了 Mojang 的版权;更搞笑的是,Bukkit 计划采用的是 GPL 协议!一个开源计划里却包含了反编译过的商业代码,这一点本身能够不被大众口诛笔伐实属幸运。
Mojang 当然知道 Bukkit 计划是怎么回事,不过他们对这些第三方服务器端也就是睁一只眼闭一只眼,只要你不把 Minecraft 重新打包一次就拿出去卖,你改成我也不管你。
我知道你们还没完全消化这几段的内容 (o?Д`)=з 但敬请记住这几个关键词吧:Bukkit 衰落、收费泛滥和版权纠纷。
故事要进入高潮阶段了。
// Bukkit 与 Spigot 的冷战(2013 ~ 2014)
自从原开发团队离去后,先不提越来越慢的更新和越来越落后的 API,CraftBukkit 的性能也饱受诟病。许多人都自己私下制作了 CraftBukkit 的优化版本,当时最出名的是 CraftBukkit++,着重优化了农作物生长的部分,能显著提高 TPS(ticks per second,TPS 越低,服务器就越卡,和我们玩游戏时说的 FPS 帧数很相似)。但是每个优化版本都只是优化了一小部分,这个优化通讯,这个优化实体,这个优化 AI,这个优化地图加载... 有没有一个版本的 CraftBukkit,能集齐百家所长呢?
有的,那就是由 md_5 大神开发的 Spigot。
md_5 同学的头像,橙色的史莱姆
来来来,先上个功能列表:
TPS increases
Optimized growth, decay and chunk ticking
Automatic conversion between online and offline mode.
Auto stack merging for items and experience orbs
Chunk garbage collector to prevent chunk leaks
Convert your offline mode server to online mode without losing player data
Configurable values for many vanilla/Bukkit messages (e.g. whitelist, no permission)
Disabling of random light updates
Optimized anti x-ray (Orebfuscator)
Efficient Netty networking engine
Smart crash and hang detection / prevention
Reverse compatibility with CraftBukkit plugins
Entity activation and tracking ranges to ensure client-side and server-side resources are only used when needed
Prevent server load caused by maps in item frames
Automatic restarts upon a server crash
Automatically stays up-to-date with the latest CraftBukkit changes
Ability to disable TAB command complete
Customization over what the console logs
Fine control over growth rates, chunks, and ticks
Optimized tick loop
Memory-reducing nibble arrays
More accurate benchmark timings reports
Configurable chunk packet sending
Threaded chunk compression
是不是不明觉厉?
总之,你只要知道 Spigot 是个牛逼哄哄的强化版 CraftBukkit,只要换上它你的服务器立刻流畅几倍,提供的 API 和配置文件都更丰富,并且完全开源免费。
有兴趣想知道 Spigot 有多牛逼的,我们不妨来做一个小测试:我随便从网上下载了个 1.6 时代的大型地图,先用 Spigot 开,然后进入服务器在里面跑跑跳跳,两分钟后关服,重设地图,再用 CraftBukkit 开,重复以上步骤。由于我使用的 Spigot 和 CraftBukkit 都是 1.8 版本,加载 1.6 版本的地图肯定会有许多错误,可以藉此做压力测试。我们以服务器的日志作为。可以见到的是,尽管两者对 NBT 错误和实体位置错误的处理都是简单粗暴地扔出错误信息,但 CraftBukkit 在一分半钟里“Can't keep up(臣妾跟不上)”了三次,2400 ticks 里整整跳过了 615 ticks,TPS 只有 (00*20 ≈ 15;而 Spigot 全程淡定地在后台做优化,即使抛出的异常比 CraftBukkit 更多,TPS 仍然稳定地保持在 20。还值得一提的是,CraftBukkit 关服的时候用了 44 秒,Spigot 只用了 2 秒。或许大家还理解不了上面说到的 15 TPS 是什么概念。15 TPS 意味着服务器在二十分钟内会有五分钟都完全无法响应你的请求。你拿一把钻石剑砍人十次,可能就有三次明明砍中了对方也不会扣血,因为服务器正忙着处理别的事儿呢,没空理你的请求,自然也就不会做攻击判定。而 Spigot 做过多线程相关的优化,所以自然没有这类问题。
正常人能做到 Spigot 这个地步也就足矣,之后就只需时不时更新一下,就可以自我陶醉于众人的喝彩声里了。md_5 也完全可以凭着他的编程实力随便加入个一线服务器赚大钱,但他并没有止步于此。
我们都知道,Minecraft 是个吃内存的游戏。服务器也同理:1GB 内存最多只能带给 10 名玩家最好的游戏体验,玩家数一超过 15 服务器就会开始卡;而现在市面上的 VPS 虚拟主机最多也就 8GB 内存,只能容纳 80 个玩家。于是初期的服主们大多采用的做法是,开多几个服务器,每个服务器上的插件、地图、配置全部一样,玩家的数据则储存在一个统一的 SQL 数据库内。然后玩家们就用类似 , 这样的 IP 进入服务器的不同分支。问题在于,跨服务器之间的通讯将变得极为困难,例如玩家无法直接在游戏内从 server1 的世界传送到 server2 的世界,聊天消息无法互通,甚至服务器是否满人还得玩家自己连连看才知道,间接令玩家的体验大大降低。而 md_5 正想着手解决这个问题。
Bungeecord 就是 md_5 与他的 Spigot 团队给出的解决方案。Bungeecord 如同一座桥梁将不同服务器无缝地连接在一起,同时还向开发者提供了容易扩展的 API,整合了跨服通讯等实用的功能。详细的技术原理我们就撇开不谈了,只说说结果吧:如今,所有一二三线的服务器都在使用 Bungeecord。
如果说 Spigot 让 md_5 一炮成名,那么 Bungeecord 就足以让他被捧上神坛。Spigot 论坛变得越来越热闹,而另一边厢的 Bukkit 论坛却不断的流失着用户。这事儿想起来也很喜感:明明 Spigot 只是 Bukkit 的扩展,但结果青出于蓝而胜于蓝,2012 年还在通通用 Bukkit,2013 年就已经是 Spigot + Bungeecord 的天下了。像是一夜之间,Bukkit 论坛兴旺不再,原本为 Bukkit 团队喝彩的人们都跑去 Spigot 喝彩了。
Bukkit 团队:“...”
Bukkit 团队完全可以和 Spigot 合作,为 Minecraft 业界一起打造出耀眼的未来。不过在 Spigot 刚刚流行起来的时候,EvilSeph(还记得吗?2012 年初加入 Mojang 的其中一位)不知道何故从 Mojang 辞职,反而回到了 Bukkit 开发团队里。EvilSeph 作为 Bukkit 的创始人之一,自然看 md_5 们不顺眼,所以不知从哪一天起,Bukkit 论坛不再允许任何与第三方服务器端有关的讨论。就连提到名字都不行。
夹杂点私货吧,笔者曾经在 Bukkit 论坛询问过一条关于 Bukkit API 的问题,问题描述里我这么写:“...这个问题似乎在某个以 S 开头的服务器端里也存在着。(暗指 Spigot)”。然后该贴子就被删除了。我以“Stop hating 3rd party unofficial builds(不要再对第三方服务器端们心怀仇恨了)”为题发贴,贴子被封锁,两天后被删除。以上是管理员 TnT 给予我的解释。从此我几乎不再上 Bukkit 的论坛。
越来越糟糕的性能和 API,还有封闭的言论自由都令越来越多原本忠实地守在 Bukkit 的人一再失望(包括我在内),而此时的 Spigot 论坛却友善地接纳了这一群 Bukkit 支持者。在 Bukkit 论坛的管理员们忙着删贴、十多天都不审核插件平台(BukkitDev)上的插件的时候,Spigot 论坛推出了 Premium Resources平台和 Services & Recruitment 版块。前者是个交易平台,开发者可以自由地上传自己写的插件,并向下载者收取一定金额的费用;而后面这个论坛版块更厉害,服主们可以在这里招揽人才,时不时都会有一线服务器过来招人,有实力的人则在这里推广自己的服务,我自己就在上面发过 ,专门帮人订制小游戏。
现在还活跃在 Bukkit 论坛的,大多都是初来乍到的新手;就以现在我打这行字的时点来做个统计,Spigot 论坛在线人数 197,Bukkit 论坛 26,相差整整 7 倍多!现在国外是凌晨时分,要是高峰期的话,估计距离会拉得更远吧。Bukkit 和 Spigot 之间不知不觉进行起来的冷战,持续了一年多,终于又在无声无息中以 Spigot 的彻底胜利告终。
========================== 以下部分施工中=========================
// EULA 危机(2014)
// DMCA 危机(2014)
答主我先吃个饭。

我要回帖

更多关于 百人我的世界服务器 的文章

 

随机推荐