void CASW_Alien::DoBloodDecal( float flDamage, const Vector &vecPos, const Vector &vecDir, trace_t *ptr, int bitsDamageType ) { if ( ( BloodColor() == DONT_BLEED) || ( BloodColor() == BLOOD_COLOR_MECH ) ) { return; } if (flDamage == 0) return; if ( !( bitsDamageType & ( DMG_CRUSH | DMG_BULLET | DMG_SLASH | DMG_BLAST | DMG_CLUB | DMG_AIRBOAT ) ) ) return; // make blood decal on the wall! trace_t Bloodtr; Vector vecTraceDir; float flNoise; int cCount; int i; #ifdef GAME_DLL if ( !IsAlive() ) { // dealing with a dead npc. if ( GetMaxHealth() <= 0 ) { // no blood decal for a npc that has already decalled its limit. return; } else { m_iMaxHealth -= 1; } } #endif if (flDamage < 10) { flNoise = 0.1; cCount = 1; } else if (flDamage < 25) { flNoise = 0.2; cCount = 2; } else { flNoise = 0.3; cCount = 4; } float flTraceDist = (bitsDamageType & DMG_AIRBOAT) ? 384 : 172; for ( i = 0 ; i < cCount ; i++ ) { vecTraceDir = vecDir * -1;// trace in the opposite direction the shot came from (the direction the shot is going) vecTraceDir.x += random->RandomFloat( -flNoise, flNoise ); vecTraceDir.y += random->RandomFloat( -flNoise, flNoise ); vecTraceDir.z += random->RandomFloat( -flNoise, flNoise ); // Don't bleed on grates. UTIL_TraceLine( vecPos, vecPos + vecTraceDir * -flTraceDist, MASK_SOLID_BRUSHONLY & ~CONTENTS_GRATE, this, COLLISION_GROUP_NONE, &Bloodtr); if ( Bloodtr.fraction != 1.0 ) { UTIL_BloodDecalTrace( &Bloodtr, BloodColor() ); } } }
bool CObjectTeleporter::Command_Repair( CTFPlayer *pActivator ) { bool bRepaired = false; int iAmountToHeal = 0; int iRepairCost = 0; // There's got to be a better way a shorter way to mirror repairs and such. if ( GetHealth() < GetMaxHealth() ) { iAmountToHeal = min( 100, GetMaxHealth() - GetHealth() ); // repair the building iRepairCost = ceil( (float)( iAmountToHeal ) * 0.2f ); TRACE_OBJECT( UTIL_VarArgs( "%0.2f CObjectDispenser::Command_Repair ( %d / %d ) - cost = %d\n", gpGlobals->curtime, GetHealth(), GetMaxHealth(), iRepairCost ) ); if ( iRepairCost > 0 ) { if ( iRepairCost > pActivator->GetBuildResources() ) { iRepairCost = pActivator->GetBuildResources(); } pActivator->RemoveBuildResources( iRepairCost ); float flNewHealth = min( GetMaxHealth(), GetHealth() + ( iRepairCost * 5 ) ); SetHealth( flNewHealth ); bRepaired = (iRepairCost > 0); CObjectTeleporter *pMatch = GetMatchingTeleporter(); if ( pMatch && pMatch->GetState() != TELEPORTER_STATE_BUILDING && !pMatch->IsUpgrading() ) { float flNewHealth = min( pMatch->GetMaxHealth(), pMatch->GetHealth() + ( iRepairCost * 5 ) ); pMatch->SetHealth( flNewHealth ); } } } else if ( GetMatchingTeleporter() ) // See if the other teleporter needs repairing { CObjectTeleporter *pMatch = GetMatchingTeleporter(); if ( pMatch->GetHealth() < pMatch->GetMaxHealth() && pMatch->GetState() != TELEPORTER_STATE_BUILDING && !pMatch->IsUpgrading() ) { iAmountToHeal = min( 100, pMatch->GetMaxHealth() - pMatch->GetHealth() ); // repair the building iRepairCost = ceil( (float)(iAmountToHeal)* 0.2f ); TRACE_OBJECT( UTIL_VarArgs( "%0.2f CObjectDispenser::Command_Repair ( %d / %d ) - cost = %d\n", gpGlobals->curtime, pMatch->GetHealth(), pMatch->GetMaxHealth(), iRepairCost ) ); if ( iRepairCost > 0 ) { if ( iRepairCost > pActivator->GetBuildResources() ) { iRepairCost = pActivator->GetBuildResources(); } pActivator->RemoveBuildResources( iRepairCost ); float flNewHealth = min( pMatch->GetMaxHealth(), pMatch->GetHealth() + ( iRepairCost * 5 ) ); pMatch->SetHealth( flNewHealth ); bRepaired = (iRepairCost > 0); } } } return bRepaired; }
bool cMinecart::DoTakeDamage(TakeDamageInfo & TDI) { if ((TDI.Attacker != NULL) && TDI.Attacker->IsPlayer() && ((cPlayer *)TDI.Attacker)->IsGameModeCreative()) { Destroy(); TDI.FinalDamage = GetMaxHealth(); // Instant hit for creative SetInvulnerableTicks(0); return super::DoTakeDamage(TDI); // No drops for creative } m_LastDamage = TDI.FinalDamage; if (!super::DoTakeDamage(TDI)) { return false; } m_World->BroadcastEntityMetadata(*this); if (GetHealth() <= 0) { Destroy(); cItems Drops; switch (m_Payload) { case mpNone: { Drops.push_back(cItem(E_ITEM_MINECART, 1, 0)); break; } case mpChest: { Drops.push_back(cItem(E_ITEM_CHEST_MINECART, 1, 0)); break; } case mpFurnace: { Drops.push_back(cItem(E_ITEM_FURNACE_MINECART, 1, 0)); break; } case mpTNT: { Drops.push_back(cItem(E_ITEM_MINECART_WITH_TNT, 1, 0)); break; } case mpHopper: { Drops.push_back(cItem(E_ITEM_MINECART_WITH_HOPPER, 1, 0)); break; } default: { ASSERT(!"Unhandled minecart type when spawning pickup!"); return true; } } m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ()); } return true; }
//----------------------------------------------------------------------------- // Should we trigger a damage effect? //----------------------------------------------------------------------------- inline bool CPropAPC::ShouldTriggerDamageEffect( int nPrevHealth, int nEffectCount ) const { int nPrevRange = (int)( ((float)nPrevHealth / (float)GetMaxHealth()) * nEffectCount ); int nRange = (int)( ((float)GetHealth() / (float)GetMaxHealth()) * nEffectCount ); return ( nRange != nPrevRange ); }
void ABoss::CreatePresetRole(TEnumAsByte<GroupEnums::Role> inRole, int32 grade, int32 quaility) { float statModifier = 0; float blastResistance = 5; float phsyicalResistance = 5; float energyResistance = 5; static float lowHealth = 9000; static float mediumHealth = lowHealth * 1.25; static float highHealth = mediumHealth * 1.25; StartingRole(inRole); Reset(); switch (UMiscLibrary::GetDifficulty()) { case GameEnums::Easy: GetModifierForDifficulty(GameEnums::Hard); break; case GameEnums::Medium: GetModifierForDifficulty(GameEnums::Medium); break; case GameEnums::Hard: GetModifierForDifficulty(GameEnums::Easy); break; } switch (inRole) { case GroupEnums::DPS: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::SMG, grade, quaility + 3)); AddAbility(UDamageBoost::CreateAbility(7, this, 0.5)); //AddAbility(UChannelledAbility::CreateChannelledAbility(this, UTimedHealthChange::CreateTimedHealthChange(this, 10.0F, 400.0F), 2, true, true)); //AddAbility(UOrbitalStrike::CreateAbility(30, this, 350)); AddAbility(UChannelledAbility::CreateChannelledAbility(this, UParticleBomb::CreateAbility(12.0F, this, 20.0F), 5.0F, false, true)); SetDefenceModifier(0 + statModifier); SetHealthChangeModifier(1 + statModifier); SetMaxHealth(lowHealth * (1 + statModifier)); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::MediumLight); blastResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); break; case GroupEnums::Tank: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::Sword, grade, quaility + 3)); AddAbility(UAbility::CreatePresetAbility(this, AbilityEnums::Taunt)); AddAbility(UAbility::CreateChannelledPresetAbility(this, AbilityEnums::Stun, 2.5, false, true)); SetDefenceModifier(0 + statModifier); SetHealthChangeModifier(1 + statModifier); SetMaxHealth(highHealth * (1 + statModifier)); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Heavy); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::Heavy); blastResistance = AArmour::GetDeafultValue(ArmourGrades::Heavy); break; case GroupEnums::Sniper: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::Sniper, grade, quaility + 3)); AddAbility(UChannelledAbility::CreateChannelledAbility(this, USnipe::CreateAbility(7, this), 2.5F, false, true)); SetDefenceModifier(0 + statModifier); SetHealthChangeModifier(1 + statModifier); SetMaxHealth(lowHealth * (1 + statModifier)); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::Light); blastResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); break; case GroupEnums::Healer: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::Bio_Repair, grade, quaility + 3)); AddAbility(UHeal::CreateAbility(5, this, 12.0F)); AddAbility(UDisable::CreateDisable(10, this, 5)); SetDefenceModifier(0 + statModifier); SetHealthChangeModifier(1.5 + statModifier); SetMaxHealth(mediumHealth * (1 + statModifier)); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::MediumHeavy); blastResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); break; default: CreatePresetRole(GroupEnums::DPS); break; } SetHealth(GetMaxHealth()); CreateArmour(phsyicalResistance, blastResistance, energyResistance, grade, quaility); }
bool Vehicle::Create(uint32 guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 vehicleId, uint32 team, const CreatureData *data) { SetMap(map); SetPhaseMask(phaseMask,false); CreatureInfo const *cinfo = sObjectMgr.GetCreatureTemplate(Entry); if(!cinfo) { sLog.outErrorDb("Creature entry %u does not exist.", Entry); return false; } Object::_Create(guidlow, Entry, HIGHGUID_VEHICLE); if(!UpdateEntry(Entry, team, data)) return false; if(!vehicleId) { CreatureDataAddon const *cainfo = GetCreatureAddon(); if(!cainfo) return false; vehicleId = cainfo->vehicle_id; } if(!SetVehicleId(vehicleId)) return false; LoadCreaturesAddon(); m_regenHealth = false; m_creation_time = getMSTime(); SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); //RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); //Notify the map's instance data. //Only works if you create the object in it, not if it is moves to that map. //Normally non-players do not teleport to other maps. if(map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData()) { ((InstanceMap*)map)->GetInstanceData()->OnCreatureCreate(this); } if(m_vehicleInfo->m_powerType == POWER_TYPE_STEAM) { setPowerType(POWER_ENERGY); SetMaxPower(POWER_ENERGY, 100); SetPower(POWER_ENERGY, 100); } else if(m_vehicleInfo->m_powerType == POWER_TYPE_PYRITE) { setPowerType(POWER_ENERGY); SetMaxPower(POWER_ENERGY, 50); SetPower(POWER_ENERGY, 50); } else { for (uint32 i = 0; i < MAX_VEHICLE_SPELLS; ++i) { if(!GetVehicleData()->v_spells[i]) continue; SpellEntry const *spellInfo = sSpellStore.LookupEntry(GetVehicleData()->v_spells[i]); if(!spellInfo) continue; if(spellInfo->powerType == POWER_MANA) break; if(spellInfo->powerType == POWER_ENERGY) { setPowerType(POWER_ENERGY); SetMaxPower(POWER_ENERGY, 100); SetPower(POWER_ENERGY, 100); break; } } } SetHealth(GetMaxHealth()); InstallAllAccessories(); return true; }
//----------------------------------------------------------------------------- // Hit by a friendly engineer's wrench //----------------------------------------------------------------------------- bool CObjectSentrygun::OnWrenchHit( CTFPlayer *pPlayer ) { bool bDidWork = false; // If the player repairs it at all, we're done if ( GetHealth() < GetMaxHealth() ) { if ( Command_Repair( pPlayer ) ) { bDidWork = true; } } // Don't put in upgrade metal until the sentry is fully healed if ( !bDidWork && CanBeUpgraded( pPlayer ) ) { int iPlayerMetal = pPlayer->GetAmmoCount( TF_AMMO_METAL ); int iAmountToAdd = min( tf_sentrygun_upgrade_per_hit.GetInt(), iPlayerMetal ); if ( iAmountToAdd > ( m_iUpgradeMetalRequired - m_iUpgradeMetal ) ) iAmountToAdd = ( m_iUpgradeMetalRequired - m_iUpgradeMetal ); if ( tf_cheapobjects.GetBool() == false ) { pPlayer->RemoveAmmo( iAmountToAdd, TF_AMMO_METAL ); } m_iUpgradeMetal += iAmountToAdd; if ( iAmountToAdd > 0 ) { bDidWork = true; } if ( m_iUpgradeMetal >= m_iUpgradeMetalRequired ) { StartUpgrading(); m_iUpgradeMetal = 0; } } if ( !IsUpgrading() ) { // player ammo into rockets // 1 ammo = 1 shell // 2 ammo = 1 rocket // only fill rockets if we have extra shells int iPlayerMetal = pPlayer->GetAmmoCount( TF_AMMO_METAL ); // If the sentry has less that 100% ammo, put some ammo in it if ( m_iAmmoShells < m_iMaxAmmoShells && iPlayerMetal > 0 ) { int iMaxShellsPlayerCanAfford = (int)( (float)iPlayerMetal / tf_sentrygun_metal_per_shell.GetFloat() ); // cap the amount we can add int iAmountToAdd = min( SENTRYGUN_ADD_SHELLS, iMaxShellsPlayerCanAfford ); iAmountToAdd = min( ( m_iMaxAmmoShells - m_iAmmoShells ), iAmountToAdd ); pPlayer->RemoveAmmo( iAmountToAdd * tf_sentrygun_metal_per_shell.GetInt(), TF_AMMO_METAL ); m_iAmmoShells += iAmountToAdd; if ( iAmountToAdd > 0 ) { bDidWork = true; } } // One rocket per two ammo iPlayerMetal = pPlayer->GetAmmoCount( TF_AMMO_METAL ); if ( m_iAmmoRockets < m_iMaxAmmoRockets && m_iUpgradeLevel == 3 && iPlayerMetal > 0 ) { int iMaxRocketsPlayerCanAfford = (int)( (float)iPlayerMetal / tf_sentrygun_metal_per_rocket.GetFloat() ); int iAmountToAdd = min( ( SENTRYGUN_ADD_ROCKETS ), iMaxRocketsPlayerCanAfford ); iAmountToAdd = min( ( m_iMaxAmmoRockets - m_iAmmoRockets ), iAmountToAdd ); pPlayer->RemoveAmmo( iAmountToAdd * tf_sentrygun_metal_per_rocket.GetFloat(), TF_AMMO_METAL ); m_iAmmoRockets += iAmountToAdd; if ( iAmountToAdd > 0 ) { bDidWork = true; } } } return bDidWork; }
void AMech_RPGCharacter::CreatePresetRole(TEnumAsByte<GroupEnums::Role> inRole, int32 grade, int32 quaility) { float blastResistance = 5; float phsyicalResistance = 5; float energyResistance = 5; float statModifier = 0; static float lowHealth = 2000; static float mediumHealth = lowHealth * 1.25; static float highHealth = mediumHealth * 1.25; Reset(); StartingRole(inRole); isPlayer = mIsChildOf(GetController(), AMech_RPGPlayerController::StaticClass()); //isAlly = mIsChildOf(GetController(), AAllyAIController::StaticClass()); //if (isAlly || isPlayer) { // statModifier = GetModifierForDifficulty(UMiscLibrary::GetDifficulty()); //} switch (inRole) { case GroupEnums::DPS: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::SMG, grade, quaility)); AddAbility(UAbility::CreateChannelledPresetAbility(this, AbilityEnums::Grenade, 1.75F, true, true)); AddAbility(UTimedHealthChange::CreateTimedHealthChange(this, 10.0F, 2.0F)); SetDefenceModifier(0.0F + statModifier); SetHealthChangeModifier(1.0F + statModifier); SetSpeedModifier(1.0F + statModifier); blastResistance = AArmour::GetDeafultValue(ArmourGrades::Light); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::MediumLight); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Light); SetMaxHealth(lowHealth * (1 + statModifier)); break; case GroupEnums::Healer: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::Bio_Repair, grade, quaility)); AddAbility(mCreatePresetAbility(AbilityEnums::Heal)); AddAbility(mCreatePresetAbility(AbilityEnums::AoEHeal)); AddAbility(UTimedHealthChange::CreateTimedHealthChange(this, 10.0F, 2.0F)); SetDefenceModifier(0.0F + statModifier); SetHealthChangeModifier(1.0F + statModifier); SetSpeedModifier(1.0F + statModifier); blastResistance = AArmour::GetDeafultValue(ArmourGrades::Light); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::MediumLight); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Light); SetMaxHealth(lowHealth * (1 + statModifier)); break; case GroupEnums::Tank: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::Shotgun, grade, quaility)); AddAbility(mCreatePresetAbility(AbilityEnums::Taunt)); AddAbility(mCreatePresetAbility(AbilityEnums::Stun)); SetDefenceModifier(0.0F + statModifier); SetHealthChangeModifier(1.0F + statModifier); SetSpeedModifier(1.0F + statModifier); blastResistance = AArmour::GetDeafultValue(ArmourGrades::MediumHeavy); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::Heavy); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); SetMaxHealth(highHealth * (1 + statModifier)); break; case GroupEnums::Sniper: SetCurrentWeapon(ALaserSniper::CreateLaserSniper(GetWorld(), this)); AddAbility(UAbility::CreateChannelledPresetAbility(this, AbilityEnums::Snipe, 2.5F, false, true)); AddAbility(mCreatePresetAbility(AbilityEnums::CritBoost)); SetDefenceModifier(0.0F + statModifier); SetHealthChangeModifier(1.0F + statModifier); blastResistance = AArmour::GetDeafultValue(ArmourGrades::Light); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::MediumLight); energyResistance = AArmour::GetDeafultValue(ArmourGrades::Light); SetMaxHealth(lowHealth * (1 + statModifier)); break; case GroupEnums::Support: SetCurrentWeapon(mCreatePresetWeapon(WeaponEnums::Shotgun, grade, quaility)); AddAbility(USummonDamageDrone::CreateAbility(20, this)); AddAbility(mCreatePresetAbility(AbilityEnums::Shield)); AddAbility(mCreatePresetAbility(AbilityEnums::Disable)); SetDefenceModifier(0.0F + statModifier); SetHealthChangeModifier(1.0F + statModifier); blastResistance = AArmour::GetDeafultValue(ArmourGrades::MediumLight); phsyicalResistance = AArmour::GetDeafultValue(ArmourGrades::Medium); energyResistance = AArmour::GetDeafultValue(ArmourGrades::MediumLight); SetMaxHealth(mediumHealth * (1 + statModifier)); break; default: CreatePresetRole(GroupEnums::DPS); break; } SetHealth(GetMaxHealth()); CreateArmour(phsyicalResistance, blastResistance, energyResistance, grade, quaility); }
void CUser::Regene(uint8 regene_type, uint32 magicid /*= 0*/) { ASSERT(GetMap() != nullptr); _OBJECT_EVENT* pEvent = nullptr; _START_POSITION* pStartPosition = nullptr; float x = 0.0f, z = 0.0f; if (!isDead()) return; if (regene_type != 1 && regene_type != 2) regene_type = 1; if (regene_type == 2) { magicid = 490041; // The Stone of Ressurection magic ID // Is our level high enough to be able to resurrect using this skill? if (GetLevel() <= 5 // Do we have enough resurrection stones? || !RobItem(379006000, 3 * GetLevel())) return; } // If we're in a home zone, we'll want the coordinates from there. Otherwise, assume our own home zone. pStartPosition = g_pMain->m_StartPositionArray.GetData(GetZoneID()); if (pStartPosition == nullptr) return; UserInOut(INOUT_OUT); pEvent = GetMap()->GetObjectEvent(m_sBind); // If we're not using a spell to resurrect. if (magicid == 0) { // Resurrect at a bind/respawn point if (pEvent && pEvent->byLife == 1) { SetPosition(pEvent->fPosX + x, 0.0f, pEvent->fPosZ + z); } // Are we trying to respawn in a home zone? // If we're in a war zone (aside from snow wars, which apparently use different coords), use BattleZone coordinates. else if ((GetZoneID() <= ZONE_ELMORAD) || (GetZoneID() != ZONE_SNOW_BATTLE && GetZoneID() == (ZONE_BATTLE_BASE + g_pMain->m_byBattleZone))) { // Use the proper respawn area for our nation, as the opposite nation can // enter this zone at a war's invasion stage. x = (float)((GetNation() == KARUS ? pStartPosition->sKarusX : pStartPosition->sElmoradX) + myrand(0, pStartPosition->bRangeX)); z = (float)((GetNation() == KARUS ? pStartPosition->sKarusZ : pStartPosition->sElmoradZ) + myrand(0, pStartPosition->bRangeZ)); } else { // If we're in a war zone (aside from snow wars, which apparently use different coords), use BattleZone coordinates. if (GetZoneID() == ZONE_MORADON && isInArena()) { x = (float)(MINI_ARENA_RESPAWN_X + myrand(-MINI_ARENA_RESPAWN_RADIUS, MINI_ARENA_RESPAWN_RADIUS)); z = (float)(MINI_ARENA_RESPAWN_Z + myrand(-MINI_ARENA_RESPAWN_RADIUS, MINI_ARENA_RESPAWN_RADIUS)); } // For all else, just grab the start position (/town coordinates) from the START_POSITION table. else { short sx, sz; GetStartPosition(sx, sz); x = sx; z = sz; } } SetPosition(x, 0.0f, z); m_bResHpType = USER_STANDING; m_bRegeneType = REGENE_NORMAL; } else // we're respawning using a resurrect skill. { _MAGIC_TYPE5 * pType = g_pMain->m_Magictype5Array.GetData(magicid); if (pType == nullptr) return; MSpChange(-m_iMaxMp); // reset us to 0 MP. if (m_sWhoKilledMe == -1) ExpChange((m_iLostExp * pType->bExpRecover) / 100); // Restore m_bResHpType = USER_STANDING; m_bRegeneType = REGENE_MAGIC; } Packet result(WIZ_REGENE); result << GetSPosX() << GetSPosZ() << GetSPosY(); Send(&result); HpChange(GetMaxHealth()); m_tLastRegeneTime = UNIXTIME; m_sWhoKilledMe = -1; m_iLostExp = 0; if (magicid == 0) BlinkStart(); if (!isBlinking()) { result.Initialize(AG_USER_REGENE); result << GetSocketID() << m_sHp; Send_AIServer(&result); } SetRegion(GetNewRegionX(), GetNewRegionZ()); UserInOut(INOUT_RESPAWN); g_pMain->RegionUserInOutForMe(this); g_pMain->RegionNpcInfoForMe(this); InitializeStealth(); SendUserStatusUpdate(USER_STATUS_DOT, USER_STATUS_CURE); SendUserStatusUpdate(USER_STATUS_POISON, USER_STATUS_CURE); if (isInArena()) SendUserStatusUpdate(USER_STATUS_SPEED, USER_STATUS_CURE); RecastSavedMagic(); // If we actually respawned (i.e. we weren't resurrected by a skill)... if (magicid == 0) { // In PVP zones (not war zones), we must kick out players if they no longer // have any national points. if (GetLoyalty() == 0 && (GetMap()->isWarZone() || isInPKZone() || Event())) KickOutZoneUser(); } }
void CActor::OnEvent(NET_Packet& P, u16 type) { inherited::OnEvent (P,type); CInventoryOwner::OnEvent (P,type); u16 id; switch (type) { case GE_TRADE_BUY: case GE_OWNERSHIP_TAKE: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id).c_str() ); VERIFY2 ( Obj, make_string("GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id).c_str() ); if ( !Obj ) { Msg ( "! GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id ); break; } CGameObject* _GO = smart_cast<CGameObject*>(Obj); if (!IsGameTypeSingle() && !g_Alive()) { Msg("! WARNING: dead player [%d][%s] can't take items [%d][%s]", ID(), Name(), _GO->ID(), _GO->cNameSect().c_str()); break; } if( inventory().CanTakeItem(smart_cast<CInventoryItem*>(_GO)) ) { Obj->H_SetParent (smart_cast<CObject*>(this)); #ifdef MP_LOGGING string64 act; xr_strcpy( act, (type == GE_TRADE_BUY)? "buys" : "takes" ); Msg("--- Actor [%d][%s] %s [%d][%s]", ID(), Name(), act, _GO->ID(), _GO->cNameSect().c_str()); #endif // MP_LOGGING inventory().Take (_GO, false, true); SelectBestWeapon(Obj); } else { if (IsGameTypeSingle()) { NET_Packet P; u_EventGen (P,GE_OWNERSHIP_REJECT,ID()); P.w_u16 (u16(Obj->ID())); u_EventSend (P); } else { Msg("! ERROR: Actor [%d][%s] tries to drop on take [%d][%s]", ID(), Name(), _GO->ID(), _GO->cNameSect().c_str()); } } } break; case GE_TRADE_SELL: case GE_OWNERSHIP_REJECT: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GE_OWNERSHIP_REJECT: Object not found, id = %d", id).c_str() ); VERIFY2 ( Obj, make_string("GE_OWNERSHIP_REJECT: Object not found, id = %d", id).c_str() ); if ( !Obj ) { Msg ( "! GE_OWNERSHIP_REJECT: Object not found, id = %d", id ); break; } bool just_before_destroy = !P.r_eof() && P.r_u8(); bool dont_create_shell = (type==GE_TRADE_SELL) || just_before_destroy; Obj->SetTmpPreDestroy (just_before_destroy); CGameObject * GO = smart_cast<CGameObject*>(Obj); #ifdef MP_LOGGING string64 act; xr_strcpy( act, (type == GE_TRADE_SELL)? "sells" : "rejects" ); Msg("--- Actor [%d][%s] %s [%d][%s]", ID(), Name(), act, GO->ID(), GO->cNameSect().c_str()); #endif // MP_LOGGING VERIFY( GO->H_Parent() ); if ( !GO->H_Parent() ) { Msg("! ERROR: Actor [%d][%s] tries to reject item [%d][%s] that has no parent", ID(), Name(), GO->ID(), GO->cNameSect().c_str()); break; } VERIFY2( GO->H_Parent()->ID() == ID(), make_string("actor [%d][%s] tries to drop not own object [%d][%s]", ID(), Name(), GO->ID(), GO->cNameSect().c_str() ).c_str() ); if ( GO->H_Parent()->ID() != ID() ) { CActor* real_parent = smart_cast<CActor*>(GO->H_Parent()); Msg("! ERROR: Actor [%d][%s] tries to drop not own item [%d][%s], his parent is [%d][%s]", ID(), Name(), GO->ID(), GO->cNameSect().c_str(), real_parent->ID(), real_parent->Name()); break; } if (!Obj->getDestroy() && inventory().DropItem(GO, just_before_destroy, dont_create_shell)) { //O->H_SetParent(0,just_before_destroy);//moved to DropItem //feel_touch_deny(O,2000); Level().m_feel_deny.feel_touch_deny(Obj, 1000); // [12.11.07] Alexander Maniluk: extended GE_OWNERSHIP_REJECT packet for drop item to selected position Fvector dropPosition; if (!P.r_eof()) { P.r_vec3(dropPosition); GO->MoveTo(dropPosition); //Other variant :) /*NET_Packet MovePacket; MovePacket.w_begin(M_MOVE_ARTEFACTS); MovePacket.w_u8(1); MovePacket.w_u16(id); MovePacket.w_vec3(dropPosition); u_EventSend(MovePacket);*/ } } if (!just_before_destroy) SelectBestWeapon(Obj); } break; case GE_INV_ACTION: { u16 cmd; P.r_u16 (cmd); u32 flags; P.r_u32 (flags); s32 ZoomRndSeed = P.r_s32(); s32 ShotRndSeed = P.r_s32(); if (!IsGameTypeSingle() && !g_Alive()) { // Msg("! WARNING: dead player tries to rize inventory action"); break; } if (flags & CMD_START) { if (cmd == kWPN_ZOOM) SetZoomRndSeed(ZoomRndSeed); if (cmd == kWPN_FIRE) SetShotRndSeed(ShotRndSeed); IR_OnKeyboardPress(cmd); } else IR_OnKeyboardRelease(cmd); } break; case GEG_PLAYER_ITEM2SLOT: case GEG_PLAYER_ITEM2BELT: case GEG_PLAYER_ITEM2RUCK: case GEG_PLAYER_ITEM_EAT: case GEG_PLAYER_ACTIVATEARTEFACT: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id).c_str() ); VERIFY2 ( Obj, make_string("GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id).c_str() ); if ( !Obj ) { // Msg ( "! GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id ); break; } // R_ASSERT2( !Obj->getDestroy(), make_string("GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id).c_str() ); VERIFY2 ( !Obj->getDestroy(), make_string("GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id).c_str() ); if ( Obj->getDestroy() ) { // Msg ( "! GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id ); break; } if (!IsGameTypeSingle() && !g_Alive()) { Msg("! WARNING: dead player [%d][%s] can't use items [%d][%s]", ID(), Name(), Obj->ID(), Obj->cNameSect().c_str()); break; } if ( type == GEG_PLAYER_ACTIVATEARTEFACT ) { CArtefact* pArtefact = smart_cast<CArtefact*>(Obj); // R_ASSERT2( pArtefact, make_string("GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id).c_str() ); VERIFY2 ( pArtefact, make_string("GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id).c_str() ); if ( !pArtefact ) { Msg ( "! GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id ); break;//1 } pArtefact->ActivateArtefact (); break;//1 } PIItem iitem = smart_cast<CInventoryItem*>(Obj); R_ASSERT( iitem ); switch (type) { case GEG_PLAYER_ITEM2SLOT: { u16 slot_id = P.r_u16(); inventory().Slot(slot_id, iitem ); }break;//2 case GEG_PLAYER_ITEM2BELT: inventory().Belt( iitem ); break;//2 case GEG_PLAYER_ITEM2RUCK: inventory().Ruck( iitem ); break;//2 case GEG_PLAYER_ITEM_EAT: inventory().Eat( iitem ); break;//2 }//switch }break;//1 case GEG_PLAYER_ACTIVATE_SLOT: { u16 slot_id; P.r_u16 (slot_id); inventory().Activate (slot_id); }break; case GEG_PLAYER_DISABLE_SPRINT: { s8 cmd = P.r_s8(); m_block_sprint_counter = m_block_sprint_counter+cmd; Msg("m_block_sprint_counter=%d",m_block_sprint_counter); if(m_block_sprint_counter>0) { mstate_wishful &=~mcSprint; } }break; case GEG_PLAYER_WEAPON_HIDE_STATE: { u16 State = P.r_u16(); BOOL Set = !!P.r_u8(); inventory().SetSlotsBlocked (State, !!Set); }break; case GE_MOVE_ACTOR: { Fvector NewPos, NewRot; P.r_vec3(NewPos); P.r_vec3(NewRot); MoveActor(NewPos, NewRot); }break; case GE_ACTOR_MAX_POWER: { conditions().MaxPower(); conditions().ClearWounds(); ClearBloodWounds(); }break; case GE_ACTOR_MAX_HEALTH: { SetfHealth(GetMaxHealth()); }break; case GEG_PLAYER_ATTACH_HOLDER: { u16 id = P.r_u16(); CObject* O = Level().Objects.net_Find (id); if (!O){ Msg("! Error: No object to attach holder [%d]", id); break; } VERIFY(m_holder==NULL); CHolderCustom* holder = smart_cast<CHolderCustom*>(O); if(!holder->Engaged()) use_Holder (holder); }break; case GEG_PLAYER_DETACH_HOLDER: { if (!m_holder) break; u16 id = P.r_u16(); CGameObject* GO = smart_cast<CGameObject*>(m_holder); VERIFY (id==GO->ID()); use_Holder (NULL); }break; case GEG_PLAYER_PLAY_HEADSHOT_PARTICLE: { OnPlayHeadShotParticle(P); }break; case GE_ACTOR_JUMPING: { /* Fvector dir; P.r_dir(dir); float jump = P.r_float(); NET_SavedAccel = dir; extern float NET_Jump; NET_Jump = jump; m_bInInterpolation = false; mstate_real |= mcJump; */ }break; } }
bool cWither::IsArmored(void) const { return GetHealth() <= (GetMaxHealth() / 2); }
void Creature::Update(uint32 diff) { switch( m_deathState ) { case JUST_DIED: // Dont must be called, see Creature::setDeathState JUST_DIED -> CORPSE promoting. sLog.outError("Creature (GUIDLow: %u Entry: %u ) in wrong state: JUST_DEAD (1)",GetGUIDLow(),GetEntry()); break; case DEAD: { if( m_respawnTime <= time(NULL) ) { DEBUG_LOG("Respawning..."); m_respawnTime = 0; CreatureInfo const *cinfo = objmgr.GetCreatureTemplate(this->GetEntry()); SelectLevel(cinfo); SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0); RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); SetHealth(GetMaxHealth()); setDeathState( ALIVE ); clearUnitState(UNIT_STAT_ALL_STATE); i_motionMaster.Clear(); MapManager::Instance().GetMap(GetMapId(), this)->Add(this); } break; } case CORPSE: { if( m_deathTimer <= diff ) { m_deathTimer = 0; DEBUG_LOG("Removing corpse... %u ", GetUInt32Value(OBJECT_FIELD_ENTRY)); ObjectAccessor::Instance().RemoveCreatureCorpseFromPlayerView(this); lootForPickPocketed = false; lootForBody = false; loot.clear(); setDeathState(DEAD); m_respawnTime = time(NULL) + m_respawnDelay; float x,y,z; GetRespawnCoord(x, y, z); MapManager::Instance().GetMap(GetMapId(), this)->CreatureRelocation(this,x,y,z,GetOrientation()); } else { m_deathTimer -= diff; if (m_groupLootTimer && lootingGroupLeaderGUID) { if(diff <= m_groupLootTimer) { m_groupLootTimer -= diff; } else { Group* group = objmgr.GetGroupByLeader(lootingGroupLeaderGUID); if (group) group->EndRoll(); m_groupLootTimer = 0; lootingGroupLeaderGUID = 0; } } } break; } case ALIVE: { Unit::Update( diff ); i_motionMaster.UpdateMotion(diff); i_AI->UpdateAI(diff); if(m_regenTimer > 0) { if(diff >= m_regenTimer) m_regenTimer = 0; else m_regenTimer -= diff; } if (m_regenTimer != 0) break; if (!isInCombat()) { RegenerateHealth(); RegenerateMana(); } m_regenTimer = 2000; break; } default: break; } }
int CAI_PlayerAlly::TranslateSchedule( int scheduleType ) { switch( scheduleType ) { case SCHED_TARGET_FACE: // speak during 'use' if (random->RandomInt(0,99) < 2) //Msg("target chase speak\n" ); return SCHED_TALKER_IDLE_SPEAK_WAIT; // If we're hurt, look for a healthkit if ( m_flLastHealthKitSearch < gpGlobals->curtime && GetHealth() <= GetMaxHealth() / 2 ) return SCHED_TALKER_LOOK_FOR_HEALTHKIT; break; case SCHED_ALERT_STAND: // If we're hurt, look for a healthkit if ( m_flLastHealthKitSearch < gpGlobals->curtime && GetHealth() <= GetMaxHealth() / 2 ) return SCHED_TALKER_LOOK_FOR_HEALTHKIT; break; case SCHED_IDLE_STAND: { // if never seen player, try to greet him if (GetExpresser()->CanSpeakConcept( TLK_HELLO) && !GetExpresser()->SpokeConcept(TLK_HELLO)) { return SCHED_TALKER_IDLE_HELLO; } // If we're hurt, look for a healthkit if ( m_flLastHealthKitSearch < gpGlobals->curtime && GetHealth() <= GetMaxHealth() / 2 ) return SCHED_TALKER_LOOK_FOR_HEALTHKIT; // sustained light wounds? if (GetExpresser()->CanSpeakConcept( TLK_WOUND) && !GetExpresser()->SpokeConcept(TLK_WOUND) && (m_iHealth <= (m_iMaxHealth * 0.75))) { Speak( TLK_WOUND ); return SCHED_IDLE_STAND; } // sustained heavy wounds? else if (GetExpresser()->CanSpeakConcept( TLK_MORTAL) && (m_iHealth <= (m_iMaxHealth * 0.5))) { Speak( TLK_MORTAL ); return SCHED_IDLE_STAND; } // talk about world if (IsOkToSpeak() && random->RandomInt(0,m_nSpeak * 2) == 0) { //Msg("standing idle speak\n" ); return SCHED_TALKER_IDLE_SPEAK; } if ( !GetExpresser()->IsSpeaking() && HasCondition ( COND_SEE_PLAYER ) && random->RandomInt( 0, 6 ) == 0 ) { CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance( engine->PEntityOfEntIndex( 1 ) ); Assert( pPlayer ); if ( pPlayer ) { // watch the client. Vector forward; AngleVectors( pPlayer->GetLocalAngles(), &forward ); if ( ( pPlayer->GetLocalOrigin() - GetLocalOrigin() ).Length2D() < TLK_STARE_DIST && UTIL_DotPoints( pPlayer->GetLocalOrigin(), GetLocalOrigin(), forward ) >= m_flFieldOfView ) { // go into the special STARE schedule if the player is close, and looking at me too. return SCHED_TALKER_IDLE_WATCH_CLIENT_STARE; } return SCHED_TALKER_IDLE_WATCH_CLIENT; } } else { if (GetExpresser()->IsSpeaking()) // look at who we're talking to return SCHED_TALKER_IDLE_EYE_CONTACT; else // regular standing idle return SCHED_IDLE_STAND; } } break; case SCHED_CHASE_ENEMY_FAILED: { int baseType = BaseClass::TranslateSchedule(scheduleType); if ( baseType != SCHED_CHASE_ENEMY_FAILED ) return baseType; return SCHED_TAKE_COVER_FROM_ENEMY; } break; } return BaseClass::TranslateSchedule( scheduleType ); }
void CSDKPlayer::PostThink() { BaseClass::PostThink(); // Keep the model upright; pose params will handle pitch aiming. QAngle angles = GetLocalAngles(); angles[PITCH] = 0; SetLocalAngles(angles); if ( m_flNextMouseoverUpdate < gpGlobals->curtime ) { m_flNextMouseoverUpdate = gpGlobals->curtime + 0.2f; if ( m_bShowHints ) { #ifdef PLAYER_MOUSEOVER_HINTS UpdateMouseoverHints(); #endif } } #ifdef PLAYER_HEALTH_REGEN // Regenerate heath after 3 seconds if ( IsAlive() && GetHealth() < GetMaxHealth() ) { // Color to overlay on the screen while the player is taking damage color32 hurtScreenOverlay = {64,0,0,64}; if ( gpGlobals->curtime > m_fTimeLastHurt + sv_regeneration_wait_time.GetFloat() ) { TakeHealth( 1, DMG_GENERIC ); m_bIsRegenerating = true; if ( GetHealth() >= GetMaxHealth() ) { m_bIsRegenerating = false; } } else { m_bIsRegenerating = false; UTIL_ScreenFade( this, hurtScreenOverlay, 1.0f, 0.1f, FFADE_IN|FFADE_PURGE ); } } #else // HACK!: Make it so that when we fall, we show red! if ( IsAlive() && GetHealth() < GetMaxHealth() ) { // Color to overlay on the screen while the player is taking damage color32 hurtScreenOverlay = {64,0,0,64}; if ( gpGlobals->curtime > m_fTimeLastHurt + sv_regeneration_wait_time.GetFloat() ) { if ( GetHealth() >= GetMaxHealth() ) { // Nothing at all??? } } else { UTIL_ScreenFade( this, hurtScreenOverlay, 1.0f, 0.1f, FFADE_IN|FFADE_PURGE ); } } #endif }