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

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

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

投稿記事by naori3595 » 2016年12月01日(木) 10:39

対応済
TUMIBUKURO さんが書きました:連続投稿すみません。質問様式が悪かったみたいなので投稿しなおしました

naori3595@運営チーム[運営宛のメッセージ(PM)を作成] 当フォーラムではマルチポストは禁止されています。
最初の投稿を削除するか、削除申請を出して下さい。一日反応がなかった場合、両方とも削除します
フォーラムに広がるビッグな愛!現れよNo.11!キュアビッグ・アイ!<●>
主にMODと建築物関連のフォーラムで活動しています!
ルールを守って、楽しくクラフト!
サイン欄についてのルール/ガイドライン
アバター
naori3595
ID:12cb69be
鉄鉱掘り
 
記事: 342
登録日時: 2015年1月10日(土) 20:53
お住まい: 無気力

  • (PostNo.289276)

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

投稿記事by Sea of trees » 2016年12月03日(土) 12:08

長いので隠します。
TUMIBUKURO さんが書きました:spigot-1.11にてモンスターを倒すと経験値が手に入りLVが上がるというプラグインを作成中なのですがサーバーを再起動してモンスターを倒すと経験値が初期化されてしまう状態ですこれをどうにかしたいのですが何がいけなかったのでしょうか?
作ったプラグイン
コード: 全て選択
 package keikentiplugin;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class KeikentiPlugin extends JavaPlugin implements Listener {
public int EXP;
public int LV;

//public static String playername = player.getName();
/**
* プラグインが開始するとき呼び出される
*/
public void onEnable(){
getCommand("dataload").setExecutor(this);
//デフォルトのコンフィグを出力
saveDefaultConfig();
// イベントリスナーを登録
getServer().getPluginManager().registerEvents( this, this);
}


/**
* プラグインが終了するとき呼び出される
*/
public void onDisable() {

}

@
EventHandler
public void killenemy
(EntityDeathEvent e){
Player player = e.getEntity().getKiller();
String playername = player.getName();
Entity ene = e.getEntity();
if(
ene.getType() == EntityType.SKELETON){
if(!(
player instanceof Player)) return ;
FileConfiguration conf=getConfig();
EXP+=100;
conf.set(playername, "現在の経験値"+EXP +"現在のLV"+ LV);
player.sendMessage(ChatColor.GREEN+"経験値を得ました");
this.saveConfig();
};

};

@
Override
public boolean onCommand
(CommandSender sender, Command cmd, String label, String[] args) {
Player player = (Player) sender;
String playername = player.getName();


if (cmd.getName().equalsIgnoreCase("dataload")) {
FileConfiguration conf=getConfig();
player.sendMessage(conf.getString(playername));
}


return true;

}

}
 

plugin.yml
コード: 全て選択
name: KeikentiPlugin
version
: 1.0.0
main
: keikentiplugin.KeikentiPlugin
commands
:
dataload:
description: This is a demo command.
usage: /<command>
default:
 true

最近プラグインの勉強を始めたばかりでいろんなところのプログラムをつなぎ合わせてて作りました問題の解決方法以外にもまだ改善の余地があると思うのですがそれについても教えていただけらたと思っています。よろしくお願いします 


ゲームのデフォルトにあるような経験値バーのことでしょうか?
再起動時にリセットされるなら、サーバー再起動前に(onDisable)でconfig.yml等にそのデータを書き出して、再起動後にプレイヤーの経験値を上書きすればいいと思います。
ただ、恒常性的には再起動時に依存のプレイヤーがいない可能性もあるので、onDisableだけでなく、プレイヤーのログアウト時にも同じ処理を書くなどして
いかなる状態(想定外な状況)でもしっかりと動く堅牢なプラグインを目指してください!
私もBukkitPlugin初心者レベルなので応援します!
なんか、最近多忙な気がするなぁ....
アバター
Sea of trees
ID:405b560a
木を殴ってる
 
