From ad930fcbdc7a51c76176cef4f6e915144611e5e5 Mon Sep 17 00:00:00 2001 From: Sen Date: Sun, 15 Jun 2025 01:06:10 +0200 Subject: [PATCH 1/2] add foxes, temp textures --- .../main/java/client/init/RenderRegistry.java | 3 + .../client/renderer/entity/RenderFox.java | 20 +++ .../java/client/renderer/model/ModelWolf.java | 18 +-- .../main/resources/textures/entity/fox.png | Bin 0 -> 13980 bytes .../java/common/entity/animal/EntityFox.java | 115 ++++++++++++++++++ .../main/java/common/init/EntityRegistry.java | 2 + 6 files changed, 150 insertions(+), 8 deletions(-) create mode 100644 client/src/main/java/client/renderer/entity/RenderFox.java create mode 100755 client/src/main/resources/textures/entity/fox.png create mode 100644 common/src/main/java/common/entity/animal/EntityFox.java diff --git a/client/src/main/java/client/init/RenderRegistry.java b/client/src/main/java/client/init/RenderRegistry.java index 8445a62..1224082 100644 --- a/client/src/main/java/client/init/RenderRegistry.java +++ b/client/src/main/java/client/init/RenderRegistry.java @@ -21,6 +21,7 @@ import client.renderer.entity.RenderFallingBlock; import client.renderer.entity.RenderFireball; import client.renderer.entity.RenderFish; import client.renderer.entity.RenderFlyingBox; +import client.renderer.entity.RenderFox; import client.renderer.entity.RenderHorse; import client.renderer.entity.RenderHumanoid; import client.renderer.entity.RenderItem; @@ -68,6 +69,7 @@ import common.entity.animal.EntityBat; import common.entity.animal.EntityChicken; import common.entity.animal.EntityCow; import common.entity.animal.EntityDragon; +import common.entity.animal.EntityFox; import common.entity.animal.EntityHorse; import common.entity.animal.EntityMooshroom; import common.entity.animal.EntityMouse; @@ -116,6 +118,7 @@ public abstract class RenderRegistry { map.put(EntityCow.class, new RenderCow(mgr, new ModelCow())); map.put(EntityMooshroom.class, new RenderMooshroom(mgr, new ModelCow())); map.put(EntityWolf.class, new RenderWolf(mgr, new ModelWolf())); + map.put(EntityFox.class, new RenderFox(mgr, new ModelWolf())); map.put(EntityChicken.class, new RenderChicken(mgr, new ModelChicken())); map.put(EntityOcelot.class, new RenderOcelot(mgr, new ModelOcelot())); map.put(EntityRabbit.class, new RenderRabbit(mgr, new ModelRabbit())); diff --git a/client/src/main/java/client/renderer/entity/RenderFox.java b/client/src/main/java/client/renderer/entity/RenderFox.java new file mode 100644 index 0000000..ebcf25f --- /dev/null +++ b/client/src/main/java/client/renderer/entity/RenderFox.java @@ -0,0 +1,20 @@ +package client.renderer.entity; + +import client.renderer.model.ModelBase; +import common.entity.animal.EntityFox; + +public class RenderFox extends RenderLiving { + private static final String FOX_TEXTURE = "textures/entity/fox.png"; + + public RenderFox(RenderManager renderManagerIn, ModelBase modelBaseIn) { + super(renderManagerIn, modelBaseIn); + } + + protected float handleRotationFloat(EntityFox livingBase, float partialTicks) { + return (float)Math.PI / 5F; + } + + protected String getEntityTexture(EntityFox entity) { + return FOX_TEXTURE; + } +} diff --git a/client/src/main/java/client/renderer/model/ModelWolf.java b/client/src/main/java/client/renderer/model/ModelWolf.java index 7bb6909..3b81da7 100755 --- a/client/src/main/java/client/renderer/model/ModelWolf.java +++ b/client/src/main/java/client/renderer/model/ModelWolf.java @@ -110,11 +110,11 @@ public class ModelWolf extends ModelBase * Used for easily adding entity-dependent animations. The second and third float params here are the same second * and third as in the setRotationAngles method. */ - public void setLivingAnimations(EntityLiving entitylivingbaseIn, float p_78086_2_, float p_78086_3_, float partialTickTime) + public void setLivingAnimations(EntityLiving living, float p_78086_2_, float p_78086_3_, float partialTickTime) { - EntityWolf entitywolf = (EntityWolf)entitylivingbaseIn; + EntityWolf wolf = living instanceof EntityWolf ? (EntityWolf)living : null; - if (entitywolf.isAngry()) + if (wolf != null && wolf.isAngry()) { this.wolfTail.rotateAngleY = 0.0F; } @@ -123,7 +123,7 @@ public class ModelWolf extends ModelBase this.wolfTail.rotateAngleY = ExtMath.cos(p_78086_2_ * 0.6662F) * 1.4F * p_78086_3_; } - if (entitywolf.isSitting()) + if (wolf != null && wolf.isSitting()) { this.wolfMane.setRotationPoint(-1.0F, 16.0F, -3.0F); this.wolfMane.rotateAngleX = ((float)Math.PI * 2F / 5F); @@ -157,10 +157,12 @@ public class ModelWolf extends ModelBase this.wolfLeg4.rotateAngleX = ExtMath.cos(p_78086_2_ * 0.6662F) * 1.4F * p_78086_3_; } - this.wolfHeadMain.rotateAngleZ = entitywolf.getInterestedAngle(partialTickTime) + entitywolf.getShakeAngle(partialTickTime, 0.0F); - this.wolfMane.rotateAngleZ = entitywolf.getShakeAngle(partialTickTime, -0.08F); - this.wolfBody.rotateAngleZ = entitywolf.getShakeAngle(partialTickTime, -0.16F); - this.wolfTail.rotateAngleZ = entitywolf.getShakeAngle(partialTickTime, -0.2F); + if(wolf != null) { + this.wolfHeadMain.rotateAngleZ = wolf.getInterestedAngle(partialTickTime) + wolf.getShakeAngle(partialTickTime, 0.0F); + this.wolfMane.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.08F); + this.wolfBody.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.16F); + this.wolfTail.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.2F); + } } /** diff --git a/client/src/main/resources/textures/entity/fox.png b/client/src/main/resources/textures/entity/fox.png new file mode 100755 index 0000000000000000000000000000000000000000..0ca12a099b4a34cffab6ee0d85a22964f7287054 GIT binary patch literal 13980 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 literal 0 HcmV?d00001 diff --git a/common/src/main/java/common/entity/animal/EntityFox.java b/common/src/main/java/common/entity/animal/EntityFox.java new file mode 100644 index 0000000..12fc7c7 --- /dev/null +++ b/common/src/main/java/common/entity/animal/EntityFox.java @@ -0,0 +1,115 @@ +package common.entity.animal; + +import common.ai.EntityAIAttackOnCollide; +import common.ai.EntityAIHurtByTarget; +import common.ai.EntityAILeapAtTarget; +import common.ai.EntityAILookIdle; +import common.ai.EntityAIMate; +import common.ai.EntityAISwimming; +import common.ai.EntityAIWander; +import common.ai.EntityAIWatchClosest; +import common.attributes.Attribute; +import common.entity.DamageSource; +import common.entity.Entity; +import common.entity.npc.Alignment; +import common.entity.types.EntityAnimal; +import common.entity.types.EntityLiving; +import common.init.Items; +import common.init.SoundEvent; +import common.item.Item; +import common.item.ItemStack; +import common.pathfinding.PathNavigateGround; +import common.vars.Vars; +import common.world.World; + +public class EntityFox extends EntityAnimal +{ + public EntityFox(World worldIn) + { + super(worldIn); + this.setSize(0.6F, 0.8F); + ((PathNavigateGround)this.getNavigator()).setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, null, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targets.addTask(3, new EntityAIHurtByTarget(this, true)); +// this.targets.addTask(5, new EntityAINearestAttackableTarget(this, EntityUndead.class, false)); + } + + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + this.getEntityAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.35D); + + this.setMaxHealth(6); + + this.getAttributeMap().registerAttribute(Attribute.ATTACK_DAMAGE); + this.getEntityAttribute(Attribute.ATTACK_DAMAGE).setBaseValue(2.0D); + } + + protected SoundEvent getHurtSound() + { + return SoundEvent.WOLF_HURT; + } + + protected SoundEvent getDeathSound() + { + return SoundEvent.WOLF_DEATH; + } + + protected float getSoundVolume() + { + return 0.4F; + } + + protected Item getDropItem() + { + return null; + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + public boolean attackEntityAsMob(Entity entityIn) + { + if(!this.worldObj.client && !Vars.damageMobs) + return false; + boolean flag = entityIn.attackEntityFrom(DamageSource.causeMobDamage(this), ((int)this.getEntityAttribute(Attribute.ATTACK_DAMAGE).getAttributeValue())); + + if (flag) + { + this.applyEnchantments(this, entityIn); + } + + return flag; + } + + public boolean isBreedingItem(ItemStack stack) + { + return stack != null && stack.getItem() == Items.apple; + } + + public int getMaxChunkSpawns() + { + return 6; + } + + public EntityFox createChild(EntityLiving ageable) + { + return new EntityFox(this.worldObj); + } + + public int getColor() { + return 0xc35d00; + } + + public Alignment getAlignment() { + return Alignment.LAWFUL; + } +} diff --git a/common/src/main/java/common/init/EntityRegistry.java b/common/src/main/java/common/init/EntityRegistry.java index 6fe113e..e0c9b95 100755 --- a/common/src/main/java/common/init/EntityRegistry.java +++ b/common/src/main/java/common/init/EntityRegistry.java @@ -9,6 +9,7 @@ import common.entity.animal.EntityBat; import common.entity.animal.EntityChicken; import common.entity.animal.EntityCow; import common.entity.animal.EntityDragon; +import common.entity.animal.EntityFox; import common.entity.animal.EntityHorse; import common.entity.animal.EntityMooshroom; import common.entity.animal.EntityMouse; @@ -262,6 +263,7 @@ public abstract class EntityRegistry { registerEntity("Horse", EntityHorse.class, "terra", "Pferd", 12623485, 15656192); registerEntity("Rabbit", EntityRabbit.class, "terra", "Kaninchen", 10051392, 7555121); registerEntity("Mouse", EntityMouse.class, "terra", "Maus", 0x606060, 0xb0b0b0); + registerEntity("Fox", EntityFox.class, "terra", "Fuchs", 0xae5300, 0x622f00); for(int z = 0; z < SpeciesRegistry.SPECIMEN.size(); z++) { SpeciesInfo info = SpeciesRegistry.SPECIMEN.get(z); From 339a7679f7058e98afe5e5a5d03475939d230ad6 Mon Sep 17 00:00:00 2001 From: Sen Date: Sun, 15 Jun 2025 13:15:24 +0200 Subject: [PATCH 2/2] add foxes, complete texture --- .../main/java/client/init/RenderRegistry.java | 3 +- .../client/renderer/entity/RenderFox.java | 4 - .../java/client/renderer/model/ModelFox.java | 97 ++++++++++++++++++ .../java/client/renderer/model/ModelWolf.java | 16 ++- .../src/main/resources/sounds/fox_death.ogg | Bin 0 -> 5558 bytes .../src/main/resources/sounds/fox_hurt1.ogg | Bin 0 -> 4838 bytes .../src/main/resources/sounds/fox_hurt2.ogg | Bin 0 -> 4741 bytes .../main/resources/textures/entity/fox.png | Bin 13980 -> 11824 bytes .../common/entity/animal/EntityDragon.java | 5 + .../java/common/entity/animal/EntityFox.java | 15 ++- .../common/entity/animal/EntityRabbit.java | 4 + .../java/common/entity/animal/EntityWolf.java | 31 +----- .../java/common/entity/npc/EntityNPC.java | 4 + .../common/entity/types/EntityLiving.java | 17 +-- .../src/main/java/common/init/SoundEvent.java | 3 + .../main/java/server/biome/BiomeForest.java | 6 +- 16 files changed, 138 insertions(+), 67 deletions(-) create mode 100644 client/src/main/java/client/renderer/model/ModelFox.java create mode 100644 client/src/main/resources/sounds/fox_death.ogg create mode 100644 client/src/main/resources/sounds/fox_hurt1.ogg create mode 100644 client/src/main/resources/sounds/fox_hurt2.ogg diff --git a/client/src/main/java/client/init/RenderRegistry.java b/client/src/main/java/client/init/RenderRegistry.java index 1224082..254989d 100644 --- a/client/src/main/java/client/init/RenderRegistry.java +++ b/client/src/main/java/client/init/RenderRegistry.java @@ -47,6 +47,7 @@ import client.renderer.entity.RenderWolf; import client.renderer.entity.RenderXpOrb; import client.renderer.model.ModelChicken; import client.renderer.model.ModelCow; +import client.renderer.model.ModelFox; import client.renderer.model.ModelHorse; import client.renderer.model.ModelMouse; import client.renderer.model.ModelOcelot; @@ -118,7 +119,7 @@ public abstract class RenderRegistry { map.put(EntityCow.class, new RenderCow(mgr, new ModelCow())); map.put(EntityMooshroom.class, new RenderMooshroom(mgr, new ModelCow())); map.put(EntityWolf.class, new RenderWolf(mgr, new ModelWolf())); - map.put(EntityFox.class, new RenderFox(mgr, new ModelWolf())); + map.put(EntityFox.class, new RenderFox(mgr, new ModelFox())); map.put(EntityChicken.class, new RenderChicken(mgr, new ModelChicken())); map.put(EntityOcelot.class, new RenderOcelot(mgr, new ModelOcelot())); map.put(EntityRabbit.class, new RenderRabbit(mgr, new ModelRabbit())); diff --git a/client/src/main/java/client/renderer/entity/RenderFox.java b/client/src/main/java/client/renderer/entity/RenderFox.java index ebcf25f..d3bc73b 100644 --- a/client/src/main/java/client/renderer/entity/RenderFox.java +++ b/client/src/main/java/client/renderer/entity/RenderFox.java @@ -10,10 +10,6 @@ public class RenderFox extends RenderLiving { super(renderManagerIn, modelBaseIn); } - protected float handleRotationFloat(EntityFox livingBase, float partialTicks) { - return (float)Math.PI / 5F; - } - protected String getEntityTexture(EntityFox entity) { return FOX_TEXTURE; } diff --git a/client/src/main/java/client/renderer/model/ModelFox.java b/client/src/main/java/client/renderer/model/ModelFox.java new file mode 100644 index 0000000..cedf720 --- /dev/null +++ b/client/src/main/java/client/renderer/model/ModelFox.java @@ -0,0 +1,97 @@ +package client.renderer.model; + +import org.lwjgl.opengl.GL11; + +import common.entity.Entity; +import common.util.ExtMath; + +public class ModelFox extends ModelBase +{ + private final ModelRenderer head; + private final ModelRenderer body; + private final ModelRenderer wolfLeg1; + private final ModelRenderer wolfLeg2; + private final ModelRenderer wolfLeg3; + private final ModelRenderer wolfLeg4; + private final ModelRenderer tail; + + public ModelFox() + { + float f = 0.0F; + this.head = new ModelRenderer(this, 0, 0); + this.head.addBox(-3.0F, -3.0F, -2.0F, 6, 6, 4, f); + this.head.setRotationPoint(-1.0F, 15.5F, -7.0F); + this.body = new ModelRenderer(this, 24, 0); + this.body.addBox(-3.5F, -2.0F, -2.0F, 5, 13, 5, f); + this.body.setRotationPoint(0.0F, 16.0F, -4.0F); + this.wolfLeg1 = new ModelRenderer(this, 0, 18); + this.wolfLeg1.addBox(-1.0F, 0.0F, -1.0F, 2, 6, 2, f); + this.wolfLeg1.setRotationPoint(-2.49F, 18.0F, 5.0F); + this.wolfLeg2 = new ModelRenderer(this, 0, 18); + this.wolfLeg2.addBox(-1.0F, 0.0F, -1.0F, 2, 6, 2, f); + this.wolfLeg2.setRotationPoint(0.49F, 18.0F, 5.0F); + this.wolfLeg3 = new ModelRenderer(this, 0, 18); + this.wolfLeg3.addBox(-1.0F, 0.0F, -1.0F, 2, 6, 2, f); + this.wolfLeg3.setRotationPoint(-2.49F, 18.0F, -4.0F); + this.wolfLeg4 = new ModelRenderer(this, 0, 18); + this.wolfLeg4.addBox(-1.0F, 0.0F, -1.0F, 2, 6, 2, f); + this.wolfLeg4.setRotationPoint(0.49F, 18.0F, -4.0F); + this.tail = new ModelRenderer(this, 9, 18); + this.tail.addBox(-1.5F, 0.0F, -1.0F, 3, 10, 3, f); + this.tail.setRotationPoint(-1.0F, 15.0F, 6.0F); + this.head.setTextureOffset(16, 14).addBox(-3.15F, -4.35F, 0.0F, 2, 2, 1, f); + this.head.setTextureOffset(16, 14).addBox(1.15F, -4.35F, 0.0F, 2, 2, 1, f); + this.head.setTextureOffset(0, 10).addBox(-1.5F, 0.0F, -5.0F, 3, 2, 4, f); + this.head.setTextureOffset(16, 11).addBox(-3.15F, -5.35F, 0.0F, 1, 1, 1, f); + this.head.setTextureOffset(16, 11).addBox(2.15F, -5.35F, 0.0F, 1, 1, 1, f); + } + + public void render(Entity entityIn, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_, float p_78088_6_, float scale) + { + super.render(entityIn, p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, scale); + this.setRotationAngles(p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, scale, entityIn); + + if (this.isChild) + { + float f = 2.0F; + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 3.5F * scale, 2.0F * scale); + this.head.renderWithRotation(scale); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(1.0F / f, 1.0F / f, 1.0F / f); + GL11.glTranslatef(0.0F, 24.0F * scale, 0.0F); + this.body.render(scale); + this.wolfLeg1.render(scale); + this.wolfLeg2.render(scale); + this.wolfLeg3.render(scale); + this.wolfLeg4.render(scale); + this.tail.renderWithRotation(scale); + GL11.glPopMatrix(); + } + else + { + this.head.renderWithRotation(scale); + this.body.render(scale); + this.wolfLeg1.render(scale); + this.wolfLeg2.render(scale); + this.wolfLeg3.render(scale); + this.wolfLeg4.render(scale); + this.tail.renderWithRotation(scale); + } + } + + public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) + { + super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor, entityIn); + this.tail.rotateAngleY = ExtMath.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.body.rotateAngleX = ((float)Math.PI / 2F); + this.wolfLeg1.rotateAngleX = ExtMath.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.wolfLeg2.rotateAngleX = ExtMath.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; + this.wolfLeg3.rotateAngleX = ExtMath.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount; + this.wolfLeg4.rotateAngleX = ExtMath.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; + this.head.rotateAngleX = headPitch / (180F / (float)Math.PI); + this.head.rotateAngleY = netHeadYaw / (180F / (float)Math.PI); + this.tail.rotateAngleX = (float)Math.PI / 2.5F; + } +} diff --git a/client/src/main/java/client/renderer/model/ModelWolf.java b/client/src/main/java/client/renderer/model/ModelWolf.java index 3b81da7..35d8eb2 100755 --- a/client/src/main/java/client/renderer/model/ModelWolf.java +++ b/client/src/main/java/client/renderer/model/ModelWolf.java @@ -112,9 +112,9 @@ public class ModelWolf extends ModelBase */ public void setLivingAnimations(EntityLiving living, float p_78086_2_, float p_78086_3_, float partialTickTime) { - EntityWolf wolf = living instanceof EntityWolf ? (EntityWolf)living : null; + EntityWolf wolf = (EntityWolf)living; - if (wolf != null && wolf.isAngry()) + if (wolf.isAngry()) { this.wolfTail.rotateAngleY = 0.0F; } @@ -123,7 +123,7 @@ public class ModelWolf extends ModelBase this.wolfTail.rotateAngleY = ExtMath.cos(p_78086_2_ * 0.6662F) * 1.4F * p_78086_3_; } - if (wolf != null && wolf.isSitting()) + if (wolf.isSitting()) { this.wolfMane.setRotationPoint(-1.0F, 16.0F, -3.0F); this.wolfMane.rotateAngleX = ((float)Math.PI * 2F / 5F); @@ -157,12 +157,10 @@ public class ModelWolf extends ModelBase this.wolfLeg4.rotateAngleX = ExtMath.cos(p_78086_2_ * 0.6662F) * 1.4F * p_78086_3_; } - if(wolf != null) { - this.wolfHeadMain.rotateAngleZ = wolf.getInterestedAngle(partialTickTime) + wolf.getShakeAngle(partialTickTime, 0.0F); - this.wolfMane.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.08F); - this.wolfBody.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.16F); - this.wolfTail.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.2F); - } + this.wolfHeadMain.rotateAngleZ = wolf.getInterestedAngle(partialTickTime) + wolf.getShakeAngle(partialTickTime, 0.0F); + this.wolfMane.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.08F); + this.wolfBody.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.16F); + this.wolfTail.rotateAngleZ = wolf.getShakeAngle(partialTickTime, -0.2F); } /** diff --git a/client/src/main/resources/sounds/fox_death.ogg b/client/src/main/resources/sounds/fox_death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..661933821d387483818555a36aab28cfa30b5a17 GIT binary patch literal 5558 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 literal 0 HcmV?d00001 diff --git a/client/src/main/resources/sounds/fox_hurt1.ogg b/client/src/main/resources/sounds/fox_hurt1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..52b1335449335af14dccb3e558aebc987f14676b GIT binary patch literal 4838 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 b&YaSObd!qulEUa-mX+$=6+2|`O)CEd@nF;@ literal 0 HcmV?d00001 diff --git a/client/src/main/resources/textures/entity/fox.png b/client/src/main/resources/textures/entity/fox.png index 0ca12a099b4a34cffab6ee0d85a22964f7287054..61ee1a8fe3e487ffb06d2a073e7f828902a486c8 100755 GIT binary patch delta 8292 zcmV-qAe-NuZLnOBBYzpYdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O3;smK`~A zh5us}T0+7D%Yi*dJJ9m=-N;u()0C!Ln&yy2K9dQAxh9a~&VT*qb^pPCCFSN)uC4S^ z9{x)`^)UELd*1(s{pp`%f7*ZP^A`X9<#iXn-Uz%D`5E7Twtw>Z{MYOL`vUKe!Qb*v z7i#PC#{Bh-{<(E%zg_5aqo@^W75j6c{<%;L?;HMef$?tZDZSO7w=mE9bARomy}zCQ zDE_IRi@jg|?cb>qy`8yF4B#XRWPb&WUp?_bp^8L5pvh|f<_j|Td_{L-zrKE^ zukVU}i@tu}yW6!rvx|`mp)Q|IeQnYH#^)xt(5;(eX@wjWYN+v3zdFAfRlO*M{j6v5 zYx(X2>AF7o?T5eq*w5t`OHARoQ29#;D@1#-#Tt58QGfYM`sHt^vBw=7NnUT-WB6W+ zx7+q-IlEiq&fD|R;JKLREC2YH`=?*HSFPZ^V%gqUv91slY?h(S=}$gJM*RH*HCuqc ze*ONR@*2rtR+QBuoxslb5;OZBNDwX2kq>5mzCGyc{#<|%aqG-td?W*8jZX0Dt`MsC z1hSE!!GF?2Okt7%pL5tOGNc#_xoJVS<}20PM?((0?06k8BNLg9tK_D~L9$ZH)K5)~ z8X7s~lyfe*=9YUNC6-ijDWw*H;;6AES92}3)>eBREw6ZQf6Cex4K2&q+l3116X`zQKXZ=TDlG}hTwa?c-#a6P@9r~Byk~@| zH+s;YclTT---s)ALrd|S{!H`6x%TG6Vch~X^;_ea`8WmG&sGP&dkQ}6nohg3pIM&! z)Oe|E`xwp02(rNmj!bg6P3t`c*fv5iwmcI zoP0g<$vC->UGnCg>YRIwy&_=7N-H~HU!}}Z(jK`~#mT2WH)T8=>1zO(^5!jX536OZ zEAN1IxP+5LQ67hFv5*VT6nN!UPa1gBGFn-Y;d!;>kDc>PW0rdsHCDAycDrgJva1kM zC7Qs1nq)Yyb@!oSXI;zP9CA_{EPorb zpTVBkhSN$m8P?A?721LzT5t8>h?^U?Q zX@h#Ig+*p=S!ni6)uNZ?J}3Ly?;5n??CTO}+Jfa@cx}(Ue_W=MyL4&i8-H2(*&tWm z)U0oVul7LW#-0fXNo;X-z8eXCb9|J(1`GJiq-9l$g=RXtkLkT{1>)&n*|VZT z>x}zQ+k7D%F0g3msrCa|w+A(^=hh3*K;k6uNN*6pyE3(J*RKXab<)@`GOS2BM*2fp z3iB+WiqevH64I$~f?JDfENAXCDd|lyp2N456zZba&9*41&m}v_<$sMl4)L&_SYGc> zR&+MtldM%6J22QizP$i3&LmI=-f6Yo3FJ=0&>iN|Pd4(ofuj%0*}ETFq0F*Ey`CP- zBpSlyZcvxdI<1-SLo!c!;kdlFDwSpQaa{+}?2TUSjpi$fS$Pna9LX?S1E<>IH7)^- zlxn*xv`5af)-t%}c7MkB{63dKl-9tI?$v>qt6#iOs~*V<@P?^km9{7UW$VP z0x9?OsV-jhnVJmh>Oqhi^v8PnmW2Ygfjz-_a-e2&^w%7j>VJaX;vxX83q#tTR0`0P zsj-KCthrn;8w@*qkkn9S{p%;#=fD(dh{TDiat&jrg9vzzsO|O<5|jpIgK$PZl_uWl zQK1Ai`K1zkn8WoAR`5U4T9;M{O{rrjlg1(n$jIjjvKDj{j>b*VGQg|~M(EjQPOOLw z(h~h3SXe*dMSrlQe1Hgq(Y?qf`ontnLsB3O_8Ei11|9+?v;E%VeIb21Sn9I z6RbDI(R?yM?M7P!IY$B4sal4zRqH^+(N44k*(j2FJ-KDQ+>$r7Wn>pW3S*D`AWDfM z=#dmun16^1a`oq>-o4m5^$4rFA>^ap5RSWyj?+aro_;$tgk#)9GywUlW^4E&R3vpk za}l7@_v(=e(|Sr)C?(eL{?!1I0_&}tT?eI?$RaDVYJM?TxF)8MYydDaLJQ&9Cp)2p zs4k$BbRu6D)kQ2MX`#mYJzw~i+=;D9Ka)sGfZPKP;M;-TnWrv6i^+q zD5RcGw5>uOuMlIms0q+y#8zEfqoK0%oR{Ab5r?h=9K)CyS&E=JdDKL7Z1V^g({^i8 z>$iE@l3a2(hag_;1jKl2dLk98^b36o`1%5AqO5eU44R&2zA}#v?8U8-uH~EEcM0UHibrwdi+Bx?MhgA`3 zl~ffMbYOU1^P!>YLz%KB%Q#37t1yHLqjPs`ZDmKRTvc?L zXeO|vAfzv*y?}dbEhN-ZoadCugkP!7O%oFKKzpDB!IHE_aX2s3GEoNc56tzPK2_~> z{00RHa|Syf02?tJW&mA`tlL|=pg8y^d5qv|PnCH)up=Eun-4c5goLP@CkOwzlmSwedW3?%A?#iU+a7EPWXAcvSvFZz7k zfiGi70hP-2OlZb_aGN21UP1ne;4c_NBB?HRf&vBOVbRP^MC#FDb)(P|OzAH;Adm6V zO~^8P!N=enXi~FmLygVLtZhEUdVd!ufr=mQjz>XRhq^Hw7aj^LA-E<|gz1aXDSHBR z7n_ofU=bPmq+mUZJJqfJqs%*aNG%^pq$SQ&-ii6-L*ZQ%w~?j9?#!k-s0&kujk=Bx zt4f*UmO49d={!++FzK#5V` z+E$GfDu@Vdf=>(R%e_n7-3cjuKyFQfjk%WuZq@|7V%4Lb)bOI1xd{R)mqp_$C zAfk7)h6(CvDx+|7{A-|&cYmgK(9p1sKmf?(Ex#VE3;d(oN_HAUuy)9}iVqV0P+LSs z3f!X>`v!iE*#c2PI5xx5-eoYh&>k!1Ua*v_V$bB~vN-+q%0mj?#9k^8eF1b3=st9y z4EPbu5nL%WDw~}UhfE;m3F^yh@IAsCh>swLv1E$jBMS56(4+>pOn(=DIn6r+HH$#l zbtEj&6OgXW?liZsn&z8SJzS>yJr!$wVwH5e>3X1Gdxy`m4jccwmSK-j_%#8L)QIWQIl#k{PvX=>Y3bGbSqafny2d zd@I&~K_aJqjj9I0{+?7pe&v&Du^87-Npq!&Yq>>Tfqe7ty?>BMv6%nWy%I3%xLb|5 zR^Cqo9W#-M0yKybQ{F)j(#Tp{O;BDT$!IO=7b77Hv_W=LnfQKInS4cnyb`=V5?Qvk zO%(3-ICkMjm!Q<(Mmu}-<|qEsa8O=wto|sBOrtJgPvvmPLL;xGlboJYJedzjc^^By<*+MC{6Zi+8l!z&aIg{ zP9MKU(5XqFrK>u`&!l#0N|#~%I*=0OGtT3pXpl-)JQpWyLm28=lx&uAqn4NB%fbtU zG}65w#Q`E{K_pA9;i_Z?{lzUyL1$`kTNgrWB7ZWm5!wPWxum{4d_xDcO%p+@ zg)~a*ghGjxM>dAqun?0fn}I~k@l?@5Z3r!lt1K4XfAQV`AJOIQ4S^?3$FPnWxoXx~ z?4b{;v@(6>thR(S?H#`jqzHN>D!u5{G^G;QxLgjTIYMX2p`g+>{5UZ2iBbgo^NyfN zIv16R!GF+TA!!&p4QT@6>P#vPlZyyPw*W!#^j%3d{7U3Zt0}-=Ll}g>{dMG(p#2Bk z{e$+WPOpG~jiu0$B;+H~c__XOLbi-OC`3(ml_ESLX#Nh^Sp*temoIv;$eMvHi%ox% z@b1;{NlJzSF4t&xcui$4_+mW9s#rjeQu;|fN`JQiRtCa12aOTDgLiAA4pP9Rd<_h& zt-c2a^NrSh2L`~nZ1_7b5FznbkBH!_LS_S#O9{dR^#kHW>77NHx&4OljhqUSdsXOC zB`OH7(_{@nTjix}*+a6J++?DwajS$mf|Q1l@{rX^N-t|!hFi!1P(^nA(I^hh_nMZh z3x8|Lgom#}8h8%6tfhif!gG?53Trg9Nzp(8oYv&oiMVWj)if8`a;X*(jSg(PT((Hs z05HA}66Bi>Ibg#DkX713XK2%HowbZ3+Sh3k#m+6}Ip4EF46!_9ufl-vezYpm|MPaL0e@D94*`K*&{D0ePRl|C1mBw`MOadLszgUr?NqL%K3ZLm& z#1jCs4_5^lQ6JI^OQVT*{z4GI8LW9;ofvq)B)W=+3MXe0>MPcv7~uMazn`gI(Fkj@ekw4+qTO5IWOrmESMgbVpc zV^TvkfYs!MeR$8kG{cbLleU5&te|?QY6_2EXq}ni1l(($|5lVcf4eoA=Lkt2y z0*41Yr+g3*E%Pn13(};kLw42NLBs*%+s_A39a8@zl%$DK8RH%O1hV1*+7eiW)6i24 zhFAFp8pP?*z;R_W33t+NIUOuWT+st$ehlBCEld!f1t*f`+tN?N#%(%31B8$}d|4w435abT z)zPGig8#!|#`8a9!MIIBnSa1bAod&-g2S}rL`1+B!hWjBO@J28+vfg?Xp^r!!aEDy z(JA420Y?e3zHw5JQo5)?bc%mHecDl4+z3F^`TEXhL;#B3)%l?vCm8CbwnKD$Y_5+a z=o)(cHj1N6!Mjj3mZmT;O|tJVdV=ui*CeY{9ask$1Aw9r5>F!ug?|LTgGx~mYo5`C zZQLZ(cVf)0yB&>YR4;%E_ZMF?G|-|>@$iQ`KSf{+@lb?A51X86+R3Xeo~tuN7AeK1 z!?`8NzNfQSx@7a{GvGv1eyD3x-$&y|{vh@gy`AY8Q`kw1jln1pg`Rb~x@`<*lHUrP znuO6HMk#l(Vi=T*uzym;ty4iR4@``tqKvdikQH!8hAC@aeP7)6ufZ!AZFD5TH~N;9 z;X@*PjZv-)GUZM?5FgAec3nr>6M#zdk(SYkMJbfw^V(sZ0!=U&(QCYV3Gb*+Lax$- z+p0MNrw&yX!eihp8X$!4t%EIAI=w|fc0 zMhr_vHGW3l=(;-);}i?%W~VK9yQQN>u}M1`9V83}s!J+9DUypoFMrbN-<&UFBZ+Lz9zbTl~v zA`#p$D6|VWX=VI8NH=Jt7JzM5eYHRA1-gvS( zPdLM(+^$TARIt`PZph;}yS3C;7plI)T;#QO3)iF0?b)XpdiNQ;w*xJ;vRW=5u<%Md z<^}k-h$X9ATN6sEpJoIhP!M{mC3e(8vl&3+BXLJPN`)Q>4a1*>r>5e z;;sjBH-Bk#`95i&m!e@A4w_n1vQzQqFjEhHing(^PH95tOtm&>g*ZZsAX~CInL~vv z1bVS~r!cJy*s#^liLyXFwQMG#5K=^q28=-RDzb8WA(Z44`ce}qAA-FoD zT6kG2V_^_?(;U`j5?~Ba3l7sw(rK}N?5iGF*`1qVSI}}O`kh)t5QU1RU;Z;h2g<>k z^nWhiWlS6%`c*=jY@%f~QPcw_yo^BYTo4XUb_if{e6^!9b58)$L!~a>a&1JtL#N{V z^cY9}^)Zh3DUR+Zp!)0)pl?0tpvQ{<$75xHTiVFuh=dW-XAO~}tl=S)x4(yW>_sAr zd@ggCgLUaiF%*Oj-NDHeeCi1=5|Az)nSZbOEjGH?lm$G;t|mRy5p|5OA!3CI#J1x- zqSgUdB>nR13xv#?ndl(*zTR<1LkSy%b}oAfj0UATYNy0jJ(>`q;N{D zA`~68yPc;WujdP*#fSRS=j;1ii?S|PuBWrk``DBA&+ermVXvEY6odd+^+9p^Yk$Ys zxD8D@t1jLHOA8twQgQele=)~;jzJS=!!dYm>j`1Z6&g#EmH60NY+lFf)Wt(nPCcYR zh7(MN+^$d>(ri3Ilb}1$*_x{(H#7}B@5#d&9!b0GahD$!o_!4sWgEQk&L%d%dd`de zt2iCr)60G#JdQnErRkT>pmI0`u7AZT`_BP(fTH!NAS8#8i;er|uX1re)eGKLHjA6+ z`HY^Cp-7?Y1OKvVt&RY>?OD>x=&RKI(GeVR3r;7MDplbdeg-MpBQ794V&<9qYjIS^ zQg7=uIAj5iq=|G){zlZjA=S~2jg9bzmUfv&Sn7U;MmWPtZ$e0P(Kr{%g?}k9I&;*D z;u+rUsnId8rfrv3_e+?|(Cc|8>$WJiU0AGl;NipPSw7vh#H>etoTB^e=4H=HBau@D ztHZN`bp=c&d{0qCokk!uKeH1Zd30YtkI^A1o$yvebGk|FDhWlvMWgtp*wCF=%S))S zU4Zh!DCq$_JzNBubmUOcGk-hBWj$N*V+-5~xI2HCBMaR$p`!wDi8{f)Uc^n!=y?*S z2ZCA!*FQ`C1watf`7Jr!G$orY*=f-`T)gI>^svfy@1Awiq=$~)Nde!q!v>wW^!+S< zJpBqWfyH5v*~Rv!43n@@$5dSfS<71qR0YM%^)G3>7BzF3%yfdqJ{Dhk|=}=#nUG02B!}1H3 zgAeI3&x3)}V<|$$Yj?GyYaNckNA{F$5%&&g>@FutL33^m&axgFIdY%uQvZ*O{|3KU zYFaW?XN>>=4qItdShEKlhXN!vVlg-}WiVqcW??chEi^JPIW0LjGBzzXVKgx~WI1DG zHeoT7vL2}mI5jyrH8?RbHa9bqW*>11HB>P(Ix#akF*TFnA0!GjR53F;F*7*2y&y{pHB>P( zIx#akF*UOiA#Ml+>bn~QlY}WUe-8@{4+Hp#Apigck4Z#9RA}DqnaghzR}{v7cRXV| zc3yxW;hmONeQZjF6mH@*8>IR7&RDGz6imHMIiz1;u zP$_E45*7MLNxopbK7e_@`TKY%UQ zq3FSM9W2n5g_!^f9#jIbR%^z<&d)Klz)ro19Vx-)9>}|Jbpk&4wl(*@pE-*y7Cku! zPz|75hYlC2p{@ax1DNt#_aNB}ywC>?3)d##nUySyEdXG;F6SB+90RKhTAvA_;DSNx z1-G>i(wh^|H>P1jx4vUJe{6vpU0H!p3FKro)Vj5jL$efGX&DDr=ApMAf++poB?sXA z0c;Zau52oSa$U|AvvR&1K&1|eDh&eS%zkVlnJFJ$|LW0n8#SO5OD&s$TC_|6l2hO;LNQL7EdfT(O}!Z#3H{`>^Y~#HM;ff1fu7ejS5#op5~$ zw)W{-(Sxj``%YBhyMx$iAN&YhN6)nDi`FJax8TX4uB?!M>y%~H>OS6k?lu6&uB>7F z&MnTqV{i>bapa9ro~Q(=WGi)8-wDGd?WqLNlauox0D5xT*WtmH zaa9LXUxFl9352Yde}Q@gM|T?DfBrTZ0~rJRH{IswPD9=WH>0(3kd{b;qFWC1H{TLw z)tYii*pTy)m1B<4y+F~nR-Y?oVX_9lPr%i20p4-|45C*M!G%##5(Gv)g0(SCf4ZSP z8Aqj~!xb2vSw+m+v_v*rhYKt6(4Cc&wJ4QK!@}safT)Hsf1pPD^RDtj!$Q!2k*QRc zEd^jjUJrj^6voPOxE@IkiLLF_wF{%#+nbjR3SOEt9V00%2Ee4R1Q#?UgCxUy4s7TG zHFaf!bKg6t2`YHfem(=0 zh7w_O>zs3Sy~C9R43dEBsP|YZO8x6YZLIxS8$3x{*(|Wnt`coueM;{?`gw8Cw{J}8 zy|oW^55T!$IQC2X=)PrTFmZnO0BvjTnf;1re@{-Or!%Y4wPPdJnERja6X(wjw=n=K z^Xd4jJFAYZJ0}pLxKa7~Ev#$Qku}$GKZHLfVb=icds>5$N&v5X**l$cC| ze~gjy#6yx?Ms>celHd>5HG}sYMc$88x35j4&fTreozl(@EUlP;mGh2CPkn8}fRe9T zSdM$|J2U!U@B~QGq(lu3Dw5M$!h*<(HGZW0&~6NHj}JX~!kP)y$vsZ?Kz+c2o(v!B zM#z}CKUh>l$zi0FPKT{+{SPKfE`f)cI-W-J*f0}nvXgOCBK=7JA3Ff7RTAvUE&TDr ijo&ZDxaxmf2Kxt&>{xAaHB0000aB^>EX>4U6ba`-PAZ2)IW&i+q+NGOWk}WB+ zW&at)8-mfpaA-wp1~vS*w&H#>A~Jun>bitC=h!g=RCPBB;m-g4KiB;a|4PltrCeL- zrF{HLJ@qj7rG4+;urQO%b%bB@pb3(e~yYR{a^E^{rndG z{<@F8zY+ao_4VJqyIq?zvlywc)a7SVzf-i|xNhHt8h?6NM2slv%imCAk2^LZx?b30 z_%jx7kL}-b_O!;6x98H}xtZr9|Mi#qZ$EIaO2K=rWqWJIxI)lkGYmye-?@y4`1`Y{ z*%tWs>!1G=*GL4jR#_#|S=jk*F|+>{5=0Ah~k#AXMd%YS6Own)z{cz#|?h$vg>ZU?{WMg zl}!hL++teNXeox%TGbux^2x`mOQIe4G~8&sGQj^%Q*AHJx^6 zKeK%ItNC=)!8+CNn9rD#i`V4G+Og!blYjoIez_g)wkIyGPwke~j^cKG4$LO*8`Caj zozR&;9p%o}zg_a4?UcSxDRI^_U8>xNyTsgQY$Mi>sYHKcWrBAXQY0~n!Q@$}T#4Jg zgtKtXO{>~Ug^^voU#UIYI;6`K?&E-K6rZlL9~Ay1t&#nGi3WRKrSzwSOzO z?CW^!oP0cTWt=?6Zh7-gb3q?H*kuTthHX^&j0*2$+nH)%W^;cEbx;^r-G zAERZgEAN1IxGX1uB0Ub%VjvfuDe%gzo-pvHMYJ*^!}DsvA3Nup#w_$mBC`AN*|ktchYcOvNxX0s_oMQp(y&3#ouqJg z+4}NvO*o`V5iz_|0QDVIb(aO-g)uIrNf=kLB)cwaz8Ni1D6_e6Sb;`XEq_*Yk*HKa zVi6A2Y~O*l%G4^!K>QVsdI(2(85DC3Gw)GdqaaTS@nyG#zLarCAON%YlkSc@zBceH zS0((JEaL3n>GN9hkY=a2@{$jnTO`uCIg<)0z7hpfl*gWUU(hO37o^TrLPmlzBS=C% zuoTxFfYCz#YMcuiMW^H?uz!`*A%lrIL0mHvu{COAYJ`)SFeQ6Em5zoCo7Cj)yu^=f zIc~A@izrTNkrnNLR@DG;2A4$K^)6qE5*vURc{||ou6D_OW)9ArPH;7$vVU&4rftADd(_LiQw0n zOl@eDd2NCm>i|`n-SkI*06>bm&Sgr&(ll*%E44Hax!0-~C5)LhLsCBjX&aRGh{vS4 zPjYU?c(;#d`CC-j#D8zpt`YITTl84~hR+^gChwc$w<+3kQr}!#B0P9PfX|q*0Ipb5Bkd{h$AYR~jfNLSPVj3N|#W+btVF&3N$f>kvR_gzNBn$F)ki1yml?S8A z;63CHTe>iT);bBy32j^^2&9psIkGaHiHg`+C+fD569WBM2q{z_AI4iI4WPDu3qP?* z=3!~bM?(QNI)ABTWKUj^284tN@7t*u5gl1W;8_jWkFs`x>(Q+^`9Os@$AZ5}+P&6n zgYl3#q#wDMNA{DL;A|{gPHFHf>>dVm6i(6WYm|NJgVSutO(j#BB*4Mb!Sv(_VN}Ku zEJm}JUb*&)-|kF?l=<-D-I4<;km$zqW&v{$h8(oesDCM*#lza(H&Cq*Dr4c#4DLA= z+|buQ45CJ0EEeAn2#O`{;2a?YE|@L}N`ZohU5bH$4fGe~b!T$LZa}0YPNaH3I0}lQ zL=|-82%i-vgFr*7N+2_U^|{ONd3<6K2sODY5-KhGv6Hf}hJ#cAO)(pnL~kS*F?twO zl^D9Uhkvi;qY4H@K@ayJZ8he{qhP#5K9Y@wM~@)NL#GdtY$Er$$(V{dr09bn3FKbR z#~CsrljR1xO?d9>0b$f6SsNKHO7Eb1N&G_!FzP(QX_PMTWa|smb_bt>zUSLpB|=CC z>}A!y!ef>}d9w%)3kxd`^P|B>1X0&$loW+>0e}A)5nO1nRSeaTkkpm3HpR`-93+Oc z*<7{={~|f~_pYqq6Ewn4nF+o#Z-N)BF$qH0^`ML@J>UG1d$=&E1XR8y3i!Lw!uWZN zW2;Vlj5FYB-z8%yMraRXUiDf=^Lb|TIKPT@D+-Fzhdvp{0W7eZgwA~mk*x)@qi`bY zseh5dX4HKF1f|*tH!cGpiY!a&QMr?`w+r2h?!hBCrWp7rUg2~QgjXY0MY?8!17z!> z9-ycyG$O0G*}~tf`91grpDR#*UH{s_L9tF<&}_=Tp&l8L#Tx*^Aw)>yJmkSGF=|mV zC9V8?Ip=zj)YKH1fpQnu!X;F^`WDGD`hSM}LyQA7Bi7t=m9fY69xU96s&y$GU4PmF z`v)tq2*lhc%0Do%0Ckn{R5)QarTn7^BqSMuDS!rMqlrqy&)J+YPt4~^o1)GU{=)zJ zXDQ|;aaaUYAM{G53ykl+qM8eEDrW)T4Q)36sUg03?3P4rr~q@_hN|!uYe_~aRsK7V$%(7 z#o@v2SEjj9Dn8a-l1pbJkPKam)K4c;Q=mZ8+;Er>&U z*}*VHSR@)^v?KXRqAa0P(M1364HuFWlo9G3?oWxvO0?* zDcjG5palmL*n)YR2CCTVd%er5udaMC!?%eS13U6m#nv7IMWV^MB6J&%*b?cGB_tutBF7pj^C}-LhlPM~5G3BL zPk$2KtPdoKtd&lc5C?*)^dcA-ss{~0D}@iS0OzIMoPLceLy0YksE8+rD+R0wle@Zk zV$@r{ARwrCK8=W4BLeW6Xq?OfMljRBbU+e^YrJ_hA%OMv_Vm5U`oWq!>#wx_>0i<%4JM$x8D9fSU;v`JWHuA4_QoQllZM93LJb zCd~#8OY%yXyC^kY?pFSAt%o>H4h{7O5etM0wixP#Ne94|kgpBhnzpPxNT8XiwIUAD z7iX8Zm)U9saA9)EIgL?^v zC^9hnuESDVa|sRd(l5*quoZr26;M<>x5+Fc+?{w%Z9u+9^+T{YQ_c=cOL0)nQlqRw z+;0(ZHanA!Fw0Y!OcUY2jR<1J2o8w?#((g5PuYMno+jxQPqT9o{o!gCCg+x zc_H__<8t^8lEuUv?wBOA0z1O#nlN2Bnx#KVrh-_Y9!(tZpIjo~la&PXICWMKYHC1k zT&8leRG$~4zHx*;p)lMN0lL+T3YFl&u(~0UK?FJC@i|~c%|ip#3iobignq2QgjCY` z1kcvs1AjnLD|~h^k7o0j0zzlZ{qS{7r)vKZhZuT=e3c! zuzz0pk?({bsH(@4iE2t(SEVmnaTJ_F9W#cE-rZ)x}~( zsBJQXJnkq+6f?k3j}r@YwS4?Hm$e_;i+@J7a$_h*1`_EG%`rvweNZAy)2@;=LAV|@ z>qMzS)z>tIJ3uj;SXBK^fsOStc*)v{vM>M%g+_IOY?MkkAmlOFpxz}evX2AR*nkn3 zCX1T@joG(k_*7ZHuIQ%L)Z4h;gaWQr2nknP_NHfbyZU=T&Jt7VqdjSt2afRa^nV4` zrn+}51Fqdo-C}^rfpA?~Ppxd~rmJ>z^XJE2mqNGIoze8lYwEOEyDfq=J9}7oG-ORc zHNg1l?|^i5b?fdECbbS=r7+Y-VLsXmp|VU7 zUYAF-`(3?`UO--wq3My=mXdqqWqr_twTftyD)~bgHJ`IxQ%i>Wpe(|C9DfTvSZmI< zP!^^#P=cXDOMRql?P~2R!hlR6vYP4h2}kZ>20KUw=Q+Vf*@tzEgUx}DkzY6^gv+{#E8X2WZ2?SX}f^PC>Jg~-3^_+rm% zz=vX|)mZm{`%J`1-I}ACPHC3c3Xtde*-9G=LQyKF1@SE2^7CzY#DCBeYa<&${SZ=z z2P|JQ=u#66{=_SPS{Yf(sctG(n?f(}cf{JLr8riO*hWMO5}|1`7d4{xxq0bLb+I^F z5VMRPXFccJ31hKftsn7#c6hoKaW!fFb|=-P275Z-K3bmYYoIr7 z+o2CP&dJ)Z+SGj?^6KT+zvH^qJg$G5$H7di>M?X}?rDp|cJEFZu5R(=2d+)dHfZ^PL5sfXH~G!dyr;u2Cg=zpk{c1JgJ4B9nd8|lO3 zN$5e!$~>)KmZ^<2gbovRA#I4rzio@$;_- z(R2Vnj3?6l5Pu$xxNCo6iyvX!E$J>6aDs_-a|(Nd>_yvqQQAX$i5WNgvz3Y`yQZ=L z;5Nf+P%LW$@Ih9`k?G20Ux)Wq=CHErjpzEdT59{*Bd%Wknms~6D% zSv}_uO_V(HYbKzNiVmkF@?5p3{^-I*=c)4x6jzeqncD}i?F=dq)Y*HZcac@6S_7^D zGakDx?SJW|aD+t#eE|y*Z&^t7$tPjcNd$QewAA2MBn$kE@KP@nl0+bZ*(cyEVg$}8 z!lfe>SpTjmPLk(4q3T3b_I8K@sl5E#3YYVe%kSD3Ogf~)(jv8<$EhEqm(T0f>TgE1 zTPA`ANJOIaU-N@U-jH)zD@ar(^=k3>o$C*}Jb#X^?KopwX&MOyX(O56Vw+A=%rdp# z77b|%F5Y{jeRTmJbC?*#AIWo`f&tyK~L(;z9d1r2P zCVz+5yALb>oKbjeVTXG(qVftrb%zxOFT7Y4Tn>0NWQTR)ZPiGfr>%uLLFR7StkF}u&Ykj%FPzdQXwa?OYmP6|6XCL+qmJV-^vt19Q83mUrwtvCp zOpPK2m?N5TuN=NEQ9#xDRvtKi2$Su!Lrck0{wEaesM(G#wr{JCm5KkfLrC8ComYx~ z_B6CJ&b?ZF;Lpq@RCWG92jJA;fw^EtJ7=I6f}S`n&^CwAwCC0E7@%Ln0e>KZL_^qM z7wjyNb|vKC%TU8n?AU86--d!Q`rUjRT1bY48?L)Bwc45d*=->xuHhwhjwUaC0 zTi@w}w@agT`R>|Q_K;IiOE#%%3RzAMhF3ee#JJea0O{AIBO9%J7DXr zE{nD`QFmab_jazJMF=ZIsDCTqve9Hb1w6v}j-VEt;SXrSt!6JWNhac|i8y#>HSPa= z(h!l#iWJhGj^RTiK&B75cx?!5^H0^5acLa5)ll(%P$zXt>S8NGRr2G9-eW^?+Hd%V z+Ph>MJZ%Sp9^5M<0_j2KtI||4WLnYQPUq2|w}S=5Fpi0ZC}z)Wg@33FsETNylTH!x zogRIHtjVt$5NOCYav^=yLur`_M#!{D<^XI-C*C~%0T0VNI8Zq4t4iq#qaB@;I_B4| zjsx0eyJrFY)%$9^ZYU3S~VlxJ{?W?nIJALaZGWe&qU`F7=11ebTF++x^lY*s=CwH_fn-g@w|m`7f2||+EwLO7&Neft z6h4lWL?Cuqt$vy|j^Qb_YSq-?1L{opQJ(S9X3(SgQGS!geN+`({{glb2rNC4YN|q6 zvO>D#RDslk*8L1`bxM$uN=U7UZD)x?Oy9~b1Zn%OlYi4(rT^848yBzL6<$UFzOxVV zNytMJcl~G6cLH``nRX(ynVHlxGr+Ke;i>15q8l^N&H z*`ElmT=!b2*6yZ?zNNzSb9q@-n9A1V9XZhn&;SaL4~3Bj>JS9dz14l1PDay&i|yqW z+ia@#aTyX(op+`H>_NbA*Z%^B&=&~ZK6w)W01bGv>=}vzBrrHMH)LWkV=Xf`W@9Zh zVl`zgIbt+rEn_e@WMMaEFlI9~VUwC1sS7eTH!w6YH#speHV%x*#P@NrO;u zTct6LR0Tu}Cx-FF{fA2|rXr@p(h zbsm>4E$ImyK)D8sRfvZLFzIQ0u?EEo6xyyzL+_#?_&`qJzw$m^0FUf~rZ3_w*7Sb1 z3{xc-NJ70S0%zkQ@InK7{TmVWrjB|U%gojRxwOfP@I+c)Xmb?e~dC3yQrm5}?~^7j3}z&a);r+Dz8{XFs6zgsN9mTYx4OwEl?;8b4QnbW9-UD{y8WHm4+YuT6hJ zE(>#&)$5JUOGI7V#DZzyW9kTALKUFmFBwsTHC zpC^~gapds7c0G^t{9gQWO`AqSu=9UwK7IWIJg{9<`_k*{xI8_{zx}R5(i34oV2c&o zH}>JrUz7yYoA8NuXzVj5z;mJ2guOfPs|^Udviip3l>GM%5?!qdOEZpd{2KcZ=_FSPB1^|!TO{QZS0QcYVJ^4{iYAEO=}%PkV-@G z!cV6pJ-IBbjl)|9U`@<|+m?oB4t*Pd$;l~-#lkA?o3Zekm=1sZJX~57;C)Y??wEY= zVGJIsZ_eFaRdn8|L<0(wy%X7*5g0< z(Gdm%PMn&A>jz*sqj`Vwtc~_o`hL@fG6LxPFjLk#JNl*Dxva)PlJWD)TI;Rr1axW% zuFi`4UPu5VA@viUEdGC*nD%uY5$;?8)+JV-eLZhUNoscVi%_K+xUOu*+;ZS<9oeBwAOX3o_UP8~ z`8)#y>#pnuD-CUIIQqY}r}w=1+*;E{fw7Rl)S4oW>4#kbSgL=iKa|$Hq^I1#35;Pp zEEP#dMTp!Q>v=L!t!3;*yKgvh22zO#@7a9|xm>Pm9AL(r`)=xd@vg1-Uzom)KkI*q zYQw64*Y3aTh3++4BTK}0t-)@D(0|VP4IKXD2!MZPz7t$e1m~40xM@8dLF&ifhBIHW9>pBm5CkAUi+{GDgU7;( z{1RdKK_2I}tpeYlumsA+yGME^Yh0+>`O_uX7!K2{*SmktzwP>~dFj+IqynBRuD$s1 z2+@!NfYT>lYE6Fe;StQ7ZtbS^_$xEM?Q8MJi_+(YFOJ_aqTnG*E(Wn0{T?&$GVqTiB$QBb4QQ2)F7A3QL5TBHvG3g#DQ~6Oq>JY zi+94;Uy*@|hLonhW23nA!wEgFkO0SIgY8*mEHHmy&yMQAJ2%_=W5*P&Wn++8uK=rD zhZ_c@>)E(<%e|4#nE%P2C>UzD1BM908LI{Wxm=Dfe*SS%i3s0$=5Wgnba(;Nxwa4g z+CKbq1^jn!lTL?Mhs}C9 z+1hi0_IAf092ryp$Cu!P{|wLXg{SYbR@mre$g!Xg9JOlj8^ekbYE2b8dOR2_z_o#^ z1j~KH<%O!AAHTh`9a8Y{0SK$Ddsm*xralzv;v7t@zm( z{P8n5AGr=c>_9khb(OlJy=U)Heec$9;EWgXo4zbL4qPrPn{yoay&VdZKlE#IsYwr( z8#0KokW_8C-l{A53qg5p#HjrZNVo!2Z;H|;VFKj`CTWR<6!9%Llo4*~5qCiZ4!H^{BCd@h z%XI}jOI7Lk>zAbtP5|(HQH2s?pY9Lhm$L;K)K{nVyd?$yIS#-6^2>~kjWIYl$k^Ce z3-Aly{f7=C=w@SDAmoT+3)LWebrpY#X4;AyOEnP&^giL)EX)*Cmg_cB^nDR)EC^yu z0VLwmG9Z;8+w+5>OfsTM@GoZJjmwh8NJ!wvi*Wm(z-OYm#)|^KC8hPoi*R@pp8EV_ z9h|=L#v2(N90XWx1LiB*C>2${KUWq<=a%(uIAb%vayJ*a;lE;npW z&}_o_1-NQW06K^soq+IW?M72)sWstj5#G5;Uczwq%Rg5CuAChkFX}QxSlI>#2RV82 zWb3&@0%}c(@k~jX*>p)M>Ex0`--ub$w*dX108wdJPR7F`R-tOEKe3QNZB1!xbFY#h zlP8#1zEIV-(XeWdjixQj7b<_4tqEZpl4t?t>ve_)zY?i^nK@NTE zsZ|o-zI;J$Yq>6;xEz$LM(4$$@uIlqIJQFE^hFd?$uUwC538cj;DzzAW^%v_!NwC}lY)4gEo0jjOK&5T@SL#cF@s~q@i0YRckG78=DaJ98#VQG{Pf&I#6#! zfXa2~i_5r~)bp2f%DI1?wv;pM$XK=hCPf5zsRkvqRxqa*z24BUbjflQ26kuRHOYMO>p`WIEyu1YZEx-I*t!c$i*2i z>h6OR_i#$V95cT!fzt#BXZ8G87$+LCz>=Q&?PDf%H)jfaPKU8;Cq_pg)DGfGeN(yZ z#sSkz#`gco;X{9pEqbi_h2>g?n0xzJ`*@`RyZ3x}RS;z2fG>UKudFm~*s$SOEeo=1 z*De5#9XrOwix*o3&XwY42-bekN)Q|T#Vy^}{>%Tc-?aaH{lBam4Z*(a this.posY + 0.5D ? 0.5F : this.moveType.getUpwardsMotion(); } + public boolean isPotionApplicable(Potion potion, int amplifier) { + return super.isPotionApplicable(potion, amplifier) || potion == Potion.JUMP; + } + public void setMoveType(EntityRabbit.EnumMoveType type) { this.moveType = type; } diff --git a/common/src/main/java/common/entity/animal/EntityWolf.java b/common/src/main/java/common/entity/animal/EntityWolf.java index 779cf38..383b43e 100755 --- a/common/src/main/java/common/entity/animal/EntityWolf.java +++ b/common/src/main/java/common/entity/animal/EntityWolf.java @@ -87,18 +87,7 @@ public class EntityWolf extends EntityTameable { super.applyEntityAttributes(); this.getEntityAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.30000001192092896D); - - if (this.isTamed()) - { - this.setMaxHealth(20); - } - else - { - this.setMaxHealth(8); - } - - this.getAttributeMap().registerAttribute(Attribute.ATTACK_DAMAGE); - this.getEntityAttribute(Attribute.ATTACK_DAMAGE).setBaseValue(2.0D); + this.setMaxHealth(8); } /** @@ -350,7 +339,7 @@ public class EntityWolf extends EntityTameable { if(!this.worldObj.client && !Vars.damageMobs) return false; - boolean flag = entityIn.attackEntityFrom(DamageSource.causeMobDamage(this), ((int)this.getEntityAttribute(Attribute.ATTACK_DAMAGE).getAttributeValue())); + boolean flag = entityIn.attackEntityFrom(DamageSource.causeMobDamage(this), this.rand.chance(2, 3, 8)); if (flag) { @@ -360,22 +349,6 @@ public class EntityWolf extends EntityTameable return flag; } - public void setTamed(boolean tamed) - { - super.setTamed(tamed); - - if (tamed) - { - this.setMaxHealth(20); - } - else - { - this.setMaxHealth(8); - } - - this.getEntityAttribute(Attribute.ATTACK_DAMAGE).setBaseValue(4.0D); - } - /** * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. */ diff --git a/common/src/main/java/common/entity/npc/EntityNPC.java b/common/src/main/java/common/entity/npc/EntityNPC.java index cb902ca..ed401c9 100755 --- a/common/src/main/java/common/entity/npc/EntityNPC.java +++ b/common/src/main/java/common/entity/npc/EntityNPC.java @@ -549,6 +549,10 @@ public abstract class EntityNPC extends EntityLiving this.getAttributeMap().registerAttribute(Attribute.MANA_CAPACITY); this.getEntityAttribute(Attribute.MANA_CAPACITY).setBaseValue(20.0D); } + + public boolean isPotionApplicable(Potion potion, int amplifier) { + return true; + } // protected int getExperiencePoints(EntityNPC player) // { diff --git a/common/src/main/java/common/entity/types/EntityLiving.java b/common/src/main/java/common/entity/types/EntityLiving.java index 804dad8..69b4b42 100755 --- a/common/src/main/java/common/entity/types/EntityLiving.java +++ b/common/src/main/java/common/entity/types/EntityLiving.java @@ -828,20 +828,9 @@ public abstract class EntityLiving extends Entity } } - public boolean isPotionApplicable(Potion potion, int amplifier) - { -// if (this.getCreatureType() == CreatureType.UNDEAD) -// { -// int i = potioneffectIn.getPotionID(); -// -// if (i == Potion.regeneration.id || i == Potion.poison.id) -// { -// return false; -// } -// } - - return true; - } + public boolean isPotionApplicable(Potion potion, int amplifier) { + return potion == Potion.SPEED || potion == Potion.SLOWNESS || potion == Potion.HEAL || potion == Potion.DAMAGE || potion == Potion.POISON || potion == Potion.RADIATION; + } public boolean arePotionsInverted() { diff --git a/common/src/main/java/common/init/SoundEvent.java b/common/src/main/java/common/init/SoundEvent.java index b5cb1b9..4ab1d86 100755 --- a/common/src/main/java/common/init/SoundEvent.java +++ b/common/src/main/java/common/init/SoundEvent.java @@ -109,6 +109,9 @@ public enum SoundEvent { WOLF_PANTING("wolf_panting"), WOLF_SHAKE("wolf_shake"), WOLF_WHINE("wolf_whine"), + + FOX_DEATH("fox_death"), + FOX_HURT("fox_hurt1", "fox_hurt2"), SLIME_ATTACK("slime_attack1", "slime_attack2"), SLIME_BIG("slime_big1", "slime_big2", "slime_big3", "slime_big4"), diff --git a/server/src/main/java/server/biome/BiomeForest.java b/server/src/main/java/server/biome/BiomeForest.java index 7d3d03b..23709f9 100755 --- a/server/src/main/java/server/biome/BiomeForest.java +++ b/server/src/main/java/server/biome/BiomeForest.java @@ -3,6 +3,7 @@ package server.biome; import common.biome.Biome; import common.block.foliage.BlockDoublePlant; import common.block.foliage.BlockFlower; +import common.entity.animal.EntityFox; import common.entity.animal.EntityWolf; import common.entity.npc.EntityElf; import common.entity.npc.EntityWoodElf; @@ -67,12 +68,14 @@ public class BiomeForest extends GenBiome if (this.subType == 0) { - this.mobs.add(new RngSpawn(EntityWolf.class, 5, 4, 4)); + this.mobs.add(new RngSpawn(EntityWolf.class, 5, 2, 4)); + this.mobs.add(new RngSpawn(EntityFox.class, 1, 2, 6)); } if (this.subType == 3) { this.treesPerChunk = -999; + this.mobs.add(new RngSpawn(EntityFox.class, 1, 2, 4)); } if(this.subType != 4) { @@ -81,6 +84,7 @@ public class BiomeForest extends GenBiome else { this.mobs.add(new RngSpawn(EntityWoodElf.class, 100, 4, 16)); this.mobs.add(new RngSpawn(EntityElf.class, 12, 4, 16)); + this.mobs.add(new RngSpawn(EntityFox.class, 3, 2, 5)); } }