001    package net.minecraft.village;
002    
003    import java.util.Iterator;
004    import java.util.List;
005    import net.minecraft.entity.EnumCreatureType;
006    import net.minecraft.entity.monster.EntityZombie;
007    import net.minecraft.entity.player.EntityPlayer;
008    import net.minecraft.util.ChunkCoordinates;
009    import net.minecraft.util.MathHelper;
010    import net.minecraft.util.Vec3;
011    import net.minecraft.world.SpawnerAnimals;
012    import net.minecraft.world.World;
013    
014    public 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    }