記事: 34
登録日時: 2015年3月01日(日) 15:27
お住まい: 日本

  • (PostNo.289375)

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

投稿記事by TUMIBUKURO » 2016年12月04日(日) 12:23

Sea of trees さんが書きました:長いので隠します。[spoiler]

ゲームのデフォルトにあるような経験値バーのことでしょうか?
再起動時にリセットされるなら、サーバー再起動前に(onDisable)でconfig.yml等にそのデータを書き出して、再起動後にプレイヤーの経験値を上書きすればいいと思います。
ただ、恒常性的には再起動時に依存のプレイヤーがいない可能性もあるので、onDisableだけでなく、プレイヤーのログアウト時にも同じ処理を書くなどして
いかなる状態(想定外な状況)でもしっかりと動く堅牢なプラグインを目指してください!
私もBukkitPlugin初心者レベルなので応援します!

返答ありがとうございます。参考にさせていただきます。いろいろとごちゃごちゃしてきたので新しく書き直すことしました。
TUMIBUKURO
ID:3fc8fc48
水から上がったとこ
 
記事: 4
登録日時: 2016年11月30日(水) 22:42

  • (PostNo.289554)

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

投稿記事by ^q^ » 2016年12月05日(月) 20:56

EntityDeathEventを使い、プレイヤーがmobを殺した時にプレイヤーにこちらが設定した経験値を渡すというプラグインを作っていたのですが
event.getEntity().getKiller()ではプレイヤーが発動していてもプラグインによるダメージ(.damage(100)など)には対応できず
どうすればいいかわからず困っています、このダメージをプレイヤーと結びつける方法、
または別の方法はないのでしょうか

教えてくださいお願いします_・_
^q^
ID:f86fe74b
 

  • (PostNo.289556)

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

投稿記事by xNiwatorix » 2016年12月05日(月) 21:08

^q^ さんが書きました:EntityDeathEventを使い、プレイヤーがmobを殺した時にプレイヤーにこちらが設定した経験値を渡すというプラグインを作っていたのですが
event.getEntity().getKiller()ではプレイヤーが発動していてもプラグインによるダメージ(.damage(100)など)には対応できず
どうすればいいかわからず困っています、このダメージをプレイヤーと結びつける方法、
または別の方法はないのでしょうか

教えてくださいお願いします_・_

Damageable#damage(int amount,Entity source)の方を使ってダメージを与える処理をすればエンティティと結び付けられるはず...だと思います.
xNiwatorix
ID:246c9e8e
水から上がったとこ
 
記事: 10
登録日時: 2016年11月30日(水) 16:40

  • (PostNo.289837)

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

投稿記事by mozow470 » 2016年12月09日(金) 20:25

ゲスト さんが書きました:mozow470さん、返信ありがとうございます。

getScoreboard().getObjective(DisplaySlot.SIDEBAR).getScore("TEST_2").setScore(0);
↑を使ってみたのですが、TEST_1の下の段に新しくTEST_が表示されてしまいます...。

ScoreBoardのresetを行えば大丈夫だと思います。返信遅れました
コード: 全て選択
getScoreboard().resetScores("TEST_1");
getScoreboard().getObjective(DisplaySlot.SIDEBAR).getScore("TEST_2").setScore(0)
アバター
mozow470
ID:d7533983
木を殴ってる
 
記事: 13
登録日時: 2015年6月28日(日) 14:30
お住まい: JPN

  • (PostNo.290259)

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

投稿記事by ゲスト » 2016年12月14日(水) 19:12

