-
Notifications
You must be signed in to change notification settings - Fork 37
Getting Started
- Install SKSE
- Install JContainers
- [Optional] Install Sublime Text as described in Creation Kit Wiki. You'll got syntax highlighting and autocompletion
Note that this is not complete Begining->Got-working-mod tutorial.
It's known that racemenu command, command that changes PC's race also resets skills to defaults, thus before race change, we'll backup the skills by writing them into a file and will read them back and restore.
That's how high-level part of a script looks like:
function changeRace(objectreference plr, Race rc)
backupSkills(plr)
plr.SetRace(rc)
restoreSkills(plr)
endfunctionLet's assume we have a file SkyrimDir/Data/SkillList.json containing following lines (not going to list all skills, but note that the last element, "illusion", has no coma, always, and not because the coma is invisible):
[
"archery",
"sneak",
"illusion"
]Function backupSkills backups, writes PC's skills into My Games/Skyrim/JCUser/Utilities/skillbackup.json file:
function backupSkills(objectreference plr)
-- read SkillList.json file containing Skyrim skills
-- jSkillList is ["archery","sneak", "illusion"] array.
-- JValue.readFromFile parses the file contents and
-- (since the file is an array of strings) creates and returns an array (instance of JArray) containing strings
-- jSkillList is unique number which identifies the array
int jSkillList = JValue.readFromFile("Data/SkillList.json")
-- instantiate (create) a map container (JMap instance) to fill it with {skill: number} pairs later
-- jBackup is unique number which identifies the map
int jBackup = JMap.object()
-- cycle through jSkillList's elements (e.g. skills, strings)
-- JValue.count returns 3
int i = JValue.count(jSkillList)
while i > 0
i -= 1
-- retrieve skill-string at index 2, 1 and 0 of jSkillList array
string skill = JArray.getStr(jSkillList, i)
int value = plr.getAV(skill)
-- fill backup with {skill: value} associations
JMap.setInt(jBackup, skill, value)
endwhile
-- create the backup file in _My Games/Skyrim/JCUser/Utilities/skillbackup.json_
JValue.writeToFile(jBackup, JContainers.userDirectory() + "Utilities/skillbackup.json")
endfunctionSo, in a result of execution of backupSkills we'll got a file at My Games/Skyrim/JCUser/Utilities/skillbackup.json containing:
{
"archery": 30,
"sneak": 25,
"illusion": 30
}Restore skills:
function restoreSkills(objectreference plr)
-- read the backup file in _My Games/SKyrim/JCUser/Utilities/skillbackup.json_
int jBackup = JValue.readFromFile(JContainers.userDirectory() + "Utilities/skillbackup.json")
-- retrieve first JMap's key, skill
string skill = JMap.nextKey(jBackup)
while skill
-- retrieve skill value
int value = JMap.getInt(jBackup, skill)
plt.setAV(skill, value)
-- retrieve next JMap's key
skill = JMap.nextKey(jBackup, skill)
endwhile
endfunctionExample above is redundant a bit. It writes a data into a file and reads it back, while we can simply pass JMap instance containing {skill: number} pairs into restoreSkills function:
function changeRace(objectreference plr, Race rc)
int jskills = getSkills(plr)
plr.SetRace(rc)
restoreSkills(plr, jskills)
endfunction
int function getSkills(objectreference plr)
int jSkillList = JValue.readFromFile("Data/SkillList.json")
int jBackup = JMap.object()
int i = JValue.count(jSkillList)
while i > 0
i -= 1
string skill = JArray.getStr(jSkillList, i)
int value = plr.getAV(skill)
-- fill backup with {skill: value} associations
JMap.setInt(jBackup, skill, value)
endwhile
return jBackup
endfunction
function restoreSkills(objectreference plr, int jBackup)
-- retrieve first JMap's key, skill
string skill = JMap.nextKey(jBackup)
while skill
-- retrieve skill value
int value = JMap.getInt(jBackup, skill)
plt.setAV(skill, value)
-- retrieve next JMap's key
skill = JMap.nextKey(jBackup, skill)
endwhile
endfunctionThe example above shows only the basic usage and does not cover all the features. Where you can go from here:
Also checkout right bar for complete list of entries
Sign into GitHub and press Edit at the top to add any missing information or fix typos and errors. Thanks!