Code:
//jintriple3 µð¹ö±× ·¹Áö½ºÅÍ ÇØÅ· ¹æÁö ÄÚµå »ðÀÔ
void ZGame::OnPeerShot_Range_Damaged(ZObject* pOwner, float fShotTime, const rvector& pos, const rvector& to, ZPICKINFO pickinfo, DWORD dwPickPassFlag, rvector& v1, rvector& v2, ZItem *pItem, rvector& BulletMarkNormal, bool& bBulletMark, ZTargetType& nTargetType)
{
MMatchItemDesc *pDesc = pItem->GetDesc();
bool bReturnValue = !pDesc;
if(!pDesc) PROTECT_DEBUG_REGISTER(bReturnValue){ return; }
rvector dir = to - pos;
bReturnValue = !(ZGetGame()->PickHistory(pOwner,fShotTime,pos,to, &pickinfo,dwPickPassFlag));
if(!(ZGetGame()->PickHistory(pOwner,fShotTime,pos,to, &pickinfo,dwPickPassFlag)))
{
PROTECT_DEBUG_REGISTER(bReturnValue)
{
v1 = pos;
v2 = pos+dir*10000.f;
nTargetType = ZTT_NOTHING;
return;
}
}
// ¶«»§ -bird
//jintriple3 µð¹ö±× ·¹Áö½ºÅÍ ÇØÅ· ¹æÁö ÄÚµå
bReturnValue = (!pickinfo.pObject) && (!pickinfo.bBspPicked);
if(pickinfo.bBspPicked)
{
PROTECT_DEBUG_REGISTER(pickinfo.nBspPicked_DebugRegister == FOR_DEBUG_REGISTER)
{
nTargetType = ZTT_OBJECT;
v1 = pos;
v2 = pickinfo.bpi.PickPos;
// ÃÑź ÈçÀû
BulletMarkNormal.x = pickinfo.bpi.pInfo->plane.a;
BulletMarkNormal.y = pickinfo.bpi.pInfo->plane.b;
BulletMarkNormal.z = pickinfo.bpi.pInfo->plane.c;
Normalize(BulletMarkNormal);
bBulletMark = true;
return;
}
}
else if( (!pickinfo.pObject) && (!pickinfo.bBspPicked) )
{
PROTECT_DEBUG_REGISTER(bReturnValue)
{
//_ASSERT(false);
return;
}
}
//À§¿¡±îÁö´Â °Ë»ç ´Ü°è...
ZObject *pObject = pickinfo.pObject;
bool bGuard = pObject->IsGuard() && (pickinfo.info.parts!=eq_parts_legs) && // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
DotProduct(dir,pObject->GetDirection())<0;
if(pObject->IsGuard() && (pickinfo.info.parts!=eq_parts_legs) && // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
DotProduct(dir,pObject->GetDirection())<0) //¿©±âµµ..
{
PROTECT_DEBUG_REGISTER(bGuard)
{
nTargetType = ZTT_CHARACTER_GUARD;
// ¸·¾Ò´Ù
rvector t_pos = pObject->GetPosition();
t_pos.z += 100.f;
ZGetEffectManager()->AddSwordDefenceEffect(t_pos+(-dir*50.f),-dir);
pObject->OnGuardSuccess();
v1 = pos;
v2 = pickinfo.info.vOut;
return;
}
}
nTargetType = ZTT_CHARACTER;
ZActor* pATarget = MDynamicCast(ZActor,pickinfo.pObject);
bool bPushSkip = false;
if(pATarget)
{
bPushSkip = pATarget->GetNPCInfo()->bNeverPushed;
}
float fKnockbackForce = pItem->GetKnockbackForce();
if(bPushSkip)
{
// ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met");
rvector vPos = pOwner->GetPosition() + (pickinfo.pObject->GetPosition() - pOwner->GetPosition()) * 0.1f;
ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met", vPos );
fKnockbackForce = 1.0f;
}
pickinfo.pObject->OnKnockback( pOwner->m_Direction, fKnockbackForce );
float fActualDamage = CalcActualDamage(pOwner, pickinfo.pObject, (float)pDesc->m_nDamage.Ref());
float fRatio = pItem->GetPiercingRatio( pDesc->m_nWeaponType.Ref(), pickinfo.info.parts );
ZDAMAGETYPE dt = (pickinfo.info.parts==eq_parts_head) ? ZD_BULLET_HEADSHOT : ZD_BULLET;
if(pickinfo.pObject->IsNPC() || strstr(ZGetGameClient()->GetStageName(), "[L]") || (pOwner->GetUID().Low != ZGetGameClient()->GetPlayerUID().Low && pickinfo.pObject->GetUID().Low != ZGetGameClient()->GetPlayerUID().Low))
{
pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio );
}
else if(pOwner->GetUID().Low == ZGetGameClient()->GetPlayerUID().Low && !(((ZCharacter*)pickinfo.pObject)->m_dwStatusBitPackingValue.Ref().m_bLostConEffect))
{
((ZCharacter*)pickinfo.pObject)->OnDamaged_AntiLead(pOwner, pOwner->GetPosition(), ((ZCharacter*)pOwner)->GetItems()->GetSelectedWeaponParts(), pickinfo.info.parts, dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio );
pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio );
}
if(pOwner == m_pMyCharacter)
{
CheckCombo(m_pMyCharacter,pickinfo.pObject,!bPushSkip);
CheckStylishAction(m_pMyCharacter);
}
v1 = pos;
v2 = pickinfo.info.vOut;
}
void ZGame::OnPeerShot_Range(const MMatchCharItemParts sel_type, const MUID& uidOwner, float fShotTime, const rvector& pos, const rvector& to)
{
ZObject *pOwner = m_ObjectManager.GetObject(uidOwner);
if(!pOwner) return;
ZItem *pItem = pOwner->GetItems()->GetItem(sel_type);
if(!pItem) return;
MMatchItemDesc *pDesc = pItem->GetDesc();
if(!pDesc) { return; }
rvector dir = to - pos;
Normalize(dir);
rvector v1, v2;
rvector BulletMarkNormal;
bool bBulletMark = false;
ZTargetType nTargetType = ZTT_OBJECT;
// ZCharacter* pCharacter = NULL;
ZPICKINFO pickinfo;
memset(&pickinfo,0,sizeof(ZPICKINFO));
// ÃѾËÀº ·ÎÄÏÀÌ Åë°úÇϴ°÷µµ Åë°úÇÑ´Ù
const DWORD dwPickPassFlag=RM_FLAG_ADDITIVE | RM_FLAG_HIDE | RM_FLAG_PASSROCKET | RM_FLAG_PASSBULLET;
// ½î´Â ij¸¯ÅÍ Èçµé¾î ÁÖ±â..
pOwner->Tremble(8.f, 50, 30);
//jintriple3 µð¹ö±× ·¹Áö½ºÅÍ ÇÙ ¹æÁö¸¦ À§ÇØ ÇÔ¼ö·Î »°´Ù..±Ùµ¥ ÀÎÀÚ°¡ ³ÑÈå ¸¹¾Æ..¤Ì¤Ì
OnPeerShot_Range_Damaged(pOwner, fShotTime, pos, to, pickinfo, dwPickPassFlag,v1, v2, pItem, BulletMarkNormal, bBulletMark, nTargetType);
bool bPlayer = false;
//bool b3D = (pOwnerCharacter!=m_pMyCharacter); // ÀڱⰡ ³»´Â »ç¿îµå´Â 2D·Î Ãâ·ÂÇÑ´Ù.
//rvector Pos = pOwnerCharacter->GetPosition();
rvector Pos = v1;
if(pOwner==m_pMyCharacter)
{
Pos = RCameraPosition;
bPlayer = true;
}
ZCharacter *pTargetCharacter=ZGetGameInterface()->GetCombatInterface()->GetTargetCharacter();
ZApplication::GetSoundEngine()->PlaySEFire(pDesc, Pos.x, Pos.y, Pos.z, bPlayer);
//if(nTargetType == ZTT_OBJECT) { ZApplication::GetSoundEngine()->PlaySERicochet(v2.x, v2.y, v2.z); }
#define SOUND_CULL_DISTANCE 1500.0F
if( D3DXVec3LengthSq(&(v2 - pTargetCharacter->GetPosition())) < (SOUND_CULL_DISTANCE * SOUND_CULL_DISTANCE) )
{
if(nTargetType == ZTT_OBJECT) {
ZGetSoundEngine()->PlaySEHitObject( v2.x, v2.y, v2.z, pickinfo.bpi );
}
if(nTargetType == ZTT_CHARACTER) {
ZGetSoundEngine()->PlaySEHitBody(v2.x, v2.y, v2.z);
}
}
//// º¸ÀÌÁö ¾ÊÀ¸¸é ÀÌÆåÆ®¸¦ ±×¸±ÇÊ¿ä´Â ¾ø´Ù - Á¤È®ÇÑ ÄøµÀ» ¿ä¸Á.. by bird
//if(!pOwner->IsRendered()) return;
// ½î´Â°÷ ¹Ý°æ 100cm °¡ ȸ鿡 µé¾î°¡´ÂÁö üũÇÑ´Ù
bool bDrawFireEffects = isInViewFrustum(v1,100.f,RGetViewFrustum());
if(!isInViewFrustum(v1,v2,RGetViewFrustum()) // ½î´Â°÷¿¡¼ ¸Â´Â°÷ÀÇ ¶óÀÎÀÌ º¸ÀÌ´ÂÁö..
&& !bDrawFireEffects) return; // ½î´Â°÷¿¡¼µµ ±×¸±°Ô ¾ø´ÂÁö..
bool bDrawTargetEffects = isInViewFrustum(v2,100.f,RGetViewFrustum());
/////////////////////// ÀÌÈÄ´Â ÀÌÆåÆ® Ãß°¡
// ¹°Æ¢´Â ÀÌÆåÆ® üũ
GetWorld()->GetWaters()->CheckSpearing( v1, v2, 250, 0.3 );
// TODO: NPC ÀÇ Ãѱ¸À§Ä¡ ÀÎÅÍÆäÀ̽º°¡ È®Á¤µÇ¸é ¸¶Àú Ãß°¡ÇÏÀÚ.
// ZCharacter *pOwnerCharacter = m_CharacterManager.Find(uidOwner);
ZCharacterObject* pCOwnerObject = MDynamicCast(ZCharacterObject, pOwner);
if(pCOwnerObject)
{
// Ãѱ¸ È¿°ÀÌÆåÆ®
rvector pdir = v2-v1;
Normalize(pdir);
int size = 3;
rvector v[6];
// size = GetWeapondummyPos(pOwnerCharacter,v);
if(pCOwnerObject->IsRendered())
size = pCOwnerObject->GetWeapondummyPos(v);
else
{
size = 6;
v[0] = v[1] = v[2] = v1;
v[3] = v[4] = v[5] = v[0];
}
MMatchWeaponType wtype = pDesc->m_nWeaponType.Ref();
bool bSlugOutput = pDesc->m_bSlugOutput; // źÇÇÀûÃâ(true, false)
// Effect
if(bBulletMark==false) BulletMarkNormal = -pdir;
ZGetEffectManager()->AddShotEffect( v , size , v2, BulletMarkNormal, nTargetType, wtype, bSlugOutput, pCOwnerObject,bDrawFireEffects,bDrawTargetEffects);
// ÃÑ ½ò¶§ ¶óÀÌÆ® Ãß°¡
ZCharacterObject* pChar;
if( ZGetConfiguration()->GetVideo()->bDynamicLight && pCOwnerObject != NULL )
{
pChar = pCOwnerObject;
if( pChar->m_bDynamicLight )
{
pChar->m_vLightColor = g_CharLightList[GUN].vLightColor;
pChar->m_fLightLife = g_CharLightList[GUN].fLife;
}
else
{
pChar->m_bDynamicLight = true;
pChar->m_vLightColor = g_CharLightList[GUN].vLightColor;
pChar->m_vLightColor.x = 1.0f;
pChar->m_iDLightType = GUN;
pChar->m_fLightLife = g_CharLightList[GUN].fLife;
}
}
}
// ±ê¹ß¿¡ Èû Àû¿ë p
GetWorld()->GetFlags()->CheckSpearing( v1, v2, BULLET_SPEAR_EMBLEM_POWER );
if(Z_VIDEO_DYNAMICLIGHT)
ZGetStencilLight()->AddLightSource( v1, 2.0f, 75 );
}
void ZGame::OnPeerShot_Shotgun(ZItem *pItem, ZCharacter* pOwnerCharacter, float fShotTime, const rvector& pos, const rvector& to)
{
vector<ZAntiLeadTemporaryInfo*> vInfo;
char nSelType = 0;
// ³» ij¸¯ÅÍ È¤Àº ³»°¡ º¸°íÀִ ij¸¯ÅÍ
ZCharacter *pTargetCharacter = ZGetGameInterface()->GetCombatInterface()->GetTargetCharacter();
if(!pTargetCharacter) return;
MMatchItemDesc *pDesc = pItem->GetDesc();
if(!pDesc) { return; }
#define SHOTGUN_BULLET_COUNT 12
#define SHOTGUN_DIFFUSE_RANGE 0.1f
if (pOwnerCharacter == NULL) return;
// ¸ðµç»ç¶÷ÀÌ °°Àº random seed ¸¦ °®µµ·Ï °°Àº°ªÀ¸·Î ÃʱâÈ ÇØÁØ´Ù
int *seed=(int*)&fShotTime;
srand(*seed);
bool bHitGuard=false,bHitBody=false,bHitGround=false,bHitEnemy=false;
rvector GuardPos,BodyPos,GroundPos;
bool waterSound = false;
rvector v1, v2;
rvector dir;
rvector origdir = to - pos;
Normalize(origdir);
int nHitCount = 0;
int nPelletCount = SHOTGUN_BULLET_COUNT;
for(int i=0;i<nPelletCount;i++)
{
dir = origdir;
{
// ¿ÀÂ÷°ª - ¹Ýµ¿´ë½Å ½Ã¹ü»ï¾Æ ³ÖÀ½
rvector r, up(0,0,1), right;
D3DXQUATERNION q;
D3DXMATRIX mat;
float fAngle = (rand() % (31415 * 2)) / 1000.0f;
float fForce = RANDOMFLOAT*SHOTGUN_DIFFUSE_RANGE;
D3DXVec3Cross(&right,&dir,&up);
D3DXVec3Normalize(&right,&right);
D3DXMatrixRotationAxis(&mat, &right, fForce);
D3DXVec3TransformCoord(&r, &dir, &mat);
D3DXQuaternionRotationAxis(&q, &dir, fAngle);
D3DXMatrixRotationQuaternion(&mat, &q);
D3DXVec3TransformCoord(&r, &r, &mat);
dir=r;
}
rvector BulletMarkNormal;
bool bBulletMark = false;
ZTargetType nTargetType = ZTT_OBJECT;
ZPICKINFO pickinfo;
memset(&pickinfo,0,sizeof(ZPICKINFO));
// ÃѾËÀº ·ÎÄÏÀÌ Åë°úÇϴ°÷µµ Åë°úÇÑ´Ù
const DWORD dwPickPassFlag=RM_FLAG_ADDITIVE | RM_FLAG_HIDE | RM_FLAG_PASSROCKET | RM_FLAG_PASSBULLET;
//jintriple3 µð¹ö±× ·¹Áö½ºÅÍ ÇÙ ¹æ¾î ÇÔ¼ö..
ZAntiLeadTemporaryInfo *pShotInfo = OnPeerShotgun_Damaged( pOwnerCharacter, fShotTime, pos, dir, pickinfo, dwPickPassFlag, v1, v2, pItem, BulletMarkNormal, bBulletMark, nTargetType, bHitEnemy);
if(pShotInfo)
vInfo.push_back(pShotInfo);
}
if(bHitEnemy) {
CheckStylishAction(pOwnerCharacter);
CheckCombo(pOwnerCharacter, NULL,true);
}
if(strstr(ZGetGameClient()->GetStageName(), "[L]"))
{
if(vInfo.size() > 0)
vInfo.clear();
}
else if (vInfo.size() > 0 && !ZGetGameInterface()->GetCombatInterface()->GetObserverMode())
{
ZCharacter* pCharacter = NULL;//ZGetCharacterManager()->Find(MUID(0, vInfo[0]->m_nVictimLowID));
int nCount = 0;
bool bUidCheck = false;
vector<ZAntiLead_UIDListNode> v_UIDList;
for (vector<ZAntiLeadTemporaryInfo*>::iterator itor = vInfo.begin(); itor != vInfo.end(); ++itor)
{
if(!v_UIDList.size() && (*itor)->m_nVictimLowID > 0)
{
ZAntiLeadTemporaryInfo * pInfo = new ZAntiLeadTemporaryInfo();
pInfo->m_nPartsType = (*itor)->m_nPartsType;
pInfo->m_nVictimLowID = (*itor)->m_nVictimLowID;
ZAntiLead_UIDListNode List;
List.Info.push_back(pInfo);
List.LowID = (*itor)->m_nVictimLowID;
v_UIDList.push_back(List);
}
else
{
for (vector<ZAntiLead_UIDListNode>::iterator it = v_UIDList.begin(); it != v_UIDList.end(); ++it)
{
if((*it).LowID == (*itor)->m_nVictimLowID)
{
bUidCheck = true;
ZAntiLeadTemporaryInfo * pInfo = new ZAntiLeadTemporaryInfo();
pInfo->m_nPartsType = (*itor)->m_nPartsType;
pInfo->m_nVictimLowID = (*itor)->m_nVictimLowID;
(*it).Info.push_back(pInfo);
break;
}
}
if(!bUidCheck && (*itor)->m_nVictimLowID > 0)
{
ZAntiLeadTemporaryInfo * pInfo = new ZAntiLeadTemporaryInfo();
pInfo->m_nPartsType = (*itor)->m_nPartsType;
pInfo->m_nVictimLowID = (*itor)->m_nVictimLowID;
ZAntiLead_UIDListNode List;
List.Info.push_back(pInfo);
List.LowID = (*itor)->m_nVictimLowID;
v_UIDList.push_back(List);
}
bUidCheck = false;
}
}
if(v_UIDList.size() > 0)
{
for (vector<ZAntiLead_UIDListNode>::iterator it = v_UIDList.begin(); it != v_UIDList.end(); ++it)
{
pCharacter = ZGetCharacterManager()->Find(MUID(0, (*it).LowID));
if (pCharacter && pOwnerCharacter->GetUID().Low == ZGetGameClient()->GetPlayerUID().Low && !(pCharacter->m_dwStatusBitPackingValue.Ref().m_bLostConEffect))
{
nSelType = ((ZCharacter*)pOwnerCharacter)->GetItems()->GetSelectedWeaponParts();
if (!GetMatch()->IsTeamPlay())
{
pCharacter->OnDamaged_AntiLead(pOwnerCharacter, (*it).Info, nSelType);
}
else if (GetMatch()->IsTeamPlay() && ZGetGame()->GetMatch()->GetTeamKillEnabled() && pCharacter->IsTeam(pOwnerCharacter))
{
pCharacter->OnDamaged_AntiLead(pOwnerCharacter, (*it).Info, nSelType);
}
else if (GetMatch()->IsTeamPlay() && !pCharacter->IsTeam(pOwnerCharacter))
{
pCharacter->OnDamaged_AntiLead(pOwnerCharacter, (*it).Info, nSelType);
}
}
}
v_UIDList.clear();
}
for(vector<ZAntiLeadTemporaryInfo*>::iterator i = vInfo.begin(); i != vInfo.end(); i++)
{
ZAntiLeadTemporaryInfo* p = *i;
delete p;
}
vInfo.clear();
}
ZApplication::GetSoundEngine()->PlaySEFire(pItem->GetDesc(), pos.x, pos.y, pos.z, (pOwnerCharacter==m_pMyCharacter));
// º¸ÀÌÁö ¾ÊÀ¸¸é ÀÌÆåÆ®¸¦ ±×¸±ÇÊ¿ä´Â ¾ø´Ù
if(!pOwnerCharacter->IsRendered()) return;
rvector v[6];
int _size = pOwnerCharacter->GetWeapondummyPos(v);
dir = to - pos;
Normalize(dir);
ZGetEffectManager()->AddShotgunEffect(const_cast<rvector&>(pos),v[1],dir,pOwnerCharacter);
// ÃÑ ½ò¶§ ¶óÀÌÆ® Ãß°¡
ZCharacter* pChar;
if( ZGetConfiguration()->GetVideo()->bDynamicLight && pOwnerCharacter != NULL )
{
pChar = pOwnerCharacter;
if( pChar->m_bDynamicLight )
{
pChar->m_vLightColor = g_CharLightList[SHOTGUN].vLightColor;
pChar->m_fLightLife = g_CharLightList[SHOTGUN].fLife;
}
else
{
pChar->m_bDynamicLight = true;
pChar->m_vLightColor = g_CharLightList[SHOTGUN].vLightColor;
pChar->m_vLightColor.x = 1.0f;
pChar->m_iDLightType = SHOTGUN;
pChar->m_fLightLife = g_CharLightList[SHOTGUN].fLife;
}
}
// m_flags.CheckSpearing( v1, v2, SHOTGUN_SPEAR_EMBLEM_POWER );
if(Z_VIDEO_DYNAMICLIGHT)
ZGetStencilLight()->AddLightSource(v1, 2.0f, 200 );
}
//jintriple3 µð¹ö±× ·¹Áö½ºÅÍ ÇØÅ· ¹æÁö ÄÚµå »ðÀÔ
ZAntiLeadTemporaryInfo* ZGame::OnPeerShotgun_Damaged(ZObject* pOwner, float fShotTime, const rvector& pos, rvector& dir, ZPICKINFO pickinfo, DWORD dwPickPassFlag, rvector& v1, rvector& v2, ZItem *pItem, rvector& BulletMarkNormal, bool& bBulletMark, ZTargetType& nTargetType, bool& bHitEnemy)
{
ZCharacter *pTargetCharacter = ZGetGameInterface()->GetCombatInterface()->GetTargetCharacter();
bool bReturnValue = !pTargetCharacter;
if(!pTargetCharacter)PROTECT_DEBUG_REGISTER(bReturnValue) return NULL;
MMatchItemDesc *pDesc = pItem->GetDesc();
bReturnValue = !pDesc;
if(!pDesc)PROTECT_DEBUG_REGISTER(bReturnValue) { _ASSERT(FALSE); return NULL; }
//rvector dir = to - pos;
bool waterSound = false;
//¿©±â¿¡ ¹æ¾îÄڵ尡 µé¾î°¡¾ßµÅ~
bReturnValue = !(ZGetGame()->PickHistory(pOwner,fShotTime,pos,pos+10000.f*dir, &pickinfo,dwPickPassFlag));
if(!(ZGetGame()->PickHistory(pOwner,fShotTime,pos,pos+10000.f*dir, &pickinfo,dwPickPassFlag)))
{
PROTECT_DEBUG_REGISTER(bReturnValue)
{
v1 = pos;
v2 = pos+dir*10000.f;
nTargetType = ZTT_NOTHING;
waterSound = GetWorld()->GetWaters()->CheckSpearing( v1, v2, 250, 0.3, !waterSound );
return NULL;
}
}
//¿©±âµµ..
bReturnValue = (!pickinfo.pObject) && (!pickinfo.bBspPicked);
if(pickinfo.bBspPicked)
{
PROTECT_DEBUG_REGISTER(pickinfo.nBspPicked_DebugRegister == FOR_DEBUG_REGISTER)
{
nTargetType = ZTT_OBJECT;
v1 = pos;
v2 = pickinfo.bpi.PickPos;
// ÃÑź ÈçÀû
BulletMarkNormal.x = pickinfo.bpi.pInfo->plane.a;
BulletMarkNormal.y = pickinfo.bpi.pInfo->plane.b;
BulletMarkNormal.z = pickinfo.bpi.pInfo->plane.c;
Normalize(BulletMarkNormal);
bBulletMark = true;
// ¸Â´Â°÷ ¹Ý°æ 20cm °¡ ȸ鿡 µé¾î¿À¸é ±×¸°´Ù
bool bDrawTargetEffects = isInViewFrustum(v2,20.f,RGetViewFrustum());
if(bDrawTargetEffects)
{
rvector pdir = v2-v1;
Normalize(pdir);
int size = 3;
bool bDrawFireEffects = isInViewFrustum(v1,100.f,RGetViewFrustum());
rvector v[6];
// size = GetWeapondummyPos(pOwnerCharacter,v);
ZCharacterObject* pCOwnerObject = MDynamicCast(ZCharacterObject, pOwner);
if(pCOwnerObject->IsRendered())
size = pCOwnerObject->GetWeapondummyPos(v);
else
{
size = 6;
v[0] = v[1] = v[2] = v1;
v[3] = v[4] = v[5] = v[0];
}
MMatchWeaponType wtype = pDesc->m_nWeaponType.Ref();
bool bSlugOutput = pDesc->m_bSlugOutput;
ZGetEffectManager()->AddBulletMark(v2,BulletMarkNormal, rvector(0,0,0));
if(ZGetConfiguration()->GetExtra()->bShotgunSmoke == true) {
ZGetEffectManager()->AddShotEffect(&v1, size , v2, BulletMarkNormal, nTargetType, wtype, bSlugOutput, pCOwnerObject,bDrawFireEffects,bDrawTargetEffects);
}
}
}
waterSound = GetWorld()->GetWaters()->CheckSpearing( v1, v2, 250, 0.3, !waterSound );
return NULL;
}
else if( (!pickinfo.pObject) && (!pickinfo.bBspPicked) )
{
PROTECT_DEBUG_REGISTER(bReturnValue)
{
_ASSERT(false);
return NULL;
}
}
//À§¿¡±îÁö´Â °Ë»ç ´Ü°è...
ZObject *pObject = pickinfo.pObject;
bool bGuard = pObject->IsGuard() && (pickinfo.info.parts!=eq_parts_legs) && // ´Ù¸®´Â ¸·À»¼ö¾ø´Ù
DotProduct(dir,pObject->GetDirection())<0;
if(pObject->IsGuard() && (pickinfo.info.parts!=eq_parts_legs) &&
DotProduct(dir,pObject->GetDirection())<0)
{
PROTECT_DEBUG_REGISTER(bGuard)
{
nTargetType = ZTT_CHARACTER_GUARD;
// ¸·¾Ò´Ù
rvector t_pos = pObject->GetPosition();
t_pos.z += 100.f;
ZGetEffectManager()->AddSwordDefenceEffect(t_pos+(-dir*50.f),-dir);
pObject->OnGuardSuccess();
v1 = pos;
v2 = pickinfo.info.vOut;
return NULL;
}
}
ZActor* pATarget = MDynamicCast(ZActor,pObject);
nTargetType = ZTT_CHARACTER;
bool bPushSkip = false;
if(pATarget)
{
bPushSkip = pATarget->GetNPCInfo()->bNeverPushed;
}
int nPelletCount = SHOTGUN_BULLET_COUNT;
float fKnockbackForce = pItem->GetKnockbackForce()/ (.5f*float(nPelletCount));
if(bPushSkip)
{
// ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met");
rvector vPos = pOwner->GetPosition() + (pickinfo.pObject->GetPosition() - pOwner->GetPosition()) * 0.1f;
ZGetSoundEngine()->PlaySound("fx_bullethit_mt_met", vPos );
fKnockbackForce = 1.0f;
}
pObject->OnKnockback( dir, fKnockbackForce );
float fActualDamage = CalcActualDamage(pOwner, pObject, (float)pDesc->m_nDamage.Ref());
float fRatio = pItem->GetPiercingRatio( pDesc->m_nWeaponType.Ref(), pickinfo.info.parts );
ZDAMAGETYPE dt = (pickinfo.info.parts==eq_parts_head) ? ZD_BULLET_HEADSHOT : ZD_BULLET;
ZAntiLeadTemporaryInfo* pShotInfo = NULL;
if(pickinfo.pObject->IsNPC() == true || strstr(ZGetGameClient()->GetStageName(), "[L]") || (pOwner->GetUID().Low != ZGetGameClient()->GetPlayerUID().Low && pickinfo.pObject->GetUID().Low != ZGetGameClient()->GetPlayerUID().Low))
pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio );
else if(pOwner->GetUID().Low == ZGetGameClient()->GetPlayerUID().Low && pickinfo.pObject->GetUID().Low != ZGetGameClient()->GetPlayerUID().Low)
{
pShotInfo = new ZAntiLeadTemporaryInfo;
pShotInfo->m_nVictimLowID = pickinfo.pObject->GetUID().Low;
pShotInfo->m_nPartsType = pickinfo.info.parts;
pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio );
}
if(!m_Match.IsTeamPlay() || (pTargetCharacter->GetTeamID()!=pObject->GetTeamID()))
{
bHitEnemy = true;
}
v1 = pos;
v2 = pickinfo.info.vOut;
waterSound = GetWorld()->GetWaters()->CheckSpearing( v1, v2, 250, 0.3, !waterSound );
return pShotInfo;
}
void ZGame::OnPeerAntiLead( const MUID& uidSender, MMatchCharItemParts nSelType, void* ZAntiLeadTemporaryInfoBlob)
{
int nSize = MGetBlobArrayCount(ZAntiLeadTemporaryInfoBlob);
if(!nSize || nSize > 12) return;
ZCharacter* pCharacter = (ZCharacter*)ZGetCharacterManager()->Find(uidSender);
if(!pCharacter) return;
ZItem *pItem = (MMCIP_MELEE <= nSelType && nSelType <= MMCIP_SECONDARY) ? pCharacter->GetItems()->GetItem((MMatchCharItemParts)nSelType) : 0;
if(!pItem || !pItem->GetDesc()) return;
MMatchWeaponType wt = pItem->GetDesc()->m_nWeaponType.Ref();
for (int i = 0; i < nSize; ++i)
{
char nPartsType = (char)MGetBlobArrayElement(ZAntiLeadTemporaryInfoBlob, i);
if(!nPartsType) break;
float fRatio = pItem->GetPiercingRatio( pItem->GetDesc()->m_nWeaponType.Ref(), (RMeshPartsType)nPartsType);
float fDamage = CalcActualDamage(pCharacter, m_pMyCharacter, (float)pItem->GetDesc()->m_nDamage.Ref());
ZDAMAGETYPE dt = (nPartsType==eq_parts_head) ? ZD_BULLET_HEADSHOT : ZD_BULLET;
if (m_pMyCharacter && ZGetGameClient()->GetPlayerUID().Low != uidSender.Low)
if (pCharacter && !ZGetGame()->GetMatch()->IsTeamPlay() || ((m_pMyCharacter->IsTeam(pCharacter) && ZGetGame()->GetMatch()->GetTeamKillEnabled()) || !m_pMyCharacter->IsTeam(pCharacter)))
m_pMyCharacter->OnDamaged(pCharacter, pCharacter->GetPosition(), dt, wt, fDamage, fRatio);
}
}
ZGame.cpp (add this case to the switch block in ZGame::OnCommand_Immidiate)