Altermatic v0.2 DEV Available! [Palworld Mod]

Update 2024-07-18 : Uploaded v0.2.1DEV with a quick revert to the start delay. There's a bug in SCake that was causing summoned/party pals to not be captured properly with the longer start-up delay so I've reverted this delay and now Altermatic should work as expected with SCake installed. Sorry for any inconvenience this caused!

--- --- ---

The last release of Altermatic was really just a bare minimal release to ensure people could start using their replacers again after the whole IO Store split and to get people on-board with the system. But now that Altermatic has been in the wild for a bit, it's time for a substantial update which makes it truly interesting!

This is a fairly large update for Altermatic that adds a lot of requested features as well as features originally planned before the 0.1DEV release. I didn't originally plan to implement all this in one go, but I think anyone who follows me knows the pattern by now... This update adds persistence through JSON save files, Trait definitions support so swappers can target Pals with specific Traits, MorphTarget randomization for pal models with body morphs or accessory/feature toggles built in via Morph Targets, a fallback system for extended gender support with/without SCake, and many more changes. Overall it makes Altermatic a really compelling replacer that has features not available in any other framework! That said, since Altermatic's release there's been a lot of ideas and requests so development still has a long way to go until we have all the features people have wanted, but overall this is a really good spot for Altermatic to be in since it allows modders to really go wild with their replacers from this point forward and will help to establish some better standards and practices!

- Altermatic -
- Full Changelog -
Altermatic Version 0.2 DEV

Added :
  • Altermatic now has persistance through a save JSON system, saves as "Altermatic_Persist[worldID].json" (if you want to reset persistance you can delete this file and everything will reset)
  • With the new JSON saves, added internal systems for tracking which pals have changed to which model to enable consistency between loads/sessions/ect, you can delete/modify the JSON save file to reset/change this behavior ('model' being used is tracked by file path, if file paths conflict then this behavior may be inconsistent, if a file path is no longer registered the character's associated model will be reset)
  • "ReqTrait" to SkelMeshSwap, defined Trait Names in this arary are required for the swap to apply to the Pal/NPC
  • "PrefTrait" to SkelMeshSwap, for each of the defined Trait Names in this array the pal doesn't posess the match quality decreases by 5
  • "Disable" to SkelMeshSwap (and future swap types), when setting "Disable":"True" the entry will be skipped (useful for quick testing without clearing data in the JSON, can also be useful for users that don't want to clear JSON data but would like to disable certain skins)
  • Passing Null for SkelMeshPath (specifically "SkelMeshPath":"") now counts as a 'do not swap' entry and adds the default model to the random swap pool (In other words, when a SkelMeshPath is specifically excluded, this will add an entry where the current default model/skin is applied, if multiple skins are set up for the same parameters then the default skin is now added to the randomization, if you're using 'naughty' models and need them to have bits I recommend still setting the default path for the swap so it can be more easily removed if undesired in the future)
  • __Create_Load_List__.bat will now try to scan .json files for SkelMeshSwap to try and predict if the json config actually contains swap data (this param would be required for any swap data to be in the JSON so this will prevent invalid json files from even attempting to load, future checks for different swap types will be added in the future, unless I forget X.x)
  • "MorphTarget" param added for SkelMeshSwap, defined as an array of sets which allows the assignment of Morph Targets on the model
    • "Target" is the name of the Morph Target on the model to alter
    • "Set" is a hard value to apply (clamps to min/max), if excluded then a random value between Min/Max is applied instead
    • "Min" is the lowest value allowed, if excluded then "0.0" is applied
    • "Max" is the highest value allowed, if excluded then "1.0" is applied
    • "Type" allows either "Free" or "Restrict" to be defined, Free means the value can be anything between Min and Max, Restrict means the value will either be Min or Max, if Type is excluded then Free is applied (Free is useful for body morphs, Restrict is good for feature or Accesory On/Off morphs)
  • Non-Persist flagged characters are now also tracked for more advanced features (not really relevant to the average user yet, more just noting some internal changes that allows much more flexibility and could be utilized by external mods in the future, also worth mentioning that because of technical limitations for performance there is a limit and eventually enough matched params will all equate together, though this value shouldn't be reached by normal means)
  • Best Match system now allows requirements to improve match quality (added new offset value to keep/allow optimizations while allowing a dynamic 'perfect match' value)
  • Added 'Fallback' for SkelMeshSwap Gender parameter to allow better compatibility with and without SCake installed, now Gender is allowed to not match but with a degraded match quality under specific conditions (Should only apply mis-matched genders if no gender matching swap is found)

Changed :
  • In SkelMeshSwap, increased Match Quality penalty when not matching to Rare Pal by 4 times (5 > 20)
  • The "Best Match" system now accounts for met requirements such as ReqTrait, ReqTrait improves match quality so meeting multiple requirements will result in a higher match quality at this comparison step (Note that other factors could still increase the Match Quality so just because a swap matches multiple requirements doesn't mean it will always be selected)

Fixed :
  • SkelMeshSwap should now properly apply to NPCs that are not Pals (When testing I had enabled a check for pals only and forgot to disable this check before release, sorry!)
  • SkelMeshPath will now check for full reference paths and assume they are correct without trying to add the reference script values (as in, paths that start with " /Script/Engine.SkeletalMesh' " will be assumed as already formatted correctly for loading in-game and no additional formatting will be applied, this change is technically an add, but given it fixes undesired behavior I'm classifying it as a fix)
  • __Create_Load_List__.bat will now properly run in admin mode for all users regardless of your environment set up (while in windows at least)
  • __Create_Load_List__.bat now properly checks for the .json extension before adding to the list
  • Captured pals/NPCs should now be flagged to Persist, preventing pals switching models after being captured then summoned
  • Pal/NPC validity is now checked before saving to prevent unexpected behavior in save output
  • Optimized Best Match / Random selection system to fail quicker when comparing matches so less data is processed per compare

What's Next?

Altermatic has really been a project that develops as requests come in and that hasn't changed. I'm still gauging how to best approach a lot of problems people are encountering so I don't have any solid plans. I know for SCake there will be more dynamic gender assignments coming in a future update with Altermatic integrations so that's certainly on the list as things progress, but not sure about after that. For requests some have asked about replacers for just textures/materials but there's some issues with that, some users seem to want to just have textures to input but materials in Palworld have their own parameters set up and won't translate directly to a Texture2D replace. Then there's also model inconsistencies where if someone installs a default replacer then there's no way for Altermatic to know and the textures would be broken. The idea for Altermatic was to try and have a nice 'reset' on replacers and promote better practices while also making things as easy for modders as possible, but these 2 things are sometimes in conflict. Sure, it'd be nice to have a simple replace texture option, however it would be better practice to employ the current method for this which is to export and re-import the default model as its own SkelMeshSwap so that the texture is attached to its own model and ensures 100% compatibility, even if the default model is replaced. But even still, there's probably ways to implement an easier method for users who want to do multiple material swaps for a single model, and in that regard I'm looking into adding a texture/material parameter to SkelMeshSwap but I need to do a bit more research to see if that's the best approach or if something else could be better.

Current Road Map

1 ) Implement more integrations with SCake and the new (unreleased) dynamic gender assignments
2 ) Investigate direct texture/material replacers without Mesh Swaps
3 ) ???