theimmersion Posted April 9, 2015 Share Posted April 9, 2015 (edited) So i made a humongous script that runs very slow.Its about 1000 lines in constant work.It must check and calculate tons of things and apply many different things.But it must respond quickly which it doesnt. Made a similar mod for Fallout and never had any issues with that.But the papyrus script engine or what ever it is (not a programmer xD) is really a hard one to master.So i was wondering.If i would somehow be able to brake it down into multiple scripts i assume it would work faster but how about the performance?Whats the difference between a code of around 1000 (not counting the declared variables) lines of ifs and elseifs and so onin one or multiple scripts. The mod is done but its so slow its useless. -.-Anyone want to land me a hand please about this? Well, here it is.http://www.nexusmods.com/skyrim/mods/64608/?And heres the alpha build code: Reveal hidden contents Scriptname theimmersionEMotion extends Quest ;CODE;theimmersion;This is one humongous code in one massive script as part of testing.;Once testing is done, work on optimisations will take place. (if possible-skill wise ofc);========================; *VARIABLES;========================Quest Property EMotionQuest AutoGlobalVariable Property theimmersionEMotionHELP Auto Message Property HelpMessage Auto Message Property HelpMessageB Auto GlobalVariable Property RaceOverride AutoGlobalVariable Property ModUninstall Auto GlobalVariable Property LoadGame Auto GlobalVariable Property DebugGlobal Auto GlobalVariable Property StaminaDrainGlobal Auto GlobalVariable Property KnockDown Auto GlobalVariable Property SprintAnimation Auto GlobalVariable Property UpdateInterval Auto GlobalVariable Property SuperJumpGlobal Auto GlobalVariable Property SpeedStepGlobal Auto Perk Property SpeedResetPerk Auto Spell Property StaminaDrainSpell Auto Int HelpMessageButtonInt ModInstalledInt InitAttemptInt MaintenanceActor PlayerRefInt SuperJumpKeyInt SpeedStepKeyInt ForwardKeyInt BackwardKeyInt StrafeLeftKeyInt StrafeRightKeyInt RunKeyInt SprintKeyInt WeaponOutInt PlayerIsMovingInt PlayerIsSneakingInt PlayerIsWalkingInt PlayerIsRunningInt PlayerIsRunningTryInt PlayerIsSprintingInt PlayerIsSprintingTryInt PlayerIsSwimmingInt SwimSneakAdjustFloat SpeedMultDefault ;safeguardFloat SpeedMultFloat SpeedMultSneakFloat SpeedMultVampFloat SpeedMultSwimFloat SpeedMultSlow ;walkFloat SpeedMultSlowA ;fast walkFloat SpeedMultSlowB ;runFloat SpeedMultSlowC ;sprintFloat SpeedMultCheckFloat SpeedMultModifierFloat SpeedMultReductionFloat SpeedMultEndResultFloat JumpHeightDefault ;safeguardFloat JumpHeight ;default 64Float JumpHeightCheckFloat JumpHeightModifierFloat JumpHeightReductionFloat CarryWeightFloat CarryWeightLimitFloat CarryWeightDifferenceFloat CarryWeightPercentFloat CarryWeightCheckFloat CarryWeightLimitCheckFloat SprintStaminaDrainMultFloat StaminaRegenDefaultFloat StaminaDefaultFloat StaminaCurrentFloat StaminaMax ;not reliableFloat StaminaPercent ;not reliableInt DamageStaminaInt RecoverStamina ;unusedFloat StaminaDrainBaseFloat StaminaDrainFloat StaminaDelayFloat StaminaDrainMultFloat JumpStaminaDrainInt SuperJumpBool SlowModeBool TGMswitchFloat fRaceInt iRaceOverrideInt iGenderInt iChildInt iEMoNoStaminaDrainInt iVampire;Keyword kwActorTypeUndead;Keyword kwVampire;Keyword EMoChild;Keyword EMoNoStaminaDrain;Keyword EMoArgonian;Keyword EMoBase;Keyword EMoKhajiit;Keyword EMoVampireLord;Keyword EMoWerewolf;Keyword EMoWerebearString sVariableString sVariableCheckBool DebugMonitoringBool DebugNotifyBool DebugNotifyCheckInt SpeedCalcNotifyString sVariableA ;Active movement state.String sVariableCheckAString sVariableB ;Active movements changes.String sVariableCheckBString sVariableC ;Stamina regen changes.String sVariableCheckCString sVariableD ;Weapon speed changes.String sVariableCheckDString sVariableE ;Jump height changes.String sVariableCheckEString sVariableF ;Sneak speed modi.String sVariableCheckFString sVariableG ;Swim speed modi.String sVariableCheckGString sVariableH ;Jump detection.String sVariableCheckHString sVariableI ;Race.String sVariableCheckIString sVariableJ ;Keyword.String sVariableCheckJString sVariableK ;Gender.String sVariableCheckKString sVariableL ;Race Modi.String sVariableCheckLFloat fPosZFloat fPosZmultFloat fPosZnegFloat fPosZjumpFloat fPosZstartFloat fPosZendFloat fHealthStartFloat fHealthEndFloat MoveRampDefault;========================; *EDITOR ID;========================;Code by Arocide from skyrim nexus. Thnx man! Prevented lots of headaches. string Function GetEditorID(Form akForm) Global string fullID = akForm int temp = StringUtil.Find(fullID,"<",0) + 1 int subLength = StringUtil.Find(fullID," ", temp) - temp return StringUtil.SubString(fullID, temp, subLength ) EndFunction;=================================; *MOD INITIALIZATION;================================= Function Initialize() Debug.Notification("E-Motion: SCRIPT [iNITIALIZING]"); UpdateInterval = 0.5 PlayerRef = Game.GetPlayer() SpeedMultDefault = PlayerRef.GetActorValue("SpeedMult") SpeedMult = PlayerRef.GetActorValue("SpeedMult") JumpHeightDefault = Game.GetGameSettingFloat("fJumpHeightMin") JumpHeight = Game.GetGameSettingFloat("fJumpHeightMin") StaminaRegenDefault = PlayerRef.GetActorValue("StaminaRate") MoveRampDefault = Utility.GetINIFloat("fMaxMoveRampDownDelta:Controls") SprintStaminaDrainMult = Game.GetGameSettingFloat("fSprintStaminaDrainMult") SlowMode = False iRaceOverride = -1 ForwardKey = Input.GetMappedKey("Forward") BackwardKey = Input.GetMappedKey("Backward") StrafeLeftKey = Input.GetMappedKey("Strafe Left") StrafeRightKey = Input.GetMappedKey("Strafe Right") RunKey = Input.GetMappedKey("Run") SprintKey = Input.GetMappedKey("Sprint") RegisterForAnimationEvent(PlayerRef, "JumpUp") ;jump RegisterForAnimationEvent(PlayerRef, "JumpFall") ;fall RegisterForAnimationEvent(PlayerRef, "JumpDown") ;touchdown ModInstalled = 1 Debug.Notification("E-Motion loaded.") RegisterForSingleUpdate(UpdateInterval.GetValue()) EndFunction Event OnInit() Initialize() EndEvent;==========================; *MAINTENANCE;========================== Function Maintenance() ;On Load (time for the janitor to clean up the mess xD) SuperJump = 0; Game.SetGameSettingFloat("fJumpHeightMin", JumpHeight) if StaminaPercent > 10 sVariablE = "Normal jump height modification on maintenance." JumpHeightReduction = (CarryWeightPercent / StaminaPercent) * 2 JumpHeightModifier = JumpHeight Game.SetGameSettingFloat("fJumpHeightMin", JumpHeightModifier - JumpHeightReduction) PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif StaminaPercent <= 10 sVariablE = "Minimal jump height for critical stamina on maintenance." JumpHeightModifier = JumpHeight Game.SetGameSettingFloat("fJumpHeightMin", 20) PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif TGMswitch = False SpeedMultSlow = 0 SpeedMultSlowA = 0 SpeedMultSlowB = 0 SpeedMultSlowC = 0 SlowMode = False EndFunction;===========================; *MISCELANIOUS;=========================== Event OnUpdate() if ModInstalled == 0 if InitAttempt == 0 Debug.MessageBox("E-Motion: ERROR! SCRIPT NOT INITIALIZED CORRECTLY! ATTEMPTING REINITIALIZATION") Utility.Wait(1) Initialize() InitAttempt = 1 elseif InitAttempt == 1 Debug.MessageBox("E-Motion: ERROR! SCRIPT INITIALIZATION FAILED! UNINSTALLING") Utility.Wait(1) Uninstalling() endif endif if LoadGame.GetValue() == 1 && Maintenance == 0 ;On Load Save File Maintenance = 1 Maintenance() elseif LoadGame.GetValue() == 0 && Maintenance == 1 Maintenance = 0 endif if DebugGlobal.GetValue() == 1 DebugMonitoring = True DebugNotify = True else DebugMonitoring = False DebugNotify = False endif if theimmersionEMotionHELP.GetValue() == 1 HelpMessageButton = HelpMessage.Show() Utility.Wait(1) HelpMessageButton = HelpMessageB.Show() Utility.Wait(1) Debug.MessageBox((sVariableI)+" "+(sVariableK)+" "+(sVariableJ)+" "+(sVariableL)) theimmersionEMotionHELP.SetValue(0) endif if !PlayerRef.HasSpell(StaminaDrainSpell) ;&& iEMoNoStaminaDrain == 0 PlayerRef.AddSpell(StaminaDrainSpell, false) endif if SuperJumpKey != SuperJumpGlobal.GetValueInt() UnregisterForKey(SuperJumpKey) SuperJumpKey = SuperJumpGlobal.GetValueInt() RegisterForKey(SuperJumpKey) ;V endif if SpeedStepKey != SpeedStepGlobal.GetValueInt() UnregisterForKey(SpeedStepKey) SpeedStepKey = SpeedStepGlobal.GetValueInt() RegisterForKey(SpeedStepKey) ;X endif RegisterForAnimationEvent(PlayerRef, "JumpUp") ;jump RegisterForAnimationEvent(PlayerRef, "JumpFall") ;fall RegisterForAnimationEvent(PlayerRef, "JumpDown") ;touchdown;===================; *RACE;===================if RaceOverride.GetValue() == 0iRaceOverride = -1 if GetEditorID(PlayerRef.GetRace()) == "ArgonianRace" sVariableI = "ArgonianRace" fRace = 1;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "ArgonianRaceVampire" sVariableI = "ArgonianRaceVampire" fRace = 1;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "BretonRace" sVariableI = "BretonRace" fRace = 2;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "BretonRaceVampire" sVariableI = "BretonRaceVampire" fRace = 2;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "BretonRaceChild" sVariableI = "BretonRaceChild" fRace = 2;.2 elseif GetEditorID(PlayerRef.GetRace()) == "BretonRaceChildVampire" sVariableI = "BretonRaceChildVampire" fRace = 2;.3 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "DarkElfRace" sVariableI = "DarkElfRace" fRace = 3;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "DarkElfRaceVampire" sVariableI = "DarkElfRaceVampire" fRace = 3;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "HighElfRace" sVariableI = "HighElfRace" fRace = 4;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "HighElfRaceVampire" sVariableI = "HighElfRaceVampire" fRace = 4;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "ImperialRace" sVariableI = "ImperialRace" fRace = 5;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "ImperialRaceVampire" sVariableI = "ImperialRaceVampire" fRace = 5;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "ImperialRaceChild" sVariableI = "ImperialRaceChild" fRace = 5;.2 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "KhajiitRace" sVariableI = "KhajiitRace" fRace = 6;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "KhajiitRaceVampire" sVariableI = "KhajiitRaceVampire" fRace = 6;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "NordRace" sVariableI = "NordRace" fRace = 7;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "NordRaceVampire" sVariableI = "NordRaceVampire" fRace = 7;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "NordRaceChild" sVariableI = "NordRaceChild" fRace = 7;.2 elseif GetEditorID(PlayerRef.GetRace()) == "OrcRace" sVariableI = "OrcRace" fRace = 8;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "OrcRaceVampire" sVariableI = "OrcRaceVampire" fRace = 8;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "RedGuardRace" sVariableI = "RedGuardRace" fRace = 9;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "RedGuardRaceVampire" sVariableI = "RedGuardRaceVampire" fRace = 9;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "RedGuardRaceChild" sVariableI = "RedGuardRaceChild" fRace = 9;.2 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "WoodElfRace" sVariableI = "WoodElfRace" fRace = 10;.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif GetEditorID(PlayerRef.GetRace()) == "WoodElfRaceVampire" sVariableI = "WoodElfRaceVampire" fRace = 10;.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif GetEditorID(PlayerRef.GetRace()) == "WerewolfBeastRace" sVariableI = "WerewolfBeastRace" fRace = 11;.0 elseif GetEditorID(PlayerRef.GetRace()) == "DLC2WerebearBeastRace" sVariableI = "DLC2WerebearBeastRace" fRace = 12;.0 elseif GetEditorID(PlayerRef.GetRace()) == "DLC1VampireBeastRace" sVariableI = "DLC1VampireBeastRace" fRace = 13;.0 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 else ;Unsupported custom race or form. sVariableI = "Unsupported custom race or form." fRace = 0.0 endifelseif RaceOverride.GetValue() != iRaceOverrideOverrideRace()endifendif if PlayerRef.GetActorBase().GetSex() == 0 sVariableK = "Is Male." iGender = 0 elseif PlayerRef.GetActorBase().GetSex() == 1 sVariableK = "Is Female." iGender = 1 else sVariableK = "Has no gender." iGender = -1 endif;=====================; *STATES;===================== if PlayerRef.IsWeaponDrawn() WeaponOut = 1 else WeaponOut = 0 endif if PlayerRef.IsSneaking() PlayerIsSneaking = 1 else PlayerIsSneaking = 0 endif if PlayerRef.IsRunning() PlayerIsRunning = 1 else PlayerIsRunning = 0 endif if PlayerRef.IsSprinting() PlayerIsSprinting = 1 else PlayerIsSprinting = 0 endif if PlayerRef.IsSwimming() PlayerIsSwimming = 1 else PlayerIsSwimming = 0 endif if Input.IsKeyPressed(RunKey) PlayerIsRunningTry = 1 else PlayerIsRunningTry = 0 endif if Input.IsKeyPressed(SprintKey) PlayerIsSprintingTry = 1 else PlayerIsSprintingTry = 0 endif if Input.IsKeyPressed(ForwardKey) == 0 && Input.IsKeyPressed(BackwardKey) == 0 && Input.IsKeyPressed(StrafeLeftKey) == 0 && Input.IsKeyPressed(StrafeRightKey) == 0 PlayerIsMoving = 0 else PlayerIsMoving = 1 endif;=============================; *RAMP MODIFIERS;============================= if iVampire == 1 && SlowMode == True Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", MoveRampDefault) else if WeaponOut == 0 if PlayerIsSneaking == 0 ;idle if PlayerIsMoving == 1 && PlayerIsRunning == 0 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 10) elseif PlayerIsMoving == 0 && PlayerIsRunning == 1 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 40) elseif PlayerIsMoving == 0 && PlayerIsRunning == 0 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 10) endif elseif PlayerIsSneaking == 1 ;More responce in sneaking situations. if PlayerIsMoving == 1 && PlayerIsRunning == 0 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 20) elseif PlayerIsMoving == 0 && PlayerIsRunning == 1 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 80) elseif PlayerIsMoving == 0 && PlayerIsRunning == 0 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 10) endif endif elseif WeaponOut == 1 ;More responce in combat situations. if PlayerIsMoving == 1 && PlayerIsRunning == 0 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 40) elseif PlayerIsMoving == 0 && PlayerIsRunning == 1 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 100) elseif PlayerIsMoving == 0 && PlayerIsRunning == 0 Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", 20) endif endif endif;===========================; *CALCULATIONS;=========================== CarryWeight = PlayerRef.GetTotalItemWeight() CarryWeightLimit = PlayerRef.GetActorValue("CarryWeight") if CarryWeight <= CarryWeightLimit CarryWeightDifference = CarryWeightLimit - CarryWeight CarryWeightPercent = CarryWeight / CarryWeightLimit * 100 elseif CarryWeight > CarryWeightLimit CarryWeightDifference = CarryWeight - CarryWeightLimit CarryWeightPercent = CarryWeight / CarryWeightLimit * 100 endif ;This should give an increment value. ex: 120 - 100 = 20. ;Now 20 is used as derivative for incrementing different multipliers. ex: 20 / 100 = 0.2 or 20 / 10 = 2 etc. StaminaDrainMult = (CarryWeight / CarryWeightLimit * 2) StaminaDrain = CarryWeight / CarryWeightLimit StaminaCurrent = PlayerRef.GetActorValue("Stamina") StaminaMax = PlayerRef.GetBaseActorValue("Stamina") StaminaPercent = StaminaCurrent / StaminaMax * 100;=====================================; *BASE RACE MODIFIERS;=====================================;CURRENT RACE BASIC MOTION SCALING:;Keep in mind, transformation races have their own animation speed and thus movement speeds as well.;These are there to differentiate speeds with the humanoid races (Khajiit and Argonian from Elves,Orcs and Humans.);and to differentiate Werewolf from Werebear and to improve upon VampireLords speed.;VL seems kinda slow for a uber vampire.;Thus ='s logic and theimmersion. <3 xD :P;Simple overview of concept, values may vary.;1|Argonians .... MoveFast,SwimFast,JumpNormal,DrainFast.;2|Breton ....... MoveNormal,SwimNormal,JumpLow,DrainSlow.;3|Dark Elves ... MoveNormal,SwimNormal,JumpLow,DrainSlow.;4|High Elves ... MoveNormal,SwimNormal,JumpLow,DrainSlow.;5|Imperial ..... MoveNormal,SwimNormal,JumpLow,DrainSlow.;6|Khajiit ...... MoveVeryFast,SwimSlow,JumpHigh,DrainNormal.;7|Nord ......... MoveNormal,SwimNormal,JumpLow,DrainSlow.;8|Orcs ......... MoveSlow,SwimNormal,JumpLow,DrainVerySlow.;9|Red Guard .... MoveNormal,SwimNormal,JumpLow,DrainSlow.;10|Wood Elves .. MoveFast,SwimNormal,JumpLow,DrainSlow.;11|Werewolf .... MoveVeryFast,SwimNormal,JumpNormal,DrainSlow.;12|Werebear .... MoveFast,SwimSlow,JumpLow,DrainSlow.;13|VampireLord . MoveFast/VeryFast,SwimFast,JumpHigh,NoDrain. if PlayerIsSneaking == 0 && PlayerIsSwimming == 0 && SlowMode == False if fRace == 0 ;No race. sVariableL = "No race, default multipliers." SpeedMult = SpeedMultDefault SpeedMultSneak = SpeedMultDefault SpeedMultVamp = SpeedMultDefault SpeedMultSwim = SpeedMultDefault PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 1 ;Argonian sVariableL = "Argonian race multipliers." SpeedMult = SpeedMultDefault + 20 SpeedMultVamp = SpeedMultDefault + 20 SpeedMultSneak = SpeedMultDefault + 20 SpeedMultSwim = SpeedMultDefault + 30 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 2 ;Breton sVariableL = "Breton race multipliers." SpeedMult = SpeedMultDefault - 5 SpeedMultVamp = SpeedMultDefault - 5 SpeedMultSneak = SpeedMultDefault - 5 SpeedMultSwim = SpeedMultDefault - 10 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 3 ;Delves sVariableL = "Dark Elf race multipliers." SpeedMult = SpeedMultDefault - 10 SpeedMultVamp = SpeedMultDefault - 10 SpeedMultSneak = SpeedMultDefault - 20 SpeedMultSwim = SpeedMultDefault - 10 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 4 ;Helves sVariableL = "High Elf race multipliers." SpeedMult = SpeedMultDefault + 10 SpeedMultVamp = SpeedMultDefault + 10 SpeedMultSneak = SpeedMultDefault - 30 SpeedMultSwim = SpeedMultDefault PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 5 ;Imp sVariableL = "Imperial race multipliers." SpeedMult = SpeedMultDefault SpeedMultVamp = SpeedMultDefault SpeedMultSneak = SpeedMultDefault - 10 SpeedMultSwim = SpeedMultDefault - 5 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 6 ;Kha sVariableL = "Khajiit race multipliers." SpeedMult = SpeedMultDefault + 30 SpeedMultVamp = SpeedMultDefault + 30 SpeedMultSneak = SpeedMultDefault + 30 SpeedMultSwim = SpeedMultDefault - 30 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 7 ;Nord sVariableL = "Nord race multipliers." SpeedMult = SpeedMultDefault - 10 SpeedMultVamp = SpeedMultDefault - 10 SpeedMultSneak = SpeedMultDefault - 20 SpeedMultSwim = SpeedMultDefault - 10 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 8 ;Orc sVariableL = "Orc race multipliers." SpeedMult = SpeedMultDefault - 10 SpeedMultVamp = SpeedMultDefault - 10 SpeedMultSneak = SpeedMultDefault - 20 SpeedMultSwim = SpeedMultDefault - 20 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 9 ;Rguard sVariableL = "Redguard race multipliers." SpeedMult = SpeedMultDefault SpeedMultVamp = SpeedMultDefault SpeedMultSneak = SpeedMultDefault - 5 SpeedMultSwim = SpeedMultDefault - 15 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 10 ;Welves sVariableL = "Wood Elf race multipliers." SpeedMult = SpeedMultDefault + 10 SpeedMultVamp = SpeedMultDefault + 10 SpeedMultSneak = SpeedMultDefault + 20 SpeedMultSwim = SpeedMultDefault + 10 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif if fRace == 11 ;Wwolf sVariableL = "Werewolf race multipliers." SpeedMult = SpeedMultDefault + 10 SpeedMultSneak = SpeedMultDefault + 10 SpeedMultVamp = SpeedMultDefault + 10 SpeedMultSwim = SpeedMultDefault - 15 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 12 ;Wbear sVariableL = "Werebear race multipliers." SpeedMult = SpeedMultDefault - 10 SpeedMultSneak = SpeedMultDefault - 10 SpeedMultVamp = SpeedMultDefault - 10 SpeedMultSwim = SpeedMultDefault - 30 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif fRace == 13 ;Vlord sVariableL = "Vampire Lord race multipliers." SpeedMult = SpeedMultDefault + 30 SpeedMultSneak = SpeedMultDefault + 30 SpeedMultVamp = SpeedMultDefault + 30 SpeedMultSwim = SpeedMultDefault + 15 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif endif if iVampire == 1 JumpHeight = JumpHeightDefault + 30 StaminaDrainBase = 0.0 else if PlayerIsSwimming == 1 if fRace == 0 ;NONE StaminaDrainBase = 4 JumpHeight = JumpHeightDefault elseif fRace == 1 ;Arg StaminaDrainBase = 2.0 JumpHeight = JumpHeightDefault + 10 elseif fRace == 2 ;Bre StaminaDrainBase = 5.0 JumpHeight = JumpHeightDefault - 10 elseif fRace == 3 ;Delves StaminaDrainBase = 5.0 JumpHeight = JumpHeightDefault - 10 elseif fRace == 4 ;Helves StaminaDrainBase = 4.5 JumpHeight = JumpHeightDefault elseif fRace == 5 ;Imp StaminaDrainBase = 3.5 JumpHeight = JumpHeightDefault - 15 elseif fRace == 6 ;Kha StaminaDrainBase = 5.5 JumpHeight = JumpHeightDefault + 20 elseif fRace == 7 ;Nord StaminaDrainBase = 4.0 JumpHeight = JumpHeightDefault - 15 elseif fRace == 8 ;Orc StaminaDrainBase = 4.5 JumpHeight = JumpHeightDefault - 20 elseif fRace == 9 ;Rguard StaminaDrainBase = 3.5 JumpHeight = JumpHeightDefault + 5 elseif fRace == 10 ;Welves StaminaDrainBase = 2.5 JumpHeight = JumpHeightDefault + 10 elseif fRace == 11 ;Wwolf StaminaDrainBase = 3.0 JumpHeight = JumpHeightDefault elseif fRace == 12 ;Wbear StaminaDrainBase = 3.5 JumpHeight = JumpHeightDefault - 25 endif else if fRace == 0 ;NONE StaminaDrainBase = 3 JumpHeight = JumpHeightDefault elseif fRace == 1 ;Arg StaminaDrainBase = 5.0 JumpHeight = JumpHeightDefault + 10 elseif fRace == 2 ;Bre StaminaDrainBase = 4.0 JumpHeight = JumpHeightDefault - 10 elseif fRace == 3 ;Delves StaminaDrainBase = 4.0 JumpHeight = JumpHeightDefault - 10 elseif fRace == 4 ;Helves StaminaDrainBase = 3.5 JumpHeight = JumpHeightDefault elseif fRace == 5 ;Imp StaminaDrainBase = 2.5 JumpHeight = JumpHeightDefault - 15 elseif fRace == 6 ;Kha StaminaDrainBase = 4.5 JumpHeight = JumpHeightDefault + 20 elseif fRace == 7 ;Nord StaminaDrainBase = 3.0 JumpHeight = JumpHeightDefault - 15 elseif fRace == 8 ;Orc StaminaDrainBase = 2.5 JumpHeight = JumpHeightDefault - 20 elseif fRace == 9 ;Rguard StaminaDrainBase = 2.0 JumpHeight = JumpHeightDefault + 5 elseif fRace == 10 ;Welves StaminaDrainBase = 2.0 JumpHeight = JumpHeightDefault + 10 elseif fRace == 11 ;Wwolf StaminaDrainBase = 2.5 JumpHeight = JumpHeightDefault elseif fRace == 12 ;Wbear StaminaDrainBase = 3.0 JumpHeight = JumpHeightDefault - 25 endif endif endif if iVampire == 1 Game.SetGameSettingFloat("fJumpFallHeightMin", 300 + JumpHeight) Game.SetGameSettingFloat("fSprintStaminaDrainMult", 0) else Game.SetGameSettingFloat("fJumpFallHeightMin", 100 + JumpHeight) ;fixed default: mod=200|vanilla=600 LOL! xD Game.SetGameSettingFloat("fSprintStaminaDrainMult", SprintStaminaDrainMult) endif if fRace == 13 ;Vlord StaminaDrainBase = 0.0 JumpHeight = JumpHeightDefault + 50 endif if iVampire == 1 && PlayerIsSneaking == 0 if SlowMode == True SpeedMult = SpeedMultVamp + 60 SpeedMultSlow = 0 SpeedMultSlowA = 0 SpeedMultSlowB = 0 SpeedMultSlowC = 0 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) else SpeedMult = SpeedMultVamp SpeedMultSlow = 0 SpeedMultSlowA = 0 SpeedMultSlowB = 0 SpeedMultSlowC = 0 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif endif if PlayerIsSneaking == 1 && PlayerIsSwimming == 0 sVariableF = "Sneaking." if PlayerIsRunning == 1 && PlayerIsSprintingTry == 0 sVariableF = "Reducing running speed while sneaking."; SwimSneakAdjust = 1 SpeedMult = SpeedMultSneak - 40 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif PlayerIsRunning == 1 && PlayerIsSprintingTry == 1 sVariableF = "Adjusting sneak speed to fastest." SwimSneakAdjust = 1 SpeedMult = SpeedMultSneak - 10 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif endif if PlayerIsSwimming == 1 sVariableG = "Swimming." if StaminaCurrent == 0 SwimSneakAdjust = 2 SpeedMult = SpeedMultSwim - 40 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) else if PlayerIsRunning == 1 && PlayerIsSprintingTry == 0 sVariableG = "Reducing running speed while swimming." SwimSneakAdjust = 2 SpeedMult = SpeedMultSwim - 20 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif PlayerIsRunning == 1 && PlayerIsSprintingTry == 1 sVariableG = "Adjusting swim speed to fastest." SwimSneakAdjust = 2 SpeedMult = SpeedMultSwim PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif endif endif if SlowMode == True && iVampire == 0 SprintAnimation.SetValue(0) if PlayerIsRunning == 1 && PlayerIsSprintingTry == 1 SpeedMultSlowB = 20 else SpeedMultSlowB = 50 endif else SprintAnimation.SetValue(1) endif; if SwimSneakAdjust == 1 && PlayerIsSneaking == 0 && PlayerIsSwimming == 0; sVariableF = "Reverting from sneak speed adjustments."; SpeedMult = SpeedMultDefault; PlayerRef.AddPerk(SpeedResetPerk); PlayerRef.RemovePerk(SpeedResetPerk); elseif SwimSneakAdjust == 2 && PlayerIsSneaking == 0 && PlayerIsSwimming == 0; sVariableG = "Reverting from swim speed adjustments."; SpeedMult = SpeedMultDefault; PlayerRef.AddPerk(SpeedResetPerk); PlayerRef.RemovePerk(SpeedResetPerk); endif; if SwimSneakAdjust == 0 && PlayerIsSneaking == 0 && PlayerIsSwimming == 0 && SpeedMult != SpeedMultDefault ;SAFEGUARD; Debug.Notification("E-Mo: Reverting adjustments via safeguard."); SpeedMult = SpeedMultDefault; PlayerRef.AddPerk(SpeedResetPerk); PlayerRef.RemovePerk(SpeedResetPerk); endif;=====================================; *ACTIVE SPEED MODIFIERS;===================================== if CarryWeight <= CarryWeightLimit && DamageStamina <= 1 sVariableA = "Movement in normal state." if PlayerIsRunning == 0 && PlayerIsRunningTry == 0 && PlayerIsSprinting == 0 && PlayerIsSprintingTry == 1 ;fast walk sVariableB = "Fast walk in normal state." SpeedMultModifier = SpeedMult + 50 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultSlowA) ;default 50 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultSlowA elseif PlayerIsRunning == 1 && PlayerIsRunningTry != -1 && PlayerIsSprinting == 0 && PlayerIsSprintingTry != -1 ;run sVariableB = "Run in normal state." SpeedMultModifier = SpeedMult - SpeedMultSlowB SpeedMultReduction = (CarryWeight / CarryWeightLimit * 12.5) PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 100 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) DamageStamina = 1 PlayerRef.DamageAV("Stamina", StaminaDrainBase + StaminaDrain) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction elseif PlayerIsRunning != -1 && PlayerIsRunningTry != -1 && PlayerIsSprinting == 1 && PlayerIsSprintingTry != -1 ;sprint sVariableB = "Sprint in normal state." SpeedMultModifier = SpeedMult - SpeedMultSlowC SpeedMultReduction = (CarryWeight / CarryWeightLimit * 25) PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 100 PlayerRef.DamageAV("Stamina", StaminaDrainBase + StaminaDrain) PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction else sVariableB = "Walk in normal state." SpeedMultModifier = SpeedMult - SpeedMultSlow PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier) PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) SpeedCalcNotify = 1 SpeedMultEndResult = SpeedMultModifier endif elseif CarryWeight <= CarryWeightLimit && DamageStamina >= 2 sVariableA = "Movement in recover state." if PlayerIsRunning == 0 && PlayerIsRunningTry == 0 && PlayerIsSprinting == 0 && PlayerIsSprintingTry == 1 ;fast walk sVariableB = "Fast walk in recovering state." SpeedMultModifier = SpeedMult + 50 - SpeedMultSlowA SpeedMultReduction = (CarryWeight / CarryWeightLimit * 25) ;50 SpeedMultSlowA + 30 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 50 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction elseif PlayerIsRunning == 1 && PlayerIsRunningTry != -1 && PlayerIsSprinting == 0 && PlayerIsSprintingTry != -1 ;run sVariableB = "Run in recovering state." SpeedMultModifier = SpeedMult - SpeedMultSlowB SpeedMultReduction = (CarryWeight / CarryWeightLimit * 50) ;80 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 100 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) PlayerRef.DamageAV("Stamina", StaminaDrainBase + StaminaDrainMult) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction elseif PlayerIsRunning != -1 && PlayerIsRunningTry != -1 && PlayerIsSprinting == 0 && PlayerIsSprintingTry == 1 ;sprint sVariableB = "Sprint in recovering state." SpeedMultModifier = SpeedMult + 100 - SpeedMultSlowC SpeedMultReduction = (CarryWeight / CarryWeightLimit * 50) ;120 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 175 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) PlayerRef.DamageAV("Stamina", StaminaDrainBase + StaminaDrainMult) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction else sVariableB = "Walk in recovering state." SpeedMultModifier = SpeedMult - SpeedMultSlow SpeedMultReduction = (CarryWeight / CarryWeightLimit * 25) ;30 SpeedMultSlow + 30 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;walk PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction endif elseif CarryWeight > CarryWeightLimit && DamageStamina != -1 ;NOTE: using "TGM/Toggle God Mode" while carry weight over limit will still apply speed mult. A native function like "IsGodModeEnabled" needed. sVariableA = "Movement in encumbered state." if TGMswitch == False if PlayerIsRunningTry == 0 && PlayerIsSprintingTry == 1 && PlayerRef.GetActorValue("Stamina") != -99 ;fast walk sVariableB = "Fast walk in encumbered state." SpeedMultModifier = SpeedMult + 50 SpeedMultReduction = (CarryWeight / CarryWeightLimit * 12.5) ;30 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 50 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction elseif PlayerIsRunningTry == 1 && PlayerIsSprintingTry == 0 && PlayerRef.GetActorValue("Stamina") ;run if PlayerIsMoving == 1 sVariableB = "Run in encumbered state." SpeedMultModifier = SpeedMult + 100 SpeedMultReduction = (CarryWeight / CarryWeightLimit * 25) ;50 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 100 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) DamageStamina = 1 PlayerRef.DamageAV("Stamina", StaminaDrainBase + StaminaDrainMult) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction endif elseif PlayerIsRunningTry == 1 && PlayerIsSprintingTry == 1 && PlayerRef.GetActorValue("Stamina") ;sprint sVariableB = "Sprint in encumbered state." SpeedMultModifier = SpeedMult + 175 SpeedMultReduction = (CarryWeight / CarryWeightLimit * 25) ;100 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;default 175 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) DamageStamina = 1 PlayerRef.DamageAV("Stamina", StaminaDrainBase + StaminaDrainMult) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction else sVariableB = "Walk in encumbered state." SpeedMultModifier = SpeedMult SpeedMultReduction = (CarryWeight / CarryWeightLimit * 12.5) ;10 PlayerRef.ForceActorValue("SpeedMult", SpeedMultModifier - SpeedMultReduction) ;walk PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) SpeedCalcNotify = 2 SpeedMultEndResult = SpeedMultModifier - SpeedMultReduction endif endif endif;============================; *STAMINA REGEN;============================if iEMoNoStaminaDrain == 0 if DamageStamina == 1 sVariableC = "Depleting stamina." StaminaDrainGlobal.SetValue(1) if PlayerRef.GetActorValue("Stamina") <= 0 sVariableC = "Stamina depleted." DamageStamina = 2 endif if PlayerIsRunning == 0 && PlayerIsSprinting == 0 sVariableC = "Recovering stamina." StaminaDrainGlobal.SetValue(0) DamageStamina = 0 endif endif if DamageStamina == 2 sVariableC = "Stamina regen waiting for walking." if PlayerIsRunning == 0 && PlayerIsRunningTry == 0 && PlayerIsSprinting == 0 sVariableC = "Delaying stamina regen." StaminaDelay = Utility.GetCurrentRealTime() + 3 DamageStamina = 3 endif endif if DamageStamina == 3 && Utility.GetCurrentRealTime() > StaminaDelay sVariableC = "Recovering depleted stamina after delay." StaminaDrainGlobal.SetValue(0) DamageStamina = 0 endifelse StaminaDrainGlobal.SetValue(0)endif;====================================; *JUMP HEIGHT MODIFIERS;==================================== if SuperJump == 0 if StaminaPercent > 10 sVariablE = "Normal jump height modification." JumpHeightReduction = (CarryWeightPercent / StaminaPercent) * 2 JumpHeightModifier = JumpHeight Game.SetGameSettingFloat("fJumpHeightMin", JumpHeightModifier - JumpHeightReduction) PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) elseif StaminaPercent <= 10 sVariablE = "Minimal jump height for critical stamina." JumpHeightModifier = JumpHeight Game.SetGameSettingFloat("fJumpHeightMin", 20) PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif endif;===============================; *DEBUG MONITORING;=============================== if sVariableI != sVariableCheckI ;Race. Debug.Notification("E-Mo: "+(sVariableI)+" RaceID: "+(GetEditorID(PlayerRef.GetRace()))+"") sVariableCheckI = sVariableI endif if sVariableK != sVariableCheckK ;Gender. Debug.Notification("E-Mo: "+(sVariableK)+"") sVariableCheckK = sVariableK endif if sVariableJ != sVariableCheckJ ;Keyword. Debug.Notification("E-Mo: "+(sVariableJ)+"") sVariableCheckJ = sVariableJ endif if sVariableL != sVariableCheckL ;Race multipliers. Debug.Notification("E-Mo: "+(sVariableL)+"") sVariableCheckL = sVariableL endif if DebugNotify != DebugNotifyCheck if DebugNotify == True Debug.Notification("E-Mo: Debug MODE *ON") DebugNotifyCheck = DebugNotify elseif DebugNotify == False Debug.Notification("E-Mo: Debug *OFF") DebugNotifyCheck = DebugNotify endif endif if DebugMonitoring == True if sVariableA != sVariableCheckA ;Active movement state. Debug.Notification("E-Mo: "+(sVariableA)+"") sVariableCheckA = sVariableA endif if sVariableB != sVariableCheckB ;Active movement changes. Debug.Notification("E-Mo: "+(sVariableB)+"") sVariableCheckB = sVariableB if SpeedCalcNotify == 1 Debug.Notification("Base Speed: "+(SpeedMult)+" Modified Speed: "+(SpeedMultModifier)+" End Result: "+(SpeedMultEndResult)+"") elseif SpeedCalcNotify == 2 Debug.Notification("Base Speed: "+(SpeedMult)+" Modified Speed: "+(SpeedMultModifier)+" Speed Reduction: "+(SpeedMultReduction)+" End Result: "+(SpeedMultEndResult)+"") endif endif if sVariableC != sVariableCheckC ;Stamina regen changes. Debug.Notification("E-Mo: "+(sVariableC)+"") sVariableCheckC = sVariableC endif if sVariableD != sVariableCheckD ;Weapon speed changes. Debug.Notification("E-Mo: "+(sVariableD)+"") sVariableCheckD = sVariableD endif if sVariableE != sVariableCheckE ;Jump height changes. Debug.Notification("E-Mo: "+(sVariableE)+"") sVariableCheckE = sVariableE endif if sVariableF != sVariableCheckF ;Sneak speed modi. Debug.Notification("E-Mo: "+(sVariableF)+"") sVariableCheckF = sVariableF endif if sVariableG != sVariableCheckG ;Swim speed modi. Debug.Notification("E-Mo: "+(sVariableG)+"") sVariableCheckG = sVariableG endif; if sVariableH != sVariableCheckH ;Jump detection.; Debug.MessageBox("E-Mo: "+(sVariableH)+""); sVariableCheckH = sVariableH; endif; if sVariableJ != sVariableCheckJ ;Keyword.; Debug.Notification("E-Mo: "+(sVariableJ)+""); sVariableCheckJ = sVariableJ; endif if CarryWeight != CarryWeightCheck Debug.Notification("*CW: "+(CarryWeight)+" CW|L: "+(CarryWeightLimit)+" CW|D: "+(CarryWeightDifference)+" CW|P: "+(CarryWeightPercent)+"") CarryWeightCheck = CarryWeight endif if CarryWeightLimit != CarryWeightLimitCheck Debug.Notification("CW: "+(CarryWeight)+" *CW|L: "+(CarryWeightLimit)+" CW|D: "+(CarryWeightDifference)+" CW|P: "+(CarryWeightPercent)+"") CarryWeightLimitCheck = CarryWeightLimit endif endif;===========================; *SCRIPT STATE;=========================== if ModInstalled == 1 RegisterForSingleUpdate(UpdateInterval.GetValue()) elseif ModInstalled == 0 Debug.MessageBox("E-Motion: ERROR! MOD REMOVED WITHOUT UNINSTALLING!") endif if ModUninstall.GetValue() == 1 Uninstalling() endif EndEvent Function Uninstalling() Debug.Notification("E-Motion: SCRIPT [uNINSTALLING]") UnregisterForUpdate() Utility.Wait(2) ;OnUpdate should finish by now even on a very slow cycle. PlayerRef.RemoveSpell(StaminaDrainSpell) SprintAnimation.SetValue(1) UnregisterForAllKeys() Utility.Wait(1) UnregisterForAnimationEvent(PlayerRef, "JumpUp") UnregisterForAnimationEvent(PlayerRef, "JumpFall") UnregisterForAnimationEvent(PlayerRef, "JumpDown") Utility.Wait(2) PlayerRef.SetActorValue("SpeedMult", SpeedMultDefault) Game.SetGameSettingFloat("fJumpHeightMin", JumpHeightDefault) Game.SetGameSettingFloat("fSprintStaminaDrainMult", SprintStaminaDrainMult) Utility.SetINIFloat("fMaxMoveRampDownDelta:Controls", MoveRampDefault) Utility.Wait(1) ModInstalled = -1 Debug.Notification("E-Motion: SCRIPT [uNINSTALLED]") Debug.Notification("E-Motion: QUEST [sTOPPING]") Utility.Wait(2); Debug.Notification("E-Motion: QUEST [sTOPPING]"); Utility.Wait(2) Debug.Notification("E-Motion: QUEST [sTOPPED]") Utility.Wait(1) Debug.Notification("E-Motion: MOD [uNINSTALLED]") EMotionQuest.Stop(); Debug.Notification("E-Motion: QUEST [sTOPPED]"); Debug.MessageBox("E-Motion: ENTER IN CONSOLE(~) [stopQuest theimmersionEMotionQuest]") EndFunction;===============================; *ANIMATION EVENTS;===============================;Jump stamina drain;Ragdoll on hard fall.;------------------------------ Event OnAnimationEvent(ObjectReference akActor, string akEventName) if KnockDown.GetValue() == 1 && akActor == PlayerRef && iVampire == 0 && akEventName == "JumpUp" ;&& SuperJump != -1 sVariableH = "Jumped." JumpStaminaDrain = CarryWeightPercent / 3 if JumpStaminaDrain <= 5 PlayerRef.DamageAV("Stamina", 5) else PlayerRef.DamageAV("Stamina", JumpStaminaDrain) endif DamageStamina = 1; fHealthStart = PlayerRef.GetActorValue("Health") fPosZmult = CarryWeightPercent / 5 fPosZ = PlayerRef.GetHeight() - fPosZmult fPosZjump = JumpHeight / 2 fPosZneg = fPosZ - fPosZjump fPosZstart = PlayerRef.GetPositionZ() - fPosZneg endif if KnockDown.GetValue() == 1 && akActor == PlayerRef && iVampire == 0 && akEventName == "JumpFall" ;&& SuperJump == 0 sVariableH = "Falling." fPosZend = PlayerRef.GetPositionZ() if fPosZend < fPosZstart sVariableH = "Triggered by Falling." Ragdoll() endif endif if KnockDown.GetValue() == 1 && akActor == PlayerRef && iVampire == 0 && akEventName == "JumpDown" ;&& SuperJump != -1 sVariableH = "Landed." fPosZend = PlayerRef.GetPositionZ() if fPosZend < fPosZstart sVariableH = "Triggered by fall difference." Ragdoll() endif; fHealthEnd = PlayerRef.GetActorValue("Health"); if fHealthEnd < fHealthStart; sVariableH = "Triggered by health loss."; Game.ForceThirdPerson(); PlayerRef.PushActorAway(PlayerRef, -1); endif endif EndEvent;=======================; *CONTROLS;=======================;Super Jump;TGM Switch;Slow/Fast Mode;Ragdoll;---------------------- Event OnKeyUp(int keyCode, float holdTime) if KeyCode == SuperJumpKey && holdTime < 1.2 && Utility.IsInMenuMode() == 0 ;V (SUPER JUMP) if SuperJump == 0 Debug.Notification("E-Motion: Super Jump Mode") SuperJump = 1 Game.SetGameSettingFloat("fJumpHeightMin", JumpHeight * 3.5) elseif SuperJump == 1 Debug.Notification("E-Motion: Normal Jump Mode") SuperJump = 0 Game.SetGameSettingFloat("fJumpHeightMin", JumpHeight) endif elseif KeyCode == SuperJumpKey && holdTime >= 1.2 && Utility.IsInMenuMode() == 0 ;(TGM SWITCH) if TGMswitch == False ;Since we cant check for TGM state. TGMswitch = True Debug.Notification("tiIM: TGM Switch ON") elseif TGMswitch == True TGMswitch = False Debug.Notification("tiIM: TGM Switch OFF") endif endif if KeyCode == SpeedStepKey && holdTime < 1.2 && Utility.IsInMenuMode() == 0 ;X (slow mode) if SlowMode == False if iVampire == 0 SpeedMultSlow = 20 ;25 SpeedMultSlowA = 50 ;50 SpeedMultSlowB = 50 ;80 SpeedMultSlowC = 20 ;120 PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif SlowMode = True elseif SlowMode == True SpeedMultSlow = 0 SpeedMultSlowA = 0 SpeedMultSlowB = 0 SpeedMultSlowC = 0 SlowMode = False PlayerRef.AddPerk(SpeedResetPerk) PlayerRef.RemovePerk(SpeedResetPerk) endif elseif KeyCode == SpeedStepKey && holdTime >= 1.2 && Utility.IsInMenuMode() == 0 ;(ragdoll) sVariableH = "Triggered by player." Ragdoll() endif EndEvent;======================; *RAGDOLL;====================== Function Ragdoll() if Game.GetCameraState() == 0; Debug.MessageBox("Triggered in FPV.") Game.ForceThirdPerson() Utility.Wait(0.1) PlayerRef.PushActorAway(PlayerRef, 0.0); PlayerRef.SetUnconscious(True); Utility.Wait(3); Game.ForceFirstPerson() else; Debug.MessageBox("Triggered out of FPV.") PlayerRef.PushActorAway(PlayerRef, 0.0) endif EndFunction;============================; *RACE OVERRIDE;============================ Function OverrideRace() if RaceOverride.GetValue() == 1 sVariableI = "Unsupported custom race or form." fRace = 0.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 2 sVariableI = "Unsupported custom race or form." fRace = 0.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 3 ;Arg fRace = 1.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 4 ;V fRace = 1.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 5 ;Brtn fRace = 2.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 6 ;V fRace = 2.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 9 ;Delves fRace = 3.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 10 ;V fRace = 3.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 11 ;Helves fRace = 4.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 12 ;V fRace = 4.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 13 ;Imp fRace = 5.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 14 ;V fRace = 5.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 16 ;Kha fRace = 6.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 17 ;V fRace = 6.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 18 ;Nrd fRace = 7.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 19 ;V fRace = 7.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 21 ;Orc fRace = 8.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 22 ;V fRace = 8.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 23 ;Rdg fRace = 9.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 24 ;V fRace = 9.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 26 ;Welves fRace = 10.0 sVariableJ = "Is Mortal." iEMoNoStaminaDrain = 0 sVariableJ = "Not a Vampire." iVampire = 0 elseif RaceOverride.GetValue() == 27 ;V fRace = 10.1 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 elseif RaceOverride.GetValue() == 28 ;Wwolf sVariableI = "WerewolfBeastRace" fRace = 11;.0 elseif RaceOverride.GetValue() == 29 ;Wbear sVariableI = "DLC2WerebearBeastRace" fRace = 12;.0 elseif RaceOverride.GetValue() == 30 ;Vlord sVariableI = "DLC1VampireBeastRace" fRace = 13;.0 sVariableJ = "Is Undead." iEMoNoStaminaDrain = 1 sVariableJ = "Is a Vampire." iVampire = 1 endif iRaceOverride = RaceOverride.GetValueInt() EndFunction;======================; *THE END;====================== Edited April 10, 2015 by theimmersion Link to comment Share on other sites More sharing options...
Mattiewagg Posted April 10, 2015 Share Posted April 10, 2015 Well, remove any Game.GetPlayer()s you may have and replace them with an Actor Property for the PC (PlayerREF). Cordone any less likely parts of the script behind Ifs. Put the If/ElseIfs in the order of most likely to happen (first) to least likely (last). Link to comment Share on other sites More sharing options...
theimmersion Posted April 10, 2015 Author Share Posted April 10, 2015 It only has one Game.GetPlayer(). Handled by OnInit() > Actor PlayerRef = Game.GetPlayer(). Its the rest that is a beast. xD Link to comment Share on other sites More sharing options...
Mattiewagg Posted April 10, 2015 Share Posted April 10, 2015 Remove ANY CONVENIENCE FUNCTIONS. Functions like GetRef, GetAV, SetAV, GetActorRef. Replace themWith their full counterparts: GetReference, GetActorValue, SetActorValue, GetReference as Actor This is b/c each of those will call their counterparts, which in turn call the function, rather than directly. IE GetRef calls GetReference which does things, rather than just doing things. Link to comment Share on other sites More sharing options...
theimmersion Posted April 10, 2015 Author Share Posted April 10, 2015 Already done. Still too slow. Should i upload the source script? xD Link to comment Share on other sites More sharing options...
Mattiewagg Posted April 10, 2015 Share Posted April 10, 2015 On 4/10/2015 at 1:21 AM, theimmersion said: Already done. Still too slow. Should i upload the source script? xDYes, definitely put in spoiler. Link to comment Share on other sites More sharing options...
RealAntithesis Posted April 10, 2015 Share Posted April 10, 2015 It's probably good practice to upload your source scripts anyway. At least then, if there are issues that need addressing and you're not around (for whatever reason) people can fix your script and recompile themselves. Link to comment Share on other sites More sharing options...
theimmersion Posted April 10, 2015 Author Share Posted April 10, 2015 Im aiming at finishing it to 100% functional. Thats why im posting. To make sure i make a 100% working mod. But i also listen to wiser people. So i uploaded the source scripts. Next uploads will be with the source scripts. Link to comment Share on other sites More sharing options...
Arocide Posted April 10, 2015 Share Posted April 10, 2015 (edited) You are constantly calling for the values from the engine, so it's getting throttled you need to be caching the values locally that is the real bottle neck to your script, look for places where you are calling the same function over and over again, and instead cache that value to a local variable (e.g your GetEditorID(PlayerRef.GetRace()) if block). That would be the first thing I would look for anyway. Papyrus' slowest point is the interface with the engine. After that I would suggest thinking about what actually is needed in that update block, personally I think there is some parts in there that could be better placed elsewhere, look for other events you could hook into to reduce the volume of the code that runs when it doesn't particularly need to. Doing those two things would be a great start in getting that script into a nice clean state! Edited April 10, 2015 by Arocide Link to comment Share on other sites More sharing options...
theimmersion Posted April 10, 2015 Author Share Posted April 10, 2015 Its calling it all the time because of changes to the race. If i transform into a vampire or werewolf, the editor and race block will detect it and apply different settings.Unless there is a event for a race change that could send me the event and than recheck the race. Otherwise, it always checks the race.It even needs constant animation registering.It registered for the animations at initialization like keys but when i changed to a vampire, the registered animation were gone.So even that needs a constant happening. Wish i had a big fat monitor for the whole code, id recode everything and compress as much as i can, but with the low overview of the code its very hard. Link to comment Share on other sites More sharing options...
Recommended Posts