mod开发环境配置

这篇文章介绍如何使用IDEA搭建forge1.7.10-1614开发环境。

首先安装配置jdk8、IDEA。

下载mdk:

前往官网下载src

http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.7.10.html

点击1614版本的src链接,跳转地址如下:

http://files.minecraftforge.net/maven/net/minecraftforge/forge/1.7.10-10.13.4.1614-1.7.10/forge-1.7.10-10.13.4.1614-1.7.10-src.zip

导入IDEA

进入解压的forge src文件夹选择build.gradle并导入

点击ok后环境初步搭建完成

 

在Scrapyd环境下Scrapy未执行Pipeline

在Spider.parse()中

yield scrapy.Request(response.urljoin(self.url), callback=self.parse_content)

yield {
‘url’: self.url,
‘title’: ‘0’,
‘datetime’: ‘0’,
‘content’: ‘0’,
}

分别使用以上两种方式返回item,仅后者顺利调用pipeline.process_item()

前者执行reques后调用callback进入Spider.parse_content()

(草稿,待更新)

让非凡rpg支持1.9以下客户端

众所周知,非凡rpg这款非常强大的rpg只支持1.9以上服务端,但是并没有阻拦我们尝试用1.8客户端连接服务端。今天我们来讨论让DivineItemsRPG支持1.8以下并正常使用。

首先参考上一篇的跨版本搭建一个1.12服务端,安装DivineItemsRPG。

安装成功,可以使用,但是问题来了,1.8客户端拿到怪物掉落的随机装备武器或者指令随机生成的不能正常显示。

随机生成调用是在ru.CapitalisM.DivineItems.Modules.Tiers.TierManager.createRandomItem这个函数中执行。

通过漫长的调试,终于定位到显示异常的成因了。

var4.spigot().setUnbreakable(true);

就是这一行。那么只要阻止生成装备unbreakable就行了。

进入配置文件夹DivineItemsRPG/tiers

修改每一个tier

找到

SetUnbreakable: false

改为

SetUnbreakable: true

更好的跨版本技术-让各种版本客户端访问你的服务器

浏览spigot论坛,能找到的关于跨版本的频率最高的词汇就是Protocol hack。顾名思义就是在服务端拦截packet并修改。

这里是mc协议的完整wiki:http://wiki.vg/Protocol

直接进入主题,跨版本。今天介绍的跨版本不是普通的1.8-1.12的跨版本,是支持全版本客户端真正的跨版本。

首先安装paperspigot1.12

插件安装

ProtocolSupport

ProtocolSupportLegacySupport

支持1.4.9-1.12

 

 

连我的群组服试试吧iicraft.com,它就是1.12版本的跨版本的范例。

1.8-1.12bukkit插件实现让用户打开书本界面

就是这种在书本界面,想必各位服主看了都很疑惑,有什么办法能实现呢?

先放上最终结果

我在spigot论坛翻遍了帖子,终于在一个角落里发现了这样的代码。

PacketDataSerializer packetdataserializer = new PacketDataSerializer(Unpooled.buffer());
packetdataserializer.a(EnumHand.MAIN_HAND);
((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload(“MC|BOpen”, packetdataserializer));

原理就是服务端先向用户发送这本书的ItemStack,然后向客户端发送打开书的数据包,然后恢复ItemStack,就是这么简单。

但是它会用到NMS类而且写入book必然要动用NBT,这里我已经准备了ProtocolLib版本的代码了,复制粘贴就能兼容绝大多数版本了。

核心代码如下

Object bf = upc.getMethod("buffer", int.class).invoke(null, 256);
bfc.getMethod("setByte", int.class, int.class).invoke(bf, 0, 0);
bfc.getMethod("writerIndex", int.class).invoke(bf, 1);

pc.getModifier().write(1, MinecraftReflection.getPacketDataSerializer(bf));

pc.getStrings().write(0, "MC|BOpen");

想要获取完整代码,请留言

 

外部认证插件部分

以下内容包含bukkit插件和sponge插件。

以bukkit为例,具体原理如下:

监听AsyncPlayerPreLoginEvent事件,

获取用户名和ip,向webapi发送验证请求,验证该用户是否已登录。

返回的结果如果符合预设的通过文本则本事件allow()

否则

disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, kickMsg);

