2016年3月19日土曜日

Nukkit プラグインサンプルコード紹介

プラグインサンプルコード 

もしも正しく動作しない場合はコメント欄でお知らせください。
ご意見・ご要望などがありましたら、コメント枠にてコメントしていただけると幸いです。

プレイヤー関連 

以下のimport文が必要です。
import cn.nukkit.Player;

Playerオブジェクトの取得

プレイヤー名から取得
Player player = this.getServer().getPlayer("プレイヤー名");
Playerイベントから取得(PlayerJoinEventなど)
(注) eventにはeventオブジェクトが入っている状態です。
Player player = event.getPlayer();
Entityイベントから取得(EntitySpawnEventなど)
(注) eventにはeventオブジェクトが入っている状態です。
Player player = event.getEntity();
Entityオブジェクトから取得して、getNameなどをする場合は必ずPlayerオブジェクトか確認しないとクラッシュします。
if (player instanceof Player){
 //プレイヤーだった場合の処理
}
コマンド処理から取得
コマンド処理の場合、すでにsenderに送信したプレイヤーのデータが入っています。
ただし、コンソールなどから実行した場合もありますので、必ずプレイヤーオブジェクトか確認してください。

送った人がプレイヤーか確認する


if (sender instanceof Player){
 // プレイヤーだった場合
}else{
 // プレイヤーオブジェクトではない場合
}

送った人がコンソールか確認する

以下のimport文が必要です
import cn.nukkit.command.ConsoleCommandSender;
if (sender instanceof ConsoleCommandSender){
 // コンソールだった場合
}else{
 // コンソールではない場合
}

プレーヤーオブジェクトかの確認

if (player instanceof Player) {//プレイヤーオブジェクトかの条件分岐
    //プレイヤー
}else{
    //プレイヤーではない
}

プレイヤーにメッセージを送る

チャット上(Message)
player.sendMessage("メッセージ");
アイテムスロットの上(Popup)
player.sendPopup("メッセージ");
Popupの上(Tip)
player.sendTip("メッセージ");

プレイヤー全員にメッセージを送る

チャット上(Message)
this.getServer().broadcastMessage("メッセージ");
アイテムスロットの上(Popup)
this.getServer().broadcastPopup("メッセージ");
Popupの上(Tip)
this.getServer().broadcastTip("メッセージ");

プレイヤーをBANする

player.getServer().getNameBans().addBan(player, "理由", null, "BANした人の名前"); //名前BAN
player.getServer().getIPBans().addBan(IPアドレス, "理由", null, "BANした人の名前");//IPBAN
player.getServer().getNameBans().remove(player);//名前BAN解除
player.getServer().getIPBans().remove(player);//IPBAN解除

プレイヤーをKICKする

player.kick("理由", true);//trueをfalseにすることで"Kicked by admin."と表示されなくなります
player.close("", "理由");//kickの使用を推奨します。(1番目の引数をplayer.getLeaveMessage()にすることで、プレイヤーの退出がブロードキャストされます)

プレイヤーの情報を取得する

player.getName();//ユーザー名
player.getAddress();//ipアドレス
player.loginData["clientId"];//クライアントID
player.getGamemode();//ゲームモード 0=サバイバル, 1=クリエイティブ, 2,アドベンチャー,3 スペクテイター
player.getLevel();//プレイヤーのいるワールド(レベル)のオブジェクト
player.getX();//X座標、getXのXを変更すればY、Z座標も取得可能
player.x;//getX()と使い方は同じですがこっちの方が軽いです
player.getDirection();//方向 0=南,1=西,2=北,3=東
player.getHealth();//プレイヤーの現在の体力
player.getMaxHealth();//プレイヤーの最大体力
player.getDisplayName();//チャットをした時に表示される名前を取得
player.getNameTag();//プレイヤーの上に表示される名前を取得

プレイヤーの情報を変更する

