Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Jak sprawdzić co gracz ma w ręce?


Czaromirus

Rekomendowane odpowiedzi

Opublikowano

Chcę zrobić plugin, ale nie wiem co wpisać po if(), jeżeli chcę sprawdzić co gracz trzyma w ręce np.

Jeżeli gracz trzyma diax miecz to coś tam się z nim dzieje.

Opublikowano
Player p = (Player) sender;

albo

Player p = (Player) e.getPlayer();
if(p.getItemInHand().equals(new ItemStack(Material.DIAMOND))){
}
Opublikowano

@NetherSky. Coś nie działa. :(

 

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin {


@Override
public void onEnable() {
System.out.println("Uruchamianie...");
}


@Override
public void onDisable() {
System.out.println("Wylaczanie...");
}


@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player p = (Player) sender;
if(p.getItemInHand().equals(new ItemStack(Material.DIAMOND))){
p.setFlySpeed(5);
}
return false;
}

Nic się nie dzieje.

Opublikowano

@NetherSky. Coś nie działa. :(

 

 

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin {


@Override
public void onEnable() {
System.out.println("Uruchamianie...");
}


@Override
public void onDisable() {
System.out.println("Wylaczanie...");
}


@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player p = (Player) sender;
if(p.getItemInHand().equals(new ItemStack(Material.DIAMOND))){
p.setFlySpeed(5);
}
return false;
}
Nic się nie dzieje.

 

A skąd ma wiedzieć jaką komendę wpisałeś? ;-;

if(command.getName().equalsIgnoreCase("test"){
//your code
}

Oraz do tego zarejestruj komendę test, w plugin.yml też. 

 

­

Opublikowano

 

if(player.getItemInHand() != null){
    if(player.getItemInHand().getType() == Material.DIAMOND_SWORD){
        player.setFlySpeed(5);
   }
}
Opublikowano

@"NetherSky." Coś nie działa. :(

 

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin {


@Override
public void onEnable() {
System.out.println("Uruchamianie...");
}


@Override
public void onDisable() {
System.out.println("Wylaczanie...");
}


@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player p = (Player) sender;
if(p.getItemInHand().equals(new ItemStack(Material.DIAMOND))){
p.setFlySpeed(5);
}
return false;
}
Nic się nie dzieje.

 

A skąd ma wiedzieć jaką komendę wpisałeś? ;-;
if(command.getName().equalsIgnoreCase("test"){
//your code
}
Oraz do tego zarejestruj komendę test, w plugin.yml też.

 

­

Nie wrzucaj mu błędu, jeśli to TY go popełniłeś. Zapomniałeś o getType.

 

 

@Topic

Zasada jest prosta, jeśli nie wiesz jak coś zrobić to zajrzyj do dokumentacji.

Ewentualnie:

- Wiem, że mam mojego gracza ale nie wiem jak zrobić czy coś trzyma to hmm..

 

Wpisujesz sobie Twoja zmienna od Playera przykladowo p oraz stawiasz kropkę czyli:

p.

 

W tym momencie wyświetli Ci się lista z której Na skojarzenia wybierasz co chcesz zrobić. Podstawy angielskiego + angielskie zagadnienia w google z dopiskiem bukkit i masz odpowiedź na wszystko.

784091427630431250239.png

Regulamin sygnatur

Opublikowano

@booterxyz Jutro sprawdzę czy działa. A i jeszcze jedno, jak ja chcę sprawdzić czy gracz trzyma np diax miecz i po wykonaniu np komendy XYZ usuwa go, a gdy trzyma coś innego to wysyła jakąś wiadomość.

 

Opublikowano

Może komenda /invsee <nick>

 

Nom. A Bóg jeździł koleją.

 

 

@booterxyz Jutro sprawdzę czy działa. A i jeszcze jedno, jak ja chcę sprawdzić czy gracz trzyma np diax miecz i po wykonaniu np komendy XYZ usuwa go, a gdy trzyma coś innego to wysyła jakąś wiadomość.

Praktyczniej moim zdaniem używać w tych przypadkach equals zamiast ==.. Zresztą nie tylko moim zdaniem i tak się powinno robić.

 

 

Proszę ;]

public class TestCommand extends Command {
    public TestCommand(){
        super("test");
    }

    @Override
    public boolean execute(CommandSender commandSender, String s, String[] strings) {
        if (!(commandSender instanceof Player)) {
            return true;
        }
        Player p = (Player)commandSender;

        if (p.getItemInHand() == null) {
            return true;
        }

        if (!p.getItemInHand().getType().equals(Material.DIAMOND_SWORD)) {
            p.sendMessage(ChatColor.RED + "Musisz trzymac w reku diamentowy miecz!");
            return true;
        }
        p.getInventory().removeItem(p.getItemInHand());
        p.sendMessage(ChatColor.GREEN + "Twoj przedmiot z reki zostal usuniety!");
        return true;
    }
}

784091427630431250239.png

Regulamin sygnatur

Opublikowano

@booterxyz Nie działa.

 

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin {


@Override
public void onEnable() {
System.out.println("Uruchamianie...");
}


@Override
public void onDisable() {
System.out.println("Wylaczanie...");
}


ItemStack chestplate = new ItemStack(Material.CHAINMAIL_CHESTPLATE);{
chestplate.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL , 1);
ItemMeta im = chestplate.getItemMeta();
im.setDisplayName("§f§lSlaby §4§lNAPIERSNIK");
chestplate.setItemMeta(im);
}


@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player player = (Player) sender;
if(player.getItemInHand() !=null){
   if(player.getItemInHand().getType().equals(Material.DIAMOND_SWORD)){
    player.getInventory().setChestplate(chestplate);
  }
}
return false;
}
}

@OldisPL Twoje też nie działa. Nie wywala żadnych błędów w konsoli. Zarejestrowałem komendę.

Opublikowano

@"OldisPL" Zarejestrowałem w plugin.yml

Tego się w plugin.yml nie rejestruje lel.

Poczytaj jak zarejestrować Command albo poczekaj aż wrócę do domku.

784091427630431250239.png

Regulamin sygnatur

Opublikowano

Komendy z klasy głównej nie trzeba rejestrować, nie jest to wymagane

 

Po drugie w komendzie castujesz sendera do playera, nie sprawdzając czy ten sender to rzeczywiście player.. wysyłającym też może być konsola i w tym przypadku wywali error

 

Po trzecie.. jak komenda może działać jeżeli ty jej nie tworzysz....

 

 

@booterxyz Nie działa.

 

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin {


@Override
public void onEnable() {
System.out.println("Uruchamianie...");
}


@Override
public void onDisable() {
System.out.println("Wylaczanie...");
}


ItemStack chestplate = new ItemStack(Material.CHAINMAIL_CHESTPLATE);{
chestplate.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL , 1);
ItemMeta im = chestplate.getItemMeta();
im.setDisplayName("§f§lSlaby §4§lNAPIERSNIK");
chestplate.setItemMeta(im);
}


@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player player = (Player) sender;
if(player.getItemInHand() !=null){
   if(player.getItemInHand().getType().equals(Material.DIAMOND_SWORD)){
    player.getInventory().setChestplate(chestplate);
  }
}
return false;
}
}

