From 0b920ee2492566d245c93f7a624418b6896e9080 Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Thu, 9 Jun 2016 00:02:50 +0100 Subject: [PATCH 1/3] You know that problem where you bumped on the edges of Mario blocks and Bustable blocks and Bouncy FOFs sometimes? Wham. Bam. In the van. Issue was caused by attempting to traverse the sector's thing-touching-list across all the things in the sector (which would inevitably have the same sector as the first node in mobj->touching_sectorlist) instead of traversing the thing's sector-touching-list (which has the same thing but different sector references). I wonder how many times AJ copypasted this code with absolutely no idea why it wasn't working properly. I'll figure that out tomorrow, maybe set up some compiler macros so this mistake is never made again. For now, I must sleeb. --- src/p_mobj.c | 4 ++-- src/p_user.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 68fb1696f..759fa0d8c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1530,7 +1530,7 @@ static void P_PushableCheckBustables(mobj_t *mo) mo->y += mo->momy; P_SetThingPosition(mo); - for (node = mo->touching_sectorlist; node; node = node->m_snext) + for (node = mo->touching_sectorlist; node; node = node->m_tnext) { if (!node->m_sector) break; @@ -2880,7 +2880,7 @@ nightsdone: if (CheckForMarioBlocks && !(netgame && mo->player->spectator)) // Only let the player punch { // Search the touching sectors, from side-to-side... - for (node = mo->touching_sectorlist; node; node = node->m_snext) + for (node = mo->touching_sectorlist; node; node = node->m_tnext) { ffloor_t *rover; if (!node->m_sector->ffloors) diff --git a/src/p_user.c b/src/p_user.c index 4117cfc4c..fab8cd37e 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1684,7 +1684,7 @@ static void P_CheckBustableBlocks(player_t *player) player->mo->y += player->mo->momy; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_tnext) { if (!node->m_sector) break; @@ -1801,7 +1801,7 @@ static void P_CheckBouncySectors(player_t *player) player->mo->z += player->mo->momz; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_tnext) { if (!node->m_sector) break; From 17e0adcbacc98f6b71b5d7e9a8ebc7d67ec251b2 Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Thu, 9 Jun 2016 14:16:02 +0100 Subject: [PATCH 2/3] Renamed some struct variables so the problem this branch sets out to fix is more obvious at a glance. * m_snext ==> m_thinglist_next * m_sprev ==> m_thinglist_prev * m_tnext ==> m_sectorlist_next * m_tprev ==> m_sectorlist_prev --- src/p_floor.c | 10 +++--- src/p_map.c | 96 +++++++++++++++++++++++++-------------------------- src/p_mobj.c | 14 ++++---- src/p_spec.c | 24 ++++++------- src/p_user.c | 8 ++--- src/r_defs.h | 20 +++++------ 6 files changed, 86 insertions(+), 86 deletions(-) diff --git a/src/p_floor.c b/src/p_floor.c index 1c396c877..911213014 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1163,7 +1163,7 @@ void T_SpikeSector(levelspecthink_t *spikes) node = spikes->sector->touching_thinglist; // things touching this sector - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { thing = node->m_thing; if (!thing->player) @@ -1316,7 +1316,7 @@ void T_BridgeThinker(levelspecthink_t *bridge) controlsec = §ors[k]; // Is a player standing on me? - for (node = sector->touching_thinglist; node; node = node->m_snext) + for (node = sector->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -1739,7 +1739,7 @@ wegotit: static mobj_t *SearchMarioNode(msecnode_t *node) { mobj_t *thing = NULL; - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { // Things which should NEVER be ejected from a MarioBlock, by type. switch (node->m_thing->type) @@ -2003,7 +2003,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) goto foundenemy; } - node = node->m_snext; + node = node->m_thinglist_next; } } } @@ -2288,7 +2288,7 @@ void T_RaiseSector(levelspecthink_t *raise) sector = §ors[i]; // Is a player standing on me? - for (node = sector->touching_thinglist; node; node = node->m_snext) + for (node = sector->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; diff --git a/src/p_map.c b/src/p_map.c index 71adf2e16..44df30018 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3365,7 +3365,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) for (i = 0; i < sector->numattached; i++) { sec = §ors[sector->attached[i]]; - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; sec->moved = true; @@ -3377,7 +3377,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) do { - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) if (!n->visited) { n->visited = true; @@ -3398,12 +3398,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) // Mark all things invalid sector->moved = true; - for (n = sector->touching_thinglist; n; n = n->m_snext) + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; do { - for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list if (!n->visited) // unprocessed thing found { n->visited = true; // mark thing as processed @@ -3427,7 +3427,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) for (i = 0; i < sector->numattached; i++) { sec = §ors[sector->attached[i]]; - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; sec->moved = true; @@ -3439,7 +3439,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) do { - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) if (!n->visited) { n->visited = true; @@ -3457,12 +3457,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) // Mark all things invalid sector->moved = true; - for (n = sector->touching_thinglist; n; n = n->m_snext) + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; do { - for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list if (!n->visited) // unprocessed thing found { n->visited = true; // mark thing as processed @@ -3502,7 +3502,7 @@ static msecnode_t *P_GetSecnode(void) if (headsecnode) { node = headsecnode; - headsecnode = headsecnode->m_snext; + headsecnode = headsecnode->m_thinglist_next; } else node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL); @@ -3516,7 +3516,7 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void) if (headprecipsecnode) { node = headprecipsecnode; - headprecipsecnode = headprecipsecnode->m_snext; + headprecipsecnode = headprecipsecnode->m_thinglist_next; } else node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL); @@ -3527,14 +3527,14 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void) static inline void P_PutSecnode(msecnode_t *node) { - node->m_snext = headsecnode; + node->m_thinglist_next = headsecnode; headsecnode = node; } // Tails 08-25-2002 static inline void P_PutPrecipSecnode(mprecipsecnode_t *node) { - node->m_snext = headprecipsecnode; + node->m_thinglist_next = headprecipsecnode; headprecipsecnode = node; } @@ -3555,7 +3555,7 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode node->m_thing = thing; // Yes. Setting m_thing says 'keep it'. return nextnode; } - node = node->m_tnext; + node = node->m_sectorlist_next; } // Couldn't find an existing node for this sector. Add one at the head @@ -3568,17 +3568,17 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode node->m_sector = s; // sector node->m_thing = thing; // mobj - node->m_tprev = NULL; // prev node on Thing thread - node->m_tnext = nextnode; // next node on Thing thread + node->m_sectorlist_prev = NULL; // prev node on Thing thread + node->m_sectorlist_next = nextnode; // next node on Thing thread if (nextnode) - nextnode->m_tprev = node; // set back link on Thing + nextnode->m_sectorlist_prev = node; // set back link on Thing // Add new node at head of sector thread starting at s->touching_thinglist - node->m_sprev = NULL; // prev node on sector thread - node->m_snext = s->touching_thinglist; // next node on sector thread + node->m_thinglist_prev = NULL; // prev node on sector thread + node->m_thinglist_next = s->touching_thinglist; // next node on sector thread if (s->touching_thinglist) - node->m_snext->m_sprev = node; + node->m_thinglist_next->m_thinglist_prev = node; s->touching_thinglist = node; return node; } @@ -3596,7 +3596,7 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp node->m_thing = thing; // Yes. Setting m_thing says 'keep it'. return nextnode; } - node = node->m_tnext; + node = node->m_sectorlist_next; } // Couldn't find an existing node for this sector. Add one at the head @@ -3609,17 +3609,17 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp node->m_sector = s; // sector node->m_thing = thing; // mobj - node->m_tprev = NULL; // prev node on Thing thread - node->m_tnext = nextnode; // next node on Thing thread + node->m_sectorlist_prev = NULL; // prev node on Thing thread + node->m_sectorlist_next = nextnode; // next node on Thing thread if (nextnode) - nextnode->m_tprev = node; // set back link on Thing + nextnode->m_sectorlist_prev = node; // set back link on Thing // Add new node at head of sector thread starting at s->touching_thinglist - node->m_sprev = NULL; // prev node on sector thread - node->m_snext = s->touching_preciplist; // next node on sector thread + node->m_thinglist_prev = NULL; // prev node on sector thread + node->m_thinglist_next = s->touching_preciplist; // next node on sector thread if (s->touching_preciplist) - node->m_snext->m_sprev = node; + node->m_thinglist_next->m_thinglist_prev = node; s->touching_preciplist = node; return node; } @@ -3641,24 +3641,24 @@ static msecnode_t *P_DelSecnode(msecnode_t *node) // Unlink from the Thing thread. The Thing thread begins at // sector_list and not from mobj_t->touching_sectorlist. - tp = node->m_tprev; - tn = node->m_tnext; + tp = node->m_sectorlist_prev; + tn = node->m_sectorlist_next; if (tp) - tp->m_tnext = tn; + tp->m_sectorlist_next = tn; if (tn) - tn->m_tprev = tp; + tn->m_sectorlist_prev = tp; // Unlink from the sector thread. This thread begins at // sector_t->touching_thinglist. - sp = node->m_sprev; - sn = node->m_snext; + sp = node->m_thinglist_prev; + sn = node->m_thinglist_next; if (sp) - sp->m_snext = sn; + sp->m_thinglist_next = sn; else node->m_sector->touching_thinglist = sn; if (sn) - sn->m_sprev = sp; + sn->m_thinglist_prev = sp; // Return this node to the freelist @@ -3680,24 +3680,24 @@ static mprecipsecnode_t *P_DelPrecipSecnode(mprecipsecnode_t *node) // Unlink from the Thing thread. The Thing thread begins at // sector_list and not from mobj_t->touching_sectorlist. - tp = node->m_tprev; - tn = node->m_tnext; + tp = node->m_sectorlist_prev; + tn = node->m_sectorlist_next; if (tp) - tp->m_tnext = tn; + tp->m_sectorlist_next = tn; if (tn) - tn->m_tprev = tp; + tn->m_sectorlist_prev = tp; // Unlink from the sector thread. This thread begins at // sector_t->touching_thinglist. - sp = node->m_sprev; - sn = node->m_snext; + sp = node->m_thinglist_prev; + sn = node->m_thinglist_next; if (sp) - sp->m_snext = sn; + sp->m_thinglist_next = sn; else node->m_sector->touching_preciplist = sn; if (sn) - sn->m_sprev = sp; + sn->m_thinglist_prev = sp; // Return this node to the freelist @@ -3812,7 +3812,7 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y) while (node) { node->m_thing = NULL; - node = node->m_tnext; + node = node->m_sectorlist_next; } P_SetTarget(&tmthing, thing); @@ -3850,11 +3850,11 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y) if (!node->m_thing) { if (node == sector_list) - sector_list = node->m_tnext; + sector_list = node->m_sectorlist_next; node = P_DelSecnode(node); } else - node = node->m_tnext; + node = node->m_sectorlist_next; } /* cph - @@ -3895,7 +3895,7 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y) while (node) { node->m_thing = NULL; - node = node->m_tnext; + node = node->m_sectorlist_next; } tmprecipthing = thing; @@ -3929,11 +3929,11 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y) if (!node->m_thing) { if (node == precipsector_list) - precipsector_list = node->m_tnext; + precipsector_list = node->m_sectorlist_next; node = P_DelPrecipSecnode(node); } else - node = node->m_tnext; + node = node->m_sectorlist_next; } /* cph - diff --git a/src/p_mobj.c b/src/p_mobj.c index 759fa0d8c..0141c47d3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1530,7 +1530,7 @@ static void P_PushableCheckBustables(mobj_t *mo) mo->y += mo->momy; P_SetThingPosition(mo); - for (node = mo->touching_sectorlist; node; node = node->m_tnext) + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break; @@ -2703,7 +2703,7 @@ static void P_PlayerZMovement(mobj_t *mo) msecnode_t *node; boolean stopmovecut = false; - for (node = mo->touching_sectorlist; node; node = node->m_snext) + for (node = mo->touching_sectorlist; node; node = node->m_thinglist_next) { sector_t *sec = node->m_sector; subsector_t *newsubsec; @@ -2880,7 +2880,7 @@ nightsdone: if (CheckForMarioBlocks && !(netgame && mo->player->spectator)) // Only let the player punch { // Search the touching sectors, from side-to-side... - for (node = mo->touching_sectorlist; node; node = node->m_tnext) + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { ffloor_t *rover; if (!node->m_sector->ffloors) @@ -3648,7 +3648,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) if (!(netgame && mobj->player->spectator)) { // Crumbling platforms - for (node = mobj->touching_sectorlist; node; node = node->m_snext) + for (node = mobj->touching_sectorlist; node; node = node->m_thinglist_next) { fixed_t topheight, bottomheight; ffloor_t *rover; @@ -3673,7 +3673,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) { boolean thereiswater = false; - for (node = mobj->touching_sectorlist; node; node = node->m_snext) + for (node = mobj->touching_sectorlist; node; node = node->m_thinglist_next) { if (node->m_sector->ffloors) { @@ -3694,7 +3694,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) } if (thereiswater) { - for (node = mobj->touching_sectorlist; node; node = node->m_snext) + for (node = mobj->touching_sectorlist; node; node = node->m_thinglist_next) { if (node->m_sector->ffloors) { @@ -3807,7 +3807,7 @@ void P_RecalcPrecipInSector(sector_t *sector) sector->moved = true; // Recalc lighting and things too, maybe - for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_snext) + for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_thinglist_next) CalculatePrecipFloor(psecnode->m_thing); } diff --git a/src/p_spec.c b/src/p_spec.c index 9e4c3f079..25e32e578 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1642,7 +1642,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller mo = node->m_thing; if (mo->flags & MF_PUSHABLE) numpush++; - node = node->m_snext; + node = node->m_thinglist_next; } if (triggerline->flags & ML_NOCLIMB) // Need at least or more @@ -3144,7 +3144,7 @@ void P_SetupSignExit(player_t *player) thinker_t *think; INT32 numfound = 0; - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { thing = node->m_thing; if (thing->type != MT_SIGN) @@ -3308,7 +3308,7 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n return rover->master->frontsector; } - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) { if (GETSECSPECIAL(node->m_sector->special, section) == number) { @@ -4657,7 +4657,7 @@ void P_PlayerInSpecialSector(player_t *player) P_RunSpecialSectorCheck(player, sector); // Iterate through touching_sectorlist - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) { sector = node->m_sector; @@ -5308,7 +5308,7 @@ void T_LaserFlash(laserthink_t *flash) S_StartSound(§or->soundorg, sfx_laser); // Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough* - for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_snext) + for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6579,7 +6579,7 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; - for (node = psec->touching_thinglist; node; node = node->m_snext) + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6601,7 +6601,7 @@ void T_Scroll(scroll_t *s) if (!is3dblock) { - for (node = sec->touching_thinglist; node; node = node->m_snext) + for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6642,7 +6642,7 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; - for (node = psec->touching_thinglist; node; node = node->m_snext) + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6664,7 +6664,7 @@ void T_Scroll(scroll_t *s) if (!is3dblock) { - for (node = sec->touching_thinglist; node; node = node->m_snext) + for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -7014,7 +7014,7 @@ void T_Friction(friction_t *f) { if (thing->floorz != P_GetSpecialTopZ(thing, referrer, sec)) { - node = node->m_snext; + node = node->m_thinglist_next; continue; } @@ -7032,7 +7032,7 @@ void T_Friction(friction_t *f) thing->movefactor = f->movefactor; } } - node = node->m_snext; + node = node->m_thinglist_next; } } @@ -7372,7 +7372,7 @@ void T_Pusher(pusher_t *p) // constant pushers p_wind and p_current node = sec->touching_thinglist; // things touching this sector - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { thing = node->m_thing; if (thing->flags & (MF_NOGRAVITY | MF_NOCLIP) diff --git a/src/p_user.c b/src/p_user.c index fab8cd37e..2156f0fc0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1684,7 +1684,7 @@ static void P_CheckBustableBlocks(player_t *player) player->mo->y += player->mo->momy; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_tnext) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break; @@ -1801,7 +1801,7 @@ static void P_CheckBouncySectors(player_t *player) player->mo->z += player->mo->momz; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_tnext) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break; @@ -2855,7 +2855,7 @@ static void P_DoTeeter(player_t *player) boolean checkedforteeter = false; const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter. - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) { // Ledge teetering. Check if any nearby sectors are low enough from your current one. checkedforteeter = true; @@ -7037,7 +7037,7 @@ static void P_MovePlayer(player_t *player) player->mo->y += player->mo->momy; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) { if (!node->m_sector) break; diff --git a/src/r_defs.h b/src/r_defs.h index 848708164..2c5860ee7 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -500,10 +500,10 @@ typedef struct subsector_s // Sector list node showing all sectors an object appears in. // // There are two threads that flow through these nodes. The first thread -// starts at touching_thinglist in a sector_t and flows through the m_snext +// starts at touching_thinglist in a sector_t and flows through the m_thinglist_next // links to find all mobjs that are entirely or partially in the sector. // The second thread starts at touching_sectorlist in an mobj_t and flows -// through the m_tnext links to find all sectors a thing touches. This is +// through the m_sectorlist_next links to find all sectors a thing touches. This is // useful when applying friction or push effects to sectors. These effects // can be done as thinkers that act upon all objects touching their sectors. // As an mobj moves through the world, these nodes are created and @@ -515,10 +515,10 @@ typedef struct msecnode_s { sector_t *m_sector; // a sector containing this object struct mobj_s *m_thing; // this object - struct msecnode_s *m_tprev; // prev msecnode_t for this thing - struct msecnode_s *m_tnext; // next msecnode_t for this thing - struct msecnode_s *m_sprev; // prev msecnode_t for this sector - struct msecnode_s *m_snext; // next msecnode_t for this sector + struct msecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing + struct msecnode_s *m_sectorlist_next; // next msecnode_t for this thing + struct msecnode_s *m_thinglist_prev; // prev msecnode_t for this sector + struct msecnode_s *m_thinglist_next; // next msecnode_t for this sector boolean visited; // used in search algorithms } msecnode_t; @@ -526,10 +526,10 @@ typedef struct mprecipsecnode_s { sector_t *m_sector; // a sector containing this object struct precipmobj_s *m_thing; // this object - struct mprecipsecnode_s *m_tprev; // prev msecnode_t for this thing - struct mprecipsecnode_s *m_tnext; // next msecnode_t for this thing - struct mprecipsecnode_s *m_sprev; // prev msecnode_t for this sector - struct mprecipsecnode_s *m_snext; // next msecnode_t for this sector + struct mprecipsecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing + struct mprecipsecnode_s *m_sectorlist_next; // next msecnode_t for this thing + struct mprecipsecnode_s *m_thinglist_prev; // prev msecnode_t for this sector + struct mprecipsecnode_s *m_thinglist_next; // next msecnode_t for this sector boolean visited; // used in search algorithms } mprecipsecnode_t; From 7af14c20ed0b38531e86ee86e1f4e0f143ae5f12 Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Thu, 9 Jun 2016 14:56:24 +0100 Subject: [PATCH 3/3] Everywhere in the code that was doing things wrong has been changed. Two interesting points of note: * The touchspecial sector flag seems to actually do its job now. * Detection of sectors with polyobjects in seems to have done this incorrectly, but this doesn't mess with anything about touching the polies themselves so it seems to really only handle edge cases where the polyobject was too close to the border of another sector (which would've likely made rendering glitches anyways). * There was a whole swathe of teetering code that was basically never run properly because of this mistake. I did a simple fix at first, but you started teetering whenever you were slightly less than your radius away from a sector's edge, which was completely different and undesirable behaviour. Instead, I cut out the code that was never running, and just left the hacky method in instead since it was more accurate to what we want in general. --- src/p_mobj.c | 8 +++--- src/p_spec.c | 4 +-- src/p_user.c | 80 ++-------------------------------------------------- 3 files changed, 8 insertions(+), 84 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 0141c47d3..d65ecee3a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2703,7 +2703,7 @@ static void P_PlayerZMovement(mobj_t *mo) msecnode_t *node; boolean stopmovecut = false; - for (node = mo->touching_sectorlist; node; node = node->m_thinglist_next) + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { sector_t *sec = node->m_sector; subsector_t *newsubsec; @@ -3648,7 +3648,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) if (!(netgame && mobj->player->spectator)) { // Crumbling platforms - for (node = mobj->touching_sectorlist; node; node = node->m_thinglist_next) + for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next) { fixed_t topheight, bottomheight; ffloor_t *rover; @@ -3673,7 +3673,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) { boolean thereiswater = false; - for (node = mobj->touching_sectorlist; node; node = node->m_thinglist_next) + for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next) { if (node->m_sector->ffloors) { @@ -3694,7 +3694,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) } if (thereiswater) { - for (node = mobj->touching_sectorlist; node; node = node->m_thinglist_next) + for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next) { if (node->m_sector->ffloors) { diff --git a/src/p_spec.c b/src/p_spec.c index 25e32e578..0bd530279 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3308,7 +3308,7 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n return rover->master->frontsector; } - for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (GETSECSPECIAL(node->m_sector->special, section) == number) { @@ -4657,7 +4657,7 @@ void P_PlayerInSpecialSector(player_t *player) P_RunSpecialSectorCheck(player, sector); // Iterate through touching_sectorlist - for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { sector = node->m_sector; diff --git a/src/p_user.c b/src/p_user.c index 2156f0fc0..c9ac9f541 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2849,86 +2849,10 @@ static boolean PIT_CheckSolidsTeeter(mobj_t *thing) // static void P_DoTeeter(player_t *player) { - msecnode_t *node; boolean teeter = false; boolean roverfloor; // solid 3d floors? - boolean checkedforteeter = false; const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter. - for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) - { - // Ledge teetering. Check if any nearby sectors are low enough from your current one. - checkedforteeter = true; - roverfloor = false; - if (node->m_sector->ffloors) - { - ffloor_t *rover; - for (rover = node->m_sector->ffloors; rover; rover = rover->next) - { - if (!(rover->flags & FF_EXISTS)) continue; - - if (P_CheckSolidLava(player->mo, rover)) - ; - else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND)) - continue; // intangible 3d floor - - if (player->mo->eflags & MFE_VERTICALFLIP) - { - if (*rover->bottomheight > node->m_sector->ceilingheight) // Above the ceiling - continue; - - if (*rover->bottomheight > player->mo->z + player->mo->height + tiptop - || (*rover->topheight < player->mo->z - && player->mo->z + player->mo->height < node->m_sector->ceilingheight - tiptop)) - { - teeter = true; - roverfloor = true; - } - else - { - teeter = false; - roverfloor = true; - break; - } - } - else - { - if (*rover->topheight < node->m_sector->floorheight) // Below the floor - continue; - - if (*rover->topheight < player->mo->z - tiptop - || (*rover->bottomheight > player->mo->z + player->mo->height - && player->mo->z > node->m_sector->floorheight + tiptop)) - { - teeter = true; - roverfloor = true; - } - else - { - teeter = false; - roverfloor = true; - break; - } - } - } - } - - if (!teeter && !roverfloor) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - { - if (node->m_sector->ceilingheight > player->mo->z + player->mo->height + tiptop) - teeter = true; - } - else - { - if (node->m_sector->floorheight < player->mo->z - tiptop) - teeter = true; - } - } - } - - if (checkedforteeter && !teeter) // Backup code { subsector_t *subsec[4]; // changed abcd into array instead UINT8 i; @@ -3147,7 +3071,7 @@ teeterdone: if ((player->mo->state == &states[S_PLAY_STND] || player->mo->state == &states[S_PLAY_TAP1] || player->mo->state == &states[S_PLAY_TAP2] || player->mo->state == &states[S_PLAY_SUPERSTAND])) P_SetPlayerMobjState(player->mo, S_PLAY_TEETER1); } - else if (checkedforteeter && (player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER])) + else if ((player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER])) P_SetPlayerMobjState(player->mo, S_PLAY_STND); } @@ -7037,7 +6961,7 @@ static void P_MovePlayer(player_t *player) player->mo->y += player->mo->momy; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_thinglist_next) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break;