001package net.minecraft.village;
002
003import java.util.Iterator;
004import java.util.List;
005import net.minecraft.entity.EnumCreatureType;
006import net.minecraft.entity.monster.EntityZombie;
007import net.minecraft.entity.player.EntityPlayer;
008import net.minecraft.util.ChunkCoordinates;
009import net.minecraft.util.MathHelper;
010import net.minecraft.util.Vec3;
011import net.minecraft.world.SpawnerAnimals;
012import net.minecraft.world.World;
013
014public class VillageSiege
015{
016    private World worldObj;
017    private boolean field_75535_b = false;
018    private int field_75536_c = -1;
019    private int field_75533_d;
020    private int field_75534_e;
021
022    /** Instance of Village. */
023    private Village theVillage;
024    private int field_75532_g;
025    private int field_75538_h;
026    private int field_75539_i;
027
028    public VillageSiege(World par1World)
029    {
030        this.worldObj = par1World;
031    }
032
033    /**
034     * Runs a single tick for the village siege
035     */
036    public void tick()
037    {
038        boolean var1 = false;
039
040        if (var1)
041        {
042            if (this.field_75536_c == 2)
043            {
044                this.field_75533_d = 100;
045                return;
046            }
047        }
048        else
049        {
050            if (this.worldObj.isDaytime())
051            {
052                this.field_75536_c = 0;
053                return;
054            }
055
056            if (this.field_75536_c == 2)
057            {
058                return;
059            }
060
061            if (this.field_75536_c == 0)
062            {
063                float var2 = this.worldObj.getCelestialAngle(0.0F);
064
065                if ((double)var2 < 0.5D || (double)var2 > 0.501D)
066                {
067                    return;
068                }
069
070                this.field_75536_c = this.worldObj.rand.nextInt(10) == 0 ? 1 : 2;
071                this.field_75535_b = false;
072
073                if (this.field_75536_c == 2)
074                {
075                    return;
076                }
077            }
078        }
079
080        if (!this.field_75535_b)
081        {
082            if (!this.func_75529_b())
083            {
084                return;
085            }
086
087            this.field_75535_b = true;
088        }
089
090        if (this.field_75534_e > 0)
091        {
092            --this.field_75534_e;
093        }
094        else
095        {
096            this.field_75534_e = 2;
097
098            if (this.field_75533_d > 0)
099            {
100                this.spawnZombie();
101                --this.field_75533_d;
102            }
103            else
104            {
105                this.field_75536_c = 2;
106            }
107        }
108    }
109
110    private boolean func_75529_b()
111    {
112        List var1 = this.worldObj.playerEntities;
113        Iterator var2 = var1.iterator();
114
115        while (var2.hasNext())
116        {
117            EntityPlayer var3 = (EntityPlayer)var2.next();
118            this.theVillage = this.worldObj.villageCollectionObj.findNearestVillage((int)var3.posX, (int)var3.posY, (int)var3.posZ, 1);
119
120            if (this.theVillage != null && this.theVillage.getNumVillageDoors() >= 10 && this.theVillage.getTicksSinceLastDoorAdding() >= 20 && this.theVillage.getNumVillagers() >= 20)
121            {
122                ChunkCoordinates var4 = this.theVillage.getCenter();
123                float var5 = (float)this.theVillage.getVillageRadius();
124                boolean var6 = false;
125                int var7 = 0;
126
127                while (true)
128                {
129                    if (var7 < 10)
130                    {
131                        this.field_75532_g = var4.posX + (int)((double)(MathHelper.cos(this.worldObj.rand.nextFloat() * (float)Math.PI * 2.0F) * var5) * 0.9D);
132                        this.field_75538_h = var4.posY;
133                        this.field_75539_i = var4.posZ + (int)((double)(MathHelper.sin(this.worldObj.rand.nextFloat() * (float)Math.PI * 2.0F) * var5) * 0.9D);
134                        var6 = false;
135                        Iterator var8 = this.worldObj.villageCollectionObj.getVillageList().iterator();
136
137                        while (var8.hasNext())
138                        {
139                            Village var9 = (Village)var8.next();
140
141                            if (var9 != this.theVillage && var9.isInRange(this.field_75532_g, this.field_75538_h, this.field_75539_i))
142                            {
143                                var6 = true;
144                                break;
145                            }
146                        }
147
148                        if (var6)
149                        {
150                            ++var7;
151                            continue;
152                        }
153                    }
154
155                    if (var6)
156                    {
157                        return false;
158                    }
159
160                    Vec3 var10 = this.func_75527_a(this.field_75532_g, this.field_75538_h, this.field_75539_i);
161
162                    if (var10 != null)
163                    {
164                        this.field_75534_e = 0;
165                        this.field_75533_d = 20;
166                        return true;
167                    }
168
169                    break;
170                }
171            }
172        }
173
174        return false;
175    }
176
177    private boolean spawnZombie()
178    {
179        Vec3 var1 = this.func_75527_a(this.field_75532_g, this.field_75538_h, this.field_75539_i);
180
181        if (var1 == null)
182        {
183            return false;
184        }
185        else
186        {
187            EntityZombie var2;
188
189            try
190            {
191                var2 = new EntityZombie(this.worldObj);
192                var2.initCreature();
193                var2.setVillager(false);
194            }
195            catch (Exception var4)
196            {
197                var4.printStackTrace();
198                return false;
199            }
200
201            var2.setLocationAndAngles(var1.xCoord, var1.yCoord, var1.zCoord, this.worldObj.rand.nextFloat() * 360.0F, 0.0F);
202            this.worldObj.spawnEntityInWorld(var2);
203            ChunkCoordinates var3 = this.theVillage.getCenter();
204            var2.setHomeArea(var3.posX, var3.posY, var3.posZ, this.theVillage.getVillageRadius());
205            return true;
206        }
207    }
208
209    private Vec3 func_75527_a(int par1, int par2, int par3)
210    {
211        for (int var4 = 0; var4 < 10; ++var4)
212        {
213            int var5 = par1 + this.worldObj.rand.nextInt(16) - 8;
214            int var6 = par2 + this.worldObj.rand.nextInt(6) - 3;
215            int var7 = par3 + this.worldObj.rand.nextInt(16) - 8;
216
217            if (this.theVillage.isInRange(var5, var6, var7) && SpawnerAnimals.canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, this.worldObj, var5, var6, var7))
218            {
219                this.worldObj.getWorldVec3Pool().getVecFromPool((double)var5, (double)var6, (double)var7);
220            }
221        }
222
223        return null;
224    }
225}