Apologies for necroing this thread, but it is high on the list of Google results for Teamspeak and launchd, and there are some changes as of 10.11.x that I've finally gotten around to ironing out.

First, it seems that launchd no longer likes relative paths, so you have to give the full path in the Program and Program Argument keys. Speaking of which, somewhere along the way since I first posted this, I added a Program key. I don't remember when/why, but there it is. lol So without further ado, here is the current plist I'm using that works well as of OS X 10.11.6:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
	<false/>
	<key>Label</key>
	<string>Teamspeak3</string>
	<key>Program</key>
	<string>/full/path/to/ts3/binary/ts3server</string>
	<key>ProgramArguments</key>
	<array>
		<string>/full/path/to/ts3/binary/ts3server</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>UserName</key>
	<string>user_that_ts3_runs_as</string>
	<key>WorkingDirectory</key>
	<string>/full/path/to/ts3/binary/</string>
</dict>
</plist>
On a slightly related note... While this doesn't seem to be necessary for Teamspeak, here is a handy script you can use if you're launching a daemon that must wait until the network interfaces are configured before launch. It seems launchd doesn't have any sort of dependency functionality to handle that.

http://blog.slaunchaman.com/2010/07/...es-networking/