diff --git a/.github/workflows/mega-linter.yml b/.github/workflows/mega-linter.yml new file mode 100644 index 0000000..24897f3 --- /dev/null +++ b/.github/workflows/mega-linter.yml @@ -0,0 +1,72 @@ +--- +name: MegaLinter + +permissions: read-all + +on: + push: + pull_request: + branches: [master] + +env: + APPLY_FIXES: none + APPLY_FIXES_EVENT: pull_request + APPLY_FIXES_MODE: commit + DISABLE: SPELL + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + build: + name: MegaLinter + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v3 + with: + token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} + + - name: MegaLinter + id: ml + uses: oxsecurity/megalinter@v6 + env: + VALIDATE_ALL_CODEBASE: true + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Archive production artifacts + if: ${{ success() }} || ${{ failure() }} + uses: actions/upload-artifact@v3 + with: + name: MegaLinter reports + path: | + megalinter-reports + mega-linter.log + + - name: Create Pull Request with applied fixes + id: cpr + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} + commit-message: "[MegaLinter] Apply linters automatic fixes" + title: "[MegaLinter] Apply linters automatic fixes" + labels: bot + - name: Create PR output + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) + run: | + echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" + echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}" + + - name: Prepare commit + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) + run: sudo chown -Rc $UID .git/ + - name: Commit and push applied linter fixes + if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) + uses: stefanzweifel/git-auto-commit-action@v4 + with: + branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} + commit_message: "[MegaLinter] Apply linters fixes" + commit_user_name: megalinter-bot + commit_user_email: nicolas.vuillamy@ox.security diff --git a/LTI/Classes/LTI.uc b/LTI/Classes/LTI.uc index bcd3fb7..c707136 100644 --- a/LTI/Classes/LTI.uc +++ b/LTI/Classes/LTI.uc @@ -1,238 +1,238 @@ -class LTI extends Info - config(LTI); - -const LatestVersion = 2; - -const CfgRemoveItems = class'RemoveItems'; -const CfgOfficialWeapons = class'OfficialWeapons'; -const Trader = class'Trader'; - -var private config int Version; -var private config E_LogLevel LogLevel; -var private config bool bOfficialWeaponsList; - -var private KFGameInfo KFGI; -var private KFGameReplicationInfo KFGRI; - -var private Array > RemoveItems; -var private Array RepInfos; -var private bool ReadyToSync; - -public simulated function bool SafeDestroy() -{ - `Log_Trace(); - - return (bPendingDelete || bDeleteMe || Destroy()); -} - -public event PreBeginPlay() -{ - `Log_Trace(); - - `Log_Debug("PreBeginPlay readyToSync" @ ReadyToSync); - - if (WorldInfo.NetMode == NM_Client) - { - `Log_Fatal("NetMode == NM_Client, Destroy..."); - SafeDestroy(); - return; - } - - Super.PreBeginPlay(); - - PreInit(); -} - -public event PostBeginPlay() -{ - `Log_Trace(); - - if (bPendingDelete || bDeleteMe) return; - - Super.PostBeginPlay(); - - PostInit(); -} - -private function PreInit() -{ - `Log_Trace(); - - if (Version == `NO_CONFIG) - { - LogLevel = LL_Info; - SaveConfig(); - } - - CfgRemoveItems.static.InitConfig(Version, LatestVersion); - - switch (Version) - { - case `NO_CONFIG: - `Log_Info("Config created"); - - case 1: - - case MaxInt: - `Log_Info("Config updated to version" @ LatestVersion); - break; - - case LatestVersion: - `Log_Info("Config is up-to-date"); - break; - - default: - `Log_Warn("The config version is higher than the current version (are you using an old mutator?)"); - `Log_Warn("Config version is" @ Version @ "but current version is" @ LatestVersion); - `Log_Warn("The config version will be changed to" @ LatestVersion); - break; - } - - CfgOfficialWeapons.static.Update(bOfficialWeaponsList); - - if (LatestVersion != Version) - { - Version = LatestVersion; - SaveConfig(); - } - - if (LogLevel == LL_WrongLevel) - { - LogLevel = LL_Info; - `Log_Warn("Wrong 'LogLevel', return to default value"); - SaveConfig(); - } - `Log_Base("LogLevel:" @ LogLevel); - - RemoveItems = CfgRemoveItems.static.Load(LogLevel); -} - -private function PostInit() -{ - local LTI_RepInfo RepInfo; - - `Log_Trace(); - - if (WorldInfo == None || WorldInfo.Game == None) - { - SetTimer(1.0f, false, nameof(PostInit)); - return; - } - - KFGI = KFGameInfo(WorldInfo.Game); - if (KFGI == None) - { - `Log_Fatal("Incompatible gamemode:" @ WorldInfo.Game); - SafeDestroy(); - return; - } - - if (KFGI.GameReplicationInfo == None) - { - SetTimer(1.0f, false, nameof(PostInit)); - return; - } - - KFGRI = KFGameReplicationInfo(KFGI.GameReplicationInfo); - if (KFGRI == None) - { - `Log_Fatal("Incompatible Replication info:" @ KFGI.GameReplicationInfo); - SafeDestroy(); - return; - } - - Trader.static.ModifyTrader( - KFGRI, - RemoveItems, - CfgRemoveItems.default.bAll, - CfgRemoveItems.default.bHRG, - CfgRemoveItems.default.bDLC, - LogLevel); - - ReadyToSync = true; - - foreach RepInfos(RepInfo) - { - if (RepInfo.PendingSync) - { - RepInfo.ServerSync(); - } - } -} - -public function NotifyLogin(Controller C) -{ - `Log_Trace(); - - if (!CreateRepInfo(C)) - { - `Log_Error("Can't create RepInfo for:" @ C); - } -} - -public function NotifyLogout(Controller C) -{ - `Log_Trace(); - - DestroyRepInfo(C); -} - -public function bool CreateRepInfo(Controller C) -{ - local LTI_RepInfo RepInfo; - - `Log_Trace(); - - if (C == None) return false; - - RepInfo = Spawn(class'LTI_RepInfo', C); - - if (RepInfo == None) return false; - - RepInfo.PrepareSync( - Self, - LogLevel, - RemoveItems, - CfgRemoveItems.default.bAll, - CfgRemoveItems.default.bHRG, - CfgRemoveItems.default.bDLC); - - RepInfos.AddItem(RepInfo); - - if (ReadyToSync) - { - RepInfo.ServerSync(); - } - else - { - RepInfo.PendingSync = true; - } - - return true; -} - -public function bool DestroyRepInfo(Controller C) -{ - local LTI_RepInfo RepInfo; - - `Log_Trace(); - - if (C == None) return false; - - foreach RepInfos(RepInfo) - { - if (RepInfo.Owner == C) - { - RepInfos.RemoveItem(RepInfo); - RepInfo.SafeDestroy(); - return true; - } - } - - return false; -} - -DefaultProperties -{ - ReadyToSync = false +class LTI extends Info + config(LTI); + +const LatestVersion = 2; + +const CfgRemoveItems = class'RemoveItems'; +const CfgOfficialWeapons = class'OfficialWeapons'; +const Trader = class'Trader'; + +var private config int Version; +var private config E_LogLevel LogLevel; +var private config bool bOfficialWeaponsList; + +var private KFGameInfo KFGI; +var private KFGameReplicationInfo KFGRI; + +var private Array > RemoveItems; +var private Array RepInfos; +var private bool ReadyToSync; + +public simulated function bool SafeDestroy() +{ + `Log_Trace(); + + return (bPendingDelete || bDeleteMe || Destroy()); +} + +public event PreBeginPlay() +{ + `Log_Trace(); + + `Log_Debug("PreBeginPlay readyToSync" @ ReadyToSync); + + if (WorldInfo.NetMode == NM_Client) + { + `Log_Fatal("NetMode == NM_Client, Destroy..."); + SafeDestroy(); + return; + } + + Super.PreBeginPlay(); + + PreInit(); +} + +public event PostBeginPlay() +{ + `Log_Trace(); + + if (bPendingDelete || bDeleteMe) return; + + Super.PostBeginPlay(); + + PostInit(); +} + +private function PreInit() +{ + `Log_Trace(); + + if (Version == `NO_CONFIG) + { + LogLevel = LL_Info; + SaveConfig(); + } + + CfgRemoveItems.static.InitConfig(Version, LatestVersion); + + switch (Version) + { + case `NO_CONFIG: + `Log_Info("Config created"); + + case 1: + + case MaxInt: + `Log_Info("Config updated to version" @ LatestVersion); + break; + + case LatestVersion: + `Log_Info("Config is up-to-date"); + break; + + default: + `Log_Warn("The config version is higher than the current version (are you using an old mutator?)"); + `Log_Warn("Config version is" @ Version @ "but current version is" @ LatestVersion); + `Log_Warn("The config version will be changed to" @ LatestVersion); + break; + } + + CfgOfficialWeapons.static.Update(bOfficialWeaponsList); + + if (LatestVersion != Version) + { + Version = LatestVersion; + SaveConfig(); + } + + if (LogLevel == LL_WrongLevel) + { + LogLevel = LL_Info; + `Log_Warn("Wrong 'LogLevel', return to default value"); + SaveConfig(); + } + `Log_Base("LogLevel:" @ LogLevel); + + RemoveItems = CfgRemoveItems.static.Load(LogLevel); +} + +private function PostInit() +{ + local LTI_RepInfo RepInfo; + + `Log_Trace(); + + if (WorldInfo == None || WorldInfo.Game == None) + { + SetTimer(1.0f, false, nameof(PostInit)); + return; + } + + KFGI = KFGameInfo(WorldInfo.Game); + if (KFGI == None) + { + `Log_Fatal("Incompatible gamemode:" @ WorldInfo.Game); + SafeDestroy(); + return; + } + + if (KFGI.GameReplicationInfo == None) + { + SetTimer(1.0f, false, nameof(PostInit)); + return; + } + + KFGRI = KFGameReplicationInfo(KFGI.GameReplicationInfo); + if (KFGRI == None) + { + `Log_Fatal("Incompatible Replication info:" @ KFGI.GameReplicationInfo); + SafeDestroy(); + return; + } + + Trader.static.ModifyTrader( + KFGRI, + RemoveItems, + CfgRemoveItems.default.bAll, + CfgRemoveItems.default.bHRG, + CfgRemoveItems.default.bDLC, + LogLevel); + + ReadyToSync = true; + + foreach RepInfos(RepInfo) + { + if (RepInfo.PendingSync) + { + RepInfo.ServerSync(); + } + } +} + +public function NotifyLogin(Controller C) +{ + `Log_Trace(); + + if (!CreateRepInfo(C)) + { + `Log_Error("Can't create RepInfo for:" @ C); + } +} + +public function NotifyLogout(Controller C) +{ + `Log_Trace(); + + DestroyRepInfo(C); +} + +public function bool CreateRepInfo(Controller C) +{ + local LTI_RepInfo RepInfo; + + `Log_Trace(); + + if (C == None) return false; + + RepInfo = Spawn(class'LTI_RepInfo', C); + + if (RepInfo == None) return false; + + RepInfo.PrepareSync( + Self, + LogLevel, + RemoveItems, + CfgRemoveItems.default.bAll, + CfgRemoveItems.default.bHRG, + CfgRemoveItems.default.bDLC); + + RepInfos.AddItem(RepInfo); + + if (ReadyToSync) + { + RepInfo.ServerSync(); + } + else + { + RepInfo.PendingSync = true; + } + + return true; +} + +public function bool DestroyRepInfo(Controller C) +{ + local LTI_RepInfo RepInfo; + + `Log_Trace(); + + if (C == None) return false; + + foreach RepInfos(RepInfo) + { + if (RepInfo.Owner == C) + { + RepInfos.RemoveItem(RepInfo); + RepInfo.SafeDestroy(); + return true; + } + } + + return false; +} + +DefaultProperties +{ + ReadyToSync = false } \ No newline at end of file diff --git a/LTI/Classes/LTI.upkg b/LTI/Classes/LTI.upkg index 29cb156..09febdf 100644 --- a/LTI/Classes/LTI.upkg +++ b/LTI/Classes/LTI.upkg @@ -1,4 +1,4 @@ -[Flags] -AllowDownload=True -ClientOptional=False -ServerSideOnly=False +[Flags] +AllowDownload=True +ClientOptional=False +ServerSideOnly=False diff --git a/LTI/Classes/LTIMut.uc b/LTI/Classes/LTIMut.uc index 40e528f..ef77a6b 100644 --- a/LTI/Classes/LTIMut.uc +++ b/LTI/Classes/LTIMut.uc @@ -1,60 +1,60 @@ -class LTIMut extends KFMutator; - -var private LTI LTI; - -public simulated function bool SafeDestroy() -{ - return (bPendingDelete || bDeleteMe || Destroy()); -} - -public event PreBeginPlay() -{ - Super.PreBeginPlay(); - - if (WorldInfo.NetMode == NM_Client) return; - - foreach WorldInfo.DynamicActors(class'LTI', LTI) - { - break; - } - - if (LTI == None) - { - LTI = WorldInfo.Spawn(class'LTI'); - } - - if (LTI == None) - { - `Log_Base("FATAL: Can't Spawn 'LTI'"); - SafeDestroy(); - } -} - -public function AddMutator(Mutator Mut) -{ - if (Mut == Self) return; - - if (Mut.Class == Class) - LTIMut(Mut).SafeDestroy(); - else - Super.AddMutator(Mut); -} - -public function NotifyLogin(Controller C) -{ - LTI.NotifyLogin(C); - - Super.NotifyLogin(C); -} - -public function NotifyLogout(Controller C) -{ - LTI.NotifyLogout(C); - - Super.NotifyLogout(C); -} - -DefaultProperties -{ - +class LTIMut extends KFMutator; + +var private LTI LTI; + +public simulated function bool SafeDestroy() +{ + return (bPendingDelete || bDeleteMe || Destroy()); +} + +public event PreBeginPlay() +{ + Super.PreBeginPlay(); + + if (WorldInfo.NetMode == NM_Client) return; + + foreach WorldInfo.DynamicActors(class'LTI', LTI) + { + break; + } + + if (LTI == None) + { + LTI = WorldInfo.Spawn(class'LTI'); + } + + if (LTI == None) + { + `Log_Base("FATAL: Can't Spawn 'LTI'"); + SafeDestroy(); + } +} + +public function AddMutator(Mutator Mut) +{ + if (Mut == Self) return; + + if (Mut.Class == Class) + LTIMut(Mut).SafeDestroy(); + else + Super.AddMutator(Mut); +} + +public function NotifyLogin(Controller C) +{ + LTI.NotifyLogin(C); + + Super.NotifyLogin(C); +} + +public function NotifyLogout(Controller C) +{ + LTI.NotifyLogout(C); + + Super.NotifyLogout(C); +} + +DefaultProperties +{ + } \ No newline at end of file diff --git a/LTI/Classes/LTI_LocalMessage.uc b/LTI/Classes/LTI_LocalMessage.uc index ab5614f..5538a15 100644 --- a/LTI/Classes/LTI_LocalMessage.uc +++ b/LTI/Classes/LTI_LocalMessage.uc @@ -1,73 +1,73 @@ -class LTI_LocalMessage extends Object - abstract; - -var const String SyncItemsDefault; -var private localized String SyncItems; - -var const String SyncFinishedDefault; -var private localized String SyncFinished; - -var const String WaitingGRIDefault; -var private localized String WaitingGRI; - -var const String IncompatibleGRIDefault; -var private localized String IncompatibleGRI; - -var const String DisconnectDefault; -var private localized String Disconnect; - -var const String SecondsShortDefault; -var private localized String SecondsShort; - -enum E_LTI_LocalMessageType -{ - LTI_SyncItems, - LTI_SyncFinished, - LTI_WaitingGRI, - LTI_IncompatibleGRI, - LTI_Disconnect, - LTI_SecondsShort -}; - -public static function String GetLocalizedString( - E_LogLevel LogLevel, - E_LTI_LocalMessageType LMT, - optional String String1, - optional String String2, - optional String String3) -{ - `Log_TraceStatic(); - - switch (LMT) - { - case LTI_SyncItems: - return (default.SyncItems != "" ? default.SyncItems : default.SyncItemsDefault); - - case LTI_SyncFinished: - return (default.SyncFinished != "" ? default.SyncFinished : default.SyncFinishedDefault); - - case LTI_WaitingGRI: - return (default.WaitingGRI != "" ? default.WaitingGRI : default.WaitingGRIDefault); - - case LTI_IncompatibleGRI: - return (default.IncompatibleGRI != "" ? default.IncompatibleGRI : default.IncompatibleGRIDefault); - - case LTI_Disconnect: - return (default.Disconnect != "" ? default.Disconnect : default.DisconnectDefault); - - case LTI_SecondsShort: - return (default.SecondsShort != "" ? default.SecondsShort : default.SecondsShortDefault); - } - - return ""; -} - -defaultproperties -{ - SyncItemsDefault = "Sync items:" - SyncFinishedDefault = "Sync finished." - WaitingGRIDefault = "Waiting GRI..." - IncompatibleGRIDefault = "Incompatible GRI:" - DisconnectDefault = "Disconnect..." - SecondsShortDefault = "s" +class LTI_LocalMessage extends Object + abstract; + +var const String SyncItemsDefault; +var private localized String SyncItems; + +var const String SyncFinishedDefault; +var private localized String SyncFinished; + +var const String WaitingGRIDefault; +var private localized String WaitingGRI; + +var const String IncompatibleGRIDefault; +var private localized String IncompatibleGRI; + +var const String DisconnectDefault; +var private localized String Disconnect; + +var const String SecondsShortDefault; +var private localized String SecondsShort; + +enum E_LTI_LocalMessageType +{ + LTI_SyncItems, + LTI_SyncFinished, + LTI_WaitingGRI, + LTI_IncompatibleGRI, + LTI_Disconnect, + LTI_SecondsShort +}; + +public static function String GetLocalizedString( + E_LogLevel LogLevel, + E_LTI_LocalMessageType LMT, + optional String String1, + optional String String2, + optional String String3) +{ + `Log_TraceStatic(); + + switch (LMT) + { + case LTI_SyncItems: + return (default.SyncItems != "" ? default.SyncItems : default.SyncItemsDefault); + + case LTI_SyncFinished: + return (default.SyncFinished != "" ? default.SyncFinished : default.SyncFinishedDefault); + + case LTI_WaitingGRI: + return (default.WaitingGRI != "" ? default.WaitingGRI : default.WaitingGRIDefault); + + case LTI_IncompatibleGRI: + return (default.IncompatibleGRI != "" ? default.IncompatibleGRI : default.IncompatibleGRIDefault); + + case LTI_Disconnect: + return (default.Disconnect != "" ? default.Disconnect : default.DisconnectDefault); + + case LTI_SecondsShort: + return (default.SecondsShort != "" ? default.SecondsShort : default.SecondsShortDefault); + } + + return ""; +} + +defaultproperties +{ + SyncItemsDefault = "Sync items:" + SyncFinishedDefault = "Sync finished." + WaitingGRIDefault = "Waiting GRI..." + IncompatibleGRIDefault = "Incompatible GRI:" + DisconnectDefault = "Disconnect..." + SecondsShortDefault = "s" } \ No newline at end of file diff --git a/LTI/Classes/LTI_RepInfo.uc b/LTI/Classes/LTI_RepInfo.uc index 093d8fa..1c54f47 100644 --- a/LTI/Classes/LTI_RepInfo.uc +++ b/LTI/Classes/LTI_RepInfo.uc @@ -1,282 +1,282 @@ -class LTI_RepInfo extends ReplicationInfo; - -const Trader = class'Trader'; -const LocalMessage = class'LTI_LocalMessage'; - -var public bool PendingSync; - -var private LTI LTI; -var private E_LogLevel LogLevel; -var private Array > RemoveItems; -var private bool ReplaceMode; -var private bool RemoveHRG; -var private bool RemoveDLC; - -var private int Recieved; -var private int SyncSize; - -var private KFPlayerController KFPC; -var private KFGFxWidget_PartyInGame PartyInGameWidget; -var private GFxObject Notification; - -var private String NotificationHeaderText; -var private String NotificationLeftText; -var private String NotificationRightText; -var private int NotificationPercent; - -var private int WaitingGRI; - -replication -{ - if (bNetInitial && Role == ROLE_Authority) - LogLevel, ReplaceMode, RemoveHRG, RemoveDLC, SyncSize; -} - -public simulated function bool SafeDestroy() -{ - `Log_Trace(); - - return (bPendingDelete || bDeleteMe || Destroy()); -} - -public function PrepareSync( - LTI _LTI, - E_LogLevel _LogLevel, - Array > _RemoveItems, - bool _ReplaceMode, - bool _RemoveHRG, - bool _RemoveDLC) -{ - `Log_Trace(); - - LTI = _LTI; - LogLevel = _LogLevel; - RemoveItems = _RemoveItems; - ReplaceMode = _ReplaceMode; - RemoveHRG = _RemoveHRG; - RemoveDLC = _RemoveDLC; - SyncSize = RemoveItems.Length; -} - -private simulated function KFPlayerController GetKFPC() -{ - `Log_Trace(); - - if (KFPC != None) return KFPC; - - KFPC = KFPlayerController(Owner); - - if (KFPC == None && ROLE < ROLE_Authority) - { - KFPC = KFPlayerController(GetALocalPlayerController()); - } - - return KFPC; -} - -private simulated function SetPartyInGameWidget() -{ - `Log_Trace(); - - if (GetKFPC() == None) return; - - if (KFPC.MyGFxManager == None) return; - if (KFPC.MyGFxManager.PartyWidget == None) return; - - PartyInGameWidget = KFGFxWidget_PartyInGame(KFPC.MyGFxManager.PartyWidget); - Notification = PartyInGameWidget.Notification; -} - -private simulated function bool CheckPartyInGameWidget() -{ - `Log_Trace(); - - if (PartyInGameWidget == None) - { - SetPartyInGameWidget(); - } - - return (PartyInGameWidget != None); -} - -private simulated function HideReadyButton() -{ - `Log_Trace(); - - if (CheckPartyInGameWidget()) - { - PartyInGameWidget.SetReadyButtonVisibility(false); - } -} - -private simulated function ShowReadyButton() -{ - `Log_Trace(); - - if (CheckPartyInGameWidget()) - { - Notification.SetVisible(false); - PartyInGameWidget.SetReadyButtonVisibility(true); - PartyInGameWidget.UpdateReadyButtonText(); - PartyInGameWidget.UpdateReadyButtonVisibility(); - } -} - -private simulated function UpdateNotification(String Title, String Left, String Right, int Percent) -{ - `Log_Trace(); - - if (CheckPartyInGameWidget() && Notification != None) - { - Notification.SetString("itemName", Title); - Notification.SetFloat("percent", Percent); - Notification.SetInt("queue", 0); - Notification.SetString("downLoading", Left); - Notification.SetString("remaining", Right); - Notification.SetObject("notificationInfo", Notification); - Notification.SetVisible(true); - } -} - -private reliable client function ClientSync(class WeapDef) -{ - `Log_Trace(); - - if (WeapDef == None) - { - `Log_Fatal("WeapDef is:" @ WeapDef); - Cleanup(); - ConsoleCommand("Disconnect"); - SafeDestroy(); - return; - } - - if (!IsTimerActive(nameof(KeepNotification))) - { - SetTimer(0.1f, true, nameof(KeepNotification)); - } - - RemoveItems.AddItem(WeapDef); - - Recieved = RemoveItems.Length; - - NotificationHeaderText = "-" @ WeapDef.static.GetItemName(); - NotificationLeftText = LocalMessage.static.GetLocalizedString(LogLevel, LTI_SyncItems); - NotificationRightText = Recieved @ "/" @ SyncSize; - if (SyncSize != 0) - { - NotificationPercent = (float(Recieved) / float(SyncSize)) * 100; - } - - `Log_Debug("ClientSync: -" @ String(WeapDef) @ NotificationRightText); - - ServerSync(); -} - -private simulated function KeepNotification() -{ - HideReadyButton(); - UpdateNotification( - NotificationHeaderText, - NotificationLeftText, - NotificationRightText, - NotificationPercent); -} - -private simulated reliable client function ClientSyncFinished() -{ - local KFGameReplicationInfo KFGRI; - - `Log_Trace(); - - NotificationLeftText = ""; - NotificationRightText = ""; - NotificationPercent = 0; - - if (WorldInfo.GRI == None) - { - `Log_Debug("ClientSyncFinished: Waiting GRI"); - NotificationHeaderText = LocalMessage.static.GetLocalizedString(LogLevel, LTI_WaitingGRI); - NotificationLeftText = String(++WaitingGRI) $ LocalMessage.static.GetLocalizedString(LogLevel, LTI_SecondsShort); - NotificationRightText = ""; - SetTimer(1.0f, false, nameof(ClientSyncFinished)); - return; - } - - KFGRI = KFGameReplicationInfo(WorldInfo.GRI); - if (KFGRI == None) - { - `Log_Fatal("Incompatible Replication info:" @ String(WorldInfo.GRI)); - ClearTimer(nameof(KeepNotification)); - UpdateNotification( - LocalMessage.static.GetLocalizedString(LogLevel, LTI_IncompatibleGRI) @ String(WorldInfo.GRI), - LocalMessage.static.GetLocalizedString(LogLevel, LTI_Disconnect), "", 0); - Cleanup(); - ConsoleCommand("Disconnect"); - SafeDestroy(); - return; - } - - NotificationHeaderText = LocalMessage.static.GetLocalizedString(LogLevel, LTI_SyncFinished); - NotificationLeftText = ""; - NotificationRightText = ""; - NotificationPercent = 0; - - Trader.static.ModifyTrader(KFGRI, RemoveItems, ReplaceMode, RemoveHRG, RemoveDLC, LogLevel); - `Log_Debug("ClientSyncFinished: Trader.static.ModifyTrader"); - - ClearTimer(nameof(KeepNotification)); - ShowReadyButton(); - - Cleanup(); - - SafeDestroy(); -} - -private reliable server function Cleanup() -{ - `Log_Trace(); - - `Log_Debug("Cleanup"); - if (!LTI.DestroyRepInfo(Controller(Owner))) - { - `Log_Debug("Cleanup (forced)"); - SafeDestroy(); - } -} - -public reliable server function ServerSync() -{ - `Log_Trace(); - - PendingSync = false; - - if (bPendingDelete || bDeleteMe) return; - - if (SyncSize <= Recieved || WorldInfo.NetMode == NM_StandAlone) - { - `Log_Debug("ServerSync: Finished"); - ClientSyncFinished(); - } - else - { - if (Recieved < RemoveItems.Length) - { - `Log_Debug("ServerSync[-]:" @ (Recieved + 1) @ "/" @ SyncSize @ RemoveItems[Recieved]); - ClientSync(RemoveItems[Recieved++]); - } - } -} - -defaultproperties -{ - bAlwaysRelevant = false - bOnlyRelevantToOwner = true - bSkipActorPropertyReplication = false - - PendingSync = false - Recieved = 0 - - NotificationPercent = 0 - WaitingGRI = 0 -} +class LTI_RepInfo extends ReplicationInfo; + +const Trader = class'Trader'; +const LocalMessage = class'LTI_LocalMessage'; + +var public bool PendingSync; + +var private LTI LTI; +var private E_LogLevel LogLevel; +var private Array > RemoveItems; +var private bool ReplaceMode; +var private bool RemoveHRG; +var private bool RemoveDLC; + +var private int Recieved; +var private int SyncSize; + +var private KFPlayerController KFPC; +var private KFGFxWidget_PartyInGame PartyInGameWidget; +var private GFxObject Notification; + +var private String NotificationHeaderText; +var private String NotificationLeftText; +var private String NotificationRightText; +var private int NotificationPercent; + +var private int WaitingGRI; + +replication +{ + if (bNetInitial && Role == ROLE_Authority) + LogLevel, ReplaceMode, RemoveHRG, RemoveDLC, SyncSize; +} + +public simulated function bool SafeDestroy() +{ + `Log_Trace(); + + return (bPendingDelete || bDeleteMe || Destroy()); +} + +public function PrepareSync( + LTI _LTI, + E_LogLevel _LogLevel, + Array > _RemoveItems, + bool _ReplaceMode, + bool _RemoveHRG, + bool _RemoveDLC) +{ + `Log_Trace(); + + LTI = _LTI; + LogLevel = _LogLevel; + RemoveItems = _RemoveItems; + ReplaceMode = _ReplaceMode; + RemoveHRG = _RemoveHRG; + RemoveDLC = _RemoveDLC; + SyncSize = RemoveItems.Length; +} + +private simulated function KFPlayerController GetKFPC() +{ + `Log_Trace(); + + if (KFPC != None) return KFPC; + + KFPC = KFPlayerController(Owner); + + if (KFPC == None && ROLE < ROLE_Authority) + { + KFPC = KFPlayerController(GetALocalPlayerController()); + } + + return KFPC; +} + +private simulated function SetPartyInGameWidget() +{ + `Log_Trace(); + + if (GetKFPC() == None) return; + + if (KFPC.MyGFxManager == None) return; + if (KFPC.MyGFxManager.PartyWidget == None) return; + + PartyInGameWidget = KFGFxWidget_PartyInGame(KFPC.MyGFxManager.PartyWidget); + Notification = PartyInGameWidget.Notification; +} + +private simulated function bool CheckPartyInGameWidget() +{ + `Log_Trace(); + + if (PartyInGameWidget == None) + { + SetPartyInGameWidget(); + } + + return (PartyInGameWidget != None); +} + +private simulated function HideReadyButton() +{ + `Log_Trace(); + + if (CheckPartyInGameWidget()) + { + PartyInGameWidget.SetReadyButtonVisibility(false); + } +} + +private simulated function ShowReadyButton() +{ + `Log_Trace(); + + if (CheckPartyInGameWidget()) + { + Notification.SetVisible(false); + PartyInGameWidget.SetReadyButtonVisibility(true); + PartyInGameWidget.UpdateReadyButtonText(); + PartyInGameWidget.UpdateReadyButtonVisibility(); + } +} + +private simulated function UpdateNotification(String Title, String Left, String Right, int Percent) +{ + `Log_Trace(); + + if (CheckPartyInGameWidget() && Notification != None) + { + Notification.SetString("itemName", Title); + Notification.SetFloat("percent", Percent); + Notification.SetInt("queue", 0); + Notification.SetString("downLoading", Left); + Notification.SetString("remaining", Right); + Notification.SetObject("notificationInfo", Notification); + Notification.SetVisible(true); + } +} + +private reliable client function ClientSync(class WeapDef) +{ + `Log_Trace(); + + if (WeapDef == None) + { + `Log_Fatal("WeapDef is:" @ WeapDef); + Cleanup(); + ConsoleCommand("Disconnect"); + SafeDestroy(); + return; + } + + if (!IsTimerActive(nameof(KeepNotification))) + { + SetTimer(0.1f, true, nameof(KeepNotification)); + } + + RemoveItems.AddItem(WeapDef); + + Recieved = RemoveItems.Length; + + NotificationHeaderText = "-" @ WeapDef.static.GetItemName(); + NotificationLeftText = LocalMessage.static.GetLocalizedString(LogLevel, LTI_SyncItems); + NotificationRightText = Recieved @ "/" @ SyncSize; + if (SyncSize != 0) + { + NotificationPercent = (float(Recieved) / float(SyncSize)) * 100; + } + + `Log_Debug("ClientSync: -" @ String(WeapDef) @ NotificationRightText); + + ServerSync(); +} + +private simulated function KeepNotification() +{ + HideReadyButton(); + UpdateNotification( + NotificationHeaderText, + NotificationLeftText, + NotificationRightText, + NotificationPercent); +} + +private simulated reliable client function ClientSyncFinished() +{ + local KFGameReplicationInfo KFGRI; + + `Log_Trace(); + + NotificationLeftText = ""; + NotificationRightText = ""; + NotificationPercent = 0; + + if (WorldInfo.GRI == None) + { + `Log_Debug("ClientSyncFinished: Waiting GRI"); + NotificationHeaderText = LocalMessage.static.GetLocalizedString(LogLevel, LTI_WaitingGRI); + NotificationLeftText = String(++WaitingGRI) $ LocalMessage.static.GetLocalizedString(LogLevel, LTI_SecondsShort); + NotificationRightText = ""; + SetTimer(1.0f, false, nameof(ClientSyncFinished)); + return; + } + + KFGRI = KFGameReplicationInfo(WorldInfo.GRI); + if (KFGRI == None) + { + `Log_Fatal("Incompatible Replication info:" @ String(WorldInfo.GRI)); + ClearTimer(nameof(KeepNotification)); + UpdateNotification( + LocalMessage.static.GetLocalizedString(LogLevel, LTI_IncompatibleGRI) @ String(WorldInfo.GRI), + LocalMessage.static.GetLocalizedString(LogLevel, LTI_Disconnect), "", 0); + Cleanup(); + ConsoleCommand("Disconnect"); + SafeDestroy(); + return; + } + + NotificationHeaderText = LocalMessage.static.GetLocalizedString(LogLevel, LTI_SyncFinished); + NotificationLeftText = ""; + NotificationRightText = ""; + NotificationPercent = 0; + + Trader.static.ModifyTrader(KFGRI, RemoveItems, ReplaceMode, RemoveHRG, RemoveDLC, LogLevel); + `Log_Debug("ClientSyncFinished: Trader.static.ModifyTrader"); + + ClearTimer(nameof(KeepNotification)); + ShowReadyButton(); + + Cleanup(); + + SafeDestroy(); +} + +private reliable server function Cleanup() +{ + `Log_Trace(); + + `Log_Debug("Cleanup"); + if (!LTI.DestroyRepInfo(Controller(Owner))) + { + `Log_Debug("Cleanup (forced)"); + SafeDestroy(); + } +} + +public reliable server function ServerSync() +{ + `Log_Trace(); + + PendingSync = false; + + if (bPendingDelete || bDeleteMe) return; + + if (SyncSize <= Recieved || WorldInfo.NetMode == NM_StandAlone) + { + `Log_Debug("ServerSync: Finished"); + ClientSyncFinished(); + } + else + { + if (Recieved < RemoveItems.Length) + { + `Log_Debug("ServerSync[-]:" @ (Recieved + 1) @ "/" @ SyncSize @ RemoveItems[Recieved]); + ClientSync(RemoveItems[Recieved++]); + } + } +} + +defaultproperties +{ + bAlwaysRelevant = false + bOnlyRelevantToOwner = true + bSkipActorPropertyReplication = false + + PendingSync = false + Recieved = 0 + + NotificationPercent = 0 + WaitingGRI = 0 +} diff --git a/LTI/Classes/OfficialWeapons.uc b/LTI/Classes/OfficialWeapons.uc index eacf954..325c74e 100644 --- a/LTI/Classes/OfficialWeapons.uc +++ b/LTI/Classes/OfficialWeapons.uc @@ -1,43 +1,43 @@ -class OfficialWeapons extends Object - config(LTI); - -const Trader = class'Trader'; -const DefaultComment = "Auto-generated list of official weapons for your convenience, copy-paste ready"; - -var private config String Comment; -var private config Array Item; - -private delegate int ByName(String A, String B) -{ - return A > B ? -1 : 0; -} - -public static function Update(bool Enabled) -{ - local Array > KFWeapDefs; - local class KFWeapDef; - - if (!Enabled) return; - - KFWeapDefs = Trader.static.GetTraderWeapDefs(); - - if (default.Item.Length != KFWeapDefs.Length || default.Comment != DefaultComment) - { - default.Comment = DefaultComment; - default.Item.Length = 0; - - foreach KFWeapDefs(KFWeapDef) - { - default.Item.AddItem(KFWeapDef.GetPackageName() $ "." $ KFWeapDef); - } - - default.Item.Sort(ByName); - - StaticSaveConfig(); - } -} - -defaultproperties -{ - -} +class OfficialWeapons extends Object + config(LTI); + +const Trader = class'Trader'; +const DefaultComment = "Auto-generated list of official weapons for your convenience, copy-paste ready"; + +var private config String Comment; +var private config Array Item; + +private delegate int ByName(String A, String B) +{ + return A > B ? -1 : 0; +} + +public static function Update(bool Enabled) +{ + local Array > KFWeapDefs; + local class KFWeapDef; + + if (!Enabled) return; + + KFWeapDefs = Trader.static.GetTraderWeapDefs(); + + if (default.Item.Length != KFWeapDefs.Length || default.Comment != DefaultComment) + { + default.Comment = DefaultComment; + default.Item.Length = 0; + + foreach KFWeapDefs(KFWeapDef) + { + default.Item.AddItem(KFWeapDef.GetPackageName() $ "." $ KFWeapDef); + } + + default.Item.Sort(ByName); + + StaticSaveConfig(); + } +} + +defaultproperties +{ + +} diff --git a/LTI/Classes/RemoveItems.uc b/LTI/Classes/RemoveItems.uc index e15839f..341c70c 100644 --- a/LTI/Classes/RemoveItems.uc +++ b/LTI/Classes/RemoveItems.uc @@ -1,105 +1,105 @@ -class RemoveItems extends Object - dependson(LTI) - config(LTI); - -var public config bool bAll; -var public config bool bHRG; -var public config bool bDLC; -var private config Array Item; - -public static function InitConfig(int Version, int LatestVersion) -{ - switch (Version) - { - case `NO_CONFIG: - ApplyDefault(); - - case 1: - default.bHRG = false; - default.bDLC = false; - - default: break; - } - - if (LatestVersion != Version) - { - StaticSaveConfig(); - } -} - -private static function ApplyDefault() -{ - default.bAll = false; - default.bHRG = false; - default.bDLC = false; - default.Item.Length = 0; - default.Item.AddItem("KFGame.KFWeapDef_9mmDual"); -} - -public static function Array > Load(E_LogLevel LogLevel) -{ - local Array > ItemList; - local class ItemWeapDef; - local class ItemWeapon; - local String ItemRaw; - local int Line; - - `Log_Info("Load items to remove:"); - if (default.bAll) - { - `Log_Info("Remove all default items"); - } - else - { - if (default.bHRG) - { - `Log_Info("Remove all HRG items"); - } - if (default.bDLC) - { - `Log_Info("Remove all DLC items"); - } - - foreach default.Item(ItemRaw, Line) - { - ItemWeapDef = class(DynamicLoadObject(ItemRaw, class'Class')); - if (ItemWeapDef == None) - { - `Log_Warn("[" $ Line + 1 $ "]" @ "Can't load weapon definition:" @ ItemRaw); - continue; - } - - ItemWeapon = class(DynamicLoadObject(ItemWeapDef.default.WeaponClassPath, class'Class')); - if (ItemWeapon == None) - { - `Log_Warn("[" $ Line + 1 $ "]" @ "Can't load weapon:" @ ItemWeapDef.default.WeaponClassPath); - continue; - } - - if (ItemList.Find(ItemWeapDef) != INDEX_NONE) - { - `Log_Warn("[" $ Line + 1 $ "]" @ "Duplicate item:" @ ItemRaw @ "(skip)"); - continue; - } - - ItemList.AddItem(ItemWeapDef); - `Log_Debug("[" $ Line + 1 $ "]" @ "Loaded successfully:" @ ItemRaw); - } - - if (ItemList.Length == default.Item.Length) - { - `Log_Info("Items to remove list loaded successfully (" $ ItemList.Length @ "entries)"); - } - else - { - `Log_Info("Items to remove list: loaded" @ ItemList.Length @ "of" @ default.Item.Length @ "entries"); - } - } - - return ItemList; -} - -defaultproperties -{ - -} +class RemoveItems extends Object + dependson(LTI) + config(LTI); + +var public config bool bAll; +var public config bool bHRG; +var public config bool bDLC; +var private config Array Item; + +public static function InitConfig(int Version, int LatestVersion) +{ + switch (Version) + { + case `NO_CONFIG: + ApplyDefault(); + + case 1: + default.bHRG = false; + default.bDLC = false; + + default: break; + } + + if (LatestVersion != Version) + { + StaticSaveConfig(); + } +} + +private static function ApplyDefault() +{ + default.bAll = false; + default.bHRG = false; + default.bDLC = false; + default.Item.Length = 0; + default.Item.AddItem("KFGame.KFWeapDef_9mmDual"); +} + +public static function Array > Load(E_LogLevel LogLevel) +{ + local Array > ItemList; + local class ItemWeapDef; + local class ItemWeapon; + local String ItemRaw; + local int Line; + + `Log_Info("Load items to remove:"); + if (default.bAll) + { + `Log_Info("Remove all default items"); + } + else + { + if (default.bHRG) + { + `Log_Info("Remove all HRG items"); + } + if (default.bDLC) + { + `Log_Info("Remove all DLC items"); + } + + foreach default.Item(ItemRaw, Line) + { + ItemWeapDef = class(DynamicLoadObject(ItemRaw, class'Class')); + if (ItemWeapDef == None) + { + `Log_Warn("[" $ Line + 1 $ "]" @ "Can't load weapon definition:" @ ItemRaw); + continue; + } + + ItemWeapon = class(DynamicLoadObject(ItemWeapDef.default.WeaponClassPath, class'Class')); + if (ItemWeapon == None) + { + `Log_Warn("[" $ Line + 1 $ "]" @ "Can't load weapon:" @ ItemWeapDef.default.WeaponClassPath); + continue; + } + + if (ItemList.Find(ItemWeapDef) != INDEX_NONE) + { + `Log_Warn("[" $ Line + 1 $ "]" @ "Duplicate item:" @ ItemRaw @ "(skip)"); + continue; + } + + ItemList.AddItem(ItemWeapDef); + `Log_Debug("[" $ Line + 1 $ "]" @ "Loaded successfully:" @ ItemRaw); + } + + if (ItemList.Length == default.Item.Length) + { + `Log_Info("Items to remove list loaded successfully (" $ ItemList.Length @ "entries)"); + } + else + { + `Log_Info("Items to remove list: loaded" @ ItemList.Length @ "of" @ default.Item.Length @ "entries"); + } + } + + return ItemList; +} + +defaultproperties +{ + +} diff --git a/LTI/Classes/Trader.uc b/LTI/Classes/Trader.uc index 91de8bb..5f17e8a 100644 --- a/LTI/Classes/Trader.uc +++ b/LTI/Classes/Trader.uc @@ -1,119 +1,119 @@ -class Trader extends Object - abstract; - -private delegate int ByPrice(class A, class B) -{ - return A.default.BuyPrice > B.default.BuyPrice ? -1 : 0; -} - -public static function KFGFxObject_TraderItems GetTraderItems(optional KFGameReplicationInfo KFGRI = None, optional E_LogLevel LogLevel = LL_Trace) -{ - local String TraderItemsPath; - - if (KFGRI == None) - { - TraderItemsPath = class'KFGameReplicationInfo'.default.TraderItemsPath; - } - else - { - TraderItemsPath = KFGRI.TraderItemsPath; - } - - return KFGFxObject_TraderItems(DynamicLoadObject(TraderItemsPath, class'KFGFxObject_TraderItems')); -} - -public static function Array > GetTraderWeapDefs(optional KFGameReplicationInfo KFGRI = None,optional E_LogLevel LogLevel = LL_Trace) -{ - local Array > KFWeapDefs; - local KFGFxObject_TraderItems TraderItems; - local STraderItem Item; - - TraderItems = GetTraderItems(KFGRI, LogLevel); - - foreach TraderItems.SaleItems(Item) - { - if (Item.WeaponDef != None) - { - KFWeapDefs.AddItem(Item.WeaponDef); - } - } - - return KFWeapDefs; -} - -public static function Array > GetTraderWeapons(optional KFGameReplicationInfo KFGRI = None,optional E_LogLevel LogLevel = LL_Trace) -{ - local Array > KFWeapons; - local class KFWeapon; - local KFGFxObject_TraderItems TraderItems; - local STraderItem Item; - - TraderItems = GetTraderItems(KFGRI, LogLevel); - - foreach TraderItems.SaleItems(Item) - { - if (Item.WeaponDef != None) - { - KFWeapon = class (DynamicLoadObject(Item.WeaponDef.default.WeaponClassPath, class'Class')); - if (KFWeapon != None) - { - KFWeapons.AddItem(KFWeapon); - } - } - } - - return KFWeapons; -} - -public static simulated function ModifyTrader( - KFGameReplicationInfo KFGRI, - Array > RemoveItems, - bool ReplaceMode, - bool RemoveHRG, - bool RemoveDLC, - E_LogLevel LogLevel) -{ - local KFGFxObject_TraderItems TraderItems; - local STraderItem Item; - local class WeapDef; - local Array > WeapDefs; - local int MaxItemID; - - `Log_TraceStatic(); - - TraderItems = GetTraderItems(KFGRI, LogLevel); - - if (!ReplaceMode) - { - foreach TraderItems.SaleItems(Item) - { - if (Item.WeaponDef != None - && RemoveItems.Find(Item.WeaponDef) == INDEX_NONE - && (!RemoveHRG || (RemoveHRG && InStr(Item.WeaponDef, "_HRG", true) == INDEX_NONE)) - && (!RemoveDLC || (RemoveDLC && Item.WeaponDef.default.SharedUnlockId == SCU_None))) - { - WeapDefs.AddItem(Item.WeaponDef); - } - } - } - - WeapDefs.Sort(ByPrice); - - TraderItems.SaleItems.Length = 0; - MaxItemID = 0; - foreach WeapDefs(WeapDef) - { - Item.WeaponDef = WeapDef; - Item.ItemID = ++MaxItemID; - TraderItems.SaleItems.AddItem(Item); - } - - TraderItems.SetItemsInfo(TraderItems.SaleItems); - - KFGRI.TraderItems = TraderItems; -} - -defaultproperties -{ - -} +class Trader extends Object + abstract; + +private delegate int ByPrice(class A, class B) +{ + return A.default.BuyPrice > B.default.BuyPrice ? -1 : 0; +} + +public static function KFGFxObject_TraderItems GetTraderItems(optional KFGameReplicationInfo KFGRI = None, optional E_LogLevel LogLevel = LL_Trace) +{ + local String TraderItemsPath; + + if (KFGRI == None) + { + TraderItemsPath = class'KFGameReplicationInfo'.default.TraderItemsPath; + } + else + { + TraderItemsPath = KFGRI.TraderItemsPath; + } + + return KFGFxObject_TraderItems(DynamicLoadObject(TraderItemsPath, class'KFGFxObject_TraderItems')); +} + +public static function Array > GetTraderWeapDefs(optional KFGameReplicationInfo KFGRI = None,optional E_LogLevel LogLevel = LL_Trace) +{ + local Array > KFWeapDefs; + local KFGFxObject_TraderItems TraderItems; + local STraderItem Item; + + TraderItems = GetTraderItems(KFGRI, LogLevel); + + foreach TraderItems.SaleItems(Item) + { + if (Item.WeaponDef != None) + { + KFWeapDefs.AddItem(Item.WeaponDef); + } + } + + return KFWeapDefs; +} + +public static function Array > GetTraderWeapons(optional KFGameReplicationInfo KFGRI = None,optional E_LogLevel LogLevel = LL_Trace) +{ + local Array > KFWeapons; + local class KFWeapon; + local KFGFxObject_TraderItems TraderItems; + local STraderItem Item; + + TraderItems = GetTraderItems(KFGRI, LogLevel); + + foreach TraderItems.SaleItems(Item) + { + if (Item.WeaponDef != None) + { + KFWeapon = class (DynamicLoadObject(Item.WeaponDef.default.WeaponClassPath, class'Class')); + if (KFWeapon != None) + { + KFWeapons.AddItem(KFWeapon); + } + } + } + + return KFWeapons; +} + +public static simulated function ModifyTrader( + KFGameReplicationInfo KFGRI, + Array > RemoveItems, + bool ReplaceMode, + bool RemoveHRG, + bool RemoveDLC, + E_LogLevel LogLevel) +{ + local KFGFxObject_TraderItems TraderItems; + local STraderItem Item; + local class WeapDef; + local Array > WeapDefs; + local int MaxItemID; + + `Log_TraceStatic(); + + TraderItems = GetTraderItems(KFGRI, LogLevel); + + if (!ReplaceMode) + { + foreach TraderItems.SaleItems(Item) + { + if (Item.WeaponDef != None + && RemoveItems.Find(Item.WeaponDef) == INDEX_NONE + && (!RemoveHRG || (RemoveHRG && InStr(Item.WeaponDef, "_HRG", true) == INDEX_NONE)) + && (!RemoveDLC || (RemoveDLC && Item.WeaponDef.default.SharedUnlockId == SCU_None))) + { + WeapDefs.AddItem(Item.WeaponDef); + } + } + } + + WeapDefs.Sort(ByPrice); + + TraderItems.SaleItems.Length = 0; + MaxItemID = 0; + foreach WeapDefs(WeapDef) + { + Item.WeaponDef = WeapDef; + Item.ItemID = ++MaxItemID; + TraderItems.SaleItems.AddItem(Item); + } + + TraderItems.SetItemsInfo(TraderItems.SaleItems); + + KFGRI.TraderItems = TraderItems; +} + +defaultproperties +{ + +} diff --git a/LTI/Classes/_Logger.uc b/LTI/Classes/_Logger.uc index 93fc28a..d9cfb52 100644 --- a/LTI/Classes/_Logger.uc +++ b/LTI/Classes/_Logger.uc @@ -1,20 +1,20 @@ -class _Logger extends Object - abstract; - -enum E_LogLevel -{ - LL_WrongLevel, - LL_None, - LL_Fatal, - LL_Error, - LL_Warning, - LL_Info, - LL_Debug, - LL_Trace, - LL_All -}; - -defaultproperties -{ - -} +class _Logger extends Object + abstract; + +enum E_LogLevel +{ + LL_WrongLevel, + LL_None, + LL_Fatal, + LL_Error, + LL_Warning, + LL_Info, + LL_Debug, + LL_Trace, + LL_All +}; + +defaultproperties +{ + +} diff --git a/LTI/Constants.uci b/LTI/Constants.uci index 1003f19..432fa68 100644 --- a/LTI/Constants.uci +++ b/LTI/Constants.uci @@ -1,2 +1,2 @@ -// Constants -`define NO_CONFIG 0 +// Constants +`define NO_CONFIG 0 diff --git a/LTI/Globals.uci b/LTI/Globals.uci index a48ac52..4dcd4fb 100644 --- a/LTI/Globals.uci +++ b/LTI/Globals.uci @@ -1,3 +1,3 @@ -// Imports -`include(Logger.uci) -`include(Constants.uci) +// Imports +`include(Logger.uci) +`include(Constants.uci) diff --git a/LTI/Logger.uci b/LTI/Logger.uci index a2b3d54..07699b9 100644 --- a/LTI/Logger.uci +++ b/LTI/Logger.uci @@ -1,15 +1,15 @@ -// Logger -`define Log_Tag 'LTI' - -`define LocationStatic "`{ClassName}::" $ GetFuncName() - -`define Log_Base(msg, cond) `log(`msg `if(`cond), `cond`{endif}, `Log_Tag) - -`define Log_Fatal(msg) `log("FATAL:" @ `msg, (LogLevel >= LL_Fatal), `Log_Tag) -`define Log_Error(msg) `log("ERROR:" @ `msg, (LogLevel >= LL_Error), `Log_Tag) -`define Log_Warn(msg) `log("WARN:" @ `msg, (LogLevel >= LL_Warning), `Log_Tag) -`define Log_Info(msg) `log("INFO:" @ `msg, (LogLevel >= LL_Info), `Log_Tag) -`define Log_Debug(msg) `log("DEBUG:" @ `msg, (LogLevel >= LL_Debug), `Log_Tag) - -`define Log_Trace(msg) `log("TRACE:" @ `Location `if(`msg) @ `msg`{endif}, (LogLevel >= LL_Trace), `Log_Tag) -`define Log_TraceStatic(msg) `log("TRACE:" @ `LocationStatic `if(`msg) @ `msg`{endif}, (LogLevel >= LL_Trace), `Log_Tag) +// Logger +`define Log_Tag 'LTI' + +`define LocationStatic "`{ClassName}::" $ GetFuncName() + +`define Log_Base(msg, cond) `log(`msg `if(`cond), `cond`{endif}, `Log_Tag) + +`define Log_Fatal(msg) `log("FATAL:" @ `msg, (LogLevel >= LL_Fatal), `Log_Tag) +`define Log_Error(msg) `log("ERROR:" @ `msg, (LogLevel >= LL_Error), `Log_Tag) +`define Log_Warn(msg) `log("WARN:" @ `msg, (LogLevel >= LL_Warning), `Log_Tag) +`define Log_Info(msg) `log("INFO:" @ `msg, (LogLevel >= LL_Info), `Log_Tag) +`define Log_Debug(msg) `log("DEBUG:" @ `msg, (LogLevel >= LL_Debug), `Log_Tag) + +`define Log_Trace(msg) `log("TRACE:" @ `Location `if(`msg) @ `msg`{endif}, (LogLevel >= LL_Trace), `Log_Tag) +`define Log_TraceStatic(msg) `log("TRACE:" @ `LocationStatic `if(`msg) @ `msg`{endif}, (LogLevel >= LL_Trace), `Log_Tag) diff --git a/Localization/INT/LTI.int b/Localization/INT/LTI.int index ddc3126..840bc78 100644 Binary files a/Localization/INT/LTI.int and b/Localization/INT/LTI.int differ diff --git a/Localization/RUS/LTI.rus b/Localization/RUS/LTI.rus index 272f2fe..0baf1d1 100644 Binary files a/Localization/RUS/LTI.rus and b/Localization/RUS/LTI.rus differ diff --git a/PublicationContent/description.txt b/PublicationContent/description.txt index 490f874..802159d 100644 --- a/PublicationContent/description.txt +++ b/PublicationContent/description.txt @@ -19,7 +19,7 @@ https://forums.tripwireinteractive.com/index.php?threads/whitelisting-mods-and-m [h1]Usage (single player)[/h1] [olist] [*]Subscribe to this mutator; -[*]Start KF2; +[*]Start KF2; [*]Open console (~) and input: [b]open KF-BioticsLab?Mutator=LTI.LTIMut[/b] (replace the map and add the parameters you need) diff --git a/README.md b/README.md index cf151a4..f72cc61 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,17 @@ [![Steam Workshop](https://img.shields.io/static/v1?message=workshop&logo=steam&labelColor=gray&color=blue&logoColor=white&label=steam%20)](https://steamcommunity.com/sharedfiles/filedetails/?id=2864857909) [![Steam Downloads](https://img.shields.io/steam/downloads/2864857909)](https://steamcommunity.com/sharedfiles/filedetails/?id=2864857909) [![Steam Favorites](https://img.shields.io/steam/favorites/2864857909)](https://steamcommunity.com/sharedfiles/filedetails/?id=2864857909) -[![Steam Update Date](https://img.shields.io/steam/update-date/2864857909)](https://steamcommunity.com/sharedfiles/filedetails/?id=2864857909) +[![MegaLinter](https://github.com/GenZmeY/KF2-LootedTraderInventory/actions/workflows/mega-linter.yml/badge.svg?branch=master)](https://github.com/GenZmeY/KF2-LootedTraderInventory/actions/workflows/mega-linter.yml) [![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/GenZmeY/KF2-LootedTraderInventory)](https://github.com/GenZmeY/KF2-LootedTraderInventory/tags) [![GitHub](https://img.shields.io/github/license/GenZmeY/KF2-LootedTraderInventory)](LICENSE) -# Description +## Description This is a heavily stripped down version of [CTI](https://github.com/GenZmeY/KF2-CustomTraderInventory) that only allows you to remove the trader's weapons, not add them. This only exists in hopes of being whitelisted. -# Usage & Setup +## Usage & Setup [See steam workshop page](https://steamcommunity.com/sharedfiles/filedetails/?id=2864857909) -# Build +## Build **Note:** If you want to build/test/brew/publish a mutator without git-bash and/or scripts, follow [these instructions](https://tripwireinteractive.atlassian.net/wiki/spaces/KF2SW/pages/26247172/KF2+Code+Modding+How-to) instead of what is described here. 1. Install [Killing Floor 2](https://store.steampowered.com/app/232090/Killing_Floor_2/), Killing Floor 2 - SDK and [git for windows](https://git-scm.com/download/win); 2. open git-bash and go to any folder where you want to store sources: @@ -27,5 +27,5 @@ This is a heavily stripped down version of [CTI](https://github.com/GenZmeY/KF2- 5. The compiled files will be here: `C:\Users\\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC\Script\` -# License -[GNU GPLv3](LICENSE) +## License +[![license](https://www.gnu.org/graphics/gplv3-with-text-136x68.png)](LICENSE) diff --git a/builder.cfg b/builder.cfg index 3d74deb..fdc8d9f 100644 --- a/builder.cfg +++ b/builder.cfg @@ -7,7 +7,7 @@ StripSource="True" # Mutators to be compiled # Specify them with a space as a separator, -# Mutators will be compiled in the specified order +# Mutators will be compiled in the specified order PackageBuildOrder="LTI" @@ -16,7 +16,7 @@ PackageBuildOrder="LTI" # Packages you want to brew using @peelz's patched KFEditor. # Useful for cases where regular brew doesn't put *.upk inside the package. # Specify them with a space as a separator, -# The order doesn't matter +# The order doesn't matter PackagePeelzBrew="" @@ -24,7 +24,7 @@ PackagePeelzBrew="" # Mutators that will be uploaded to the workshop # Specify them with a space as a separator, -# The order doesn't matter +# The order doesn't matter PackageUpload="LTI"