Files
JJBB/Assets/Project/Script/Player/AI/Reputation.cs

228 lines
10 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************************
* 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;
}
}
}