@OldisPL Twoje też nie działa. Nie wywala żadnych błędów w konsoli. Zarejestrowałem komendę.

 

w oncommand dodajesz:

if(command.getName().equalsIgnoreCase("twojakomenda") || jeżeli kod nie ma brać pod uwagi wielkość liter

if(command.getName().equals("twojakomenda") || jeżeli twój kod ma działać tylko wtedy kiedy wielkość liter będzie taka sama

dodajesz do plugin.yml:

commands:

  twojakomenda:

 

Możesz dodać też opis ale to jak tam chcesz

 

no i rejestracja komendy to już wyżej ci koledzy powiedzieli

tumblr_mvmbjq2EGs1s3ulybo1_500.gif

Jeśli to czytasz, znaczy to że się opierdalasz :)

Opublikowano
    public static SimpleCommandMap getCommandMap() {
        try {
            Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
            field.setAccessible(true);
            return (SimpleCommandMap)field.get(Bukkit.getServer());
        }
        catch (NoSuchFieldException|IllegalAccessException e) {
            e.printStackTrace();
        }
        return new SimpleCommandMap(Bukkit.getServer());
    }

To wrzuć do Utilów alb coś

I w Main:

Util.getCommandMap().register("XYZ", new TestCommand());

W ten sposób nie musisz uzupełniać plugin.yml i innych głupot, które tylko denerwują bo źle spacje policzysz ;]