player.setGamemode(0);//ゲームモード 0=サバイバル, 1=クリエイティブ, 2,アドベンチャー,3 スペクテイター
player.setHealth(10);//プレイヤーの体力を変更
player.setMaxHealth(30);//最大体力を変更
player.kill();//プレイヤーを殺す
player.attack(1, event);//1番目の引数にダメージ数を、2番目にEntityDamageEventが必要です(EntityDamageEventについては省略)
player.setOnFire(10);//プレイヤーを燃やす(秒数)
player.setOp(true);//権限を付与する(引数をfalseにすることで剥奪できます)
player.setWhitelisted(true);//プレイヤーをホワイトリストに追加(引数をfalseにすることで削除できます)
player.setAllowFlight(true);//クリエイティブモードのような飛行できるように(引数をfalseでクリエイティブでも飛べなくなります)
player.setAutoJump(true);//オートジャンプができるように(引数をfalseでオートジャンプができなくなる)
player.setNameTag("名前");//プレイヤーの上に表示される名前を変更
player.setDisplayName("名前");//チャットをした時に表示される名前を変更
player.save();//プレイヤー情報をセーブ

プレイヤーにダメージを与える

以下のコードが必要です。
import cn.nukkit.event.entity.EntityDamageEvent;
EntityDamageEvent ev =  new EntityDamageEvent(entity, EntityDamageEvent.CAUSE_MAGIC, 1);//EntityDamageEvent.CAUSE_MAGICを変えることでダメージの種類を、1を変えることでダメージの強さが変更できます
entity.attack(ev);

プレイヤーがドロップするアイテムを変更

以下のコードが必要です。
import cn.nukkit.event.entity.EntityDeathEvent;
import cn.nukkit.item.Item;
//こちらの方も使えます
import cn.nukkit.event.player.PlayerDeathEvent;
プレイヤーが死んでドロップ(持っていた)したアイテムを取得
event.getDrops();
プレイヤーが死んでドロップするアイテムを指定
Item item = Item.get(アイテムID, メタデータ, 数);
event.setDrops(item);//指定アイテムをドロップ

プレイヤーの体力を回復

以下のコードが必要です。
import cn.nukkit.event.entity.EntityRegainHealthEvent;
EntityRegainHealthEvent ev = new EntityRegainHealthEvent(player, 回復量, EntityRegainHealthEvent.CAUSE_EATING);
player.heal(ev);

プレイヤーのインベントリを操作

以下のコードが必要です。
import cn.nukkit.item.Item;
Item item = Item.get(アイテムID, メタデータ, 数);
player.getInventory().addItem(item);//アイテムを追加
player.getInventory().removeItem(item);//アイテムを消去
player.getInventory().clearAll();//アイテムをすべて消去(装備されている防具も消されます)
if(player.getInventory().contains(item)){//特定のアイテムが指定した数以上あるか
    //ある
}else{
    //ない
}
if(player.getInventory().canAddItem(item)){//アイテムを追加できるかどうか
    //できる
}else{
    //できない
}

プレイヤーに革装備をセット

以下のコードが必要です。
import cn.nukkit.item.Item;
player.getInventory().setArmorItem(0,Item.get(298,0,1));//ヘルメット
player.getInventory().setArmorItem(1,Item.get(299,0,1));//チェストプレート
player.getInventory().setArmorItem(2,Item.get(300,0,1));//レギンス
player.getInventory().setArmorItem(3,Item.get(301,0,1));//ブーツ
player.getInventory().sendArmorContents(player);//防具の変更を反映

プレイヤーのリスポーン地点を変更する

以下のコードが必要です。
import cn.nukkit.math.Vector3;
vector = new Vector3(x座標, y座標, z座標);//座標を指定
player.setSpawn(vector);//スポーンをセット

プレイヤー全員に特定の処理をする

以下のコードが必要です。
import cn.nukkit.Server;
players = Server.getInstance().getOnlinePlayers();
foreach (players as player) {
    //処理
}

プレーヤーをテレポートさせる

以下のコードが必要です。
import cn.nukkit.math.Vector3;
vector = new Vector3(x座標, y座標, z座標);//座標を指定
player.teleport(vector);
ワールド(Level)を指定したい場合は座標指定にPositionクラスを指定して下さい
import cn.nukkit.level.Position;
pos = new Position(x座標, y座標, z座標, Levelオブジェクト);//座標を指定
player.teleport(pos);

