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

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

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

投稿記事by pico » 2017年5月05日(金) 18:54

ucchy さんが書きました:picoさん、onCommandが呼び出されない原因がわかりました。

onCommandメソッドの引数ですが、ここを変更していますね?
ここは変更してはいけません。オーバーロードされて別のonCommandメソッドとして認識されています。

コード: 全て選択
    public boolean onCommand(Player p,CommandSender sender, Command cmd, String label, String[] args) {


ここですが、「Player p」 という引数を勝手に足してはいけません。

コード: 全て選択
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {


に戻してください。

プレイヤーを取得したいのであれば、コマンドの処理の途中に、
コード: 全て選択
Player p = (Player)sender;

を挿入してキャストしてあげてください。

実装例:
コード: 全て選択
package picopicoplugin;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory;
import org.bukkit.plugin.java.JavaPlugin;

public class Picopicoplugin extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        getLogger().info("[でばっくう]正常に起動");

        //getCommand("suzukita").setExecutor(this);

        FileConfiguration config = this.getConfig();
        config.options().copyDefaults(true);
        this.saveConfig();
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    @Override
    public void onDisable() {
        getLogger().info("[でばっくう]正常に終了");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("headbuy")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.AQUA + "サーバー側からは実行できません。");
            } else {
                Player p = (Player)sender;
                Inventory inv;
                inv = Bukkit.createInventory(null, 9, "頭の購入");
                p.openInventory(inv);
                return true;
            }
            return true;
        }
        return false;
    }
}



なお、コマンド suzukita がplugin.yml に登録されていないと、
コンソールに「[でばっくう]正常に起動」と表示された直後に、NullPointerException が発生しているはずです。これは致命的なエラーで、プラグインは正常に起動していません。
もし、コマンド suzukita が不要であれば、
コード: 全て選択
getCommand("suzukita").setExecutor(this);

の部分を削除しておいてください。


無事実行することができました。
本当に有難うございます!
アバター
pico
ID:3568fa97
木を殴ってる
 
記事: 37
登録日時: 2016年8月02日(火) 18:49

  • (PostNo.301704)

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

投稿記事by ucchy » 2017年5月05日(金) 19:56

picoさん、
うまくいったようで良かったです。

継承や、オーバーロードなど、Javaの基本知識ですから、しっかり学んでおいてくださいね。
この辺りを理解できていると、今後もプラグイン作成で役に立ちますよ。
――お知らせ――
パソコンが壊れたため、買い替えるまで、プラグイン開発作業はお休みしています。簡単な質問程度ならお答えいたします。
――お知らせ――
アバター
ucchy
ID:3940d012
ラピスラズリ収集家
 
記事: 1170
登録日時: 2012年11月07日(水) 00:08

  • (PostNo.302339)

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

投稿記事by 美味しい卵 » 2017年5月19日(金) 16:27

質問です。
というより実行中にエラーを吐いてしまったので解決方法を教えていただきたいのですが,

コード
コード: 全て選択
try {
                  try {
                     DataFolder path = new DataFolder("skills", name);
                     String p = path.getJPath();
                     
                     URL[] classLoaderUrls = new URL[] { new
                     URL("file:/" + p.toString() + "/" + name)};
                     
                     
                     @SuppressWarnings("resource")
                     URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls);
                     Class<?> clazz = urlClassLoader.loadClass("sem.skills.list." + name);
                     try {
                        
                        Object o = clazz.newInstance();
                        
                        try {
                           
                           Method m = clazz.getMethod("on" + name);
                           
                           try {
                              
                              m.invoke(o, player);
                              
                           } catch (IllegalArgumentException e) {
                              e.printStackTrace();
                           } catch (InvocationTargetException e) {
                              e.printStackTrace();
                           }
                           
                        } catch (NoSuchMethodException e) {
                           e.printStackTrace();
                        } catch (SecurityException e) {
                           e.printStackTrace();
                        }
                        
                     } catch (InstantiationException e) {   
                        e.printStackTrace();
                     } catch (IllegalAccessException e) {
                        e.printStackTrace();
                     }
                     
                  } catch (MalformedURLException e1) {
                     e1.printStackTrace();
                  }
                  
               } catch (ClassNotFoundException e) {
                  e.printStackTrace();
               }


プレイヤーが右クリックした時にプラグインの最初の起動時に生成されたファイルの
指定されたjarファイルの中にあるメソッドを起動させようとしたのですが、
このようなエラーを吐いてしまいます

