// • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
//      Magicbane Emulator Project © 2013 - 2022
//                www.magicbane.com


package engine.net.client.msg;

import engine.mbEnums.GameObjectType;
import engine.net.AbstractConnection;
import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
import engine.net.Protocol;
import engine.objects.AbstractCharacter;
import engine.objects.PlayerCharacter;

public class UpdateStateMsg extends ClientNetMsg {

    private int charType;
    private int charUUID;
    private int activity; //1 dead,2 unconscious, 3 Sleeping,  4 resting,5 casting,6 IDLE,7 casting? , 8 nothing 9 unknown,
    private int speed; // 1 low, 2 high (walk,run)
    private int aware; // 1 low, 2 high (combat off,combat on)

    private int mode; // 0 unknown, 1 water, 2 ground, 3 flight.
    private int fighting; // 1 disengaged, 2 engaged.
    private int headlights; // LFGroup/LFGuild/Recruiting Icons

    /**
     * This is the general purpose constructor.
     */
    public UpdateStateMsg() {
        super(Protocol.UPDATESTATE);
        this.fighting = 1;
        this.headlights = 0;
    }

    public UpdateStateMsg(AbstractCharacter ac) {
        super(Protocol.UPDATESTATE);
        this.fighting = 1;
        this.headlights = 0;
        setPlayer(ac);
    }

    /**
     * This constructor is used by NetMsgFactory. It attempts to deserialize the
     * ByteBuffer into a message. If a BufferUnderflow occurs (based on reading
     * past the limit) then this constructor Throws that Exception to the
     * caller.
     */
    public UpdateStateMsg(AbstractConnection origin, ByteBufferReader reader) {
        super(Protocol.UPDATESTATE, origin, reader);
    }

    /**
     * Serializes the subclass specific items to the supplied NetMsgWriter.
     */
    @Override
    protected void _serialize(ByteBufferWriter writer) {
        writer.putInt(this.charType);
        writer.putInt(this.charUUID);
        writer.putInt(this.activity);
        writer.putInt(this.speed);
        writer.putInt(this.aware);
        writer.putInt(this.mode);
        writer.putInt(this.fighting);
        writer.putInt(this.headlights);
    }

    /**
     * Deserializes the subclass specific items from the supplied NetMsgReader.
     */
    @Override
    protected void _deserialize(ByteBufferReader reader) {
        this.charType = reader.getInt();
        this.charUUID = reader.getInt();
        this.activity = reader.getInt();
        this.speed = reader.getInt();
        this.aware = reader.getInt();

        this.mode = reader.getInt();
        this.fighting = reader.getInt();
        this.headlights = reader.getInt();
    }

    /**
     * Sets this Msg's charUUID, sitStand, walkRun and combatToggle parameters
     * based on supplied AbstractCharacter
     *
     * @param ac
     */
    public final void setPlayer(AbstractCharacter ac) {

        PlayerCharacter player;

        this.charType = ac.getObjectType().ordinal();
        this.charUUID = ac.getObjectUUID();
        this.activity = ac.getIsSittingAsInt();
        this.speed = ac.getIsWalkingAsInt();
        this.aware = ac.getIsCombatAsInt();

        if (ac.getObjectType() == GameObjectType.PlayerCharacter) {
            player = (PlayerCharacter) ac;
            this.headlights = player.getHeadlightsAsInt();
        } else
            this.headlights = 0;

        this.mode = ac.getIsFlightAsInt();
    }

    /**
     * @return the charUUID
     */
    public int getPlayerUUID() {
        return charUUID;
    }

    /**
     * @return the sitStand
     */
    public int getActivity() {
        return activity;
    }

    /**
     * @param activity the sitStand to set
     */
    public void setActivity(int activity) {
        this.activity = activity;
    }

    /**
     * @return the walkRun
     */
    public int getSpeed() {
        return speed;
    }

    /**
     * @param speed the walkRun to set
     */
    public void setSpeed(int speed) {
        this.speed = speed;
    }

    /**
     * @return the combatToggle
     */
    public int getAware() {
        return aware;
    }

    /**
     * @param aware the combatToggle to set
     */
    public void setAware(int aware) {
        this.aware = aware;
    }

    /**
     * @return the unknown01
     */
    public int getMode() {
        return mode;
    }

    /**
     * @param mode the unknown01 to set
     */
    public void setMode(int mode) {
        this.mode = mode;
    }

    /**
     * @return the unknown02
     */
    public int getFighting() {
        return fighting;
    }

    /**
     * @param fighting the unknown02 to set
     */
    public void setFighting(int fighting) {
        this.fighting = fighting;
    }

    /**
     * @return the unknown03
     */
    public int getHeadlights() {
        return headlights;
    }

    /**
     * @param headlights the headlights to set
     */
    public void setHeadlights(int headlights) {
        this.headlights = headlights;
    }

}
