This commit is contained in:
GenZmeY 2022-09-07 19:13:13 +03:00
parent 85c2fb65bb
commit cf6b9cf6c8
5 changed files with 141 additions and 163 deletions

View File

@ -22,7 +22,7 @@ var private KFOnlineGameSettings KFOGS;
var private OnlineSubsystemSteamworks OSS; var private OnlineSubsystemSteamworks OSS;
var private Array<YAS_RepInfo> RepInfos; var private Array<YAS_OwnerRepInfo> RepInfos;
var private Array<CachedRankRelation> PlayerRelations; var private Array<CachedRankRelation> PlayerRelations;
var private Array<CachedRankRelation> GroupRelations; var private Array<CachedRankRelation> GroupRelations;
@ -282,7 +282,7 @@ private function UpdateTimer()
public function NotifyLogin(Controller C) public function NotifyLogin(Controller C)
{ {
local YAS_RepInfo RepInfo; local YAS_OwnerRepInfo RepInfo;
`Log_Trace(); `Log_Trace();
@ -293,24 +293,16 @@ public function NotifyLogin(Controller C)
return; return;
} }
ApplyCurrentRankRelations(RepInfo);
InitRank(RepInfo); InitRank(RepInfo);
} }
public function NotifyLogout(Controller C) public function NotifyLogout(Controller C)
{ {
local YAS_RepInfo RepInfo; local YAS_OwnerRepInfo RepInfo;
`Log_Trace(); `Log_Trace();
RepInfo = FindRepInfo(C); RepInfo = FindRepInfo(C);
if (RepInfo == None)
{
`Log_Error("Can't find repinfo for:" @ C);
return;
}
BroadcastRemoveRankRelation(RepInfo.ActiveRankRelation, C);
if (!DestroyRepInfo(RepInfo)) if (!DestroyRepInfo(RepInfo))
{ {
@ -318,30 +310,33 @@ public function NotifyLogout(Controller C)
} }
} }
public function YAS_RepInfo CreateRepInfo(Controller C) public function YAS_OwnerRepInfo CreateRepInfo(Controller C)
{ {
local YAS_RepInfo RepInfo; local YAS_OwnerRepInfo OwnerRepInfo;
local YAS_RankRepInfo RankRepInfo;
`Log_Trace(); `Log_Trace();
RepInfo = Spawn(class'YAS_RepInfo', C); OwnerRepInfo = Spawn(class'YAS_OwnerRepInfo', C);
RankRepInfo = Spawn(class'YAS_RankRepInfo', C);
if (RepInfo != None) if (OwnerRepInfo != None && RankRepInfo != None)
{ {
RepInfos.AddItem(RepInfo); RepInfos.AddItem(OwnerRepInfo);
RepInfo.YAS = Self; OwnerRepInfo.RankRepInfo = RankRepInfo;
RepInfo.LogLevel = LogLevel; OwnerRepInfo.YAS = Self;
RepInfo.RankPlayer = CfgRanks.default.Player; OwnerRepInfo.LogLevel = LogLevel;
RepInfo.RankAdmin = CfgRanks.default.Admin; OwnerRepInfo.RankPlayer = CfgRanks.default.Player;
OwnerRepInfo.RankAdmin = CfgRanks.default.Admin;
} }
return RepInfo; return OwnerRepInfo;
} }
private function YAS_RepInfo FindRepInfo(Controller C) private function YAS_OwnerRepInfo FindRepInfo(Controller C)
{ {
local YAS_RepInfo RepInfo; local YAS_OwnerRepInfo RepInfo;
if (C == None) return None; if (C == None) return None;
@ -356,30 +351,25 @@ private function YAS_RepInfo FindRepInfo(Controller C)
return None; return None;
} }
public function bool DestroyRepInfo(YAS_RepInfo RepInfo) public function bool DestroyRepInfo(YAS_OwnerRepInfo RepInfo)
{ {
`Log_Trace(); `Log_Trace();
if (RepInfo == None) return false; if (RepInfo == None) return false;
RepInfos.RemoveItem(RepInfo); RepInfos.RemoveItem(RepInfo);
RepInfo.RankRepInfo.SafeDestroy();
RepInfo.SafeDestroy(); RepInfo.SafeDestroy();
return true; return true;
} }
private function ApplyCurrentRankRelations(YAS_RepInfo RepInfo) private function InitRank(YAS_OwnerRepInfo RepInfo)
{
}
private function InitRank(YAS_RepInfo RepInfo)
{ {
local CachedRankRelation Rel; local CachedRankRelation Rel;
local String JoinedGroupIDs; local String JoinedGroupIDs;
local PlayerReplicationInfo PRI; local PlayerReplicationInfo PRI;
local KFPlayerController KFPC; local KFPlayerController KFPC;
local bool HasPlayerRank;
local Array<String> StringGroupIDs; local Array<String> StringGroupIDs;
`Log_Trace(); `Log_Trace();
@ -391,22 +381,16 @@ private function InitRank(YAS_RepInfo RepInfo)
PRI = KFPC.PlayerReplicationInfo; PRI = KFPC.PlayerReplicationInfo;
if (PRI == None) return; if (PRI == None) return;
HasPlayerRank = false;
foreach PlayerRelations(Rel) foreach PlayerRelations(Rel)
{ {
if (Rel.UID.Uid == PRI.UniqueID.Uid) if (Rel.UID.Uid == PRI.UniqueID.Uid)
{ {
HasPlayerRank = true; RepInfo.RankRepInfo.Rank = Rel.Rank;
RepInfo.ActiveRankRelation = Rel;
break; break;
} }
} }
if (HasPlayerRank) if (RepInfo.RankRepInfo.Rank.RankID <= 0 && !KFPC.bIsEosPlayer)
{
BroadcastAddRankRelation(RepInfo.ActiveRankRelation);
}
else if (!KFPC.bIsEosPlayer)
{ {
foreach GroupRelations(Rel) foreach GroupRelations(Rel)
{ {
@ -417,49 +401,13 @@ private function InitRank(YAS_RepInfo RepInfo)
} }
} }
public function ApplyMembership(UniqueNetId GroupUID, UniqueNetId PlayerUID) public function Rank RankByGroupID(UniqueNetId GroupUID)
{ {
local CachedRankRelation RR; local CachedRankRelation Rel;
local int Index;
`Log_Trace(); foreach GroupRelations(Rel) if (Rel.UID == GroupUID) break;
Index = GroupRelations.Find('UID', GroupUID);
if (Index != INDEX_NONE)
{
RR.UID = PlayerUID;
RR.Rank = GroupRelations[Index].Rank;
BroadcastAddRankRelation(RR);
}
else
{
`Log_Error("Can't find related GroupID rank");
}
}
public function BroadcastAddRankRelation(CachedRankRelation RR) return Rel.Rank;
{
local YAS_RepInfo RepInfo;
`Log_Trace();
foreach RepInfos(RepInfo)
{
RepInfo.AddRankRelation(RR);
}
}
public function BroadcastRemoveRankRelation(CachedRankRelation RR, optional Controller Except)
{
local YAS_RepInfo RepInfo;
foreach RepInfos(RepInfo)
{
if (RepInfo.Owner != Except)
{
RepInfo.RemoveRankRelation(RR);
}
}
} }
DefaultProperties DefaultProperties

View File

@ -1,4 +1,4 @@
class YAS_RepInfo extends ReplicationInfo; class YAS_OwnerRepInfo extends ReplicationInfo;
var public YAS YAS; var public YAS YAS;
@ -7,15 +7,13 @@ var public repnotify SystemRank RankPlayer, RankAdmin;
var public repnotify String DynamicServerName; var public repnotify String DynamicServerName;
var public repnotify bool UsesStats, Custom, PasswordRequired; var public repnotify bool UsesStats, Custom, PasswordRequired;
var public CachedRankRelation ActiveRankRelation; var public YAS_RankRepInfo RankRepInfo;
var private KFPlayerController KFPC; var private KFPlayerController KFPC;
var private YAS_ScoreBoard SC; var private YAS_ScoreBoard SC;
var private OnlineSubsystemSteamworks OSS; var private OnlineSubsystemSteamworks OSS;
var private Array<UniqueNetID> PendingGroupIDs; var private Array<UniqueNetID> PendingGroupIDs;
var private Array<CachedRankRelation> PendingAddRankRelations;
var private Array<CachedRankRelation> PendingRemoveRankRelations;
const CheckGroupTimer = 0.2f; const CheckGroupTimer = 0.2f;
const MaxRetries = 3; const MaxRetries = 3;
@ -30,6 +28,13 @@ replication
DynamicServerName, UsesStats, Custom, PasswordRequired; DynamicServerName, UsesStats, Custom, PasswordRequired;
} }
public simulated function bool SafeDestroy()
{
`Log_Trace();
return (bPendingDelete || bDeleteMe || Destroy());
}
public simulated event ReplicatedEvent(name VarName) public simulated event ReplicatedEvent(name VarName)
{ {
`Log_Trace(); `Log_Trace();
@ -70,13 +75,6 @@ public simulated event ReplicatedEvent(name VarName)
} }
} }
public simulated function bool SafeDestroy()
{
`Log_Trace();
return (bPendingDelete || bDeleteMe || Destroy());
}
public simulated event PreBeginPlay() public simulated event PreBeginPlay()
{ {
`Log_Trace(); `Log_Trace();
@ -100,42 +98,6 @@ public simulated event PostBeginPlay()
Super.PostBeginPlay(); Super.PostBeginPlay();
} }
public reliable client function AddRankRelation(CachedRankRelation RR)
{
local int Index;
`Log_Trace();
if (SC == None)
{
PendingAddRankRelations.AddItem(RR);
return;
}
Index = SC.RankRelations.Find('UID', RR.UID);
if (Index != INDEX_NONE)
{
SC.RankRelations[Index] = RR;
}
else
{
SC.RankRelations.AddItem(RR);
}
}
public reliable client function RemoveRankRelation(CachedRankRelation RR)
{
`Log_Trace();
if (SC == None)
{
PendingRemoveRankRelations.AddItem(RR);
return;
}
SC.RankRelations.RemoveItem(RR);
}
public reliable client function CheckGroupRanks(String JoinedGroupIDs) public reliable client function CheckGroupRanks(String JoinedGroupIDs)
{ {
local Array<String> StringGroupIDs; local Array<String> StringGroupIDs;
@ -191,15 +153,19 @@ private simulated function CheckGroupsCycle()
private reliable server function ServerApplyMembership(UniqueNetId GroupUID) private reliable server function ServerApplyMembership(UniqueNetId GroupUID)
{ {
local Rank Rank;
`Log_Trace(); `Log_Trace();
if (GetKFPC() != None && KFPC.PlayerReplicationInfo != None) Rank = YAS.RankByGroupID(GroupUID);
if (Rank.RankID > 0)
{ {
YAS.ApplyMembership(GroupUID, KFPC.PlayerReplicationInfo.UniqueID); RankRepInfo.Rank = Rank;
} }
else else
{ {
`Log_Error("Can't apply membership for:" @ Self @ GetKFPC()); `Log_Warn("Cant find related rank for groupUID");
RankRepInfo.Rank = class'YAS_Types'.static.FromSystemRank(RankPlayer);
} }
} }
@ -254,8 +220,6 @@ private reliable client function GetScoreboard()
private simulated function InitScoreboard() private simulated function InitScoreboard()
{ {
local CachedRankRelation RR;
`Log_Trace(); `Log_Trace();
if (SC == None) return; if (SC == None) return;
@ -267,18 +231,6 @@ private simulated function InitScoreboard()
SC.UsesStats = UsesStats; SC.UsesStats = UsesStats;
SC.Custom = Custom; SC.Custom = Custom;
SC.PasswordRequired = PasswordRequired; SC.PasswordRequired = PasswordRequired;
foreach PendingRemoveRankRelations(RR)
{
RemoveRankRelation(RR);
}
PendingRemoveRankRelations.Length = 0;
foreach PendingAddRankRelations(RR)
{
AddRankRelation(RR);
}
PendingAddRankRelations.Length = 0;
} }
defaultproperties defaultproperties

View File

@ -0,0 +1,42 @@
class YAS_RankRepInfo extends ReplicationInfo;
var public UniqueNetID UID;
var public Rank Rank;
replication
{
if (bNetInitial)
UID;
if (bNetDirty)
Rank;
}
public simulated function bool SafeDestroy()
{
return (bPendingDelete || bDeleteMe || Destroy());
}
public simulated event PreBeginPlay()
{
if (bPendingDelete || bDeleteMe) return;
Super.PreBeginPlay();
if (Role == ROLE_Authority || WorldInfo.NetMode == NM_StandAlone)
{
if (Controller(Owner) != None && Controller(Owner).PlayerReplicationInfo != None)
{
UID = Controller(Owner).PlayerReplicationInfo.UniqueID;
}
}
}
defaultproperties
{
Role = ROLE_Authority
RemoteRole = ROLE_SimulatedProxy
bAlwaysRelevant = true
bSkipActorPropertyReplication = false
}

View File

@ -27,48 +27,67 @@ var localized String Players;
var localized String Spectators; var localized String Spectators;
// Cache // Cache
var public Array<YAS_RankRepInfo> RepInfos;
var public YAS_Settings Settings; var public YAS_Settings Settings;
var public String DynamicServerName; var public String DynamicServerName;
var public bool UsesStats, Custom, PasswordRequired; var public bool UsesStats, Custom, PasswordRequired;
var public SystemRank RankPlayer; var public SystemRank RankPlayer;
var public SystemRank RankAdmin; var public SystemRank RankAdmin;
var public Array<CachedRankRelation> RankRelations;
function Rank PlayerRank(KFPlayerReplicationInfo KFPRI) function Rank PlayerRank(KFPlayerReplicationInfo KFPRI)
{ {
local CachedRankRelation RankRelation; local YAS_RankRepInfo RepInfo;
local Rank Rank; local Rank Rank;
local bool NeedClean, FoundRepInfo;
`Log_Trace(); `Log_Trace();
Rank = FromSystemRank(RankPlayer); Rank = class'YAS_Types'.static.FromSystemRank(RankPlayer);
foreach RankRelations(RankRelation)
NeedClean = false;
FoundRepInfo = false;
foreach RepInfos(RepInfo)
{ {
if (RankRelation.UID.Uid == KFPRI.UniqueId.Uid) if (RepInfo == None)
{ {
Rank = RankRelation.Rank; NeedClean = true;
continue;
}
if (RepInfo.UID.Uid == KFPRI.UniqueId.Uid)
{
Rank = RepInfo.Rank;
FoundRepInfo = true;
break; break;
} }
} }
if (KFPRI.bAdmin && !Rank.OverrideAdmin) if (!FoundRepInfo)
{ {
Rank = FromSystemRank(RankAdmin); foreach KFPRI.DynamicActors(class'YAS_RankRepInfo', RepInfo)
{
if (RepInfo.UID.Uid == KFPRI.UniqueId.Uid)
{
Rank = RepInfo.Rank;
FoundRepInfo = true;
RepInfos.AddItem(RepInfo);
break;
}
}
} }
return Rank; if (NeedClean)
} {
RepInfos.RemoveItem(None);
function Rank FromSystemRank(SystemRank SysRank) }
{
local Rank Rank;
Rank.RankID = 0; if (KFPRI.bAdmin && !Rank.OverrideAdmin)
Rank.RankName = SysRank.RankName; {
Rank.RankColor = SysRank.RankColor; Rank = class'YAS_Types'.static.FromSystemRank(RankAdmin);
Rank.PlayerColor = SysRank.PlayerColor; }
Rank.OverrideAdmin = false;
return Rank; return Rank;
} }

View File

@ -341,3 +341,20 @@ struct YAS_Settings
var YAS_SettingsHealth Health; var YAS_SettingsHealth Health;
}; };
public static function Rank FromSystemRank(SystemRank SysRank)
{
local Rank RV;
RV.RankID = 0;
RV.RankName = SysRank.RankName;
RV.RankColor = SysRank.RankColor;
RV.PlayerColor = SysRank.PlayerColor;
RV.OverrideAdmin = false;
return RV;
}
defaultproperties
{
}