Esempio n. 1
0
// 发送世界聊天消息
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);
	}
}
Esempio n. 3
0
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 */
}