- Баллы
- 31
Дорогие форумчане, пожалуйста оцените мой уровень говнокода по шкале от 1 до 5, и если можно, предложите шаги для развития. Вот сама задача:
У меня в мини-игре есть некоторый набор уникальных предметов (их кол-во не будет менятся), сами по себе они представляют обычные предметы, с какими-то фишкам, которые им даёт плагин. Грубо говоря, для каждого предмета есть разное кол-во событий, и для этих событий разные варианты действий.
Например: Золотой сет, на ПКМ с предметом в руке одевается, и меняет штаны и нагрудник на золотые, при получении урона отбрасывает по направлению удара с силой в 20% от начальной. Я решил то, что для каждого предмета будет отдельный класс, который наследуется от некоторого абстрактного класса в котором определены методы по типу onRMB, onLMB и т.д. Все классы уник. предм. хранятся в отделном Enum, который уже перехватывает события и выполняет нужные действия в зависимости от предмета.
Вот код:
У меня в мини-игре есть некоторый набор уникальных предметов (их кол-во не будет менятся), сами по себе они представляют обычные предметы, с какими-то фишкам, которые им даёт плагин. Грубо говоря, для каждого предмета есть разное кол-во событий, и для этих событий разные варианты действий.
Например: Золотой сет, на ПКМ с предметом в руке одевается, и меняет штаны и нагрудник на золотые, при получении урона отбрасывает по направлению удара с силой в 20% от начальной. Я решил то, что для каждого предмета будет отдельный класс, который наследуется от некоторого абстрактного класса в котором определены методы по типу onRMB, onLMB и т.д. Все классы уник. предм. хранятся в отделном Enum, который уже перехватывает события и выполняет нужные действия в зависимости от предмета.
Вот код:
PHP:
public enum CustomItem implements Listener {
GOLDEN_KIT(new GoldenKit()); // Далее будут прочие предметы
private final AbstractItem obj;
CustomItem(AbstractItem obj) {
this.obj = obj;
getServer().getPluginManager().registerEvents(this, NotBedwars.getInstance());
}
@EventHandler private void onInteract(PlayerInteractEvent ev) {
if (!obj.isHoldingItem(ev.getPlayer())) return;
switch (ev.getAction()) {
case LEFT_CLICK_BLOCK:
case LEFT_CLICK_AIR:
obj.onLMB(ev.getPlayer());
break;
case RIGHT_CLICK_BLOCK:
case RIGHT_CLICK_AIR:
obj.onRMB(ev.getPlayer());
break;
}
}
}
PHP:
abstract class AbstractItem {
static final Plugin plugin = NotBedwars.getInstance();
public final String tag;
AbstractItem(String tag) {
this.tag = tag;
}
static private void notImplemented(Player player) {
player.sendActionBar(Component.text("Не реализованно!", TextColor.color(0xFF2C36), TextDecoration.BOLD));
}
public boolean isNotHoldingItem(Player player) {
return getItemHand(player) == null;
}
public @Nullable MainHand getItemHand(Player player) {
PlayerInventory inv = player.getInventory();
if (isValidItem(inv.getItemInMainHand()))
return player.getMainHand();
if (isValidItem(inv.getItemInOffHand()))
return player.getMainHand() == MainHand.RIGHT ? MainHand.LEFT : MainHand.RIGHT;
return null;
}
public boolean isValidItem(ItemStack item) {
// Проверка
}
public void onRMB(Player player) {}
public void onLMB(Player player) {}
}
PHP:
public class GoldenKit extends AbstractItem {
public GoldenKit() { super("golden_kit"); }
@Override
public void onRMB(Player player) {
player.sendActionBar("Вы кликнули пкм");
}
}
Последнее редактирование: