I'm a doctor, not a mechanic
I learned how to skin characters last night. It's very easy - see Skinning. Now I learn that it's unlikely that anyone else will get to see my character. The problem is that the skin is local to my machine. Other players can only see skins they have on their machines. The documentation out there suggests you send your skin to your buddies so they can see you. This doesn't really work in the world of broadband and global gaming, where you just show up to any server you can find and join in. The result is that the cool skins are hosted on the web and server admins might download them ... or they might not.
Why can't the players in a game download one another's skins through the game server? It seems that the answer to this is that it would be a significant download burden (someone out there said a typical skin with its model and textures would be about 12Mb, I've not verified this).
Individual skins for individual players are thus limited to clans who have a friendly serveradmin. This mod idea seeks to remedy this situation, so anyone with UPaint (that's everyone!) can put their face on their character and all the people they play with can see it.
2005-03-15 Initial Notes
Let's assume we're going broadband, so we are making the decision not to accommodate dialuppers. If it works for them great, if not, tough. I'm thinking:
- On connect, handshake with the server to see whether the server knows your skin
- If not, sent a compressed version of it to the server
- The download of the skin takes place during gameplay - the clients see the fallback skin until the download is completed
- the upload of the skin takes place before gameplay - to encourage people to use efficiently-transmittable skins.
Outstanding questions are many:
- What does a server show if a player has a skin that doesn't exist on the server?
- Can I send arbitrary data across the net during gameplay?
- Can I send arbitrary data across the net during level load?
- Is this replication?
- What measures are necessary to stop skin-based server cracking?
- client must declare size
- server cancels transfer if oversize
- after successful upload, server checks class of upload. (is this possible? If it's a subclass can't it do anything it likes?!)
Future refinements would be cool:
- Since the textures are .png (or derived from png) is it possible to have them download progressively?
- If there are risks involved in uploading an entire character, how about just uploading headskins? For this
- can you reassign head texture during server run?
- bandwidth required is less
- less potential for modeling tricks by cheaters or crackers
I've been thinking more about the head skins idea and think this could be a goer - it's sketchy, since my knowledge of scripting is sketchy:
- Only head textures are transferred, thus the user must base their head on the mesh of a stock skin (or any skin on the server, though they lose portability that way).
- The skin has an assigned fallback, e.g. Brock in my case.
- The server subclasses all the skins that are in use and overrides the head texture with a scriptedtexture.
- Initially, the server draws the default head texture onto the scriptedtexture
- On connect, the server checks against the player's unrealid and if not found asks the client whether there is a face to be uploaded
- If yes, then the client uploads the texture while downloading the level
- In game, on the client, checkreplacement() looks to see whether the new face has downloaded. If so, it writes it to the scriptedtexture, replacing the stock face
- Subclass playerpawn (? is it playerpawn) and cover its head with a scriptedtexture.