【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.322270)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by amata1219 » 2018年11月28日(水) 17:22

yotasaki さんが書きました:天候が晴れていて、時間がお昼のときにとある処理をしたいのですが、ワールドから天候を取得するメソッドが探してもないため、getPlayerWeatherメソッドを使用し、
コード: 全て選択
if(Player.getPlayerWeather() == WeatherType.CLEAR);

にしてもPlayerWeatherはnull値で返されているようでうまく条件として成り立ちません。
また、昼という条件を作るために
コード: 全て選択
if(23750 >= Player.getWorld().getTime && Player.getWorld().getTime >= 18000);

としましたが、なぜだか無条件で次の処理へ行っているようです。
どうすれば正常な処理を行えるでしょうか・・・


yotasakiさん、こんにちは。

ワールドの天候を調べたい場合は、World#hasStorm()とWorld#isThundering()を使います。
コード: 全て選択
World world = Bukkit.getWorld("world");

if(world.hasStorm()){
//晴れではない
if(world.isThundering()){
//雷雨
}else{
//雨
}
}else{
//晴れ
}


ちなみにPlayer#getPlayerWeather()はプレイヤーに表示されている天候を取得します。
Player#setPlayerWeather(WeatherType)でプレイヤーに表示されている天候変更できます。
変更されていればゲッターはWeatherTypeの定数を、そうでなければnullを返します。

ワールドの相対的な時間を取得するのはWorld#getTime()であっています。
ですので実際に条件文の手前で時間を出力するなどして確認してみて下さい。
最後に編集したユーザー amata1219 [ 2018年11月29日(木) 01:16 ], 累計 1 回
アバター
amata1219
ID:a300d3c4
石掘り
 
記事: 88
登録日時: 2016年11月18日(金) 16:46
お住まい: Enabling World

  • (PostNo.322272)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by チェリーブロッサム » 2018年11月28日(水) 19:19

yotasaki さんが書きました:
チェリーブロッサム さんが書きました:こんにちは。
アイテムのエンチャント内容を隠したいのですが。APIでNBTと調べても項目に出ません。エンチャント内容が隠れても、光ったままにしたいです。
コード: 全て選択
            ItemStack item = new ItemStack(Material.DIAMOND_SWORD);
            ItemMeta mata = item.getItemMeta();
            mata.setDisplayName("謎の剣");
            List<String> lore = new ArrayList<String>();
            lore.add("§d§l謎の力があるようだ。。。。");
            mata.setLore(lore);
            item.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL,1);  //  エンチャント追加
            //  ここにエンチャント内容を消すプログラムを書く

バージョン. 1.12.2
開発環境 Intellij
もう一つ質問ですが、染料を指定したいのですが  ItemStack item = new ItemStack(Material.DYE); とすると赤字になります。解決方法はありますか?

わかる方お願いします。


エンチャントを隠す処理はItemMetaのItemFlagを使用します。
コード: 全て選択
<ItemMeta>.addItemFlags(ItemFlag.HIDE_ENCHANTS);

また、染料を指定する場合、Material.CYAN_DYEやMaterial.GARY_DEYなどといったように色も指定する必要があるみたいです。


回答ありがとうございます。早速試してみます!
チェリーブロッサム
ID:04803fb2
水から上がったとこ
 
記事: 5
登録日時: 2018年11月10日(土) 18:10

  • (PostNo.322276)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by yotasaki » 2018年11月28日(水) 20:41

amata1219 さんが書きました:
yotasaki さんが書きました:天候が晴れていて、時間がお昼のときにとある処理をしたいのですが、ワールドから天候を取得するメソッドが探してもないため、getPlayerWeatherメソッドを使用し、
コード: 全て選択
if(Player.getPlayerWeather() == WeatherType.CLEAR);

にしてもPlayerWeatherはnull値で返されているようでうまく条件として成り立ちません。
また、昼という条件を作るために
コード: 全て選択
if(23750 >= Player.getWorld().getTime && Player.getWorld().getTime >= 18000);

としましたが、なぜだか無条件で次の処理へ行っているようです。
どうすれば正常な処理を行えるでしょうか・・・


yotasakiさん、こんにちは。

ワールドの天候を調べたい場合は、World#hasStorm()とWorld#isThundering()を使います。
コード: 全て選択
World world = Bukkit.getWorld("world");

if(world.hasStorm()){
//晴れではない
if(world.isThundering()){
//雷雨
}else{
//雨
}
}else{
//晴れ
}


ちなみにPlayer#getPlayerWeather()はプレイヤーに表示されている天候を取得します。
Pkayer#setPlayerWeather(WeatherType)でプレイヤーに表示されている天候変更できます。
変更されていればゲッターはWeatherTypeの定数を、そうでなければnullを返します。

ワールドの相対的な時間を取得するのはWorld#getTime()であっています。
ですので実際に条件文の手前で時間を出力するなどして確認してみて下さい。


amata1219さんどうもありがとうございます。なるほど、hasStrom()やisThundering()というものを使うのですね、盲点でした。調べが甘かったようです。
時間の取得方法はあっているようですので、確認しながら試してみようと思います。
(;゚Д゚)ミツカッタ!
yotasaki
ID:65ac8b88
水から上がったとこ
 
記事: 7
登録日時: 2013年12月09日(月) 21:54
お住まい: 豆腐小屋の中

  • (PostNo.322329)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by ゲスト » 2018年12月01日(土) 02:07

plugin.yml内に書いてないコマンドをプログラム内で実装することはできますか?
ゲスト
ID:cdf59e8b
 

  • (PostNo.322357)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by チェリーブロッサム » 2018年12月02日(日) 10:49

