package org.jmangos.commons.entities;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.jmangos.commons.enums.HighGuid;
import org.jmangos.commons.enums.ModelType;
import org.jmangos.commons.enums.Powers;
import org.jmangos.commons.enums.SheathState;
import org.jmangos.commons.update.ObjectFields;
import org.jmangos.commons.utils.Rnd;
@Entity
@Table(name = "creature")
@AttributeOverrides({ @AttributeOverride(name = "entry", column = @Column(name = "id")),
// Override default scale by spawnDist data
@AttributeOverride(name = "scale", column = @Column(name = "spawndist")) })
public class Creature extends FieldsUnit {
/**
*
*/
private static final long serialVersionUID = -8876628710784393342L;
@Embedded
CreaturePositionerHolder movement;
@Transient
CreaturePrototype prototype;
@Transient
private Float curScale = DEFAULT_OBJECT_SCALE;
@Transient
private Integer bytes = 0;
@Transient
private Integer level = 0;
@Transient
private CreaturePowers power = new CreaturePowers();
@Transient
/*
* (non-Javadoc)
*
* @see org.jmangos.commons.entities.FieldsUnit#initBits()
*/
@Override
public void initBits() {
super.initBits();
long entry = getEntry();
entry <<= 24;
long higuid = HighGuid.UNIT.getValue();
higuid <<= 52;
setGuid(higuid | entry | getGuid());
this.bitSet.set(ObjectFields.OBJECT_FIELD_ENTRY.getValue());
}
/**
* @param prototype
* the prototype to set
*/
public final void setPrototype(final CreaturePrototype prototype) {
this.prototype = prototype;
this.curScale = prototype.getScale();
setClazz(prototype.getClazz());
setAttackTime(0, prototype.getBaseattacktime());
setAttackTime(1, prototype.getBaseattacktime());
final int minLevel = prototype.getMaxLevel();
final int maxLevel = prototype.getMinLevel();
int level = 0;
if (maxLevel != minLevel) {
level = minLevel + Rnd.nextInt(maxLevel - minLevel);
} else {
level = minLevel;
}
setLevel(level);
setDisplayId(ModelType.NATIVE, prototype.getModelId(0));
setDisplayId(ModelType.CURRENT, prototype.getModelId(0));
final Integer minHealth = prototype.getMaxHealth();
final Integer maxHealth = prototype.getMinHealth();
final int health = minHealth + Rnd.nextInt(maxHealth - minHealth);
setPower(Powers.HEALTH, health);
setBaseHealth(health);
switch (prototype.getClazz()) {
case MAGE:
case PALADIN:
final Integer minMana = prototype.getMaxMana();
final Integer maxMana = prototype.getMinMana();
final int mana = minHealth + Rnd.nextInt(maxMana - minMana);
setPower(Powers.MANA, mana);
setBaseMana(mana);
break;
default:
break;
}
if (prototype.getRangeattacktime() > 0) {
setAttackTime(2, prototype.getRangeattacktime());
}
setFaction_template(prototype.getFactionForAliance());
setSheath(SheathState.MELEE);
if (prototype.getEquipment().getEquipentry1() != 0) {
setVirtualItem(0, prototype.getEquipment().getEquipentry1());
}
if (prototype.getEquipment().getEquipentry2() != 0) {
setVirtualItem(1, prototype.getEquipment().getEquipentry2());
}
if (prototype.getEquipment().getEquipentry3() != 0) {
setVirtualItem(2, prototype.getEquipment().getEquipentry3());
}
// walk
this.movement.getSpeeds()[0] = this.movement.getSpeeds()[0] * prototype.getSpeedWalkMod();
this.movement.getSpeeds()[1] = this.movement.getSpeeds()[1] * prototype.getSpeedRunMod();
}
/**
* override FieldsObject.getScale to get SpawnDist
*
* @return
*/
public float getSpawnDist() {
return super.getScale();
}
/**
* (non-Javadoc)
*
* @see org.jmangos.commons.entities.FieldsObject#getScale()
*/
@Override
public float getScale() {
return this.curScale;
}
/**
* (non-Javadoc)
*
* @see org.jmangos.commons.entities.FieldsObject#setScale(float)
*/
@Override
public void setScale(final float scale) {
this.bitSet.set(ObjectFields.OBJECT_FIELD_SCALE_X.getValue());
this.curScale = scale;
}
/**
* @return the movement
*/
@Override
public final CreaturePositionerHolder getMovement() {
return this.movement;
}
/**
* @param movement
* the movement to set
*/
public final void setMovement(final CreaturePositionerHolder movement) {
this.movement = movement;
}
/**
* @return the prototype
*/
public final CreaturePrototype getPrototype() {
return this.prototype;
}
@Override
public CreaturePowers getPowers() {
return this.power;
}
@Override
public void setPowers(final CreaturePowers powers) {
this.power = powers;
}
@Override
public String getName() {
return getPrototype().getName();
}
@Override
public void setName(final String name) {
// TODO Auto-generated method stub
}
@Override
public int getBytes() {
return this.bytes;
}
/**
* @param bytes
* the bytes to set
*/
@Override
public final void setBytes(final int bytes) {
super.setBytes(bytes);
this.bytes = bytes;
}
@Override
public int getLevel() {
return this.level;
}
@Override
public void setLevel(final int level) {
super.setLevel(level);
this.level = level;
}
}