/******************************************************************************** * 文件名: Reputation.cs * 全路径: \Player\Reputation.cs * 创建人: 李嘉 * 创建时间:2013-11-14 * * 功能说明:Obj阵营势力相关接口 * 修改记录:将参数改为传入一个Obj_Character 客户端只要跟主角判断敌对友好关系 *********************************************************************************/ using Games.GlobeDefine; using GCGame.Table; namespace Games.LogicObj { public class Reputation { public static CharacterDefine.REPUTATION_TYPE GetObjReputionType(Obj_Character objChar) { var result = CharacterDefine.REPUTATION_TYPE.REPUTATION_INVALID; if (objChar != null) { var mainPlayer = ObjManager.Instance.MainPlayer; if (mainPlayer != null) if (objChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER) { result = CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND; } else if (objChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_FELLOW) { var fellow = (Obj_Fellow) objChar; if (fellow.OwnerObjId == mainPlayer.ServerID) result = CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND; else { var owner = ObjManager.Instance.FindObjCharacterInScene(fellow.OwnerObjId); // 已知问题,拥有者不在视野内时,会无法正常检查 result = owner != null && owner.ObjType != GameDefine_Globe.OBJ_TYPE.OBJ_FELLOW ? GetObjReputionType(owner) : CharacterDefine.REPUTATION_TYPE.REPUTATION_DUMMY; } } else { // 对其他玩家额外处理 if (objChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER) { // 关宁只认临时队伍情况 switch (GameManager.gameManager.RunningScene) { case (int) GameDefine_Globe.SCENE_DEFINE.SCENE_GUANNING: result = objChar.BaseAttr.Force == mainPlayer.BaseAttr.Force ? CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND : CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE; break; case (int) GameDefine_Globe.SCENE_DEFINE.SCENE_FACIONCHALLENGE: result = CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE; break; default: if (IsCanPk((Obj_OtherPlayer) objChar)) result = CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE; break; } } else { var npc = objChar as Obj_NPC; if (npc != null && npc.OwerGUID == (long) mainPlayer.GUID) result = CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE; } // 没有特殊规则时,下落到使用关系列表 if (result == CharacterDefine.REPUTATION_TYPE.REPUTATION_INVALID) { var reputation = TableManager.GetRelationByID(mainPlayer.BaseAttr.Force, 0); if (reputation != null) result = (CharacterDefine.REPUTATION_TYPE) reputation.GetRelationbyIndex(objChar .BaseAttr .Force); } } } return result; } public static bool IsEnemy(Obj_Character character) { return IsReputation(character, CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE); } public static bool IsFriend(Obj_Character character) { return IsReputation(character, CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND); } public static bool CanAttack(Obj_Character character) { var reputation = GetObjReputionType(character); return CanAttack(reputation); } public static bool CanAttack(CharacterDefine.REPUTATION_TYPE reputation) { return reputation == CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE || reputation == CharacterDefine.REPUTATION_TYPE.REPUTATION_NEUTRAL; } public static bool IsReputation(Obj_Character character, CharacterDefine.REPUTATION_TYPE reputation) { return GetObjReputionType(character) == reputation; } //主角能否攻击玩家 public static bool IsCanPk(Obj_OtherPlayer objChar) { var result = false; // 副本中和爱人关系不能攻击 if (objChar != null && GameManager.gameManager.PlayerDataPool.LoverGUID != objChar.GUID) { var mainPlayer = ObjManager.Instance.MainPlayer; if (mainPlayer != null) if (objChar.IsInMainPlayerPKList) result = true; else { var pkModel = (CharacterDefine.PKMODLE) mainPlayer.PkModle; switch (pkModel) { case CharacterDefine.PKMODLE.Evil: result = objChar.PkValue >= 60; break; case CharacterDefine.PKMODLE.Camp: result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) && !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar); break; case CharacterDefine.PKMODLE.KILL: result = true; break; } } } if (objChar != null && GameManager.gameManager.m_RunningScene == 658) { var mainPlayer = ObjManager.Instance.MainPlayer; if (mainPlayer != null) if (objChar.IsInMainPlayerPKList) result = true; else { var pkModel = (CharacterDefine.PKMODLE)mainPlayer.PkModle; switch (pkModel) { case CharacterDefine.PKMODLE.Evil: result = objChar.PkValue >= 60; break; case CharacterDefine.PKMODLE.Camp: result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) && !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar); break; case CharacterDefine.PKMODLE.KILL: result = true; break; } } } return result; } //玩家能否攻击主角 public static bool IsCanBeAttack(Obj_OtherPlayer objChar) { var result = false; // 副本中和爱人关系不能攻击 if (objChar != null && GameManager.gameManager.PlayerDataPool.LoverGUID != objChar.GUID) { var mainPlayer = ObjManager.Instance.MainPlayer; if (mainPlayer != null) { var pkModel = (CharacterDefine.PKMODLE) objChar.PkModle; switch (pkModel) { case CharacterDefine.PKMODLE.Evil: result = mainPlayer.PkValue >= 60; break; case CharacterDefine.PKMODLE.Camp: result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) && !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar); break; case CharacterDefine.PKMODLE.KILL: result = true; break; } } } if (objChar != null && GameManager.gameManager.m_RunningScene == 658) { var mainPlayer = ObjManager.Instance.MainPlayer; if (mainPlayer != null) if (objChar.IsInMainPlayerPKList) result = true; else { var pkModel = (CharacterDefine.PKMODLE)mainPlayer.PkModle; switch (pkModel) { case CharacterDefine.PKMODLE.Evil: result = objChar.PkValue >= 60; break; case CharacterDefine.PKMODLE.Camp: result = !GameManager.gameManager.PlayerDataPool.IsTeamMem(objChar.GUID) && !GameManager.gameManager.PlayerDataPool.IsGuildMember(objChar); break; case CharacterDefine.PKMODLE.KILL: result = true; break; } } } return result; } } }