784091427630431250239.png

Regulamin sygnatur

Opublikowano
    public static SimpleCommandMap getCommandMap() {
        try {
            Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
            field.setAccessible(true);
            return (SimpleCommandMap)field.get(Bukkit.getServer());
        }
        catch (NoSuchFieldException|IllegalAccessException e) {
            e.printStackTrace();
        }
        return new SimpleCommandMap(Bukkit.getServer());
    }

To wrzuć do Utilów alb coś

I w Main:

Util.getCommandMap().register("XYZ", new TestCommand());

W ten sposób nie musisz uzupełniać plugin.yml i innych głupot, które tylko denerwują bo źle spacje policzysz ;]

 

Rozumiem że pisanie lepszego kodu to ważna rzecz ale po tym co widziałem u góry pan który założył ten post jest początkującym

 

Taka osoba dostając ten kod nie wie z czym to się je.. bloki try catch,commandmap etc

Niech nauczy się podstaw.. jeżeli nie wychodzi mu tworzenie komend i rejestrowanie ich to niech nie łapie się za coś takiego

 

+Za kod ale tak jak mówiłem ;)

tumblr_mvmbjq2EGs1s3ulybo1_500.gif

Jeśli to czytasz, znaczy to że się opierdalasz :)

Opublikowano
    public static SimpleCommandMap getCommandMap() {
        try {
            Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
            field.setAccessible(true);
            return (SimpleCommandMap)field.get(Bukkit.getServer());
        }
        catch (NoSuchFieldException|IllegalAccessException e) {
            e.printStackTrace();
        }
        return new SimpleCommandMap(Bukkit.getServer());
    }

To wrzuć do Utilów alb coś

I w Main:

Util.getCommandMap().register("XYZ", new TestCommand());

W ten sposób nie musisz uzupełniać plugin.yml i innych głupot, które tylko denerwują bo źle spacje policzysz ;]

 

 

 

    public static SimpleCommandMap getCommandMap() {
        try {
            Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
            field.setAccessible(true);
            return (SimpleCommandMap)field.get(Bukkit.getServer());
        }
        catch (NoSuchFieldException|IllegalAccessException e) {
            e.printStackTrace();
        }
        return new SimpleCommandMap(Bukkit.getServer());
    }

To wrzuć do Utilów alb coś

I w Main:

Util.getCommandMap().register("XYZ", new TestCommand());

W ten sposób nie musisz uzupełniać plugin.yml i innych głupot, które tylko denerwują bo źle spacje policzysz ;]

 

Rozumiem że pisanie lepszego kodu to ważna rzecz ale po tym co widziałem u góry pan który założył ten post jest początkującym

 

Taka osoba dostając ten kod nie wie z czym to się je.. bloki try catch,commandmap etc

Niech nauczy się podstaw.. jeżeli nie wychodzi mu tworzenie komend i rejestrowanie ich to niech nie łapie się za coś takiego

 

+Za kod ale tak jak mówiłem ;)

 

Chyba gorszego kodu... 

Refleksje to ostateczność, od tego jest plugin.yml by go używać, tak zostało wymyślone i nie psujmy tego bez poważnego powodu.... to że coś jest wygodniejsze to nie znaczy że lepsze, jak być takie gówno odwalił w jakiejś pracy na jakimś poważnym frameworku to by cie wyśmiali i zwolnili, więc nie ucz się idiotycznych i złych praktyk...

 

 

Komendy z klasy głównej nie trzeba rejestrować, nie jest to wymagane

