Try doing this thing: 1) Check ID of untamed animal. Write it down. 2) Tame it manually. 3) Recheck its ID. There is a big chance that it changes the ID when becomes tame. If it is so, thats why you cant use waittargetobject. When you try using it, there is no animal with such ID left in the world ...
It can be so, that a tamed pet and dire pet have different types. Check it in first place. Also it can be that your script uses UO.Ignore() somewhere. And the last thing coming to mind is maybe you try writing its ID to a var and after taming just use it with that ID?
Server adds it, but doesnt send it to the client. Thats why if you are frozen and try to move, you are not simply standing on your place, but bouncing on the ground. Thats because client doesnt know that you are frozen, sends new coordinates to the server but server ignores them because of frozen ...
There is no packet sent to the client when you got paralyzed or frozen, only the message. So you can get your state only by actually inspecting all incoming messages on for example "You are frozen and can not move" or something like that.