mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-02-22 11:51:10 +00:00
Held item changes
This commit is contained in:
parent
8bc27d9386
commit
dd04d68c09
5 changed files with 227 additions and 132 deletions
230
src/k_kart.c
230
src/k_kart.c
|
@ -2083,7 +2083,7 @@ void K_DriftDustHandling(mobj_t *spawner)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static mobj_t *K_FindLastTrailMobj(player_t *player) // YUCK, i hate this!
|
static mobj_t *K_FindLastTrailMobj(player_t *player)
|
||||||
{
|
{
|
||||||
mobj_t *trail = player->mo->hnext;
|
mobj_t *trail = player->mo->hnext;
|
||||||
|
|
||||||
|
@ -2473,6 +2473,165 @@ void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void K_RepairOrbitChain(mobj_t *orbit)
|
||||||
|
{
|
||||||
|
mobj_t *cachenext = orbit->hnext;
|
||||||
|
|
||||||
|
// First, repair the chain
|
||||||
|
if (orbit->hnext && !P_MobjWasRemoved(orbit->hnext))
|
||||||
|
{
|
||||||
|
P_SetTarget(&orbit->hnext->hprev, orbit->hprev);
|
||||||
|
P_SetTarget(&orbit->hnext, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (orbit->hprev && !P_MobjWasRemoved(orbit->hprev))
|
||||||
|
{
|
||||||
|
P_SetTarget(&orbit->hprev->hnext, cachenext);
|
||||||
|
P_SetTarget(&orbit->hprev, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then recount to make sure item amount is correct
|
||||||
|
if (orbit->target && orbit->target->player)
|
||||||
|
{
|
||||||
|
mobj_t *cur = NULL;
|
||||||
|
mobj_t *prev = NULL;
|
||||||
|
INT32 num = 0;
|
||||||
|
|
||||||
|
if (orbit->target->hnext)
|
||||||
|
cur = orbit->target->hnext;
|
||||||
|
|
||||||
|
while (cur && !P_MobjWasRemoved(cur) && cur != orbit->target->player->mo)
|
||||||
|
{
|
||||||
|
num++;
|
||||||
|
prev = cur;
|
||||||
|
cur = cur->hnext;
|
||||||
|
if (num > orbit->target->player->kartstuff[k_itemamount])
|
||||||
|
P_RemoveMobj(prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (orbit->target->player->kartstuff[k_itemamount] != num)
|
||||||
|
orbit->target->player->kartstuff[k_itemamount] = num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void K_MoveHeldObjects(player_t *player)
|
||||||
|
{
|
||||||
|
if (!player->mo)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!player->mo->hnext)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (player->mo->hnext->type)
|
||||||
|
{
|
||||||
|
case MT_GREENSHIELD: // Kart orbit items
|
||||||
|
case MT_JAWZ_SHIELD:
|
||||||
|
{
|
||||||
|
mobj_t *cur = player->mo->hnext;
|
||||||
|
|
||||||
|
while (cur && !P_MobjWasRemoved(cur) && cur != player->mo)
|
||||||
|
{
|
||||||
|
const fixed_t radius = FixedHypot(player->mo->radius, player->mo->radius) + FixedHypot(cur->radius, cur->radius); // mobj's distance from its Target, or Radius.
|
||||||
|
fixed_t z;
|
||||||
|
|
||||||
|
cur->angle -= ANGLE_90;
|
||||||
|
cur->angle += FixedAngle(cur->info->speed);
|
||||||
|
|
||||||
|
// If the player is on the ceiling, then flip your items as well.
|
||||||
|
if (player && player->mo->eflags & MFE_VERTICALFLIP)
|
||||||
|
cur->eflags |= MFE_VERTICALFLIP;
|
||||||
|
else
|
||||||
|
cur->eflags &= ~MFE_VERTICALFLIP;
|
||||||
|
|
||||||
|
// Shrink your items if the player shrunk too.
|
||||||
|
cur->scale = player->mo->scale;
|
||||||
|
|
||||||
|
if (P_MobjFlip(cur) > 0)
|
||||||
|
z = player->mo->z;
|
||||||
|
else
|
||||||
|
z = player->mo->z + player->mo->height - cur->height;
|
||||||
|
|
||||||
|
cur->flags |= MF_NOCLIPTHING; // temporarily make them noclip other objects so they can't hit anyone while in the player
|
||||||
|
P_TeleportMove(cur, player->mo->x, player->mo->y, z);
|
||||||
|
cur->momx = FixedMul(FINECOSINE(cur->angle>>ANGLETOFINESHIFT), radius);
|
||||||
|
cur->momy = FixedMul(FINESINE(cur->angle>>ANGLETOFINESHIFT), radius);
|
||||||
|
cur->flags &= ~MF_NOCLIPTHING;
|
||||||
|
if (!P_TryMove(cur, player->mo->x + cur->momx, player->mo->y + cur->momy, true))
|
||||||
|
P_SlideMove(cur, true);
|
||||||
|
if (P_IsObjectOnGround(player->mo))
|
||||||
|
{
|
||||||
|
if (P_MobjFlip(cur) > 0)
|
||||||
|
{
|
||||||
|
if (cur->floorz > player->mo->z - cur->height)
|
||||||
|
z = cur->floorz;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (cur->ceilingz < player->mo->z + player->mo->height + cur->height)
|
||||||
|
z = cur->ceilingz - cur->height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cur->z = z;
|
||||||
|
cur->momx = cur->momy = 0;
|
||||||
|
cur->angle += ANGLE_90;
|
||||||
|
|
||||||
|
cur = cur->hnext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MT_BANANA_SHIELD: // Kart trailing items
|
||||||
|
case MT_SSMINE_SHIELD:
|
||||||
|
case MT_FAKESHIELD:
|
||||||
|
{
|
||||||
|
mobj_t *cur = player->mo->hnext;
|
||||||
|
mobj_t *targ = player->mo;
|
||||||
|
|
||||||
|
while (cur && !P_MobjWasRemoved(cur) && cur != player->mo)
|
||||||
|
{
|
||||||
|
const fixed_t spacing = FixedMul(3*cur->info->radius/2, player->mo->scale);
|
||||||
|
angle_t ang;
|
||||||
|
fixed_t targx;
|
||||||
|
fixed_t targy;
|
||||||
|
fixed_t targz;
|
||||||
|
fixed_t speed;
|
||||||
|
fixed_t dist = spacing;
|
||||||
|
|
||||||
|
if (cur != player->mo->hnext)
|
||||||
|
{
|
||||||
|
targ = cur->hprev;
|
||||||
|
dist = spacing/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!targ || P_MobjWasRemoved(targ))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ang = targ->angle;
|
||||||
|
targx = targ->x + P_ReturnThrustX(cur, ang + ANGLE_180, dist);
|
||||||
|
targy = targ->y + P_ReturnThrustY(cur, ang + ANGLE_180, dist);
|
||||||
|
targz = targ->z;
|
||||||
|
speed = FixedMul(R_PointToDist2(cur->x, cur->y, targx, targy), 3*FRACUNIT/4);
|
||||||
|
if (P_IsObjectOnGround(targ))
|
||||||
|
targz = cur->floorz;
|
||||||
|
|
||||||
|
cur->angle = R_PointToAngle2(cur->x, cur->y, targx, targy);
|
||||||
|
|
||||||
|
if (speed > dist)
|
||||||
|
P_InstaThrust(cur, cur->angle, speed-dist);
|
||||||
|
|
||||||
|
P_SetObjectMomZ(cur, FixedMul(targz - cur->z, 3*FRACUNIT/4) - gravity, false);
|
||||||
|
|
||||||
|
if (R_PointToDist2(cur->x, cur->y, targx, targy) > 768*FRACUNIT)
|
||||||
|
P_TeleportMove(cur, targx, targy, cur->z);
|
||||||
|
|
||||||
|
cur = cur->hnext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c
|
/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c
|
||||||
|
|
||||||
\param player player object passed from P_PlayerThink
|
\param player player object passed from P_PlayerThink
|
||||||
|
@ -2675,6 +2834,9 @@ void K_KartPlayerAfterThink(player_t *player)
|
||||||
if (!(player->mo->state->frame & FF_FULLBRIGHT))
|
if (!(player->mo->state->frame & FF_FULLBRIGHT))
|
||||||
player->mo->frame &= ~FF_FULLBRIGHT;
|
player->mo->frame &= ~FF_FULLBRIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move held objects (Bananas, Orbinaut, etc)
|
||||||
|
K_MoveHeldObjects(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns false if this player being placed here causes them to collide with any other player
|
// Returns false if this player being placed here causes them to collide with any other player
|
||||||
|
@ -3187,31 +3349,40 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
case KITEM_ORBINAUT:
|
case KITEM_ORBINAUT:
|
||||||
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
|
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
|
||||||
{
|
{
|
||||||
|
angle_t newangle;
|
||||||
|
fixed_t newx;
|
||||||
|
fixed_t newy;
|
||||||
INT32 moloop;
|
INT32 moloop;
|
||||||
|
mobj_t *mo;
|
||||||
|
mobj_t *prev = NULL;
|
||||||
|
|
||||||
|
//K_PlayTauntSound(player->mo);
|
||||||
player->kartstuff[k_itemheld] = 1;
|
player->kartstuff[k_itemheld] = 1;
|
||||||
player->pflags |= PF_ATTACKDOWN;
|
player->pflags |= PF_ATTACKDOWN;
|
||||||
//K_PlayTauntSound(player->mo);
|
|
||||||
S_StartSound(player->mo, sfx_s3k3a);
|
S_StartSound(player->mo, sfx_s3k3a);
|
||||||
|
|
||||||
for (moloop = 0; moloop < player->kartstuff[k_itemamount]; moloop++)
|
for (moloop = 0; moloop < player->kartstuff[k_itemamount]; moloop++)
|
||||||
{
|
{
|
||||||
angle_t newangle;
|
newangle = FixedAngle(((360/player->kartstuff[k_itemamount])*moloop)*FRACUNIT) + ANGLE_90;
|
||||||
fixed_t newx;
|
newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 64*FRACUNIT);
|
||||||
fixed_t newy;
|
newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 64*FRACUNIT);
|
||||||
mobj_t *mo;
|
|
||||||
|
|
||||||
newangle = player->mo->angle;
|
|
||||||
newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT);
|
|
||||||
newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT);
|
|
||||||
mo = P_SpawnMobj(newx, newy, player->mo->z, MT_GREENSHIELD);
|
mo = P_SpawnMobj(newx, newy, player->mo->z, MT_GREENSHIELD);
|
||||||
if (mo)
|
mo->angle = newangle;
|
||||||
{
|
|
||||||
mo->threshold = 10;
|
mo->threshold = 10;
|
||||||
|
mo->movecount = player->kartstuff[k_itemamount];
|
||||||
mo->lastlook = moloop+1;
|
mo->lastlook = moloop+1;
|
||||||
P_SetTarget(&mo->target, player->mo);
|
P_SetTarget(&mo->target, player->mo);
|
||||||
mo->angle = FixedAngle(((360/player->kartstuff[k_itemamount])*moloop)*FRACUNIT) + ANGLE_90;
|
if (moloop > 0)
|
||||||
|
{
|
||||||
|
P_SetTarget(&mo->hprev, prev);
|
||||||
|
if (prev != NULL)
|
||||||
|
P_SetTarget(&prev->hnext, mo);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
P_SetTarget(&player->mo->hnext, mo);
|
||||||
|
if (moloop == player->kartstuff[k_itemamount]-1) // Complete loop for orbit items
|
||||||
|
P_SetTarget(&mo->hnext, player->mo);
|
||||||
|
prev = mo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ATTACK_IS_DOWN && player->kartstuff[k_itemheld]) // Orbinaut x3 thrown
|
else if (ATTACK_IS_DOWN && player->kartstuff[k_itemheld]) // Orbinaut x3 thrown
|
||||||
|
@ -3228,31 +3399,40 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
|
||||||
case KITEM_JAWZ:
|
case KITEM_JAWZ:
|
||||||
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
|
if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO)
|
||||||
{
|
{
|
||||||
|
angle_t newangle;
|
||||||
|
fixed_t newx;
|
||||||
|
fixed_t newy;
|
||||||
INT32 moloop;
|
INT32 moloop;
|
||||||
|
mobj_t *mo;
|
||||||
|
mobj_t *prev = NULL;
|
||||||
|
|
||||||
|
//K_PlayTauntSound(player->mo);
|
||||||
player->kartstuff[k_itemheld] = 1;
|
player->kartstuff[k_itemheld] = 1;
|
||||||
player->pflags |= PF_ATTACKDOWN;
|
player->pflags |= PF_ATTACKDOWN;
|
||||||
//K_PlayTauntSound(player->mo);
|
|
||||||
S_StartSound(player->mo, sfx_s3k3a);
|
S_StartSound(player->mo, sfx_s3k3a);
|
||||||
|
|
||||||
for (moloop = 0; moloop < player->kartstuff[k_itemamount]; moloop++)
|
for (moloop = 0; moloop < player->kartstuff[k_itemamount]; moloop++)
|
||||||
{
|
{
|
||||||
angle_t newangle;
|
newangle = FixedAngle(((360/player->kartstuff[k_itemamount])*moloop)*FRACUNIT) + ANGLE_90;
|
||||||
fixed_t newx;
|
newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 64*FRACUNIT);
|
||||||
fixed_t newy;
|
newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 64*FRACUNIT);
|
||||||
mobj_t *mo;
|
|
||||||
|
|
||||||
newangle = player->mo->angle;
|
|
||||||
newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, 64*FRACUNIT);
|
|
||||||
newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, 64*FRACUNIT);
|
|
||||||
mo = P_SpawnMobj(newx, newy, player->mo->z, MT_JAWZ_SHIELD);
|
mo = P_SpawnMobj(newx, newy, player->mo->z, MT_JAWZ_SHIELD);
|
||||||
if (mo)
|
mo->angle = newangle;
|
||||||
{
|
|
||||||
mo->threshold = 10;
|
mo->threshold = 10;
|
||||||
|
mo->movecount = player->kartstuff[k_itemamount];
|
||||||
mo->lastlook = moloop+1;
|
mo->lastlook = moloop+1;
|
||||||
P_SetTarget(&mo->target, player->mo);
|
P_SetTarget(&mo->target, player->mo);
|
||||||
mo->angle = FixedAngle(((360/player->kartstuff[k_itemamount])*moloop)*FRACUNIT) + ANGLE_90;
|
if (moloop > 0)
|
||||||
|
{
|
||||||
|
P_SetTarget(&mo->hprev, prev);
|
||||||
|
if (prev != NULL)
|
||||||
|
P_SetTarget(&prev->hnext, mo);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
P_SetTarget(&player->mo->hnext, mo);
|
||||||
|
if (moloop == player->kartstuff[k_itemamount]-1) // Complete loop for orbit items
|
||||||
|
P_SetTarget(&mo->hnext, player->mo);
|
||||||
|
prev = mo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ATTACK_IS_DOWN && HOLDING_ITEM && player->kartstuff[k_itemheld]) // Jawz thrown
|
else if (ATTACK_IS_DOWN && HOLDING_ITEM && player->kartstuff[k_itemheld]) // Jawz thrown
|
||||||
|
|
|
@ -36,6 +36,7 @@ void K_DriftDustHandling(mobj_t *spawner);
|
||||||
void K_DoSneaker(player_t *player, boolean doPFlag);
|
void K_DoSneaker(player_t *player, boolean doPFlag);
|
||||||
void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed);
|
void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed);
|
||||||
void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source);
|
void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source);
|
||||||
|
void K_RepairOrbitChain(mobj_t *orbit);
|
||||||
boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y);
|
boolean K_CheckPlayersRespawnColliding(INT32 playernum, fixed_t x, fixed_t y);
|
||||||
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
|
INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue);
|
||||||
void K_StripItems(player_t *player);
|
void K_StripItems(player_t *player);
|
||||||
|
|
|
@ -2149,6 +2149,16 @@ static int lib_kKillBananaChain(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_kRepairOrbitChain(lua_State *L)
|
||||||
|
{
|
||||||
|
mobj_t *orbit = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
|
||||||
|
NOHUD
|
||||||
|
if (!orbit)
|
||||||
|
return LUA_ErrInvalid(L, "mobj_t");
|
||||||
|
K_RepairOrbitChain(orbit);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int lib_kMomentumToFacing(lua_State *L)
|
static int lib_kMomentumToFacing(lua_State *L)
|
||||||
{
|
{
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
@ -2377,6 +2387,7 @@ static luaL_Reg lib[] = {
|
||||||
{"K_DoSneaker",lib_kDoSneaker},
|
{"K_DoSneaker",lib_kDoSneaker},
|
||||||
{"K_DoPogoSpring",lib_kDoPogoSpring},
|
{"K_DoPogoSpring",lib_kDoPogoSpring},
|
||||||
{"K_KillBananaChain",lib_kKillBananaChain},
|
{"K_KillBananaChain",lib_kKillBananaChain},
|
||||||
|
{"K_RepairOrbitChain",lib_kRepairOrbitChain},
|
||||||
{"K_MomentumToFacing",lib_kMomentumToFacing},
|
{"K_MomentumToFacing",lib_kMomentumToFacing},
|
||||||
{"K_GetKartSpeed",lib_kGetKartSpeed},
|
{"K_GetKartSpeed",lib_kGetKartSpeed},
|
||||||
{"K_GetKartAccel",lib_kGetKartAccel},
|
{"K_GetKartAccel",lib_kGetKartAccel},
|
||||||
|
|
|
@ -2122,7 +2122,13 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source)
|
||||||
}
|
}
|
||||||
else if ((target->type == MT_GREENSHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_ORBINAUT) // orbit items
|
else if ((target->type == MT_GREENSHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_ORBINAUT) // orbit items
|
||||||
|| (target->type == MT_JAWZ_SHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_JAWZ))
|
|| (target->type == MT_JAWZ_SHIELD && target->target->player->kartstuff[k_itemtype] == KITEM_JAWZ))
|
||||||
|
{
|
||||||
target->target->player->kartstuff[k_itemamount]--;
|
target->target->player->kartstuff[k_itemamount]--;
|
||||||
|
if (target->lastlook != 0)
|
||||||
|
{
|
||||||
|
K_RepairOrbitChain(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (target->target->player->kartstuff[k_itemamount] < 0)
|
if (target->target->player->kartstuff[k_itemamount] < 0)
|
||||||
target->target->player->kartstuff[k_itemamount] = 0;
|
target->target->player->kartstuff[k_itemamount] = 0;
|
||||||
|
|
103
src/p_mobj.c
103
src/p_mobj.c
|
@ -6697,63 +6697,6 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
if (mobj->health > 0 && mobj->target && mobj->target->player
|
if (mobj->health > 0 && mobj->target && mobj->target->player
|
||||||
&& mobj->target->player->health > 0 && !mobj->target->player->spectator)
|
&& mobj->target->player->health > 0 && !mobj->target->player->spectator)
|
||||||
{
|
{
|
||||||
fixed_t z;
|
|
||||||
const fixed_t radius = FixedHypot(mobj->target->radius, mobj->target->radius) + FixedHypot(mobj->radius, mobj->radius); // mobj's distance from its Target, or Radius.
|
|
||||||
|
|
||||||
mobj->angle -= ANGLE_90;
|
|
||||||
mobj->angle += FixedAngle(mobj->info->speed);
|
|
||||||
|
|
||||||
// If the player is on the ceiling, then flip your items as well.
|
|
||||||
if (mobj->target->player && mobj->target->eflags & MFE_VERTICALFLIP)
|
|
||||||
{
|
|
||||||
mobj->eflags |= MFE_VERTICALFLIP;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mobj->eflags &= ~MFE_VERTICALFLIP;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shrink your items if the player shrunk too.
|
|
||||||
if (mobj->target->player)
|
|
||||||
mobj->scale = mobj->target->scale;
|
|
||||||
|
|
||||||
if (P_MobjFlip(mobj) > 0)
|
|
||||||
{
|
|
||||||
z = mobj->target->z;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
z = mobj->target->z + mobj->target->height - mobj->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
mobj->flags |= MF_NOCLIPTHING; // temporarily make them noclip other objects so they can't hit anyone while in the player
|
|
||||||
P_TeleportMove(mobj, mobj->target->x, mobj->target->y, z);
|
|
||||||
mobj->momx = FixedMul(FINECOSINE(mobj->angle>>ANGLETOFINESHIFT),radius);
|
|
||||||
mobj->momy = FixedMul(FINESINE(mobj->angle>>ANGLETOFINESHIFT), radius);
|
|
||||||
mobj->flags &= ~MF_NOCLIPTHING;
|
|
||||||
if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, true))
|
|
||||||
P_SlideMove(mobj, true);
|
|
||||||
if (P_IsObjectOnGround(mobj->target))
|
|
||||||
{
|
|
||||||
if (P_MobjFlip(mobj) > 0)
|
|
||||||
{
|
|
||||||
if (mobj->floorz > mobj->target->z - mobj->height)
|
|
||||||
{
|
|
||||||
z = mobj->floorz;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (mobj->ceilingz < mobj->target->z + mobj->target->height + mobj->height)
|
|
||||||
{
|
|
||||||
z = mobj->ceilingz - mobj->height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mobj->z = z;
|
|
||||||
mobj->momx = mobj->momy = 0;
|
|
||||||
mobj->angle += ANGLE_90;
|
|
||||||
|
|
||||||
// Was this so hard?
|
// Was this so hard?
|
||||||
if ((mobj->type == MT_GREENSHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_ORBINAUT)
|
if ((mobj->type == MT_GREENSHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_ORBINAUT)
|
||||||
|| (mobj->type == MT_JAWZ_SHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_JAWZ)
|
|| (mobj->type == MT_JAWZ_SHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_JAWZ)
|
||||||
|
@ -6779,52 +6722,6 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
if (mobj->health > 0 && mobj->target && mobj->target->player
|
if (mobj->health > 0 && mobj->target && mobj->target->player
|
||||||
&& mobj->target->player->health > 0 && !mobj->target->player->spectator)
|
&& mobj->target->player->health > 0 && !mobj->target->player->spectator)
|
||||||
{
|
{
|
||||||
if (mobj->lastlook == 1)
|
|
||||||
{
|
|
||||||
const fixed_t spacing = FixedMul(3*mobj->info->radius/2, mobj->target->scale);
|
|
||||||
mobj_t *cur = mobj;
|
|
||||||
mobj_t *targ = mobj->target;
|
|
||||||
|
|
||||||
while (cur && !P_MobjWasRemoved(cur))
|
|
||||||
{
|
|
||||||
angle_t ang;
|
|
||||||
fixed_t targx;
|
|
||||||
fixed_t targy;
|
|
||||||
fixed_t targz;
|
|
||||||
fixed_t speed;
|
|
||||||
fixed_t dist = spacing;
|
|
||||||
|
|
||||||
if (cur != mobj)
|
|
||||||
{
|
|
||||||
targ = cur->hprev;
|
|
||||||
dist = spacing/2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!targ || P_MobjWasRemoved(targ))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ang = targ->angle;
|
|
||||||
targx = targ->x + P_ReturnThrustX(cur, ang + ANGLE_180, dist);
|
|
||||||
targy = targ->y + P_ReturnThrustY(cur, ang + ANGLE_180, dist);
|
|
||||||
targz = targ->z;
|
|
||||||
speed = FixedMul(R_PointToDist2(cur->x, cur->y, targx, targy), 3*FRACUNIT/4);
|
|
||||||
if (P_IsObjectOnGround(targ))
|
|
||||||
targz = cur->floorz;
|
|
||||||
|
|
||||||
cur->angle = R_PointToAngle2(cur->x, cur->y, targx, targy);
|
|
||||||
|
|
||||||
if (speed > dist)
|
|
||||||
P_InstaThrust(cur, cur->angle, speed-dist);
|
|
||||||
|
|
||||||
P_SetObjectMomZ(cur, FixedMul(targz - cur->z, 3*FRACUNIT/4) - gravity, false);
|
|
||||||
|
|
||||||
if (R_PointToDist2(cur->x, cur->y, targx, targy) > 768*FRACUNIT)
|
|
||||||
P_TeleportMove(cur, targx, targy, cur->z);
|
|
||||||
|
|
||||||
cur = cur->hnext;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Was this so hard?
|
// Was this so hard?
|
||||||
if ((mobj->type == MT_BANANA_SHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_BANANA)
|
if ((mobj->type == MT_BANANA_SHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_BANANA)
|
||||||
|| (mobj->type == MT_SSMINE_SHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_MINE)
|
|| (mobj->type == MT_SSMINE_SHIELD && mobj->target->player->kartstuff[k_itemtype] != KITEM_MINE)
|
||||||
|
|
Loading…
Reference in a new issue