Files
Main/Assets/Code/Logic/_Required/GameSetting/GameObjectLimit.cs

416 lines
16 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using System;
using System.Collections.Generic;
using Thousandto.Code.Center;
using Thousandto.Core.Asset;
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;
namespace Thousandto.Code.Logic
{
//游戏限制系统,可以限制角色数量和特效数量,根据游戏设置进行限制,用以限制角色数量,优化客户端效率
class GameObjectLimit
{
//更新玩家屏蔽的timer
private static float _playerCountTimer = 0.0f;
//初始化
public static void Initialize()
{
//GameCenter.UnRegFixEventHandle(CoreEventDefine.EID_CORE_FPS_LEVEL_CHANGED, OnFPSLevelChanged);
//GameCenter.RegFixEventHandle(CoreEventDefine.EID_CORE_FPS_LEVEL_CHANGED, OnFPSLevelChanged);
}
//反初始化
public static void UnInitialize()
{
}
private static int GetSettingPlayerCount()
{
return Math.Min(GameCenter.GameSetting.GetSetting(GameSettingKeyCode.MaxShowPlayerCount), GameSetting.MaxPlayerCount);
}
//在仇恨列表中的玩家队友杀气值大于200同骑的玩家始终会显示
private static bool IsMustShow(LocalPlayer lp, RemotePlayer p)
{
if (lp.IsStrikeBack(p.ID))
return true;
if (GameCenter.LuaSystem.Adaptor.IsTeamMember(p.ID))
return true;
return false;
}
//是否可以显示
public static bool IsCanShow(RemotePlayer p)
{
var showRemotePlayer = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherPlayer) > 0;
if (showRemotePlayer)
{
int settingCount = GetSettingPlayerCount();
GameScene scene = GameCenter.GameSceneSystem.ActivedScene;
LocalPlayer lp = scene.GetLocalPlayer();
if (IsMustShow(lp, p))
{
return true;
}
int count = scene.GetCount((entity) =>
{
if (entity is RemotePlayer)
{
var player = entity as RemotePlayer;
if (player.IsShowModel)
return true;
}
return false;
});
if (count >= settingCount)
{
return false;
}
return true;
}
return false;
}
//是否可以显示
public static bool IsCanShow(Pet p)
{
if (GameCenter.GameSceneSystem.ActivedScene != null)
{
if (p.PropMoudle.MasterID == GameCenter.GameSceneSystem.GetLocalPlayerID())
{
//主角宠物永远显示
return true;
}
if(GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherPet) <= 0)
{
return false;
}
var rp = GameCenter.GameSceneSystem.ActivedScene.Find<RemotePlayer>(p.PropMoudle.MasterID);
if (rp != null)
{
return rp.IsShowModel;
}
}
return false;
}
//是否可以显示助战宠物
public static bool IsCanShow(AssistPet p)
{
if (GameCenter.GameSceneSystem.ActivedScene != null)
{
return true;
}
return false;
}
//是否可以显示飞剑
public static bool IsCanShow(FlySword flySword)
{
if (GameCenter.GameSceneSystem.ActivedScene != null)
{
if (flySword.PropMoudle.MasterID == GameCenter.GameSceneSystem.GetLocalPlayerID())
{
//主角飞剑永远显示
return true;
}
if (GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherFlySword) <= 0)
{
return false;
}
var rp = GameCenter.GameSceneSystem.ActivedScene.Find<RemotePlayer>(flySword.PropMoudle.MasterID);
if (rp != null)
{
return rp.IsShowModel;
}
}
return false;
}
//是否可以显示仙娃
public static bool IsCanShow(MarryChild marryChild)
{
if (GameCenter.GameSceneSystem.ActivedScene != null)
{
if (marryChild.PropMoudle.MasterID == GameCenter.GameSceneSystem.GetLocalPlayerID())
{
//主角飞剑永远显示
return true;
}
if (GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherMarryChild) <= 0)
{
return false;
}
var rp = GameCenter.GameSceneSystem.ActivedScene.Find<RemotePlayer>(marryChild.PropMoudle.MasterID);
if (rp != null)
{
return rp.IsShowModel;
}
}
return false;
}
//是否可以显示
public static bool IsCanShow(Monster p)
{
return GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowMonster) > 0;
}
//是否可以显示翅膀
public static bool IsCanShowWing()
{
return !(GameCenter.GameSetting.GetSetting(GameSettingKeyCode.EnableShowWing) > 0);
}
public static void RefreshShowMonster()
{
if (!GameCenter.GameSceneSystem.CheckActivedScene()) return;
LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
if (lp == null)
{
return;
}
List<Monster> monsterList = GameCenter.GameSceneSystem.FindEntityAll<Monster>();
var isShow = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowMonster) > 0;
//全部展示
for (int i = 0; i < monsterList.Count; ++i)
{
monsterList[i].IsShowModel = isShow;
}
}
//刷新玩家的显示
public static void RefreshShowPlayer()
{
try
{
_playerCountTimer = 0.0f;
if (!GameCenter.GameSceneSystem.CheckActivedScene()) return;
LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
if (lp == null)
{
return;
}
int settingCount = 0;
if (GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherPlayer) <= 0)
{
settingCount = 0;
}
else
{
settingCount = GetSettingPlayerCount();
}
List<RemotePlayer> playerList = GameCenter.GameSceneSystem.FindEntityAll<RemotePlayer>();
if (playerList.Count <= settingCount)
{
//全部展示
for (int i = 0; i < playerList.Count; ++i)
{
playerList[i].IsShowModel = true;
}
}
else
{
//需要进行数量限制
int showCount = 0;
//先排除掉必须显示的玩家
for (int i = playerList.Count - 1; i >= 0; --i)
{
if (IsMustShow(lp, playerList[i]))
{
playerList[i].IsShowModel = true;
++showCount;
playerList.RemoveAt(i);
}
}
if (playerList.Count > 0)
{
if (showCount > settingCount)
{
//其他的全部不展示
for (int i = playerList.Count - 1; i >= 0; --i)
{
playerList[i].IsShowModel = false;
}
}
else
{
var tmpDic = new Dictionary<RemotePlayer, bool>();
for(int i = playerList.Count - 1; i >= 0 ; --i)
{
var player = playerList[i];
if(tmpDic.ContainsKey(player))
{
//有重复,删除掉
playerList.RemoveAt(i);
continue;
}
tmpDic.Add(player, true);
}
int canShowCount = settingCount - showCount;
playerList.Sort((left, right) =>
{
//1.判断对象是否有效,是否相等
if (left == null || right == null || left == right)
return 0;
if (left.ID == 0 || right.ID == 0)
return 0;
//2.好友判断
bool lf = lp.IsFriend(left);
bool rf = lp.IsFriend(left);
if (lf != rf)
{
if (lf)
{
return -1;
}
else if (rf)
{
return 1;
}
}
//3.距离判断
var lDis = lp.GetSqrDistance2d(left.Position2d);
var rDis = lp.GetSqrDistance2d(right.Position2d);
if(float.IsInfinity(lDis)||float.IsInfinity(rDis) || float.IsNaN(lDis) || float.IsNaN(rDis))
{
//无效值
return 0;
}
return lDis.CompareTo(rDis);
});
for (int i = 0; i < playerList.Count; ++i)
{
playerList[i].IsShowModel = i < canShowCount;
}
}
}
}
var showOtherPet = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherPet) > 0;
List<Pet> petList = GameCenter.GameSceneSystem.ActivedScene.FindAll<Pet>();
for (int i = 0; i < petList.Count; ++i)
{
if (petList[i].IsLocalPet())
{
petList[i].IsShowModel = true;
}
else
{
RemotePlayer master = GameCenter.GameSceneSystem.ActivedScene.Find<RemotePlayer>(petList[i].PropMoudle.MasterID);
if (showOtherPet && master != null && master.IsShowModel)
{
petList[i].IsShowModel = true;
}
else
{
petList[i].IsShowModel = false;
}
}
}
var showOtherFlySword = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherFlySword) > 0;
List<FlySword> flySwordList = GameCenter.GameSceneSystem.ActivedScene.FindAll<FlySword>();
for (int i = 0; i < flySwordList.Count; ++i)
{
if (flySwordList[i].IsLocalFlySword())
{
flySwordList[i].IsShowModel = true;
}
else
{
RemotePlayer master = GameCenter.GameSceneSystem.ActivedScene.Find<RemotePlayer>(flySwordList[i].PropMoudle.MasterID);
if (showOtherFlySword && master != null && master.IsShowModel)
{
flySwordList[i].IsShowModel = true;
}
else
{
flySwordList[i].IsShowModel = false;
}
}
}
var showOtherMarryChild = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.ShowOtherMarryChild) > 0;
List<MarryChild> marryChildList = GameCenter.GameSceneSystem.ActivedScene.FindAll<MarryChild>();
for (int i = 0; i < marryChildList.Count; ++i)
{
if (marryChildList[i].IsLocalMarryChild())
{
marryChildList[i].IsShowModel = true;
}
else
{
RemotePlayer master = GameCenter.GameSceneSystem.ActivedScene.Find<RemotePlayer>(marryChildList[i].PropMoudle.MasterID);
if (showOtherMarryChild && master != null && master.IsShowModel)
{
marryChildList[i].IsShowModel = true;
}
else
{
marryChildList[i].IsShowModel = false;
}
}
}
}
catch (System.Exception ex)
{
FLogger.LogException(ex);
}
}
//是否可以播放特效
public static bool CanPlayVfx(Character host, ModelTypeCode vfxType)
{
if (host == null)
return false;
//if (GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.TPVFXSkill))
// return false;
var vfxLevel = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.SkillVfxLevel);
if (vfxLevel == 0)
{
return (host.IsLocalPlayer() && host.IsShowModel) || (host.IsLocalFlySword() && host.IsShowModel);
}
if (vfxLevel == 1)
{
return (host.IsLocalPlayer() || host.IsLocalFlySword() || host.IsLocalPet()) && host.IsShowModel;
}
if (vfxLevel == 2)
{
if (!host.IsShowModel)
{
return false;
}
if(host.IsLocalPlayer() || host.IsLocalFlySword() || host.IsLocalPet())
{
return true;
}
//获取当前技能特效的数量
int nonceCount = FGameObjectModel.GetModelTypeFGOCount(vfxType);
return nonceCount < GameCenter.MapLogicSwitch.MaxSkillVfxCount;
}
return host.IsLocalPlayer() && host.IsShowModel;
}
public static void Tick(float dt)
{
if (GameCenter.GameSceneSystem.GetLocalPlayer() == null)
return;
_playerCountTimer += dt;
if (_playerCountTimer > 10.0f)
{
RefreshShowPlayer();
}
}
}
}