2017年1月14日土曜日

[C#なMinecraftPEサーバーのMinet]プラグインをつくる#4 デバック編

どうもはにおかさいです。今回はやりやすいデバックの方法を紹介します。

すでに当ブログのすべてのminet記事を読んでいるのが前提です。

1,プロジェクト→云々のプロパティを開きます。


2.デバックタブをクリックし、外部プログラムの開始 でMinet Serviceのexeを選んでください


3,ビルドイベント→ビルド後の編集


ここには、copy /Y ビルドされたプラグイン minetのプラグインフォルダ内の保存先
を書きます。

copy /Y Z:\users\doc\GitHub\ExamplePlugin\ExamplePlugin\ExamplePlugin\bin\Debug\ExamplePlugin.dll Z:\users\desktop\kariokiba2\minet\plugins\ExamplePlugin.dll



保存して、開始をクリック。


そうすると、minetが立ち上がります。もしプラグインにエラーがあれば、該当箇所に吹き出しが出ますから便利です。

p.s. 日本のminet開発者はほぼいなそう()

2017年1月6日金曜日

MacBook Air Core i7 Early 2015買っちゃいました

こんにちは、高校1年残り数ヶ月のはにおかさいです。ついにmacユーザーになりました。購入についての話と、感想を書きます。

購入動機:
いつしか、https://mitoupgwg.connpass.com/event/45816/に行ってきたのですが(記事にし忘れてた)、その時周りにいたuuumやtwitchのデベロッパーさんがみんなmacbook airやproを使ってました。proのtouchbar付きも見せてもらったなぁ。寿司は流したことないそうですw(誰だったけ。) 流れ的に、スタッフ?席に座ってたのですが、周りを見回すと、結構macなんすよ。特に驚いたのが、小学生?の女の子もmacでした。衝撃を受けました。それで負けじと、、、ということではないです(理由の1つでもありますけど。)
自分はwindows使いなのですが、iosアプリを作りたいと思うことがよくあります。『夢見る』という手もあるのかもしれませんが、デスクトップのメモリが8GBしかなくて、追加するのにも1万。
時は少し流れ、12月31日。appleが初売りすると知りました。この機会に買っちゃえ!と思い、半ば衝動買いで買ってしまいました。後悔はしていません。おかげで色々なものを売りました。大切なものでさえ。。。(嘘です)

購入:
買い方なんて調べればわかることですので書きません。1月2日の初売りの特典はアップルの1万6500円のカードでした。現金値引しろよって思ってしまった()どう使うか。賞味期限あるのかな。モデルは色々悩んだ末、core i7の256GBのairにしました。
オプションの選択理由として
ー容量が128GBでは少なく、512GBじゃ高すぎる。
ーかなりパソコンに無理させるタイプなので、i7じゃなきゃ厳しそう、費用対効果はベンチマーク的に良さそうだった。

ツイッターしてたら、今更macbook airと言われてしまいました。それには理由があります。

私がmacbook air にした5つの理由

1、usb type-cが嫌い
ー通常のusbがさせないのは相当辛そう。結構usbつかう頻度高いので、厳しい。

2、touchbarいらない
ーtouchbarの使い道は、寿司流すかニュース流すかしかしないと思います。

3、core mは俺を満たしてくれない(macbookとの比較)
ーcore mはatomよりいいとは言え、かなり厳しい。core mタブレットでideaでjava書こうとしたら、cpuMAXまでいってしまった。

4、ポートの類い少なすぎ(macbookとの比較)
ーポートが1つは論外。充電しながらマウスもさせないのは辛いです。

5、キーストロークが悪そう、Macbook Pro
ーMacBookPROはキーが押した感じしなさそうなので、敬遠してしまいました。

使用:
まず、薄さと軽さに驚きました。前のノートパソコン(2.4kg)より半分ぐらいの重さじゃないでしょうか。これならば、外で微妙な気持ちで膝に乗せてカタカタすることができます。
バッテリーの持ちも非常に良く、今はバッテリー駆動なのですが、今日の朝1時間使って、夜6時間使ってもバッテリーが持っています。
pycharmとideaで遊んで、裏で常にChrome立ち上げてる程度の使い方では、全くcpuの性能が気になったり、バッテリーが気になったりしませんでした。
ファンレスだと最初は思っていたのですが。画面とキーボードの間に通気口があって、衝撃を受けました。おそらくデザインの問題だと思うのですが。。。キーボードは、今このブログを売っていてとても打ちやすいと思います。ホームポジションはわからないのですが、割と早く打てちゃいます。
osそのものは。起動がとても早いです。おそらく完全に電源が切れていないのだと思いますが、起動は10秒程度です。windows機の時は、biosだけで10秒は使ってました。
コーディングしたり、専用サーバーの管理をすることにおいて、osxであってもソフトが制限されている気分にはなりませんでした。むしろubuntuの方が深刻だと思います。

感想:
買う前は、正直アルミニウムの美術品程度にしか、macbook airのことを思っていませんでしたが、今は違います。非常に素晴らしいです!本当に。隅々まで意図して設計しているように感じます。でも、iPhoneは買いません。なぜなら、ファイル管理がスマホ単体だとかなり厳しいから。Androidは楽勝なのに。。。あと、購入前に色々ググったのですが、明らかにおかしな説明をされているサイトが散見されて、驚いた()



2017年1月3日火曜日

最安!専用サーバー robot.your-server.de (Hetzner) 月4000円以下でCorei7 3600

こんにちは、haniokasaiです。Scalewayで支払いトラブルがあったのと、ロードアベレージがやばいのと、omgsrvの契約切れるので、専用サーバー借りてみました。

リンクはここhttps://robot.your-server.de/order/market


税金に関する項目。日本はないのでAll Othersを選んでください。


オークション画面。オークションなので台数制限がありますが、あまり競争率は高くないし、似たようなの出品されやすい。

これがうわさの29ユーロ(3 565.5626 円執筆時)の専用サーバー

よだれが出てくるスペック

購入するには、ヨーロッパで通用する身分証明書(パスポートや国際運転免許証)が必要になります。おそらく納税関係でしょう。なお、未成年は申し込むことができません。


DDoS対策も無料でされています。

osも最新。

サポートは親切で、応答も早く文句の付けどころがありません。
kvmで動いてるマシンではなく、物理的に動作しているようです。

操作パネルがわかりにくいほうかな。


日本からだとレイテンシがやばいけど、スイスよりはまし。西廻りの回線増やせよ....

計測値類

  dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync

16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.71432 s, 160 MB/s


wget -O /dev/null http://speedtest.dallas.linode.com/100MB-dallas.bin

--2016-12-20 15:39:30--  http://speedtest.dallas.linode.com/100MB-dallas.bin
Resolving speedtest.dallas.linode.com (speedtest.dallas.linode.com)... 2600:3c00::4b, 50.116.25.154
Connecting to speedtest.dallas.linode.com (speedtest.dallas.linode.com)|2600:3c00::4b|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 104857600 (100M) [application/octet-stream]
Saving to: ‘/dev/null’

/dev/null           100%[===================>] 100.00M  3.57MB/s    in 28s

2016-12-20 15:39:59 (3.53 MB/s) - ‘/dev/null’ saved [104857600/104857600]

  wget -O /dev/null http://speedtest.tokyo.linode.com/100MB-tokyo.bin

--2016-12-20 15:40:01--  http://speedtest.tokyo.linode.com/100MB-tokyo.bin
Resolving speedtest.tokyo.linode.com (speedtest.tokyo.linode.com)... 2400:8900::4b, 106.187.96.148
Connecting to speedtest.tokyo.linode.com (speedtest.tokyo.linode.com)|2400:8900::4b|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 104857600 (100M) [application/octet-stream]
Saving to: ‘/dev/null’

/dev/null           100%[===================>] 100.00M  10.2MB/s    in 12s

2016-12-20 15:40:13 (8.58 MB/s) - ‘/dev/null’ saved [104857600/104857600]



cpuinfo



processor       : 7
vendor_id       : GenuineIntel
cpu family      : 6
model           : 58
model name      : Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
stepping        : 9
microcode       : 0x17
cpu MHz         : 1649.796
cache size      : 8192 KB
physical id     : 0
siblings        : 8
core id         : 3
cpu cores       : 4
apicid          : 7
initial apicid  : 7
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm ida arat pln pts
bugs            :
bogomips        : 6800.34
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:


meminfo


MemTotal:       16114756 kB
MemFree:        14131780 kB
MemAvailable:   15680124 kB
Buffers:           48644 kB
Cached:          1707080 kB
SwapCached:            0 kB
Active:           578212 kB
Inactive:        1198964 kB
Active(anon):      22060 kB
Inactive(anon):     8388 kB
Active(file):     556152 kB
Inactive(file):  1190576 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       8380412 kB
SwapFree:        8380412 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:         21448 kB
Mapped:            20932 kB
Shmem:              9000 kB
Slab:             131968 kB
SReclaimable:     106872 kB
SUnreclaim:        25096 kB
KernelStack:        2992 kB
PageTables:         2232 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    16437788 kB
Committed_AS:      90060 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:      2048 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       75812 kB
DirectMap2M:    16379904 kB

free -m

              total        used        free      shared  buff/cache   available
Mem:          15737          88       13804           8        1844       15317
Swap:          8183           0        8183



 fdisk -l

Disk /dev/ram0: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram1: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram2: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram3: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram4: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram5: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram6: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram7: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram8: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram9: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram10: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram11: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram12: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram13: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram14: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram15: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/sda: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BBFB0633-3687-433F-B383-EDA1C4FA1BA1

Device          Start        End    Sectors  Size Type
/dev/sda1        4096   16781311   16777216    8G Linux RAID
/dev/sda2    16781312   17829887    1048576  512M Linux RAID
/dev/sda3    17829888 2165313535 2147483648    1T Linux RAID
/dev/sda4  2165313536 5860533134 3695219599  1.7T Linux RAID
/dev/sda5        2048       4095       2048    1M BIOS boot

Partition table entries are not in disk order.


Disk /dev/sdb: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 2BF76CAA-A71B-41B9-95AA-8F7F45831D78

Device          Start        End    Sectors  Size Type
/dev/sdb1        4096   16781311   16777216    8G Linux RAID
/dev/sdb2    16781312   17829887    1048576  512M Linux RAID
/dev/sdb3    17829888 2165313535 2147483648    1T Linux RAID
/dev/sdb4  2165313536 5860533134 3695219599  1.7T Linux RAID
/dev/sdb5        2048       4095       2048    1M BIOS boot

Partition table entries are not in disk order.


Disk /dev/md1: 511.4 MiB, 536281088 bytes, 1047424 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/md0: 8 GiB, 8581545984 bytes, 16760832 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/md3: 1.7 TiB, 1891818209280 bytes, 3694957440 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/md2: 1023.9 GiB, 1099377410048 bytes, 2147221504 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


unixbench


------------------------------------------------------------------------
Benchmark Run: Tue Dec 20 2016 15:50:47 - 16:20:11
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       44771484.8 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     4577.4 MWIPS (10.2 s, 7 samples)
Execl Throughput                               6055.5 lps   (29.4 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1501650.2 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          399847.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       3645107.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                             3105592.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 214815.0 lps   (10.0 s, 7 samples)
Process Creation                              16557.7 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  15892.8 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   6155.5 lpm   (60.0 s, 2 samples)
System Call Overhead                        5150790.6 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   44771484.8   3836.5
Double-Precision Whetstone                       55.0       4577.4    832.3
Execl Throughput                                 43.0       6055.5   1408.3
File Copy 1024 bufsize 2000 maxblocks          3960.0    1501650.2   3792.0
File Copy 256 bufsize 500 maxblocks            1655.0     399847.1   2416.0
File Copy 4096 bufsize 8000 maxblocks          5800.0    3645107.9   6284.7
Pipe Throughput                               12440.0    3105592.0   2496.5
Pipe-based Context Switching                   4000.0     214815.0    537.0
Process Creation                                126.0      16557.7   1314.1
Shell Scripts (1 concurrent)                     42.4      15892.8   3748.3
Shell Scripts (8 concurrent)                      6.0       6155.5  10259.1
System Call Overhead                          15000.0    5150790.6   3433.9
                                                                   ========
System Benchmarks Index Score                                        2502.2



------------------------------------------------------------------------
Benchmark Run: Tue Dec 20 2016 16:20:11 - 16:49:41
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      187741197.8 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    31254.7 MWIPS (10.0 s, 7 samples)
Execl Throughput                              33036.3 lps   (29.5 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1269985.3 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          329330.3 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       3898625.5 KBps  (30.0 s, 2 samples)
Pipe Throughput                            12818937.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                1610199.7 lps   (10.0 s, 7 samples)
Process Creation                              78004.3 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  59934.1 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   7802.4 lpm   (60.0 s, 2 samples)
System Call Overhead                       11469020.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  187741197.8  16087.5
Double-Precision Whetstone                       55.0      31254.7   5682.7
Execl Throughput                                 43.0      33036.3   7682.9
File Copy 1024 bufsize 2000 maxblocks          3960.0    1269985.3   3207.0
File Copy 256 bufsize 500 maxblocks            1655.0     329330.3   1989.9
File Copy 4096 bufsize 8000 maxblocks          5800.0    3898625.5   6721.8
Pipe Throughput                               12440.0   12818937.1  10304.6
Pipe-based Context Switching                   4000.0    1610199.7   4025.5
Process Creation                                126.0      78004.3   6190.8
Shell Scripts (1 concurrent)                     42.4      59934.1  14135.4
Shell Scripts (8 concurrent)                      6.0       7802.4  13004.0
System Call Overhead                          15000.0   11469020.7   7646.0
                                                                   ========
System Benchmarks Index Score                                        6860.7



めっちゃ好成績だと思います。価格にしても。

しばらくは使ってるのでぜひ質問してみてください。ツイッターでもいいです。

2016年12月20日火曜日

[Pocketmine-mp] how to upgrade to 1.0.0 [phar] [src]

[MinecraftPE] PocketMine-MP 1.0.0 の対応のさせ方! [PMMP src]

PocketMine-MPの1.0.0対応版をいつも通り見つけてきたので、掲示しときます。

php7対応です

"pmmp"


これはapiが3.0なので、プラグイン未対応があるかもしれませんが未検証。


Pharはこちらです。

jenkins(最新版)http://jenkins.haniokasai.com/job/PocketMine-1.0.0/



2016年12月18日日曜日

[C#なMinecraftPEサーバーのMinet]プラグインをつくる#3 コマンド処理編

こんにちは、haniokasaiです。
今回はコマンドをMinetサーバー内で使う方法を解説します。

1、おまじないをかける
Minetでコマンドをプレイヤーに使わせるには以下のおまじないをかける必要があります。これにより、ワールド内でチート(コマンド)が使えると、端末が認識します。

var setCmdEnabled = McpeSetCommandsEnabled.CreateObject();
setCmdEnabled.enabled = true;
player.SendPackage(setCmdEnabled);

これは、このプラグインを入れれば、勝手にやってくれます。
https://github.com/haniokasai/EnableCommand

2.書き方

        [Command(Name = "test", Description = "コマンドテスト", Permission = "OP")]
        public void test(Player player)
        {
            player.Level.BroadcastMessage("test", type: MessageType.Raw); // Message typeはtip popup messageが選べる!
        }

こんな感じ。Permissionに関しては、まだ仕様(しよう)が良くわかりません。どうしよう。

[C#なMinecraftPEサーバーのMinet]プラグインをつくる#2 コード編

イベントや、コマンドを理解しようとしたらすでにまとめてあったので、和訳します。

プラグインAPIの文章

MiNETにはすでにたくさんのMinecraftの機能が実装されています。 しかし、私たちは時にはあなたがより多くの機能を望むこと、あるいはそれが違うように機能するかもしれません。 この目的のために、MiNETは.NETのプラグインAPIを提供しています。これを使用して、あなたの特定のニーズに合わせて機能を作り、調整し改造することができます。
注:APIとこのページの情報は実験的なものであり、予告なく変更することがあります。 APIに関するご質問は、Gitterチャット(メインページのリンク)でお問い合わせください。

対応している機能

現在、次の機能がAPIによって提供されています。
  • 起動クラスによるサーバーの起動時に何かを実行すること。
  • プラグインは、パケット送受信処理をすることができます。
  • プラグインは、コマンドの処理ができます。

Hello world プラグイン

コマンド処理

自分でコマンドを作ることができます。これらのコマンドは、MiNETが解析し、低レベルなコマンドハンドラに渡すテキストメッセージとしてクライアントから送信されます。
下の例文は '/min' コマンドの処理です。
    [Command]
    public void Min()
    {
    }
下に、特定の球の範囲を爆破する、より完全な例があります。
    [Command]
    [Description("特定の球の範囲を爆破します")]
    public void Boom(Player player, int radius = 10)
    {
        new Explosion(
            player.Level,
            new BlockCoordinates((int) player.KnownPosition.X, (int) player.KnownPosition.Y, (int) player.KnownPosition.Z),
            radius).Explode();
    }

この例について注目すべきことがいくつかあります。 まず、名前とメソッドのパラメータに基づいて(クライアント内の)使用情報が自動的に生成されます。 さらに、Descriptionを使用して説明を書くことができます。 Playerオブジェクトは、最初のパラメータとして存在する場合、自動的に挿入されます。 他のすべてのメソッドパラメータは、コマンドパラメータとして扱われます。 それらは、MiNETによる受信の際にパラメータに指定された型に自動的に変換されます。

下のデータ型は自動で変換されます。
  • string
  • short
  • int
  • bool
  • float
  • double
これにより、プラグイン作成者がコマンド処理メソッドから完全な機能とパラメータ解析を得るために書くために必要なコードが大幅に削減されます。
APIは、型変換をバイパスして引数を直接送信するために、次の表記法もサポートしています(警告:これには現在バグがあります)
    [Command]
    [Description("argsを使った一般的なコマンド")]
    public void Generic(Player player, string[] args)
    {
        Log.Info("一般的なコマンドが実行されました");
    }
args引数には、クライアントのチャットウィンドウにユーザが入力した引数リストが含まれています。

パケット受信処理

パケットを引数として受け取るメソッドを実装することによって、パケットの受信を傍受することができます。 以下の規則に従って実装されたメソッドはすべて、受信パケットハンドラとして自動的に登録され、PacketHandlerなしで実行されます。
  • メソッドはpublicにしてください
  • メソッドは Package型で返します。
  • メソッドの最初の引数は、Packageから派生した型です
  • 送信パケットハンドラの場合、Sendは常に必要です。
    public Package MinimalHandler(McpeMovePlayer packet)
    {
        return packet; // Handled
    }
必要に応じて、メソッドにPacketHandlerを使用して注釈を付けることができます。 これにより、コードの可読性が向上し、コードの動作も変更される可能性があります。 また、以下のReceiveに注目し、このメソッドを受信ハンドラとして指定します。 メソッドはハンドラを受け取るようにデフォルト設定されています。
    [PacketHandler]
    [Receive]
    public Package HandleIncomingMove(McpeMovePlayer packet)
    {
        return packet;
    }
送信するパケットをプラグインで傍受したい場合は、ReceiveをSendに置き換えます。
    [Send]
    public Package HandleSendMove(McpeMovePlayer packet)
    {
        return packet;
    }
ハンドラメソッドがnullを返すと、それはパケットのさらなる処理を停止します。 これはsendハンドラとreceiveハンドラの両方で同じです。
    [Send]
    public Package HandleSendMove(McpeMovePlayer packet)
    {
        return null; // Halt processing
    }
2番目の引数はPlayer型の場合、現在、要求したプレイヤーが挿入されます。
    public Package HandleSendMove(McpeMovePlayer packet, Player player)
    {
        return packet;
    }

完全なプラグインの例

以下のコードは、プレイヤー移動パケットの送受信処理をできるプラグインを実装する例です。
    [Plugin]
    public class SimplePlugin : Plugin
    {
        [PacketHandler, Receive]
        public Package HandleIncoming(McpeMovePlayer packet)
        {
            return packet; // Process
        }

        [PacketHandler, Send]
        public Package HandleOutgoing(McpeMovePlayer packet)
        {
            return packet; // Send
        }
    }

サーバーの起動時処理

MiNETの多くの基礎機能は、さまざまなプロバイダインターフェイスを実装することで置き換えることができます。 ただし、この機能を置き換えるには、サーバーが動作する前に再構成する必要があります。 したがって、これらのシナリオをカバーし、起動の冗長的な構成を避けるために、プラグイン開発者はIStartupを実装してサーバーを起動時処理を選択できます。
シンプルなコード構成によって、サーバー内のID管理を完全に置き換える方法の完全な例を以下に示します。
    [Plugin]
    public class StartupPlugin : Plugin, IStartup
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof (StartupPlugin));

        /// <summary>
        /// Minetのスタートアップクラス。 ユーザーと権限管理を保存します。
        /// </summary>
        /// <param name="server"></param>
        public void Configure(MiNetServer server)
        {
            server.UserManager = new UserManager<User>(new DefaultUserStore());
            server.RoleManager = new RoleManager<Role>(new DefaultRoleStore());
            Log.Info("Executed startup successfully. Replaced identity managment.");
        }
    }
MiNETのID管理についてもっと知りたい場合は、公式のASP.NET IDのドキュメントを参照してください:

イベント

MiNETはまた、コードを書くのを少し簡単にするために、いくつかのイベントを提供しています。
    var server = Context.Server;

    server.LevelManager.LevelCreated += (sender, args) =>
    {
        Level level = args.Level;
        level.BlockBreak += (o, eventArgs) => { };
        level.BlockPlace += (o, eventArgs) => { };
    };

    server.PlayerFactory.PlayerCreated += (sender, args) =>
    {
        Player player = args.Player;
        player.PlayerJoin += (o, eventArgs) => eventArgs.Player.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Green}+{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
        player.PlayerLeave += (o, eventArgs) => eventArgs.Player.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Red}-{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
    };

さらなる例