コード: 全て選択
[16:25:51 WARN]: java.lang.ClassNotFoundException: sem.skills.list.Slash
[16:25:51 WARN]:    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[16:25:51 WARN]:    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[16:25:51 WARN]:    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[16:25:51 WARN]:    at sem.bravers.skill.CastEvent.onCast(CastEvent.java:61)
[16:25:51 WARN]:    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[16:25:51 WARN]:    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[16:25:51 WARN]:    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[16:25:51 WARN]:    at java.lang.reflect.Method.invoke(Method.java:498)
[16:25:51 WARN]:    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
[16:25:51 WARN]:    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[16:25:51 WARN]:    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
[16:25:51 WARN]:    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
[16:25:51 WARN]:    at org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:232)
[16:25:51 WARN]:    at org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:199)
[16:25:51 WARN]:    at org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:195)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PlayerConnection.a(PlayerConnection.java:942)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:26)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:1)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[16:25:51 WARN]:    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[16:25:51 WARN]:    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.SystemUtils.a(SourceFile:46)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.MinecraftServer.D(MinecraftServer.java:747)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:399)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576)
[16:25:51 WARN]:    at java.lang.Thread.run(Thread.java:745)


解決法がわからず困っています、助けてください;w;
美味しい卵
ID:f86fe74b
水から上がったとこ
 
記事: 1
登録日時: 2017年5月19日(金) 16:17

  • (PostNo.302768)

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

投稿記事by amata1219 » 2017年5月27日(土) 17:33

美味しい卵 さんが書きました:質問です。
というより実行中にエラーを吐いてしまったので解決方法を教えていただきたいのですが,

コード
コード: 全て選択
try {
                  try {
                     DataFolder path = new DataFolder("skills", name);
                     String p = path.getJPath();
                     
                     URL[] classLoaderUrls = new URL[] { new
                     URL("file:/" + p.toString() + "/" + name)};
                     
                     
                     @SuppressWarnings("resource")
                     URLClassLoader urlClassLoader = new URLClassLoader(classLoaderUrls);
                     Class<?> clazz = urlClassLoader.loadClass("sem.skills.list." + name);
                     try {
                        
                        Object o = clazz.newInstance();
                        
                        try {
                           
                           Method m = clazz.getMethod("on" + name);
                           
                           try {
                              
                              m.invoke(o, player);
                              
                           } catch (IllegalArgumentException e) {
                              e.printStackTrace();
                           } catch (InvocationTargetException e) {
                              e.printStackTrace();
                           }
                           
                        } catch (NoSuchMethodException e) {
                           e.printStackTrace();
                        } catch (SecurityException e) {
                           e.printStackTrace();
                        }
                        
                     } catch (InstantiationException e) {   
                        e.printStackTrace();
                     } catch (IllegalAccessException e) {
                        e.printStackTrace();
                     }
                     
                  } catch (MalformedURLException e1) {
                     e1.printStackTrace();
                  }
                  
               } catch (ClassNotFoundException e) {
                  e.printStackTrace();
               }


プレイヤーが右クリックした時にプラグインの最初の起動時に生成されたファイルの
指定されたjarファイルの中にあるメソッドを起動させようとしたのですが、
このようなエラーを吐いてしまいます

コード: 全て選択
[16:25:51 WARN]: java.lang.ClassNotFoundException: sem.skills.list.Slash
[16:25:51 WARN]:    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
[16:25:51 WARN]:    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
[16:25:51 WARN]:    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[16:25:51 WARN]:    at sem.bravers.skill.CastEvent.onCast(CastEvent.java:61)
[16:25:51 WARN]:    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[16:25:51 WARN]:    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[16:25:51 WARN]:    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[16:25:51 WARN]:    at java.lang.reflect.Method.invoke(Method.java:498)
[16:25:51 WARN]:    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302)
[16:25:51 WARN]:    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[16:25:51 WARN]:    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
[16:25:51 WARN]:    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
[16:25:51 WARN]:    at org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:232)
[16:25:51 WARN]:    at org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:199)
[16:25:51 WARN]:    at org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:195)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PlayerConnection.a(PlayerConnection.java:942)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:26)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:1)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[16:25:51 WARN]:    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[16:25:51 WARN]:    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.SystemUtils.a(SourceFile:46)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.MinecraftServer.D(MinecraftServer.java:747)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:399)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678)
[16:25:51 WARN]:    at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576)
[16:25:51 WARN]:    at java.lang.Thread.run(Thread.java:745)


解決法がわからず困っています、助けてください;w;


美味しい卵さん、こんにちは。
具体的に何をしたいのか曖昧なので何とは言えませんが、sem.skills.list.Slashというクラスが存在しないため、エラーが発生しているように見受けられます。
アバター
amata1219
ID:e1938bc3
木を殴ってる
 