if(command.getName().equalsIgnoreCase("twojakomenda") || jeżeli kod nie ma brać pod uwagi wielkość liter

if(command.getName().equals("twojakomenda") || jeżeli twój kod ma działać tylko wtedy kiedy wielkość liter będzie taka sama

Tak samo jak jest tylko jedna komenda w pluginie, nie trzeba sprawdzać czy to ta komenda.

 

 

 

 

 

A do autora, jak ci nie działa to debugguj, jak nie umiesz debugera ustawić to możesz od biedy użyć System.out

 

np zanim sprawdzisz item:

System.out.println("Hand: "+player.getItemInHand()+", Valid: "+itemDoSprawdzenia+", Result: "+itemDoSprawdzenia.equals(player.getItemInHand()))

do tego na samym początku onCommand dowal też takiego debugga

System.out.println("Command: "+command.getName()+" invoked by: "+sender.getName());

i wtedy będziesz miał pewność że komenda się wykonuje, to samo możesz dać w onEnable, np zmienić aktualną wiadomośc o włączeniu się pluginu - już nie raz ktoś po prsotu źle exportował plugin czy coś, i się okazywało że cały czas testuje starą wersje pluginu.

 

 

 

 

EDIT:

A dla leniwych:

https://github.com/LordAkkarin/bukkit-plugin-annotations

Macie tu świetną biblioteczkę do rejestrowania całego pluginu bez potrzeby używania plugin.yml

Wgl nie musicie tworzyć takiego pliku w IDE, tylko dać adnotacje @plugin nad główną klasą. Komendy podobnie.

 

I nie używa żadnych refleksji ani nic, to wygeneruje plugin.yml podczas kompilowania projektu, czyli wszystko zrobi się za was, a wy nigdy nie musiecie się tym przejmować.

1438614356923701010629.png

 

Opublikowano

@OldisPL Przerobiłem twój kod na bardziej dla mnie zrozumiały, ale jest jedno ale:

 

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin {


@Override
public void onEnable() {
System.out.println("Uruchamianie...");
}


@Override
public void onDisable() {
System.out.println("Wylaczanie...");
}


@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(cmd.getName().equalsIgnoreCase("test")){
       Player p = (Player) sender;
       if (p.getItemInHand() == null) {
           return true;
       }
       if (!p.getItemInHand().getType().equals(Material.DIAMOND_SWORD)) {
           p.sendMessage(ChatColor.RED + "Musisz trzymac w reku diamentowy miecz!");
           return true;
       } else {
        p.getInventory().removeItem(p.getItemInHand());
        p.sendMessage(ChatColor.GREEN + "Twoj przedmiot z reki zostal usuniety!");
        return true;
       }
   }
return false;
}
}
Plugin nie usuwa tego co gracz trzyma w ręce ale to co jest w bliższym slocie np. Trzymam diaxwy miecz w slocie nr 5, ale mam też diax miecz w slocie nr 2 i zamiast usunąć to co trzymam (slot nr 5) to to usuwa w slocie nr 2. Czemu
Opublikowano

 

@OldisPL Przerobiłem twój kod na bardziej dla mnie zrozumiały, ale jest jedno ale:

 

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin {


@Override
public void onEnable() {
System.out.println("Uruchamianie...");
}


@Override
public void onDisable() {
System.out.println("Wylaczanie...");
}


@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(cmd.getName().equalsIgnoreCase("test")){
       Player p = (Player) sender;
       if (p.getItemInHand() == null) {
           return true;
       }
       if (!p.getItemInHand().getType().equals(Material.DIAMOND_SWORD)) {
           p.sendMessage(ChatColor.RED + "Musisz trzymac w reku diamentowy miecz!");
           return true;
       } else {
        p.getInventory().removeItem(p.getItemInHand());
        p.sendMessage(ChatColor.GREEN + "Twoj przedmiot z reki zostal usuniety!");
        return true;
       }
   }
return false;
}
}
Plugin nie usuwa tego co gracz trzyma w ręce ale to co jest w bliższym slocie np. Trzymam diaxwy miecz w slocie nr 5, ale mam też diax miecz w slocie nr 2 i zamiast usunąć to co trzymam (slot nr 5) to to usuwa w slocie nr 2. Czemu

 

removeItem usuwa cokolwiek co pasuje, używaj zwykłego .remove lub najlepiej użyj metody .setItem(numerSlotu, null)

1438614356923701010629.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...