This code is from my source. I have removed the unused parts. I don't have implemented the broadcast system.
You can't copy & paste I hope that some people will learn something.
PHP Code:
using System;
namespace COServer.Network
{
public class MsgAction : Msg
{
//Define constant(s) here...
const Int16 _MSG_SIZE = 0x1C;
public enum Action : byte
{
None = 0,
ChgAction = 81,
};
public static Byte[] Create(User Entity, UInt32 Param, UInt16 Action)
{
PacketWriter PWriter = new PacketWriter(_MSG_SIZE);
PWriter.WriteInt16(_MSG_SIZE);
PWriter.WriteInt16(_MSG_ACTION);
PWriter.WriteInt32(Environment.TickCount);
PWriter.WriteUInt32(Entity.UniqId);
PWriter.WriteUInt32(Param);
PWriter.WriteUInt16(Entity.PosX);
PWriter.WriteUInt16(Entity.PosY);
PWriter.WriteUInt16(Entity.Direction);
PWriter.WriteUInt16(Action);
return PWriter.Flush();
}
public static void Process(ref Client Client, ref Byte[] Data)
{
try
{
if (Client != null && (Int16)((Data[0x01] << 8) | Data[0x00]) == _MSG_SIZE)
{
UInt32 Timestamp = (UInt32)((Data[0x07] << 24) | (Data[0x06] << 16) | (Data[0x05] << 8) | Data[0x04]);
UInt32 UniqId = (UInt32)((Data[0x0B] << 24) | (Data[0x0A] << 16) | (Data[0x09] << 8) | Data[0x08]);
UInt32 Param = (UInt32)((Data[0x0F] << 24) | (Data[0x0E] << 16) | (Data[0x0D] << 8) | Data[0x0C]);
UInt16 PosX = (UInt16)((Data[0x11] << 8) | Data[0x10]);
UInt16 PosY = (UInt16)((Data[0x13] << 8) | Data[0x12]);
UInt16 Direction = (UInt16)((Data[0x15] << 8) | Data[0x14]);
if (Client.Character != null)
{
switch ((UInt16)((Data[0x17] << 8) | Data[0x16]))
{
case (UInt16)Action.ChgAction:
{
Client.Character.Action = (Byte)Param;
if (Param == 230) //Cool
{
if (DateTime.Now > Client.Character.LastCoolShow.AddMilliseconds(3000))
{
if (Client.Character.IsAllSuperEquip())
Client.Send(MsgAction.Create(Client.Character, (UInt32)(Param | (Client.Character.Profession * 0x10000 + 0x1000000)), (UInt16)Action.ChgAction)); //BroadcastRoomMsg(Data, INCLUDE_SELF);
else if (ItemHandler.GetQuality(ItemHandler.GetItemByPos(ref Client.Character.Items, 3).Id) == 9)
Client.Send(MsgAction.Create(Client.Character, (UInt32)(Param | (Client.Character.Profession * 0x10000)), (UInt16)Action.ChgAction)); //BroadcastRoomMsg(Data, INCLUDE_SELF);
else
Client.Send(Data); //BroadcastRoomMsg(Data, INCLUDE_SELF);
Client.Character.LastCoolShow = DateTime.Now;
return;
}
}
Client.Send(Data); //BroadcastRoomMsg(Data, INCLUDE_SELF);
break;
}
default:
throw new Exception("Action[" + ((Data[0x17] << 8) | Data[0x16]) + "] not implemented!");
}
}
}
}
catch (Exception Exc) { Program.WriteLine(MsgError(Data, Exc)); }
}
}
}