Помогите реализовать ачивмент!

Всем привет, я начинающий мододел и у меня возникла проблема. Мне нужно чтобы при разрушении блока(руды) (onBlockDestroyedByPlayer) игроку выдавалась ачивка (achievement). Кто может помочь киньте код или ссылку на гайд. Заранее спасибо!:) P.S.Кто даст хороший совет укажу в соавторах мода.
 
1,087
2
Код:
//x,y - это местоположение вышедшей ачивки, display это значок ачивки, parent это родитель ачивки, можно ставить null, name - имя, isSpecial - "Это специальная ачивка?"
    public static Achievement registerNewAchievement(int x, int y,ItemStack display, Achievement parent, String name, boolean isSpecial)
    {
        Achievement beeingRegistered = new Achievement(name, name, x, y, display, parent);
        if(isSpecial)
            beeingRegistered.setSpecial();
        if(parent == null)
            beeingRegistered.initIndependentStat();
        beeingRegistered.registerStat();
        achievementNames.add(name);
        achievementList.put(name, beeingRegistered);
        return beeingRegistered;
    }
    
    public static void registerAchievementStat(Achievement ach)
    {
        AchievementList.achievementList.remove(ach);
    }
    
    public static List<String> achievementNames = new ArrayList<String>();
    public static Hashtable<String, Achievement> achievementList = new Hashtable<String, Achievement>();
UPD: Ачивка появится при появлении предмета в инвентаре, разницы нету особой.
 
Спасибо огромное за ссылки. Но мне конкретно нужно при разрушении блока, разница небольшая но суть ачивки такова что нужно именно разрушить блок, а не при тике предмета. А то што вы посоветовали я уже примерно делал: 
}
public void onUpdate(ItemStack itemstack, World world, Entity entity, int par4, boolean par5) {
int i = (int)entity.posX;
int j = (int)entity.posY;
int k = (int)entity.posZ;

if(true){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).addStat(betterores_getSaphireAchievment.achievement, 1);
}
 

timaxa007

Модератор
5,831
409
672
Можно использовать Эвент или методы из предмета. Типа того:
Эвент:
Код:
@SubscribeEvent
public void breakBlock(BlockEvent.BreakEvent event) {
    if (event.block == Blocks.obsidian) {
        //addStat
    }
}
или в предмете:
Код:
@Override
public boolean onBlockDestroyed(ItemStack is, World world, Block block, int x, int y, int z, EntityLivingBase entity) {
    if (event.block == Blocks.obsidian) {
        //addStat
    }
    return true;
}
 
Спасибо за инфу. Если что буду спрашивать)
[merge_posts_bbcode]Добавлено: 23.02.2016 20:54:39[/merge_posts_bbcode]

И да поскольку я новичок в мододельстве можете мне пояснить что за что отвечает. Типа: [font=monospace, sans-serif]onBlockDestroyed означает то и то, и т.д.[/font]
 

timaxa007

Модератор
5,831
409
672
Метод onBlockDestroyed (в предмете) оно вызывается когда блок уничтожен, в аргументах: предмет который держит в руках выражен в типе ItemStack, уничтоженный блок в типе Block, координаты x, y, z в типе int (уничтоженного блока) и кто уничтожал блок (моб или игрок) в типе EntityLivingBase.
 
EntitylivingBase - это и моб и игрок одновременно? Мне нужен только игрок.
[merge_posts_bbcode]Добавлено: 23.02.2016 21:35:25[/merge_posts_bbcode]

Вот посмотрите, правильный ли код? 
Код:
@Override
public void onBlockDestroyedByPlayer(World world, int i, int j, int k, int l); {
    if (event.block == BlockSaphireOre); {
        //addStat(betterores_getSaphireAchievment.achievement, 1);
    }
    return false;
}
 

timaxa007

Модератор
5,831
409
672
EntitylivingBase - Моб или Игрок. Зависит кто сломал Моб или Игрок.
[merge_posts_bbcode]Добавлено: 23.02.2016 21:36:57[/merge_posts_bbcode]

Код:
if (entity instanceof EntityPlayer)

[merge_posts_bbcode]Добавлено: 23.02.2016 21:39:10[/merge_posts_bbcode]

IronRabbit, Эм... Не-а. Не понятно откуда берёшь переменную event и метод onBlockDestroyedByPlayer.

[merge_posts_bbcode]Добавлено: 23.02.2016 21:40:12[/merge_posts_bbcode]

Хотя нашёл этот метод в Block'е.
[merge_posts_bbcode]Добавлено: 23.02.2016 21:42:22[/merge_posts_bbcode]

В свой блок:
Код:
@Override
public void onBlockDestroyedByPlayer(World world, int x, int y, int z, int metadata) {
    //addStat(betterores_getSaphireAchievment.achievement, 1);
}
[merge_posts_bbcode]Добавлено: 23.02.2016 21:47:49[/merge_posts_bbcode]

И даже не надо делать проверку на свой блок, так как оно как-бы само проверяется, типа.
[merge_posts_bbcode]Добавлено: 23.02.2016 21:52:13[/merge_posts_bbcode]

Если проверять на "if (world.getBlock(x, y, z) == this)", то он покажет отрицательный результат. Так как этот метод (вроде как) вызывается после разрушения, а после остаётся лишь воздух.
 
4,047
63
645
О! Можно я чужой темой воспользуюсь, чтоб свою не создавать? )))

Проблема в странице достижений...
Перекидываю мод на 1.9 и выяснил, что на кастомой странице не видно стрелок, соединяющих дочерние достижения.
Кто-нибудь знает как решить?

Код аналогичен версиям 1.7.10 и 1.8... Вааще без изменений.
 
Сверху