- Fade blink reworked

- Onos charge reworked
- +attack2

git-svn-id: https://unknownworlds.svn.cloudforge.com/ns1@349 67975925-1194-0748-b3d5-c16f83f1a3a1
This commit is contained in:
tankefugl 2005-11-14 20:21:06 +00:00
parent 1d385ec5bf
commit 0f6252b2ca
20 changed files with 459 additions and 53 deletions

View file

@ -47,7 +47,7 @@
#define kCatalystDuration 8
#define kCatalystResearchCost 20
#define kCatalystResearchTime 40
#define kChargeDamage 320
#define kChargeDamage 20
#define kClawsDamage 90
#define kCombatBaseExperience 100
#define kCombatBaseRespawnTime 5
@ -345,13 +345,16 @@
#define kBite2ROF 0.64
#define kBiteEnergyCost 0.05
#define kBiteROF 0.80
#define kBlinkEnergyCost 0.04
#define kBlinkEnergyCost 0.20
#define kBlinkROF 0.05
#define kBlinkThresholdTime 1.00
#define kCarapaceSlowFactor 0.00
#define kCatalystDamagePercent 0.25
#define kCatalystROFFactor 0.25
#define kCatalystSpeedIncrease 0.25
#define kChargeEnergyCost 0.07
#define kChargeEnergyCost 0.15
#define kChargeThresholdTime 0.50
#define kChargeSpeed 1.00
#define kChargingEnergyScalar 2.80
#define kClawsEnergyCost 0.07
#define kClawsROF 0.90
@ -447,7 +450,7 @@
#define kStompTime 1.00
#define kSwipeEnergyCost 0.06
#define kSwipeROF 0.95
#define kTouchDamageInterval 0.05
#define kTouchDamageInterval 0.30
#define kTurretBaseRateOfFire 0.70
#define kTurretTrackingRate 1.60
#define kUmbraEnergyCost 0.30

View file

@ -31,6 +31,7 @@ public:
int m_iRes;
cvar_t *m_pCvarStealMouse;
cvar_t *m_pCvarDraw;
bool m_bConserveFOV;
int m_iFontHeight;
int DrawHudNumber(int x, int y, int iFlags, int iNumber, int r, int g, int b );

View file

@ -200,6 +200,8 @@ void CHud :: Init( void )
g_bDuckToggled = false;
// :tankefugl
m_bConserveFOV = false;
CVAR_CREATE( "zoom_sensitivity_ratio", "1.2", 0 );
default_fov = CVAR_CREATE( "default_fov", "90", 0 );
m_pCvarStealMouse = CVAR_CREATE( "hud_capturemouse", "1", FCVAR_ARCHIVE );

View file

@ -53,6 +53,7 @@ void CHud::Think(void)
}
newfov = HUD_GetFOV();
if (this->m_bConserveFOV == false)
if ( newfov == 0 )
{
m_iFOV = default_fov->value;

View file

@ -2713,10 +2713,13 @@ int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *h
}
if(theCanSeeCloaked)
{
if (!((ent->v.iuser3 == AVH_USER3_ALIEN_PLAYER4) && (ent->v.iuser4 & MASK_ALIEN_MOVEMENT)) || host == ent)
{
theBaseOpacity = kAlienSelfCloakingBaseOpacity;
theOpacityRange = 255 - theBaseOpacity;
}
}
int theOpacity = theBaseOpacity + theOpacityScalar*theOpacityRange;
theOpacity = max(min(255, theOpacity), 0);
@ -2798,11 +2801,14 @@ int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *h
}
if(( marineGlow || (ent->v.team == theReceivingPlayer->pev->team)) && (ent != theReceivingPlayer->edict()) && (ent->v.team != 0))
{
if (!((ent->v.iuser3 == AVH_USER3_ALIEN_PLAYER4) && (ent->v.iuser4 & MASK_ALIEN_MOVEMENT)))
{
state->rendermode = kRenderTransAdd;
state->renderamt = 150;
}
}
}
// Special stuff for players only
if(player)

View file