記事: 27
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.305176)

iconomyの所持金の操作について

投稿記事by kemottomausu » 2017年7月24日(月) 21:16

プラグイン制作の質問です。
自分はミニゲームプラグインを作っているのですが、ゲーム終了後にゲームに参加した player に  point だけ iconomy の所持金を加算したいです。
何方かiconomyの所持金操作について教えてください。
また、今後ショップなどの機能も追加したいため、加算だけでなく減額や所持金が足りないかどうかを調べるコードなども教えていただけると嬉しいです。
Javaの扱いに慣れておらず、Plugin制作についても最近学び始めたばかりですが、宜しくお願いします。
環境は spigot-1.8.8-R0.1-SNAPSHOT, iconomyは7.0.6です
プレイヤーは以下のコードで取得しています。(見よう見まねで作ったので、良くわからないですが)
コード: 全て選択
public static Player[] getOnlinePlayers(){
      try{
         return Bukkit.getOnlinePlayers().toArray(new Player[0]);
      }catch(NoSuchMethodError e){
         try{
            Method getOnlinePlayers = null;
            for(Method m : Bukkit.class.getDeclaredMethods()){
               if(m.getName().equals("getOnlinePlayers")){
                  getOnlinePlayers = m;
                  break;
               }
            }
            if(getOnlinePlayers == null) return new Player[]{};
            Object OnlinePlayers = getOnlinePlayers.invoke(Bukkit.class, new Object[0]);
            if(OnlinePlayers instanceof Player[]) return (Player[])OnlinePlayers;
         }catch (Exception es){}
         return new Player[]{};
      }
   }
kemottomausu
ID:7f7d0fd3
木を殴ってる
 
記事: 20
登録日時: 2014年6月07日(土) 12:29

  • (PostNo.305236)

Re: iconomyの所持金の操作について

投稿記事by amata1219 » 2017年7月26日(水) 09:05

kemottomausu さんが書きました:プラグイン制作の質問です。
自分はミニゲームプラグインを作っているのですが、ゲーム終了後にゲームに参加した player に  point だけ iconomy の所持金を加算したいです。
何方かiconomyの所持金操作について教えてください。
また、今後ショップなどの機能も追加したいため、加算だけでなく減額や所持金が足りないかどうかを調べるコードなども教えていただけると嬉しいです。
Javaの扱いに慣れておらず、Plugin制作についても最近学び始めたばかりですが、宜しくお願いします。
環境は spigot-1.8.8-R0.1-SNAPSHOT, iconomyは7.0.6です
プレイヤーは以下のコードで取得しています。(見よう見まねで作ったので、良くわからないですが)
コード: 全て選択
public static Player[] getOnlinePlayers(){
      try{
         return Bukkit.getOnlinePlayers().toArray(new Player[0]);
      }catch(NoSuchMethodError e){
         try{
            Method getOnlinePlayers = null;
            for(Method m : Bukkit.class.getDeclaredMethods()){
               if(m.getName().equals("getOnlinePlayers")){
                  getOnlinePlayers = m;
                  break;
               }
            }
            if(getOnlinePlayers == null) return new Player[]{};
            Object OnlinePlayers = getOnlinePlayers.invoke(Bukkit.class, new Object[0]);
            if(OnlinePlayers instanceof Player[]) return (Player[])OnlinePlayers;
         }catch (Exception es){}
         return new Player[]{};
   }

kemottomausuさん、こんにちは。
iConomyとの連携になりますが、まずライブラリーに外部JARの追加でiConomy.jarを追加し適用して下さい。
次にiConomyのメソッドを作成します。下記コードになりますが、これは飽くまで独自の方法なので必ず正しいとは限りません。
コード: 全て選択
public static iConomy iConomy(){
Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("iConomy");
if((plugin == null) ||(!(plugin instanceof iConomy))){
//iConomyが導入されていない場合はnullを返す
return null;
}
return (iConomy) plugin;
}

これでiConomyのデータベースへのアクセスが可能になります。
所持金操作は申し訳ありませんがご自身で探ってみて下さい。
以上となります。

余談ですが、iConomyはUUIDに対応しておらず小規模なサーバーや個人利用程度で無ければ使用は推奨されません。
プレイヤー名の変更によるデータリセットや、非正規クライアントによるシステムの悪用が考えられるため、上記の様な環境で無ければUUID対応済みの他プラグインで代用されては如何でしょうか。
アバター
amata1219
ID:b1112da9
木を殴ってる
 
記事: 27
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.305264)

