/*
* This file is part of aion-emu <aion-emu.com>.
*
* aion-emu is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* aion-emu is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with aion-emu. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.gameserver.network.aion.serverpackets;
import java.nio.ByteBuffer;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.gameobjects.state.CreatureState;
import com.aionemu.gameserver.model.gameobjects.stats.StatEnum;
import com.aionemu.gameserver.network.aion.AionConnection;
import com.aionemu.gameserver.network.aion.AionServerPacket;
/**
* Emotion packet
*
* @author SoulKeeper
*/
public class SM_EMOTION extends AionServerPacket
{
/**
* Object id of emotion sender
*/
private int senderObjectId;
/**
* Some unknown variable
*/
private int emotionType;
/**
* ID of emotion
*/
private int emotion;
/**
* Object id of emotion target
*/
private int targetObjectId;
/**
* Temporary Speed..
*/
private float speed = 6.0f;
private int state;
private int baseAttackSpeed;
private int currentAttackSpeed;
/**
* Coordinates of player
*/
private float x;
private float y;
private float z;
private byte heading;
/**
* This constructor should be used when emotion and targetid is 0
*
* @param creature
* @param emotionType
*/
public SM_EMOTION(Creature creature, int emotionType)
{
this(creature, emotionType, 0, 0);
}
/**
* Constructs new server packet with specified opcode
*
* @param senderObjectId
* who sended emotion
* @param unknown
* Dunno what it is, can be 0x10 or 0x11
* @param emotionId
* emotion to play
* @param emotionId
* who target emotion
*/
public SM_EMOTION(Creature creature, int emotionType, int emotion, int targetObjectId)
{
this.senderObjectId = creature.getObjectId();
this.emotionType = emotionType;
this.emotion = emotion;
this.targetObjectId = targetObjectId;
this.state = creature.getState();
this.baseAttackSpeed = creature.getGameStats().getBaseStat(StatEnum.ATTACK_SPEED);
this.currentAttackSpeed = creature.getGameStats().getCurrentStat(StatEnum.ATTACK_SPEED);
if (creature.isInState(CreatureState.FLYING))
this.speed = creature.getGameStats().getCurrentStat(StatEnum.FLY_SPEED) / 1000f;
else
this.speed = creature.getGameStats().getCurrentStat(StatEnum.SPEED) / 1000f;
}
/**
* New
*
*/
public SM_EMOTION(Player player, int emotionType, int emotion, float x, float y, float z, byte heading, int targetObjectId)
{
this.senderObjectId = player.getObjectId();
this.emotionType = emotionType;
this.emotion = emotion;
this.x = x;
this.y = y;
this.z = z;
this.heading = heading;
this.targetObjectId = targetObjectId;
if (player.isInState(CreatureState.FLYING))
this.speed = player.getGameStats().getCurrentStat(StatEnum.FLY_SPEED) / 1000f;
else
this.speed = player.getGameStats().getCurrentStat(StatEnum.SPEED) / 1000f;
this.state = player.getState();
this.baseAttackSpeed = player.getGameStats().getBaseStat(StatEnum.ATTACK_SPEED);
this.currentAttackSpeed = player.getGameStats().getCurrentStat(StatEnum.ATTACK_SPEED);
}
/**
* {@inheritDoc}
*/
@Override
protected void writeImpl(AionConnection con, ByteBuffer buf)
{
writeD(buf, senderObjectId);
writeC(buf, emotionType);
switch(emotionType)
{
case 0:
// select target
writeH(buf, state);
writeF(buf, speed);
break;
case 1:
// jump
writeH(buf, state);
writeF(buf, speed);
break;
case 2:
// sit
writeH(buf, state);
writeF(buf, speed);
break;
case 3:
// stand
writeH(buf, state);
writeF(buf, speed);
break;
case 4:
// sit (chair)
writeH(buf, state);
writeF(buf, speed);
writeF(buf, x);
writeF(buf, y);
writeF(buf, z);
writeC(buf, heading);
break;
case 5:
// stand (chair)
writeH(buf, state);
writeF(buf, speed);
writeF(buf, x);
writeF(buf, y);
writeF(buf, z);
writeC(buf, heading);
break;
case 6:
// fly teleport (start)
writeH(buf, state);
writeF(buf, speed);
writeD(buf, emotion); // teleport Id
break;
case 7:
// fly teleport (land)
writeH(buf, state);
writeF(buf, speed);
break;
case 8:
// toggle flight mode
writeH(buf, state);
writeF(buf, speed);
break;
case 9:
// toggle land mode
writeH(buf, state);
writeF(buf, speed);
break;
case 10:
// ??
writeH(buf, state);
writeF(buf, speed);
case 13:
// die
writeH(buf, state);
writeF(buf, speed);
writeD(buf, targetObjectId);
break;
case 14:
// resurrect
writeH(buf, state);
writeF(buf, speed);
break;
case 15:
//walk ?
writeH(buf, state);
writeF(buf, speed);
case 16:
// emote
writeH(buf, state);
writeF(buf, speed);
writeD(buf, targetObjectId);
writeH(buf, emotion);
writeC(buf, 1);
break;
case 17:
// unknown
writeH(buf, state);
writeF(buf, speed);
break;
case 19:
// toggle attack mode (moving)
writeH(buf, state);
writeF(buf, speed);
break;
case 20:
// toggle normal mode (moving)
writeH(buf, state);
writeF(buf, speed);
break;
case 21:
// toggle walk
writeH(buf, state);
writeF(buf, (speed - (speed * 75f) / 100f));
break;
case 22:
// toggle run
writeH(buf, state);
writeF(buf, speed);
break;
case 28:
// private shop open
writeH(buf, state);
writeF(buf, speed);
break;
case 29:
// private shop close
writeH(buf, state);
writeF(buf, speed);
break;
case 30:
// emote startloop
writeH(buf, state);
writeF(buf, speed);
writeH(buf, baseAttackSpeed);
writeH(buf, currentAttackSpeed);
break;
case 31:
// powershard on
writeH(buf, state);
writeF(buf, speed);
break;
case 32:
// powershard off
writeH(buf, state);
writeF(buf, speed);
break;
case 33:
// toggle attack mode
writeH(buf, state);
writeF(buf, speed);
break;
case 34:
// toggle normal mode
writeH(buf, state);
writeF(buf, speed);
break;
case 35:
// looting start
writeH(buf, state);
writeF(buf, speed);
writeD(buf, targetObjectId);
break;
case 36:
// looting end
writeH(buf, state);
writeF(buf, speed);
writeD(buf, targetObjectId);
break;
case 37:
// looting start (quest)
writeH(buf, state);
writeF(buf, speed);
writeD(buf, targetObjectId);
break;
case 38:
// looting end (quest)
writeH(buf, state);
writeF(buf, speed);
writeD(buf, targetObjectId);
break;
default:
writeH(buf, state);
writeF(buf, speed);
if(targetObjectId != 0)
{
writeD(buf, targetObjectId);
}
}
}
}