こんにちは
この前質問させていただいた者です

addItemFlags(ItemFlag.HIDE_ENCHANTS);
これだとエンチャントのキラキラがなくなるので、内容だけ隠すことはできますか。

不可能なら別の方法でキラキラをつけることはできますか?

わかるかた教えてください
チェリーブロッサム
ID:04803fb2
水から上がったとこ
 
記事: 5
登録日時: 2018年11月10日(土) 18:10

  • (PostNo.322358)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by ゲスト » 2018年12月02日(日) 11:01

少々路線が違うのですが、DiscordAPIで連携してオンライン人数表示等しようと思ってて、メッセージやチャンネルをIDから取得するとき、そのメッセージやチャンネルが存在するかを取得できる方法をご存じの方いらっしゃいませんか?
ゲスト
ID:61d79b98
 

  • (PostNo.322364)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by spuash918 » 2018年12月02日(日) 16:19

ゲスト さんが書きました:少々路線が違うのですが、DiscordAPIで連携してオンライン人数表示等しようと思ってて、メッセージやチャンネルをIDから取得するとき、そのメッセージやチャンネルが存在するかを取得できる方法をご存じの方いらっしゃいませんか?

マイクラ全く関係ないですよね
discord api java」で調べるなり「Teratail」で質問するなりしてください
プログラム無しでアイテムやブロックを追加できるMOD公開中です!
無機能ブロックから剣、斧に加えツールマテリアルにも対応!
詳しくはMOD配布ページまで!
Twitterやってます。→https://twitter.com/pokora_youtube
よろしければYoutubeもお願いします。
spuash918
ID:a74e6760
鉄鉱掘り
 
記事: 318
登録日時: 2014年11月03日(月) 11:17
お住まい: 東海のどこか

  • (PostNo.322379)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by yotasaki » 2018年12月03日(月) 00:08

