Files
Main/Assets/Code/Logic/_Required/GameSetting/GameObjectLimit.cs
2025-01-25 04:38:09 +08:00

416 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}
}