Re: iconomyの所持金の操作について

投稿記事by kemottomausu » 2017年7月26日(水) 16:02

amata1219 さんが書きました:
kemottomausu さんが書きました:プラグイン制作の質問です。
自分はミニゲームプラグインを作っているのですが、ゲーム終了後にゲームに参加した player に  point だけ iconomy の所持金を加算したいです。
何方かiconomyの所持金操作について教えてください。
また、今後ショップなどの機能も追加したいため、加算だけでなく減額や所持金が足りないかどうかを調べるコードなども教えていただけると嬉しいです。
Javaの扱いに慣れておらず、Plugin制作についても最近学び始めたばかりですが、宜しくお願いします。
環境は spigot-1.8.8-R0.1-SNAPSHOT, iconomyは7.0.6です
プレイヤーは以下のコードで取得しています。(見よう見まねで作ったので、良くわからないですが)
コード: 全て選択
public static Player[] getOnlinePlayers(){
      try{
         return Bukkit.getOnlinePlayers().toArray(new Player[0]);
      }catch(NoSuchMethodError e){
         try{
            Method getOnlinePlayers = null;
            for(Method m : Bukkit.class.getDeclaredMethods()){
               if(m.getName().equals("getOnlinePlayers")){
                  getOnlinePlayers = m;
                  break;
               }
            }
            if(getOnlinePlayers == null) return new Player[]{};
            Object OnlinePlayers = getOnlinePlayers.invoke(Bukkit.class, new Object[0]);
            if(OnlinePlayers instanceof Player[]) return (Player[])OnlinePlayers;
         }catch (Exception es){}
         return new Player[]{};
   }

kemottomausuさん、こんにちは。
iConomyとの連携になりますが、まずライブラリーに外部JARの追加でiConomy.jarを追加し適用して下さい。
次にiConomyのメソッドを作成します。下記コードになりますが、これは飽くまで独自の方法なので必ず正しいとは限りません。
コード: 全て選択
public static iConomy iConomy(){
Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("iConomy");
if((plugin == null) ||(!(plugin instanceof iConomy))){
//iConomyが導入されていない場合はnullを返す
return null;
}
return (iConomy) plugin;
}

これでiConomyのデータベースへのアクセスが可能になります。
所持金操作は申し訳ありませんがご自身で探ってみて下さい。
以上となります。

余談ですが、iConomyはUUIDに対応しておらず小規模なサーバーや個人利用程度で無ければ使用は推奨されません。
プレイヤー名の変更によるデータリセットや、非正規クライアントによるシステムの悪用が考えられるため、上記の様な環境で無ければUUID対応済みの他プラグインで代用されては如何でしょうか。


返信ありがとうございます。 調べてみましたが、貴方のおっしゃる通り、iConomyには貧弱性があることが分かったので、別の経済プラグインを導入しようと思います。
また、外部JARで追加すれば、他のプラグインとの連携が可能になることも分かりました。ありがとうございました。
kemottomausu
ID:7f7d0fd3
木を殴ってる
 
記事: 20
登録日時: 2014年6月07日(土) 12:29

  • (PostNo.305396)

スペクテイターモードのプレイヤーをあるプレイヤーに憑依させる方法

投稿記事by kemottomausu » 2017年7月29日(土) 01:17

何度も質問すいません・・
前回の金の管理はVaultを使うことで何とかなりましたが、今度はプレイヤーが死んだときに、playerをスペクターモードにして、 killerに乗り移させる(?)方法が知りたいです。
簡単に言うとキルカメラが作りたいということです
一応、プレイヤーをスペクテイターモードにすることはできたので、その点は大丈夫です
また、一定時間経過すれば、スペクテイターは解除され、スポーンポイントに飛ばされるようになっているのでそこら辺も大丈夫です

こんな感じです↓
コード: 全て選択
public void onPlayerDeathEvent(PlayerDeathEvent event) {
      Player player = event.getEntity();
      Player killer = null;
      try {
         killer = player.getKiller();
      } catch (Exception e) {
         killer = null;
      }

               //省略(スペクテイターにする作業など)

               //ここに憑依させる命令

               //省略(タイマーif文などなど)

               //ここに憑依を解除する命令
}


海外のサイトとかで探したんですが、自分の力では見つけられませんでした。
ご回答よろしくお願いします。
kemottomausu
ID:7f7d0fd3
木を殴ってる
 
記事: 20
登録日時: 2014年6月07日(土) 12:29

  • (PostNo.305402)

Re: スペクテイターモードのプレイヤーをあるプレイヤーに憑依させる方法

投稿記事by amata1219 » 2017年7月29日(土) 10:07

kemottomausu さんが書きました:何度も質問すいません・・
前回の金の管理はVaultを使うことで何とかなりましたが、今度はプレイヤーが死んだときに、playerをスペクターモードにして、 killerに乗り移させる(?)方法が知りたいです。
簡単に言うとキルカメラが作りたいということです
一応、プレイヤーをスペクテイターモードにすることはできたので、その点は大丈夫です
また、一定時間経過すれば、スペクテイターは解除され、スポーンポイントに飛ばされるようになっているのでそこら辺も大丈夫です

こんな感じです↓
コード: 全て選択
public void onPlayerDeathEvent(PlayerDeathEvent event) {
      Player player = event.getEntity();
      Player killer = null;
      try {
         killer = player.getKiller();
      } catch (Exception e) {
         killer = null;
      }

               //省略(スペクテイターにする作業など)

               //ここに憑依させる命令

               //省略(タイマーif文などなど)

               //ここに憑依を解除する命令
}


海外のサイトとかで探したんですが、自分の力では見つけられませんでした。
ご回答よろしくお願いします。


kemottomausuさん、こんにちは。
憑依自体は簡単でして、setPassenger()を使用するだけで実装可能です。
下記コードの様にして頂ければ動作するはずです。
コード: 全て選択
killer.setPassenger(player);

一応、SpigotAPIドキュメントのEntity関連の説明記事貼っておきますね。
org.bukkit.entity
アバター
amata1219
ID:1146aee9
木を殴ってる
 
記事: 27
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.305405)

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