スケジューラーについての質問です。
BukkitRunnableのTimerTaskをキャンセルしたあとに処理を行おうと思って、
以下は例として上げますが、
コード: 全て選択
   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
      if (label.equalsIgnoreCase("start")) {
         new BukkitRunnable() {
            int timer = 600;
            @Override
            public void run() {
               if (0 >= timer) {
                  this.cancel();
               }
               timer = timer - 1;
            }
         }.runTaskTimer(this, 0, 20);
         sender.sendMessage("タイマー終了");

のようにしたのですが、どうもタスクが行われてる最中に次の処理が行われているみたいです。
どうすればTaskTimerが終わった後処理ができるのでしょうか・・・ 
(;゚Д゚)ミツカッタ!
yotasaki
ID:65ac8b88
水から上がったとこ
 
記事: 7
登録日時: 2013年12月09日(月) 21:54
お住まい: 豆腐小屋の中

  • (PostNo.322385)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by amata1219 » 2018年12月03日(月) 17:59

チェリーブロッサム さんが書きました:こんにちは
この前質問させていただいた者です

addItemFlags(ItemFlag.HIDE_ENCHANTS);
これだとエンチャントのキラキラがなくなるので、内容だけ隠すことはできますか。

不可能なら別の方法でキラキラをつけることはできますか?

わかるかた教えてください


チェリーブロッサムさん、こんにちは。

クライアントサイドに無いエンチャントが読み込まれるとエンチャントオーラだけ付与される仕様を利用する事で実現出来ます。
org.bukkit.enchantments.Enchantmentを継承したクラス(ここではCustomEnchant.class)を用意して下さい。
CustomEnchant.class
コード: 全て選択
public class CustomEnchant extends Enchantment {

     public CustomEnchant(int id){
         super(id);
     }

     @Override
     public boolean canEnchantItem(ItemStack arg0){
         return false;
     }

     @Override
     public boolean conflictsWith(Enchantment arg0){
         return false;
     }

     @Override
     public EnchantmentTarget getItemTarget(){
         return null;
     }

     @Override
     public int getMaxLevel(){
         return 0;
     }

     @Override
     public String getName(){
         return null;
     }

     @Override
     public int getStartLevel() {
         return 0;
     }
}


後は通常通りアイテムにエンチャントを追加するだけになります。
コード: 全て選択
ItemStack item = new ItemStack(Material.GRASS);
ItemMeta meta = item.getItemMeta();
CustomEnchant customEnchant = new CustomEnchant(1000);
//バニラのエンチャントと被らないIDを入力します。
meta.addEnchant(customEnchant, 1, true);
item.setItemMeta(meta);


yotasaki さんが書きました:スケジューラーについての質問です。
BukkitRunnableのTimerTaskをキャンセルしたあとに処理を行おうと思って、
以下は例として上げますが、
コード: 全て選択
   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
      if (label.equalsIgnoreCase("start")) {
         new BukkitRunnable() {
            int timer = 600;
            @Override
            public void run() {
               if (0 >= timer) {
                  this.cancel();
               }
               timer = timer - 1;
            }
         }.runTaskTimer(this, 0, 20);
         sender.sendMessage("タイマー終了");

のようにしたのですが、どうもタスクが行われてる最中に次の処理が行われているみたいです。
どうすればTaskTimerが終わった後処理ができるのでしょうか・・・ 


yotasakiさん、こんにちは。
そのコードですとループ処理を始めた直後にタイマー終了と表示されてしまいます。
cancel()したタイミングでメッセージを送信して下さい。
コード: 全て選択
   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
      if (label.equalsIgnoreCase("start")) {
         new BukkitRunnable() {
            int timer = 600;
            @Override
            public void run() {
               if (0 >= timer) {
                  this.cancel();
                  sender.sendMessage("タイマー終了");
                  //ここに記述する
               }
               timer = timer - 1;
            }
         }.runTaskTimer(this, 0, 20);
         //sender.sendMessage("タイマー終了"); ここではなく
アバター
amata1219
ID:e7461654
石掘り
 
記事: 88
登録日時: 2016年11月18日(金) 16:46
お住まい: Enabling World

  • (PostNo.322389)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by チェリーブロッサム » 2018年12月03日(月) 19:23

amata1219 さんが書きました:
チェリーブロッサム さんが書きました:こんにちは
この前質問させていただいた者です

addItemFlags(ItemFlag.HIDE_ENCHANTS);
これだとエンチャントのキラキラがなくなるので、内容だけ隠すことはできますか。

不可能なら別の方法でキラキラをつけることはできますか?

わかるかた教えてください


チェリーブロッサムさん、こんにちは。

クライアントサイドに無いエンチャントが読み込まれるとエンチャントオーラだけ付与される仕様を利用する事で実現出来ます。
org.bukkit.enchantments.Enchantmentを継承したクラス(ここではCustomEnchant.class)を用意して下さい。
CustomEnchant.class
コード: 全て選択
public class CustomEnchant extends Enchantment {

     public CustomEnchant(int id){
         super(id);
     }

     @Override
     public boolean canEnchantItem(ItemStack arg0){
         return false;
     }

     @Override
     public boolean conflictsWith(Enchantment arg0){
         return false;
     }

     @Override
     public EnchantmentTarget getItemTarget(){
         return null;
     }

     @Override
     public int getMaxLevel(){
         return 0;
     }

     @Override
     public String getName(){
         return null;
     }

     @Override
     public int getStartLevel() {
         return 0;
     }
}


後は通常通りアイテムにエンチャントを追加するだけになります。
コード: 全て選択
ItemStack item = new ItemStack(Material.GRASS);
ItemMeta meta = item.getItemMeta();
CustomEnchant customEnchant = new CustomEnchant(1000);
//バニラのエンチャントと被らないIDを入力します。
meta.addEnchant(customEnchant, 1, true);
item.setItemMeta(meta);



何度もすみません。

クラスの用意の仕方教えてもらってもいいですか。(public class CustomEnchant extends Enchantment のところに赤線がついてしまいます。)

メインクラスに書き加えることとかありますか?

教えていただくとありがたいです
チェリーブロッサム
ID:04803fb2
水から上がったとこ
 
記事: 5
登録日時: 2018年11月10日(土) 18:10

  • (PostNo.322392)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by amata1219 » 2018年12月03日(月) 20:21

チェリーブロッサム さんが書きました:
amata1219 さんが書きました:
チェリーブロッサム さんが書きました:こんにちは
この前質問させていただいた者です

addItemFlags(ItemFlag.HIDE_ENCHANTS);
これだとエンチャントのキラキラがなくなるので、内容だけ隠すことはできますか。

不可能なら別の方法でキラキラをつけることはできますか?

わかるかた教えてください


チェリーブロッサムさん、こんにちは。

クライアントサイドに無いエンチャントが読み込まれるとエンチャントオーラだけ付与される仕様を利用する事で実現出来ます。
org.bukkit.enchantments.Enchantmentを継承したクラス(ここではCustomEnchant.class)を用意して下さい。
CustomEnchant.class
コード: 全て選択
public class CustomEnchant extends Enchantment {

     public CustomEnchant(int id){
         super(id);
     }

     @Override
     public boolean canEnchantItem(ItemStack arg0){
         return false;
     }

     @Override
     public boolean conflictsWith(Enchantment arg0){
         return false;
     }

     @Override
     public EnchantmentTarget getItemTarget(){
         return null;
     }

     @Override
     public int getMaxLevel(){
         return 0;
     }

     @Override
     public String getName(){
         return null;
     }

     @Override
     public int getStartLevel() {
         return 0;
     }
}


後は通常通りアイテムにエンチャントを追加するだけになります。
コード: 全て選択
ItemStack item = new ItemStack(Material.GRASS);
ItemMeta meta = item.getItemMeta();
CustomEnchant customEnchant = new CustomEnchant(1000);
//バニラのエンチャントと被らないIDを入力します。
meta.addEnchant(customEnchant, 1, true);
item.setItemMeta(meta);



何度もすみません。

クラスの用意の仕方教えてもらってもいいですか。(public class CustomEnchant extends Enchantment のところに赤線がついてしまいます。)

メインクラスに書き加えることとかありますか?

教えていただくとありがたいです


エンチャントの登録処理を書き忘れておりました、すみません…。

メインクラスのonEnable()でエンチャントの登録をする必要があります。
Enchantment#registerEnchantment(Enchantment)で登録出来ますが、通常のままでは新しいエンチャントの登録が許可されていないため、Enchantment#acceptingNewをtrueに変更します。
コード: 全て選択
@Override
public void onEnable(){
        try{
            Field field = Enchantment.class.getDeclaredField("acceptingNew");
            field.setAccessible(true);
            field.set(null, true);
        }catch(Exception e){
            e.printStackTrace();
        }

        try{
            CustomEnchant customEnchant = new CustomEnchant(1000);
            Enchantment.registerEnchantment(customEnchant);
        }catch(IllegalArgumentException e){
            //何もしない
        }catch(Exception e){
            e.printStackTrace();
        }
}


破線が引かれてしまう原因は何かしら別の問題があると思います。
一応CustomEnchant.classのimport部を載せておきます。
コード: 全て選択
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.inventory.ItemStack;
アバター
amata1219
ID:e7461654
石掘り
 
記事: 88
登録日時: 2016年11月18日(金) 16:46
お住まい: Enabling World

  • (PostNo.322421)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by チェリーブロッサム » 2018年12月04日(火) 18:33

amata1219 さんが書きました:
チェリーブロッサム さんが書きました:
amata1219 さんが書きました:
チェリーブロッサム さんが書きました:こんにちは
この前質問させていただいた者です

addItemFlags(ItemFlag.HIDE_ENCHANTS);
これだとエンチャントのキラキラがなくなるので、内容だけ隠すことはできますか。

不可能なら別の方法でキラキラをつけることはできますか?

わかるかた教えてください


チェリーブロッサムさん、こんにちは。

クライアントサイドに無いエンチャントが読み込まれるとエンチャントオーラだけ付与される仕様を利用する事で実現出来ます。
org.bukkit.enchantments.Enchantmentを継承したクラス(ここではCustomEnchant.class)を用意して下さい。
CustomEnchant.class
コード: 全て選択
public class CustomEnchant extends Enchantment {

     public CustomEnchant(int id){
         super(id);
     }

     @Override
     public boolean canEnchantItem(ItemStack arg0){
         return false;
     }

     @Override
     public boolean conflictsWith(Enchantment arg0){
         return false;
     }

     @Override
     public EnchantmentTarget getItemTarget(){
         return null;
     }

     @Override
     public int getMaxLevel(){
         return 0;
     }

     @Override
     public String getName(){
         return null;
     }

     @Override
     public int getStartLevel() {
         return 0;
     }
}


後は通常通りアイテムにエンチャントを追加するだけになります。
コード: 全て選択
ItemStack item = new ItemStack(Material.GRASS);
ItemMeta meta = item.getItemMeta();
CustomEnchant customEnchant = new CustomEnchant(1000);
//バニラのエンチャントと被らないIDを入力します。
meta.addEnchant(customEnchant, 1, true);
item.setItemMeta(meta);



何度もすみません。

クラスの用意の仕方教えてもらってもいいですか。(public class CustomEnchant extends Enchantment のところに赤線がついてしまいます。)

メインクラスに書き加えることとかありますか?

教えていただくとありがたいです


エンチャントの登録処理を書き忘れておりました、すみません…。

メインクラスのonEnable()でエンチャントの登録をする必要があります。
Enchantment#registerEnchantment(Enchantment)で登録出来ますが、通常のままでは新しいエンチャントの登録が許可されていないため、Enchantment#acceptingNewをtrueに変更します。
コード: 全て選択
@Override
public void onEnable(){
        try{
            Field field = Enchantment.class.getDeclaredField("acceptingNew");
            field.setAccessible(true);
            field.set(null, true);
        }catch(Exception e){
            e.printStackTrace();
        }

        try{
            CustomEnchant customEnchant = new CustomEnchant(1000);
            Enchantment.registerEnchantment(customEnchant);
        }catch(IllegalArgumentException e){
            //何もしない
        }catch(Exception e){
            e.printStackTrace();
        }
}


破線が引かれてしまう原因は何かしら別の問題があると思います。
一応CustomEnchant.classのimport部を載せておきます。
コード: 全て選択
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.inventory.ItemStack;


成功しました。手厚いサポートありがとうございました!
チェリーブロッサム
ID:04803fb2
水から上がったとこ
 
記事: 5
登録日時: 2018年11月10日(土) 18:10

  • (PostNo.322440)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by takumi_ » 2018年12月05日(水) 17:55

HPの最大値(エフェクト等であげても画面が見づらくなるから)が決まっていて、それでは長いPVPが不可能だと思い、仮想のHP?みたいなのを作ろうとして、
コード: 全て選択
   @EventHandler
   public void join(PlayerJoinEvent e)
   {
      Player pl = e.getPlayer();
      FileConfiguration config = getConfig();
      String Name = config.getString(pl.getName()+".Name");
      String Custom = config.getString(pl.getName()+".CustomName");
      saveDefaultConfig();
      pl.setDisplayName("< "+Custom+" >");
      pl.setPlayerListName(Custom);
      pl.setCustomName(Custom);
      e.setJoinMessage(Name+"§bさんがサーバーに入ってきました。");
   }

   @EventHandler
   public void login(PlayerLoginEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      Player pl = e.getPlayer();
      String Name = config.getString(pl.getName()+".Name");
      if(Name == pl.getName()) {
         //何もしない
      } else {
         config.set(pl.getName()+".Name", pl.getName());
         config.set(pl.getName()+".MIN_HP", 30);
         saveConfig();
         reloadConfig();
      }
   }

   @EventHandler
   public void HP(EntityDamageEvent e)  {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      Entity entity = e.getEntity();
      if(entity instanceof Player)
      {
         Player pl = (Player) entity;
         config.set(pl.getPlayer().getName()+".MIN_HP", config.getInt(pl.getPlayer().getName()+".MIN_HP")-e.getDamage());
         e.isCancelled();
         pl.getWorld().playSound(pl.getLocation(),Sound.ENTITY_PLAYER_ATTACK_NODAMAGE,1,1);
      }
   }

   //configを扱うためクラス分割不可
   @SuppressWarnings("deprecation")
   @EventHandler
   public void move(PlayerMoveEvent e) {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      ScoreboardManager manager = Bukkit.getScoreboardManager();
      Scoreboard board = manager.getMainScoreboard();
      Objective MAX_HP = board.registerNewObjective("MAX_HP", "dummy");
      Objective MIN_HP = board.registerNewObjective("MIN_HP", "dummy");
      MIN_HP.setDisplaySlot(DisplaySlot.SIDEBAR);
      MIN_HP.setDisplayName(" / 30");
      Player pl = e.getPlayer();
      MIN_HP.getScore(pl).setScore(config.getInt(pl.getName()+".MIN_HP"));
      pl.sendMessage((String) config.get(pl.getName()+".MIN_HP"));
      if(MIN_HP.getScore(pl).getScore() <= 0)
      {
         pl.damage(100);
      }
   }

   @EventHandler
   public void damage(EntityDamageByEntityEvent e) {e.isCancelled();}
ほかのpluginの内容が少し入っていますがお許しください。

仕組みとしてはログインしたらHPを30(test中のため低め)に設定し、ダメージを受けたらconfigの中にあるHPを減らし、それをmoveeventでスコアボードに反映しようとしたのですが、何故かうまく動作しませんでした。
一応、configの中身を見たら、MIN_HPは30となっており、ダメージを食らっても反映されず、スコアボードにも反映されず...
直すための助言をお願いします。
あとコマンドをopのみしか使えないようにする場合はどうしたらいいですか?
takumi_
ID:ad6fdda5
水から上がったとこ
 
記事: 6
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322449)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by ヤドカリ » 2018年12月05日(水) 20:49

takumi_ さんが書きました:HPの最大値(エフェクト等であげても画面が見づらくなるから)が決まっていて、それでは長いPVPが不可能だと思い、仮想のHP?みたいなのを作ろうとして、
コード: 全て選択
   @EventHandler
   public void join(PlayerJoinEvent e)
   {
      Player pl = e.getPlayer();
      FileConfiguration config = getConfig();
      String Name = config.getString(pl.getName()+".Name");
      String Custom = config.getString(pl.getName()+".CustomName");
      saveDefaultConfig();
      pl.setDisplayName("< "+Custom+" >");
      pl.setPlayerListName(Custom);
      pl.setCustomName(Custom);
      e.setJoinMessage(Name+"§bさんがサーバーに入ってきました。");
   }

   @EventHandler
   public void login(PlayerLoginEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      Player pl = e.getPlayer();
      String Name = config.getString(pl.getName()+".Name");
      if(Name == pl.getName()) {
         //何もしない
      } else {
         config.set(pl.getName()+".Name", pl.getName());
         config.set(pl.getName()+".MIN_HP", 30);
         saveConfig();
         reloadConfig();
      }
   }

   @EventHandler
   public void HP(EntityDamageEvent e)  {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      Entity entity = e.getEntity();
      if(entity instanceof Player)
      {
         Player pl = (Player) entity;
         config.set(pl.getPlayer().getName()+".MIN_HP", config.getInt(pl.getPlayer().getName()+".MIN_HP")-e.getDamage());
         e.isCancelled();
         pl.getWorld().playSound(pl.getLocation(),Sound.ENTITY_PLAYER_ATTACK_NODAMAGE,1,1);
      }
   }

   //configを扱うためクラス分割不可
   @SuppressWarnings("deprecation")
   @EventHandler
   public void move(PlayerMoveEvent e) {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      ScoreboardManager manager = Bukkit.getScoreboardManager();
      Scoreboard board = manager.getMainScoreboard();
      Objective MAX_HP = board.registerNewObjective("MAX_HP", "dummy");
      Objective MIN_HP = board.registerNewObjective("MIN_HP", "dummy");
      MIN_HP.setDisplaySlot(DisplaySlot.SIDEBAR);
      MIN_HP.setDisplayName(" / 30");
      Player pl = e.getPlayer();
      MIN_HP.getScore(pl).setScore(config.getInt(pl.getName()+".MIN_HP"));
      pl.sendMessage((String) config.get(pl.getName()+".MIN_HP"));
      if(MIN_HP.getScore(pl).getScore() <= 0)
      {
         pl.damage(100);
      }
   }

   @EventHandler
   public void damage(EntityDamageByEntityEvent e) {e.isCancelled();}
ほかのpluginの内容が少し入っていますがお許しください。

仕組みとしてはログインしたらHPを30(test中のため低め)に設定し、ダメージを受けたらconfigの中にあるHPを減らし、それをmoveeventでスコアボードに反映しようとしたのですが、何故かうまく動作しませんでした。
一応、configの中身を見たら、MIN_HPは30となっており、ダメージを食らっても反映されず、スコアボードにも反映されず...
直すための助言をお願いします。
あとコマンドをopのみしか使えないようにする場合はどうしたらいいですか?

HPメソッドでsaveConfigしてないからだと思われます
あとスコアボードの反映ですが、MoveEventでやるよりもHPメソッドで更新した方が負荷も少なくていい気がします・・・
何か意味があるのであればすみません

op専用にするにはdescriptionやusageと同じ階層にpermissionを追加し、そこに任意のパーミッションを書きます
コード: 全て選択
commands:
  test:
    description: テスト
    usage: test
    permission: "test.op"

permissions:
  test.op:
    description: テスト
    default: op

test.opは好きな名前で大丈夫です
ヤドカリ
ID:1663acf1
木を殴ってる
 
記事: 22
登録日時: 2016年2月11日(木) 13:54

  • (PostNo.322460)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by yotasaki » 2018年12月06日(木) 08:29

amata1219 さんが書きました:
yotasaki さんが書きました:スケジューラーについての質問です。
BukkitRunnableのTimerTaskをキャンセルしたあとに処理を行おうと思って、
以下は例として上げますが、
コード: 全て選択
   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
      if (label.equalsIgnoreCase("start")) {
         new BukkitRunnable() {
            int timer = 600;
            @Override
            public void run() {
               if (0 >= timer) {
                  this.cancel();
               }
               timer = timer - 1;
            }
         }.runTaskTimer(this, 0, 20);
         sender.sendMessage("タイマー終了");

のようにしたのですが、どうもタスクが行われてる最中に次の処理が行われているみたいです。
どうすればTaskTimerが終わった後処理ができるのでしょうか・・・ 


yotasakiさん、こんにちは。
そのコードですとループ処理を始めた直後にタイマー終了と表示されてしまいます。
cancel()したタイミングでメッセージを送信して下さい。
コード: 全て選択
   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
      if (label.equalsIgnoreCase("start")) {
         new BukkitRunnable() {
            int timer = 600;
            @Override
            public void run() {
               if (0 >= timer) {
                  this.cancel();
                  sender.sendMessage("タイマー終了");
                  //ここに記述する
               }
               timer = timer - 1;
            }
         }.runTaskTimer(this, 0, 20);
         //sender.sendMessage("タイマー終了"); ここではなく

amata1219さんどうもありがとうございます。cancel()した後、runTaskTimer();の下へ移るものだと思っておりました。
そして、記述どおりにしたところ想像通りの処理が行えました。
(;゚Д゚)ミツカッタ!
yotasaki
ID:65ac8b88
水から上がったとこ
 
記事: 7
登録日時: 2013年12月09日(月) 21:54
お住まい: 豆腐小屋の中

  • (PostNo.322465)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by natsuri.net » 2018年12月06日(木) 14:15

2つ質問させていただきます。

1つ目は、中身が書かれた本を開かせるPacketをプレイヤーに送りたいのですが、どうすればいいのでしょうか。
プレイヤーにアイテムは持たせたくないです。
バージョンは1.13.2です

2つ目は、1.13.2でブロックのHitBoxを取得したいのですが、1.10や1.8などの時と取得方法が変わっていて同じコードでは取得できませんでした。
コード: 全て選択
BlockPosition pos = new BlockPosition(x, y, z);
AxisAlignedBB box = new AxisAlignedBB(pos);

このコードでエラーは出ないのですが、worldを指定していないですし、hitboxは取得できませんでした。
natsuri.net
ID:6cbd0d29
水から上がったとこ
 
記事: 3
登録日時: 2018年9月10日(月) 07:43

  • (PostNo.322468)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by takumi_ » 2018年12月06日(木) 18:11

前回までの内容
ヤドカリ さんが書きました:
takumi_ さんが書きました:HPの最大値(エフェクト等であげても画面が見づらくなるから)が決まっていて、それでは長いPVPが不可能だと思い、仮想のHP?みたいなのを作ろうとして、
コード: 全て選択
   @EventHandler
   public void join(PlayerJoinEvent e)
   {
      Player pl = e.getPlayer();
      FileConfiguration config = getConfig();
      String Name = config.getString(pl.getName()+".Name");
      String Custom = config.getString(pl.getName()+".CustomName");
      saveDefaultConfig();
      pl.setDisplayName("< "+Custom+" >");
      pl.setPlayerListName(Custom);
      pl.setCustomName(Custom);
      e.setJoinMessage(Name+"§bさんがサーバーに入ってきました。");
   }

   @EventHandler
   public void login(PlayerLoginEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      Player pl = e.getPlayer();
      String Name = config.getString(pl.getName()+".Name");
      if(Name == pl.getName()) {
         //何もしない
      } else {
         config.set(pl.getName()+".Name", pl.getName());
         config.set(pl.getName()+".MIN_HP", 30);
         saveConfig();
         reloadConfig();
      }
   }

   @EventHandler
   public void HP(EntityDamageEvent e)  {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      Entity entity = e.getEntity();
      if(entity instanceof Player)
      {
         Player pl = (Player) entity;
         config.set(pl.getPlayer().getName()+".MIN_HP", config.getInt(pl.getPlayer().getName()+".MIN_HP")-e.getDamage());
         e.isCancelled();
         pl.getWorld().playSound(pl.getLocation(),Sound.ENTITY_PLAYER_ATTACK_NODAMAGE,1,1);
      }
   }

   //configを扱うためクラス分割不可
   @SuppressWarnings("deprecation")
   @EventHandler
   public void move(PlayerMoveEvent e) {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      ScoreboardManager manager = Bukkit.getScoreboardManager();
      Scoreboard board = manager.getMainScoreboard();
      Objective MAX_HP = board.registerNewObjective("MAX_HP", "dummy");
      Objective MIN_HP = board.registerNewObjective("MIN_HP", "dummy");
      MIN_HP.setDisplaySlot(DisplaySlot.SIDEBAR);
      MIN_HP.setDisplayName(" / 30");
      Player pl = e.getPlayer();
      MIN_HP.getScore(pl).setScore(config.getInt(pl.getName()+".MIN_HP"));
      pl.sendMessage((String) config.get(pl.getName()+".MIN_HP"));
      if(MIN_HP.getScore(pl).getScore() <= 0)
      {
         pl.damage(100);
      }
   }

   @EventHandler
   public void damage(EntityDamageByEntityEvent e) {e.isCancelled();}
ほかのpluginの内容が少し入っていますがお許しください。

仕組みとしてはログインしたらHPを30(test中のため低め)に設定し、ダメージを受けたらconfigの中にあるHPを減らし、それをmoveeventでスコアボードに反映しようとしたのですが、何故かうまく動作しませんでした。
一応、configの中身を見たら、MIN_HPは30となっており、ダメージを食らっても反映されず、スコアボードにも反映されず...
直すための助言をお願いします。
あとコマンドをopのみしか使えないようにする場合はどうしたらいいですか?

HPメソッドでsaveConfigしてないからだと思われます
あとスコアボードの反映ですが、MoveEventでやるよりもHPメソッドで更新した方が負荷も少なくていい気がします・・・
何か意味があるのであればすみません

op専用にするにはdescriptionやusageと同じ階層にpermissionを追加し、そこに任意のパーミッションを書きます
コード: 全て選択
commands:
  test:
    description: テスト
    usage: test
    permission: "test.op"

permissions:
  test.op:
    description: テスト
    default: op

test.opは好きな名前で大丈夫です

ありがとうございます。確かにmoveはいらないでしたね...
そこは解決したのはいいのですけれど、opだけというものが解決できていません。
一応plugin.ymlの中身はこうなっていますが...(必要な部分のみ)
コード: 全て選択
commands:
   name_edit:
      description:
      usage:
   name_edit_op:
      description:
      usage:
      permission: op.op
   name_menu:
      description:
      usage:
permissions:
   op.op:
      description:
      default: op

何か間違いとかありますか?
あと、使ってみてわかったのですが、これでは自動で回復する機能がないなと思い、
コード: 全て選択
new BukkitRunnable()
      {
         @Override
         public void run()
         {
            int t = 1;
            if(player instanceof Player)
            {
               Player pl = (Player) player;
               if(t == 0) {
                  this.cancel();
               } else {
                  config.set(pl.getName()+".MIN_HP", config.getInt(pl.getName()+".MIN_HP")+2);
                  saveConfig();
                  reloadConfig();
                  if(config.getInt(pl.getName()+".MIN_HP") <= config.getInt(pl.getName()+".MAN_HP"))
                  {
                     config.set(pl.getName()+".MIN_HP",  config.getInt(pl.getName()+".MAN_HP"));
                     saveConfig();
                     reloadConfig();
                  }
               }
            }
            t++;
         }
      }.runTaskTimer(this,0 ,20);

とやり、永久的に止まらないようにしたのですが、回復できず...ここで思ったのが、
コード: 全て選択
Player player = (Player) Bukkit.getOnlinePlayers();

これでしかプレイヤーは取得できないと思ったのですが、これではオンラインのプレイヤー全員が取得されるのではないかという考えたどり着いたのですがやはりこれ以外は僕がわかる限りの範囲ではできませんでした。どうすれば回復できるのでしょうか。
takumi_
ID:ad6fdda5
水から上がったとこ
 
記事: 6
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322472)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by natsuri.net » 2018年12月06日(木) 19:58

takumi_ さんが書きました:
コード: 全て選択
Player player = (Player) Bukkit.getOnlinePlayers();

これでしかプレイヤーは取得できないと思ったのですが、これではオンラインのプレイヤー全員が取得されるのではないかという考えたどり着いたのですがやはりこれ以外は僕がわかる限りの範囲ではできませんでした。どうすれば回復できるのでしょうか。


『Bukkit.getOnlinePlayers();』で取得できるのは『Player』ではなく『List<Player>』なので
List<Player> players = Bukkit.getOnlinePlayers();
になります。
ちなみに
コード: 全て選択
for(Player p:Bukkit.getOnlinePlayers()) {
    p.sendMessage("alert");
}

でプレイヤー全員にチャットを送れます
natsuri.net
ID:6cbd0d29
水から上がったとこ
 
記事: 3
登録日時: 2018年9月10日(月) 07:43

  • (PostNo.322508)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by takumi_ » 2018年12月08日(土) 16:31

natsuri.net さんが書きました:
takumi_ さんが書きました:
コード: 全て選択
Player player = (Player) Bukkit.getOnlinePlayers();

これでしかプレイヤーは取得できないと思ったのですが、これではオンラインのプレイヤー全員が取得されるのではないかという考えたどり着いたのですがやはりこれ以外は僕がわかる限りの範囲ではできませんでした。どうすれば回復できるのでしょうか。


『Bukkit.getOnlinePlayers();』で取得できるのは『Player』ではなく『List<Player>』なので
List<Player> players = Bukkit.getOnlinePlayers();
になります。
ちなみに
コード: 全て選択
for(Player p:Bukkit.getOnlinePlayers()) {
    p.sendMessage("alert");
}

でプレイヤー全員にチャットを送れます

回答ありがとうございます。検討してみた結果無事実行されたのですが、きっと余分なものが書かれていたから結構重かったので使えませんでした。
コード: 全て選択
for(Player p:Bukkit.getOnlinePlayers()) {
    p.sendMessage("alert");
}

これは使えると思い使わさせて貰っています。



takumi_ さんが書きました:
前回までの内容
ヤドカリ さんが書きました:
takumi_ さんが書きました:HPの最大値(エフェクト等であげても画面が見づらくなるから)が決まっていて、それでは長いPVPが不可能だと思い、仮想のHP?みたいなのを作ろうとして、
コード: 全て選択
   @EventHandler
   public void join(PlayerJoinEvent e)
   {
      Player pl = e.getPlayer();
      FileConfiguration config = getConfig();
      String Name = config.getString(pl.getName()+".Name");
      String Custom = config.getString(pl.getName()+".CustomName");
      saveDefaultConfig();
      pl.setDisplayName("< "+Custom+" >");
      pl.setPlayerListName(Custom);
      pl.setCustomName(Custom);
      e.setJoinMessage(Name+"§bさんがサーバーに入ってきました。");
   }

   @EventHandler
   public void login(PlayerLoginEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      Player pl = e.getPlayer();
      String Name = config.getString(pl.getName()+".Name");
      if(Name == pl.getName()) {
         //何もしない
      } else {
         config.set(pl.getName()+".Name", pl.getName());
         config.set(pl.getName()+".MIN_HP", 30);
         saveConfig();
         reloadConfig();
      }
   }

   @EventHandler
   public void HP(EntityDamageEvent e)  {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      Entity entity = e.getEntity();
      if(entity instanceof Player)
      {
         Player pl = (Player) entity;
         config.set(pl.getPlayer().getName()+".MIN_HP", config.getInt(pl.getPlayer().getName()+".MIN_HP")-e.getDamage());
         e.isCancelled();
         pl.getWorld().playSound(pl.getLocation(),Sound.ENTITY_PLAYER_ATTACK_NODAMAGE,1,1);
      }
   }

   //configを扱うためクラス分割不可
   @SuppressWarnings("deprecation")
   @EventHandler
   public void move(PlayerMoveEvent e) {
      saveDefaultConfig();
      FileConfiguration config = getConfig();
      ScoreboardManager manager = Bukkit.getScoreboardManager();
      Scoreboard board = manager.getMainScoreboard();
      Objective MAX_HP = board.registerNewObjective("MAX_HP", "dummy");
      Objective MIN_HP = board.registerNewObjective("MIN_HP", "dummy");
      MIN_HP.setDisplaySlot(DisplaySlot.SIDEBAR);
      MIN_HP.setDisplayName(" / 30");
      Player pl = e.getPlayer();
      MIN_HP.getScore(pl).setScore(config.getInt(pl.getName()+".MIN_HP"));
      pl.sendMessage((String) config.get(pl.getName()+".MIN_HP"));
      if(MIN_HP.getScore(pl).getScore() <= 0)
      {
         pl.damage(100);
      }
   }

   @EventHandler
   public void damage(EntityDamageByEntityEvent e) {e.isCancelled();}
ほかのpluginの内容が少し入っていますがお許しください。

仕組みとしてはログインしたらHPを30(test中のため低め)に設定し、ダメージを受けたらconfigの中にあるHPを減らし、それをmoveeventでスコアボードに反映しようとしたのですが、何故かうまく動作しませんでした。
一応、configの中身を見たら、MIN_HPは30となっており、ダメージを食らっても反映されず、スコアボードにも反映されず...
直すための助言をお願いします。
あとコマンドをopのみしか使えないようにする場合はどうしたらいいですか?

HPメソッドでsaveConfigしてないからだと思われます
あとスコアボードの反映ですが、MoveEventでやるよりもHPメソッドで更新した方が負荷も少なくていい気がします・・・
何か意味があるのであればすみません

op専用にするにはdescriptionやusageと同じ階層にpermissionを追加し、そこに任意のパーミッションを書きます
コード: 全て選択
commands:
  test:
    description: テスト
    usage: test
    permission: "test.op"

permissions:
  test.op:
    description: テスト
    default: op

test.opは好きな名前で大丈夫です

ありがとうございます。確かにmoveはいらないでしたね...
そこは解決したのはいいのですけれど、opだけというものが解決できていません。
一応plugin.ymlの中身はこうなっていますが...(必要な部分のみ)
コード: 全て選択
commands:
   name_edit:
      description:
      usage:
   name_edit_op:
      description:
      usage:
      permission: op.op
   name_menu:
      description:
      usage:
permissions:
   op.op:
      description:
      default: op

何か間違いとかありますか?
あと、使ってみてわかったのですが、これでは自動で回復する機能がないなと思い、
コード: 全て選択
new BukkitRunnable()
      {
         @Override
         public void run()
         {
            int t = 1;
            if(player instanceof Player)
            {
               Player pl = (Player) player;
               if(t == 0) {
                  this.cancel();
               } else {
                  config.set(pl.getName()+".MIN_HP", config.getInt(pl.getName()+".MIN_HP")+2);
                  saveConfig();
                  reloadConfig();
                  if(config.getInt(pl.getName()+".MIN_HP") <= config.getInt(pl.getName()+".MAN_HP"))
                  {
                     config.set(pl.getName()+".MIN_HP",  config.getInt(pl.getName()+".MAN_HP"));
                     saveConfig();
                     reloadConfig();
                  }
               }
            }
            t++;
         }
      }.runTaskTimer(this,0 ,20);

とやり、永久的に止まらないようにしたのですが、回復できず...ここで思ったのが、
コード: 全て選択
Player player = (Player) Bukkit.getOnlinePlayers();

これでしかプレイヤーは取得できないと思ったのですが、これではオンラインのプレイヤー全員が取得されるのではないかという考えたどり着いたのですがやはりこれ以外は僕がわかる限りの範囲ではできませんでした。どうすれば回復できるのでしょうか。


教えてもらったのにできないというのはおかしいと思ったので一回ほかのplugin抜いて試したら出来ました。ありがとうございます。ちなみにその原因はpermissonExでした。

回答してくださった皆様ありがとうございました。
takumi_
ID:ad6fdda5
水から上がったとこ
 
記事: 6
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322529)

Re: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

投稿記事by signal » 2018年12月09日(日) 13:26

保存できるインベントリを作りたいと思い、
コード: 全て選択
FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.1"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.2"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.3"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.4"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }

こうやって保存をして、読み取りもこれを取り出してという感じで検討してみたのですが、for文を何個も用いていることから落ちてしましました。
そこで調べてみるとBukkitObjectOutputStreamと本体にあるBase64Coderでシリアライズするというようなことがあったのでこれを使い、保存する方法を教えてください。
https://qiita.com/rushuu_r/items/677bf24db821838a7569
signal
ID:ad6fdda5
木を殴ってる
 
記事: 19
登録日時: 2018年9月25日(火) 20:48

1つ前へ

Return to 質問:開発・制作関連

x