プレイヤーにエフェクトを付与、除去する

EffectIdや効果などはステータス効果に載っています。
※一部対応していないエフェクトがありますので、ご注意下さい。
以下のコードが必要です。
import cn.nukkit.entity.Effect;
エフェクトを付与する
effect = Effect.getEffect(1);//effectID
effect.setDuration(30*20);//効果の時間*20
effect.setAmplifier(0)//効果の強さ
effect.setVisible(true);//パーティクルを表示するかどうか
player.addEffect(effect);
1行で書く場合
player.addEffect(Effect.getEffect(1).setDuration(30*20).setAmplifier(0).setVisible(true));
※EffectIDの指定はEffectクラスのオブジェクト定数で指定することを推奨します。(今後EffectIDが変わる可能性があるため)
例:
Effect.SPEED
エフェクトを除去する
player.removeEffect(1);//指定したEffectIDのエフェクトを除去
player.removeAllEffects();//すべてのエフェクトを除去
エフェクトが付与されているか
if(player.hasEffect(1)){
 //付与されている場合
}else{
 //されていない場合
}

プレイヤーを動かす

以下のコードが必要です。
import cn.nukkit.math.Vector3;
ジャンプさせる
MotionJ = new Vector3(0,0,0);
jump = 0.8;//高さ
MotionJ.y = jump;
player.setMotion(MotionJ);//ジャンプ
前に動かす
MotionA = new Vector3(0,0,0);
dir=player.getDirection();//向いている方向
move = 3;//動かしたいブロック数
if(dir === 0){MotionA.x=move;}//南
if(dir === 1){MotionA.z=move;}//西
if(dir === 2){MotionA.x=-move;}//北
if(dir === 3){MotionA.z=-move;}//東
player.setMotion(MotionA);//動かす

Level(World)関連 

以下のコードが必要です。
import cn.nukkit.level.Level;
import cn.nukkit.block.Block;
import cn.nukkit.math.Vector3;
※level変数に必ずLevelオブジェクトを入れておいてください

Levelオブジェクトの取得

デフォルトで使用されているワールドのレベルオブジェクト取得
level = this.getServer().getDefaultLevel();//Levelオブジェクトの取得
Playerオブジェクトから取得
level = player.getLevel();//Levelオブジェクトの取得
ワールド名から取得
以下のコードが必要です。
import cn.nukkit.import cn.nukkit.Server;
if(Server.getInstance().isLevelLoaded("ワールド名")){//レベルオブジェクトかを条件分岐
    level = Server.getInstance().getLevelByName("ワールド名");//Levelオブジェクトの取得
}

Levelの読み込み

this.getServer().loadLevel("ワールド名");

Levelのアンロード

this.getServer().unloadLevel(level);
※ワールド名ではなくレベルオブジェクトを渡してください。
以前書かれていた情報ではmust be an instance of cn.nukkit.level.Level, string givenになってしまいます。

Levelの保存

level.save();

ワールドの生成

Server.getInstance().generateLevel("ワールド名");

ブロックの情報を取得する

x = block.getX();//X座標
y = block.getY();//Y座標
z = block.getZ();//Z座標

//getX()と同じですがこっちの方が軽いです
x = block.x;//X座標
y = block.y;//Y座標
z = block.z;//Z座標

指定した座標のブロックの情報を取得する

block = level.getBlock(vector); //Blockオブジェクトの取得
block.getID(); //ブロックID
block.getDamage(); //メタ値
block.getName(); //ブロック名

ブロックを設置する

破壊したい際はブロックidを0にして空気ブロックと置き換えてください
block = Block.get(ブロックid,メタ値);//Blockオブジェクトの生成
vector = new Vector3(x座標, y座標, z座標);
level.setBlock(vector, block);

アイテムドロップ