投稿記事by skyteamsystem » 2017年7月29日(土) 11:42

こんにちは!
今、アカウントが乗っ取られていると判断した場合BANするプラグインを作っています。
その中で、初めて参加したプレイヤーのIPをファイルに保存して、2回目からの参加はその保存したIPと比較して
変更があった場合BANする動作を考えているのですが私の知識だけでは難しく調べても出てこなかったので
個々の人に相談したいと思いました。(誤動作を考えてあとで少しソースを変更します)

皆さんの知恵を使わしてください!
Minecraftでいろいろしています...
例えばぁ...
アバター
skyteamsystem
ID:fd4b5f13
木を殴ってる
 
記事: 28
登録日時: 2016年6月22日(水) 21:01
お住まい: NyanCatの国

  • (PostNo.305413)

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

投稿記事by amata1219 » 2017年7月29日(土) 13:39

skyteamsystem さんが書きました:こんにちは!
今、アカウントが乗っ取られていると判断した場合BANするプラグインを作っています。
その中で、初めて参加したプレイヤーのIPをファイルに保存して、2回目からの参加はその保存したIPと比較して
変更があった場合BANする動作を考えているのですが私の知識だけでは難しく調べても出てこなかったので
個々の人に相談したいと思いました。(誤動作を考えてあとで少しソースを変更します)

皆さんの知恵を使わしてください!


skyteamsystemさん、こんにちは。

まず、その仕様ですと恐らく誤処罰量産機になりかねません。
問題点を挙げさせて頂きますと、普段私達が使用しているIPアドレスは動的IPアドレスと呼ばれるもので、定期的にプロバイダ側で変わったりします。
それに、モデムやルーターの電源を入れ直すと変更される場合もあります。また、旅行先等の別端末で接続した場合も問題が発生しますよね。
その都度、何も問題の無いアカウントがBANされ、解除申請が来て管理側の負担も間違えなく増えるかと思われます。
そこで個人的な意見になりますが、アクセス拒否はBANでなくKICKを推奨します。
そして、IP変更があった際に予め対応出来るような仕様を用意すること、IP変更時の際に管理側にIP変更が起きた事を伝えられるアクセス拒否解除申請フォーラムでも用意すべきです。特にJapanMinecraftServersのアカウントシステムの様な、所有者のアカウントと紐付けされているアカウントで申請出来る環境が良いかと思われます。

IP変更が発生した場合にBANする動作と軽々しく仰られていますが、誤処罰されたユーザーの心情や状況を一度お考えになって下さい。
勿論、システムの開発は自由です。ですが、アカウント乗っ取りといった理由であれど、確定的な証拠が無い訳であり、IPの変更だけでBANされる。アカウント所有者にしてみれば、理不尽過ぎる現実ではないでしょうか。それに、ローカルBANの情報ですら出回っている世の中です。他所へ行けば不審がられる可能性も十分にある訳です。殆どの方がマルチプレイで快適な生活を楽しみたいはずです。誤処罰が一人のプレイヤーをどれだけ悲しませるのか、十分に考えた上での開発をして下さい。
アバター
amata1219
ID:1146aee9
木を殴ってる
 
