Looks fine to me. It might be better to wait until the targetID is registered before executing the skills; you can also measure the server's latency while waiting as well. Example:
Code:
public long DoSetTarget(uint targetID)
{
var stream = new MemoryStream();
stream.Write(BitConverter.GetBytes(0x2), 0, 2);
stream.Write(BitConverter.GetBytes(targetID), 0, 4);
byte[] data = stream.ToArray();
SendPackage(data);
Stopwatch timer = Stopwatch.StartNew();
while (timer.ElapsedMilliseconds < 5000)
{
// Check for TargetID to show up
if (Self.TargetId == targetID) break;
Thread.Sleep(10);
}
return timer.ElapsedMilliseconds / 2;
}