以下のコードが必要です。
import cn.nukkit.item.Item;
item = Item.get(アイテムid, メタデータ, 数);//itemオブジェクトの生成
vector = new Vector3(x座標, y座標, z座標);//座標を指定
level.dropItem(vector,item);//アイテムをドロップする

指定した地点を爆破する

以下のコードが必要です。
import cn.nukkit.level.Explosion;
import cn.nukkit.level.Position;
explosion = new Explosion(new Position(x座標, y座標, z座標, level), 3); //Explosionオブジェクトの生成
explosion.explode();

看板の文字を取得する

以下のコードが必要です。
import cn.nukkit.tile.Sign;
pos = new Vector3(X座標, Y座標, Z座標);//座標をセット
sign = level.getTile(pos);//Tileオブジェクト取得
if(sign instanceof Sign){//Signオブジェクトかの判定
    text = sign.getText();//テキストを取得
}

看板に文字をセットする

以下のコードが必要です。
import cn.nukkit.tile.Sign;
pos = new Vector3(X座標, Y座標, Z座標);//座標をセット
sign = level.getTile(pos);//Tileオブジェクトを取得
if(sign instanceof Sign){//Signオブジェクトかの判定
 sign.setText("Text1", "Text2", "Text3", "Text4");//文字をセット
 sign.saveNBT();//データ(NBT)を保存
}

チェストのインベントリを操作する

以下のコードが必要です。
import cn.nukkit.tile.Tile;
import cn.nukkit.tile.Chest as TileChest;
pos = new Vector3(X座標, Y座標, Z座標);//座標をセット
chest = level.getTile(pos);//Tileオブジェクトを取得
if(chest instanceof TileChest){//TileChestオブジェクトかの判定

 chest.getInventory().getItem(1);//特定のスロットのアイテムを取得
        //itemにはitemオブジェクトを入れておいてください
        chest.getInventory().setItem(1, item);//特定のスロットにアイテムを入れる
        chest.getInventory().getContents();//すべてのアイテムを取得
        //itemにはitemオブジェクトを配列に入れたものを入れてください
        chest.getInventory().setContents(item);//アイテムを上書き
 chest.saveNBT();//データ(NBT)を保存
}

特定の座標にサウンド(効果音)を再生する


以下のコードが必要です。
import cn.nukkit.level.sound.(サウンド名)Sound;
pos = new Vector3(X座標, Y座標, Z座標);//再生する座標
sound = new <サウンド名>Sound(pos);//サウンドオブジェクトの生成
level.addSound(sound);//サウンドを再生

特定の座標にパーティクルを表示する


以下のコードが必要です。
import cn.nukkit.level.particle.(パーティクル名)Particle;
pos = new Vector3(X座標, Y座標, Z座標);//座標
//パーティクルオブジェクトの生成//※一部パーティクルで必要な引数が違う場合があります。クラスなどを参考にして合わせて下さい。
particle = new <パーティクル名>Particle(pos);
count = 20;//回数
for(i = 0;i < count; ++i){
    level.addParticle(particle);
}
特定の座標周辺にパーティクルを表示
以下のコードが必要です。
import cn.nukkit.utils.Random;
particle = new <パーティクル名>Particle(new Vector3(X座標, Y座標, Z座標));
xd = 3 * 100;//調整
yd = 3 * 100;
zd = 3 * 100;
random = new Random((int) (microtime(true) * 1000) + mt_rand());
count = 25;//回数
for(i = 0; i < count; ++i){
 particle.setComponents(
  particle.x + random.nextSignedFloat() * xd,
  particle.y + random.nextSignedFloat() * yd,
  particle.z + random.nextSignedFloat() * zd
 );
 level.addParticle(particle);
}

Command関連 

以下のコードが必要です。
import cn.nukkit.command.Command;
import cn.nukkit.command.CommandSender;

コマンドを追加する

plugin.ymlファイルに以下のようなコードを追加して置いてください
また説明などを日本語にする場合は文字コードをUTF-8N(BOMなし)で保存してください
plugin.yml
commands:
  testcmd://コマンドこの場合 /testcmdになります
    description: "テスト用のコマンド"//コマンドの説明
    usage: "/testcmd"//使用方法

