- Баллы
- 76
Всем привет!
Делаю сохранение, устанавливаемого игроком блока, чтобы после разрушения оного дропом был тот же блок, что был поставлен.
Пример:
Игрок переименовывает булыжник в "булыга" и затем ставит его. Потом он его ломает и ему дропается его "булыга"
В процессе, появилось несколько вопросов:
1. (PlaceEvent) в таком виде сохраняется мета айтема, который держал игрок в руке во время установки? Или "базовая" мета блока?
2. (BreakEvent) Как получить дроп, чтобы дать ему мету?
3. Сильно ли будет грузить сервер сделанный мною Map, если сохранять в него только блоки с кастомной метой?
upd:
- Поправил получение меты для Map (PlaceEvent). Теперь бы понять как получить дропаемый, при разрушенни, блок
- Добавил дополнительные методы во все классы.[!] Понял, что Map blocks уникален для ивентов. Как сделать его общим? (Сделал его статичным)
- Заработало! Кому нужно, можете использовать мой код. Критика кода приветствуется
Делаю сохранение, устанавливаемого игроком блока, чтобы после разрушения оного дропом был тот же блок, что был поставлен.
Пример:
Игрок переименовывает булыжник в "булыга" и затем ставит его. Потом он его ломает и ему дропается его "булыга"
В процессе, появилось несколько вопросов:
1. (PlaceEvent) в таком виде сохраняется мета айтема, который держал игрок в руке во время установки? Или "базовая" мета блока?
2. (BreakEvent) Как получить дроп, чтобы дать ему мету?
3. Сильно ли будет грузить сервер сделанный мною Map, если сохранять в него только блоки с кастомной метой?
PHP:
public class blockPlaceEvent implements Listener {
BlockMap blockMap = new BlockMap();
@EventHandler
public void onPlaceBlock(BlockPlaceEvent e) {
Player p = e.getPlayer();
ItemMeta meta = e.getItemInHand().getItemMeta();
if (uniqueMeta(meta)) {
Location blockLoc = e.getBlock().getLocation();
blockMap.addKey(blockLoc, meta);
}
giver(p); //Выдаёт блок с метой
}
private boolean uniqueMeta(ItemMeta meta) {
return meta.hasLore() || meta.hasDisplayName();
}
PHP:
BlockMap blockMap = new BlockMap();
@EventHandler
public void onBlockBreak(BlockBreakEvent e){
Location loc = e.getBlock().getLocation();
if(blockMap.contKey(loc)){ //Всегда false
e.setDropItems(false);
ItemMeta meta = blockMap.getBlocks().get(loc);
ItemStack drop = new ItemStack(e.getBlock().getType());
drop.setItemMeta(meta);
e.getBlock().getWorld().dropItemNaturally(loc, new ItemStack(drop));
blockMap.removeKey(loc, meta);
}
}
PHP:
public class BlockMap {
static Map<Location, ItemMeta> blocks = new HashMap<>();
public Map<Location, ItemMeta> getBlocks() {
return blocks;
}
public void addKey(Location loc, ItemMeta meta){
blocks.put(loc, meta);
}
public void removeKey(Location loc, ItemMeta meta){
blocks.remove(loc, meta);
}
public boolean contKey(Location loc){
return blocks.containsKey(loc);
}
}
upd:
- Поправил получение меты для Map (PlaceEvent). Теперь бы понять как получить дропаемый, при разрушенни, блок
- Добавил дополнительные методы во все классы.[!] Понял, что Map blocks уникален для ивентов. Как сделать его общим? (Сделал его статичным)
- Заработало! Кому нужно, можете использовать мой код. Критика кода приветствуется
Последнее редактирование: