This commit is contained in:
raa-eruanna 2016-09-24 23:36:51 -04:00
commit 1c25ad7ce4
6 changed files with 48 additions and 40 deletions

View file

@ -1207,29 +1207,23 @@ void G_FinishTravel ()
pnum = int(pawn->player - players); pnum = int(pawn->player - players);
pawn->ChangeStatNum (STAT_PLAYER); pawn->ChangeStatNum (STAT_PLAYER);
pawndup = pawn->player->mo; pawndup = pawn->player->mo;
start = NULL;
assert (pawn != pawndup); assert (pawn != pawndup);
if (pawndup == NULL)
{ // Oh no! there was no start for this player!
start = G_PickPlayerStart(pnum, PPS_FORCERANDOM);
if (start != NULL) pawndup = P_SpawnPlayer(start, pnum, (level.flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0);
if (pawndup == NULL)
{
pawn->flags |= MF_NOSECTOR | MF_NOBLOCKMAP;
pawn->Destroy();
continue;
}
}
start = G_PickPlayerStart(pnum, 0);
if (start == NULL) if (start == NULL)
{ {
start = G_PickPlayerStart(pnum, 0); if (pawndup != nullptr)
if (start == NULL)
{ {
Printf(TEXTCOLOR_RED "No player %d start to travel to!\n", pnum + 1); Printf(TEXTCOLOR_RED "No player %d start to travel to!\n", pnum + 1);
// Move to the coordinates this player had when they left the level. // Move to the coordinates this player had when they left the level.
pawn->SetXYZ(pawndup->Pos()); pawn->SetXYZ(pawndup->Pos());
} }
else
{
// Could not find a start for this player at all. This really should never happen but if it does, let's better abort.
DThinker::DestroyThinkersInList(STAT_TRAVELLING);
I_Error ("No player %d start to travel to!\n", pnum + 1);
}
} }
oldpawn = pawndup; oldpawn = pawndup;
@ -1266,8 +1260,11 @@ void G_FinishTravel ()
pawn->player->camera = pawn; pawn->player->camera = pawn;
pawn->player->viewheight = pawn->ViewHeight; pawn->player->viewheight = pawn->ViewHeight;
pawn->flags2 &= ~MF2_BLASTED; pawn->flags2 &= ~MF2_BLASTED;
DObject::StaticPointerSubstitution (oldpawn, pawn); if (oldpawn != nullptr)
oldpawn->Destroy(); {
DObject::StaticPointerSubstitution (oldpawn, pawn);
oldpawn->Destroy();
}
if (pawndup != NULL) if (pawndup != NULL)
{ {
pawndup->Destroy(); pawndup->Destroy();

View file

@ -46,6 +46,11 @@ inline short LittleShort(int x)
return OSSwapLittleToHostInt16((uint16_t)x); return OSSwapLittleToHostInt16((uint16_t)x);
} }
inline unsigned short LittleShort(unsigned int x)
{
return OSSwapLittleToHostInt16((uint16_t)x);
}
inline int LittleLong(int x) inline int LittleLong(int x)
{ {
return OSSwapLittleToHostInt32((uint32_t)x); return OSSwapLittleToHostInt32((uint32_t)x);
@ -56,6 +61,16 @@ inline unsigned int LittleLong(unsigned int x)
return OSSwapLittleToHostInt32(x); return OSSwapLittleToHostInt32(x);
} }
inline int LittleLong(long x)
{
return OSSwapLittleToHostInt32((uint32_t)x);
}
inline unsigned int LittleLong(unsigned long x)
{
return OSSwapLittleToHostInt32((uint32_t)x);
}
inline short BigShort(short x) inline short BigShort(short x)
{ {
return (short)OSSwapBigToHostInt16((uint16_t)x); return (short)OSSwapBigToHostInt16((uint16_t)x);

View file

@ -70,6 +70,7 @@
#include "p_spec.h" #include "p_spec.h"
#include "p_checkposition.h" #include "p_checkposition.h"
#include "serializer.h" #include "serializer.h"
#include "r_utility.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
@ -1040,11 +1041,11 @@ bool AActor::IsInsideVisibleAngles() const
if (players[consoleplayer].camera == nullptr) if (players[consoleplayer].camera == nullptr)
return true; return true;
DAngle anglestart = VisibleStartAngle.Normalized180(); DAngle anglestart = VisibleStartAngle;
DAngle angleend = VisibleEndAngle.Normalized180(); DAngle angleend = VisibleEndAngle;
DAngle pitchstart = VisibleStartPitch.Normalized180(); DAngle pitchstart = VisibleStartPitch;
DAngle pitchend = VisibleEndPitch.Normalized180(); DAngle pitchend = VisibleEndPitch;
if (anglestart > angleend) if (anglestart > angleend)
{ {
DAngle temp = anglestart; DAngle temp = anglestart;
@ -1052,28 +1053,26 @@ bool AActor::IsInsideVisibleAngles() const
angleend = temp; angleend = temp;
} }
if (pitchstart > angleend) if (pitchstart > pitchend)
{ {
DAngle temp = pitchstart; DAngle temp = pitchstart;
pitchstart = pitchend; pitchstart = pitchend;
pitchend = temp; pitchend = temp;
} }
player_t* pPlayer = players[consoleplayer].camera->player; AActor *mo = players[consoleplayer].camera;
if (pPlayer && pPlayer->mo) if (mo != nullptr)
{ {
AActor *mo = pPlayer->mo;
DVector3 diffang = Vec3To(mo); DVector3 diffang = ViewPos - Pos();
DAngle to = diffang.Angle(); DAngle to = diffang.Angle();
if (!(renderflags & RF_ABSMASKANGLE)) if (!(renderflags & RF_ABSMASKANGLE))
to = deltaangle(Angles.Yaw, to); to = deltaangle(Angles.Yaw, to);
// Note that this check is inversed due to only being able to vectorize if ((to >= anglestart && to <= angleend))
// from one way (this actor to the player). It still means to pass
// if the player is within the visible angles.
if ((to <= anglestart || to >= angleend))
{ {
to = diffang.Pitch(); to = diffang.Pitch();
if (!(renderflags & RF_ABSMASKPITCH)) if (!(renderflags & RF_ABSMASKPITCH))

View file

@ -539,7 +539,7 @@ void P_SerializeSounds(FSerializer &arc)
//========================================================================== //==========================================================================
void CopyPlayer(player_t *dst, player_t *src, const char *name); void CopyPlayer(player_t *dst, player_t *src, const char *name);
static void ReadOnePlayer(FSerializer &arc, bool skipload); static void ReadOnePlayer(FSerializer &arc);
static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload); static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload);
static void SpawnExtraPlayers(); static void SpawnExtraPlayers();
@ -596,7 +596,7 @@ void P_SerializePlayers(FSerializer &arc, bool skipload)
// first player present, no matter what their name. // first player present, no matter what their name.
if (numPlayers == 1) if (numPlayers == 1)
{ {
ReadOnePlayer(arc, skipload); ReadOnePlayer(arc);
} }
else else
{ {
@ -619,7 +619,7 @@ void P_SerializePlayers(FSerializer &arc, bool skipload)
// //
//========================================================================== //==========================================================================
static void ReadOnePlayer(FSerializer &arc, bool skipload) static void ReadOnePlayer(FSerializer &arc)
{ {
int i; int i;
const char *name = NULL; const char *name = NULL;
@ -638,10 +638,7 @@ static void ReadOnePlayer(FSerializer &arc, bool skipload)
didIt = true; didIt = true;
player_t playerTemp; player_t playerTemp;
playerTemp.Serialize(arc); playerTemp.Serialize(arc);
if (!skipload) CopyPlayer(&players[i], &playerTemp, name);
{
CopyPlayer(&players[i], &playerTemp, name);
}
} }
else else
{ {

View file

@ -1294,7 +1294,7 @@ FSerializer &SerializePointer(FSerializer &arc, const char *key, T *&value, T **
assert(base != nullptr); assert(base != nullptr);
if (arc.isReading() || !arc.w->inObject() || defval == nullptr || value != *defval) if (arc.isReading() || !arc.w->inObject() || defval == nullptr || value != *defval)
{ {
ptrdiff_t vv = value == nullptr ? -1 : value - base; int64_t vv = value == nullptr ? -1 : value - base;
Serialize(arc, key, vv, nullptr); Serialize(arc, key, vv, nullptr);
value = vv < 0 ? nullptr : base + vv; value = vv < 0 ? nullptr : base + vv;
} }

View file

@ -1437,7 +1437,7 @@ DEFINE_PROPERTY(spriterotation, F, Actor)
DEFINE_PROPERTY(visibleangles, Ff, Actor) DEFINE_PROPERTY(visibleangles, Ff, Actor)
{ {
PROP_DOUBLE_PARM(visstart, 0); PROP_DOUBLE_PARM(visstart, 0);
PROP_DOUBLE_PARM(visend, 0); PROP_DOUBLE_PARM(visend, 1);
defaults->VisibleStartAngle = visstart; defaults->VisibleStartAngle = visstart;
defaults->VisibleEndAngle = visend; defaults->VisibleEndAngle = visend;
} }
@ -1448,7 +1448,7 @@ DEFINE_PROPERTY(visibleangles, Ff, Actor)
DEFINE_PROPERTY(visiblepitch, Ff, Actor) DEFINE_PROPERTY(visiblepitch, Ff, Actor)
{ {
PROP_DOUBLE_PARM(visstart, 0); PROP_DOUBLE_PARM(visstart, 0);
PROP_DOUBLE_PARM(visend, 0); PROP_DOUBLE_PARM(visend, 1);
defaults->VisibleStartPitch = visstart; defaults->VisibleStartPitch = visstart;
defaults->VisibleEndPitch = visend; defaults->VisibleEndPitch = visend;
} }