Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-11-16 21:10:17 +01:00
1896 Zeilen
58 KiB
Diff
1896 Zeilen
58 KiB
Diff
From eec91ed84af1dcdeeecba2a2bfb1df4066d543f0 Mon Sep 17 00:00:00 2001
|
|
From: md_5 <md_5@live.com.au>
|
|
Date: Tue, 2 Jul 2013 13:13:29 +1000
|
|
Subject: [PATCH] mc-dev imports
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java
|
|
new file mode 100644
|
|
index 0000000..5e7e571
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/EntityHorse.java
|
|
@@ -0,0 +1,1186 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.util.Iterator;
|
|
+import java.util.List;
|
|
+
|
|
+public class EntityHorse extends EntityAnimal implements IInventoryListener {
|
|
+
|
|
+ private static final IEntitySelector bu = new EntitySelectorHorse();
|
|
+ private static final IAttribute bv = (new AttributeRanged("horse.jumpStrength", 0.7D, 0.0D, 2.0D)).a("Jump Strength").a(true);
|
|
+ private static final String[] bw = new String[] { null, "textures/entity/horse/armor/horse_armor_iron.png", "textures/entity/horse/armor/horse_armor_gold.png", "textures/entity/horse/armor/horse_armor_diamond.png"};
|
|
+ private static final String[] bx = new String[] { "", "meo", "goo", "dio"};
|
|
+ private static final int[] by = new int[] { 0, 5, 7, 11};
|
|
+ private static final String[] bz = new String[] { "textures/entity/horse/horse_white.png", "textures/entity/horse/horse_creamy.png", "textures/entity/horse/horse_chestnut.png", "textures/entity/horse/horse_brown.png", "textures/entity/horse/horse_black.png", "textures/entity/horse/horse_gray.png", "textures/entity/horse/horse_darkbrown.png"};
|
|
+ private static final String[] bA = new String[] { "hwh", "hcr", "hch", "hbr", "hbl", "hgr", "hdb"};
|
|
+ private static final String[] bB = new String[] { null, "textures/entity/horse/horse_markings_white.png", "textures/entity/horse/horse_markings_whitefield.png", "textures/entity/horse/horse_markings_whitedots.png", "textures/entity/horse/horse_markings_blackdots.png"};
|
|
+ private static final String[] bC = new String[] { "", "wo_", "wmo", "wdo", "bdo"};
|
|
+ private int bD;
|
|
+ private int bE;
|
|
+ private int bF;
|
|
+ public int bp;
|
|
+ public int bq;
|
|
+ protected boolean br;
|
|
+ private InventoryHorseChest bG;
|
|
+ private boolean bH;
|
|
+ protected int bs;
|
|
+ protected float bt;
|
|
+ private boolean bI;
|
|
+ private float bJ;
|
|
+ private float bK;
|
|
+ private float bL;
|
|
+ private float bM;
|
|
+ private float bN;
|
|
+ private float bO;
|
|
+ private int bP;
|
|
+ private String bQ;
|
|
+ private String[] bR = new String[3];
|
|
+
|
|
+ public EntityHorse(World world) {
|
|
+ super(world);
|
|
+ this.a(1.4F, 1.6F);
|
|
+ this.fireProof = false;
|
|
+ this.m(false);
|
|
+ this.getNavigation().a(true);
|
|
+ this.goalSelector.a(0, new PathfinderGoalFloat(this));
|
|
+ this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.2D));
|
|
+ this.goalSelector.a(1, new PathfinderGoalTame(this, 1.2D));
|
|
+ this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D));
|
|
+ this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.0D));
|
|
+ this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 0.7D));
|
|
+ this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F));
|
|
+ this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
|
|
+ this.cD();
|
|
+ }
|
|
+
|
|
+ protected void a() {
|
|
+ super.a();
|
|
+ this.datawatcher.a(16, Integer.valueOf(0));
|
|
+ this.datawatcher.a(19, Byte.valueOf((byte) 0));
|
|
+ this.datawatcher.a(20, Integer.valueOf(0));
|
|
+ this.datawatcher.a(21, String.valueOf(""));
|
|
+ this.datawatcher.a(22, Integer.valueOf(0));
|
|
+ }
|
|
+
|
|
+ public void p(int i) {
|
|
+ this.datawatcher.watch(19, Byte.valueOf((byte) i));
|
|
+ this.cF();
|
|
+ }
|
|
+
|
|
+ public int bP() {
|
|
+ return this.datawatcher.getByte(19);
|
|
+ }
|
|
+
|
|
+ public void q(int i) {
|
|
+ this.datawatcher.watch(20, Integer.valueOf(i));
|
|
+ this.cF();
|
|
+ }
|
|
+
|
|
+ public int bQ() {
|
|
+ return this.datawatcher.getInt(20);
|
|
+ }
|
|
+
|
|
+ public String getLocalizedName() {
|
|
+ if (this.hasCustomName()) {
|
|
+ return this.getCustomName();
|
|
+ } else {
|
|
+ int i = this.bP();
|
|
+
|
|
+ switch (i) {
|
|
+ case 0:
|
|
+ default:
|
|
+ return LocaleI18n.get("entity.horse.name");
|
|
+
|
|
+ case 1:
|
|
+ return LocaleI18n.get("entity.donkey.name");
|
|
+
|
|
+ case 2:
|
|
+ return LocaleI18n.get("entity.mule.name");
|
|
+
|
|
+ case 3:
|
|
+ return LocaleI18n.get("entity.zombiehorse.name");
|
|
+
|
|
+ case 4:
|
|
+ return LocaleI18n.get("entity.skeletonhorse.name");
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private boolean w(int i) {
|
|
+ return (this.datawatcher.getInt(16) & i) != 0;
|
|
+ }
|
|
+
|
|
+ private void b(int i, boolean flag) {
|
|
+ int j = this.datawatcher.getInt(16);
|
|
+
|
|
+ if (flag) {
|
|
+ this.datawatcher.watch(16, Integer.valueOf(j | i));
|
|
+ } else {
|
|
+ this.datawatcher.watch(16, Integer.valueOf(j & ~i));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public boolean bR() {
|
|
+ return !this.isBaby();
|
|
+ }
|
|
+
|
|
+ public boolean bS() {
|
|
+ return this.w(2);
|
|
+ }
|
|
+
|
|
+ public boolean bW() {
|
|
+ return this.bR();
|
|
+ }
|
|
+
|
|
+ public void b(String s) {
|
|
+ this.datawatcher.watch(21, s);
|
|
+ }
|
|
+
|
|
+ public float bY() {
|
|
+ int i = this.getAge();
|
|
+
|
|
+ return i >= 0 ? 1.0F : 0.5F + (float) (-24000 - i) / -24000.0F * 0.5F;
|
|
+ }
|
|
+
|
|
+ public void a(boolean flag) {
|
|
+ if (flag) {
|
|
+ this.a(this.bY());
|
|
+ } else {
|
|
+ this.a(1.0F);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public boolean bZ() {
|
|
+ return this.br;
|
|
+ }
|
|
+
|
|
+ public void j(boolean flag) {
|
|
+ this.b(2, flag);
|
|
+ }
|
|
+
|
|
+ public void k(boolean flag) {
|
|
+ this.br = flag;
|
|
+ }
|
|
+
|
|
+ public boolean bC() {
|
|
+ return !this.cu() && super.bC();
|
|
+ }
|
|
+
|
|
+ public boolean ca() {
|
|
+ return this.w(8);
|
|
+ }
|
|
+
|
|
+ public int cb() {
|
|
+ return this.datawatcher.getInt(22);
|
|
+ }
|
|
+
|
|
+ public int d(ItemStack itemstack) {
|
|
+ return itemstack == null ? 0 : (itemstack.id == Item.HORSE_ARMOR_IRON.id ? 1 : (itemstack.id == Item.HORSE_ARMOR_GOLD.id ? 2 : (itemstack.id == Item.HORSE_ARMOR_DIAMOND.id ? 3 : 0)));
|
|
+ }
|
|
+
|
|
+ public boolean cc() {
|
|
+ return this.w(32);
|
|
+ }
|
|
+
|
|
+ public boolean cd() {
|
|
+ return this.w(64);
|
|
+ }
|
|
+
|
|
+ public boolean ce() {
|
|
+ return this.w(16);
|
|
+ }
|
|
+
|
|
+ public boolean cf() {
|
|
+ return this.bH;
|
|
+ }
|
|
+
|
|
+ public void r(int i) {
|
|
+ this.datawatcher.watch(22, Integer.valueOf(i));
|
|
+ this.cF();
|
|
+ }
|
|
+
|
|
+ public void l(boolean flag) {
|
|
+ this.b(16, flag);
|
|
+ }
|
|
+
|
|
+ public void m(boolean flag) {
|
|
+ this.b(8, flag);
|
|
+ }
|
|
+
|
|
+ public void n(boolean flag) {
|
|
+ this.bH = flag;
|
|
+ }
|
|
+
|
|
+ public void o(boolean flag) {
|
|
+ this.b(4, flag);
|
|
+ }
|
|
+
|
|
+ public int cg() {
|
|
+ return this.bs;
|
|
+ }
|
|
+
|
|
+ public void s(int i) {
|
|
+ this.bs = i;
|
|
+ }
|
|
+
|
|
+ public int t(int i) {
|
|
+ int j = MathHelper.a(this.cg() + i, 0, this.cm());
|
|
+
|
|
+ this.s(j);
|
|
+ return j;
|
|
+ }
|
|
+
|
|
+ public boolean damageEntity(DamageSource damagesource, float f) {
|
|
+ Entity entity = damagesource.getEntity();
|
|
+
|
|
+ if (this.passenger != null && this.passenger.equals(entity)) {
|
|
+ return false;
|
|
+ } else if (entity instanceof EntityWolf) {
|
|
+ ((EntityWolf) entity).setTarget((Entity) null);
|
|
+ return false;
|
|
+ } else {
|
|
+ return super.damageEntity(damagesource, f);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public int aM() {
|
|
+ return by[this.cb()];
|
|
+ }
|
|
+
|
|
+ public boolean L() {
|
|
+ return this.passenger == null;
|
|
+ }
|
|
+
|
|
+ public boolean ch() {
|
|
+ int i = MathHelper.floor(this.locX);
|
|
+ int j = MathHelper.floor(this.locZ);
|
|
+
|
|
+ this.world.getBiome(i, j);
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public void ci() {
|
|
+ if (!this.world.isStatic && this.ca()) {
|
|
+ this.b(Block.CHEST.id, 1);
|
|
+ this.m(false);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private void cB() {
|
|
+ this.cI();
|
|
+ this.world.makeSound(this, "eating", 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F);
|
|
+ }
|
|
+
|
|
+ protected void b(float f) {
|
|
+ if (f > 1.0F) {
|
|
+ this.makeSound("mob.horse.land", 0.4F, 1.0F);
|
|
+ }
|
|
+
|
|
+ int i = MathHelper.f(f * 0.5F - 3.0F);
|
|
+
|
|
+ if (i > 0) {
|
|
+ this.damageEntity(DamageSource.FALL, (float) i);
|
|
+ if (this.passenger != null) {
|
|
+ this.passenger.damageEntity(DamageSource.FALL, (float) i);
|
|
+ }
|
|
+
|
|
+ int j = this.world.getTypeId(MathHelper.floor(this.locX), MathHelper.floor(this.locY - 0.2D - (double) this.lastYaw), MathHelper.floor(this.locZ));
|
|
+
|
|
+ if (j > 0) {
|
|
+ StepSound stepsound = Block.byId[j].stepSound;
|
|
+
|
|
+ this.world.makeSound(this, stepsound.getStepSound(), stepsound.getVolume1() * 0.5F, stepsound.getVolume2() * 0.75F);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private int cC() {
|
|
+ int i = this.bP();
|
|
+
|
|
+ return this.ca() && (i == 1 || i == 2) ? 17 : 2;
|
|
+ }
|
|
+
|
|
+ private void cD() {
|
|
+ InventoryHorseChest inventoryhorsechest = this.bG;
|
|
+
|
|
+ this.bG = new InventoryHorseChest("HorseChest", this.cC());
|
|
+ this.bG.a(this.getLocalizedName());
|
|
+ if (inventoryhorsechest != null) {
|
|
+ inventoryhorsechest.b(this);
|
|
+ int i = Math.min(inventoryhorsechest.getSize(), this.bG.getSize());
|
|
+
|
|
+ for (int j = 0; j < i; ++j) {
|
|
+ ItemStack itemstack = inventoryhorsechest.getItem(j);
|
|
+
|
|
+ if (itemstack != null) {
|
|
+ this.bG.setItem(j, itemstack.cloneItemStack());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ inventoryhorsechest = null;
|
|
+ }
|
|
+
|
|
+ this.bG.a(this);
|
|
+ this.cE();
|
|
+ }
|
|
+
|
|
+ private void cE() {
|
|
+ if (!this.world.isStatic) {
|
|
+ this.o(this.bG.getItem(0) != null);
|
|
+ if (this.cr()) {
|
|
+ this.r(this.d(this.bG.getItem(1)));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void a(InventorySubcontainer inventorysubcontainer) {
|
|
+ int i = this.cb();
|
|
+ boolean flag = this.ck();
|
|
+
|
|
+ this.cE();
|
|
+ if (this.ticksLived > 20) {
|
|
+ if (i == 0 && i != this.cb()) {
|
|
+ this.makeSound("mob.horse.armor", 0.5F, 1.0F);
|
|
+ }
|
|
+
|
|
+ if (!flag && this.ck()) {
|
|
+ this.makeSound("mob.horse.leather", 0.5F, 1.0F);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public boolean canSpawn() {
|
|
+ this.ch();
|
|
+ return super.canSpawn();
|
|
+ }
|
|
+
|
|
+ protected EntityHorse a(Entity entity, double d0) {
|
|
+ double d1 = Double.MAX_VALUE;
|
|
+ Entity entity1 = null;
|
|
+ List list = this.world.getEntities(entity, entity.boundingBox.a(d0, d0, d0), bu);
|
|
+ Iterator iterator = list.iterator();
|
|
+
|
|
+ while (iterator.hasNext()) {
|
|
+ Entity entity2 = (Entity) iterator.next();
|
|
+ double d2 = entity2.e(entity.locX, entity.locY, entity.locZ);
|
|
+
|
|
+ if (d2 < d1) {
|
|
+ entity1 = entity2;
|
|
+ d1 = d2;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return (EntityHorse) entity1;
|
|
+ }
|
|
+
|
|
+ public double cj() {
|
|
+ return this.a(bv).e();
|
|
+ }
|
|
+
|
|
+ protected String aL() {
|
|
+ this.cI();
|
|
+ int i = this.bP();
|
|
+
|
|
+ return i == 3 ? "mob.horse.zombie.death" : (i == 4 ? "mob.horse.skeleton.death" : (i != 1 && i != 2 ? "mob.horse.death" : "mob.horse.donkey.death"));
|
|
+ }
|
|
+
|
|
+ protected int getLootId() {
|
|
+ boolean flag = this.random.nextInt(4) == 0;
|
|
+ int i = this.bP();
|
|
+
|
|
+ return i == 4 ? Item.BONE.id : (i == 3 ? (flag ? 0 : Item.ROTTEN_FLESH.id) : Item.LEATHER.id);
|
|
+ }
|
|
+
|
|
+ protected String aK() {
|
|
+ this.cI();
|
|
+ if (this.random.nextInt(3) == 0) {
|
|
+ this.cK();
|
|
+ }
|
|
+
|
|
+ int i = this.bP();
|
|
+
|
|
+ return i == 3 ? "mob.horse.zombie.hit" : (i == 4 ? "mob.horse.skeleton.hit" : (i != 1 && i != 2 ? "mob.horse.hit" : "mob.horse.donkey.hit"));
|
|
+ }
|
|
+
|
|
+ public boolean ck() {
|
|
+ return this.w(4);
|
|
+ }
|
|
+
|
|
+ protected String r() {
|
|
+ this.cI();
|
|
+ if (this.random.nextInt(10) == 0 && !this.aY()) {
|
|
+ this.cK();
|
|
+ }
|
|
+
|
|
+ int i = this.bP();
|
|
+
|
|
+ return i == 3 ? "mob.horse.zombie.idle" : (i == 4 ? "mob.horse.skeleton.idle" : (i != 1 && i != 2 ? "mob.horse.idle" : "mob.horse.donkey.idle"));
|
|
+ }
|
|
+
|
|
+ protected String cl() {
|
|
+ this.cI();
|
|
+ this.cK();
|
|
+ int i = this.bP();
|
|
+
|
|
+ return i != 3 && i != 4 ? (i != 1 && i != 2 ? "mob.horse.angry" : "mob.horse.donkey.angry") : null;
|
|
+ }
|
|
+
|
|
+ protected void a(int i, int j, int k, int l) {
|
|
+ StepSound stepsound = Block.byId[l].stepSound;
|
|
+
|
|
+ if (this.world.getTypeId(i, j + 1, k) == Block.SNOW.id) {
|
|
+ stepsound = Block.SNOW.stepSound;
|
|
+ }
|
|
+
|
|
+ if (!Block.byId[l].material.isLiquid()) {
|
|
+ int i1 = this.bP();
|
|
+
|
|
+ if (this.passenger != null && i1 != 1 && i1 != 2) {
|
|
+ ++this.bP;
|
|
+ if (this.bP > 5 && this.bP % 3 == 0) {
|
|
+ this.makeSound("mob.horse.gallop", stepsound.getVolume1() * 0.15F, stepsound.getVolume2());
|
|
+ if (i1 == 0 && this.random.nextInt(10) == 0) {
|
|
+ this.makeSound("mob.horse.breathe", stepsound.getVolume1() * 0.6F, stepsound.getVolume2());
|
|
+ }
|
|
+ } else if (this.bP <= 5) {
|
|
+ this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2());
|
|
+ }
|
|
+ } else if (stepsound == Block.h) {
|
|
+ this.makeSound("mob.horse.soft", stepsound.getVolume1() * 0.15F, stepsound.getVolume2());
|
|
+ } else {
|
|
+ this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2());
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ protected void ax() {
|
|
+ super.ax();
|
|
+ this.aT().b(bv);
|
|
+ this.a(GenericAttributes.a).a(53.0D);
|
|
+ this.a(GenericAttributes.d).a(0.22499999403953552D);
|
|
+ }
|
|
+
|
|
+ public int br() {
|
|
+ return 6;
|
|
+ }
|
|
+
|
|
+ public int cm() {
|
|
+ return 100;
|
|
+ }
|
|
+
|
|
+ protected float aW() {
|
|
+ return 0.8F;
|
|
+ }
|
|
+
|
|
+ public int o() {
|
|
+ return 400;
|
|
+ }
|
|
+
|
|
+ private void cF() {
|
|
+ this.bQ = null;
|
|
+ }
|
|
+
|
|
+ public void f(EntityHuman entityhuman) {
|
|
+ if (!this.world.isStatic && (this.passenger == null || this.passenger == entityhuman) && this.bS()) {
|
|
+ this.bG.a(this.getLocalizedName());
|
|
+ entityhuman.openHorseInventory(this, this.bG);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public boolean a(EntityHuman entityhuman) {
|
|
+ ItemStack itemstack = entityhuman.inventory.getItemInHand();
|
|
+
|
|
+ if (itemstack != null && itemstack.id == Item.MONSTER_EGG.id) {
|
|
+ return super.a(entityhuman);
|
|
+ } else if (!this.bS() && this.cu()) {
|
|
+ return false;
|
|
+ } else if (this.bS() && this.bR() && entityhuman.isSneaking()) {
|
|
+ this.f(entityhuman);
|
|
+ return true;
|
|
+ } else if (this.bW() && this.passenger != null) {
|
|
+ return super.a(entityhuman);
|
|
+ } else {
|
|
+ if (itemstack != null) {
|
|
+ boolean flag = false;
|
|
+
|
|
+ if (this.cr()) {
|
|
+ byte b0 = -1;
|
|
+
|
|
+ if (itemstack.id == Item.HORSE_ARMOR_IRON.id) {
|
|
+ b0 = 1;
|
|
+ } else if (itemstack.id == Item.HORSE_ARMOR_GOLD.id) {
|
|
+ b0 = 2;
|
|
+ } else if (itemstack.id == Item.HORSE_ARMOR_DIAMOND.id) {
|
|
+ b0 = 3;
|
|
+ }
|
|
+
|
|
+ if (b0 >= 0) {
|
|
+ if (!this.bS()) {
|
|
+ this.cz();
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ this.f(entityhuman);
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!flag && !this.cu()) {
|
|
+ float f = 0.0F;
|
|
+ short short1 = 0;
|
|
+ byte b1 = 0;
|
|
+
|
|
+ if (itemstack.id == Item.WHEAT.id) {
|
|
+ f = 2.0F;
|
|
+ short1 = 60;
|
|
+ b1 = 3;
|
|
+ } else if (itemstack.id == Item.SUGAR.id) {
|
|
+ f = 1.0F;
|
|
+ short1 = 30;
|
|
+ b1 = 3;
|
|
+ } else if (itemstack.id == Item.BREAD.id) {
|
|
+ f = 7.0F;
|
|
+ short1 = 180;
|
|
+ b1 = 3;
|
|
+ } else if (itemstack.id == Block.HAY_BLOCK.id) {
|
|
+ f = 20.0F;
|
|
+ short1 = 180;
|
|
+ } else if (itemstack.id == Item.APPLE.id) {
|
|
+ f = 3.0F;
|
|
+ short1 = 60;
|
|
+ b1 = 3;
|
|
+ } else if (itemstack.id == Item.CARROT_GOLDEN.id) {
|
|
+ f = 4.0F;
|
|
+ short1 = 60;
|
|
+ b1 = 5;
|
|
+ if (this.bS() && this.getAge() == 0) {
|
|
+ flag = true;
|
|
+ this.bT();
|
|
+ }
|
|
+ } else if (itemstack.id == Item.GOLDEN_APPLE.id) {
|
|
+ f = 10.0F;
|
|
+ short1 = 240;
|
|
+ b1 = 10;
|
|
+ if (this.bS() && this.getAge() == 0) {
|
|
+ flag = true;
|
|
+ this.bT();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (this.getHealth() < this.getMaxHealth() && f > 0.0F) {
|
|
+ this.heal(f);
|
|
+ flag = true;
|
|
+ }
|
|
+
|
|
+ if (!this.bR() && short1 > 0) {
|
|
+ this.a(short1);
|
|
+ flag = true;
|
|
+ }
|
|
+
|
|
+ if (b1 > 0 && (flag || !this.bS()) && b1 < this.cm()) {
|
|
+ flag = true;
|
|
+ this.t(b1);
|
|
+ }
|
|
+
|
|
+ if (flag) {
|
|
+ this.cB();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!this.bS() && !flag) {
|
|
+ if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ this.cz();
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ if (!flag && this.cs() && !this.ca() && itemstack.id == Block.CHEST.id) {
|
|
+ this.m(true);
|
|
+ this.makeSound("mob.chickenplop", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
|
|
+ flag = true;
|
|
+ this.cD();
|
|
+ }
|
|
+
|
|
+ if (!flag && this.bW() && !this.ck() && itemstack.id == Item.SADDLE.id) {
|
|
+ this.f(entityhuman);
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ if (flag) {
|
|
+ if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count == 0) {
|
|
+ entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null);
|
|
+ }
|
|
+
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (this.bW() && this.passenger == null) {
|
|
+ if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) {
|
|
+ return true;
|
|
+ } else {
|
|
+ this.h(entityhuman);
|
|
+ return true;
|
|
+ }
|
|
+ } else {
|
|
+ return super.a(entityhuman);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private void h(EntityHuman entityhuman) {
|
|
+ entityhuman.yaw = this.yaw;
|
|
+ entityhuman.pitch = this.pitch;
|
|
+ this.p(false);
|
|
+ this.q(false);
|
|
+ if (!this.world.isStatic) {
|
|
+ entityhuman.mount(this);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public boolean cr() {
|
|
+ return this.bP() == 0;
|
|
+ }
|
|
+
|
|
+ public boolean cs() {
|
|
+ int i = this.bP();
|
|
+
|
|
+ return i == 2 || i == 1;
|
|
+ }
|
|
+
|
|
+ protected boolean aY() {
|
|
+ return this.passenger != null && this.ck() ? true : this.cc() || this.cd();
|
|
+ }
|
|
+
|
|
+ public boolean cu() {
|
|
+ int i = this.bP();
|
|
+
|
|
+ return i == 3 || i == 4;
|
|
+ }
|
|
+
|
|
+ public boolean cv() {
|
|
+ return this.cu() || this.bP() == 2;
|
|
+ }
|
|
+
|
|
+ public boolean c(ItemStack itemstack) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ private void cH() {
|
|
+ this.bp = 1;
|
|
+ }
|
|
+
|
|
+ public void die(DamageSource damagesource) {
|
|
+ super.die(damagesource);
|
|
+ if (!this.world.isStatic) {
|
|
+ this.cA();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void c() {
|
|
+ if (this.random.nextInt(200) == 0) {
|
|
+ this.cH();
|
|
+ }
|
|
+
|
|
+ super.c();
|
|
+ if (!this.world.isStatic) {
|
|
+ if (this.random.nextInt(900) == 0 && this.deathTicks == 0) {
|
|
+ this.heal(1.0F);
|
|
+ }
|
|
+
|
|
+ if (!this.cc() && this.passenger == null && this.random.nextInt(300) == 0 && this.world.getTypeId(MathHelper.floor(this.locX), MathHelper.floor(this.locY) - 1, MathHelper.floor(this.locZ)) == Block.GRASS.id) {
|
|
+ this.p(true);
|
|
+ }
|
|
+
|
|
+ if (this.cc() && ++this.bD > 50) {
|
|
+ this.bD = 0;
|
|
+ this.p(false);
|
|
+ }
|
|
+
|
|
+ if (this.ce() && !this.bR() && !this.cc()) {
|
|
+ EntityHorse entityhorse = this.a(this, 16.0D);
|
|
+
|
|
+ if (entityhorse != null && this.e(entityhorse) > 4.0D) {
|
|
+ PathEntity pathentity = this.world.findPath(this, entityhorse, 16.0F, true, false, false, true);
|
|
+
|
|
+ this.setPathEntity(pathentity);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void l_() {
|
|
+ super.l_();
|
|
+ if (this.world.isStatic && this.datawatcher.a()) {
|
|
+ this.datawatcher.e();
|
|
+ this.cF();
|
|
+ }
|
|
+
|
|
+ if (this.bE > 0 && ++this.bE > 30) {
|
|
+ this.bE = 0;
|
|
+ this.b(128, false);
|
|
+ }
|
|
+
|
|
+ if (!this.world.isStatic && this.bF > 0 && ++this.bF > 20) {
|
|
+ this.bF = 0;
|
|
+ this.q(false);
|
|
+ }
|
|
+
|
|
+ if (this.bp > 0 && ++this.bp > 8) {
|
|
+ this.bp = 0;
|
|
+ }
|
|
+
|
|
+ if (this.bq > 0) {
|
|
+ ++this.bq;
|
|
+ if (this.bq > 300) {
|
|
+ this.bq = 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ this.bK = this.bJ;
|
|
+ if (this.cc()) {
|
|
+ this.bJ += (1.0F - this.bJ) * 0.4F + 0.05F;
|
|
+ if (this.bJ > 1.0F) {
|
|
+ this.bJ = 1.0F;
|
|
+ }
|
|
+ } else {
|
|
+ this.bJ += (0.0F - this.bJ) * 0.4F - 0.05F;
|
|
+ if (this.bJ < 0.0F) {
|
|
+ this.bJ = 0.0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ this.bM = this.bL;
|
|
+ if (this.cd()) {
|
|
+ this.bK = this.bJ = 0.0F;
|
|
+ this.bL += (1.0F - this.bL) * 0.4F + 0.05F;
|
|
+ if (this.bL > 1.0F) {
|
|
+ this.bL = 1.0F;
|
|
+ }
|
|
+ } else {
|
|
+ this.bI = false;
|
|
+ this.bL += (0.8F * this.bL * this.bL * this.bL - this.bL) * 0.6F - 0.05F;
|
|
+ if (this.bL < 0.0F) {
|
|
+ this.bL = 0.0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ this.bO = this.bN;
|
|
+ if (this.w(128)) {
|
|
+ this.bN += (1.0F - this.bN) * 0.7F + 0.05F;
|
|
+ if (this.bN > 1.0F) {
|
|
+ this.bN = 1.0F;
|
|
+ }
|
|
+ } else {
|
|
+ this.bN += (0.0F - this.bN) * 0.7F - 0.05F;
|
|
+ if (this.bN < 0.0F) {
|
|
+ this.bN = 0.0F;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private void cI() {
|
|
+ if (!this.world.isStatic) {
|
|
+ this.bE = 1;
|
|
+ this.b(128, true);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private boolean cJ() {
|
|
+ return this.passenger == null && this.vehicle == null && this.bS() && this.bR() && !this.cv() && this.getHealth() >= this.getMaxHealth();
|
|
+ }
|
|
+
|
|
+ public void die() {
|
|
+ if (this.world.isStatic || !this.bS() && !this.ce() || this.getHealth() <= 0.0F) {
|
|
+ super.die();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void e(boolean flag) {
|
|
+ this.b(32, flag);
|
|
+ }
|
|
+
|
|
+ public void p(boolean flag) {
|
|
+ this.e(flag);
|
|
+ }
|
|
+
|
|
+ public void q(boolean flag) {
|
|
+ if (flag) {
|
|
+ this.p(false);
|
|
+ }
|
|
+
|
|
+ this.b(64, flag);
|
|
+ }
|
|
+
|
|
+ private void cK() {
|
|
+ if (!this.world.isStatic) {
|
|
+ this.bF = 1;
|
|
+ this.q(true);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void cz() {
|
|
+ this.cK();
|
|
+ String s = this.cl();
|
|
+
|
|
+ if (s != null) {
|
|
+ this.makeSound(s, this.aW(), this.aX());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void cA() {
|
|
+ this.a(this, this.bG);
|
|
+ this.ci();
|
|
+ }
|
|
+
|
|
+ private void a(Entity entity, InventoryHorseChest inventoryhorsechest) {
|
|
+ if (inventoryhorsechest != null && !this.world.isStatic) {
|
|
+ for (int i = 0; i < inventoryhorsechest.getSize(); ++i) {
|
|
+ ItemStack itemstack = inventoryhorsechest.getItem(i);
|
|
+
|
|
+ if (itemstack != null) {
|
|
+ this.a(itemstack, 0.0F);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public boolean g(EntityHuman entityhuman) {
|
|
+ this.b(entityhuman.getName());
|
|
+ this.j(true);
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public void e(float f, float f1) {
|
|
+ if (this.passenger != null && this.ck()) {
|
|
+ this.lastYaw = this.yaw = this.passenger.yaw;
|
|
+ this.pitch = this.passenger.pitch * 0.5F;
|
|
+ this.b(this.yaw, this.pitch);
|
|
+ this.aP = this.aN = this.yaw;
|
|
+ f = ((EntityLiving) this.passenger).be * 0.5F;
|
|
+ f1 = ((EntityLiving) this.passenger).bf;
|
|
+ if (f1 <= 0.0F) {
|
|
+ f1 *= 0.25F;
|
|
+ this.bP = 0;
|
|
+ }
|
|
+
|
|
+ if (this.onGround && this.bt == 0.0F && this.cd() && !this.bI) {
|
|
+ f = 0.0F;
|
|
+ f1 = 0.0F;
|
|
+ }
|
|
+
|
|
+ if (this.bt > 0.0F && !this.bZ() && this.onGround) {
|
|
+ this.motY = this.cj() * (double) this.bt;
|
|
+ if (this.hasEffect(MobEffectList.JUMP)) {
|
|
+ this.motY += (double) ((float) (this.getEffect(MobEffectList.JUMP).getAmplifier() + 1) * 0.1F);
|
|
+ }
|
|
+
|
|
+ this.k(true);
|
|
+ this.an = true;
|
|
+ if (f1 > 0.0F) {
|
|
+ float f2 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F);
|
|
+ float f3 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F);
|
|
+
|
|
+ this.motX += (double) (-0.4F * f2 * this.bt);
|
|
+ this.motZ += (double) (0.4F * f3 * this.bt);
|
|
+ this.makeSound("mob.horse.jump", 0.4F, 1.0F);
|
|
+ }
|
|
+
|
|
+ this.bt = 0.0F;
|
|
+ }
|
|
+
|
|
+ this.Y = 1.0F;
|
|
+ this.aR = this.bc() * 0.1F;
|
|
+ if (!this.world.isStatic) {
|
|
+ this.i((float) this.a(GenericAttributes.d).e());
|
|
+ super.e(f, f1);
|
|
+ }
|
|
+
|
|
+ if (this.onGround) {
|
|
+ this.bt = 0.0F;
|
|
+ this.k(false);
|
|
+ }
|
|
+
|
|
+ this.aF = this.aG;
|
|
+ double d0 = this.locX - this.lastX;
|
|
+ double d1 = this.locZ - this.lastZ;
|
|
+ float f4 = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F;
|
|
+
|
|
+ if (f4 > 1.0F) {
|
|
+ f4 = 1.0F;
|
|
+ }
|
|
+
|
|
+ this.aG += (f4 - this.aG) * 0.4F;
|
|
+ this.aH += this.aG;
|
|
+ } else {
|
|
+ this.Y = 0.5F;
|
|
+ this.aR = 0.02F;
|
|
+ super.e(f, f1);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void b(NBTTagCompound nbttagcompound) {
|
|
+ super.b(nbttagcompound);
|
|
+ nbttagcompound.setBoolean("EatingHaystack", this.cc());
|
|
+ nbttagcompound.setBoolean("ChestedHorse", this.ca());
|
|
+ nbttagcompound.setBoolean("HasReproduced", this.cf());
|
|
+ nbttagcompound.setBoolean("Bred", this.ce());
|
|
+ nbttagcompound.setInt("Type", this.bP());
|
|
+ nbttagcompound.setInt("Variant", this.bQ());
|
|
+ nbttagcompound.setInt("Temper", this.cg());
|
|
+ nbttagcompound.setBoolean("Tame", this.bS());
|
|
+ if (this.ca()) {
|
|
+ NBTTagList nbttaglist = new NBTTagList();
|
|
+
|
|
+ for (int i = 2; i < this.bG.getSize(); ++i) {
|
|
+ ItemStack itemstack = this.bG.getItem(i);
|
|
+
|
|
+ if (itemstack != null) {
|
|
+ NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
|
+
|
|
+ nbttagcompound1.setByte("Slot", (byte) i);
|
|
+ itemstack.save(nbttagcompound1);
|
|
+ nbttaglist.add(nbttagcompound1);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ nbttagcompound.set("Items", nbttaglist);
|
|
+ }
|
|
+
|
|
+ if (this.bG.getItem(1) != null) {
|
|
+ nbttagcompound.set("ArmorItem", this.bG.getItem(1).save(new NBTTagCompound("ArmorItem")));
|
|
+ }
|
|
+
|
|
+ if (this.bG.getItem(0) != null) {
|
|
+ nbttagcompound.set("SaddleItem", this.bG.getItem(0).save(new NBTTagCompound("SaddleItem")));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void a(NBTTagCompound nbttagcompound) {
|
|
+ super.a(nbttagcompound);
|
|
+ this.p(nbttagcompound.getBoolean("EatingHaystack"));
|
|
+ this.l(nbttagcompound.getBoolean("Bred"));
|
|
+ this.m(nbttagcompound.getBoolean("ChestedHorse"));
|
|
+ this.n(nbttagcompound.getBoolean("HasReproduced"));
|
|
+ this.p(nbttagcompound.getInt("Type"));
|
|
+ this.q(nbttagcompound.getInt("Variant"));
|
|
+ this.s(nbttagcompound.getInt("Temper"));
|
|
+ this.j(nbttagcompound.getBoolean("Tame"));
|
|
+ AttributeInstance attributeinstance = this.aT().a("Speed");
|
|
+
|
|
+ if (attributeinstance != null) {
|
|
+ this.a(GenericAttributes.d).a(attributeinstance.b() * 0.25D);
|
|
+ }
|
|
+
|
|
+ if (this.ca()) {
|
|
+ NBTTagList nbttaglist = nbttagcompound.getList("Items");
|
|
+
|
|
+ this.cD();
|
|
+
|
|
+ for (int i = 0; i < nbttaglist.size(); ++i) {
|
|
+ NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.get(i);
|
|
+ int j = nbttagcompound1.getByte("Slot") & 255;
|
|
+
|
|
+ if (j >= 2 && j < this.bG.getSize()) {
|
|
+ this.bG.setItem(j, ItemStack.createStack(nbttagcompound1));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ ItemStack itemstack;
|
|
+
|
|
+ if (nbttagcompound.hasKey("ArmorItem")) {
|
|
+ itemstack = ItemStack.createStack(nbttagcompound.getCompound("ArmorItem"));
|
|
+ if (itemstack != null && v(itemstack.id)) {
|
|
+ this.bG.setItem(1, itemstack);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (nbttagcompound.hasKey("SaddleItem")) {
|
|
+ itemstack = ItemStack.createStack(nbttagcompound.getCompound("SaddleItem"));
|
|
+ if (itemstack != null && itemstack.id == Item.SADDLE.id) {
|
|
+ this.bG.setItem(0, itemstack);
|
|
+ }
|
|
+ } else if (nbttagcompound.getBoolean("Saddle")) {
|
|
+ this.bG.setItem(0, new ItemStack(Item.SADDLE));
|
|
+ }
|
|
+
|
|
+ this.cE();
|
|
+ }
|
|
+
|
|
+ public boolean mate(EntityAnimal entityanimal) {
|
|
+ if (entityanimal == this) {
|
|
+ return false;
|
|
+ } else if (entityanimal.getClass() != this.getClass()) {
|
|
+ return false;
|
|
+ } else {
|
|
+ EntityHorse entityhorse = (EntityHorse) entityanimal;
|
|
+
|
|
+ if (this.cJ() && entityhorse.cJ()) {
|
|
+ int i = this.bP();
|
|
+ int j = entityhorse.bP();
|
|
+
|
|
+ return i == j || i == 0 && j == 1 || i == 1 && j == 0;
|
|
+ } else {
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public EntityAgeable createChild(EntityAgeable entityageable) {
|
|
+ EntityHorse entityhorse = (EntityHorse) entityageable;
|
|
+ EntityHorse entityhorse1 = new EntityHorse(this.world);
|
|
+ int i = this.bP();
|
|
+ int j = entityhorse.bP();
|
|
+ int k = 0;
|
|
+
|
|
+ if (i == j) {
|
|
+ k = i;
|
|
+ } else if (i == 0 && j == 1 || i == 1 && j == 0) {
|
|
+ k = 2;
|
|
+ }
|
|
+
|
|
+ if (k == 0) {
|
|
+ int l = this.random.nextInt(9);
|
|
+ int i1;
|
|
+
|
|
+ if (l < 4) {
|
|
+ i1 = this.bQ() & 255;
|
|
+ } else if (l < 8) {
|
|
+ i1 = entityhorse.bQ() & 255;
|
|
+ } else {
|
|
+ i1 = this.random.nextInt(7);
|
|
+ }
|
|
+
|
|
+ int j1 = this.random.nextInt(5);
|
|
+
|
|
+ if (j1 < 4) {
|
|
+ i1 |= this.bQ() & '\uff00';
|
|
+ } else if (j1 < 8) {
|
|
+ i1 |= entityhorse.bQ() & '\uff00';
|
|
+ } else {
|
|
+ i1 |= this.random.nextInt(5) << 8 & '\uff00';
|
|
+ }
|
|
+
|
|
+ entityhorse1.q(i1);
|
|
+ }
|
|
+
|
|
+ entityhorse1.p(k);
|
|
+ double d0 = this.a(GenericAttributes.a).b() + entityageable.a(GenericAttributes.a).b() + (double) this.cL();
|
|
+
|
|
+ entityhorse1.a(GenericAttributes.a).a(d0 / 3.0D);
|
|
+ double d1 = this.a(bv).b() + entityageable.a(bv).b() + this.cM();
|
|
+
|
|
+ entityhorse1.a(bv).a(d1 / 3.0D);
|
|
+ double d2 = this.a(GenericAttributes.d).b() + entityageable.a(GenericAttributes.d).b() + this.cN();
|
|
+
|
|
+ entityhorse1.a(GenericAttributes.d).a(d2 / 3.0D);
|
|
+ return entityhorse1;
|
|
+ }
|
|
+
|
|
+ public GroupDataEntity a(GroupDataEntity groupdataentity) {
|
|
+ Object object = super.a(groupdataentity);
|
|
+ boolean flag = false;
|
|
+ int i = 0;
|
|
+ int j;
|
|
+
|
|
+ if (object instanceof GroupDataHorse) {
|
|
+ j = ((GroupDataHorse) object).a;
|
|
+ i = ((GroupDataHorse) object).b & 255 | this.random.nextInt(5) << 8;
|
|
+ } else {
|
|
+ if (this.random.nextInt(10) == 0) {
|
|
+ j = 1;
|
|
+ } else {
|
|
+ int k = this.random.nextInt(7);
|
|
+ int l = this.random.nextInt(5);
|
|
+
|
|
+ j = 0;
|
|
+ i = k | l << 8;
|
|
+ }
|
|
+
|
|
+ object = new GroupDataHorse(j, i);
|
|
+ }
|
|
+
|
|
+ this.p(j);
|
|
+ this.q(i);
|
|
+ if (this.random.nextInt(5) == 0) {
|
|
+ this.setAge(-24000);
|
|
+ }
|
|
+
|
|
+ if (j != 4 && j != 3) {
|
|
+ this.a(GenericAttributes.a).a((double) this.cL());
|
|
+ if (j == 0) {
|
|
+ this.a(GenericAttributes.d).a(this.cN());
|
|
+ } else {
|
|
+ this.a(GenericAttributes.d).a(0.17499999701976776D);
|
|
+ }
|
|
+ } else {
|
|
+ this.a(GenericAttributes.a).a(15.0D);
|
|
+ this.a(GenericAttributes.d).a(0.20000000298023224D);
|
|
+ }
|
|
+
|
|
+ if (j != 2 && j != 1) {
|
|
+ this.a(bv).a(this.cM());
|
|
+ } else {
|
|
+ this.a(bv).a(0.5D);
|
|
+ }
|
|
+
|
|
+ this.setHealth(this.getMaxHealth());
|
|
+ return (GroupDataEntity) object;
|
|
+ }
|
|
+
|
|
+ protected boolean bb() {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public void u(int i) {
|
|
+ if (i < 0) {
|
|
+ i = 0;
|
|
+ } else {
|
|
+ this.bI = true;
|
|
+ this.cK();
|
|
+ }
|
|
+
|
|
+ if (i >= 90) {
|
|
+ this.bt = 1.0F;
|
|
+ } else {
|
|
+ this.bt = 0.4F + 0.4F * (float) i / 90.0F;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void U() {
|
|
+ super.U();
|
|
+ if (this.bM > 0.0F) {
|
|
+ float f = MathHelper.sin(this.aN * 3.1415927F / 180.0F);
|
|
+ float f1 = MathHelper.cos(this.aN * 3.1415927F / 180.0F);
|
|
+ float f2 = 0.7F * this.bM;
|
|
+ float f3 = 0.15F * this.bM;
|
|
+
|
|
+ this.passenger.setPosition(this.locX + (double) (f2 * f), this.locY + this.W() + this.passenger.V() + (double) f3, this.locZ - (double) (f2 * f1));
|
|
+ if (this.passenger instanceof EntityLiving) {
|
|
+ ((EntityLiving) this.passenger).aN = this.aN;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private float cL() {
|
|
+ return 15.0F + (float) this.random.nextInt(8) + (float) this.random.nextInt(9);
|
|
+ }
|
|
+
|
|
+ private double cM() {
|
|
+ return 0.4000000059604645D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D;
|
|
+ }
|
|
+
|
|
+ private double cN() {
|
|
+ return (0.44999998807907104D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D) * 0.25D;
|
|
+ }
|
|
+
|
|
+ public static boolean v(int i) {
|
|
+ return i == Item.HORSE_ARMOR_IRON.id || i == Item.HORSE_ARMOR_GOLD.id || i == Item.HORSE_ARMOR_DIAMOND.id;
|
|
+ }
|
|
+
|
|
+ public boolean e() {
|
|
+ return false;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/LocaleLanguage.java b/src/main/java/net/minecraft/server/LocaleLanguage.java
|
|
new file mode 100644
|
|
index 0000000..aa937fb
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/LocaleLanguage.java
|
|
@@ -0,0 +1,73 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import com.google.common.base.Splitter;
|
|
+import com.google.common.collect.Iterables;
|
|
+import com.google.common.collect.Maps;
|
|
+import java.io.IOException;
|
|
+import java.io.InputStream;
|
|
+import java.util.IllegalFormatException;
|
|
+import java.util.Iterator;
|
|
+import java.util.Map;
|
|
+import java.util.regex.Pattern;
|
|
+import org.apache.commons.io.Charsets;
|
|
+import org.apache.commons.io.IOUtils;
|
|
+
|
|
+public class LocaleLanguage {
|
|
+
|
|
+ private static final Pattern a = Pattern.compile("%(\\d+\\$)?[\\d\\.]*[df]");
|
|
+ private static final Splitter b = Splitter.on('=').limit(2);
|
|
+ private static LocaleLanguage c = new LocaleLanguage();
|
|
+ private Map d = Maps.newHashMap();
|
|
+
|
|
+ public LocaleLanguage() {
|
|
+ try {
|
|
+ InputStream inputstream = LocaleLanguage.class.getResourceAsStream("/assets/minecraft/lang/en_US.lang");
|
|
+ Iterator iterator = IOUtils.readLines(inputstream, Charsets.UTF_8).iterator();
|
|
+
|
|
+ while (iterator.hasNext()) {
|
|
+ String s = (String) iterator.next();
|
|
+
|
|
+ if (!s.isEmpty() && s.charAt(0) != 35) {
|
|
+ String[] astring = (String[]) Iterables.toArray(b.split(s), String.class);
|
|
+
|
|
+ if (astring != null && astring.length == 2) {
|
|
+ String s1 = astring[0];
|
|
+ String s2 = a.matcher(astring[1]).replaceAll("%$1s");
|
|
+
|
|
+ this.d.put(s1, s2);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ } catch (IOException ioexception) {
|
|
+ ;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ static LocaleLanguage a() {
|
|
+ return c;
|
|
+ }
|
|
+
|
|
+ public synchronized String a(String s) {
|
|
+ return this.c(s);
|
|
+ }
|
|
+
|
|
+ public synchronized String a(String s, Object... aobject) {
|
|
+ String s1 = this.c(s);
|
|
+
|
|
+ try {
|
|
+ return String.format(s1, aobject);
|
|
+ } catch (IllegalFormatException illegalformatexception) {
|
|
+ return "Format error: " + s1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private String c(String s) {
|
|
+ String s1 = (String) this.d.get(s);
|
|
+
|
|
+ return s1 == null ? s : s1;
|
|
+ }
|
|
+
|
|
+ public synchronized boolean b(String s) {
|
|
+ return this.d.containsKey(s);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/NextTickListEntry.java b/src/main/java/net/minecraft/server/NextTickListEntry.java
|
|
new file mode 100644
|
|
index 0000000..acf8838
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/NextTickListEntry.java
|
|
@@ -0,0 +1,56 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+public class NextTickListEntry implements Comparable {
|
|
+
|
|
+ private static long g;
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public int c;
|
|
+ public int d;
|
|
+ public long e;
|
|
+ public int f;
|
|
+ private long h;
|
|
+
|
|
+ public NextTickListEntry(int i, int j, int k, int l) {
|
|
+ this.h = (long) (g++);
|
|
+ this.a = i;
|
|
+ this.b = j;
|
|
+ this.c = k;
|
|
+ this.d = l;
|
|
+ }
|
|
+
|
|
+ public boolean equals(Object object) {
|
|
+ if (!(object instanceof NextTickListEntry)) {
|
|
+ return false;
|
|
+ } else {
|
|
+ NextTickListEntry nextticklistentry = (NextTickListEntry) object;
|
|
+
|
|
+ return this.a == nextticklistentry.a && this.b == nextticklistentry.b && this.c == nextticklistentry.c && Block.b(this.d, nextticklistentry.d);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public int hashCode() {
|
|
+ return (this.a * 1024 * 1024 + this.c * 1024 + this.b) * 256;
|
|
+ }
|
|
+
|
|
+ public NextTickListEntry a(long i) {
|
|
+ this.e = i;
|
|
+ return this;
|
|
+ }
|
|
+
|
|
+ public void a(int i) {
|
|
+ this.f = i;
|
|
+ }
|
|
+
|
|
+ public int compareTo(NextTickListEntry nextticklistentry) {
|
|
+ return this.e < nextticklistentry.e ? -1 : (this.e > nextticklistentry.e ? 1 : (this.f != nextticklistentry.f ? this.f - nextticklistentry.f : (this.h < nextticklistentry.h ? -1 : (this.h > nextticklistentry.h ? 1 : 0))));
|
|
+ }
|
|
+
|
|
+ public String toString() {
|
|
+ return this.d + ": (" + this.a + ", " + this.b + ", " + this.c + "), " + this.e + ", " + this.f + ", " + this.h;
|
|
+ }
|
|
+
|
|
+ public int compareTo(Object object) {
|
|
+ return this.compareTo((NextTickListEntry) object);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/NibbleArray.java b/src/main/java/net/minecraft/server/NibbleArray.java
|
|
new file mode 100644
|
|
index 0000000..5d75a54
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/NibbleArray.java
|
|
@@ -0,0 +1,40 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+public class NibbleArray {
|
|
+
|
|
+ public final byte[] a;
|
|
+ private final int b;
|
|
+ private final int c;
|
|
+
|
|
+ public NibbleArray(int i, int j) {
|
|
+ this.a = new byte[i >> 1];
|
|
+ this.b = j;
|
|
+ this.c = j + 4;
|
|
+ }
|
|
+
|
|
+ public NibbleArray(byte[] abyte, int i) {
|
|
+ this.a = abyte;
|
|
+ this.b = i;
|
|
+ this.c = i + 4;
|
|
+ }
|
|
+
|
|
+ public int a(int i, int j, int k) {
|
|
+ int l = j << this.c | k << this.b | i;
|
|
+ int i1 = l >> 1;
|
|
+ int j1 = l & 1;
|
|
+
|
|
+ return j1 == 0 ? this.a[i1] & 15 : this.a[i1] >> 4 & 15;
|
|
+ }
|
|
+
|
|
+ public void a(int i, int j, int k, int l) {
|
|
+ int i1 = j << this.c | k << this.b | i;
|
|
+ int j1 = i1 >> 1;
|
|
+ int k1 = i1 & 1;
|
|
+
|
|
+ if (k1 == 0) {
|
|
+ this.a[j1] = (byte) (this.a[j1] & 240 | l & 15);
|
|
+ } else {
|
|
+ this.a[j1] = (byte) (this.a[j1] & 15 | (l & 15) << 4);
|
|
+ }
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/OldChunkLoader.java b/src/main/java/net/minecraft/server/OldChunkLoader.java
|
|
new file mode 100644
|
|
index 0000000..53c1cb5
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/OldChunkLoader.java
|
|
@@ -0,0 +1,120 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+public class OldChunkLoader {
|
|
+
|
|
+ public static OldChunk a(NBTTagCompound nbttagcompound) {
|
|
+ int i = nbttagcompound.getInt("xPos");
|
|
+ int j = nbttagcompound.getInt("zPos");
|
|
+ OldChunk oldchunk = new OldChunk(i, j);
|
|
+
|
|
+ oldchunk.g = nbttagcompound.getByteArray("Blocks");
|
|
+ oldchunk.f = new OldNibbleArray(nbttagcompound.getByteArray("Data"), 7);
|
|
+ oldchunk.e = new OldNibbleArray(nbttagcompound.getByteArray("SkyLight"), 7);
|
|
+ oldchunk.d = new OldNibbleArray(nbttagcompound.getByteArray("BlockLight"), 7);
|
|
+ oldchunk.c = nbttagcompound.getByteArray("HeightMap");
|
|
+ oldchunk.b = nbttagcompound.getBoolean("TerrainPopulated");
|
|
+ oldchunk.h = nbttagcompound.getList("Entities");
|
|
+ oldchunk.i = nbttagcompound.getList("TileEntities");
|
|
+ oldchunk.j = nbttagcompound.getList("TileTicks");
|
|
+
|
|
+ try {
|
|
+ oldchunk.a = nbttagcompound.getLong("LastUpdate");
|
|
+ } catch (ClassCastException classcastexception) {
|
|
+ oldchunk.a = (long) nbttagcompound.getInt("LastUpdate");
|
|
+ }
|
|
+
|
|
+ return oldchunk;
|
|
+ }
|
|
+
|
|
+ public static void a(OldChunk oldchunk, NBTTagCompound nbttagcompound, WorldChunkManager worldchunkmanager) {
|
|
+ nbttagcompound.setInt("xPos", oldchunk.k);
|
|
+ nbttagcompound.setInt("zPos", oldchunk.l);
|
|
+ nbttagcompound.setLong("LastUpdate", oldchunk.a);
|
|
+ int[] aint = new int[oldchunk.c.length];
|
|
+
|
|
+ for (int i = 0; i < oldchunk.c.length; ++i) {
|
|
+ aint[i] = oldchunk.c[i];
|
|
+ }
|
|
+
|
|
+ nbttagcompound.setIntArray("HeightMap", aint);
|
|
+ nbttagcompound.setBoolean("TerrainPopulated", oldchunk.b);
|
|
+ NBTTagList nbttaglist = new NBTTagList("Sections");
|
|
+
|
|
+ int j;
|
|
+
|
|
+ for (int k = 0; k < 8; ++k) {
|
|
+ boolean flag = true;
|
|
+
|
|
+ for (j = 0; j < 16 && flag; ++j) {
|
|
+ int l = 0;
|
|
+
|
|
+ while (l < 16 && flag) {
|
|
+ int i1 = 0;
|
|
+
|
|
+ while (true) {
|
|
+ if (i1 < 16) {
|
|
+ int j1 = j << 11 | i1 << 7 | l + (k << 4);
|
|
+ byte b0 = oldchunk.g[j1];
|
|
+
|
|
+ if (b0 == 0) {
|
|
+ ++i1;
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ flag = false;
|
|
+ }
|
|
+
|
|
+ ++l;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!flag) {
|
|
+ byte[] abyte = new byte[4096];
|
|
+ NibbleArray nibblearray = new NibbleArray(abyte.length, 4);
|
|
+ NibbleArray nibblearray1 = new NibbleArray(abyte.length, 4);
|
|
+ NibbleArray nibblearray2 = new NibbleArray(abyte.length, 4);
|
|
+
|
|
+ for (int k1 = 0; k1 < 16; ++k1) {
|
|
+ for (int l1 = 0; l1 < 16; ++l1) {
|
|
+ for (int i2 = 0; i2 < 16; ++i2) {
|
|
+ int j2 = k1 << 11 | i2 << 7 | l1 + (k << 4);
|
|
+ byte b1 = oldchunk.g[j2];
|
|
+
|
|
+ abyte[l1 << 8 | i2 << 4 | k1] = (byte) (b1 & 255);
|
|
+ nibblearray.a(k1, l1, i2, oldchunk.f.a(k1, l1 + (k << 4), i2));
|
|
+ nibblearray1.a(k1, l1, i2, oldchunk.e.a(k1, l1 + (k << 4), i2));
|
|
+ nibblearray2.a(k1, l1, i2, oldchunk.d.a(k1, l1 + (k << 4), i2));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
|
+
|
|
+ nbttagcompound1.setByte("Y", (byte) (k & 255));
|
|
+ nbttagcompound1.setByteArray("Blocks", abyte);
|
|
+ nbttagcompound1.setByteArray("Data", nibblearray.a);
|
|
+ nbttagcompound1.setByteArray("SkyLight", nibblearray1.a);
|
|
+ nbttagcompound1.setByteArray("BlockLight", nibblearray2.a);
|
|
+ nbttaglist.add(nbttagcompound1);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ nbttagcompound.set("Sections", nbttaglist);
|
|
+ byte[] abyte1 = new byte[256];
|
|
+
|
|
+ for (int k2 = 0; k2 < 16; ++k2) {
|
|
+ for (j = 0; j < 16; ++j) {
|
|
+ abyte1[j << 4 | k2] = (byte) (worldchunkmanager.getBiome(oldchunk.k << 4 | k2, oldchunk.l << 4 | j).id & 255);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ nbttagcompound.setByteArray("Biomes", abyte1);
|
|
+ nbttagcompound.set("Entities", oldchunk.h);
|
|
+ nbttagcompound.set("TileEntities", oldchunk.i);
|
|
+ if (oldchunk.j != null) {
|
|
+ nbttagcompound.set("TileTicks", oldchunk.j);
|
|
+ }
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/Packet254GetInfo.java b/src/main/java/net/minecraft/server/Packet254GetInfo.java
|
|
new file mode 100644
|
|
index 0000000..9afa795
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/Packet254GetInfo.java
|
|
@@ -0,0 +1,53 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.io.DataInput;
|
|
+import java.io.DataOutput;
|
|
+
|
|
+public class Packet254GetInfo extends Packet {
|
|
+
|
|
+ private static final int d = (new Packet250CustomPayload()).n();
|
|
+ public int a;
|
|
+ public String b;
|
|
+ public int c;
|
|
+
|
|
+ public Packet254GetInfo() {}
|
|
+
|
|
+ public void a(DataInput datainput) throws java.io.IOException { // Spigot - throws
|
|
+ try {
|
|
+ datainput.readByte();
|
|
+ datainput.readByte();
|
|
+ a(datainput, 255);
|
|
+ datainput.readShort();
|
|
+ this.a = datainput.readByte();
|
|
+ if (this.a >= 73) {
|
|
+ this.b = a(datainput, 255);
|
|
+ this.c = datainput.readInt();
|
|
+ }
|
|
+ } catch (Throwable throwable) {
|
|
+ this.a = 0;
|
|
+ this.b = "";
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void a(DataOutput dataoutput) throws java.io.IOException { // Spigot - throws
|
|
+ dataoutput.writeByte(1);
|
|
+ dataoutput.writeByte(d);
|
|
+ Packet.a("MC|PingHost", dataoutput);
|
|
+ dataoutput.writeShort(3 + 2 * this.b.length() + 4);
|
|
+ dataoutput.writeByte(this.a);
|
|
+ Packet.a(this.b, dataoutput);
|
|
+ dataoutput.writeInt(this.c);
|
|
+ }
|
|
+
|
|
+ public void handle(Connection connection) {
|
|
+ connection.a(this);
|
|
+ }
|
|
+
|
|
+ public int a() {
|
|
+ return 3 + this.b.length() * 2 + 4;
|
|
+ }
|
|
+
|
|
+ public boolean d() {
|
|
+ return this.a == 0;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/Packet51MapChunk.java b/src/main/java/net/minecraft/server/Packet51MapChunk.java
|
|
new file mode 100644
|
|
index 0000000..4e67e27
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/Packet51MapChunk.java
|
|
@@ -0,0 +1,186 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.io.DataInput;
|
|
+import java.io.DataOutput;
|
|
+import java.io.IOException;
|
|
+import java.util.zip.DataFormatException;
|
|
+import java.util.zip.Deflater;
|
|
+import java.util.zip.Inflater;
|
|
+
|
|
+public class Packet51MapChunk extends Packet {
|
|
+
|
|
+ public int a;
|
|
+ public int b;
|
|
+ public int c;
|
|
+ public int d;
|
|
+ private byte[] buffer;
|
|
+ private byte[] inflatedBuffer;
|
|
+ public boolean e;
|
|
+ private int size;
|
|
+ private static byte[] buildBuffer = new byte[196864];
|
|
+
|
|
+ public Packet51MapChunk() {
|
|
+ this.lowPriority = true;
|
|
+ }
|
|
+
|
|
+ public Packet51MapChunk(Chunk chunk, boolean flag, int i) {
|
|
+ this.lowPriority = true;
|
|
+ this.a = chunk.x;
|
|
+ this.b = chunk.z;
|
|
+ this.e = flag;
|
|
+ ChunkMap chunkmap = a(chunk, flag, i);
|
|
+ Deflater deflater = new Deflater(-1);
|
|
+
|
|
+ this.d = chunkmap.c;
|
|
+ this.c = chunkmap.b;
|
|
+
|
|
+ try {
|
|
+ this.inflatedBuffer = chunkmap.a;
|
|
+ deflater.setInput(chunkmap.a, 0, chunkmap.a.length);
|
|
+ deflater.finish();
|
|
+ this.buffer = new byte[chunkmap.a.length];
|
|
+ this.size = deflater.deflate(this.buffer);
|
|
+ } finally {
|
|
+ deflater.end();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void a(DataInput datainput) throws java.io.IOException { // Spigot - throws
|
|
+ this.a = datainput.readInt();
|
|
+ this.b = datainput.readInt();
|
|
+ this.e = datainput.readBoolean();
|
|
+ this.c = datainput.readShort();
|
|
+ this.d = datainput.readShort();
|
|
+ this.size = datainput.readInt();
|
|
+ if (buildBuffer.length < this.size) {
|
|
+ buildBuffer = new byte[this.size];
|
|
+ }
|
|
+
|
|
+ datainput.readFully(buildBuffer, 0, this.size);
|
|
+ int i = 0;
|
|
+
|
|
+ int j;
|
|
+
|
|
+ for (j = 0; j < 16; ++j) {
|
|
+ i += this.c >> j & 1;
|
|
+ }
|
|
+
|
|
+ j = 12288 * i;
|
|
+ if (this.e) {
|
|
+ j += 256;
|
|
+ }
|
|
+
|
|
+ this.inflatedBuffer = new byte[j];
|
|
+ Inflater inflater = new Inflater();
|
|
+
|
|
+ inflater.setInput(buildBuffer, 0, this.size);
|
|
+
|
|
+ try {
|
|
+ inflater.inflate(this.inflatedBuffer);
|
|
+ } catch (DataFormatException dataformatexception) {
|
|
+ throw new IOException("Bad compressed data format");
|
|
+ } finally {
|
|
+ inflater.end();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void a(DataOutput dataoutput) throws java.io.IOException { // Spigot - throws
|
|
+ dataoutput.writeInt(this.a);
|
|
+ dataoutput.writeInt(this.b);
|
|
+ dataoutput.writeBoolean(this.e);
|
|
+ dataoutput.writeShort((short) (this.c & '\uffff'));
|
|
+ dataoutput.writeShort((short) (this.d & '\uffff'));
|
|
+ dataoutput.writeInt(this.size);
|
|
+ dataoutput.write(this.buffer, 0, this.size);
|
|
+ }
|
|
+
|
|
+ public void handle(Connection connection) {
|
|
+ connection.a(this);
|
|
+ }
|
|
+
|
|
+ public int a() {
|
|
+ return 17 + this.size;
|
|
+ }
|
|
+
|
|
+ public static ChunkMap a(Chunk chunk, boolean flag, int i) {
|
|
+ int j = 0;
|
|
+ ChunkSection[] achunksection = chunk.i();
|
|
+ int k = 0;
|
|
+ ChunkMap chunkmap = new ChunkMap();
|
|
+ byte[] abyte = buildBuffer;
|
|
+
|
|
+ if (flag) {
|
|
+ chunk.seenByPlayer = true;
|
|
+ }
|
|
+
|
|
+ int l;
|
|
+
|
|
+ for (l = 0; l < achunksection.length; ++l) {
|
|
+ if (achunksection[l] != null && (!flag || !achunksection[l].isEmpty()) && (i & 1 << l) != 0) {
|
|
+ chunkmap.b |= 1 << l;
|
|
+ if (achunksection[l].getExtendedIdArray() != null) {
|
|
+ chunkmap.c |= 1 << l;
|
|
+ ++k;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ for (l = 0; l < achunksection.length; ++l) {
|
|
+ if (achunksection[l] != null && (!flag || !achunksection[l].isEmpty()) && (i & 1 << l) != 0) {
|
|
+ byte[] abyte1 = achunksection[l].getIdArray();
|
|
+
|
|
+ System.arraycopy(abyte1, 0, abyte, j, abyte1.length);
|
|
+ j += abyte1.length;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ NibbleArray nibblearray;
|
|
+
|
|
+ for (l = 0; l < achunksection.length; ++l) {
|
|
+ if (achunksection[l] != null && (!flag || !achunksection[l].isEmpty()) && (i & 1 << l) != 0) {
|
|
+ nibblearray = achunksection[l].getDataArray();
|
|
+ System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length);
|
|
+ j += nibblearray.a.length;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ for (l = 0; l < achunksection.length; ++l) {
|
|
+ if (achunksection[l] != null && (!flag || !achunksection[l].isEmpty()) && (i & 1 << l) != 0) {
|
|
+ nibblearray = achunksection[l].getEmittedLightArray();
|
|
+ System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length);
|
|
+ j += nibblearray.a.length;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!chunk.world.worldProvider.g) {
|
|
+ for (l = 0; l < achunksection.length; ++l) {
|
|
+ if (achunksection[l] != null && (!flag || !achunksection[l].isEmpty()) && (i & 1 << l) != 0) {
|
|
+ nibblearray = achunksection[l].getSkyLightArray();
|
|
+ System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length);
|
|
+ j += nibblearray.a.length;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (k > 0) {
|
|
+ for (l = 0; l < achunksection.length; ++l) {
|
|
+ if (achunksection[l] != null && (!flag || !achunksection[l].isEmpty()) && achunksection[l].getExtendedIdArray() != null && (i & 1 << l) != 0) {
|
|
+ nibblearray = achunksection[l].getExtendedIdArray();
|
|
+ System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length);
|
|
+ j += nibblearray.a.length;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (flag) {
|
|
+ byte[] abyte2 = chunk.m();
|
|
+
|
|
+ System.arraycopy(abyte2, 0, abyte, j, abyte2.length);
|
|
+ j += abyte2.length;
|
|
+ }
|
|
+
|
|
+ chunkmap.a = new byte[j];
|
|
+ System.arraycopy(abyte, 0, chunkmap.a, 0, j);
|
|
+ return chunkmap;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/Packet63WorldParticles.java b/src/main/java/net/minecraft/server/Packet63WorldParticles.java
|
|
new file mode 100644
|
|
index 0000000..f036c53
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/Packet63WorldParticles.java
|
|
@@ -0,0 +1,51 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.io.DataInput;
|
|
+import java.io.DataOutput;
|
|
+
|
|
+public class Packet63WorldParticles extends Packet {
|
|
+
|
|
+ private String a;
|
|
+ private float b;
|
|
+ private float c;
|
|
+ private float d;
|
|
+ private float e;
|
|
+ private float f;
|
|
+ private float g;
|
|
+ private float h;
|
|
+ private int i;
|
|
+
|
|
+ public Packet63WorldParticles() {}
|
|
+
|
|
+ public void a(DataInput datainput) throws java.io.IOException { // Spigot - throws
|
|
+ this.a = a(datainput, 64);
|
|
+ this.b = datainput.readFloat();
|
|
+ this.c = datainput.readFloat();
|
|
+ this.d = datainput.readFloat();
|
|
+ this.e = datainput.readFloat();
|
|
+ this.f = datainput.readFloat();
|
|
+ this.g = datainput.readFloat();
|
|
+ this.h = datainput.readFloat();
|
|
+ this.i = datainput.readInt();
|
|
+ }
|
|
+
|
|
+ public void a(DataOutput dataoutput) throws java.io.IOException { // Spigot - throws
|
|
+ a(this.a, dataoutput);
|
|
+ dataoutput.writeFloat(this.b);
|
|
+ dataoutput.writeFloat(this.c);
|
|
+ dataoutput.writeFloat(this.d);
|
|
+ dataoutput.writeFloat(this.e);
|
|
+ dataoutput.writeFloat(this.f);
|
|
+ dataoutput.writeFloat(this.g);
|
|
+ dataoutput.writeFloat(this.h);
|
|
+ dataoutput.writeInt(this.i);
|
|
+ }
|
|
+
|
|
+ public void handle(Connection connection) {
|
|
+ connection.a(this);
|
|
+ }
|
|
+
|
|
+ public int a() {
|
|
+ return 64;
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/RegionFileCache.java b/src/main/java/net/minecraft/server/RegionFileCache.java
|
|
new file mode 100644
|
|
index 0000000..900ed68
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/minecraft/server/RegionFileCache.java
|
|
@@ -0,0 +1,67 @@
|
|
+package net.minecraft.server;
|
|
+
|
|
+import java.io.DataInputStream;
|
|
+import java.io.DataOutputStream;
|
|
+import java.io.File;
|
|
+import java.io.IOException;
|
|
+import java.util.HashMap;
|
|
+import java.util.Iterator;
|
|
+import java.util.Map;
|
|
+
|
|
+public class RegionFileCache {
|
|
+
|
|
+ private static final Map a = new HashMap();
|
|
+
|
|
+ public static synchronized RegionFile a(File file1, int i, int j) {
|
|
+ File file2 = new File(file1, "region");
|
|
+ File file3 = new File(file2, "r." + (i >> 5) + "." + (j >> 5) + ".mca");
|
|
+ RegionFile regionfile = (RegionFile) a.get(file3);
|
|
+
|
|
+ if (regionfile != null) {
|
|
+ return regionfile;
|
|
+ } else {
|
|
+ if (!file2.exists()) {
|
|
+ file2.mkdirs();
|
|
+ }
|
|
+
|
|
+ if (a.size() >= 256) {
|
|
+ a();
|
|
+ }
|
|
+
|
|
+ RegionFile regionfile1 = new RegionFile(file3);
|
|
+
|
|
+ a.put(file3, regionfile1);
|
|
+ return regionfile1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public static synchronized void a() {
|
|
+ Iterator iterator = a.values().iterator();
|
|
+
|
|
+ while (iterator.hasNext()) {
|
|
+ RegionFile regionfile = (RegionFile) iterator.next();
|
|
+
|
|
+ try {
|
|
+ if (regionfile != null) {
|
|
+ regionfile.c();
|
|
+ }
|
|
+ } catch (IOException ioexception) {
|
|
+ ioexception.printStackTrace();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ a.clear();
|
|
+ }
|
|
+
|
|
+ public static DataInputStream c(File file1, int i, int j) {
|
|
+ RegionFile regionfile = a(file1, i, j);
|
|
+
|
|
+ return regionfile.a(i & 31, j & 31);
|
|
+ }
|
|
+
|
|
+ public static DataOutputStream d(File file1, int i, int j) {
|
|
+ RegionFile regionfile = a(file1, i, j);
|
|
+
|
|
+ return regionfile.b(i & 31, j & 31);
|
|
+ }
|
|
+}
|
|
--
|
|
1.8.3.2
|
|
|