64 [
Attribute(
"2",
UIWidgets.Slider,
desc:
"Negative proportionality points for killing a friendly human-controlled soldier")]
67 [
Attribute(
"1",
UIWidgets.Slider,
desc:
"Negative proportionality points for killing a friendly AI-controlled soldier")]
70 [
Attribute(
"1.5",
UIWidgets.Slider,
desc:
"Negative proportionality points for killing an enemy AI-controlled soldier")]
73 [
Attribute(
"3",
UIWidgets.Slider,
desc:
"Positive proportionality points for killing an enemy human-controlled soldier")]
82 super.OnPlayerAuditSuccess(playerID, stuff);
102 super.OnPlayerDisconnected(playerID, controlledEntity);
166 if (accumulationTick == 0)
173 int currentTick =
System.GetTickCount();
212 if (harmingFriendliesScore > 0)
213 Print(
"Player with id " + playerId +
" got " + harmingFriendliesScore +
" more criminal points. Current criminal score is " + currentScore,
LogLevel.DEBUG);
233 if (durationInMinutes == -1)
239 Print(
"Player Manager is kicking a player with id " + playerId +
". Banning them for " + durationInMinutes +
" minutes.",
LogLevel.DEBUG);
240 if (durationInMinutes == 0)
260 Print(
"Incorrect setup on DataCollectorCrimesModule: Light or Heavy ban duration array is empty. Cannot ban players!",
LogLevel.ERROR);
265 playerData.CalculateSessionDuration();
268 float acceleration = playerData.GetStat(
SCR_EDataStats.CRIME_ACCELERATION);
269 float score = playerData.GetCriminalScore();
272 int durationInMinutes;
281 int timeDiffLightBan = playerData.GetStat(
SCR_EDataStats.SESSION_DURATION) - playerData.GetStat(
SCR_EDataStats.LIGHTBAN_SESSION_DURATION);
282 int streakLightBan = playerData.GetStat(
SCR_EDataStats.LIGHTBAN_STREAK);
286 int timeDiffHeavyBan = playerData.GetStat(
SCR_EDataStats.SESSION_DURATION) - playerData.GetStat(
SCR_EDataStats.HEAVYBAN_SESSION_DURATION);
287 int streakHeavyBan = playerData.GetStat(
SCR_EDataStats.HEAVYBAN_STREAK);
296 playerData.OverrideStat(
SCR_EDataStats.LIGHTBAN_STREAK, streakLightBan);
311 playerData.OverrideStat(
SCR_EDataStats.LIGHTBAN_STREAK, streakLightBan);
321 playerData.OverrideStat(
SCR_EDataStats.HEAVYBAN_STREAK, streakHeavyBan);
329 playerData.OverrideStat(
SCR_EDataStats.HEAVYBAN_STREAK, streakHeavyBan);
337 Print(
"Banning service is heavybanning a player with id " + playerId +
". Banning them for " + durationInMinutes +
" minutes.",
LogLevel.DEBUG);
340 durationInMinutes = -1;
355 durationInMinutes = 0;
361 return durationInMinutes;
367 array<float> accumulatedActions = playerData.GetAccumulatedActions();
370 float proportionalityPoints = 0;
375 if (harmingAlliesPoints <= proportionalityPoints)
378 playerData.AddStat(
SCR_EDataStats.WARCRIME_HARMING_FRIENDLIES, harmingAlliesPoints - proportionalityPoints,
false);
379 playerData.AddStat(
SCR_EDataStats.WARCRIMES, harmingAlliesPoints - proportionalityPoints,
false);
389 return PointsOfCrime * (harmingAlliesPoints - proportionalityPoints);
395 GetGame().GetDataCollector().GetPlayerData(playerId).SetTimeOut(durationInSeconds);
412 GetGame().GetPlayerManager().KickPlayer(playerId,
reason, 0);
417 GetGame().GetPlayerManager().KickPlayer(playerId,
reason, durationInSeconds);
422 GetGame().GetPlayerManager().KickPlayer(playerId,
reason, durationInSeconds);
427 GetGame().GetBackendApi().GetBanServiceApi().CreateBanPlayerId(null, playerId,
"Heavy ban", durationInSeconds);
428 GetGame().GetPlayerManager().KickPlayer(playerId,
reason, 0);
453 if (!votingManager.StartVoting(
EVotingType.AUTO_KICK, 0, playerId))
457 if (!votingManager.StartVoting(
EVotingType.AUTO_LIGHTBAN, 0, playerId))
461 if (!votingManager.StartVoting(
EVotingType.AUTO_HEAVYBAN, 0, playerId))
468 protected void SendHints(
int playerId,
float harmingFriendliesScore)
473 if (harmingFriendliesScore > 0)
475 IEntity playerController =
GetGame().GetPlayerManager().GetPlayerController(playerId);
476 if (!playerController)
479 SCR_KickHintComponent hintsComp = SCR_KickHintComponent.Cast(playerController.
FindComponent(SCR_KickHintComponent));
490 array<float> accumulatedActions = playerData.GetAccumulatedActions();
493 for (
int i = 0, count = accumulatedActions.Count(); i < count; i++)
495 float value = accumulatedActions[i];
497 playerData.AddStat(i, value,
false);
500 playerData.ResetAccumulatedActions();
506 float currentScore =
Math.Max(playerData.GetCriminalScore() - decreaseFromScore, 0);
507 currentScore += addToScore;
509 playerData.SetCriminalScore(currentScore);
522 float decreaseOfAcceleration, increaseOfAcceleration;
524 if (secondsSession < 600)
525 decreaseOfAcceleration = 0;
527 decreaseOfAcceleration =
Math.Log10(secondsSession) - 1;
534 currentAcceleration =
Math.Min(currentAcceleration + increaseOfAcceleration, config.
GetMaxAcceleration());
536 Print(
"Player with id " + playerId +
" disconnecting. Old acceleration was " + playerData.
GetStat(
SCR_EDataStats.CRIME_ACCELERATION) +
", new acceleration is " + currentAcceleration,
LogLevel.VERBOSE);
ArmaReforgerScripted GetGame()
SCR_DataCollectorComponent GetDataCollector()
SCR_AIAnimation_Loitering BaseContainerProps
Commanding menu commanding element class.
SCR_PlayerData GetPlayerData(int playerID, bool createNew=true, bool requestFromBackend=true)
SCR_PlayerManagerKickReason
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
void SCR_VotingManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
proto external Managed FindComponent(typename typeName)
float MODIFIER_PROPORTIONALITY_FRIENDLY_AI_KILLS
float MODIFIER_PROPORTIONALITY_AI_KILLS
void ExecutePunishment(int playerId, SCR_PlayerManagerKickReason reason, int durationInSeconds)
bool m_bWarCrimesProportionalityPrincipleEnabled
void CheckPlayer(int playerId)
float MODIFIER_PROPORTIONALITY_KILLS
void UpdateCriminalScore(notnull SCR_PlayerData playerData, float addToScore, float decreaseFromScore)
static const int MIN_AUTO_BAN_DURATION
override void Update(float timeTick)
ref array< int > m_aPlayerIDs
void ProcessTemporalStats(notnull SCR_PlayerData playerData)
void KickOrBanPlayer(int playerId, SCR_PlayerManagerKickReason reason, int minimmumDuration)
void SendHints(int playerId, float harmingFriendliesScore)
override void OnPlayerAuditSuccess(int playerID)
int RequestBanIfNecessary(int playerId, notnull SCR_PlayerData playerData, SCR_PlayerManagerKickReason reason)
override void OnPlayerDisconnected(int playerID, IEntity controlledEntity=null)
ref array< int > m_aLightBanPunishments
float m_fMaxTimeAccumulationThreshold
float m_fLatestActionThreshold
ref array< int > m_aHeavyBanPunishments
void VoteForKickOrBan(int playerId, SCR_PlayerManagerKickReason reason, int minimmumDurationBackup)
int m_iSecondsOfReincidencyHeavyBan
float EvaluateHarmingFriendlies(notnull SCR_PlayerData playerData)
void KickPlayer(int playerId, notnull SCR_PlayerData playerData, SCR_PlayerManagerKickReason reason)
float MODIFIER_PROPORTIONALITY_FRIENDLY_KILLS
override void OnGameModeEnd()
void EvaluatePlayerCrimes(int playerId, bool evaluatePunishment=true)
int m_iSecondsOfReincidencyLightBan
void UpdateCriminalAcceleration(int playerId)
float GetCrimePointsFriendlyKill()
float GetBanEvaluationLight()
static SCR_PlayerDataConfigs GetInstance()
float GetScoreDecreasePerSecond()
float GetCrimePointsFriendlyMultiKill()
float GetScoreThreshold()
bool GetVotingSuggestionEnabled()
float GetMinAcceleration()
float GetBanEvaluationHeavy()
float GetMaxAcceleration()
float GetScoreToAccelerationMultiplier()
int GetLatestCriminalScoreUpdateTick()
int GetAccumulatedActionsTick()
int GetLatestActionTick()
void SetTimeOut(int time)
Called manually from the SCR_DataCollectorCrimesModule.
void CalculateSessionDuration()
float GetStat(SCR_EDataStats stat, bool newStat=true)
static SCR_PlayerData GetPlayerData(int playerID)
void OverrideStat(SCR_EDataStats stat, float amount=1)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute