X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=sv_phys.c;h=76959a5b7a7009aa9a18eaefe15e3cc7342ec2ea;hb=93bce2dbe64b734e74d721164369943fffe7e397;hp=4b2f1a1b9add0f34dc4df16c9f85edca30a80a5d;hpb=7c18246d8b9d565646095631a181e48482d47b31;p=xonotic%2Fdarkplaces.git diff --git a/sv_phys.c b/sv_phys.c index 4b2f1a1b..76959a5b 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -75,7 +75,7 @@ void SV_CheckAllEnts (void) check = NEXT_EDICT(sv.edicts); for (e = 1;e < sv.num_edicts;e++, check = NEXT_EDICT(check)) { - if (check->free) + if (check->e->free) continue; if (check->v->movetype == MOVETYPE_PUSH || check->v->movetype == MOVETYPE_NONE @@ -154,7 +154,7 @@ qboolean SV_RunThink (edict_t *ent) pr_global_struct->self = EDICT_TO_PROG(ent); pr_global_struct->other = EDICT_TO_PROG(sv.edicts); PR_ExecuteProgram (ent->v->think, "NULL think function"); - return !ent->free; + return !ent->e->free; } /* @@ -304,7 +304,7 @@ int SV_FlyMove (edict_t *ent, float time, float *stepnormal) SV_Impact (ent, trace.ent); // break if removed by the impact function - if (ent->free) + if (ent->e->free) break; } @@ -399,7 +399,7 @@ int SV_FlyMove (edict_t *ent, float time, float *stepnormal) SV_Impact (ent, trace.ent); // break if removed by the impact function - if (ent->free) + if (ent->e->free) break; } @@ -646,7 +646,7 @@ void SV_PushMove (edict_t *pusher, float movetime) check = NEXT_EDICT(sv.edicts); for (e = 1;e < sv.num_edicts;e++, check = NEXT_EDICT(check)) { - if (check->free) + if (check->e->free) continue; if (check->v->movetype == MOVETYPE_PUSH || check->v->movetype == MOVETYPE_NONE @@ -686,8 +686,8 @@ void SV_PushMove (edict_t *pusher, float movetime) if (check->v->movetype != MOVETYPE_WALK) check->v->flags = (int)check->v->flags & ~FL_ONGROUND; - VectorCopy (check->v->origin, check->moved_from); - VectorCopy (check->v->angles, check->moved_fromangles); + VectorCopy (check->v->origin, check->e->moved_from); + VectorCopy (check->v->angles, check->e->moved_fromangles); sv.moved_edicts[num_moved++] = check; // try moving the contacted entity @@ -727,8 +727,8 @@ void SV_PushMove (edict_t *pusher, float movetime) for (i = 0;i < num_moved;i++) { ed = sv.moved_edicts[i]; - VectorCopy (ed->moved_from, ed->v->origin); - VectorCopy (ed->moved_fromangles, ed->v->angles); + VectorCopy (ed->e->moved_from, ed->v->origin); + VectorCopy (ed->e->moved_fromangles, ed->v->angles); SV_LinkEdict (ed, false); } @@ -778,10 +778,7 @@ void SV_Physics_Pusher (edict_t *ent) pr_global_struct->self = EDICT_TO_PROG(ent); pr_global_struct->other = EDICT_TO_PROG(sv.edicts); PR_ExecuteProgram (ent->v->think, "NULL think function"); - if (ent->free) - return; } - } @@ -857,18 +854,18 @@ qboolean SV_CheckWater (edict_t *ent) ent->v->waterlevel = 0; ent->v->watertype = CONTENTS_EMPTY; - cont = Mod_PointContents(point, sv.worldmodel); + cont = SV_PointContents(point); if (cont <= CONTENTS_WATER) { ent->v->watertype = cont; ent->v->waterlevel = 1; point[2] = ent->v->origin[2] + (ent->v->mins[2] + ent->v->maxs[2])*0.5; - cont = Mod_PointContents(point, sv.worldmodel); + cont = SV_PointContents(point); if (cont <= CONTENTS_WATER) { ent->v->waterlevel = 2; point[2] = ent->v->origin[2] + ent->v->view_ofs[2]; - cont = Mod_PointContents(point, sv.worldmodel); + cont = SV_PointContents(point); if (cont <= CONTENTS_WATER) ent->v->waterlevel = 3; } @@ -889,19 +886,15 @@ void SV_WallFriction (edict_t *ent, float *stepnormal) vec3_t forward, into, side; AngleVectors (ent->v->v_angle, forward, NULL, NULL); - d = DotProduct (stepnormal, forward); - - d += 0.5; - if (d >= 0) - return; - - // cut the tangential velocity - i = DotProduct (stepnormal, ent->v->velocity); - VectorScale (stepnormal, i, into); - VectorSubtract (ent->v->velocity, into, side); - - ent->v->velocity[0] = side[0] * (1 + d); - ent->v->velocity[1] = side[1] * (1 + d); + if ((d = DotProduct (stepnormal, forward) + 0.5) < 0) + { + // cut the tangential velocity + i = DotProduct (stepnormal, ent->v->velocity); + VectorScale (stepnormal, i, into); + VectorSubtract (ent->v->velocity, into, side); + ent->v->velocity[0] = side[0] * (1 + d); + ent->v->velocity[1] = side[1] * (1 + d); + } } /* @@ -1000,7 +993,7 @@ void SV_WalkMove (edict_t *ent) if (sv_nostep.integer) return; - if ( (int)sv_player->v->flags & FL_WATERJUMP ) + if ( (int)ent->v->flags & FL_WATERJUMP ) return; VectorCopy (ent->v->origin, nosteporg); @@ -1061,77 +1054,6 @@ void SV_WalkMove (edict_t *ent) } } - -/* -================ -SV_Physics_Client - -Player character actions -================ -*/ -void SV_Physics_Client (edict_t *ent, int num) -{ - if (!svs.clients[num-1].active) - return; // unconnected slot - - // call standard client pre-think - pr_global_struct->time = sv.time; - pr_global_struct->self = EDICT_TO_PROG(ent); - PR_ExecuteProgram (pr_global_struct->PlayerPreThink, "QC function PlayerPreThink is missing"); - - // do a move - SV_CheckVelocity (ent); - - // decide which move function to call - switch ((int)ent->v->movetype) - { - case MOVETYPE_NONE: - if (!SV_RunThink (ent)) - return; - break; - - case MOVETYPE_WALK: - if (!SV_RunThink (ent)) - return; - if (!SV_CheckWater (ent) && ! ((int)ent->v->flags & FL_WATERJUMP) ) - SV_AddGravity (ent); - SV_CheckStuck (ent); - SV_WalkMove (ent); - break; - - case MOVETYPE_TOSS: - case MOVETYPE_BOUNCE: - SV_Physics_Toss (ent); - break; - - case MOVETYPE_FLY: - if (!SV_RunThink (ent)) - return; - SV_CheckWater (ent); - //SV_FlyMove (ent, sv.frametime, NULL); - SV_WalkMove (ent); - break; - - case MOVETYPE_NOCLIP: - if (!SV_RunThink (ent)) - return; - SV_CheckWater (ent); - VectorMA (ent->v->origin, sv.frametime, ent->v->velocity, ent->v->origin); - VectorMA (ent->v->angles, sv.frametime, ent->v->avelocity, ent->v->angles); - break; - - default: - Host_Error ("SV_Physics_client: bad movetype %i", (int)ent->v->movetype); - } - - // call standard player post-think - SV_LinkEdict (ent, true); - - pr_global_struct->time = sv.time; - pr_global_struct->self = EDICT_TO_PROG(ent); - PR_ExecuteProgram (pr_global_struct->PlayerPostThink, "QC function PlayerPostThink is missing"); -} - //============================================================================ /* @@ -1214,7 +1136,7 @@ SV_CheckWaterTransition void SV_CheckWaterTransition (edict_t *ent) { int cont; - cont = Mod_PointContents(ent->v->origin, sv.worldmodel); + cont = SV_PointContents(ent->v->origin); if (!ent->v->watertype) { // just spawned here @@ -1263,7 +1185,6 @@ void SV_Physics_Toss (edict_t *ent) // if onground, return without moving if ((int)ent->v->flags & FL_ONGROUND) { - VectorClear(ent->v->velocity); if (ent->v->groundentity == 0) return; // if ent was supported by a brush model on previous frame, @@ -1271,18 +1192,18 @@ void SV_Physics_Toss (edict_t *ent) groundentity = PROG_TO_EDICT(ent->v->groundentity); if (groundentity->v->solid == SOLID_BSP) { - ent->suspendedinairflag = true; + ent->e->suspendedinairflag = true; return; } - else if (ent->suspendedinairflag && groundentity->free) + else if (ent->e->suspendedinairflag && groundentity->e->free) { // leave it suspended in the air ent->v->groundentity = 0; - ent->suspendedinairflag = false; + ent->e->suspendedinairflag = false; return; } } - ent->suspendedinairflag = false; + ent->e->suspendedinairflag = false; SV_CheckVelocity (ent); @@ -1296,7 +1217,7 @@ void SV_Physics_Toss (edict_t *ent) // move origin VectorScale (ent->v->velocity, sv.frametime, move); trace = SV_PushEntity (ent, move, vec3_origin); - if (ent->free) + if (ent->e->free) return; if (trace.fraction < 1) @@ -1360,50 +1281,25 @@ will fall if the floor is pulled out from under them. */ void SV_Physics_Step (edict_t *ent) { - int flags, fall, hitsound; - - // freefall if not fly/swim - fall = true; - flags = (int)ent->v->flags; - if (flags & (FL_FLY | FL_SWIM)) + // freefall if not onground/fly/swim + if (!((int)ent->v->flags & (FL_ONGROUND | FL_FLY | FL_SWIM))) { - if (flags & FL_FLY) - fall = false; - else if ((flags & FL_SWIM) && Mod_PointContents(ent->v->origin, sv.worldmodel) != CONTENTS_EMPTY) - fall = false; - } - if (fall && (flags & FL_ONGROUND) && ent->v->groundentity == 0) - fall = false; + int hitsound = ent->v->velocity[2] < sv_gravity.value * -0.1; - if (fall) - { - if (ent->v->velocity[2] < sv_gravity.value*-0.1) - { - hitsound = true; - if (flags & FL_ONGROUND) - hitsound = false; - } - else - hitsound = false; - - SV_AddGravity (ent); - SV_CheckVelocity (ent); - SV_FlyMove (ent, sv.frametime, NULL); - SV_LinkEdict (ent, false); + SV_AddGravity(ent); + SV_CheckVelocity(ent); + SV_FlyMove(ent, sv.frametime, NULL); + SV_LinkEdict(ent, false); // just hit ground - if ((int)ent->v->flags & FL_ONGROUND) - { - VectorClear(ent->v->velocity); - if (hitsound) - SV_StartSound (ent, 0, "demon/dland2.wav", 255, 1); - } + if (hitsound && (int)ent->v->flags & FL_ONGROUND) + SV_StartSound(ent, 0, "demon/dland2.wav", 255, 1); } // regular thinking - SV_RunThink (ent); + SV_RunThink(ent); - SV_CheckWaterTransition (ent); + SV_CheckWaterTransition(ent); } //============================================================================ @@ -1431,7 +1327,7 @@ void SV_Physics (void) ent = sv.edicts; for (i=0 ; ifree) + if (ent->e->free) continue; if (pr_global_struct->force_retouch) @@ -1439,10 +1335,18 @@ void SV_Physics (void) if (i > 0 && i <= svs.maxclients) { - SV_Physics_Client (ent, i); - continue; + if (!svs.clients[i-1].active) + continue; + // connected slot + // call standard client pre-think + SV_CheckVelocity (ent); + pr_global_struct->time = sv.time; + pr_global_struct->self = EDICT_TO_PROG(ent); + PR_ExecuteProgram (pr_global_struct->PlayerPreThink, "QC function PlayerPreThink is missing"); + SV_CheckVelocity (ent); } + // LordHavoc: merged client and normal entity physics switch ((int) ent->v->movetype) { case MOVETYPE_PUSH: @@ -1457,12 +1361,21 @@ void SV_Physics (void) SV_Physics_Follow (ent); break; case MOVETYPE_NOCLIP: - SV_Physics_Noclip (ent); + if (i > 0 && i <= svs.maxclients) + { + if (SV_RunThink (ent)) + { + SV_CheckWater (ent); + VectorMA (ent->v->origin, sv.frametime, ent->v->velocity, ent->v->origin); + VectorMA (ent->v->angles, sv.frametime, ent->v->avelocity, ent->v->angles); + } + } + else + SV_Physics_Noclip (ent); break; case MOVETYPE_STEP: SV_Physics_Step (ent); break; - // LordHavoc: added support for MOVETYPE_WALK on normal entities! :) case MOVETYPE_WALK: if (SV_RunThink (ent)) { @@ -1476,14 +1389,39 @@ void SV_Physics (void) case MOVETYPE_TOSS: case MOVETYPE_BOUNCE: case MOVETYPE_BOUNCEMISSILE: - case MOVETYPE_FLY: case MOVETYPE_FLYMISSILE: SV_Physics_Toss (ent); break; + case MOVETYPE_FLY: + if (i > 0 && i <= svs.maxclients) + { + if (SV_RunThink (ent)) + { + SV_CheckWater (ent); + SV_WalkMove (ent); + } + } + else + SV_Physics_Toss (ent); + break; default: Host_Error ("SV_Physics: bad movetype %i", (int)ent->v->movetype); break; } + + if (i > 0 && i <= svs.maxclients && !ent->e->free) + { + SV_CheckVelocity (ent); + + // call standard player post-think + SV_LinkEdict (ent, true); + + SV_CheckVelocity (ent); + + pr_global_struct->time = sv.time; + pr_global_struct->self = EDICT_TO_PROG(ent); + PR_ExecuteProgram (pr_global_struct->PlayerPostThink, "QC function PlayerPostThink is missing"); + } } if (pr_global_struct->force_retouch)