kickMsg即显示的认证失败说明。

以上是最基本的原理,如果用户是通过bungee转发的请求,插件没能获取真实ip怎么办?

1.bungee开启ipforward,然后在登录的服务器spigot.yml设置bungeecord: true,即可完成ip转发。

2.插件中判断登录用户ip为bungee服务器ip则直接跳过认证直接通过。

 

sponge版本同理,监听事件换成了ClientConnectionEvent.Login

但是在sponge中获取bungee转发的ip并不是那么顺利

首先bungee端安装插件SpongePls.jar,在config.yml中设置sponge端的服务器名

在sponge插件中调用pluginmessage获取bungee转发ip,这里需要延迟处理,需要先allow()通过该用户否则会被堵塞。

开发一个MC启动器

https://github.com/huanghongxun/HMCL

https://github.com/MineStudio/KMCCC

https://github.com/MineStudio/MCMV3

https://www.github.com/MultiMC/

https://github.com/Nsiso/NsisoGenuineLaucher

1-10更新:补上之前的成果

启动器登录界面,需要配合api和服务端插件就可以实现外部登录,见另一篇文章:weblogin&weblogin-sponge

还有个h5注册页面,之保留了这张截图

重点来了,启动器主界面。左边的服务器列表是从api拉取下来,包括标题介绍在线人数,客户端压缩包下载地址。选择了服务器之后点击下载游戏自动下载对应的客户端。

问题是,当天就被某人cc挂了,还花了我cdn全部流量,索性弃坑,还是用群文件吧,速度快稳定不怕d。

rpgitem使用

/rpgitem 编号 create

/rpgitem list查看已经有的

/rpgitem 00 give 拿到

/rpgitem 00 item [你想更换的材质id]

/rpgitem 00 display

/rpgitem 00 quality 品质 传说[legendary],史诗[epic],稀有[rare],优秀[uncommon],粗糙[trash]

/rpgitem 00 damage 100 200 伤害

/rgitem 00 type 类型lore

potionhit 药水

power 技能

power command 指令

recipe  removerecipe 配方

 

Captcha-Tensorflow 一次失败的配置过程

Traceback (most recent call last):
File “conv_captcha.py”, line 165, in <module>
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
TypeError: run() takes no arguments (2 given)

0.5.0

ImportError: No module named PIL

pip install image

 

Traceback (most recent call last):
File “conv_captcha.py”, line 165, in <module>
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
TypeError: run() got an unexpected keyword argument ‘argv’

0.8.0

 

1.4.0

https://github.com/tensorflow/tensorflow/archive/v1.4.0.tar.gz

pip install –upgrade https://pypi.python.org/packages/99/72/a420e22dc93416d30981e87a2318823ec09a9b18631369df0e7d9d164073/tensorflow-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl#md5=6a1d8bcc8f5a70f1d3be4d7a3c835955

红字

pip install –upgrade tensorflow-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl

 

Traceback (most recent call last):
File “conv_captcha.py”, line 165, in <module>
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
File “/usr/lib/python2.7/site-packages/tensorflow/python/platform/app.py”, line 48, in run
_sys.exit(main(_sys.argv[:1] + flags_passthrough))
File “conv_captcha.py”, line 51, in main
meta, train_data, test_data = input_data.load_data(FLAGS.data_dir, flatten=False)
File “/root/captcha-tensorflow/input_data.py”, line 19, in load_data
*_read_images_and_labels(train_dir, flatten=flatten, **meta)),
File “/root/captcha-tensorflow/input_data.py”, line 68, in _read_images_and_labels
labels.append(_read_lable(fd, **meta))
File “/root/captcha-tensorflow/input_data.py”, line 82, in _read_lable
idx = label_choices.index(basename.split(‘_’)[0])
ValueError: substring not found

pip install pillow==4.0.0

pip install captcha==0.2.1

 

还是不对 弃坑 准备重写