Отслеживание надевания и поломки брони

14
0
Пишу фановый мод, одна из его фич - проигрывание звука из нашумевшей вырезки "штаны за 40 гривен" при поломке штанов. По сути, мне нужно лишь знать какой за это отвечает если есть такой, или как минимум как реализовать это внутри tick.
Так же, если это возможно, отследить надевание брони. Если это предмет шапка "228", проиграть определенный звук
 
Используй "TickEvent.PlayerTickEvent", проверяй слоты брони. У штанов - проверяй состояние слота для штанов, создай условия по отслеживания текущей и предыдущей прочности штанов.
[merge_posts_bbcode]Добавлено: 14.08.2015 12:46:34[/merge_posts_bbcode]

XuPoH
1. Ты не указал для какой версии тебе надо.
2. У тебя в посте нету, знаков вопросов. По-этому не очень понятно, что тебе надо и какой тебе дать правильный ответ.
3. От меня не жди помощи.
 
timaxa007 написал(а):
Используй "TickEvent.PlayerTickEvent", проверяй слоты брони. У штанов - проверяй состояние слота для штанов, создай условия по отслеживания текущей и предыдущей прочности штанов.
[merge_posts_bbcode]Добавлено: 14.08.2015 12:46:34[/merge_posts_bbcode]

XuPoH
1. Ты не указал для какой версии тебе надо.
2. У тебя в посте нету, знаков вопросов. По-этому не очень понятно, что тебе надо и какой тебе дать правильный ответ.
3. От меня не жди помощи.
Прошу прощения. Версия 1.7.10. Просьба и вопрос, пожалуй, идентичны. Вы желаете увидеть здесь хоть один вопрос? Вот и он. Благодарю за ответ.
[merge_posts_bbcode]Добавлено: 14.08.2015 15:08:36[/merge_posts_bbcode]

timaxa007 написал(а):
Используй "TickEvent.PlayerTickEvent", проверяй слоты брони. У штанов - проверяй состояние слота для штанов, создай условия по отслеживания текущей и предыдущей прочности штанов.
[merge_posts_bbcode]Добавлено: 14.08.2015 12:46:34[/merge_posts_bbcode]

XuPoH
1. Ты не указал для какой версии тебе надо.
2. У тебя в посте нету, знаков вопросов. По-этому не очень понятно, что тебе надо и какой тебе дать правильный ответ.
3. От меня не жди помощи.
3 пункт ясен, цитирую для тех, кто в танке.
Как подписаться на PlayerTick?
 
Код:
FMLCommonHandler.instance().bus().register(new Event());
Код:
public class Event {

    @SubscribeEvent
    public void actiCon(TickEvent.PlayerTickEvent e) {
        EntityPlayer player = e.player;
        if (player != null) {

        }
    }

}
 
timaxa007 написал(а):
Код:
FMLCommonHandler.instance().bus().register(new Event());
Код:
public class Event {

    @SubscribeEvent
    public void actiCon(TickEvent.PlayerTickEvent e) {
        EntityPlayer player = e.player;
        if (player != null) {

        }
    }

}
Это при использовании предмета, поэксперементируй вообщем-то.
Код:
        if (par1ItemStack != null && par1ItemStack.getItem() == ItemLoader.item_item_100rub) {
            par1ItemStack.stackSize--;
            par2World.playSoundAtEntity(par3EntityPlayer, "random.orb", 1.0F,1.0F);
        }
 
Develance написал(а):
timaxa007 написал(а):
Код:
FMLCommonHandler.instance().bus().register(new Event());
Код:
public class Event {

    @SubscribeEvent
    public void actiCon(TickEvent.PlayerTickEvent e) {
        EntityPlayer player = e.player;
        if (player != null) {

        }
    }

}
Это при использовании предмета, поэксперементируй вообщем-то.
Код:
        if (par1ItemStack != null && par1ItemStack.getItem() == ItemLoader.item_item_100rub) {
            par1ItemStack.stackSize--;
            par2World.playSoundAtEntity(par3EntityPlayer, "random.orb", 1.0F,1.0F);
        }
Код:
public class PlayerEvents {
    // Каждый тик добавляет ненулевые штаны
    ItemArmor lastArmor;
    
    @SubscribeEvent
    public void tickPlayer(PlayerTickEvent e) {
        EntityPlayer player = e.player;

        if (player != null) {
            // Список всего-всего
            ItemStack[] armour = player.inventory.armorInventory;

            if (armour != null) {
                for (int i = 0; i < player.inventory.armorInventory.length; i++) {
                    ItemStack stack = player.inventory.armorInventory[i];
                    
                    // Часть брони не нулевая
                    if (stack != null) {
                        ItemArmor armor = (ItemArmor) stack.getItem();
                        
                        // Это штанишки
                        if (armor.armorType == 2) {
                            lastArmor = armor;
                        }
                    } else {
                        if (lastArmor != null) {
                            System.out.println(lastArmor.getUnlocalizedName() + " has broken!");
                            
                            lastArmor = null;
                        }
                    }
                }
            }
        }
    }
}

