ゲスト さんが書きました:プレイヤーをテレポートせずに、YawとPitchのみを変更する方法はありますか?
ankou2525 さんが書きました:HashMap<Player, Integer> kill = new HashMap<Player, Integer>();
このマップを使ってプレイヤーがキルしたらプレイヤー値に追加していき、試合が終わった時に最大キルの人を取得したいんですがよくわかりません。
HashMapのValueからkeyを取得する方法を教えていただきたいです。
過去に同じような質問あったらすいません。
お願いします。
elise_blacklab さんが書きました:ankou2525 さんが書きました:
HashMap<Player, Integer> kill = new HashMap<Player, Integer>();
このマップを使ってプレイヤーがキルしたらプレイヤー値に追加していき、試合が終わった時に最大キルの人を取得したいんですがよくわかりません。
HashMapのValueからkeyを取得する方法を教えていただきたいです。
過去に同じような質問あったらすいません。
お願いします。
別にPlugin固有の疑問じゃないし,entrySetで走査すればいいのでは.
ankou2525 さんが書きました:簡単なサンプルとか書いてもらえないでしょうか?
できればお願いします。
int max = 0;
Player topplayer = null;
for (Entry<Player, Integer> entry: map.entrySet()){
if (entry.getValue() > max){
max = entry.getValue();
topplayer = entry.getKey();
}
}
elise_blacklab さんが書きました:ankou2525 さんが書きました:簡単なサンプルとか書いてもらえないでしょうか?
できればお願いします。
- コード: 全て選択
int max = 0;
Player topplayer = null;
for (Entry<Player, Integer> entry: map.entrySet()){
if (entry.getValue() > max){
max = entry.getValue();
topplayer = entry.getKey();
}
}
いまいち書き方が原始的だけどこんな感じ.Entryを一つ一つ走査する.
KeyとValueのセットが欲しいならこれで良い.このくらいは基本的なアルゴリズムとして,Javaのドキュメントを見る前に前提として知っておくと良いと思います.
当然これだと1人しか取得できないので,配列とかで複数人格納できるようにすれば一応完成だけど,正直sort()用にcompareTo()を実装する方が後の参照は楽.
繰り返しになりますがHashMapのソートはPluginに限った話ではないので,まずはggった方が有益な情報がいくらでも見つかります.
import org.bukkit.configuration.file.FileConfiguration;
public class LanguageFile {
private FileConfigurationEx fc = null;
public String start, finish, stop, win_runner, win_hunter;
public LanguageFile(FileConfiguration fc) {
this.fc = (FileConfigurationEx) fc;
}
public enum Keys {
start, finish, stop, win_runner, win_hunter;
}
public void reload() {
start = fc.getString(Keys.start);
finish = fc.getString(Keys.finish);
stop = fc.getString(Keys.stop);
win_runner = fc.getString(Keys.win_runner);
win_hunter = fc.getString(Keys.win_hunter);
}
public void save() {
fc.set(Keys.start, start);
}
private abstract class FileConfigurationEx extends FileConfiguration {
private String getString(Keys key) {
return super.getString(key.toString());
}
private void set(Keys key, Object object) {
super.set(key.toString(), object);
}
}
}
smk7758 さんが書きました:Spigotプラグイン制作において、設定ファイルの値をフィードとして保持したいと思って、以下のコードを書きました。
Java8, Spigot-1.12.2-R0.1
- コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;
public class LanguageFile {
private FileConfigurationEx fc = null;
public String start, finish, stop, win_runner, win_hunter;
public LanguageFile(FileConfiguration fc) {
this.fc = (FileConfigurationEx) fc;
}
public enum Keys {
start, finish, stop, win_runner, win_hunter;
}
public void reload() {
start = fc.getString(Keys.start);
finish = fc.getString(Keys.finish);
stop = fc.getString(Keys.stop);
win_runner = fc.getString(Keys.win_runner);
win_hunter = fc.getString(Keys.win_hunter);
}
public void save() {
fc.set(Keys.start, start);
}
private abstract class FileConfigurationEx extends FileConfiguration {
private String getString(Keys key) {
return super.getString(key.toString());
}
private void set(Keys key, Object object) {
super.set(key.toString(), object);
}
}
}
このソースのreloadメソッドで、Keys(Enum)の全ての値を持ってきて、親クラスのフィードに代入しているのですが、少し煩雑なように思えます。
たとえば、for文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。
import org.bukkit.configuration.file.FileConfiguration;
public abstract class FileConfigurationEx extends FileConfiguration {
public String getString(SettingKeys key) {
return super.getString(key.toString());
}
public void set(SettingKeys key) {
super.set(key.toString(), key.getText());
}
}
public interface SettingKeys {
public String getText();
public void setText(String text);
}
import org.bukkit.configuration.file.FileConfiguration;
public class LanguageFile {
FileConfigurationEx fc = null;
public LanguageFile(FileConfiguration fc) {
this.fc = (FileConfigurationEx) fc;
}
public enum LanguageFileKeys implements SettingKeys {
start(""),
finish(""),
stop(""),
win_runner(""),
win_hunter("");
private String text;
private LanguageFileKeys(String text) {
this.setText(text);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public void reload() {
for (LanguageFileKeys key : LanguageFileKeys.values()) {
key.setText(fc.getString(key));
}
}
public void save() {
for (LanguageFileKeys key : LanguageFileKeys.values()) {
fc.set(key);
}
}
}
smk7758 さんが書きました:Spigotプラグイン制作において、設定ファイルの値をフィードとして保持したいと思って、以下のコードを書きました。
Java8, Spigot-1.12.2-R0.1
- コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;
public class LanguageFile {
private FileConfigurationEx fc = null;
public String start, finish, stop, win_runner, win_hunter;
public LanguageFile(FileConfiguration fc) {
this.fc = (FileConfigurationEx) fc;
}
public enum Keys {
start, finish, stop, win_runner, win_hunter;
}
public void reload() {
start = fc.getString(Keys.start);
finish = fc.getString(Keys.finish);
stop = fc.getString(Keys.stop);
win_runner = fc.getString(Keys.win_runner);
win_hunter = fc.getString(Keys.win_hunter);
}
public void save() {
fc.set(Keys.start, start);
}
private abstract class FileConfigurationEx extends FileConfiguration {
private String getString(Keys key) {
return super.getString(key.toString());
}
private void set(Keys key, Object object) {
super.set(key.toString(), object);
}
}
}
このソースのreloadメソッドで、Keys(Enum)の全ての値を持ってきて、親クラスのフィードに代入しているのですが、少し煩雑なように思えます。
たとえば、for文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。
King(qpwakaba) さんが書きました:smk7758 さんが書きました:Spigotプラグイン制作において、設定ファイルの値をフィードとして保持したいと思って、以下のコードを書きました。
Java8, Spigot-1.12.2-R0.1
- コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;
public class LanguageFile {
private FileConfigurationEx fc = null;
public String start, finish, stop, win_runner, win_hunter;
public LanguageFile(FileConfiguration fc) {
this.fc = (FileConfigurationEx) fc;
}
public enum Keys {
start, finish, stop, win_runner, win_hunter;
}
public void reload() {
start = fc.getString(Keys.start);
finish = fc.getString(Keys.finish);
stop = fc.getString(Keys.stop);
win_runner = fc.getString(Keys.win_runner);
win_hunter = fc.getString(Keys.win_hunter);
}
public void save() {
fc.set(Keys.start, start);
}
private abstract class FileConfigurationEx extends FileConfiguration {
private String getString(Keys key) {
return super.getString(key.toString());
}
private void set(Keys key, Object object) {
super.set(key.toString(), object);
}
}
}
このソースのreloadメソッドで、Keys(Enum)の全ての値を持ってきて、親クラスのフィードに代入しているのですが、少し煩雑なように思えます。
たとえば、for文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。
((Enum#values() ってのがあるよ)
public void reload() {
for (Keys key : Keys.values()) {
?(できない) = fc.getString(key);
}
}
@EventHandler
public void PR(final ProjectileLaunchEvent e){
if(e.getEntity().getType().equals(EntityType.ARROW)){
new BukkitRunnable(){
@Override
public void run() {
// TODO 自動生成されたメソッド・スタブ
if(!e.getEntity().isOnGround()){
Location loc = e.getEntity().getLocation();
Firework fw = (Firework) e.getEntity().getWorld().spawnEntity(loc, EntityType.FIREWORK);
FireworkMeta fwm = fw.getFireworkMeta();
fwm.setPower(0);
fwm.addEffect(FireworkEffect.builder()
.trail(false)
.flicker(false)
.with(Type.BALL_LARGE)
.withColor(Color.BLACK)
.withFade(Color.AQUA)
.build());
fw.setFireworkMeta(fwm);
fw.detonate();
} else {
cancel();
}
}
}.runTaskTimer(this, 0L, 1L);
}
}
smk7758 さんが書きました:King(qpwakaba) さんが書きました:((Enum#values() ってのがあるよ)
reloadメソッドにおいての問題として、たとえばfor文にしたとして、Keys.values()で取得しても任意のフィードに代入するには、任意にフィードを指定し代入する他ないため、以下のようにただEnumのvalues()を用いることはできないように思いましたが、どのようにすればよいでしょうか。
- コード: 全て選択
public void reload() {
for (Keys key : Keys.values()) {
?(できない) = fc.getString(key);
}
}
自己解決していますが、別の方法があればご教授いただきたく存じます。
ゲスト さんが書きました:Bukkit1.12.2,Java8です。
自作プラグインから、その他のプラグインのコマンドを実行する方法を教えて下さい。
具体的な使用方法は、自作プラグインでイベントを監視し、発火したところでPermissionEXの権限設定用のコマンドをコンソールに実行させたいのです。
ご返答よろしくお願いします。
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {
// プレイヤーの向いている方向にあるブロックを取得
Player player = event.getPlayer();
Block block = player.getTargetBlock((Set<Material>)null, 5);
// ブロックのアイテム名を取得
Material material = block.getType();
ItemStack item = new ItemStack(material);
String name = item.getItemMeta().getDisplayName();
// ブロック名を表示
player.sendMessage(name);
}
nobody さんが書きました:手法が良く分からなかったため、質問させていただきます。
使用環境は spigot 1.12.2 です。
プレイヤーが見ているブロックの名前を画面に表示するpluginを作成しています。
実際にプレイヤーが見ているブロックの情報を取得する事は出来たのですが、そのブロックの名前を取得する場所で躓いています。
以下のような形で試行したのですが、うまく取得できませんでした。
- コード: 全て選択
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {
// プレイヤーの向いている方向にあるブロックを取得
Player player = event.getPlayer();
Block block = player.getTargetBlock((Set<Material>)null, 5);
// ブロックのアイテム名を取得
Material material = block.getType();
ItemStack item = new ItemStack(material);
String name = item.getItemMeta().getDisplayName();
// ブロック名を表示
player.sendMessage(name);
}
上記だと、空文字になりました。
どうやらMetaItemから引けるgetDisplayName()は、例えば金床で付けた名前しか取得できず、初期の名前を持ってくるのには不向きのようです。
material.toString()も試してみましたが、こちらは定数名をそのまま文字列にしたものしか取得できませんでした。
取得したいアイテム名としては、例えばホットバーでアイテムにカーソルを合わせた時、ホットバー上部に表示されるアイテム名と同じ文字列を希望しています。
これを取得する方法について、ご教示頂けませんでしょうか。
※例えばswitch-caseを使ってmaterial定数に合致する文字列をコード上に書き込むような手法はなるべく避けたいです。
以上、よろしくお願いいたします。