1 void _Movetype_PushMove(entity this, float dt) // SV_PushMove
3 if (this.move_velocity == '0 0 0' && this.move_avelocity == '0 0 0')
11 // LordHavoc: valid pusher types
15 case SOLID_CORPSE: // LordHavoc: this would be weird...
17 // LordHavoc: no collisions
20 this.move_origin = this.move_origin + dt * this.move_velocity;
21 this.move_angles = this.move_angles + dt * this.move_avelocity;
22 this.move_angles_x -= 360.0 * floor(this.move_angles.x * (1.0 / 360.0));
23 this.move_angles_y -= 360.0 * floor(this.move_angles.y * (1.0 / 360.0));
24 this.move_angles_z -= 360.0 * floor(this.move_angles.z * (1.0 / 360.0));
25 this.move_ltime += dt;
26 _Movetype_LinkEdict(this, true);
29 LOG_TRACEF("_Movetype_PushMove: entity %e, unrecognized solid type %d\n", this, this.solid);
33 bool rotated = (this.move_angles * this.move_angles) + (this.move_avelocity * this.move_avelocity) > 0;
35 vector move1 = this.move_velocity * dt;
36 vector moveangle = this.move_avelocity * dt;
38 makevectors_matrix(-moveangle);
40 // vector pushorig = this.move_origin;
41 // vector pushang = this.move_angles;
42 // float pushltime = this.move_ltime;
44 // move the pusher to its final position
46 this.move_origin = this.move_origin + dt * this.move_velocity;
47 this.move_angles = this.move_angles + dt * this.move_avelocity;
49 this.move_ltime += dt;
50 _Movetype_LinkEdict(this, true);
52 int savesolid = this.solid;
54 if (this.move_movetype != MOVETYPE_FAKEPUSH)
56 FOREACH_ENTITY_RADIUS(0.5 * (this.absmin + this.absmax), 0.5 * vlen(this.absmax - this.absmin), true, {
57 switch (it.move_movetype)
63 case MOVETYPE_FLY_WORLDONLY:
75 vector pivot = it.mins + 0.5 * (it.maxs - it.mins);
79 vector org = (it.move_origin - this.move_origin) + pivot;
81 org2.x = org * v_forward;
82 org2.y = org * v_right;
84 move = (org2 - org) + move1;
91 // physics objects need better collisions than this code can do
92 if (it.move_movetype == 32) // MOVETYPE_PHYSICS
94 it.move_origin = it.move_origin + move;
95 _Movetype_LinkEdict(it, true);
99 // try moving the contacted entity
100 this.solid = SOLID_NOT;
102 flag = _Movetype_PushEntity(it, move, true);
105 // entity "it" got teleported
106 it.move_angles_y += trace_fraction * moveangle.y;
107 this.solid = savesolid;
108 continue; // pushed enough
110 // FIXME: turn players specially
111 it.move_angles_y += trace_fraction * moveangle.y;
112 this.solid = savesolid;
114 // this trace.fraction < 1 check causes items to fall off of pushers
115 // if they pass under or through a wall
116 // the groundentity check causes items to fall off of ledges
117 if (it.move_movetype != MOVETYPE_WALK && (trace_fraction < 1 || it.move_groundentity != this))
118 it.move_flags &= ~FL_ONGROUND;
122 this.move_angles_x -= 360.0 * floor(this.move_angles.x * (1.0 / 360.0));
123 this.move_angles_y -= 360.0 * floor(this.move_angles.y * (1.0 / 360.0));
124 this.move_angles_z -= 360.0 * floor(this.move_angles.z * (1.0 / 360.0));
127 void _Movetype_Physics_Pusher(entity this, float dt) // SV_Physics_Pusher
129 float oldltime = this.move_ltime;
130 float thinktime = this.move_nextthink;
132 if (thinktime < this.move_ltime + dt)
134 movetime = thinktime - this.move_ltime;
144 // advances this.move_ltime if not blocked
145 _Movetype_PushMove(this, movetime);
147 if (thinktime > oldltime && thinktime <= this.move_ltime)
149 this.move_nextthink = 0;
150 this.move_time = time;
152 WITH(entity, self, this, this.move_think());