mirror of
https://github.com/ZDoom/Raze.git
synced 2025-04-22 07:50:54 +00:00
implement better ways to get the player index.
This commit is contained in:
parent
b8720c3329
commit
2a773e2028
15 changed files with 41 additions and 78 deletions
|
@ -4083,7 +4083,7 @@ void actProcessSprites(void)
|
|||
DBloodActor* actSpawnSprite(sectortype* pSector, const DVector3& pos, int nStat, bool setextra, PClass* cls, int type)
|
||||
{
|
||||
DBloodActor* actor = InsertSprite(pSector, nStat, cls);
|
||||
actor->spr.lotag = type; // we still need this.
|
||||
if (type >= 0) actor->spr.lotag = type; // we may still need this.
|
||||
|
||||
SetActor(actor, pos);
|
||||
if (setextra && !actor->hasX())
|
||||
|
|
|
@ -124,7 +124,7 @@ void actAirDrag(DBloodActor *pSprite, fixed_t drag);
|
|||
void actExplodeSprite(DBloodActor *pSprite);
|
||||
void actActivateGibObject(DBloodActor *actor);
|
||||
void actProcessSprites(void);
|
||||
DBloodActor* actSpawnSprite(sectortype* pSector, const DVector3& pos, int nStat, bool setextra, PClass* cls = nullptr, int type = 0);
|
||||
DBloodActor* actSpawnSprite(sectortype* pSector, const DVector3& pos, int nStat, bool setextra, PClass* cls = nullptr, int type = -1);
|
||||
DBloodActor* actSpawnDude(DBloodActor* pSource, int nType, double dist);
|
||||
DBloodActor * actSpawnSprite(DBloodActor *pSource, int nStat, PClass* cls = nullptr, int type = 0);
|
||||
DBloodActor* actSpawnThing(sectortype* pSector, const DVector3& pos, int nThingType);
|
||||
|
|
|
@ -131,12 +131,11 @@ static bool isImmune(DBloodActor* actor, int dmgType, int minScale)
|
|||
|
||||
if (dmgType >= kDmgFall && dmgType < kDmgMax && actor->hasX() && actor->xspr.locked != 1)
|
||||
{
|
||||
int type = actor->GetType();
|
||||
if (type >= kThingBase && type < kThingMax)
|
||||
if (actor->IsThingActor())
|
||||
return (actor->dmgControl[dmgType] <= minScale);
|
||||
else if (actor->IsDudeActor())
|
||||
{
|
||||
if (actor->IsPlayerActor()) return (getPlayer(type - kDudePlayer1)->godMode || getPlayer(type - kDudePlayer1)->damageControl[dmgType] <= minScale);
|
||||
if (actor->IsPlayerActor()) return (getPlayer(actor)->godMode || getPlayer(actor)->damageControl[dmgType] <= minScale);
|
||||
else return (actor->dmgControl[dmgType] <= minScale);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -460,7 +460,7 @@ static void unicultThinkChase(DBloodActor* actor)
|
|||
if (target->xspr.health <= 0) // target is dead
|
||||
{
|
||||
DBloodPlayer* pPlayer = NULL;
|
||||
if ((!target->IsPlayerActor()) || ((pPlayer = getPlayerById(target->GetType())) != NULL && pPlayer->fragger == actor))
|
||||
if ((!target->IsPlayerActor()) || ((pPlayer = safeGetPlayer(target)) != NULL && pPlayer->fragger == actor))
|
||||
{
|
||||
playGenDudeSound(actor, kGenDudeSndTargetDead);
|
||||
if (spriteIsUnderwater(actor, false)) aiGenDudeNewState(actor, &genDudeSearchShortW);
|
||||
|
|
|
@ -768,7 +768,12 @@ enum
|
|||
|
||||
inline DBloodPlayer* getPlayer(DBloodActor* actor)
|
||||
{
|
||||
return getPlayer(actor->GetType() - kDudePlayer1);
|
||||
return getPlayer(actor->spr.xint);
|
||||
}
|
||||
|
||||
inline DBloodPlayer* safeGetPlayer(DBloodActor* actor)
|
||||
{
|
||||
return actor->IsPlayerActor()? getPlayer(actor) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -285,14 +285,6 @@ enum {
|
|||
kDudeCerberusOneHead = 228,
|
||||
kDudeTchernobog = 229,
|
||||
kDudeCultistTommyProne = 230,
|
||||
kDudePlayer1 = 231,
|
||||
kDudePlayer2 = 232,
|
||||
kDudePlayer3 = 233,
|
||||
kDudePlayer4 = 234,
|
||||
kDudePlayer5 = 235,
|
||||
kDudePlayer6 = 236,
|
||||
kDudePlayer7 = 237,
|
||||
kDudePlayer8 = 238,
|
||||
kDudeBurningInnocent = 239,
|
||||
kDudeBurningCultist = 240,
|
||||
kDudeBurningZombieAxe = 241,
|
||||
|
|
|
@ -91,5 +91,6 @@ struct DUDEINFO {
|
|||
extern DUDEINFO gPlayerTemplate[4];
|
||||
|
||||
DBloodPlayer* getPlayer(DBloodActor* actor);
|
||||
DBloodPlayer* safeGetPlayer(DBloodActor* actor);
|
||||
|
||||
END_BLD_NS
|
||||
|
|
|
@ -70,7 +70,7 @@ void AddKill(DBloodActor* killer, DBloodActor* killed)
|
|||
{
|
||||
if (AllowedKillType(killed))
|
||||
{
|
||||
int playernum = killer->IsPlayerActor() ? killer->GetType() - kDudePlayer1 : -1;
|
||||
int playernum = killer->IsPlayerActor() ? getPlayer(killer)->pnum : -1;
|
||||
Level.addKill(playernum, 1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2877,7 +2877,7 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe
|
|||
if (iactor->spr.statnum != kStatDude || !iactor->IsDudeActor() || !iactor->hasX())
|
||||
continue;
|
||||
|
||||
auto pPlayer = getPlayerById(iactor->GetType());
|
||||
auto pPlayer = safeGetPlayer(iactor);
|
||||
if (pXSector->Underwater)
|
||||
{
|
||||
if (aLower)
|
||||
|
@ -3124,7 +3124,7 @@ void useVelocityChanger(DBloodActor* actor, sectortype* sect, DBloodActor* initi
|
|||
|
||||
void useTeleportTarget(DBloodActor* sourceactor, DBloodActor* actor)
|
||||
{
|
||||
auto pPlayer = getPlayerById(actor->GetType());
|
||||
auto pPlayer = safeGetPlayer(actor);
|
||||
XSECTOR* pXSector = (sourceactor->sector()->hasX()) ? &sourceactor->sector()->xs() : nullptr;
|
||||
bool isDude = (!pPlayer && actor->IsDudeActor());
|
||||
|
||||
|
@ -3545,7 +3545,7 @@ void damageSprites(DBloodActor* sourceactor, DBloodActor* actor)
|
|||
|
||||
int health = 0;
|
||||
|
||||
auto pPlayer = getPlayerById(actor->GetType());
|
||||
auto pPlayer = safeGetPlayer(actor);
|
||||
int dmgType = (sourceactor->xspr.data2 >= kDmgFall) ? ClipHigh(sourceactor->xspr.data2, kDmgElectric) : -1;
|
||||
int dmg = actor->xspr.health << 4;
|
||||
int armor[3];
|
||||
|
@ -4612,7 +4612,7 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH)
|
|||
}
|
||||
|
||||
double range = arg3 * 2;
|
||||
if ((pPlayer = getPlayerById(objActor->GetType())) != NULL)
|
||||
if ((pPlayer = safeGetPlayer(objActor)) != NULL)
|
||||
var = HitScan(objActor, pPlayer->zWeapon, pPlayer->aim, arg1, range);
|
||||
else if (objActor->IsDudeActor())
|
||||
var = HitScan(objActor, objActor->spr.pos.Z, DVector3(objActor->spr.Angles.Yaw.ToVector(), (!objActor->hasX()) ? 0 : objActor->dudeSlope), arg1, range);
|
||||
|
@ -5971,13 +5971,12 @@ bool modernTypeOperateSprite(DBloodActor* actor, EVENT& event)
|
|||
int cmd = (event.cmd >= kCmdNumberic) ? event.cmd : actor->xspr.command;
|
||||
|
||||
|
||||
int playerID;
|
||||
if ((actor->xspr.txID == kChannelEventCauser || actor->xspr.data1 == 0) && initiator && initiator->IsPlayerActor())
|
||||
playerID = initiator->GetType();
|
||||
pPlayer = getPlayer(initiator);
|
||||
else
|
||||
playerID = actor->xspr.data1;
|
||||
pPlayer = getPlayerById(actor->xspr.data1);
|
||||
|
||||
if ((pPlayer = getPlayerById(playerID)) == NULL
|
||||
if (pPlayer == NULL
|
||||
|| ((cmd < 67 || cmd > 68) && !modernTypeSetSpriteState(actor, actor->xspr.state ^ 1, initiator)))
|
||||
return true;
|
||||
|
||||
|
@ -7365,6 +7364,7 @@ void playerQavSceneReset(DBloodPlayer* pPlayer)
|
|||
|
||||
DBloodPlayer* getPlayerById(int id)
|
||||
{
|
||||
const int kPlayerType1 = 231;
|
||||
// relative to connected players
|
||||
if (id >= 1 && id <= kMaxPlayers)
|
||||
{
|
||||
|
@ -7375,9 +7375,9 @@ DBloodPlayer* getPlayerById(int id)
|
|||
return getPlayer(i);
|
||||
}
|
||||
|
||||
// absolute sprite type
|
||||
}
|
||||
else if (id >= kDudePlayer1 && id <= kDudePlayer8)
|
||||
// absolute sprite type (kinda smelly)
|
||||
else if (id >= kPlayerType1 && id < kPlayerType1 + kMaxPlayers)
|
||||
{
|
||||
for (int i = connecthead; i >= 0; i = connectpoint2[i])
|
||||
{
|
||||
|
@ -9148,7 +9148,7 @@ void changeSpriteAngle(DBloodActor* pSpr, DAngle nAng)
|
|||
pSpr->spr.Angles.Yaw = nAng;
|
||||
else
|
||||
{
|
||||
auto pPlayer = getPlayerById(pSpr->GetType());
|
||||
auto pPlayer = safeGetPlayer(pSpr);
|
||||
if (pPlayer)
|
||||
pPlayer->GetActor()->spr.Angles.Yaw = nAng;
|
||||
else
|
||||
|
|
|
@ -836,11 +836,11 @@ void playerStart(int nPlayer, int bNewLevel)
|
|||
pStartZone = &gStartZone[Random(8)];
|
||||
}
|
||||
|
||||
auto cls = GetSpawnType(kDudePlayer1 + nPlayer);
|
||||
auto actor = actSpawnSprite(pStartZone->sector, pStartZone->pos, kStatDude, 1, cls, kDudePlayer1 + nPlayer);
|
||||
auto actor = actSpawnSprite(pStartZone->sector, pStartZone->pos, kStatDude, 1, BloodPlayerBaseClass);
|
||||
assert(actor->hasX());
|
||||
pPlayer->actor = actor;
|
||||
pPlayer->Angles.initialize(actor);
|
||||
actor->spr.xint = nPlayer; // store the index directly so we do not have to rely on the type anymore.
|
||||
|
||||
DUDEINFO* pDudeInfo = &gPlayerTemplate[0];
|
||||
pPlayer->pDudeInfo = pDudeInfo;
|
||||
|
@ -1935,9 +1935,9 @@ void playerFrag(DBloodPlayer* pKiller, DBloodPlayer* pVictim)
|
|||
assert(pVictim != NULL);
|
||||
|
||||
char buffer[128] = "";
|
||||
int nKiller = pKiller->GetActor()->GetType() - kDudePlayer1;
|
||||
int nKiller = pKiller->pnum;
|
||||
assert(nKiller >= 0 && nKiller < kMaxPlayers);
|
||||
int nVictim = pVictim->GetActor()->GetType() - kDudePlayer1;
|
||||
int nVictim = pVictim->pnum;
|
||||
assert(nVictim >= 0 && nVictim < kMaxPlayers);
|
||||
if (nKiller == nVictim)
|
||||
{
|
||||
|
|
|
@ -352,10 +352,8 @@ void fakePlayerProcess(DBloodPlayer* pPlayer, InputPacket* pInput)
|
|||
static void fakeMoveDude(DBloodActor* actor)
|
||||
{
|
||||
#if 0 // not needed for single player, temporarily disabled due to icompatibilities with the refactored API.
|
||||
PLAYER* pPlayer = NULL;
|
||||
int bottom, top;
|
||||
if (IsPlayerSprite(pSprite))
|
||||
pPlayer = &gPlayer[pSprite->type - kDudePlayer1];
|
||||
DBloodPlayer* pPlayer = safeGetPlayer(pSprite);
|
||||
GetSpriteExtents(pSprite, &top, &bottom);
|
||||
top += predict.z - pSprite->z;
|
||||
bottom += predict.z - pSprite->z;
|
||||
|
|
|
@ -111,7 +111,7 @@ void viewDrawAimedPlayerName(DBloodPlayer* pPlayer)
|
|||
auto actor = gHitInfo.actor();
|
||||
if (actor && actor->IsPlayerActor())
|
||||
{
|
||||
int nPlayer = actor->GetType() - kDudePlayer1;
|
||||
int nPlayer = getPlayer(actor)->pnum;
|
||||
const char* szName = PlayerName(nPlayer);
|
||||
int nPalette = (getPlayer(nPlayer)->teamId & 3) + 11;
|
||||
viewDrawText(DigiFont, szName, 160, 125, -128, nPalette, 1, 1);
|
||||
|
|
|
@ -1355,7 +1355,7 @@ void ThrowRemote(int, DBloodPlayer* pPlayer)
|
|||
auto spawned = playerFireThing(pPlayer, 0, -9460 / 65536., kThingArmedRemoteBomb, nSpeed);
|
||||
if (spawned)
|
||||
{
|
||||
spawned->xspr.rxID = 90 + (pPlayer->GetActor()->GetType() - kDudePlayer1);
|
||||
spawned->xspr.rxID = 90 + (pPlayer->pnum);
|
||||
UseAmmo(pPlayer, 11, 1);
|
||||
pPlayer->throwPower = 0;
|
||||
}
|
||||
|
@ -1372,14 +1372,14 @@ void DropRemote(int, DBloodPlayer* pPlayer)
|
|||
auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedRemoteBomb, 0);
|
||||
if (spawned)
|
||||
{
|
||||
spawned->xspr.rxID = 90 + (pPlayer->GetActor()->GetType() - kDudePlayer1);
|
||||
spawned->xspr.rxID = 90 + (pPlayer->pnum);
|
||||
UseAmmo(pPlayer, 11, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void FireRemote(int, DBloodPlayer* pPlayer)
|
||||
{
|
||||
evSendGame(90 + (pPlayer->GetActor()->GetType() - kDudePlayer1), kCmdOn);
|
||||
evSendGame(90 + (pPlayer->pnum), kCmdOn);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
|
@ -124,14 +124,14 @@ spawnclasses
|
|||
228 = BloodDudeCerberusOneHead
|
||||
229 = BloodDudeTchernobog
|
||||
230 = BloodDudeCultistTommyProne
|
||||
231 = BloodDudePlayer1
|
||||
232 = BloodDudePlayer2
|
||||
233 = BloodDudePlayer3
|
||||
234 = BloodDudePlayer4
|
||||
235 = BloodDudePlayer5
|
||||
236 = BloodDudePlayer6
|
||||
237 = BloodDudePlayer7
|
||||
238 = BloodDudePlayer8
|
||||
231 = BloodPlayerBase
|
||||
232 = BloodPlayerBase
|
||||
233 = BloodPlayerBase
|
||||
234 = BloodPlayerBase
|
||||
235 = BloodPlayerBase
|
||||
236 = BloodPlayerBase
|
||||
237 = BloodPlayerBase
|
||||
238 = BloodPlayerBase
|
||||
239 = BloodDudeBurningInnocent
|
||||
240 = BloodDudeBurningCultist
|
||||
241 = BloodDudeBurningZombieAxe
|
||||
|
|
|
@ -1240,38 +1240,6 @@ class BloodDudeCultistTommyProne : BloodDudeBase
|
|||
}
|
||||
}
|
||||
|
||||
class BloodDudePlayer1 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudePlayer2 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudePlayer3 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudePlayer4 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudePlayer5 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudePlayer6 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudePlayer7 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudePlayer8 : BloodPlayerBase
|
||||
{
|
||||
}
|
||||
|
||||
class BloodDudeBurningInnocent : BloodDudeBase
|
||||
{
|
||||
default
|
||||
|
|
Loading…
Reference in a new issue