Skip to content

Commit 2462817

Browse files
authored
Merge pull request #1549 from ebkr/develop
Develop - 3.1.53
2 parents 3238331 + 5e73a77 commit 2462817

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+638
-159
lines changed

Diff for: CHANGELOG.md

+16
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
### 3.1.53
2+
#### Games added
3+
- WEBFISHING
4+
5+
#### Other changes
6+
- BONELAB support should now function correctly
7+
- Assemblies will no longer be regenerated on every launch
8+
- "Preloader fix" has been replaced with "Reset \<game\> installation"
9+
- This will delete the entire game directory and prompt Steam to re-validate files
10+
- The preloader fix was originally a solution for old Risk of Rain 2 modded installations using SeikoML failing to
11+
launch
12+
113
### 3.1.52
214
#### Small quality of life changes
315
- Upgraded from Electron v11 to v24
@@ -6,6 +18,10 @@
618
- Fixed sorting by download count
719
- Reduced time taken to install when a mod has a large number of dependencies
820

21+
#### Games added
22+
- Old Market Simulator
23+
- Subterranauts
24+
925
### 3.1.51
1026
#### Memory and performance improvements
1127
The TS team have been working hard to improve the following:

Diff for: docs/Adding a game.md

-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
- An array of different executable names (for all platforms). For `StorePlatform` types such as `OTHER` and `STEAM_DIRECT` then the first found executable is used and called when the game is launched.
3636
- **DataFolderName**
3737
- Required for Unreal games relying on unreal-shimloader.
38-
- Relevant for Mono (C#) Unity games, which use it for the `Preloader Fix` in the manager settings.
3938
- **TsUrl**
4039
- The Thunderstore API endpoint for the listing.
4140
- **ExclusionsUrl**

Diff for: modExclusions.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
"L4rs-QuickFSR",
2424
"MPModTeam-Boneworks_MP",
2525
"MADH95Mods-JSONRenameUtility",
26-
"GamefaceGamers-Mod_Sync"
26+
"GamefaceGamers-Mod_Sync",
27+
"Pyoid-Hook_Line_and_Sinker",
28+
"GardenGals-Hatchery"
2729
]
2830
}

Diff for: modExclusions.md

+4
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,7 @@ codengine-SOTFEdit
5151
DevLeon-SonsOfTheForestMap
5252

5353
Kesomannen-GaleModManager
54+
55+
Pyoid-Hook_Line_and_Sinker
56+
57+
GardenGals-Hatchery

Diff for: package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "r2modman",
3-
"version": "3.1.52",
3+
"version": "3.1.53",
44
"description": "A simple and easy to use mod manager for many games using Thunderstore.",
55
"productName": "r2modman",
66
"author": "ebkr",
@@ -109,6 +109,7 @@
109109
"sinon": "^11.1.1",
110110
"ts-node": "^8.10.2",
111111
"typescript": "^4.5.5",
112+
"vue": "2.7.16",
112113
"vue-jest": "^3.0.0",
113114
"wallaby-vue-compiler": "^1.0.3"
114115
},

Diff for: src/App.vue

