1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Стартап Помощь новичкам и тем, кто мало писал плагины. (+ LifeHack'и)

Тема в разделе "Разработка плагинов для новичков", создана пользователем ANTI_GREEFER, 1 дек 2013.

  1. Автор темы
    ANTI_GREEFER

    ANTI_GREEFER Активный участник Пользователь

    Баллы:
    88
    Всем привет. Я уже как пол года пишу плагины для своего сервера. Работают хорошо xD
    Так вот, тут я буду писать все, что поможет новичкам. (некоторые лайфхаки)

    BlockBreakEvent - вызывается, когда игрок ломает блок.
    BlockBurnEvent - вызывается, когда блок сгорает.
    BlockCanBuildEvent - вызывается, когда мы пытаемся поставить блок, что бы увидеть, можем ли мы это сделать.
    BlockDamageEvent - вызывается, когда блок повредился от игрока
    BlockDispenseEvent - вызывается, когда любая вещь выкидывается из блока (Пример: раздатчик)
    BlockEvent - общий евент.
    BlockExpEvent - вызывается, когда блок дропает опыт.
    BlockFadeEvent - вызывается, когда блок подвергается мировым условиям. (Пример: таяние)
    BlockFormEvent - вызывается, когда блок формируется из-за мировых условий (Пример: замерзание воды)
    BlockFromToEvent - вызывается при растекании лавы/воды и телепортирования яйца ендера.
    BlockGrowEvent - вызывается, когда какой-то блок вырастает. (Например трава, гриб, пшеница)
    BlockIgniteEvent - вызывается, когда блок горит
    BlockPhysicsEvent - вызывается, когда блок подвергается физике (Пример: падение песка)
    BlockPistonEvent - вызывается, когда блок сдвигается поршнем. (Даже сдвиг воздуха)
    BlockPistonExtendEvent, BlockPistonRetractEvent - доп. события поршня
    BlockPlaceEvent - вызывается, когда игрок ставит блок.
    BlockRedstoneEvent - вызывается, когда передается редстоун сигнал.
    BlockSpreadEvent - вызывается, когда блок распространяется по мировым условиям. (Например: распространение огня)
    EntityBlockFormEvent - вызывается, когда Entity формирует какой-то блок
    LeavesDecayEvent - вызывается, когда лианы исчезают самостоятельно
    NotePlayEvent - когда игрок проигрывает звуки на нотном блоке.
    SignChangeEvent - вызывается, когда игрок пишет что-то на табличке.
    EnchantItemEvent - вызывается, когда игрок зачаровал вещь.
    PrepareItemEnchantEvent - вызывается, когда игрок кладет вещь в стол зачарования.
    Внимание! Entity - это падающий блок, игрок, монстр, животное, фаербол и т.д.
    CreatureSpawnEvent - спавн моба в мире
    CreeperPowerEvent - вызывается, когда крипера ударяет молния
    EntityBreakDoorEvent - вызывается, когда Entity ломает дверь
    EntityChangeBlockEvent - вызывается, когда блок меняется в следствии воздействия Entity (Пример: падающий блок превращается в нормальный)
    EntityCombustByBlockEvent - вызывается, когда блок загорается в следствии воздействия Entity
    EntityCombustByEntityEvent - вызывается, когда Entity загорается в следствии воздействия другого Entity
    EntityCombustEvent - вызывается, когда Entity загорается
    EntityCreatePortalEvent - вызывается, когда LivingEntity создает портал в мир. (LivingEntity - моб)
    EntityDamageByBlockEvent - вызывается, когда блок нанес урон какому-то Entity
    EntityDamageByEntityEvent - вызывается, когда Entity наносит урон другому Entity
    EntityDamageEvent - вызывается, когда Entity наносится урон
    EntityDeathEvent - вызывается, когда Entity умирает
    EntityEvent - общий Entity-Event
    EntityExplodeEvent - вызывается, когда Entity взрывается.
    EntityInteractEvent - вызывается, когда Entity взаимодействует с чем-то
    EntityPortalEnterEvent - вызывается, когда Entity входит в портал
    EntityPortalEvent - вызывается, когда любой Entity телепортируется в другой мир через портал (ВСЕ, КРОМЕ ИГРОКА)
    EntityPortalExitEvent - вызывается, когда Entity выходит из портала
    EntityRegainHealthEvent - я точно не понял, для чего это точно, но вроде-бы этот евент хранилище данных для других евентов, который "перевыдают" жизни Entity
    EntityShootBowEvent - вызывается, когда Entity стреляет стрелой
    EntityTameEvent - вызывается, когда Entity приручили
    EntityTargetEvent - вызывается, когда Entity..эмм... как бы это объяснить.. агрится на другой Entity
    EntityTargetLivingEntityEvent - вызывается, когда Entity агрится на LivingEntity
    EntityTeleportEvent - вызывается, когда какой-то Entity телепортируется. (Все Entity, кроме игрока)
    EntityUnleashEvent - кажется, вызывается, когда Entity отвязывают от чего-то. (скорее всего от поводка из новой версии, или как там его :D)
    ExpBottleEvent - вызывается, когда бутыль опыта падает, разбивается, и выплескивает опыт.
    ExplosionPrimeEvent - вызывается, когда Entity решает взорваться
    FoodLevelChangeEvent - вызывается, когда у игрока меняется уровень голода
    HorseJumpEvent - вызывается, когда лошадь прыгает
    ItemDespawnEvent - вызывается, когда выкинутая вещь исчезает через 5 минут
    ItemSpawnEvent - вызывается, когда вещь спавнится в мире
    PigZapEvent - вызывается, когда свинья превращяется в свинозомби из-за удара молнии
    PlayerDeathEvent - вызывается, когда игрок умирает
    PlayerLeashEntityEvent - вызывается, когда игрок привязывает Entity к чему-то(см. выше)
    PotionSplashEvent - вызывается, когда выкинутое зелье падает и взрывается
    ProjectileHitEvent - вызывается, когда Projectile сталкивается с каким-то объектом. (Projectile.. например: стрелы, снежки, фаерболы)
    ProjectileLaunchEvent - вызывается, когда Projectile кидается/запускается
    SheepDyeWoolEvent - вызывается, когда красят шерсть овцы
    SheepRegrowWoolEvent - вызывается, когда у овцы вырастает шерсть.
    SlimeSplitEvent - вызывается, когда слизень распадается на более маленькие части
    Внимание! Не все сразу, это долго писать и переводить с англ. языка.

    --------------

    Первый:
    Многие знают, что плагины умеют обрабатывать команды при помощи события onCommand()
    Так вот, в onCommand() передается sender, но не передается Player, а это часто так необходимо!
    Мы можем получить Player'a вот так:
    Код:
    if ((sender instanceof Player )){
    Player p = (Player) sender;
    }
    else {
    log.info("Эту команду может использовать только игрок");
    }
    
    Тут происходит отделение консоли от игрока. Если команду запустить с консоли, нам выведет ошибку, что это сделать нельзя.
    PS. Если ваша среда разработки ругается на "info.log()", то перед onEnable напишите это:
    Код:
    public static final Logger log = Logger.getLogger("Minecraft");
    
    Второй:
    Мы спавним моба в мире так:
    Код:
    ...getWorld().spawnEntity(Location l, EntityType type);
    Но возвращаемый Entity этой функции не дает полного управление мобом, которого мы заспаунили.
    Как это исправить? Просто! Мы заставим его вернуть LivingEntity, вместо Entity
    Код:
    LivingEntity spawnedmob = (LivingEntity) ...spawnEntity()..;
    После такого мы можем например установить ему кол-во жизней
    Код:
    spawnedmob.setHealth(10);
     
    Последнее редактирование: 2 дек 2013
    xpyctum, Ананасик, MrSharky и 15 другим нравится это.
  2. Автор темы
    ANTI_GREEFER

    ANTI_GREEFER Активный участник Пользователь

    Баллы:
    88
    #Резерв

    - Добавлены евенты зачарования.
    - Исправлена ошибка с LeavesDecayEvent
    - Добавлены евенты для Entity
    - Добавил немного лайфхаков для новичков.
     
    Последнее редактирование: 1 дек 2013
    AngryLogic, DavidShabaev и MrGiffi нравится это.
  3. JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Молодец! Хорошая идея ;)
     
  4. Автор темы
    ANTI_GREEFER

    ANTI_GREEFER Активный участник Пользователь

    Баллы:
    88
    Спасибо!
     
  5. dark32

    dark32 А где твой ТЗ? Пользователь

    Баллы:
    123
    Ошибка, вызывается когда листва исчезает самостоятельно.
     
  6. Автор темы
    ANTI_GREEFER

    ANTI_GREEFER Активный участник Пользователь

    Баллы:
    88
    Спасибо, сейчас исправлю.
    *На подходе евенты для Entity
     
  7. JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Это мне понадобится :)
     
  8. Автор темы
    ANTI_GREEFER

    ANTI_GREEFER Активный участник Пользователь

    Баллы:
    88
    Добавил евенты для Entity, исправил ошибку!
    Добавил LifeХаки
     
    Последнее редактирование: 1 дек 2013
  9. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Интересно, какое имя будет у командного блока?
     
  10. Jampire

    Jampire Старожил Пользователь

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Зачем переизобретать велосипед? Все есть на jd.bukkit.org. Если все очень плохо с английским - есть гугл транслейт.
     
    ptnk и Den_Abr нравится это.
  11. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    А вот несколько советов от меня.
    1. Никогда не храните объект Player где-либо.
    2. Если у вас есть список имён игроков и вам надо из них получить Player, не используйте getPlayerExact, проитерируйте через список онлайн игроков сами и вытащите нужных.
    3. Никогда не используйте getOfllinePlayer(), ну разве что сильно припёрло.
     
  12. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А почему?
     
  13. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Дело в том что Player - нестабильный объект.
    Очень много вещей внутри NMS, тупо делают клон объекта и забивают на старый. И хоть баккит пытается в такие моменты переприсваивть Player чтобы он оставался валидным, это всё равно выйдет вам боком, а вы будете искать странный баг который появляется очень, очень редко.

    А этот объект ещё и тянет за собой кучу ссылок, так что в итоге мы помимо багов можем получить ещё и остров занятой фигней памяти.
     
  14. dark32

    dark32 А где твой ТЗ? Пользователь

    Баллы:
    123
    Не делайте так, команд выполняет не только игрок, но и консоль. А много ли у вас игроков с ником CONSOLE?
    Если уж так надо сделать с сендером как с игроком, то лучше так:
    Код:
    if ((sender instanceof Player )){
    Player p = (Player)sender;
    ......
    }
     
    MrSharky и Den_Abr нравится это.
  15. Автор темы
    ANTI_GREEFER

    ANTI_GREEFER Активный участник Пользователь

    Баллы:
    88
    У командного блока будет либо @, либо CONSOLE
     
  16. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А теперь подумай, что вернёт метод getPlayer() при данной ситуации
     
    ВремяПриключений нравится это.
  17. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Не пишите так, пострадаете от тех, кто пишет на scoreboard.
    Не очень верно. Командный блок может обладать любым именем, которое может быть задано без сторонней помощи просто переименованием на наковальне.
    Преобразование свиней в свинозобми при ударе молнии.
     
  18. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Я же сказал что только если сильно припёрло использовать.
    У меня тут даже темка есть почему:
    http://www.rubukkit.org/threads/Баккит-какого-хрена.53891/


    Лучше из CraftOfflinePlayer конструировать ручками, а этот метод выкинуть на свалку.
     
    ПриветОтМиднайта нравится это.
  19. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Разные методы. У Вас опечатка. Я имел ввиду getOfflinePlayer, а не список игроков (getOfflinePlayers).
    Подобный баг с рефлексиями есть у стрел (Field inGround и inOnGround).
     
  20. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    getOfflinePlayers итерирует через имена файлов игроков и для каждого имени применяет getOfflinePlayer().
    а getOfflinePlayer() как раз с багом.

    Собственно сам баг в том что:
    getOfflinePlayer перед тем как сконструировтаь игрока из CraftOfflinePlayer пытается вернуть закешированное значеие из хэшпама где ключом является LowerCase имя игрока, из-за чего getOfflinePlayer("Test") и getOfflinePlayer("test") вернёт одно и то же, и кто это будет , test или Test непонятно.
     
    fromgate нравится это.

Поделиться этой страницей