記事: 27
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.305418)

Re: スペクテイターモードのプレイヤーをあるプレイヤーに憑依させる方法

投稿記事by kemottomausu » 2017年7月29日(土) 14:38

amata1219 さんが書きました:
kemottomausu さんが書きました:何度も質問すいません・・
前回の金の管理はVaultを使うことで何とかなりましたが、今度はプレイヤーが死んだときに、playerをスペクターモードにして、 killerに乗り移させる(?)方法が知りたいです。
簡単に言うとキルカメラが作りたいということです
一応、プレイヤーをスペクテイターモードにすることはできたので、その点は大丈夫です
また、一定時間経過すれば、スペクテイターは解除され、スポーンポイントに飛ばされるようになっているのでそこら辺も大丈夫です

こんな感じです↓
コード: 全て選択
public void onPlayerDeathEvent(PlayerDeathEvent event) {
      Player player = event.getEntity();
      Player killer = null;
      try {
         killer = player.getKiller();
      } catch (Exception e) {
         killer = null;
      }

               //省略(スペクテイターにする作業など)

               //ここに憑依させる命令

               //省略(タイマーif文などなど)

               //ここに憑依を解除する命令
}


海外のサイトとかで探したんですが、自分の力では見つけられませんでした。
ご回答よろしくお願いします。


kemottomausuさん、こんにちは。
憑依自体は簡単でして、setPassenger()を使用するだけで実装可能です。
下記コードの様にして頂ければ動作するはずです。
コード: 全て選択
killer.setPassenger(player);

一応、SpigotAPIドキュメントのEntity関連の説明記事貼っておきますね。
org.bukkit.entity


ご回答ありがとうございます。SpigotAPIリファレンスをもっと注意して読めばわかることでしたね・・・
すいませんでした。
kemottomausu
ID:7f7d0fd3
木を殴ってる
 
記事: 20
登録日時: 2014年6月07日(土) 12:29

  • (PostNo.305436)

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

投稿記事by skyteamsystem » 2017年7月29日(土) 18:57

amata1219 さんが書きました:
skyteamsystem さんが書きました:こんにちは!
今、アカウントが乗っ取られていると判断した場合BANするプラグインを作っています。
その中で、初めて参加したプレイヤーのIPをファイルに保存して、2回目からの参加はその保存したIPと比較して
変更があった場合BANする動作を考えているのですが私の知識だけでは難しく調べても出てこなかったので
個々の人に相談したいと思いました。(誤動作を考えてあとで少しソースを変更します)

皆さんの知恵を使わしてください!


skyteamsystemさん、こんにちは。

まず、その仕様ですと恐らく誤処罰量産機になりかねません。
問題点を挙げさせて頂きますと、普段私達が使用しているIPアドレスは動的IPアドレスと呼ばれるもので、定期的にプロバイダ側で変わったりします。
それに、モデムやルーターの電源を入れ直すと変更される場合もあります。また、旅行先等の別端末で接続した場合も問題が発生しますよね。
その都度、何も問題の無いアカウントがBANされ、解除申請が来て管理側の負担も間違えなく増えるかと思われます。
そこで個人的な意見になりますが、アクセス拒否はBANでなくKICKを推奨します。
そして、IP変更があった際に予め対応出来るような仕様を用意すること、IP変更時の際に管理側にIP変更が起きた事を伝えられるアクセス拒否解除申請フォーラムでも用意すべきです。特にJapanMinecraftServersのアカウントシステムの様な、所有者のアカウントと紐付けされているアカウントで申請出来る環境が良いかと思われます。

IP変更が発生した場合にBANする動作と軽々しく仰られていますが、誤処罰されたユーザーの心情や状況を一度お考えになって下さい。
勿論、システムの開発は自由です。ですが、アカウント乗っ取りといった理由であれど、確定的な証拠が無い訳であり、IPの変更だけでBANされる。アカウント所有者にしてみれば、理不尽過ぎる現実ではないでしょうか。それに、ローカルBANの情報ですら出回っている世の中です。他所へ行けば不審がられる可能性も十分にある訳です。殆どの方がマルチプレイで快適な生活を楽しみたいはずです。誤処罰が一人のプレイヤーをどれだけ悲しませるのか、十分に考えた上での開発をして下さい。

