public static void WriteCastInfo(this ByteWriter writerOrg, CastInfo data) { var writer = new ByteWriter(); writer.WriteUInt32(data.SpellHash); writer.WriteUInt32(data.SpellNetID); writer.WriteByte(data.SpellLevel); writer.WriteFloat(data.AttackSpeedModifier); writer.WriteUInt32(data.CasterNetID); writer.WriteUInt32(data.MissileNetID); writer.WriteVector3(data.TargetPosition); writer.WriteVector3(data.TargetPositionEnd); int targetsCount = data.TargetsInfo.Count; if (targetsCount >= 32) { throw new IOException("Too many targets!"); } writer.WriteByte((byte)targetsCount); for (var i = 0; i < targetsCount; i++) { writer.WriteCastTargetInfo(data.TargetsInfo[i]); } writer.WriteFloat(data.DesignerCastTime); writer.WriteFloat(data.ExtraCastTime); writer.WriteFloat(data.DesignerTotalTime); writer.WriteFloat(data.Cooldown); writer.WriteFloat(data.StartCastTime); byte bitfield = 0; if (data.IsAutoAttack) { bitfield |= 0x01; } if (data.IsSecondAutoAttack) { bitfield |= 0x02; } if (data.IsForceCastingOrChannel) { bitfield |= 0x04; } if (data.IsOverrideCastPosition) { bitfield |= 0x08; } writer.WriteByte(bitfield); writer.WriteByte(data.SpellSlot); writer.WriteFloat(data.ManaCost); writer.WriteVector3(data.CasterPosition); var writerData = writer.GetBytes(); int size = writerData.Length + 2; writer.WriteUInt16((ushort)size); writer.WriteBytes(writerData); }