X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=sv_main.c;h=bc6eaf0ad59db131b13eb1013c12a4ddd1c36ecb;hb=c4079451039f769eb5444575fad05d4f5925d99e;hp=d8e232d1fc567e3d4bd8fa2a4fe4fdd1dd2e8396;hpb=135f08ba52321984c05e36cdf42ad81420a4d2fd;p=xonotic%2Fdarkplaces.git diff --git a/sv_main.c b/sv_main.c index d8e232d1..bc6eaf0a 100644 --- a/sv_main.c +++ b/sv_main.c @@ -120,6 +120,7 @@ cvar_t sv_gameplayfix_nostepmoveonsteepslopes = {0, "sv_gameplayfix_nostepmoveon cvar_t sv_gameplayfix_swiminbmodels = {0, "sv_gameplayfix_swiminbmodels", "1", "causes pointcontents (used to determine if you are in a liquid) to check bmodel entities as well as the world model, so you can swim around in (possibly moving) water bmodel entities"}; cvar_t sv_gameplayfix_upwardvelocityclearsongroundflag = {0, "sv_gameplayfix_upwardvelocityclearsongroundflag", "1", "prevents monsters, items, and most other objects from being stuck to the floor when pushed around by damage, and other situations in mods"}; cvar_t sv_gameplayfix_downtracesupportsongroundflag = {0, "sv_gameplayfix_downtracesupportsongroundflag", "1", "prevents very short moves from clearing onground (which may make the player stick to the floor at high netfps)"}; +cvar_t sv_gameplayfix_q1bsptracelinereportstexture = {0, "sv_gameplayfix_q1bsptracelinereportstexture", "1", "enables mods to get accurate trace_texture results on q1bsp by using a surface-hitting traceline implementation rather than the standard solidbsp method, q3bsp always reports texture accurately"}; cvar_t sv_gravity = {CVAR_NOTIFY, "sv_gravity","800", "how fast you fall (512 = roughly earth gravity)"}; cvar_t sv_idealpitchscale = {0, "sv_idealpitchscale","0.8", "how much to look up/down slopes and stairs when not using freelook"}; cvar_t sv_jumpstep = {CVAR_NOTIFY, "sv_jumpstep", "0", "whether you can step up while jumping (sv_gameplayfix_stepwhilejumping must also be 1)"}; @@ -521,6 +522,7 @@ void SV_Init (void) Cvar_RegisterVariable (&sv_gameplayfix_swiminbmodels); Cvar_RegisterVariable (&sv_gameplayfix_upwardvelocityclearsongroundflag); Cvar_RegisterVariable (&sv_gameplayfix_downtracesupportsongroundflag); + Cvar_RegisterVariable (&sv_gameplayfix_q1bsptracelinereportstexture); Cvar_RegisterVariable (&sv_gravity); Cvar_RegisterVariable (&sv_idealpitchscale); Cvar_RegisterVariable (&sv_jumpstep); @@ -691,10 +693,13 @@ Larger attenuations will drop off. (max 4 attenuation) ================== */ -void SV_StartSound (prvm_edict_t *entity, int channel, const char *sample, int volume, float attenuation) +void SV_StartSound (prvm_edict_t *entity, int channel, const char *sample, int volume, float attenuation, qboolean reliable) { + sizebuf_t *dest; int sound_num, field_mask, i, ent; + dest = (reliable ? &sv.reliable_datagram : &sv.datagram); + if (volume < 0 || volume > 255) { Con_Printf ("SV_StartSound: volume = %i\n", volume); @@ -707,12 +712,14 @@ void SV_StartSound (prvm_edict_t *entity, int channel, const char *sample, int v return; } - if (channel < 0 || channel > 7) + if (!IS_CHAN(channel)) { Con_Printf ("SV_StartSound: channel = %i\n", channel); return; } + channel = CHAN_ENGINE2NET(channel); + if (sv.datagram.cursize > MAX_PACKETFRAGMENT-21) return; @@ -728,32 +735,35 @@ void SV_StartSound (prvm_edict_t *entity, int channel, const char *sample, int v field_mask |= SND_VOLUME; if (attenuation != DEFAULT_SOUND_PACKET_ATTENUATION) field_mask |= SND_ATTENUATION; - if (ent >= 8192) + if (ent >= 8192 || channel < 0 || channel > 7) field_mask |= SND_LARGEENTITY; - if (sound_num >= 256 || channel >= 8) + if (sound_num >= 256) field_mask |= SND_LARGESOUND; // directed messages go only to the entity they are targeted on - MSG_WriteByte (&sv.datagram, svc_sound); - MSG_WriteByte (&sv.datagram, field_mask); + MSG_WriteByte (dest, svc_sound); + MSG_WriteByte (dest, field_mask); if (field_mask & SND_VOLUME) - MSG_WriteByte (&sv.datagram, volume); + MSG_WriteByte (dest, volume); if (field_mask & SND_ATTENUATION) - MSG_WriteByte (&sv.datagram, (int)(attenuation*64)); + MSG_WriteByte (dest, (int)(attenuation*64)); if (field_mask & SND_LARGEENTITY) { - MSG_WriteShort (&sv.datagram, ent); - MSG_WriteByte (&sv.datagram, channel); + MSG_WriteShort (dest, ent); + MSG_WriteChar (dest, channel); } else - MSG_WriteShort (&sv.datagram, (ent<<3) | channel); + MSG_WriteShort (dest, (ent<<3) | channel); if ((field_mask & SND_LARGESOUND) || sv.protocol == PROTOCOL_NEHAHRABJP2) - MSG_WriteShort (&sv.datagram, sound_num); + MSG_WriteShort (dest, sound_num); else - MSG_WriteByte (&sv.datagram, sound_num); + MSG_WriteByte (dest, sound_num); for (i = 0;i < 3;i++) - MSG_WriteCoord (&sv.datagram, PRVM_serveredictvector(entity, origin)[i]+0.5*(PRVM_serveredictvector(entity, mins)[i]+PRVM_serveredictvector(entity, maxs)[i]), sv.protocol); - SV_FlushBroadcastMessages(); + MSG_WriteCoord (dest, PRVM_serveredictvector(entity, origin)[i]+0.5*(PRVM_serveredictvector(entity, mins)[i]+PRVM_serveredictvector(entity, maxs)[i]), sv.protocol); + + // TODO do we have to do anything here when dest is &sv.reliable_datagram? + if(!reliable) + SV_FlushBroadcastMessages(); } /* @@ -1238,6 +1248,7 @@ static qboolean SV_PrepareEntityForSending (prvm_edict_t *ent, entity_state_t *c cs->tagentity = PRVM_serveredictedict(ent, tag_entity); cs->tagindex = (unsigned char)PRVM_serveredictfloat(ent, tag_index); cs->glowsize = glowsize; + cs->traileffectnum = PRVM_serveredictfloat(ent, traileffectnum); // don't need to init cs->colormod because the defaultstate did that for us //cs->colormod[0] = cs->colormod[1] = cs->colormod[2] = 32;