diff --git a/src/hu_stuff.c b/src/hu_stuff.c index e7d643a3b..e252fc1f4 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -710,6 +710,9 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum) } } } + + if (LUA_HookPlayerMsg(playernum, target, flags, msg)) + return; // If it's a CSAY, just CECHO and be done with it. if (flags & HU_CSAY) diff --git a/src/lua_hook.h b/src/lua_hook.h index d44423400..8aedf3231 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -139,7 +139,7 @@ int LUA_HookMobjDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 int LUA_HookMobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); int LUA_HookMobjMoveBlocked(mobj_t *, mobj_t *, line_t *); void LUA_HookSpecialExecute(activator_t *activator, INT32 *args, char **stringargs); -int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute); +int LUA_HookPlayerMsg(int source, int target, int flags, char *msg); int LUA_HookHurtMsg(player_t *, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); int LUA_HookMapThingSpawn(mobj_t *, mapthing_t *); int LUA_HookFollowMobj(player_t *, mobj_t *); diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 45805a062..7f797f417 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -843,7 +843,7 @@ void LUA_HookSpecialExecute(activator_t *activator, INT32 *args, char **stringar } } -int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute) +int LUA_HookPlayerMsg(int source, int target, int flags, char *msg) { Hook_State hook; if (prepare_hook(&hook, false, HOOK(PlayerMsg))) @@ -863,7 +863,6 @@ int LUA_HookPlayerMsg(int source, int target, int flags, char *msg, int mute) LUA_PushUserdata(gL, &players[target-1], META_PLAYER); // target } lua_pushstring(gL, msg); // msg - lua_pushboolean(gL, mute); // the message was supposed to be eaten by spamprotecc. call_hooks(&hook, 1, res_true); } diff --git a/src/objects/loops.cpp b/src/objects/loops.cpp index ddb401891..cb512d396 100644 --- a/src/objects/loops.cpp +++ b/src/objects/loops.cpp @@ -151,81 +151,6 @@ get_binary_direction } } -static std::optional -intersect -( const mobj_t * anchor, - const mobj_t * toucher) -{ - struct Line - { - angle_t a; - vector2_t o; - - angle_t k = AbsAngle(a); - - Line(vector2_t o_, angle_t a_) : a(a_), o(o_) {} - - bool vertical() const { return k == ANGLE_90; } - - fixed_t m() const - { - // tangent table is offset 90 degrees - return FTAN(a - ANGLE_90); - } - - fixed_t b() const - { - return o.y - FixedMul(o.x, m()); - } - - fixed_t y(fixed_t x) const - { - return FixedMul(m(), x) + b(); - } - }; - - if (toucher->momx == 0 && toucher->momy == 0) - { - // undefined angle - return {}; - } - - Line a({toucher->x, toucher->y}, - R_PointToAngle2(0, 0, toucher->momx, toucher->momy)); - - Line b({anchor->x, anchor->y}, anchor->angle + ANGLE_90); - - if (a.k == b.k) - { - // parallel lines do not intersect - return {}; - } - - vector2_t v; - - auto v_intersect = [&v](Line &a, Line &b) - { - if (a.vertical()) - { - return false; - } - - v.x = b.o.x; - v.y = a.y(v.x); - - return true; - }; - - if (!v_intersect(a, b) && !v_intersect(b, a)) - { - // untested! - v.x = FixedDiv(a.b() - b.b(), b.m() - a.m()); - v.y = a.y(v.x); - } - - return v; -} - mobj_t * Obj_FindLoopCenter (const mtag_t tag) { @@ -330,10 +255,12 @@ Obj_LoopEndpointCollide { set_shiftxy(player, anchor); - vector2_t i = intersect(anchor, toucher) - .value_or(vector2_t {px, py}); - - s->origin_shift = {i.x - px, i.y - py}; + const fixed_t magnitude = R_PointToDist2(0, 0, px, py); + const fixed_t newX = FixedDiv(px, magnitude); + const fixed_t newY = FixedDiv(py, magnitude); + + s->origin_shift = {FixedMul(newX, FCOS(anchor->angle)), + FixedMul(newY, FSIN(anchor->angle))}; } flip = get_binary_direction(pitch, toucher); diff --git a/src/p_loop.c b/src/p_loop.c index 9ddf22f7b..93ef4c060 100644 --- a/src/p_loop.c +++ b/src/p_loop.c @@ -101,7 +101,7 @@ boolean P_PlayerOrbit(player_t *player) fixed_t r, xy, z; fixed_t xs, ys; - fixed_t step, th, left; + fixed_t step, left; fixed_t grav; @@ -136,16 +136,12 @@ boolean P_PlayerOrbit(player_t *player) // XY shift is transformed on wave scale; less movement // at start and end of rotation, more halfway. - th = FSIN(pitch_normal - ANGLE_90); - - xs = FixedMul(s->shift.x, th); - ys = FixedMul(s->shift.y, th); + xs = FixedMul(s->shift.x, FCOS(pitch_normal)); + ys = FixedMul(s->shift.y, FSIN(pitch_normal - ANGLE_90)); // Interpolate 0-1 over entire rotation. - th = FSIN(pitch_normal / 2); - - xs += FixedMul(s->origin_shift.x, th); - ys += FixedMul(s->origin_shift.y, th); + xs += FixedMul(s->origin_shift.x, FCOS(pitch_normal)); + ys += FixedMul(s->origin_shift.y, FSIN(pitch_normal - ANGLE_90)); xs += FixedMul(xy, FCOS(s->yaw)); ys += FixedMul(xy, FSIN(s->yaw));