コマンドをOPのみ使えるようにする

こちらもplugin.ymlを使います
commands:
  testcmd://コマンド名
    description: "テスト用コマンド"//コマンドの説明
    usage: "/testcmd"//使用方法
    permission: "testcmd.command"//仮名前
permissions:
  testcmd.command://仮名前を入力
    default: op//testcmdをOPのみ使用できるように設定

コマンドの処理をする

コマンドを追加して置いてください
以下のコードを使用するとプレイヤーに [testcmd] テスト と言うメッセージが送信されます。
senderにはコマンドを実行したプレイヤーのオブジェクトが入っています。
public boolean onCommand(final CommandSender sender, Command command, String label, String[] args){
 switch(command.getName()){//コマンド名で条件分岐
  case "testcmd"://testcmdコマンドだったら以下の処理
   sender.sendMessage("[testcmd] テスト");//プレイヤーにメッセージを送信
   return true;//処理を終了
 }
 //条件に一致しなかった場合処理を終了する
 //plugin.ymlに記載した使用方法がプレイヤーにメッセージとして送信されます。
 return false;
}

パラメーターを使用する

args(配列)にはパラメーターが入っています。
args[0]にすることでtestの部分を取得できます。
またargs[1]にすると、293の部分も取得できます。
例 /give test 293
public boolean onCommand(final CommandSender sender, Command command, String label, String[] args){
 switch(command.getName()){//コマンド名で条件分岐
  case "testcmd"://testcmdコマンドだったら以下の処理
   //args[0]に値があるかの条件分岐ない場合はここで処理を中断します。
   try{if(args[0] != null){}}
    catch(ArrayIndexOutOfBoundsException e){
     System.out.println("args0がないです");
     return false;
    }//値がないのに呼び出すと例外になるため例外回避
   sender.sendMessage("[testcmd] パラメーター1:" . args[0] . "");//プレイヤーにメッセージを送信
   return true;//処理を終了
 }
 //条件に一致しなかった場合処理を終了する
 //plugin.ymlに記載した使用方法がプレイヤーにメッセージとして送信されます。
 return false;
}

エンチャント 

エンチャント一覧


エンチャントタイプ値(数値)内容
TYPE_INVALID-1
TYPE_ARMOR_PROTECTION0ダメージ軽減
TYPE_ARMOR_FIRE_PROTECTION1火炎耐性
TYPE_ARMOR_FALL_PROTECTION2落下耐性
TYPE_ARMOR_EXPLOSION_PROTECTION3爆発耐性
TYPE_ARMOR_PROJECTILE_PROTECTION4飛び道具耐性
TYPE_ARMOR_THORNS5棘の鎧
TYPE_WATER_BREATHING6水中呼吸
TYPE_WATER_SPEE7水中移動
TYPE_WATER_AFFINITY8水中採掘
TYPE_WEAPON_SHARPNESS9ダメージ増加
TYPE_WEAPON_SMITE10アンデット特効
TYPE_WEAPON_ARTHROPODS11虫特効
TYPE_WEAPON_KNOCKBACK12ノックバック強化
TYPE_WEAPON_FIRE_ASPECT13火属性
TYPE_WEAPON_LOOTING14ドロップ増加
TYPE_MINING_EFFICIENCY15効率強化
TYPE_MINING_SILK_TOUCH16シルクタッチ
TYPE_MINING_DURABILITY17耐久力
TYPE_MINING_FORTUNE18幸運
TYPE_BOW_POWER19射撃ダメージ増加
TYPE_BOW_KNOCKBACK20ノックバック強化(弓)
TYPE_BOW_FLAME21火の矢
TYPE_BOW_INFINITY22無限
TYPE_FISHING_FORTUNE23幸運(?)(宝釣り?)
TYPE_FISHING_LURE24入れ食い

サーバー 

サーバーを終了する

this.getServer().shutdown();

サーバーをリロードする

this.getServer().reload();

server.propertiesを取得する

