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}");
    };

さらなる例


2016年12月16日金曜日

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

こんにちは、haniokasaiです。おぎわらさんがブログにしてます作り方ですけど、具体的な開発の説明がないので、可能な限りしたいと思います。(C#経験ないです)

必要なもの
 visual studio 2015(コミュニティーエディション)(ググればやり方はわかります、インストール時にwindowsのc#をいれてあげてください)
  やる気(ありがち)
 フィロソフィア(知を愛すること)

1、立ち上げてください。

2 ファイル->新規作成→プロジェクト


3 Visual C#のwindowsのクラスライブラリで、名前はExamplePluginとします。そしてOKを押します。


4 立ち上がったら、右側のソリューションエクスプローラーのPropertiesをダブルクリックすると、左のような画面が出ますから、対象のフレームワークを4.6.1にしてください。


5、次にnuget(javaで言うmaven)でminetを追加します。ツール->Nugetパッケージ(ry->ソリューションの(ry


6 参照タブを押して、minetと検索して、minetを選んで、インストールボタンを押してください。すべての質問に対して、肯定的な選択肢を選んでください。



7、終わったら、class1.csを開いて、図のように埋めてください。

[Plugin(PluginName = "ExamplePlugin", Description = "", PluginVersion = "1.0", Author = "haniokasai")]



使うクラスをインポートする必要がありますから、電球ボタンを押して、using Minetなんとかを選んでください。


8,class1の横に 

: Plugin 

と書いてください。

やはり、この時も電球ボタンを押して、using Minetなんとかを選択。


9,コードを書いていきます。 public class 云々の下のところにprotectedと書いてみてください。

次に、スペースを入力し、oと打つと予測候補でoverrideがありますから、それを選択。

また、スペースを押して、o通すとOnEnable()が現れます、それをクリックしてください。PMMPやNukkit開発者にはわかりますよね?起動時に読み込まれるところです。

するとこんな感じになります。


10,さらに、baseの下に、

Console.Write("Loaded");

と書いてみましょう(Loaderdじゃなくても、お好きに)


すると、こんな感じにコードがなります。

using MiNET.Plugins;
using MiNET.Plugins.Attributes;
using System;
namespace ExamplePlugin
{
[Plugin(PluginName = "ExamplePlugin", Description = "", PluginVersion = "1.0", Author = "haniokasai")]
public class Class1 : Plugin
{
protected override void OnEnable()
{
base.OnEnable();
Console.Write("Loaded");
}
}
}

11,これをビルドするには、ビルド->(1回目の時は)ソリューションのビルド、(2回目は)ソリューショのリビルドを選ぶとプラグイン(DLL)が生成されます。保存場所は下のログに書いてあります。




minetに読み込ませると、このように表示されます。


めでたしめでたし。
Minetで巨大なサーバーを開きたい。。。。




参考文献

http://ogiwara.wpblog.jp/2016/11/24/developingplugin/

https://github.com/NiclasOlofsson/MiNET/blob/master/src/MiNET/TestPlugin/Pets/PetsPlugin.cs

2016年11月27日日曜日

[MCPE]Minetでプラグインを導入する on Win10

こんにちは。haniokasaiです。minetに手を付けていなかったので、つけようと思います。というのも、ある理由からlinuxでlobiクライアントを動かさないといけなくなり、c#からc++に翻訳する必要が発生したので、両方とも勉強したい、まずはc#からだということではじめました。

今回は、説明にこのプラグインを使います。ここから落としてください。
http://ogiwara.wpblog.jp/2016/11/24/howtoimportplugins/

まず、server.confを開きます。


そこで、

次に、

PluginDirectory=plugins;
を追記します。

プラグイン名.Enabled=false

と書くことにより、プラグインフォルダに入っている状態で、無効にすることもできます。

そのあと、pluginsフォルダをつくって、中にプラグイン(dll)を入れます。
そのプラグインの上で、右クリックをしてプロパティを開きます。


ウィンドウ下の、セキュリティのところのブロックの解除にチェックを入れないと、プラグインは読み込めないので、してください。(拾ってきたプラグインの時のみ)


そして、MiNET.Service.exeを実行すれば完了です。
参考: http://ogiwara.wpblog.jp/2016/11/24/howtoimportplugins/

2016年11月26日土曜日

libminecraftpe.soをAndroidで逆アセンブルする!

注意!出来上がったファイルは500MB近いです!合計で1GBは使います!あと、root化済みのmcpeが入ったandroidが必要です!

Windows版 http://blog.haniokasai.com/2016/11/libminecraftpesowindows.html


まず、これをgoogleplayからインストール
https://play.google.com/store/apps/details?id=com.aide.ui&hl=ja

次に、ndkをダウンロードします。
そのアプリを開いて、画面右上のボタンを押して、more...->Settings->Build&Run->Manage native code supportでダウンロードしてください。





ターミナルで

su

cd /data/data/com.aide.ui/files/ndksupport-*/android-ndk-aide/toolchains/arm-linux-androideabi-*/prebuilt/linux-arm/bin

ここで、

./*-objdump
と実行するとたくさん何か表示されます。



Androidのスマホの/data/data/com.mojang.minecraftpe/lib/にあるlibminecraftpe.soをbinフォルダ内に入れてしまいます。

そこで、

./arm-linux-androideabi-objdump -dRC libminecraftpe.so > dumpmcpe.txt

と実行してください。しばらく待ちます。

そうすると、dumpmcpe.txtに逆アセンブルした内容が書かれています。かなり大きいので注意。

cpuをそれなりに使いますので注意。

参考文献:https://www.youtube.com/watch?v=OEMIiI3B0vU


libminecraft.soを解析して、パケットとか、いろいろ調べる!

前回:

libminecraftpe.soをAndroidで逆アセンブルする!



これを使うと、どうやら、パケットやhex値がわかるそうです。

Windowsでやってみます。

まず、これを落とします。https://github.com/PEMapModder/DecMcpe

次にここから任意のbinを落とします。https://bintray.com/pocketmine/PocketMine/Windows-PHP-Binaries

それらを同じフォルダにならべ、そこと同じ階層のフォルダにinという名のフォルダをつくり、そのなかに前回作ったdumpmcpe.txtをmpe.asmと改名し入れます。

こんな感じです。


このフォルダにコマンドプロントで移動して、

ディレクトリ名/bin/php/php.exe _DecPacket.php

と実行すれば、パケットのことの書いてあるファイルが、out内に出力されるでしょう。

が、うまくいきませんでした。。。。

ほぼ空っぽのファイルができるだけです。

もうすこし、調べてみます....

追伸:2016/11/26

libminecraftpe.soをWindowsで逆アセンブルする!

よくわかりませんが、libminecraftpe.soをWindowsで逆アセンブルするやり方を書いておきます。

注意!出来上がったファイルは500MB近いです!合計で1GBは使います!あと、root化済みのmcpeが入ったandroidが必要です!

まず、ここから、あなたのosにあった、android ndkの開発環境を落とします。(今回はwindowsで説明します)
https://developer.android.com/ndk/downloads/index.html

これを解凍して、コマンドプロントにて、android-ndk-バージョン\android-ndk-バージョン\toolchains\arm-linux-androideabi-バージョン\prebuilt\OS名\bin
に移動してください(または環境変数を設定してもいいです。)

Androidのスマホの/data/data/com.mojang.minecraftpe/lib/にあるlibminecraftpe.soをbinフォルダ内に入れてしまいます。

そこで、

arm-linux-androideabi-objdump.exe -dRC libminecraftpe.so > dumpmcpe.txt

と実行してください。しばらく待ちます。

そうすると、dumpmcpe.txtに逆アセンブルした内容が書かれています。かなり大きいので、サクラエディタとかで開きましょう。

cpuをそれなりに使いますので注意。

参考文献:https://www.youtube.com/watch?v=OEMIiI3B0vU

2016年11月23日水曜日

SitPack買ってみた!使ってみた!

どうも。haniokasaiです。高1のわたしですけど、長い間勃つ立つのはつらいものがあります。


そこで、わたしが見たツイートはこれ。これはいいかもと思い、思わず、ツーハンを見てしまいました!

https://www.sitpack.dk/14-shop

11/11記念で買ったので、ケースと本体で、税込み60ドル。送料9ドル。高校生には高い!
まぁ、恋しちゃったんで買いましたけど。

アカウント作成、購入すると、割とすぐに(1日)で、発送されます。しかしなぜか、デンマークの輸送センターで4日ほどとまっていました。結局、1週間で、おうち(埼玉県)に来ました。

不在伝票を見ると、国際便 デンマークって書いてあったw

夜、家に到着してまず、invoiceを取り出しました。

そしたら。。。。
なんと!納品書が4枚も入っていました!
絶対に、そこまでいらないと思うけどw同じのだしw


(ケース)


やわらかい?


感じて!

本体
こんな風に余裕をもって座れるのでしょうか。







展開してみた



座ってみる。
首からかける。




どーん!

乗るのムズイ。
安定しているけど、、、乗り方違う。


これはグリップ、摩擦度係数が高い。

使ってみたら、割と安定していました。見た目が細いので、精神的不安要素が多いのですが。よっぽど日常と比べれば、安定している!と思えば、座れます。ただ、説明書に、片っぽの棒に体重をかけるなと書いてあったので、注意。

ディズニーの待ち時間とかよさそう。あと、遅延の時とか。

実際に使ったら、レポート待たしますのでよろしくお願いします!

質問は、コメント欄で受け付けます!




2016年11月16日水曜日

githubから組織のすべてのプライベートリポジトリをgit cloneする方法

githubのプライベートリポジトリをブルーレイにバックアップしようと思ったので、調べてみた。

username=*****
password=******
 ORGANIZATION=ダウンロードしたい組織名
for i in `curl -u $username -s https://api.github.com/orgs/$ORGANIZATION/repos?per_page=200 |grep html_url|awk 'NR%2 == 0'|cut -d ':'  -f 2-3|tr -d '",'`; do
expect -c "
set timeout 20
spawn git clone $i.git
expect \"Username for \'https://github.com\':\"
send \"$username\n\"
expect \"Password for \'https://$username@github.com\':\"
send \"$password\n\"
interact
";
done



ちなみにユーザーの公開リポジトリは

 ORGANIZATION=*******
for i in `curl   -s https://api.github.com/users/$ORGANIZATION/repos?per_page=200 |grep html_url|awk 'NR%2 == 0'|cut -d ':'  -f 2-3|tr -d '",'`; do
git clone $i.git;
done

でできます

参考
https://gist.github.com/caniszczyk/3856584
http://futurismo.biz/archives/1357

nginxでライブストリーミング!nginx-rtmp-module

生配信サーバーを構築してみたかったのですが、nginxのエクステンションでできることがわかって構築しました。 サーバーは これ で構築できました。 macbook air obs-(wifi 100mbps)>ubuntuサーバー-(wifi)>macb...