返答ありがとうございます!
確かに私もこの文章を読んで利用者側の気持ちになってみました。
そこで新しく学ぶことや知ることがたくさんありました!
これからのプラグイン開発やサーバーの運営体制などを見直していきたいと思います。
本当にありがとうございました!
Minecraftでいろいろしています...
例えばぁ...
アバター
skyteamsystem
ID:fd4b5f13
木を殴ってる
 
記事: 28
登録日時: 2016年6月22日(水) 21:01
お住まい: NyanCatの国

  • (PostNo.305464)

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

投稿記事by TKGEX » 2017年7月30日(日) 13:06

受けたダメージをホログラムにして表示するプラグインを作っていたのですが
target.damage(10);
このようにしてダメージを与えて

@EventHandler
public void onTest(EntityDamageByEntityEvent event){
Entity entity = event.getEntity();
Entity damager = event.getDamager();
double damage = event.getDamage();

if(damager.hasMetadata("Test")){
event.setDamage(damage + (damage * 0.2));
}
}
ダメージを与える人が指定したMetadataを持っていたらダメージ
が20%上昇するようにしたんです
そして、targetの最後に受けたダメージを受けて表示しようしました.
double lastDamage = live.getLastDamage();
Holograms holo = new Holograms(Text, live.getLocation());
holo.show(player, plugin);
検証して見たら、
表示されたのはダメージが上昇する前(10ダメージ)のものでした
ですが、onTestでevent.getDamage()をしてみると12ダメージになっていました
これはどういうことなのでしょうか?
正しく表示するにはどうしたら良いのでしょうか
よろしくお願いします
長文失礼しました。
TKGEX
ID:f86fe74b
 

  • (PostNo.305573)

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

投稿記事by amata1219 » 2017年8月01日(火) 08:54

TKGEX さんが書きました:受けたダメージをホログラムにして表示するプラグインを作っていたのですが
target.damage(10);
このようにしてダメージを与えて

@EventHandler
public void onTest(EntityDamageByEntityEvent event){
Entity entity = event.getEntity();
Entity damager = event.getDamager();
double damage = event.getDamage();

if(damager.hasMetadata("Test")){
event.setDamage(damage + (damage * 0.2));
}
}
ダメージを与える人が指定したMetadataを持っていたらダメージ
が20%上昇するようにしたんです
そして、targetの最後に受けたダメージを受けて表示しようしました.
double lastDamage = live.getLastDamage();
Holograms holo = new Holograms(Text, live.getLocation());
holo.show(player, plugin);
検証して見たら、
表示されたのはダメージが上昇する前(10ダメージ)のものでした
ですが、onTestでevent.getDamage()をしてみると12ダメージになっていました
これはどういうことなのでしょうか?
正しく表示するにはどうしたら良いのでしょうか
よろしくお願いします
長文失礼しました。


TKGEXさん、こんにちは。

SpigotAPIドキュメントを参照しますと、どうやらe.getLastDamage()はダメージ取得のタイミングが、ダメージを受けた直後に発生する無敵状態のタイミングの様です。e.getDamage()とは取得のタイミングが違うためそこで誤差が生じる様です。
ですので、特に理由が無ければe.getDamage()を使用する事を推奨します。
アバター
amata1219
ID:1146aee9
木を殴ってる
 
記事: 27
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.305972)

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

投稿記事by TKGEX » 2017年8月07日(月) 23:28

返信遅れてすみません。
なるほど...取得タイミングがちがかったのですね。
そこに気をつけて修正したら無事表示することができました!
ありがとうございました!
TKGEX
ID:f86fe74b
 

  • (PostNo.306708)

ブロックをバイナリファイルに保存すると、サイズがでかくなる

投稿記事by カーボンファイバー » 2017年8月22日(火) 20:01

件名のとおりです。
保存したい領域の情報をファイルに書き込むため、以下のような方法で行っています。

1. FileOutputStreamのインスタンスを作成(実際にはBufferedOutputStreamでバッファする)
2. 保存する立方体空間のなかで、起点からの終点の距離(終点のx座標が起点のx座標より小さい場合、xの距離はマイナスになる。y, zも同様)を計算し、int型をbyte型に変換してから保存します。
3. 起点に近いブロックから、forループでブロックID、データをbyte型で保管します
この方法なら保存に必要なサイズは少ないはずなのですが、なぜかかなりのサイズをとります
Windowsのプロパティで調べたところ256x256x256ブロックで33,949,198バイトです。(256*256*256*2は33,554,432なのでサイズは理論上と近いです)
ちなみに自分のサーバーのワールドフォルダのサイズは6,862,645バイトです。256*256*256サイズの立方体がワールドの五倍もサイズを取るなんて信じられません。
なぜCraftBukkitに比べて自分のプラグインはこんなにも量をとるのかという問題の解決に向けて、回答よろしくお願いします

