From 14ea936f7478e1c5c6473d4e31f902fb5bba2378 Mon Sep 17 00:00:00 2001 From: RedEnchilada Date: Mon, 3 Aug 2015 18:06:42 -0500 Subject: [PATCH] Sync mobj->standingslope in netgames --- src/p_saveg.c | 13 ++++++++++++- src/p_slopes.c | 12 ++++++++++++ src/p_slopes.h | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index eec3dbf3e..621abcb48 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -30,6 +30,9 @@ #include "r_sky.h" #include "p_polyobj.h" #include "lua_script.h" +#ifdef ESLOPE +#include "p_slopes.h" +#endif savedata_t savedata; UINT8 *save_p; @@ -921,7 +924,8 @@ typedef enum MD2_EXTVAL1 = 1<<5, MD2_EXTVAL2 = 1<<6, MD2_HNEXT = 1<<7, - MD2_HPREV = 1<<8 + MD2_HPREV = 1<<8, + MD2_SLOPE = 1<<9 } mobj_diff2_t; typedef enum @@ -1109,6 +1113,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) diff2 |= MD2_HNEXT; if (mobj->hprev) diff2 |= MD2_HPREV; + if (mobj->standingslope) + diff2 |= MD2_SLOPE; if (diff2 != 0) diff |= MD_MORE; @@ -1221,6 +1227,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) WRITEUINT32(save_p, mobj->hnext->mobjnum); if (diff2 & MD2_HPREV) WRITEUINT32(save_p, mobj->hprev->mobjnum); + if (diff2 & MD2_SLOPE) + WRITEUINT16(save_p, mobj->standingslope->id); WRITEUINT32(save_p, mobj->mobjnum); } @@ -2068,6 +2076,9 @@ static void LoadMobjThinker(actionf_p1 thinker) mobj->hnext = (mobj_t *)(size_t)READUINT32(save_p); if (diff2 & MD2_HPREV) mobj->hprev = (mobj_t *)(size_t)READUINT32(save_p); + if (diff2 & MD2_SLOPE) + mobj->standingslope = P_SlopeById(READUINT16(save_p)); + if (diff & MD_REDFLAG) { diff --git a/src/p_slopes.c b/src/p_slopes.c index 77b0347d9..316a953b8 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -484,6 +484,18 @@ void P_CopySectorSlope(line_t *line) line->special = 0; // Linedef was use to set slopes, it finished its job, so now make it a normal linedef } +// +// P_SlopeById +// +// Looks in the slope list for a slope with a specified ID. Mostly useful for netgame sync +// +pslope_t *P_SlopeById(UINT16 id) +{ + pslope_t *ret; + for (ret = slopelist; ret && ret->id != id; ret = ret->next); + return ret; +} + #ifdef SPRINGCLEAN #include "byteptr.h" diff --git a/src/p_slopes.h b/src/p_slopes.h index 52988c18f..e92198675 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -63,6 +63,8 @@ typedef enum // void P_CopySectorSlope(line_t *line); +pslope_t *P_SlopeById(UINT16 id); + // Returns the height of the sloped plane at (x, y) as a fixed_t fixed_t P_GetZAt(pslope_t *slope, fixed_t x, fixed_t y);