// 发送世界聊天消息 CT_VOID CCUserManager::SendWorldChat(CMD_G_WorldChat *pWorldChat,CT_DWORD len) { _AUTOMUTEX(&m_mutex); UDM_IT it = m_userDataMap.begin(); UDM_IT endIT = m_userDataMap.end(); for(; it!=endIT; ++it) { if((*it).first==pWorldChat->dwUserID) continue; //检查黑名单 CCUser *pUser; if (Find((*it).first, &pUser)) { if (pUser->m_userFriend.CheckBlackList(pWorldChat->dwUserID)) { continue; } } CCNetInterface* pNetHandle = (*it).second->GetNetInterface(); if (IsGM(pWorldChat->dwUserID)) pNetHandle->Send(MAIN_G_CHAT_CITY,SUB_G_GMWORLD_CHAT,(CT_CHAR*)pWorldChat, len); else pNetHandle->Send(MAIN_G_CHAT_CITY,SUB_G_WORLD_CHAT,(CT_CHAR*)pWorldChat, len); } }
void CClient::ValidateSkills(bool logInvalidSkills) { if(IsGM()) return; int invalidSkills = 0; char logMessage[100]; for (int skillIndex = 0; skillIndex < MAXSKILLTYPE; skillIndex++) { switch (skillIndex) { case SKILL_MINING: case SKILL_MANUFACTURING: case SKILL_HANDATTACK: if (m_cSkillMastery[skillIndex] > (GetStr() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetStr() * 2); m_cSkillMastery[skillIndex] = GetStr() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_MAGICRES: if (m_cSkillMastery[skillIndex] > (m_iLevel * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (m_iLevel * 2); m_cSkillMastery[skillIndex] = m_iLevel * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_MAGIC: case SKILL_STAFF: if (m_cSkillMastery[skillIndex] > (GetMag() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetMag() * 2); m_cSkillMastery[skillIndex] = GetMag() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_FISHING: case SKILL_ARCHERY: case SKILL_SHORTSWORD: case SKILL_LONGSWORD: case SKILL_FENCING: case SKILL_AXE: case SKILL_SHIELD: case SKILL_HAMMER: if (m_cSkillMastery[skillIndex] > (GetDex() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetDex() * 2); m_cSkillMastery[skillIndex] = GetDex() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_ALCHEMY: case SKILL_FARMING: case SKILL_PRETENDCORPSE: if (m_cSkillMastery[skillIndex] > (GetInt() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetInt() * 2); m_cSkillMastery[skillIndex] = GetInt() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; case SKILL_POISONRES: if (m_cSkillMastery[skillIndex] > (GetVit() * 2)) { invalidSkills += m_cSkillMastery[skillIndex] - (GetVit() * 2); m_cSkillMastery[skillIndex] = GetVit() * 2; m_iSkillSSN[skillIndex] = 0; Notify(NULL, NOTIFY_SKILL, skillIndex, m_cSkillMastery[skillIndex], NULL, NULL); } break; default: m_iSkillSSN[skillIndex] = 0; break; } } if(logInvalidSkills && (invalidSkills > 0)) { wsprintf(logMessage, "PC(%s) A skill was too high, reduced by (%d) points", m_cCharName, invalidSkills); PutLogList(logMessage); } }
int Client::GetTargetType(gemObject* target) { if (!target) { return TARGET_NONE; /* No Target */ } if (target->GetActorPtr() == NULL) { return TARGET_ITEM; /* Item */ } if (!target->IsAlive()) { return TARGET_DEAD; } if (IsGM()) { // GMs can interpret targets as either friends or foe...even self. // This allows them to attack or cast spells on anyone. return TARGET_SELF | TARGET_FRIEND | TARGET_FOE; } if (GetActor() == target) { return TARGET_SELF; /* Self */ } if (target->GetCharacterData()->impervious_to_attack) { return TARGET_FRIEND; /* Impervious NPC */ } // Is target a NPC? Client* targetclient = psserver->GetNetManager()->GetAnyClient(target->GetClientID()); if (!targetclient) { if (target->GetCharacterData()->IsPet()) { // Pet's target type depends on its owner's (enable when they can defend themselves) gemObject* owner = GEMSupervisor::GetSingleton().FindPlayerEntity( target->GetCharacterData()->GetOwnerID() ); if ( !owner || !IsAllowedToAttack(owner,false) ) return TARGET_FRIEND; } return TARGET_FOE; /* Foe */ } if (targetclient->GetActor()->GetInvincibility()) return TARGET_FRIEND; /* Invincible GM */ if (targetclient->GetActor()->attackable) return TARGET_FOE; /* attackable GM */ // Challenged to a duel? if (IsDuelClient(target->GetClientID()) || targetclient->IsDuelClient(clientnum)) { return TARGET_FOE; /* Attackable player */ } // In PvP region? csVector3 attackerpos, targetpos; float yrot; iSector* attackersector, *targetsector; GetActor()->GetPosition(attackerpos, yrot, attackersector); target->GetPosition(targetpos, yrot, targetsector); if (psserver->GetCombatManager()->InPVPRegion(attackerpos,attackersector) && psserver->GetCombatManager()->InPVPRegion(targetpos,targetsector)) { return TARGET_FOE; /* Attackable player */ } // Is this a player who has hit you and run out of a PVP area? for (size_t i=0; i< GetActor()->GetDamageHistoryCount(); i++) { const DamageHistory *dh = GetActor()->GetDamageHistory((int)i); // If the target has ever hit you, you can attack them back. Logging out clears this. if (dh->attacker_ref.IsValid() && dh->attacker_ref->GetActorPtr() == target) return TARGET_FOE; } // Declared war? psGuildInfo* attackguild = GetActor()->GetGuild(); psGuildInfo* targetguild = targetclient->GetActor()->GetGuild(); if (attackguild && targetguild && targetguild->IsGuildWarActive(attackguild)) { return TARGET_FOE; /* Attackable player */ } if(GetActor()->InGroup() && targetclient->GetActor()->InGroup()) { csRef<PlayerGroup> AttackerGroup = GetActor()->GetGroup(); csRef<PlayerGroup> TargetGroup = targetclient->GetActor()->GetGroup(); if(AttackerGroup->IsInDuelWith(TargetGroup)) return TARGET_FOE; } return TARGET_FRIEND; /* Friend */ }