問題のコードはこちら
コード: 全て選択
package secret.io;

import secret.DystopiaPlugin;
import org.bukkit.Location;
import org.bukkit.block.Block;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.logging.Logger;

public class BlocksWriter {

    private final Location start;
    private final Location end;
    private final File file;


    public BlocksWriter(Location start, Location end, File file){
        this.start = start;
        this.end = end;
        this.file = file;
    }

    public void write() throws IOException{
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }

        if(!file.exists()){
            file.createNewFile();
        }

        if(start.getWorld() != end.getWorld()){
            throw new IllegalArgumentException("Worlds of the locations must be the same!");
        }

        int distanceX = end.getBlockX() - start.getBlockX();
        int distanceY = end.getBlockY() - start.getBlockY();
        int distanceZ = end.getBlockZ() - start.getBlockZ();
        Logger l =DystopiaPlugin.getInstance().getLogger();
        try(BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))){
            writeInt(out, distanceX);
            writeInt(out, distanceY);
            writeInt(out, distanceZ);
            for(int x = 0; Math.abs(x) <= Math.abs(distanceX);){
                for(int y = 0; Math.abs(y) <= Math.abs(distanceY);){
                    for(int z = 0; Math.abs(z) <= Math.abs(distanceZ);){
                        Block targetBlock = start.clone().add(x, y, z).getBlock();
                        out.write(targetBlock.getTypeId());
                        out.write(targetBlock.getData());
                        if(distanceZ > 0)
                            z++;
                        else
                            z--;
                    }
                    if(distanceY > 0)
                        y++;
                    else
                        y--;
                }

                if(distanceX > 0)
                    x++;
                else
                    x--;
            }
        }
    }

    private void writeInt(BufferedOutputStream b, int loc) throws IOException {
        b.write(ByteBuffer.allocate(4).putInt(loc).array());
    }

}

*JavaDocを付け忘れていたので各メソッドの説明
writeInt:void...intをバイト配列に変換して保存します
write():void...起点と終点を利用して、fileに書き込みます
学生なら、IntelliJ IDEA Ultimate EditionとかGit Hub Developer Editionとかの有料サービスがただになるので、試してみてね
アバター
カーボンファイバー
ID:6ba2a770
石炭掘り
 
記事: 181
登録日時: 2013年10月20日(日) 12:40

  • (PostNo.306761)

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

投稿記事by カーボンファイバー » 2017年8月23日(水) 15:48

自己解決しました。
ZipOutputStreamを使うことで圧縮することが肝みたいですね
33,951,744バイトがたったの147,200バイトになり、つまり99.6%削減されました!
圧縮レベルを指定することによって、書き込み速度とサイズの釣り合いを調整することができそうですね。
*間違いを指摘されたので修正済み
最後に編集したユーザー カーボンファイバー [ 2017年8月24日(木) 01:21 ], 累計 4 回
学生なら、IntelliJ IDEA Ultimate EditionとかGit Hub Developer Editionとかの有料サービスがただになるので、試してみてね
アバター
カーボンファイバー
ID:6ba2a770
石炭掘り
 
記事: 181
登録日時: 2013年10月20日(日) 12:40

  • (PostNo.306771)

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

投稿記事by King(qpwakaba) » 2017年8月23日(水) 17:27

カーボンファイバー さんが書きました:33,951,744バイトがたったの147,200バイトになり、つまり25000%削減されました!

どこから25,000%という値が出たかわかりませんが、計算すると0.43%のデータサイズになっているので、およそ99.6%の削減だと思うのですが。。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

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

  • (PostNo.306801)

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

投稿記事by カーボンファイバー » 2017年8月24日(木) 00:45

King(qpwakaba) さんが書きました:
カーボンファイバー さんが書きました:33,951,744バイトがたったの147,200バイトになり、つまり25000%削減されました!

どこから25,000%という値が出たかわかりませんが、計算すると0.43%のデータサイズになっているので、およそ99.6%の削減だと思うのですが。。

よく考えたら、100%以上の削減は、計算上マイナスになってしまいますね
昔の自分は、サイズ量が1/250になっていたので、25000%と深く考えずに言ってたらしいですね……
ご指摘ありがとうございます
学生なら、IntelliJ IDEA Ultimate EditionとかGit Hub Developer Editionとかの有料サービスがただになるので、試してみてね
アバター
カーボンファイバー
ID:6ba2a770
石炭掘り
 
記事: 181
登録日時: 2013年10月20日(日) 12:40

1つ前へ次へ

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

x