Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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);
 
Последнее редактирование:
#Резерв

- Добавлены евенты зачарования.
- Исправлена ошибка с LeavesDecayEvent
- Добавлены евенты для Entity
- Добавил немного лайфхаков для новичков.
 
Последнее редактирование:
Добавил евенты для Entity, исправил ошибку!
Добавил LifeХаки
 
Последнее редактирование:
Зачем переизобретать велосипед? Все есть на jd.bukkit.org. Если все очень плохо с английским - есть гугл транслейт.
 
А вот несколько советов от меня.
1. Никогда не храните объект Player где-либо.
2. Если у вас есть список имён игроков и вам надо из них получить Player, не используйте getPlayerExact, проитерируйте через список онлайн игроков сами и вытащите нужных.
3. Никогда не используйте getOfllinePlayer(), ну разве что сильно припёрло.
 
Дело в том что Player - нестабильный объект.
Очень много вещей внутри NMS, тупо делают клон объекта и забивают на старый. И хоть баккит пытается в такие моменты переприсваивть Player чтобы он оставался валидным, это всё равно выйдет вам боком, а вы будете искать странный баг который появляется очень, очень редко.

А этот объект ещё и тянет за собой кучу ссылок, так что в итоге мы помимо багов можем получить ещё и остров занятой фигней памяти.
 
Код:
Player p = sender.getServer().getPlayer(sender.getName());

Не делайте так, команд выполняет не только игрок, но и консоль. А много ли у вас игроков с ником CONSOLE?
Если уж так надо сделать с сендером как с игроком, то лучше так:
Код:
if ((sender instanceof Player )){
Player p = (Player)sender;
......
}
 
3. Никогда не используйте getOfllinePlayer(), ну разве что сильно припёрло.
Не пишите так, пострадаете от тех, кто пишет на scoreboard.
Интересно, какое имя будет у командного блока?
У командного блока будет либо @, либо CONSOLE
Не очень верно. Командный блок может обладать любым именем, которое может быть задано без сторонней помощи просто переименованием на наковальне.
Преобразование свиней в свинозобми при ударе молнии.
 
Не пишите так, пострадаете от тех, кто пишет на scoreboard.


Не очень верно. Командный блок может обладать любым именем, которое может быть задано без сторонней помощи просто переименованием на наковальне.

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


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


Лучше из CraftOfflinePlayer конструировать ручками, а этот метод выкинуть на свалку.
Разные методы. У Вас опечатка. Я имел ввиду getOfflinePlayer, а не список игроков (getOfflinePlayers).
Подобный баг с рефлексиями есть у стрел (Field inGround и inOnGround).
 
Разные методы. У Вас опечатка. Я имел ввиду getOfflinePlayer, а не список игроков (getOfflinePlayers).
Подобный баг с рефлексиями есть у стрел (Field inGround и inOnGround).
getOfflinePlayers итерирует через имена файлов игроков и для каждого имени применяет getOfflinePlayer().
а getOfflinePlayer() как раз с багом.

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

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

Назад
Верх