Hosting and domain costs until October 2024 have been generously sponsored by dumptruck_ds. Thank you!
Editing Fitzquake Protocol
From Quake Wiki
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | + | The Fitzquake protocol is derived from the [[Netquake Protocol]] and was introduced in Fitzquake 0.85. Currently no other clients or servers support it. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | The | ||
==Overview of Features== | ==Overview of Features== | ||
− | The Fitzquake protocol adds support for increased limits such as model and sound precaches, model frames, edicts, | + | The Fitzquake protocol adds support for increased limits such as model and sound precaches (normal limit 255), model frames (normal limit 255), edicts (), player armor and ammo stats (normally 255). It also supports entity and weaponmodel alpha, and adds timing hints for model interpolation. |
===Model index > 255=== | ===Model index > 255=== | ||
− | Quake normally sends model indexes as a single byte. Fitzquake can send a second byte when the index exceeds 255 | + | Quake normally sends model indexes as a single byte. Fitzquake can send a second byte when the index exceeds 255. |
===Entity frame index > 255=== | ===Entity frame index > 255=== | ||
Line 41: | Line 32: | ||
Player weapon model alpha is transmitted seperately from the client entity alpha, but for now the Fitzquake server uses the client entity's .alpha field for both. There is currently no way for QuakeC to set the weapon alpha specifically. | Player weapon model alpha is transmitted seperately from the client entity alpha, but for now the Fitzquake server uses the client entity's .alpha field for both. There is currently no way for QuakeC to set the weapon alpha specifically. | ||
− | ===Interpolation | + | ===Interpolation Timing Hints=== |
For entities that don't animate at exactly 10Hz, such as crucified zombies, this hint tells the client what interval to use when lerping to the new frame. This interval is taken from the entity's [[.nextthink]] value, subtracted from the current server time. It is only sent to clients when it does not equal 0.1. | For entities that don't animate at exactly 10Hz, such as crucified zombies, this hint tells the client what interval to use when lerping to the new frame. This interval is taken from the entity's [[.nextthink]] value, subtracted from the current server time. It is only sent to clients when it does not equal 0.1. | ||
Line 60: | Line 51: | ||
return MSG_ReadShort() * (360.0 / 65536); | return MSG_ReadShort() * (360.0 / 65536); | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</pre> | </pre> | ||
Line 74: | Line 59: | ||
The existing update flags field can have 5 new flags. | The existing update flags field can have 5 new flags. | ||
− | * U_EXTEND1 - another byte of flags will follow the first two. | + | * U_EXTEND1 - another byte of flags will follow the first two. This is sent whenever any of the next four flags are used. |
* U_ALPHA - entity has alpha different than its baseline. Alpha is encoded as a single byte, with a 0 representing "default" alpha, and values 1-255 representing the range 0.0-1.0. Use the ENTALPHA_ macros (below) to convert correctly between floats and bytes. This byte is sent immediately after the U_ANGLE3 angle, if present. | * U_ALPHA - entity has alpha different than its baseline. Alpha is encoded as a single byte, with a 0 representing "default" alpha, and values 1-255 representing the range 0.0-1.0. Use the ENTALPHA_ macros (below) to convert correctly between floats and bytes. This byte is sent immediately after the U_ANGLE3 angle, if present. | ||
* U_FRAME2 - entity frame is >255, so a second byte will be sent. It is sent immediately after the U_ALPHA byte, if present. | * U_FRAME2 - entity frame is >255, so a second byte will be sent. It is sent immediately after the U_ALPHA byte, if present. | ||
− | * U_MODEL2 - entity modelindex is >255, so a second byte will be sent. It is sent immediately after the | + | * U_MODEL2 - entity modelindex is >255, so a second byte will be sent. It is sent immediately after the U_ALPHA byte, if present. |
− | * U_LERPFINISH - nextthink interval (ent->v.nextthink - sv.time) is not exactly 0.1 seconds, so the actual interval will be sent as a byte. Intervals of 0.0-1.0 seconds map to values 0-255. Anything >1 is clamped | + | * U_LERPFINISH - nextthink interval (ent->v.nextthink - sv.time) is not exactly 0.1 seconds, so the actual interval will be sent as a byte. Intervals of 0.0-1.0 seconds map to values 0-255. Anything >1 is clamped. |
===svc_clientdata=== | ===svc_clientdata=== | ||
Line 98: | Line 83: | ||
The existing flags field can have 2 new flags. | The existing flags field can have 2 new flags. | ||
− | * SND_LARGEENTITY - the edict is 2 full bytes | + | * SND_LARGEENTITY - the edict is 2 full bytes and the following byte is the channel, rather than packing them into a single short (13 bits for edict, 3 bit for channel.) This is used whenever the edict number is > 8191. |
* SND_LARGESOUND - the sound index is 2 bytes instead of 1. This is sent when the sound index is > 255. | * SND_LARGESOUND - the sound index is 2 bytes instead of 1. This is sent when the sound index is > 255. | ||