Что-то не пашет(
 
Набросал:
Код:
private int last_damage = -1;
private int cooldown228 = 0;
@SubscribeEvent
public void update228(TickEvent.PlayerTickEvent event) {
if (event.side == Side.SERVER) {
EntityPlayer player = event.player;
if (player != null) {
ItemStack head = player.getCurrentArmor(3);
ItemStack body = player.getCurrentArmor(2);
ItemStack legs = player.getCurrentArmor(1);
ItemStack feet = player.getCurrentArmor(0);
//-----------------------------------------
if (legs != null) {
last_damage = legs.getMaxDamage() - legs.getItemDamage();
}

if (legs == null && last_damage == 0) {
player.playSound("modid:pants40", 1.0F, 1.0F);
//System.out.println("pants40");
}

if (legs == null) {
last_damage = -1;
}
//-----------------------------------------
if (head != null && head.getDisplayName().endsWith("228")) {
++cooldown228;
if (cooldown228 > (20 * 60)) {
player.playSound("modid:hat228", 1.0F, 1.0F);
cooldown228 = 0;
//System.out.println("hat228");
}
}
//-----------------------------------------
}
}
}
На клиенте с одним игроком работает нормально (это только набросок).
 
timaxa007 написал(а):
Набросал:
Код:
private int cooldown228 = 0;
public void update228(TickEvent.PlayerTickEvent event) {
if (head != null && head.getDisplayName().endsWith("228")) {
++cooldown228;
if (cooldown228 > (20 * 60)) {
player.playSound("modid:hat228", 1.0F, 1.0F);
cooldown228 = 0;
//System.out.println("hat228");
Загнулся с этих строк.
 
Код:
package ru.XuPoH.funmod;

import java.util.HashMap;
import java.util.Map;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
import cpw.mods.fml.relauncher.Side;

public class PlayerEvents {
    static class ArmorStatus {
        private ItemStack stack;
        private int lastDamage;

        public ArmorStatus(ItemStack stack, int lastDamage) {
            this.stack = stack;
            this.lastDamage = lastDamage;
        }

        public ItemStack getStack() {
            return this.stack;
        }

        public ItemArmor getArmor() {
            if (this.stack == null) {
                return null;
            }

            return (ItemArmor) this.stack.getItem();
        }

        public int getLastDamage() {
            return this.lastDamage;
        }

        public void setLastDamage(int ld) {
            this.lastDamage = ld;
        }

        public void setItemStack(ItemStack stack) {
            this.stack = stack;
        }
    }

    private Map<EntityPlayer, ArmorStatus[]> statuses = new HashMap<EntityPlayer, ArmorStatus[]>();
    
    @SubscribeEvent
    public void onPlayerJoined(PlayerLoggedInEvent event) {
        statuses.put(event.player, new ArmorStatus[4]);
        
        System.out.println("Joined player, put into array! Now stored: " + statuses.size());
    }
    
    @SubscribeEvent
    public void onPlayerQuit(PlayerLoggedOutEvent event) {
        statuses.remove(event.player);
        
        System.out.println("Player left, remove from array! Now stored: " + statuses.size());
    }

    @SubscribeEvent
    public void tickPlayer(PlayerTickEvent event) {
        if (event.side == Side.SERVER) {
            EntityPlayer player = event.player;

            if (player != null) {
                ItemStack[] items = player.inventory.armorInventory;
                ArmorStatus[] localStatuses = new ArmorStatus[4];

                for (int i = 0; i < items.length; ++i) {
                    ItemStack current = items[i];
                    
                    int damage = -1;
                    if (current != null) {
                        damage = current.getMaxDamage() - current.getItemDamage();
                    }
                    
                    localStatuses[i] = new ArmorStatus(current, damage);
                }
                
                statuses.put(player, localStatuses);

                checkStatus(player);
            }
        }
    }

    private void checkStatus(EntityPlayer player) {
        ArmorStatus[] stats = statuses.get(player);
        
        for (int i = 0; i < stats.length; ++i) {
            ArmorStatus status = stats[i];
            
            System.out.println("Armor with #" + i + " has " + status.lastDamage +" (player " + player.getDisplayName());
            
            if (status.getArmor() != null) {
                ItemStack stack = status.getStack();
                status.setLastDamage(stack.getMaxDamage() - stack.getItemDamage());
            }

            if (status.getArmor() == null && status.getLastDamage() == 0) {
                System.err.println("BROKEN!!!!!!!!!!!!!!!!!!!!!!!!! ID " + i);
                
                if (i == 0) {
                    onFeetBroken(player, status.getArmor());
                } else if (i == 1) {
                    onLegsBroken(player, status.getArmor());
                } else if (i == 2) {
                    onBodyBroken(player, status.getArmor());
                } else if (i == 3) {
                    onHelmetBroken(player, status.getArmor());
                }
            }

            if (status.getArmor() == null) {
                status.setLastDamage(-1);
            }

            stats[i] = status;
        }
    }

    private void onHelmetBroken(EntityPlayer player, ItemArmor armor) {

    }

    private void onBodyBroken(EntityPlayer player, ItemArmor armor) {

    }

    private void onLegsBroken(EntityPlayer player, ItemArmor armor) {
        player.playSound(Main.MODID + ":shtany", 1.0F, 1.0F);
    }

    private void onFeetBroken(EntityPlayer player, ItemArmor armor) {

    }
}
 
Назад
Сверху