稀にBlockBreakEventの switch (block.getType()) { の部分でクラスがないと言われるのですが、何かおかしい部分があるのでしょうか

//エラー
http://pastebin.com/6zmAPkFt

//MapListener.java
http://pastebin.com/VLT8WCuK
ゲスト
ID:612531e7
 

  • (PostNo.290424)

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

投稿記事by Hinyari_Gohan » 2016年12月16日(金) 20:23

ゲスト さんが書きました:稀にBlockBreakEventの switch (block.getType()) { の部分でクラスがないと言われるのですが、何かおかしい部分があるのでしょうか

//エラー
http://pastebin.com/6zmAPkFt

//MapListener.java
http://pastebin.com/VLT8WCuK


再コンパイルを試みてみてください。
Hinyari_Gohanで主に活動しております。
見かけた際はどうぞよろしく。
アバター
Hinyari_Gohan
ID:9aad37c5
石掘り
 
記事: 96
登録日時: 2014年4月19日(土) 09:00
お住まい: 愛知県

  • (PostNo.290628)

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

投稿記事by ゲスト » 2016年12月18日(日) 19:22

返信遅くなって申し訳ありません。
再コンパイルすれば問題なく動きました。
ありがとうございます
ゲスト
ID:612531e7
 

  • (PostNo.290954)

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

投稿記事by koucha2525 » 2016年12月22日(木) 18:23

すみません失礼します

PlayerBucketEventの中のメッセージリスナーってありますか?
画像画像
koucha2525
ID:44f649d6
木を殴ってる
 
記事: 12
登録日時: 2016年10月16日(日) 09:33

  • (PostNo.291000)

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

投稿記事by リオン » 2016年12月23日(金) 01:21

リスナー とは、マウスを動かしたなどのイベント監視し、イベント発生時に対応するアクションを実行するオブジェクトです。
PlayerBucketEventの中にメッセージリスナーはないです。

PlayerBucketEventを呼び出したプレイヤーにメッセージを送りたいというのであれば、
コード: 全て選択
getPlayer.sendMessage()

を使えばできます。
アバター
リオン
ID:67545616
木を殴ってる
 
記事: 24
登録日時: 2013年5月13日(月) 11:58

  • (PostNo.291031)

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

投稿記事by ゲスト » 2016年12月23日(金) 12:49

>PlayerBucketEventの中のメッセージリスナーってありますか?
サブクラスのことなら

PlayerBucketEmptyEvent
PlayerBucketFillEvent

自分なら「中の」よりは「下の」と聞くね。中はインナークラスだ。
どっちも平易ないい方で不正確だからどうせなら「サブクラスはありますか?」かな。

参考
http://www.jias.jp/blog/?85
ゲスト
ID:95d92a31
 

  • (PostNo.291152)

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

投稿記事by koucha2525 » 2016年12月24日(土) 13:49

ありです
画像画像
koucha2525
ID:44f649d6
木を殴ってる
 
記事: 12
登録日時: 2016年10月16日(日) 09:33

  • (PostNo.291222)

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

投稿記事by うましゅー » 2016年12月25日(日) 01:08

spgot1.9.4にてプラグインを作成している者です。

現在1.9.4から追加した接触判定を消せない物かと思い、コードを書こうと思い、接触判定時に出るEventがあると思ってAPIを探してみましたが、見つからず、ここで質問をすることにしました。

バニラではscoreboardでこのような接触が防げると思ってもしやと思ったのですが…

回答をお願いします。
ニコニコ生放送にて生主をしています。
ついでにPluginも作ってます(新米)
アバター
うましゅー
ID:50149204
大工さん
 
記事: 49
登録日時: 2013年3月30日(土) 09:23

  • (PostNo.291230)

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

投稿記事by リオン » 2016年12月25日(日) 03:40

setCollidableというメソッドで変えられるみたいで試してみたのですが
Mobに設定したところMob同士の衝突判定はなくなったのですがPlayerとは衝突、
Playerに設定しても効果が見られませんでした。
上記問題について

自分が調べた範囲ではスコアボードで、「CollisionRule」を「Never」に設定したチームを作り、
ログイン時にプレイヤーをそのチームに参加させることで解決しているようです。
コード: 全て選択
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
import org.bukkit.scoreboard.Team;
import org.bukkit.scoreboard.Team.Option;
import org.bukkit.scoreboard.Team.OptionStatus;

public class NCMain extends JavaPlugin implements Listener {
   ScoreboardManager manager = Bukkit.getScoreboardManager();
   Scoreboard board = manager.getMainScoreboard();
   Team defaultTeam;

   @Override
   public void onEnable(){
      getLogger().info("NoCollisionを起動しています。");

      //リスナーの登録
      getServer().getPluginManager().registerEvents(this, this);

      //テスト用スコアボードの作成
      defaultTeam = board.getTeam("default");
      if (defaultTeam == null) {
         defaultTeam = board.registerNewTeam("default");
         defaultTeam.setOption(Option.COLLISION_RULE, OptionStatus.NEVER);
         //チームに所属していると、デフォルトで透明のエフェクトを使っている同チームが見えるので見えなくする
         defaultTeam.setCanSeeFriendlyInvisibles(false);
      }
   }

   @Override
   public void onDisable(){
      getLogger().info("NoCollisionを終了します。");
   }

   @EventHandler
   public void onJoin(PlayerJoinEvent event){
      Player player = event.getPlayer();
      Team team = board.getEntryTeam(player.getName());
      //既に別のチームに所属しているのであればそのままのチームに
      if (team != null)
         return;
      defaultTeam.addEntry(player.getName());
   }

   @EventHandler
   public void onLeave(PlayerQuitEvent event){
      Player player = event.getPlayer();
      Team team = board.getEntryTeam(player.getName());
      //defaultチームに所属しているのはそのまま、所属しているなら削除
      if (team != defaultTeam)
         return;
      defaultTeam.removeEntry(player.getName());
   }

   //Mobのスポーン時に当たり判定をなくすために同じくDefaultに入れる
   //Mobは死んだ時点でTeamから消えるため、チームからの離脱処理は不要
   @EventHandler
   public void onMobSpawn(CreatureSpawnEvent event){
      Team defa = board.getTeam("default");
      defa.addEntry(event.getEntity().getUniqueId().toString());
   }
}
アバター
リオン
ID:67545616
木を殴ってる
 
記事: 24
登録日時: 2013年5月13日(月) 11:58

  • (PostNo.291250)

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

投稿記事by ゲスト » 2016年12月25日(日) 13:55

石を破壊したとき、その石の周囲3ブロック以内に「TEST」というメタデータをもったプレイヤーがいた場合、「TEST_MESSAGE」と表示させるプラグインを作りたいのですが、思い通りに動いてくれません。
解決方法を教えてください。

@EventHandler
public void onBreak(BlockBreakEvent event)
{

Player p = event.getPlayer();
Block b = event.getBlock();

int r = 3;
Location l = b.getLocation().subtract(r, r, r);

if (b.getType() == Material.STONE) {
for(int x = l.getBlockX(); x < l.getBlockX() + r * 2; x++) {
for(int y = l.getBlockY(); y < l.getBlockY()+r * 2; y++) {
for(int z = l.getBlockZ(); z < l.getBlockZ()+r * 2; z++) {
for(Player players : Bukkit.getServer().getOnlinePlayers()) {
if (players.getMetadata("TEST") != null && players.getLocation() == new Location(l.getWorld(), x, y, z)) {
players.getPlayer().sendMessage("TEST_MESSAGE");
}
}
}
}
}
}
}
ゲスト
ID:9b12332a
 

  • (PostNo.291269)

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

投稿記事by King(qpwakaba) » 2016年12月25日(日) 15:57

ゲスト さんが書きました:石を破壊したとき、その石の周囲3ブロック以内に「TEST」というメタデータをもったプレイヤーがいた場合、「TEST_MESSAGE」と表示させるプラグインを作りたいのですが、思い通りに動いてくれません。
解決方法を教えてください。



コード: 全て選択
   if (players.getMetadata("TEST") != null && players.getLocation() == new Location(l.getWorld(), x, y, z)) {


ココですね。 オブジェクト同士の比較に == 演算子を使うと、同じ"内容"のオブジェクトかどうかではなく、
"全く同一のオブジェクトが指されているか" という比較になってしまうため、常にfalseとなります。

極端な例を載せておきます。

コード: 全て選択
System.out.println(new Integer(0) == new Integer(0));

=> false


これとは異なり、intやboolなどの プリミティブ型と呼ばれるものでは 値が等しいものか という動作になります。

コード: 全て選択
System.out.println(0 == 0);

=> true

このため、座標が等しいかどうかを判定したい場合は getBlockX() のような int同士で比較する必要があります。


もっとも、この場合は == で比較せずに、座標の差を取ってその距離(の2乗)が 3(の2乗)より小さい (以下) であるかを確かめれば一発ですが。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

投稿画面のBBコード挿入ボタン を追加するユーザースクリプト作りました。良かったらどうぞ。
https://greasyfork.org/ja/scripts/18657
最大描画距離を64チャンクまで伸ばすMod作ってます。
viewtopic.php?t=30697
アバター
King(qpwakaba)
ID:a77fe154
ダイヤモンド掘り
 
記事: 831
登録日時: 2013年3月26日(火) 10:25

  • (PostNo.291410)

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

投稿記事by ゲスト » 2016年12月26日(月) 18:51

King(qpwakaba)さん、返信ありがとうございます。
教えていただいた通りに

if (players.getMetadata("TEST") != null && players.getLocation() == new Location(l.getWorld(), x, y, z)) {


if (
(players.hasMetadata("TEST")) &&
(((x - players.getLocation().getBlockX()) * (x - players.getLocation().getBlockX()))) < r * r &&
(((y - players.getLocation().getBlockY()) * (y - players.getLocation().getBlockY()))) < r * r &&
(((z - players.getLocation().getBlockZ()) * (z - players.getLocation().getBlockZ()))) < r * r
)
{

に変えてみたのですが、プレイヤーの立っている位置によって範囲にばらつきがでてしまいます...。
ゲスト
ID:9b12332a
 

  • (PostNo.291462)

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

投稿記事by King(qpwakaba) » 2016年12月26日(月) 22:43

ゲスト さんが書きました:King(qpwakaba)さん、返信ありがとうございます。
教えていただいた通りに

if (players.getMetadata("TEST") != null && players.getLocation() == new Location(l.getWorld(), x, y, z)) {


if (
(players.hasMetadata("TEST")) &&
(((x - players.getLocation().getBlockX()) * (x - players.getLocation().getBlockX()))) < r * r &&
(((y - players.getLocation().getBlockY()) * (y - players.getLocation().getBlockY()))) < r * r &&
(((z - players.getLocation().getBlockZ()) * (z - players.getLocation().getBlockZ()))) < r * r
)
{

に変えてみたのですが、プレイヤーの立っている位置によって範囲にばらつきがでてしまいます...。


三次元における距離の算出方法をご存知でしょうか。また二次元に置ける距離の算出方法はご存知でしょうか。
二次元も三次元も本質的には同じなので一度調べてみると良いかと思います。 このままでは距離がr未満である という条件になりません。

(この場合だと、x軸方向の距離がr未満かつ、y軸方向の距離がr未満かつ、z軸方向の距離がr未満 という条件になってしまいますね。。。)

ヒント
三平方の定理を2回使う。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

投稿画面のBBコード挿入ボタン を追加するユーザースクリプト作りました。良かったらどうぞ。
https://greasyfork.org/ja/scripts/18657
最大描画距離を64チャンクまで伸ばすMod作ってます。
viewtopic.php?t=30697
アバター
King(qpwakaba)
ID:a77fe154
ダイヤモンド掘り
 
記事: 831
登録日時: 2013年3月26日(火) 10:25

  • (PostNo.291478)

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

投稿記事by ゲスト » 2016年12月26日(月) 23:04

なるほど!三平方の定理を使うんですね
やりたいことができました。ありがとうございます!
ゲスト
ID:9b12332a
 

1つ前へ次へ

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

x