Stop messaging me about Gunz, I'm done with it 100%.
The first part might be misaligned, someone feel free to correct it.
ZGame.h - 384Code:--MMatchTransDataType.h Line: 576 struct MTD_ShotInfo { unsigned long nLowId; float fPosX; float fPosY; float fPosZ; float fDamage; float fRatio; char nDamageType; char nWeaponType; }; --MMatchClient.h Line: 151 MPacketCrypter GetPeerPacketCrypter() { return m_PeerPacketCrypter; } --ZGameClient.h Line: 399 #define ZPOSTCMDLEAD(_ID, _UID, _P0) { MCommand* pC=ZNewCmd(_ID); pC->AP(_P0); pC->m_Receiver = _UID; ZPostCommand(pC); } --MSharedCommandTable.h Line: 680 #define MC_GUNZ_ANTILEAD 50010 --MSharedCommandTable.cpp Line: 1710 C(MC_GUNZ_ANTILEAD, "Match.Gunz.AntiLead", "AntiLead Information", MCDT_PEER2PEER) P(MPT_BLOB, "ShotInfo");
ZGame.cpp - 4272Code:MTD_ShotInfo* 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);
4589Code:ZDAMAGETYPE dt = (pickinfo.info.parts==eq_parts_head) ? ZD_BULLET_HEADSHOT : ZD_BULLET; if(pickinfo.pObject->IsNPC() == true) { pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio ); } else { ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio ); }
4623Code:vector<MTD_ShotInfo*> vShots;
4760Code:MTD_ShotInfo* pShotInfo = OnPeerShotgun_Damaged( pOwnerCharacter, fShotTime, pos, dir, pickinfo, dwPickPassFlag, v1, v2, pItem, BulletMarkNormal, bBulletMark, nTargetType, bHitEnemy); if (pShotInfo) vShots.push_back(pShotInfo);
4836Code:if (vShots.size() > 0 && !ZGetGameInterface()->GetCombatInterface()->GetObserverMode()) { ZCharacter* pCharacter = ZGetCharacterManager()->Find(MUID(0, vShots[0]->nLowId)); if (pOwnerCharacter->GetUID() == ZGetGameClient()->GetPlayerUID()) { if (!GetMatch()->IsTeamPlay()) { pCharacter->OnDamagedAPlayer(vShots); } else if (GetMatch()->IsTeamPlay() && ZGetGame()->GetMatch()->GetTeamKillEnabled() && pCharacter->IsTeam(pOwnerCharacter)) { pCharacter->OnDamagedAPlayer(vShots); //ZPostPeerChat("2 - True"); } else if (GetMatch()->IsTeamPlay() && !pCharacter->IsTeam(pOwnerCharacter)) { pCharacter->OnDamagedAPlayer(vShots); //ZPostPeerChat("3 - True"); } } for(auto i = vShots.begin(); i != vShots.end(); i++) { auto p = *i; delete p; } }
4273Code:MTD_ShotInfo* 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); 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; } float fKnockbackForce = pItem->GetKnockbackForce()/ (.5f*float(SHOTGUN_BULLET_COUNT)); 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 Damage = 0; Damage = (float)pDesc->m_nDamage.Ref(); float fActualDamage = CalcActualDamage(pOwner, pObject, (float)pDesc->m_nDamage.Ref(), true, pDesc->m_nWeaponType.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; MTD_ShotInfo* pShotInfo = NULL; if(pickinfo.pObject->IsNPC() == true) { pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio ); } else { pShotInfo = new MTD_ShotInfo; pShotInfo->nLowId = pickinfo.pObject->GetUID().Low; pShotInfo->fDamage = fActualDamage; pShotInfo->fPosX = pOwner->GetPosition().x; pShotInfo->fPosY = pOwner->GetPosition().y; pShotInfo->fPosZ = pOwner->GetPosition().z; pShotInfo->fRatio = fRatio; pShotInfo->nDamageType = dt; pShotInfo->nWeaponType = pDesc->m_nWeaponType.Ref(); } 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; }
1902Code:if(pickinfo.pObject->IsNPC() == true) { pickinfo.pObject->OnDamaged(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio ); } else { ((ZCharacter*)(pickinfo.pObject))->OnDamagedAPlayer(pOwner, pOwner->GetPosition(), dt, pDesc->m_nWeaponType.Ref(), fActualDamage, fRatio ); }
ZCharacter.cpp - 4415Code:case MC_GUNZ_ANTILEAD: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nSize = MGetBlobArrayCount(pBlob); for (int i = 0; i < nSize; ++i) { MTD_ShotInfo* pInfo = (MTD_ShotInfo*)MGetBlobArrayElement(pBlob, i); ZGetGameClient()->GetPeerPacketCrypter().Decrypt((char*)pInfo, sizeof(MTD_ShotInfo)); if (m_pMyCharacter && ZGetGameClient()->GetPlayerUID() != pCommand->GetSenderUID()) { ZCharacter* pCharacter = ZGetCharacterManager()->Find(pCommand->GetSenderUID()); rvector pos; pos.x = pInfo->fPosX; pos.y = pInfo->fPosY; pos.z = pInfo->fPosZ; if (pCharacter && pInfo->nLowId == ZGetGameClient()->GetPlayerUID().Low && !ZGetGame()->GetMatch()->IsTeamPlay() || ((m_pMyCharacter->IsTeam(pCharacter) && ZGetGame()->GetMatch()->GetTeamKillEnabled()) || !m_pMyCharacter->IsTeam(pCharacter)) ) { m_pMyCharacter->OnDamaged(pCharacter, pos, (ZDAMAGETYPE)pInfo->nDamageType, (MMatchWeaponType)pInfo->nWeaponType, pInfo->fDamage, pInfo->fRatio); pCharacter->GetStatus().CheckCrc(); pCharacter->GetStatus().Ref().nDamageCaused += pInfo->fDamage; pCharacter->GetStatus().MakeCrc(); } } else { ZCharacter* pCharacter = ZGetCharacterManager()->Find(pCommand->GetSenderUID()); if (pCharacter != ZGetGame()->m_pMyCharacter) { pCharacter->GetStatus().CheckCrc(); pCharacter->GetStatus().Ref().nDamageCaused += pInfo->fDamage; pCharacter->GetStatus().MakeCrc(); } else { m_pMyCharacter->GetStatus().CheckCrc(); m_pMyCharacter->GetStatus().Ref().nDamageCaused += pInfo->fDamage; m_pMyCharacter->GetStatus().MakeCrc(); } } } } break;
ZCharacter.h - 787Code:void ZCharacter::OnDamagedAPlayer(ZObject* pAttacker, rvector srcPos, ZDAMAGETYPE damageType, MMatchWeaponType weaponType, float fDamage, float fPiercingRatio, int nMeleeTpye) { if (damageType == ZD_MELEE) { OnDamaged(pAttacker, srcPos, damageType, weaponType, fDamage, fPiercingRatio, nMeleeTpye); return; } if (pAttacker != NULL && fDamage > 0) { if (pAttacker == ZGetGame()->m_pMyCharacter && this != pAttacker && !ZGetGame()->m_pMyCharacter->IsDie()) { void* pBlobArray = MMakeBlobArray(sizeof(MTD_ShotInfo), 1); void* pBlobElement = MGetBlobArrayElement(pBlobArray, 0); MTD_ShotInfo shotInfo; shotInfo.fDamage = fDamage; shotInfo.fPosX = srcPos.x; shotInfo.fPosY = srcPos.y; shotInfo.fPosZ = srcPos.z; shotInfo.nDamageType = damageType; shotInfo.fRatio = fPiercingRatio; shotInfo.nLowId = GetUID().Low; shotInfo.nWeaponType = weaponType; memcpy(pBlobElement, &shotInfo, sizeof(MTD_ShotInfo)); ZGetGameClient()->GetPeerPacketCrypter().Encrypt((char*)pBlobElement, sizeof(MTD_ShotInfo)); ZPOSTCMDLEAD(MC_GUNZ_ANTILEAD, GetUID(), MCommandParameterBlob(pBlobArray, MGetBlobArraySize(pBlobArray))); } } } void ZCharacter::OnDamagedAPlayer(vector<MTD_ShotInfo*> vShotInfo) { if (vShotInfo.size() > 0) { if (ZGetGameClient()->GetPlayerUID().Low != GetUID().Low) { void* pBlobArray = MMakeBlobArray(sizeof(MTD_ShotInfo), vShotInfo.size()); for (int i = 0; i < vShotInfo.size(); ++i) { MTD_ShotInfo* pShot = vShotInfo[i]; void* pElement = MGetBlobArrayElement(pBlobArray, i); memcpy(pElement, pShot, sizeof(MTD_ShotInfo)); ZGetGameClient()->GetPeerPacketCrypter().Encrypt((char*)pElement, sizeof(MTD_ShotInfo)); } ZPOSTCMDLEAD(MC_GUNZ_ANTILEAD, GetUID(), MCommandParameterBlob(pBlobArray, MGetBlobArraySize(pBlobArray))); } } }
ZItem.cpp - 174Code:virtual void OnDamagedAPlayer(ZObject* pAttacker, rvector srcPos, ZDAMAGETYPE damageType, MMatchWeaponType weaponType, float fDamage, float fPiercingRatio=1.f, int nMeleeTpye=-1); virtual void OnDamagedAPlayer(vector<MTD_ShotInfo*> vShots);
iirc, that should be everything.Code:case MWT_REVOLVER: case MWT_REVOLVERx2: { if(bHead) fRatio = 0.8f; else fRatio = 0.6f; } break;






