Jump to content

testiger2

Members
  • Posts

    78
  • Joined

  • Last visited

Nexus Mods Profile

About testiger2

Recent Profile Visitors

37794 profile views

testiger2's Achievements

Enthusiast

Enthusiast (6/14)

  • First Post
  • Collaborator Rare
  • Week One Done
  • One Month Later
  • One Year In

Recent Badges

0

Reputation

  1. what you can try (don't know if its the best solution): create a perk, add an ability to the perk and one perk entry point let the EP mod the magic cost of the spell set cost to something really high like 100000 or so and then put in the contition with GetItemCount == 0. this will make you unable to cast the spell when you dont have the gem because the spell cost is too high. also add a keyword to your spell and use the EPMagic_SpellHasKeyword condition so it only tracks you spell for the ability add a script that extends activemagiceffect and then use OnSpellCast to track when the spell is fired. you will propably want a good amount of optimizations here because this could get resource intensive otherwise. maybe there is an easier solution for this or you can dump this if you are willing to live with removing the gem only when a target is hit
  2. Hello everyone, i am wondering if Texture Sets can be used on Art Objects(ARTO). So far i was not able to make them work together. When i apply the Set in the CK it shows correcty but the changes will not apply ingame. Its been a while but i remember reading that there was a similar issue with female 1stPerson models on the ArmorAddon. Is this a similar issue or may it be something else?
  3. Well maybe i could have worded my initial question a bit better. Of course the savegame will not contain the actual scripts. The question could have been better worded this way: If you have an emtpy dummy script(meaning no vars/props whatsoever) will the script's reference still be baked into the save? If we we assume an unbugged script.
  4. So i looked into it a bit and id like to conclude a little summary in the way i understand it. -- Inside the save's papyrus sections we have to sections that are of importance: - The saved/baked strings, called stringList from here on - The saved/baked script instances, called instanceList from here on For the sake of this writeup i will from here on refer to the count of stringList as stringcount and to the count of instanceList as instancecount. We(i) already know that stringList is limitied to a reach of an uInt16 which stops at 2^16-1 meaning ~65k entries So we could assume that instanceList is also limited to about ~65k entries. Question: Yes/No ? Question2: Does breaking the limit of instanceList also break saves or is this exlusive to breaking stringList's count? Lets first examine stringList ----------------------------- One thing i immediately noticed is that stringList does not contain any duplicates. Meaning vars/props get stored in stringList as a per string and not per script basis. So if 2 or more scripts contain a variable like int iVarSomethingSomething = 1then the name of "iVarSomethingSomething" will only be added once no matter how many scripts use the same variable name. The same rule applies if the same script is instanced to multiple objects. And the same rules also apply to the script names themselves. So to answer OP's (my) initial question: when using a dummyscript like ScriptName SomethingScript extends Form you increase the stringcount by exactly 1. Doesn't matter where or how often it is attached or instanced. Another important info i gathered is that literals can also bake. In my testing i found several string literals (and even some integer literals) A little string array init like Pages = new string[3] Pages[0] = "$General" Pages[1] = "$Favorite Groups" Pages[2] = "$Advanced" can increase the stringcount up to 4. The array itself uses 1 entry but initialising every entry can quickly rile up stringcount. I guess this is what @ReDragon2013 refered to in an earlier post when he mentioned active scripts Question: Is this behaviour limited only to active scripts ? Question2: Do editor filled arrays behave the same? Time to test...later Now lets look into instanceList ------------------------------- As the name instanceList suggest this list stores the script instances in the save. This goes per script Example: If you create 2 ObjectReferences that contain the same script you will increase the instancecount by 2. If you create 2 ObjectReferences and add 2 scripts each you increase the count by 4 etc. Going by this extending ObjectReference and Actor (both which are Instances of base forms by design) should be used with care. Baseforms should increase the instancecount on a per Formid/EditorId basis. Example if you add a script that extends a baseform class you increase the count by 1 no matter how many instances of it you create. Question: Does the same script that is attached to objs with different Formids increase count further? Time to test...later -- The above summary just mirrors my findings from playing around with save editors a bit and may not be accurate. If you have more in-depth info on this topic please chime in and correct me where my observations are wrong or add into it.
  5. Hi people, i have a quick question about scripts in regard to the string count in the save game. Now as far as i know functions and properties (apart form AutoReadOnly) will bake into the savegame and increase the stringcount. What about the scripts themselves? If i say add an empty dummy script to an object will that bake and increase the count?
  6. What mechanic is used to teleport the horse to the player? If its just a follow package i'd just add a quest with a dialog option like "Stay here" or something and then just update the package through the fragment. Now you can strategically place mounts all over the world. If it is controlled by a package that is...
  7. All of those suggestions are valid and lead to the desired result. Its just a question of what you (or OP in this case) want. Direct edits are always gonna be faster than any dynamic solution but come at the cost of possible incompatibility. Onhit() on player is very expensive and is best avoided when possible. For cloaking it depends how expensive they are. They can be moderately cheap with proper management but can also be very expensive if the conditions are not waterproof or there are too many actors affected.
  8. I think the Onhit() solution might be a little costly in terms of performance. One possible other solution if you are ok with editing the vanilla diseases: Locate the disease spell of choice (for example ataxia for skeever) and then remove all magic effects and add a list of filter/placeholer magiceffects Make the magic effect's type FireAndForget and set the duration to like 10 seconds or something Then add a script to each magic effect such as Scriptname DiseaseApplyFilterScript extends ActiveMagicEffect Spell Property DiseaseToApply Auto Event OnEffectStart(Actor akTarget, Actor akCaster) akTarget.AddSpell(DiseaseToApply) EndEvent Fill the property of DiseaseToApply DiseaseToApply will link to one of the actual diseases. Then you can use conditions on these placeholder effects to your hearts content inside the spell tab or inside the magic effect tab of the filtereffect. Use GetRandomPercent, GetRace, etc. This approach is way more performant as it does't need the costly Onhit() Event and also you don't need multiple scripts or check every possible condition like race through the script. Just let the default condition system handle it for you.
  9. @ OP If you are new to nifskope setting up the animation sequence(s) can be a little tricky but there are a few tutorials out there on how to do it. I don't have any links on hand right now but you should be able to find it by googling some of the Block names like NiControllerManager, NiTransformColloer or some of those. You could also look at the meshes for the magic spells (shockhandeffects.nif for example) that give you an idea on how the nif would be set up. The Netimmerse method is definetly easer, basically copy-paste. @maxarturo You can animate the textures in a .nif to some degree, you could make a tileable texture and then animate the UV coordinates (flame atronach mesh does this for example). If you were to use only 2 frames you could achieve a texture change effect As for NetImmerse.SetNodeTextureSet() - This would also work, but i don't know if this function changes the textures only for that ObjectReference or for all instances of the mesh. I have not used this function before but i know that the Node-Transform-functions only affect the specific ObjectReference so this might also be the case for SetNodeTextureSet(). Could be that you also need to call QueueNiNodeUpdate() for the effect to appear right away. I don't think you need any of those methods though. Since you are using an Actor the mesh is essentially an armor that you can equip. Naked body meshes are also armors to the game they are just flagged as unplayable so you don't have them in the inventory. So what i would do is to create a copy of the Actors armor, then give it the new texture set in the CK and then simply use Actor.EquipItem at any point through papyrus. How you track the combat state change is up to you there are dozens of ways for it. Maybe layer in a magic effect with some shader effects for the transition an thats it.
  10. Well here is my take on it First of all i think you should use papyrus states instead of three different scripts and then You can combine the 3 mesh states into the same .nif actually. I know of 2 ways to achieve this with Nifskope (3 ways if you are ok with using only 2 states) First method do this by putting each sub-mesh up into an animation sequence using a set of NiVisControllers and NiBoolInterpolators Then you call PlayGamebryoAnimation() from your script when you change the state. Alternative to this if you are not comfortable with the animations you can fake the visibility by using NetImmerse.SetNodeScale() with a value of 0 and 1 on your object. For this you Create 3 new NiNodes, give them the names of your states and make each sub-mesh a child node of one of those three. Then when you want to change the mesh state you call SetNodeScale(self,"nameOfNodeToHide",0.0) and SetNodeScale(self,"nameOfNodeToUnhide",1.0) This method requires SKSE The third option is to use the mechanic the game uses for harvestable plants but this only allows for 2states on/off By doing this you end up with a single object that can transform into whatever and you don't need to track multiple ones etc.
  11. Well quite a lot of the armor mashups from the earlier days of skyrim modding use a workaround method instead of using 'proper' 3d editing. The method works by throwing a number of armor meshes together in nifskope and then hiding the parts you don't want by using alpha channels in the textures. This is the dirty way of doing it and has a few major drawbacks. - Because the geometry is not removed and just hidden by the alpha the game needs to process said geometry -> bigger performance hit - Seperate Alpha channel > Seperate Texures > No compatiblity for retexture mods out of the box - Shaders like blood effects etc. may conform to the hidden geometry and cause the effects to float in the air for example Well the obvious path if you want to fix this is by importing the meshes into your 3d program of choice and then start chopping away the actual geometry. In this special case i think Outfit Studio is your best tool for this. It has a feature called 'Zap Sliders' (or something like it) that lets you paint a mask onto the mesh(es) and when you export your file, the geometry hidden by the mask will be completelöy removed. This is exactly what you need for this and should be the easier way versus using blender or 3ds max
  12. Well i found out that even though OnSpellCast() fires from using scrolls it will always receive a 'none' as the argument. So you can't just use it the regular way. i created a workaround using GetItemCount(). Its an unelegant solution , dirty, i would dare to call it filthy, but it should work (not tested it though) [spoiler] Actor Property PlayerRef Auto Formlist Property usedScrollsFLST Auto ; create this and give unique name in the CK Form[] usedScrollsArr int[] usedScrollCount int iCurrScrollCount = 0 Event OnInit() usedScrollsArr = new Form[4] ;4possible quip types usedScrollCount = new int[4] EndEvent Event OnObjectEquipped(Form akBase, ObjectReference akRef) if akBase as scroll int i = usedScrollsArr.Find(akBase) if i < 0 i = usedScrollsArr.Find(none) endif usedScrollsArr[i] = akBase usedScrollCount[i] = usedScrollCount[i] + 1 usedScrollsFLST.AddForm(akBase) iCurrScrollCount = PlayerRef.GetItemCount(usedScrollsFLST) if usedScrollsFLST.GetSize() > 0 && GetState() == "" GoToState("ScrollState") endif endif EndEvent Event OnObjectUnequipped(Form akBase, ObjectReference akRef) if akBase as scroll Utility.Wait(0.1) ;give OnSpellCast() time to fire int i = usedScrollsArr.Find(akBase) if i >= 0 usedScrollCount[i] = usedScrollCount[i] - 1 if usedScrollCount[i] == 0 usedScrollsArr[i] = none usedScrollsFLST.RemoveAddedForm(akBase) endif endif if usedScrollsFLST.GetSize() == 0 && GetState() == "ScrollState" GoToState("") endif endif EndEvent State ScrollState Event OnSpellCast(Form akSpell) int iOldCnt = iCurrScrollCount iCurrScrollCount = PlayerRef.GetItemCount(usedScrollsFLST) if iOldCnt > iCurrScrollCount ; we casted a scroll ;do stuff here endif EndEvent EndState [/spoiler] Because of DualWiedling and because of a bug in IsEquipped() that doesn't let you track items in the off hand properly(yeah why would anything work like its supoosed to...) i created this array setup that should in theory respect and track dualwielding the same or different kind of scrolls properly
  13. Instead of OnItemRemoved() you could just use OnSpellCast() this event will fire for scrolls something like this could work for you Keyword Property VendorItemScroll Auto int iScrollCount = 0 Event OnObjectEquipped(Form akBase, ObjectReference akRef) if akBase.HasKeyword(VendorItemScroll) iScrollCount += 1 if iScrollCount > 0 && GetState() == "" GoToState("ScrollState") endif endif EndEvent Event OnObjectUnequipped(Form akBase, ObjectReference akRef) if akBase.HasKeyword(VendorItemScroll) iScrollCount -= 1 if iScrollCount == 0 && GetState() == "ScrollState" GoToState("") endif endif EndEvent State ScrollState Event OnSpellCast(Form akSpell) if akSpell.HasKeyword(VendorItemScroll) ;do stuff here endif EndEvent EndState Note that you could just use OnSpellCast() alone but i added in some state tracking so you don't overrun the papyrus engine by checking everey spell cast but only when the player has actually equipped a scroll. The OnObjectUnequipped() event will fire when the player used up all spells/scrolls in the equipped slot
  14. Ok it's just like i suspected. You have more than 1 channel in your uvw modifiers. If you want the mesh to stay in 1 piece you need to move all uv mappings to a single channel. You would have to unwrap again anyway because they are poorly unwrapped atm. Also it's better to move the uvw modifier below the skin modifier or collapse it to the mesh. It will save a bit of headache for when you later want to add a BSDismember modifier. That modifier is a little diva and does not like if there are any modifiers above it or between it and the skin modifier. Hope this helps
×
×
  • Create New...