void ZGame::OnExplosionGrenade(MUID uidOwner,rvector pos,float fDamage,float fRange,float fMinDamage,float fKnockBack,MMatchTeam nTeamID)
{
ZObject* pTarget = NULL;
float fDist,fDamageRange;
for(ZObjectManager::iterator itor = m_ObjectManager.begin(); itor != m_ObjectManager.end(); ++itor)
{
pTarget = (*itor).second;
bool bReturnValue = !pTarget || pTarget->IsDie();
if( !pTarget || pTarget->IsDie())
PROTECT_DEBUG_REGISTER(bReturnValue)
continue;
fDist = Magnitude(pos-(pTarget->GetPosition()+rvector(0,0,80)));
bReturnValue = fDist >=fRange;
if(fDist >= fRange)
PROTECT_DEBUG_REGISTER(bReturnValue)
continue;
rvector dir=pos-(pTarget->GetPosition()+rvector(0,0,80));
Normalize(dir);
if(GetDistance(pos,pTarget->GetPosition()+rvector(0,0,50),pTarget->GetPosition()+rvector(0,0,130))<50)
{
fDamageRange = 1.f;
}
else
{
#define MAX_DMG_RANGE 50.f
fDamageRange = 1.f - (1.f-fMinDamage)*( max(fDist-MAX_DMG_RANGE,0) / (fRange-MAX_DMG_RANGE));
}
ZActor* pATarget = MDynamicCast(ZActor,pTarget);
bool bPushSkip = false;
if(pATarget)
{
bPushSkip = pATarget->GetNPCInfo()->bNeverPushed;
}
if(bPushSkip==false)
{
pTarget->AddVelocity(fKnockBack*7.f*(fRange-fDist)*-dir);
}
else
{
ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met");
}
ZCharacter* pOwnerCharacter = ZGetGame()->m_CharacterManager.Find( uidOwner );
if(pOwnerCharacter)
{
CheckCombo(pOwnerCharacter, pTarget,!bPushSkip);
CheckStylishAction(pOwnerCharacter);
}
float fActualDamage = fDamage * fDamageRange;
float fRatio = ZItem::GetPiercingRatio( MWT_FRAGMENTATION , eq_parts_chest );
pTarget->OnDamaged(pOwnerCharacter,pos,ZD_EXPLOSION,MWT_FRAGMENTATION,fActualDamage,fRatio);
}
#define SHOCK_RANGE 1500.f
ZCharacter *pTargetCharacter=ZGetGameInterface()->GetCombatInterface()->GetTargetCharacter();
float fPower= (SHOCK_RANGE-Magnitude(pTargetCharacter->GetPosition()+rvector(0,0,50) - pos))/SHOCK_RANGE;
if(fPower>0)
ZGetGameInterface()->GetCamera()->Shock(fPower*500.f, .5f, rvector(0.0f, 0.0f, -1.0f));
GetWorld()->GetWaters()->CheckSpearing( pos, pos + rvector(0,0,MAX_WATER_DEEP), 500, 0.8f );
}