@ -280,6 +280,11 @@ void CGrenade::BounceTouch( CBaseEntity *pOther )
if ( pOther->edict() == pev->owner )
return;
// don't hit blinking dudes
bool inOtherIsBlinking = (pOther->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (pOther->pev->iuser4 & MASK_ALIEN_MOVEMENT);
if (inOtherIsBlinking)
return;
// Grenades to tend to get "stuck" on sloped surfaces due to the HL physics
// system, so move it away from whatever we're colliding with.

View file

@ -582,6 +582,9 @@ void W_Precache(void)
// For grunts. Careful, this uses the same weapon id that the grenade gun uses
//UTIL_PrecacheOtherWeapon("weapon_9mmAR");
PRECACHE_UNMODIFIED_SOUND("player/metabolize_fire.wav");
PRECACHE_UNMODIFIED_SOUND("player/metabolize_fire_reverse.wav");
// common world objects
// UTIL_PrecacheOther( "item_suit" );
// UTIL_PrecacheOther( "item_battery" );

View file

@ -1120,8 +1120,11 @@ void AvHBaseBuildable::WorldUpdate()
while(((theBaseEntity = UTIL_FindEntityInSphere(theBaseEntity, this->pev->origin, BALANCE_VAR(kElectricalRange))) != NULL) && (theNumEntsDamaged < BALANCE_VAR(kElectricalMaxTargets)))
{
bool theIsBlinking = (theBaseEntity->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (theBaseEntity->pev->iuser4 & MASK_ALIEN_MOVEMENT);
// When "electric" cheat is enabled, shock all non-self entities, else shock enemies
if((GetGameRules()->GetIsCheatEnabled(kcElectric) && (theBaseEntity != this)) || ((theBaseEntity->pev->team != this->pev->team) && theBaseEntity->IsAlive()))
if((GetGameRules()->GetIsCheatEnabled(kcElectric) && (theBaseEntity != this)) || ((theBaseEntity->pev->team != this->pev->team) && theBaseEntity->IsAlive()) && (theIsBlinking == false))
{
// Make sure it's not blocked
TraceResult theTraceResult;

View file

@ -150,6 +150,7 @@ void AvHEntityHierarchy::BuildFromTeam(const AvHTeam* inTeam, BaseEntityListType
bool theEntityIsVisible = (theBaseEntity->pev->team == (int)(inTeam->GetTeamNumber())) ||
GetHasUpgrade(theBaseEntity->pev->iuser4, MASK_VIS_SIGHTED);
bool theEntityIsDetected = GetHasUpgrade(theBaseEntity->pev->iuser4, MASK_VIS_DETECTED);
bool theEntityIsBlinking = (theBaseEntity->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (theBaseEntity->pev->iuser4 & MASK_ALIEN_MOVEMENT);
// Don't send ammo, health, weapons, or scans
bool theIsTransient = ((AvHUser3)(theBaseEntity->pev->iuser3) == AVH_USER3_MARINEITEM) || (theBaseEntity->pev->classname == MAKE_STRING(kwsScan));
@ -189,7 +190,7 @@ void AvHEntityHierarchy::BuildFromTeam(const AvHTeam* inTeam, BaseEntityListType
{
sendEntity = true;
}
else if ((theEntityIsVisible || theEntityIsDetected) && !(theBaseEntity->pev->effects & EF_NODRAW) && !theIsTransient)
else if ((theEntityIsVisible || theEntityIsDetected) && !(theBaseEntity->pev->effects & EF_NODRAW) && !theIsTransient && !theEntityIsBlinking)
{
AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(theBaseEntity);

View file

@ -989,6 +989,7 @@ bool AvHGamerules::CanEntityDoDamageTo(const CBaseEntity* inAttacker, const CBas
bool theAttackerIsReceiver = false;
float theScalar = 1.0f;
bool theReceiverIsWorld = false;
bool theReceiverIsBlinking = (inReceiver->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (inReceiver->pev->iuser4 & MASK_ALIEN_MOVEMENT);
// Never dynamic_cast any entities that could be non-NS entities
if(!AvHSUGetIsExternalClassName(STRING(inAttacker->pev->classname)))
@ -1057,6 +1058,10 @@ bool AvHGamerules::CanEntityDoDamageTo(const CBaseEntity* inAttacker, const CBas
{
theCanDoDamage = false;
}
if(theReceiverIsBlinking)
{
theCanDoDamage = false;
}
if(theCanDoDamage && outScalar)
{
*outScalar = theScalar;

View file

@ -654,6 +654,10 @@ void AvHHud::ClearData()
this->mDisplayOrderTime = 0;
this->mDisplayOrderType = 0;
// :tankefugl
this->mMovementTimer = 0.0f;
this->m_bConserveFOV = false;
}
@ -1387,6 +1391,8 @@ bool AvHHud::Update(float inCurrentTime, string& outErrorString)
this->UpdateCommonUI();
this->UpdateMovementTimer(inCurrentTime - this->mTimeOfLastUpdate);
this->UpdateAlienUI(inCurrentTime);
this->UpdateMarineUI(inCurrentTime);
@ -1510,6 +1516,12 @@ bool AvHHud::Update(float inCurrentTime, string& outErrorString)
// }
//}
void AvHHud::UpdateMovementTimer(float inTimeSinceLastUpdate)
{
cl_entity_t* theEntity = GetHUDEntity();
this->mMovementTimer = max(theEntity->curstate.fuser4, theEntity->curstate.fuser4 * -1.0f);
}
bool AvHHud::GetAndClearTechEvent(AvHMessageID& outMessageID)
{
bool theTechEventWaiting = false;

View file

@ -286,6 +286,7 @@ public:
AvHUser3 GetHUDUser3() const;
AvHPlayMode GetHUDPlayMode() const;
AvHTeamNumber GetHUDTeam() const;
cl_entity_t* GetHUDEntity() const;
int GetHUDUpgrades() const;
int GetHUDMaxArmor() const;
int GetHUDMaxHealth() const;
@ -362,6 +363,7 @@ public:
void RenderCommonUI();
void RenderMarineUI();
void RenderCommanderUI();
void RenderAlienMovementUIEffect();
void RenderAlienUI();
void RenderMiniMap(int inX, int inY, int inWidth, int inHeight);
@ -439,8 +441,12 @@ public:
void ClearCenterText();
// :tankefugl
void UpdateMovementTimer(float inTimeSinceLastUpdate);
private:
float mMovementTimer;
// tankefugl:
std::string mCenterText;
float mCenterTextTime;
@ -694,6 +700,8 @@ private:
HSPRITE mAlienUIEnergySprite;
HSPRITE mBlackSprite;
HSPRITE mMembraneSprite;
HSPRITE mDigestingSprite;
HSPRITE mBackgroundSprite;

View file

@ -1883,6 +1883,27 @@ float AvHHud::GetHUDHandicap() const
return theHandicap;
}
cl_entity_t* AvHHud::GetHUDEntity() const
{
cl_entity_t* thePlayer = null;
cl_entity_s* theLocalPlayer = gEngfuncs.GetLocalPlayer();
if(theLocalPlayer)
{
thePlayer = theLocalPlayer;
}
if(g_iUser1 == OBS_IN_EYE)
{
cl_entity_t* theEnt = gEngfuncs.GetEntityByIndex(g_iUser2);
if(theEnt)
{
thePlayer = theEnt;
}
}
return thePlayer;
}
AvHUser3 AvHHud::GetHUDUser3() const
{
AvHUser3 theUser3 = AVH_USER3_NONE;
@ -3611,6 +3632,58 @@ void AvHHud::RenderStructureRange(vec3_t inOrigin, int inRadius, HSPRITE inSprit
}
void AvHHud::RenderAlienMovementUIEffect()
{
this->m_bConserveFOV = false;
int iuser3 = GetHUDUser3();
bool isMoving = (GetHUDUpgrades() & MASK_ALIEN_MOVEMENT);
if (isMoving && (iuser3 == AVH_USER3_ALIEN_PLAYER5))
{
float theChargeThresholdTime = (float)BALANCE_VAR(kChargeThresholdTime);
float factor = min(this->mMovementTimer / theChargeThresholdTime, 1.0f);
}
if (isMoving && (iuser3 == AVH_USER3_ALIEN_PLAYER1))
{
// render leap effects
}
else if (iuser3 == AVH_USER3_ALIEN_PLAYER4)
{
float alpha = 1.0f;
float theBlinkThresholdTime = (float)BALANCE_VAR(kBlinkThresholdTime);
if (this->mMovementTimer > 0.0f)
{
alpha = min(this->mMovementTimer / theBlinkThresholdTime, 1.0f);
}
if (isMoving || this->mMovementTimer > 0.0f)
{
this->m_bConserveFOV = true;
this->m_iFOV = 90.0f + alpha * 25.0f;
this->mMovementTimer = min(this->mMovementTimer, theBlinkThresholdTime);
// render overlay
// alpha *= 0.5f;
AvHSpriteSetColor(1, 1, 1);
AvHSpriteSetRenderMode(kRenderTransTexture);
int theWidth = 1.0 * ScreenWidth();
int theHeight = 0.15 * ScreenHeight();
int theX = mViewport[0];
int theY1 = mViewport[1];
int theY2 = mViewport[3];
AvHSpriteDraw(mBlackSprite, 0, theX, theY1, theX + theWidth, theY1 + theHeight * alpha, 0, 0, 1, alpha);
AvHSpriteDraw(mBlackSprite, 0, theX, theY2 - theHeight * alpha, theX + theWidth, theY2, 0, 0, 1, alpha);
}
}
}
void AvHHud::RenderAlienUI()
{
@ -3629,6 +3702,9 @@ void AvHHud::RenderAlienUI()
return;
}
// render alien movement effects
this->RenderAlienMovementUIEffect();
AvHSpriteSetRenderMode(kRenderTransAlpha);
int theWidth = kResourceEnergyBarWidth*ScreenWidth();
@ -4218,6 +4294,9 @@ void AvHHud::VidInit(void)
theSpriteName = UINameToSprite(kAlienEnergySprite, theScreenWidth);
this->mAlienUIEnergySprite = Safe_SPR_Load(theSpriteName.c_str());
// black sprite
this->mBlackSprite = Safe_SPR_Load("sprites/black.spr");
// Load background for topdown mode
this->mBackgroundSprite = Safe_SPR_Load(kTopDownBGSprite);

View file

@ -195,6 +195,12 @@ void AvHDeployedMine::ActiveTouch(CBaseEntity* inOther)
bool theEntityCanDoDamage = GetGameRules()->CanEntityDoDamageTo(this, inOther);
//this->pev->owner = theTempOwner;
// Check team here and only emit warning beep for friendlies
// check for blinking
bool inOtherIsBlinking = (inOther->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (inOther->pev->iuser4 & MASK_ALIEN_MOVEMENT);
if(inOtherIsBlinking)
return;
if(theEntityCanDoDamage && (this->pev->team != inOther->pev->team))
{
GetGameRules()->MarkDramaticEvent(kMineExplodePriority, inOther, this);

View file

@ -312,7 +312,8 @@ void AvHMUUpdateAlienEnergy(float inTimePassed, int inUser3, int inUser4, float&
(inUser3 == AVH_USER3_ALIEN_PLAYER2) ||
(inUser3 == AVH_USER3_ALIEN_PLAYER3) ||
(inUser3 == AVH_USER3_ALIEN_PLAYER4) ||
(inUser3 == AVH_USER3_ALIEN_PLAYER5))
(inUser3 == AVH_USER3_ALIEN_PLAYER5) ||
(inUser3 == AVH_USER3_ALIEN_PLAYER6))
{
if(!GetHasUpgrade(inUser4, MASK_PLAYER_STUNNED))
{
@ -336,18 +337,19 @@ void AvHMUUpdateAlienEnergy(float inTimePassed, int inUser3, int inUser4, float&
float theNewEnergy = theCurrentEnergy + inTimePassed*theAlienEnergyRate*theUpgradeFactor;
// If we're charging, reduce energy
if(GetHasUpgrade(inUser4, MASK_ALIEN_MOVEMENT))
{
if(inUser3 == AVH_USER3_ALIEN_PLAYER4)
{
// // If we're charging, reduce energy
// // Removed: Charge only reduces energy when active
// if(GetHasUpgrade(inUser4, MASK_ALIEN_MOVEMENT))
// {
// if(inUser3 == AVH_USER3_ALIEN_PLAYER4)
// {
// theNewEnergy += inTimePassed*kFadeChargingDeplectionRate;
}
else
{
theNewEnergy += inTimePassed*kChargingDepletionRate;
}
}
// }
// else
// {
// theNewEnergy += inTimePassed*kChargingDepletionRate;
// }
// }
theNewEnergy = min(max(theNewEnergy, 0.0f), 1.0f);

View file

@ -250,6 +250,7 @@
#include "mod/AvHParticleConstants.h"
#include "util/MathUtil.h"
#include "types.h"
// #include "mod/CollisionUtil.h"
#include "mod/AvHNetworkMessages.h"
#include "mod/AvHNexusServer.h"
@ -2259,6 +2260,56 @@ void AvHPlayer::PlayerTouch(CBaseEntity* inOther)
this->Uncloak();
}
// charge
float chargedamage = 0.0f;
if(GetHasUpgrade(this->pev->iuser4, MASK_ALIEN_MOVEMENT) && (GetUser3() == AVH_USER3_ALIEN_PLAYER5)) // && !this->GetIsBlinking() )
{
// push the target away
if (inOther->IsPlayer() && inOther->IsAlive())
{
vec3_t direction, otherdir, playerdir, displacement;
VectorSubtract(inOther->pev->origin, this->pev->origin, direction);
direction[2] = 0.0f;
VectorNormalize(direction);
float velocityfactor = DotProduct(this->pev->velocity, inOther->pev->velocity) / (Length(this->pev->velocity) * Length(this->pev->velocity));
if (velocityfactor < 0.7f)
{
// push away
chargedamage = min(max(DotProduct(this->pev->velocity, direction), 100.0f), 500.0f);
VectorScale(direction, 10.0f, displacement);
// try moving directly to the bumped location
VectorAdd(displacement, inOther->pev->origin, displacement);
bool ducking = inOther->pev->flags & FL_DUCKING;
int hull = AvHMUGetHull(ducking, inOther->pev->iuser3);
int valvehull = AvHSUGetValveHull(hull);
TraceResult trace;
UTIL_TraceHull(inOther->pev->origin, displacement, dont_ignore_monsters, valvehull, inOther->edict(), &trace);
if (trace.flFraction == 1.0f)
VectorCopy(trace.vecEndPos, inOther->pev->origin);
int duck = 0;
if (ducking)
duck = 1;
ALERT(at_console, UTIL_VarArgs("frac %f duck %d hull %d valvehull %d\n", trace.flFraction, duck, hull, valvehull));
VectorScale(direction, chargedamage, direction);
VectorAdd(direction, inOther->pev->velocity, inOther->pev->velocity);
inOther->pev->velocity[2] = 10.0f;
// deal damage
chargedamage = true;
}
}
}
// Don't do "touch" damage too quickly
float theTouchDamageInterval = BALANCE_VAR(kTouchDamageInterval);
if((this->mTimeOfLastTouchDamage == -1) || (gpGlobals->time > (this->mTimeOfLastTouchDamage + theTouchDamageInterval)))
@ -2279,8 +2330,27 @@ void AvHPlayer::PlayerTouch(CBaseEntity* inOther)
}
}
if((chargedamage > 0.0f) && GetGameRules()->CanEntityDoDamageTo(this, inOther, &theScalar))
{
float basedamage = (float)BALANCE_VAR(kChargeDamage);
float theDamage = basedamage * theScalar * chargedamage;
#ifdef AVH_SERVER
ALERT(at_console, UTIL_VarArgs("basedamage %f scalar %f charge %f damage %f\n", basedamage, theScalar, chargedamage, theDamage));
#endif
inOther->TakeDamage(theInflictor, theAttacker, theDamage, NS_DMG_NORMAL);
if(inOther->IsPlayer() && !inOther->IsAlive())
{
EMIT_SOUND(ENT(this->pev), CHAN_WEAPON, kChargeKillSound, 1.0, ATTN_NORM);
}
}
// Are we charging?
if(GetHasUpgrade(this->pev->iuser4, MASK_ALIEN_MOVEMENT) /*&& !this->GetIsBlinking()*/)
/* TODO: Rework charge
if(GetHasUpgrade(this->pev->iuser4, MASK_ALIEN_MOVEMENT)) // && !this->GetIsBlinking() )
{
if(GetGameRules()->CanEntityDoDamageTo(this, inOther, &theScalar))
{
@ -2296,6 +2366,7 @@ void AvHPlayer::PlayerTouch(CBaseEntity* inOther)
this->mTimeOfLastTouchDamage = gpGlobals->time;
}
}
*/
}
}
}
@ -3060,11 +3131,11 @@ void AvHPlayer::GetSpeeds(int& outBaseSpeed, int& outUnemcumberedSpeed) const
//theAlienBaseSpeed = this->mMaxGallopSpeed;
theAlienBaseSpeed = BALANCE_VAR(kOnosBaseSpeed);
if(GetHasUpgrade(this->pev->iuser4, MASK_ALIEN_MOVEMENT))
{
theAlienBaseSpeed *= kChargingFactor;
theSpeedUpgradeAmount *= kChargingFactor;
}
// if(GetHasUpgrade(this->pev->iuser4, MASK_ALIEN_MOVEMENT))
// {
// theAlienBaseSpeed *= kChargingFactor;
// theSpeedUpgradeAmount *= kChargingFactor;
// }
break;
}
@ -3668,11 +3739,19 @@ bool AvHPlayer::GetCanBeAffectedByEnemies() const
float AvHPlayer::GetOpacity() const
{
float theOpacity = AvHCloakable::GetOpacity();
float theBlinkThresholdTime = (float)BALANCE_VAR(kBlinkThresholdTime);
//if(this->GetIsBlinking())
//{
// theOpacity = .05f;
//}
int entIndex = ENTINDEX(ENT(this->pev));
if (entIndex > 0 && entIndex < 32)
if (this->GetIsBlinking())
{
theOpacity = 0.0f;
}
else
if ((this->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (this->pev->fuser4 > 0.0))
{
theOpacity = 1.0 - this->pev->fuser4 / theBlinkThresholdTime;
}
return theOpacity;
}
@ -6107,10 +6186,13 @@ void AvHPlayer::ProcessEntityBlip(CBaseEntity* inEntity)
//bool theHasHiveSightUpgrade = true;//GetHasUpgrade(this->pev->iuser4, MASK_ALIEN_UPGRADE_11) || GetGameRules()->GetIsTesting();
bool theEntityIsInSight = this->GetIsEntityInSight(inEntity);
// don't draw blinking players
bool theEntityIsNotBlinking = !(inEntity->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (inEntity->pev->iuser4 & MASK_ALIEN_MOVEMENT);
// If we're processing a relevant player
AvHPlayer* theOtherPlayer = dynamic_cast<AvHPlayer*>(inEntity);
bool theIsSpectatingEntity = this->GetIsSpectatingPlayer(inEntity->entindex());
if(theOtherPlayer && (theOtherPlayer != this) && !theIsSpectatingEntity && theOtherPlayer->GetIsRelevant())
if(theOtherPlayer && (theOtherPlayer != this) && !theIsSpectatingEntity && theOtherPlayer->GetIsRelevant() && theEntityIsNotBlinking)
{
// Calculate angle and distance to player
Vector theVectorToEntity = inEntity->pev->origin - this->pev->origin;
@ -9019,6 +9101,14 @@ bool AvHPlayer::GetIsDigesting() const
return theIsDigesting;
}
bool AvHPlayer::GetIsBlinking() const
{
if(GetHasUpgrade(this->pev->iuser4, MASK_ALIEN_MOVEMENT) && (this->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4))
return true;
else
return false;
}
void AvHPlayer::UpdateAmbientSounds()
{
AvHClassType theClassType = this->GetClassType();

View file

@ -242,6 +242,7 @@ public:
bool GetIsInTopDownMode(bool inIncludeSpectating = false) const;
bool GetIsBeingDigested() const;
bool GetIsDigesting() const;
bool GetIsBlinking() const;
bool GetIsEntityInSight(CBaseEntity* inEntity);
bool GetIsValidReinforcementFor(AvHTeamNumber inTeam) const;
AvHTeamNumber GetTeam(bool inIncludeSpectating = false) const;

View file

@ -1232,10 +1232,11 @@ void AvHTraceLine(const Vector& vecStart, const Vector& vecEnd, IGNORE_MONSTERS
edict_t* theEdict = pList[i]->edict();
// tankefugl: 0000941 -- added check to remove testing of spectators
if ((!(pList[i]->pev->iuser1 > 0 || pList[i]->pev->flags & FL_SPECTATOR)) && theEdict != pentIgnore)
if ((!(pList[i]->pev->iuser1 > 0 || pList[i]->pev->flags & FL_SPECTATOR))
&& !((pList[i]->pev->iuser3 == AVH_USER3_ALIEN_PLAYER4) && (pList[i]->pev->iuser4 & MASK_ALIEN_MOVEMENT))
&& theEdict != pentIgnore)
// if (theEdict != pentIgnore)
{
float t = NS_TraceLineAgainstEntity(pList[i]->entindex(), gpGlobals->time, theRayOrigin, theRayDirection);
if (t != AVH_INFINITY && t < ptr->flFraction)

View file

@ -118,6 +118,7 @@ typedef enum
AVH_USER3_MENU_ASSIST,
AVH_USER3_MENU_EQUIP,
AVH_USER3_MINE,
AVH_USER3_ALIEN_PLAYER6,
AVH_USER3_UNKNOWN,
AVH_USER3_MAX
} AvHUser3;
@ -165,7 +166,7 @@ typedef enum
MASK_UPGRADE_13 = 0x00008000, // Movement level 3, marine heavy armor
MASK_UPGRADE_14 = 0x00010000, // Sensory level 2
MASK_UPGRADE_15 = 0x00020000, // Sensory level 3
MASK_ALIEN_MOVEMENT = 0x00040000, // Onos is charging
MASK_ALIEN_MOVEMENT = 0x00040000, // Alien is invoking movement ability
MASK_WALLSTICKING = 0x00080000, // Flag for wall-sticking
MASK_BUFFED = 0x00100000, // Alien is in range of active primal scream, or marine is under effects of catalyst
MASK_UMBRA = 0x00200000,

View file

@ -4338,14 +4338,146 @@ bool NS_PositionFreeForPlayer(vec3_t& inPosition)
}
*/
// Fade blink
bool PM_BlinkMove (void)
{
float theEnergyCost = (float)BALANCE_VAR(kBlinkEnergyCost) * (float)pmove->frametime;
float theBlinkThresholdTime = (float)BALANCE_VAR(kBlinkThresholdTime);
if (AvHMUHasEnoughAlienEnergy(pmove->fuser3, theEnergyCost) && (pmove->fuser4 >= 0.0f))
{
AvHMUDeductAlienEnergy(pmove->fuser3, theEnergyCost);
if (pmove->fuser4 == 0.0f)
{
int theSilenceUpgradeLevel = AvHGetAlienUpgradeLevel(pmove->iuser4, MASK_UPGRADE_6);
float theVolumeScalar = 1.0f - theSilenceUpgradeLevel/3.0f;
PM_NSPlaySound( CHAN_WEAPON, "player/metabolize_fire.wav", theVolumeScalar, ATTN_NORM, 0, PITCH_NORM );
}
pmove->fuser4 += (float)pmove->frametime;
pmove->fuser4 = max(0, min(pmove->fuser4, theBlinkThresholdTime));
}
else
return false;
if (pmove->fuser4 >= theBlinkThresholdTime)
{
SetUpgradeMask(&pmove->iuser4, MASK_ALIEN_MOVEMENT, true);
vec3_t wishvel, dest;
pmtrace_t trace;
float fmove, smove;
// Copy movement amounts
fmove = pmove->cmd.forwardmove;
smove = pmove->cmd.sidemove;
VectorNormalize(pmove->forward);
VectorScale(pmove->forward, 800, wishvel);
VectorMA(pmove->origin, pmove->frametime, wishvel, dest);
// first try moving directly to the next spot
trace = pmove->PM_PlayerTrace(pmove->origin, dest, PM_NORMAL, -1 );
// If we made it all the way, then copy trace end as new player position.
if (trace.fraction == 1)
{
VectorCopy(trace.endpos, pmove->origin);
}
else
{
// if we can't move, adjust velocity to slite along the plane we collided with
// and retry
int attempts = 0; // in case we continue to collide vs. the old planes
while (true) {
PM_ClipVelocity(wishvel, trace.plane.normal, wishvel, 1.0);
VectorMA(pmove->origin, pmove->frametime, wishvel, dest);
trace = pmove->PM_PlayerTrace(pmove->origin, dest, PM_NORMAL, -1 );
if (trace.fraction == 1)
{
VectorCopy(trace.endpos, pmove->origin);
break;
}
if (attempts++ > 5) {
break;
}
}
}
VectorClear(pmove->velocity);
}
else
{
SetUpgradeMask(&pmove->iuser4, MASK_ALIEN_MOVEMENT, false);
}
return true;
}
// Lerk flight
void PM_FlapMove()
{
PM_Jump();
}
// Onos charge
bool PM_ChargeMove()
{
float theEnergyCost = (float)BALANCE_VAR(kChargeEnergyCost) * (float)pmove->frametime;
float theChargeThresholdTime = (float)BALANCE_VAR(kChargeThresholdTime);
float theChargeSpeed = (float)BALANCE_VAR(kChargeSpeed);
if (AvHMUHasEnoughAlienEnergy(pmove->fuser3, theEnergyCost) && (pmove->fuser4 >= 0.0f))
{
AvHMUDeductAlienEnergy(pmove->fuser3, theEnergyCost);
if (pmove->fuser4 == 0.0f)
{
int theSilenceUpgradeLevel = AvHGetAlienUpgradeLevel(pmove->iuser4, MASK_UPGRADE_6);
float theVolumeScalar = 1.0f - theSilenceUpgradeLevel/3.0f;
PM_NSPlaySound( CHAN_WEAPON, "player/pl_fallpain3-7.wav", theVolumeScalar, ATTN_NORM, 0, PITCH_NORM );
}
pmove->fuser4 += (float)pmove->frametime;
pmove->fuser4 = max(0, min(pmove->fuser4, theChargeThresholdTime));
}
else
return false;
SetUpgradeMask(&pmove->iuser4, MASK_ALIEN_MOVEMENT, true);
if (pmove->onground != -1)
{
vec3_t forward;
float length = pmove->maxspeed * (1.0f + (float)BALANCE_VAR(kChargeSpeed) * pmove->fuser4 / theChargeThresholdTime);
VectorCopy(pmove->forward, forward);
VectorNormalize(forward);
VectorScale(forward, length, forward);
float boostfactor = DotProduct(forward, pmove->velocity) / (length * length);
VectorScale(forward, (1.0f - boostfactor), forward);
VectorAdd(forward, pmove->velocity, pmove->velocity);
float velocity = Length(pmove->velocity);
float maxvel = (pmove->maxspeed * (1.0f + (float)BALANCE_VAR(kChargeSpeed)) * 1.6f);
if (velocity > maxvel)
{
VectorNormalize(pmove->velocity);
VectorScale(pmove->velocity, maxvel, pmove->velocity);
}
}
return true;
}
// Skulk leap
void PM_LeapMove()
{
}
void PM_AlienAbilities()
{
// Give some energy back if we're an alien and not evolving
string theExt;
float theTimePassed = (float)pmove->frametime;
if(NS_GetIsPlayerAlien(theExt))
{
float theTimePassed = pmove->cmd.msec*0.001f;
AvHMUUpdateAlienEnergy(theTimePassed, pmove->iuser3, pmove->iuser4, pmove->fuser3);
// Stop charging when we're out of energy
@ -4360,6 +4492,49 @@ void PM_AlienAbilities()
//#endif
// Movement abilities
bool success = false;
if ((pmove->cmd.buttons & IN_ATTACK2) && (AvHGetIsAlien(pmove->iuser3)))
{
switch (pmove->iuser3)
{
case AVH_USER3_ALIEN_PLAYER1:
PM_LeapMove();
break;
case AVH_USER3_ALIEN_PLAYER3:
PM_FlapMove();
break;
case AVH_USER3_ALIEN_PLAYER4:
success = PM_BlinkMove();
break;
case AVH_USER3_ALIEN_PLAYER5:
success = PM_ChargeMove();
break;
default:
{
break;
}
}
}
if (!success)
{
SetUpgradeMask(&pmove->iuser4, MASK_ALIEN_MOVEMENT, false);
float theBlinkThresholdTime = (float)BALANCE_VAR(kBlinkThresholdTime);
if (pmove->iuser3 == AVH_USER3_ALIEN_PLAYER4 && pmove->fuser4 == theBlinkThresholdTime)
{
int theSilenceUpgradeLevel = AvHGetAlienUpgradeLevel(pmove->iuser4, MASK_UPGRADE_6);
float theVolumeScalar = 1.0f - theSilenceUpgradeLevel/3.0f;
PM_NSPlaySound( CHAN_WEAPON, "player/metabolize_fire_reverse.wav", theVolumeScalar, ATTN_NORM, 0, PITCH_NORM );
}
if (pmove->fuser4 >= 0.0f)
pmove->fuser4 *= -1.0f;
pmove->fuser4 += theTimePassed;
pmove->fuser4 = min(pmove->fuser4, 0.0f);
}
return;
if (PM_GetIsLeaping() || PM_GetIsBlinking())
{
float theScalar = 500;
@ -4367,8 +4542,8 @@ void PM_AlienAbilities()
if (PM_GetIsBlinking())
{
theScalar = 225;
AvHMUGetEnergyCost(AVH_WEAPON_BLINK, theEnergyCost);
PM_BlinkMove();
return;
}
else
{
@ -4412,6 +4587,7 @@ void PM_AlienAbilities()
// }
//pmove->velocity[2] += 300;
//}
}
// else if((pmove->cmd.impulse == ALIEN_ABILITY_BLINK) && (pmove->iuser3 == AVH_USER3_ALIEN_PLAYER4))