+2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ export default class App extends mixins(UtilityMixin) {
100100
this.$watch('$q.dark.isActive', () => {
101101
document.documentElement.classList.toggle('html--dark', this.$q.dark.isActive);
102102
});
103+
104+
this.$store.commit('updateModLoaderPackageNames');
103105
}
104106
105107
beforeCreate() {

Diff for: src/_managerinf/ManagerInformation.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import VersionNumber from '../model/VersionNumber';
22

33
export default class ManagerInformation {
4-
public static VERSION: VersionNumber = new VersionNumber('3.1.52');
4+
public static VERSION: VersionNumber = new VersionNumber('3.1.53');
55
public static IS_PORTABLE: boolean = false;
66
public static APP_NAME: string = "r2modman";
77
}

Diff for: src/assets/images/game_selection/SULFUR.png

20.3 KB
Loading

Diff for: src/assets/images/game_selection/WEBFISHING.png

57.1 KB
Loading

Diff for: src/components/profiles-modals/CreateProfileModal.vue

+9-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import ProfilesMixin from "../../components/mixins/ProfilesMixin.vue";
99
})
1010
export default class CreateProfileModal extends ProfilesMixin {
1111
12+
private creatingInProgress: boolean = false;
1213
private newProfileName = '';
1314
1415
get isOpen(): boolean {
@@ -17,17 +18,23 @@ export default class CreateProfileModal extends ProfilesMixin {
1718
1819
closeModal() {
1920
this.newProfileName = '';
21+
this.creatingInProgress = false;
2022
this.$store.commit('closeCreateProfileModal');
2123
}
2224
2325
// User confirmed creation of a new profile with a name that didn't exist before.
2426
async createProfile() {
27+
if (this.creatingInProgress) {
28+
return;
29+
}
2530
const safeName = this.makeProfileNameSafe(this.newProfileName);
2631
if (safeName !== '') {
2732
try {
33+
this.creatingInProgress = true;
2834
await this.$store.dispatch('profiles/addProfile', safeName);
2935
this.closeModal();
3036
} catch (e) {
37+
this.creatingInProgress = false;
3138
const err = R2Error.fromThrownValue(e, 'Error whilst creating a profile');
3239
this.$store.commit('error/handleError', err);
3340
}
@@ -49,7 +56,7 @@ export default class CreateProfileModal extends ProfilesMixin {
4956
<input
5057
class="input"
5158
v-model="newProfileName"
52-
@keyup.enter="!doesProfileExist(newProfileName) && createProfile(newProfileName)"
59+
@keyup.enter="!doesProfileExist(newProfileName) && createProfile()"
5360
id="create-profile-modal-new-profile-name"
5461
ref="nameInput"
5562
/>
@@ -67,7 +74,7 @@ export default class CreateProfileModal extends ProfilesMixin {
6774

6875
<template v-slot:footer>
6976
<button id="modal-create-profile-invalid" class="button is-danger" v-if="doesProfileExist(newProfileName)" disabled>Create</button>
70-
<button id="modal-create-profile" class="button is-info" @click="createProfile(newProfileName)" v-else>Create</button>
77+
<button id="modal-create-profile" class="button is-info" @click="createProfile()" :disabled="creatingInProgress" v-else>Create</button>
7178
</template>
7279

7380
</ModalCard>

Diff for: src/components/profiles-modals/DeleteProfileModal.vue

+8
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,23 @@ import ProfilesMixin from "../../components/mixins/ProfilesMixin.vue";
88
components: {ModalCard}
99
})
1010
export default class DeleteProfileModal extends ProfilesMixin {
11+
private deletingInProgress: boolean = false;
12+
1113
get isOpen(): boolean {
1214
return this.$store.state.modals.isDeleteProfileModalOpen;
1315
}
1416
1517
closeDeleteProfileModal() {
18+
this.deletingInProgress = false;
1619
this.$store.commit('closeDeleteProfileModal');
1720
}
1821
1922
async removeProfile() {
23+
if (this.deletingInProgress) {
24+
return;
25+
}
2026
try {
27+
this.deletingInProgress = true;
2128
await this.$store.dispatch('profiles/removeSelectedProfile');
2229
} catch (e) {
2330
const err = R2Error.fromThrownValue(e, 'Error whilst deleting profile');
@@ -41,6 +48,7 @@ export default class DeleteProfileModal extends ProfilesMixin {
4148
</template>
4249
<template v-slot:footer>
4350
<button
51+
:disabled="deletingInProgress"
4452
class="button is-danger"
4553
@click="removeProfile()"
4654
>Delete profile</button>

Diff for: src/components/profiles-modals/ImportProfileModal.vue

+19-10
Original file line numberDiff line numberDiff line change
@@ -117,19 +117,28 @@ export default class ImportProfileModal extends mixins(ProfilesMixin) {
117117
return;
118118
}
119119
120-
let read: string | null = await ProfileUtils.readProfileFile(files[0]);
120+
let read: string = '';
121+
try {
122+
read = await ProfileUtils.readProfileFile(files[0]);
123+
} catch (e: unknown) {
124+
const err = R2Error.fromThrownValue(e);
125+
this.$store.commit('error/handleError', err);
126+
this.closeModal();
127+
return;
128+
}
121129
122-
if (read !== null) {
123-
this.profileImportFilePath = files[0];
130+
this.profileImportFilePath = files[0];
131+
try {
124132
this.profileImportContent = await ProfileUtils.parseYamlToExportFormat(read);
125-
126-
if (this.profileToOnlineMods.length === 0) {
127-
this.activeStep = 'NO_PACKAGES_IN_IMPORT';
128-
return;
129-
}
130-
131-
this.activeStep = 'REVIEW_IMPORT';
133+
} catch (e: unknown) {
134+
const err = R2Error.fromThrownValue(e);
135+
this.$store.commit('error/handleError', err)
136+
this.closeModal();
137+
return;
132138
}
139+
140+
this.activeStep = this.profileToOnlineMods.length ? 'REVIEW_IMPORT' : 'NO_PACKAGES_IN_IMPORT';
141+
return;
133142
}
134143
135144
// Fired when user has accepted the mods to be imported in the review phase.

Diff for: src/components/profiles-modals/RenameProfileModal.vue

+8-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import ProfilesMixin from "../../components/mixins/ProfilesMixin.vue";
1111
export default class RenameProfileModal extends ProfilesMixin {
1212
@Ref() readonly nameInput: HTMLInputElement | undefined;
1313
private newProfileName: string = '';
14+
private renamingInProgress: boolean = false;
1415
1516
@Watch('$store.state.profile.activeProfile')
1617
activeProfileChanged(newProfile: Profile, oldProfile: Profile|null) {
@@ -41,12 +42,17 @@ export default class RenameProfileModal extends ProfilesMixin {
4142
}
4243
4344
closeModal() {
45+
this.renamingInProgress = false;
4446
this.newProfileName = this.$store.state.profile.activeProfile.getProfileName();
4547
this.$store.commit('closeRenameProfileModal');
4648
}
4749
4850
async performRename() {
51+
if (this.renamingInProgress) {
52+
return;
53+
}
4954
try {
55+
this.renamingInProgress = true;
5056
await this.$store.dispatch('profiles/renameProfile', {newName: this.newProfileName});
5157
} catch (e) {
5258
const err = R2Error.fromThrownValue(e, 'Error whilst renaming profile');
@@ -69,7 +75,7 @@ export default class RenameProfileModal extends ProfilesMixin {
6975
<input
7076
class="input"
7177
v-model="newProfileName"
72-
@keyup.enter="!doesProfileExist(newProfileName) && performRename(newProfileName)"
78+
@keyup.enter="!doesProfileExist(newProfileName) && performRename()"
7379
ref="nameInput"
7480
/>
7581

@@ -85,7 +91,7 @@ export default class RenameProfileModal extends ProfilesMixin {
8591
</template>
8692
<template v-slot:footer>
8793
<button class="button is-danger" v-if="doesProfileExist(newProfileName)" disabled>Rename</button>
88-
<button class="button is-info" @click="performRename(newProfileName)" v-else>Rename</button>
94+
<button class="button is-info" @click="performRename()" :disabled="renamingInProgress" v-else>Rename</button>
8995
</template>
9096

9197
</ModalCard>

Diff for: src/components/settings-components/SettingsView.vue

+9-9
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ import CdnProvider from '../../providers/generic/connection/CdnProvider';
142142
),
143143
new SettingsRow(
144144
'Locations',
145-
'Change data folder folder',
145+
'Change data folder',
146146
'Change the folder where mods are stored for all games and profiles. The folder will not be deleted, and existing profiles will not carry across.',
147147
async () => {
148148
return PathResolver.ROOT;
@@ -170,14 +170,6 @@ import CdnProvider from '../../providers/generic/connection/CdnProvider';
170170
'fa-exchange-alt',
171171
() => this.emitInvoke('ToggleDownloadCache')
172172
),
173-
new SettingsRow(
174-
'Debugging',
175-
'Run preloader fix',
176-
'Run this to fix most errors mentioning the preloader, or about duplicate assemblies.',
177-
async () => `This will delete the ${this.activeGame.dataFolderName}/Managed folder, and verify the files through Steam`,
178-
'fa-wrench',
179-
() => this.emitInvoke('RunPreloaderFix')
180-
),
181173
new SettingsRow(
182174
'Debugging',
183175
'Set launch parameters',
@@ -388,6 +380,14 @@ import CdnProvider from '../../providers/generic/connection/CdnProvider';
388380
},
389381
'fa-folder-open',
390382
() => this.emitInvoke('ChangeSteamDirectory')
383+
),
384+
new SettingsRow(
385+
'Debugging',
386+
`Reset ${this.activeGame.displayName} installation`,
387+
'Fix problems caused by corrupted files or files left over from manual modding attempts.',
388+
async () => `This will delete all contents of the ${this.activeGame.steamFolderName} folder, and verify the files through Steam`,
389+
'fa-wrench',
390+
() => this.emitInvoke('ValidateSteamInstallation')
391391
)
392392
)
393393
}

Diff for: src/components/v2/Hero.vue

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<template>
2+
<section :class="['hero', heroType]" ref="section">
3+
<div class="hero-body non-selectable">
4+
<div class="container">
5+
<h1 class="title" ref="title">
6+
{{title}}
7+
</h1>
8+
<h2 class="subtitle" ref="subtitle">
9+
{{subtitle}}
10+
</h2>
11+
</div>
12+
</div>
13+
</section>
14+
</template>
15+
16+
<script lang="ts" setup>
17+
interface HeroProps {
18+
title: string;
19+
subtitle: string;
20+
heroType?: string;
21+
}
22+
23+
const heroProps = defineProps<HeroProps>();
24+
</script>

Diff for: src/components/views/DownloadModModal.vue

+13-4
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ let assignId = 0;
174174
const existing = DownloadModModal.allVersions[assignIndex]
175175
existing[1].failed = true;
176176
DownloadModModal.allVersions[assignIndex] = [currentAssignId, existing[1]];
177-
DownloadModModal.addCdnSolutionToError(err);
177+
DownloadModModal.addSolutionsToError(err);
178178
return reject(err);
179179
}
180180
} else if (status === StatusEnum.PENDING) {
@@ -306,7 +306,7 @@ let assignId = 0;
306306
const existing = DownloadModModal.allVersions[assignIndex]
307307
existing[1].failed = true;
308308
this.$set(DownloadModModal.allVersions, assignIndex, [currentAssignId, existing[1]]);
309-
DownloadModModal.addCdnSolutionToError(err);
309+
DownloadModModal.addSolutionsToError(err);
310310
this.$store.commit('error/handleError', err);
311311
return;
312312
}
@@ -348,7 +348,7 @@ let assignId = 0;
348348
const existing = DownloadModModal.allVersions[assignIndex]
349349
existing[1].failed = true;
350350
this.$set(DownloadModModal.allVersions, assignIndex, [currentAssignId, existing[1]]);
351-
DownloadModModal.addCdnSolutionToError(err);
351+
DownloadModModal.addSolutionsToError(err);
352352
this.$store.commit('error/handleError', err);
353353
return;
354354
}
@@ -432,13 +432,22 @@ let assignId = 0;
432432
});
433433
}
434434
435-
static addCdnSolutionToError(err: R2Error): void {
435+
static addSolutionsToError(err: R2Error): void {
436+
// Sanity check typing.
437+
if (!(err instanceof R2Error)) {
438+
return;
439+
}
440+
436441
if (
437442
err.name.includes("Failed to download mod") ||
438443
err.name.includes("System.Net.WebException")
439444
) {
440445
err.solution = "Try toggling the preferred Thunderstore CDN in the settings";
441446
}
447+
448+
if (err.message.includes("System.IO.PathTooLongException")) {
449+
err.solution = 'Using "Change data folder" option in the settings to select a shorter path might solve the issue';
450+
}
442451
}
443452
}
444453

0 commit comments

Comments
 (0)