int Script::GetCellType(int x, int y) { CServerRegion* region = dynamic_cast<CServerRegion*>(m_RunEnv.region); if(region==NULL) return -1; return region->GetSecurity(x, y); }
void CPKSys::SetPKValue(CMoveShape *pAttacker,CMoveShape *pBeenAttacker,int nAddSub) { //主动攻击(包含使用减益技能)本国白名玩家,每次攻击将增加20点PK值,因此方法获得的PK值上限为20,若PK值已经达到或超过20,则不会再因此方法而增加。 if (pAttacker==NULL || pBeenAttacker==NULL) { return; } if (pAttacker->GetType()==TYPE_MONSTER) { return; } if (pBeenAttacker->GetType()==TYPE_MONSTER) { if (((CMonster*)pBeenAttacker)->GetNpcType()!=NT_Guard) { return; } } CMoveShape* pAtker = pAttacker; CMoveShape* pDefer = pBeenAttacker; if( TYPE_PET == pAtker->GetType() ) { pAtker = pAtker->GetHost(); } if( TYPE_PET == pDefer->GetType() ) { pDefer = pDefer->GetHost(); } if( NULL == pAtker || NULL == pDefer ) { //PutoutLog("Pet", LT_ERROR, "..."); return; } // [8/24/2009 chenxianj] ////////////////////////////////////////////////////////////////////////// //竞技区域不进行pk值设定 CServerRegion* pRegion = dynamic_cast<CServerRegion*>( pAttacker->GetFather() ); if( !pRegion ) { return; } CRegion::eSecurity eSecurityType = pRegion->GetSecurity(pAttacker->GetTileX(),pAttacker->GetTileY()); if (eSecurityType==CRegion::SECURTIY_FIGHT) { return; } ////////////////////////////////////////////////////////////////////////// long lNum = pAtker->GetPkValue() + GlobalSetup::GetSetup()->dwPkCountPerAttack; //攻击本阵营PK值为0的角色(白名角色)/攻击本国或本阵营PK值大于0小于等于20的角色(紫名角色) if (nAddSub==2 && IsSameCamp(pAtker,pDefer)&& (pDefer->GetPkValue()>=0 && pDefer->GetPkValue()<=20 )&& (pAtker->GetPkValue()<20)) { if (lNum>20) { lNum = 20; } pAtker->SetPkValue(lNum); } //对紫名、红名玩家释放增益技能,每次使用增益技能将增加20点PK值,因此方法获得的PK值上限为20,若PK值已经达到或超过20,则PK值不会再因此方法增加 else if (nAddSub==1 && (pDefer->GetPkValue()>0) && (pAtker->GetPkValue()<20) && pAtker!=pDefer) { if (lNum>20) { lNum = 20; } pAtker->SetPkValue(lNum); } else if (nAddSub==2 && !IsSameCamp(pAtker,pDefer) && pDefer->GetPVPValue()==0 && pDefer->GetPkValue()<=20 && pAtker->GetPVPValue()<20) { if(pRegion->GetStrongPointFlag()==false) // 未开启据点战标志 { //攻击非本阵营恶名值为0且PK值小于等于20的角色 long lNum = pAtker->GetPVPValue() + GlobalSetup::GetSetup()->dwPkCountPerAttack; if( lNum > (long) GlobalSetup::GetSetup()->dwPkCountPerAttack) { lNum = GlobalSetup::GetSetup()->dwPkCountPerAttack; } pAtker->SetAttribute("PVPValue",lNum); pAtker->UpdateAttribute(); } } else if (nAddSub==1 && pDefer->GetPVPValue()>0 && pAtker->GetPVPValue()<20 && pAtker!=pDefer) { if(pRegion->GetStrongPointFlag()==false) // 未开启据点战标志 { //对已有恶名值的角色使用增益技能&& !IsSameCamp(pAtker,pDefer) long lNum = pAtker->GetPVPValue() + GlobalSetup::GetSetup()->dwPkCountPerAttack; if (lNum>20) { lNum = 20; } pAtker->SetAttribute("PVPValue",lNum); pAtker->UpdateAttribute(); } } }
//1表示增益 //2表示减益 BOOL CPKSys::JudgeAttackRelation(CMoveShape *pAttacker,CMoveShape *pBeenAttacker,int nAddSub) { if (pBeenAttacker->IsGod()) { //((CPlayer*)pAttacker)->SendNotifyMessage(AppFrame::GetText("STR_WS_SKILL_FIFTEENTH"),0xffff0000,0,eNOTIFYPOS_CENTER); return FALSE; } if (!IsAttackAble(pAttacker,pBeenAttacker)) { return FALSE; } CServerRegion* pRegion = dynamic_cast<CServerRegion*>( pAttacker->GetFather() ); if( !pRegion ) return FALSE; //PVP if (pAttacker->GetType()==TYPE_PLAYER && pBeenAttacker->GetType()==TYPE_PLAYER && nAddSub==2) { CPlayer* pPlayerAttacker = dynamic_cast<CPlayer*>( pAttacker ); CPlayer* pPlayerBeenAttacker = dynamic_cast<CPlayer*>( pBeenAttacker ); // 如果在nopk场景,玩家不能PK的 if(0 == pRegion->IsNoPk()) return FALSE; CRegion::eSecurity eBSecurityType = pRegion->GetSecurity(pPlayerBeenAttacker->GetTileX(),pPlayerBeenAttacker->GetTileY()); CRegion::eSecurity eSecurityType = pRegion->GetSecurity(pPlayerAttacker->GetTileX(),pPlayerAttacker->GetTileY()); if (eSecurityType == CRegion::SECURTIY_SAFE || eBSecurityType == CRegion::SECURTIY_SAFE) { return FALSE; } //组队 if (pPlayerAttacker->IsPk_Team()) { if (pPlayerAttacker->GetTeamID()!=NULL_GUID && pPlayerAttacker->GetTeamID()==pPlayerBeenAttacker->GetTeamID()) { return FALSE; } } //帮会 if (pPlayerAttacker->IsPk_Union()) { if (pPlayerAttacker->GetFactionID()!=NULL_GUID && pPlayerAttacker->GetFactionID()==pPlayerBeenAttacker->GetFactionID()) { return FALSE; } } //本国 if (pPlayerAttacker->IsPk_Country()) { // [9/7/2009 chenxianj] //只保护本国白名玩家 if (pPlayerAttacker->GetCountry()==pPlayerBeenAttacker->GetCountry() && pPlayerBeenAttacker->GetPkValue()==0) { return FALSE; } } //阵营 if (pPlayerAttacker->IsPk_Camp()) { // [9/7/2009 chenxianj] //只保护本阵营白名玩家 if (IsSameCamp(pPlayerAttacker,pPlayerBeenAttacker) && pPlayerBeenAttacker->GetPkValue()==0) { return FALSE; } } //全体 if (pPlayerAttacker->IsPk_Normal()) { if(!IsSameCamp(pPlayerAttacker,pPlayerBeenAttacker) && pPlayerBeenAttacker->GetPkValue()==0 && pPlayerBeenAttacker->GetPVPValue()==0) { return FALSE; } } //红名 if (pPlayerAttacker->IsPk_Badman()) { if (pPlayerBeenAttacker->GetPkValue()>0) { return FALSE; } } //海盗 if ( pPlayerAttacker->IsPk_Pirate()) { if (pPlayerBeenAttacker->GetPVPValue()>0) { return FALSE; } } } //PVM if (pAttacker->GetType()==TYPE_PLAYER && pBeenAttacker->GetType()==TYPE_MONSTER) { CPlayer* pPlayerAttacker = dynamic_cast<CPlayer*>( pAttacker ); CMonster* pPlayerBeenAttacker = dynamic_cast<CMonster*>( pBeenAttacker ); CRegion::eSecurity SecurityType = pRegion->GetSecurity(pPlayerBeenAttacker->GetTileX(),pPlayerBeenAttacker->GetTileY()); if (SecurityType == CRegion::SECURTIY_SAFE && nAddSub==1) { //人对怪在安全区不能使用增益技能 return FALSE; } if (((CMonster*)pBeenAttacker)->GetNpcType()==NT_Guard) { //国家 if (pPlayerAttacker->IsPk_Country()) { if (pAttacker->GetCountry()==pBeenAttacker->GetCountry()) { return FALSE; } } //阵营 if (pPlayerAttacker->IsPk_Camp()) { if (IsSameCamp(pPlayerAttacker,pPlayerBeenAttacker)) { return FALSE; } } //全体 if (pPlayerAttacker->IsPk_Normal()) { return FALSE; } } } //MVP if (pAttacker->GetType()==TYPE_MONSTER && pBeenAttacker->GetType()==TYPE_PLAYER) { CMonster* pPlayerAttacker = dynamic_cast<CMonster*>( pAttacker ); CPlayer* pPlayerBeenAttacker = dynamic_cast<CPlayer*>( pBeenAttacker ); CRegion::eSecurity SecurityType = pRegion->GetSecurity(pPlayerBeenAttacker->GetTileX(),pPlayerBeenAttacker->GetTileY()); if (SecurityType == CRegion::SECURTIY_SAFE && nAddSub==1) { //怪对人在安全区不能使用增益技能 return FALSE; } } return TRUE; }