package net.minecraft.server;
import com.google.common.collect.ComparisonChain;
import javax.annotation.Nullable;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MobEffect implements Comparable<MobEffect> {
private static final Logger LOGGER = LogManager.getLogger();
private final MobEffectList b;
private int duration;
private int amplification;
private boolean splash;
private boolean ambient;
private boolean showParticles;
private boolean showIcon;
@Nullable
private MobEffect hiddenEffect;
public MobEffect(MobEffectList mobeffectlist) {
this(mobeffectlist, 0, 0);
}
public MobEffect(MobEffectList mobeffectlist, int i) {
this(mobeffectlist, i, 0);
}
public MobEffect(MobEffectList mobeffectlist, int i, int j) {
this(mobeffectlist, i, j, false, true);
}
public MobEffect(MobEffectList mobeffectlist, int i, int j, boolean flag, boolean flag1) {
this(mobeffectlist, i, j, flag, flag1, flag1);
}
public MobEffect(MobEffectList mobeffectlist, int i, int j, boolean flag, boolean flag1, boolean flag2) {
this(mobeffectlist, i, j, flag, flag1, flag2, (MobEffect) null);
}
public MobEffect(MobEffectList mobeffectlist, int i, int j, boolean flag, boolean flag1, boolean flag2, @Nullable MobEffect mobeffect) {
this.b = mobeffectlist;
this.duration = i;
this.amplification = j;
this.ambient = flag;
this.showParticles = flag1;
this.showIcon = flag2;
this.hiddenEffect = mobeffect;
}
public MobEffect(MobEffect mobeffect) {
this.b = mobeffect.b;
this.a(mobeffect);
}
void a(MobEffect mobeffect) {
this.duration = mobeffect.duration;
this.amplification = mobeffect.amplification;
this.ambient = mobeffect.ambient;
this.showParticles = mobeffect.showParticles;
this.showIcon = mobeffect.showIcon;
}
public boolean b(MobEffect mobeffect) {
if (this.b != mobeffect.b) {
MobEffect.LOGGER.warn("This method should only be called for matching effects!");
}
boolean flag = false;
if (mobeffect.amplification > this.amplification) {
if (mobeffect.duration < this.duration) {
MobEffect mobeffect1 = this.hiddenEffect;
this.hiddenEffect = new MobEffect(this);
this.hiddenEffect.hiddenEffect = mobeffect1;
}
this.amplification = mobeffect.amplification;
this.duration = mobeffect.duration;
flag = true;
} else if (mobeffect.duration > this.duration) {
if (mobeffect.amplification == this.amplification) {
this.duration = mobeffect.duration;
flag = true;
} else if (this.hiddenEffect == null) {
this.hiddenEffect = new MobEffect(mobeffect);
} else {
this.hiddenEffect.b(mobeffect);
}
}
if (!mobeffect.ambient && this.ambient || flag) {
this.ambient = mobeffect.ambient;
flag = true;
}
if (mobeffect.showParticles != this.showParticles) {
this.showParticles = mobeffect.showParticles;
flag = true;
}
if (mobeffect.showIcon != this.showIcon) {
this.showIcon = mobeffect.showIcon;
flag = true;
}
return flag;
}
public MobEffectList getMobEffect() {
return this.b;
}
public int getDuration() {
return this.duration;
}
public int getAmplifier() {
return this.amplification;
}
public boolean isAmbient() {
return this.ambient;
}
public boolean isShowParticles() {
return this.showParticles;
}
public boolean isShowIcon() {
return this.showIcon;
}
public boolean tick(EntityLiving entityliving, Runnable runnable) {
if (this.duration > 0) {
if (this.b.a(this.duration, this.amplification)) {
this.a(entityliving);
}
this.i();
if (this.duration == 0 && this.hiddenEffect != null) {
this.a(this.hiddenEffect);
this.hiddenEffect = this.hiddenEffect.hiddenEffect;
runnable.run();
}
}
return this.duration > 0;
}
private int i() {
if (this.hiddenEffect != null) {
this.hiddenEffect.i();
}
return --this.duration;
}
public void a(EntityLiving entityliving) {
if (this.duration > 0) {
this.b.tick(entityliving, this.amplification);
}
}
public String g() {
return this.b.c();
}
public String toString() {
String s;
if (this.amplification > 0) {
s = this.g() + " x " + (this.amplification + 1) + ", Duration: " + this.duration;
} else {
s = this.g() + ", Duration: " + this.duration;
}
if (this.splash) {
s = s + ", Splash: true";
}
if (!this.showParticles) {
s = s + ", Particles: false";
}
if (!this.showIcon) {
s = s + ", Show Icon: false";
}
return s;
}
public boolean equals(Object object) {
if (this == object) {
return true;
} else if (!(object instanceof MobEffect)) {
return false;
} else {
MobEffect mobeffect = (MobEffect) object;
return this.duration == mobeffect.duration && this.amplification == mobeffect.amplification && this.splash == mobeffect.splash && this.ambient == mobeffect.ambient && this.b.equals(mobeffect.b);
}
}
public int hashCode() {
int i = this.b.hashCode();
i = 31 * i + this.duration;
i = 31 * i + this.amplification;
i = 31 * i + (this.splash ? 1 : 0);
i = 31 * i + (this.ambient ? 1 : 0);
return i;
}
public NBTTagCompound a(NBTTagCompound nbttagcompound) {
nbttagcompound.setByte("Id", (byte) MobEffectList.getId(this.getMobEffect()));
this.c(nbttagcompound);
return nbttagcompound;
}
private void c(NBTTagCompound nbttagcompound) {
nbttagcompound.setByte("Amplifier", (byte) this.getAmplifier());
nbttagcompound.setInt("Duration", this.getDuration());
nbttagcompound.setBoolean("Ambient", this.isAmbient());
nbttagcompound.setBoolean("ShowParticles", this.isShowParticles());
nbttagcompound.setBoolean("ShowIcon", this.isShowIcon());
if (this.hiddenEffect != null) {
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
this.hiddenEffect.a(nbttagcompound1);
nbttagcompound.set("HiddenEffect", nbttagcompound1);
}
}
public static MobEffect b(NBTTagCompound nbttagcompound) {
byte b0 = nbttagcompound.getByte("Id");
MobEffectList mobeffectlist = MobEffectList.fromId(b0);
return mobeffectlist == null ? null : a(mobeffectlist, nbttagcompound);
}
private static MobEffect a(MobEffectList mobeffectlist, NBTTagCompound nbttagcompound) {
byte b0 = nbttagcompound.getByte("Amplifier");
int i = nbttagcompound.getInt("Duration");
boolean flag = nbttagcompound.getBoolean("Ambient");
boolean flag1 = true;
if (nbttagcompound.hasKeyOfType("ShowParticles", 1)) {
flag1 = nbttagcompound.getBoolean("ShowParticles");
}
boolean flag2 = flag1;
if (nbttagcompound.hasKeyOfType("ShowIcon", 1)) {
flag2 = nbttagcompound.getBoolean("ShowIcon");
}
MobEffect mobeffect = null;
if (nbttagcompound.hasKeyOfType("HiddenEffect", 10)) {
mobeffect = a(mobeffectlist, nbttagcompound.getCompound("HiddenEffect"));
}
return new MobEffect(mobeffectlist, i, b0 < 0 ? 0 : b0, flag, flag1, flag2, mobeffect);
}
public int compareTo(MobEffect mobeffect) {
boolean flag = true;
return (this.getDuration() <= 32147 || mobeffect.getDuration() <= 32147) && (!this.isAmbient() || !mobeffect.isAmbient()) ? ComparisonChain.start().compare(this.isAmbient(), mobeffect.isAmbient()).compare(this.getDuration(), mobeffect.getDuration()).compare(this.getMobEffect().getColor(), mobeffect.getMobEffect().getColor()).result() : ComparisonChain.start().compare(this.isAmbient(), mobeffect.isAmbient()).compare(this.getMobEffect().getColor(), mobeffect.getMobEffect().getColor()).result();
}
}