mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-08-20 05:16:24 -04:00
Fix Issues with mod resetting, make gamemode ids lowercase, update modding.md
This commit is contained in:
+23
-15
@@ -484,35 +484,43 @@ Note: for any gamemode wishing to use the vanilla set of savefiles, use `gczelda
|
||||
```cpp
|
||||
IMPORT_SERVICE(GamemodeService, svc_gamemode);
|
||||
|
||||
void onSaveLoaded() {
|
||||
// This function will be invoked by the game as a save is loaded
|
||||
}
|
||||
|
||||
#define MY_GAMEMODE_ID "gamemodeid"
|
||||
#define ONLY_GAMEMODE(ctx, id) \
|
||||
{ \
|
||||
bool isGamemodeActive; \
|
||||
svc_gamemode->is_active(ctx, id, &isGamemodeActive); \
|
||||
if (!isGamemodeActive) { \
|
||||
return; \
|
||||
return HOOK_CONTINUE; \
|
||||
} \
|
||||
}
|
||||
#define ONLY_GAMEMODE_MYGAMEMODE ONLY_GAMEMODE(ctx, MY_GAMEMODE_ID)
|
||||
|
||||
static HookAction myFunctionHook(ModContext *ctx, void *args, void *, void *) {
|
||||
// Note: normal function hooks will need to check if the gamemode is active
|
||||
ONLY_GAMEMODE(ctx,"id"); // A macro like this can make it easy
|
||||
ONLY_GAMEMODE_MYGAMEMODE // A macro like this can make it easy
|
||||
|
||||
// Code that runs when only the Gamemode is active
|
||||
|
||||
return HOOK_CONTINUE;
|
||||
}
|
||||
|
||||
void onSaveLoaded() {
|
||||
// This function will be invoked by the game as a save is loaded
|
||||
}
|
||||
|
||||
const GamemodeDesc gamemodeDesc = {
|
||||
.gamemodeId = "my-unique-gamemode-id",
|
||||
.gamemodeId = MY_GAMEMODE_ID,
|
||||
.fullName = "Gamemode Name",
|
||||
.saveName = "my-unique-save-name",
|
||||
.onActivatedFunction = nullptr,
|
||||
.onDeactivatedFunction = nullptr,
|
||||
.onPlayFunction = nullptr,
|
||||
.onSaveLoadedFunction = onSaveLoaded,
|
||||
.onNewSaveFunction = nullptr,
|
||||
.onGameResetFunction = nullptr,
|
||||
.onTickFunction = nullptr,
|
||||
// The save name should be something that other gamemodes will not try to use, so appending your name to it
|
||||
// is reccomended
|
||||
.saveName = "my-unique-save-name_developer-name",
|
||||
.onActivatedFunction = nullptr, // Called when the gamemode is selected on the prelaunch menu (or is launched)
|
||||
.onDeactivatedFunction = nullptr, // Called when the gamemode is deselected on the prelaunch menu (or the mod is disabled)
|
||||
.onPlayFunction = nullptr, // Called when "Play" is pressed on the prelaunch menu
|
||||
.onSaveLoadedFunction = onSaveLoaded, // Called when a save is loaded
|
||||
.onNewSaveFunction = nullptr, // Called after a new savefile is created
|
||||
.onGameResetFunction = nullptr, // Called when the game is reset
|
||||
.onTickFunction = nullptr, // Called every game tick while the gamemode is active
|
||||
};
|
||||
svc_gamemode->register_gamemode(mod_ctx, &gamemodeDesc);
|
||||
```
|
||||
|
||||
@@ -20,7 +20,12 @@ aurora::Module Log("dusk::mods::gamemode");
|
||||
std::unordered_map<std::string, std::vector<std::string>> s_gamemodesRegisteredToMods;
|
||||
|
||||
std::string get_mod_gamemode_id(ModContext* ctx, const std::string& id) {
|
||||
return id + "_" + ctx->mod->metadata.id;
|
||||
// Standardize the IDs to include the mod id (to prevent clashes) and set them as lowercase
|
||||
std::string fullId = id + "_" + ctx->mod->metadata.id;
|
||||
std::transform(fullId.begin(),fullId.end(),fullId.begin(),[](unsigned char c) {
|
||||
return std::towlower(c);
|
||||
});
|
||||
return fullId;
|
||||
}
|
||||
|
||||
void gamemode_remove_mod(LoadedMod& mod) {
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#ifdef TARGET_PC
|
||||
#include "dusk/ui/prelaunch.hpp"
|
||||
#include "dusk/ui/menu_bar.hpp"
|
||||
#include "dusk/ui/mods_window.hpp"
|
||||
#include "dusk/gamemode.hpp"
|
||||
#endif
|
||||
|
||||
@@ -167,6 +168,10 @@ void mDoRst_resetCallBack(int port, void*) {
|
||||
// Hide the menu bar
|
||||
menubar->Document::hide(true);
|
||||
}
|
||||
if (auto* modwindow = dynamic_cast<dusk::ui::ModsWindow*>(doc.get())) {
|
||||
// Hide the mod window (if we were disasbling or reloading a mod)
|
||||
modwindow->pop();
|
||||
}
|
||||
if (auto* prelaunch = dynamic_cast<dusk::ui::Prelaunch*>(doc.get())) {
|
||||
prelaunchExists = true;
|
||||
prelaunch->focus();
|
||||
|
||||
Reference in New Issue
Block a user