    001package net.minecraft.util;
    002
    003import java.util.ArrayList;
    004import java.util.Iterator;
    005import java.util.List;
    006import net.minecraft.block.Block;
    007import net.minecraft.entity.Entity;
    008import net.minecraft.entity.EntityLiving;
    009import net.minecraft.entity.player.EntityPlayer;
    010import net.minecraft.item.ItemStack;
    011
    012public class CombatTracker
    013{
    014    private final List field_94556_a = new ArrayList();
    015    private final EntityLiving field_94554_b;
    016    private int field_94555_c = 0;
    017    private boolean field_94552_d = false;
    018    private boolean field_94553_e = false;
    019    private String field_94551_f;
    020
    021    public CombatTracker(EntityLiving par1EntityLiving)
    022    {
    023        this.field_94554_b = par1EntityLiving;
    024    }
    025
    026    public void func_94545_a()
    027    {
    028        this.func_94542_g();
    029
    030        if (this.field_94554_b.isOnLadder())
    031        {
    032            int i = this.field_94554_b.worldObj.getBlockId(MathHelper.floor_double(this.field_94554_b.posX), MathHelper.floor_double(this.field_94554_b.boundingBox.minY), MathHelper.floor_double(this.field_94554_b.posZ));
    033
    034            if (i == Block.ladder.blockID)
    035            {
    036                this.field_94551_f = "ladder";
    037            }
    038            else if (i == Block.vine.blockID)
    039            {
    040                this.field_94551_f = "vines";
    041            }
    042        }
    043        else if (this.field_94554_b.isInWater())
    044        {
    045            this.field_94551_f = "water";
    046        }
    047    }
    048
    049    public void func_94547_a(DamageSource par1DamageSource, int par2, int par3)
    050    {
    051        this.func_94549_h();
    052        this.func_94545_a();
    053        CombatEntry combatentry = new CombatEntry(par1DamageSource, this.field_94554_b.ticksExisted, par2, par3, this.field_94551_f, this.field_94554_b.fallDistance);
    054        this.field_94556_a.add(combatentry);
    055        this.field_94555_c = this.field_94554_b.ticksExisted;
    056        this.field_94553_e = true;
    057        this.field_94552_d |= combatentry.func_94559_f();
    058    }
    059
    060    public String func_94546_b()
    061    {
    062        if (this.field_94556_a.size() == 0)
    063        {
    064            return this.field_94554_b.func_96090_ax() + " died";
    065        }
    066        else
    067        {
    068            CombatEntry combatentry = this.func_94544_f();
    069            CombatEntry combatentry1 = (CombatEntry)this.field_94556_a.get(this.field_94556_a.size() - 1);
    070            String s = "";
    071            String s1 = combatentry1.func_94558_h();
    072            Entity entity = combatentry1.func_94560_a().getEntity();
    073
    074            if (combatentry != null && combatentry1.func_94560_a() == DamageSource.fall)
    075            {
    076                String s2 = combatentry.func_94558_h();
    077
    078                if (combatentry.func_94560_a() != DamageSource.fall && combatentry.func_94560_a() != DamageSource.outOfWorld)
    079                {
    080                    if (s2 != null && (s1 == null || !s2.equals(s1)))
    081                    {
    082                        Entity entity1 = combatentry.func_94560_a().getEntity();
    083                        ItemStack itemstack = entity1 instanceof EntityLiving ? ((EntityLiving)entity1).getHeldItem() : null;
    084
    085                        if (itemstack != null && itemstack.hasDisplayName())
    086                        {
    087                            s = StatCollector.translateToLocalFormatted("death.fell.assist.item", new Object[] {this.field_94554_b.func_96090_ax(), s1, itemstack.getDisplayName()});
    088                        }
    089                        else
    090                        {
    091                            s = StatCollector.translateToLocalFormatted("death.fell.assist", new Object[] {this.field_94554_b.func_96090_ax(), s2});
    092                        }
    093                    }
    094                    else if (s1 != null)
    095                    {
    096                        ItemStack itemstack1 = entity instanceof EntityLiving ? ((EntityLiving)entity).getHeldItem() : null;
    097
    098                        if (itemstack1 != null && itemstack1.hasDisplayName())
    099                        {
    100                            s = StatCollector.translateToLocalFormatted("death.fell.finish.item", new Object[] {this.field_94554_b.func_96090_ax(), s1, itemstack1.getDisplayName()});
    101                        }
    102                        else
    103                        {
    104                            s = StatCollector.translateToLocalFormatted("death.fell.finish", new Object[] {this.field_94554_b.func_96090_ax(), s1});
    105                        }
    106                    }
    107                    else
    108                    {
    109                        s = StatCollector.translateToLocalFormatted("death.fell.killer", new Object[] {this.field_94554_b.func_96090_ax()});
    110                    }
    111                }
    112                else
    113                {
    114                    s = StatCollector.translateToLocalFormatted("death.fell.accident." + this.func_94548_b(combatentry), new Object[] {this.field_94554_b.func_96090_ax()});
    115                }
    116            }
    117            else
    118            {
    119                s = combatentry1.func_94560_a().getDeathMessage(this.field_94554_b);
    120            }
    121
    122            return s;
    123        }
    124    }
    125
    126    public EntityLiving func_94550_c()
    127    {
    128        EntityLiving entityliving = null;
    129        EntityPlayer entityplayer = null;
    130        int i = 0;
    131        int j = 0;
    132        Iterator iterator = this.field_94556_a.iterator();
    133
    134        while (iterator.hasNext())
    135        {
    136            CombatEntry combatentry = (CombatEntry)iterator.next();
    137
    138            if (combatentry.func_94560_a().getEntity() instanceof EntityPlayer && (entityplayer == null || combatentry.func_94563_c() > j))
    139            {
    140                j = combatentry.func_94563_c();
    141                entityplayer = (EntityPlayer)combatentry.func_94560_a().getEntity();
    142            }
    143
    144            if (combatentry.func_94560_a().getEntity() instanceof EntityLiving && (entityliving == null || combatentry.func_94563_c() > i))
    145            {
    146                i = combatentry.func_94563_c();
    147                entityliving = (EntityLiving)combatentry.func_94560_a().getEntity();
    148            }
    149        }
    150
    151        if (entityplayer != null && j >= i / 3)
    152        {
    153            return entityplayer;
    154        }
    155        else
    156        {
    157            return entityliving;
    158        }
    159    }
    160
    161    private CombatEntry func_94544_f()
    162    {
    163        CombatEntry combatentry = null;
    164        CombatEntry combatentry1 = null;
    165        byte b0 = 0;
    166        float f = 0.0F;
    167
    168        for (int i = 0; i < this.field_94556_a.size(); ++i)
    169        {
    170            CombatEntry combatentry2 = (CombatEntry)this.field_94556_a.get(i);
    171            CombatEntry combatentry3 = i > 0 ? (CombatEntry)this.field_94556_a.get(i - 1) : null;
    172
    173            if ((combatentry2.func_94560_a() == DamageSource.fall || combatentry2.func_94560_a() == DamageSource.outOfWorld) && combatentry2.func_94561_i() > 0.0F && (combatentry == null || combatentry2.func_94561_i() > f))
    174            {
    175                if (i > 0)
    176                {
    177                    combatentry = combatentry3;
    178                }
    179                else
    180                {
    181                    combatentry = combatentry2;
    182                }
    183
    184                f = combatentry2.func_94561_i();
    185            }
    186
    187            if (combatentry2.func_94562_g() != null && (combatentry1 == null || combatentry2.func_94563_c() > b0))
    188            {
    189                combatentry1 = combatentry2;
    190            }
    191        }
    192
    193        if (f > 5.0F && combatentry != null)
    194        {
    195            return combatentry;
    196        }
    197        else if (b0 > 5 && combatentry1 != null)
    198        {
    199            return combatentry1;
    200        }
    201        else
    202        {
    203            return null;
    204        }
    205    }
    206
    207    private String func_94548_b(CombatEntry par1CombatEntry)
    208    {
    209        return par1CombatEntry.func_94562_g() == null ? "generic" : par1CombatEntry.func_94562_g();
    210    }
    211
    212    private void func_94542_g()
    213    {
    214        this.field_94551_f = null;
    215    }
    216
    217    private void func_94549_h()
    218    {
    219        int i = this.field_94552_d ? 300 : 100;
    220
    221        if (this.field_94553_e && this.field_94554_b.ticksExisted - this.field_94555_c > i)
    222        {
    223            this.field_94556_a.clear();
    224            this.field_94553_e = false;
    225            this.field_94552_d = false;
    226        }
    227    }
    228}