this.getServer().getMotd();//サーバー名を取得
this.getServer().getServerName();//getMotd()と同じ
this.getServer().getPort();//サーバーのポートを取得
this.getServer().hasWhitelist();//ホワイトリストがオンかオフか
this.getServer().getSpawnRadius();//ブロック破壊範囲を取得
this.getServer().getMaxPlayers();//サーバーに入れる最大人数を取得
this.getServer().getAllowFlight();//フライトが許可されているか
this.getServer().getGamemode();//デフォルトのゲームモードを取得
this.getServer().getDefaultGamemode();//getGamemode()と同じ
this.getServer().getForceGamemode();//ログイン時にデフォルトゲームモードに設定がオンかオフか
this.getServer().isHardcore();//死んだらBANがオンかオフか
this.getServer().getDifficulty();//ゲーム難易度を取得
this.getServer().getLevelType();//ワールドのタイプを取得

ops.txtを変更する

ops.txtに名前を追加
this.getServer().addOp(name);
ops.txtから名前を消去
this.getServer().removeOp(name);

white-list.txtを変更する

white-list.txtに名前を追加
this.getServer().addWhitelist(name);
white-list.txtから名前を消去
this.getServer().removeWhitelist(name);
white-list.txtをリロードする
this.getServer().reloadWhitelist();

その他 

entityIdからentityオブジェクトを取得する(取得できなかった場合、nullが返されます)

恐らく使わないと思いますが、一応。
id = 0;//entityIdを入れておく
level = this.getServer().getDefaultLevel();//デフォルトのLevelオブジェクトの取得
entity = level.getEntity(id);//entityオブジェクト取得

整数に変換

X = player.getX(); //X座標を取得
Y = player.getY(); //Y座標を取得
Z = player.getZ(); //Z座標を取得
 /*X Y Z のままで表示すると小数点がすごい数になるので整数にします (intval関数で整数に変換)*/
X1 = intval(X);
Y2 = intval(Y);
Z3 = intval(Z); 

下に表示されるアイテム名の変更

//itemにはItemオブジェクトを入れておく
name = "string";//表示するアイテム名を入れる
item.setCustomName(name);

追加 

srcの一部から取得した情報です。
間違っていたら申し訳ありません。

ホワイトリスト関係

ホワイトリストに追加
this.getServer().addWhitelist(name);
ホワイトリストから削除
this.getServer().removeWhitelist(name);
ホワイトリストに入っているか
this.getServer().isWhitelisted(name);
ホワイトリストを有効にする
this.getServer().setConfigBool("white-list", true);
ホワイトリストを無効にする
this.getServer().setConfigBool("white-list", false);
ホワイトリストを再読込する
this.getServer().reloadWhitelist();

エンチャント

import cn.nukkit.item.enchantment.Enchanement
以上のimportが必要です。
エンチャントをつける
enchant = Enchantment.getEnchantment(エンチャントID);
enchant.setLevel(レベル);
item.addEnchantment(enchant);
例(ダイヤのブーツに水中移動Lv.2のエンチャントをつけて装備させる)
item = Item.get(313,0,1);
enchant = Enchantment.getEnchantment(7);
enchant.setLevel(2);
item.addEnchantment(enchant);
player.getInventory().sendArmorContents(player);

14 件のコメント:

  1. broadcastPopupが使えませんね…

    返信削除
  2. このコメントは投稿者によって削除されました。

    返信削除
  3. Nukkitを試してみましたがpmmp-serversに表示させる方法はありますか?
    やはりプラグインをrewriteしなければなりませんか?

    返信削除
    返信
    1. 別にpmmpserverを立てて、queryをとってきてます

      削除
  4. getMetadata()ではなく、getDamage()です。

    返信削除
  5. EconomyAPIを使用する際のサンプルコードを載せてほしいです

    返信削除
  6. このコメントは投稿者によって削除されました。

    返信削除
  7. 無知な私にConfig.yml等の生成例のコードを載せてくださると幸いです。

    返信削除
  8. プレイヤーが持っているアイテムを取得するコードを追加してください。

    返信削除
    返信
    1. player.getInventory().getItemInHand()

      削除

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

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