gammons123 Posted October 2, 2019 Posted October 2, 2019 Hi, This might be a a bit on an ask, but is anyone willing to take a look at my quest script and give me some suggestions as to why my AAF calls are not doing anything? I had them working previously before the CK ate one of my scripts, but I've not been able to figure it out again since then, but it can be very different from what I have now... I'll put the relevant AAF bits of the script in the following spoiler and put the whole script in another in case the context is important. Thanks in advance for anyone who has the patience to have a look And apologies for what ever awful coding mistakes I've made. I should add that AAF is working for me otherwise, outside of my own mod. AAF code only : Spoiler AAF:AAF_API AAF_API Actor Property PlayerREF Auto Actor Property DomREF Auto Actor PlayerRefThatWorks Actor DOMREFThatWorks ;initialisation Function LoadAAF() AAF_API = Game.GetFormFromFile(0x00000F99, "AAF.esm") as AAF:AAF_API If !AAF_API Debug.Notification("Can't find AAF API.") utility.wait(0.1) Else RegisterForCustomEvent(AAF_API, "OnAnimationStart") RegisterForCustomEvent(AAF_API, "OnAnimationChange") RegisterForCustomEvent(AAF_API, "OnAnimationStop") RegisterForCustomEvent(AAF_API, "OnSceneInit") RegisterForCustomEvent(AAF_API, "OnSceneEnd") Endif EndFunction Event OnQuestInit() RegisterForRemoteEvent(PlayerRef, "OnPlayerLoadGame") LoadAAF() RegisterRemoteEvents() LoadAAF() ActorFormIDAsActor() EndEvent Event Actor.OnPlayerLoadGame(actor aSender) RegisterRemoteEvents() LoadAAF() ActorFormIDAsActor() EndEvent Function ActorFormIDAsActor() Int iPlayerID = PlayerREF.GetFormID() PlayerREFThatWorks = Game.GetForm(iPlayerID) as Actor Int iDomID = DomREF.GetFormID() DomREFThatWorks = Game.GetForm(iDomID) as Actor EndFunction Function RegisterRemoteEvents() RegisterForRemoteEvent(PlayerRefThatWorks, "OnItemEquipped") RegisterForRemoteEvent(PlayerRefThatWorks, "OnPlayerLoadGame") ;RegisterForRemoteEvent(PlayerRef, "OnPlayerLoadGame") EndFunction Event OnKeyDown(int keyCode) if (keyCode == 109 ) MessageBoxMain() EndIf endif EndEvent ; Message Box Template Function MessageBoxMain() Int iButton = MessageBoxMain.Show() If iButton == 0 ConsentManager() return elseif iButton == 1 ConsentManager() return elseif iButton == 2 PlayerKneel() elseif iButton == 3 PlayerKneel() return elseif iButton == 4 AAFStartCouple(PlayerREF, DomREF, 10, true, true, "","","Aggressive","Kissing") return elseif iButton == 5 AAFStartSolo(PlayerREF, 20, true, true,"", "F", "Aggressive", "Masturbation,F") return elseif iButton == 6 AAFStartSolo(PlayerRefThatWorks, 20, true, true,"", "F", "Aggressive","SexyDance") return elseif iButton == 7 DDLibrary.EquipDevice(PlayerRefThatWorks, DDLibrary.DD_Collar_Leather_Black_Inventory) return elseif iButton == 8 DDLibrary.RemoveDevice(PlayerRefThatWorks, DDLibrary.DD_Collar_Leather_Black_Inventory) return endif EndFunction ;---------------------AAF MANAGEMENT-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;AAF Couple Template Function AAFStartCouple(actor aSexActor0, actor aSexActor1, float fDuration, Bool bPreventFurniture, Bool bUsePackages, String sPosition, String sIncludeTags, String sExcludeTags, String sCombinedTags) Debug.Notification("started aaf Couple function") Actor[] Actors = new Actor[2] actors[0] = aSexActor0 actors[1] = aSexActor1 AAF:AAF_API:SceneSettings settings = AAF_API.GetSceneSettings() settings.duration = fDuration settings.preventFurniture = bPreventFurniture settings.usePackages = bUsePackages settings.Position = sPosition settings.includeTags = sIncludeTags settings.excludeTags = sExcludeTags settings.combinedTags = sCombinedTags AAF_API.StartScene(actors, settings) EndFunction ;AAF SoloTemplate Function AAFStartSolo(actor aSexActor0, float fDuration, Bool bPreventFurniture, Bool bUsePackages, String sPosition, String sIncludeTags, String sExcludeTags, String sCombinedTags) Debug.Notification("started aaf Solo function") Actor[] Actors = new Actor[1] actors[0] = aSexActor0 AAF:AAF_API:SceneSettings settings = AAF_API.GetSceneSettings() settings.duration = fDuration settings.preventFurniture = bPreventFurniture settings.usePackages = bUsePackages settings.Position = sPosition settings.includeTags = sIncludeTags settings.excludeTags = sExcludeTags settings.combinedTags = sCombinedTags EndFunction The Whole script: Spoiler Scriptname GDX_MainQuestScript2 extends Quest Conditional ; API AAF:AAF_API AAF_API DD:DD_Library Property DDLibrary Auto Const ; Quest Properties Bool Property ConsentToggle = false Auto Conditional Int Property iPlayerObedience = 0 Auto Conditional Int Property iDomMood = 0 Auto Conditional Bool Property bDDTalk = false Auto Conditional Int Property iQuestStage = 0 Auto Conditional ; 20 = is dom, 30, is busy domming Bool Property bApproachPlayer = false Auto Conditional ;Actor Properties Actor Property PlayerREF Auto Actor Property DomREF Auto ReferenceAlias Property GDX_Player Auto ;Keyword Properties Keyword Property ObjectTypeFood Auto Const ;Keyword Property _ClothingClassDress Auto Const ;Message Box Properties Message Property MessageBoxMain Auto ;Idle Properties Idle Property SubmissionIdle Auto Const Idle Property StopIdle Auto Const ;Player Status Properties Bool Property bPlayerKneeling = false Auto Conditional Bool Property bPlayerBound = false Auto Conditional Bool Property bPlayerGagged = false Auto Conditional Bool Property bPlayerChaste = false Auto Conditional Bool Property bPlayerChasteBra = false Auto Conditional Bool Property bPlayerCollared = false Auto Conditional ; Quest Management Bool Property EventInProgress = false Auto Conditional Int Property iLastEventTypeID = 0 Auto String Property sNextEventTag = "none" Auto Int Property iEventTypeCount = 5 auto ; number of distinct event types that can be selected 1 = MESSAGEBOX 2 = DIALOGUE 3 = AAF 4 = DEVIOUS DEVICES 5 = PLAYER ACTION OR RESTRICTION Int Property iEvent1Count = 5 auto ; number of events of type 1 Int Property iEvent2Count = 5 auto Int Property iEvent3Count = 5 auto Int Property iEvent4Count = 1 auto Int Property iEvent5Count = 5 auto Float Property fMainTimerDuration = 0.1 Auto ; Player Restrictions Bool Property bNoClothes = false Auto Conditional Bool Property bNoFood = false Auto Conditional ; Local Variables Actor PlayerRefThatWorks Actor DOMREFThatWorks ;--------------------INITIALISATION--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;initialisation Function LoadAAF() AAF_API = Game.GetFormFromFile(0x00000F99, "AAF.esm") as AAF:AAF_API If !AAF_API Debug.Notification("Can't find AAF API.") utility.wait(0.1) Else RegisterForCustomEvent(AAF_API, "OnAnimationStart") RegisterForCustomEvent(AAF_API, "OnAnimationChange") RegisterForCustomEvent(AAF_API, "OnAnimationStop") RegisterForCustomEvent(AAF_API, "OnSceneInit") RegisterForCustomEvent(AAF_API, "OnSceneEnd") Endif EndFunction Event OnQuestInit() RegisterForRemoteEvent(PlayerRef, "OnPlayerLoadGame") LoadAAF() RegisterForKey(109) RegisterRemoteEvents() LoadAAF() ActorFormIDAsActor() iQuestStage = 10 EndEvent Event Actor.OnPlayerLoadGame(actor aSender) RegisterForKey(109) RegisterRemoteEvents() LoadAAF() ActorFormIDAsActor() EndEvent Function ActorFormIDAsActor() Int iPlayerID = PlayerREF.GetFormID() PlayerREFThatWorks = Game.GetForm(iPlayerID) as Actor Int iDomID = DomREF.GetFormID() DomREFThatWorks = Game.GetForm(iDomID) as Actor EndFunction Function RegisterRemoteEvents() RegisterForRemoteEvent(PlayerRefThatWorks, "OnItemEquipped") RegisterForRemoteEvent(PlayerRefThatWorks, "OnPlayerLoadGame") ;RegisterForRemoteEvent(PlayerRef, "OnPlayerLoadGame") EndFunction ;---------------------MOD ENGINE-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;DETERMINES IF THERE SHOULD BE AN EVENT ; Timer Template Function Timer(float fTimer, int iTimerID) StartTimerGameTime(fTimer, iTimerID) ; in game hours EndFunction ;RandomNumber - FOR GENERATING RANDOM NUMBERS int Function RandomNumber( int iMin, int iMax) int iRand = Utility.RandomInt(iMin, iMax) return iRand EndFunction ; Event Manager Function EventManager() EventInProgress = !EventInProgress EndFunction Event OnKeyDown(int keyCode) if (keyCode == 109 ) If EventInProgress == true if bPlayerKneeling == false Debug.Notification("Please wait for the current GDX event to end") elseif bPlayerKneeling == true PlayerKneel() EndIf ElseIf EventInProgress == false MessageBoxMain() EndIf endif EndEvent Event OnTimerGameTime(int aiTimerID) ; TIMER 10 IS THE MAINQUEST TIMER, 11 RESTRICTION TIMER, 12 IS DEVIOUS DEVICES If aiTimerID == 10 If EventInProgress == true Timer(fMainTimerDuration, 10) ElseIf EventInProgress == false If (playerRef.HasKeyword(AAF_API.AAF_ActorBusy)) || PlayerRef.IsTalking() == true Timer(fMainTimerDuration, 10) Else Debug.Notification("GDX Event!") EventChecker() EndIf EndIf elseIf aiTimerID == 11 ; elseIf aiTimerID == 12 ;debug.messagebox("DD event timer expired") Type4Event2() EndIf EndEvent ;---------------------EVENT SELECTOR-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;DETERMINES WHAT EVENT SHOULD HAPPEN ;Dom Mood - converts mood into String for use in tags String Function DomMood(int x) global String sDomMood If x >= -5 && x <= 5 sDomMood = "Neutral" ElseIf x < -5 sDomMood = "Aggressive" ElseIf x > 5 sDomMood = "Loving" EndIf Return sDomMood EndFunction ;CHECKS THAT WE ARE NOT WAITING TO FOLLOWUP WITH A SPECIFIC JEVENT Function EventChecker() If sNextEventTag == "none" EventInProgress = true EventTypeSelector() ElseIf sNextEventTag == "ExampleFollowUpEvent" ExampleFollowUpEvent() EndIf EndFunction ; SELECTS A RANDOM EVENT TYPE, ENSURING IT IS NOT THE SAME AS THE LAST ONE Function EventTypeSelector() int iTypeID = RandomNumber(1,iEventTypeCount) if iTypeID == iLastEventTypeID EventChecker() ElseIf iTypeID == 1 iLastEventTypeID = 1 EventSelector(iTypeID) ElseIf iTypeID == 2 iLastEventTypeID = 2 EventSelector(iTypeID) ElseIf iTypeID == 3 iLastEventTypeID = 3 EventSelector(iTypeID) ElseIf iTypeID == 4 iLastEventTypeID = 4 EventSelector(iTypeID) ElseIf iTypeID == 5 iLastEventTypeID = 5 EventSelector(iTypeID) EndIF EndFunction ;SELECTS A RANDOM EVENT OF THE GIVEN TYPE Function EventSelector(int type) If type == 1 int iEventID = RandomNumber(1,iEvent1Count) if iEventID == 1 Type1Event1() ElseiF iEventID == 2 Type1Event2() ElseiF iEventID == 3 Type1Event3() ElseiF iEventID == 4 Type1Event4() ElseiF iEventID == 5 Type1Event5() EndIf ElseIf type == 2 int iEventID = RandomNumber(1,iEvent2Count) if iEventID == 1 Type2Event1() ElseiF iEventID == 2 Type2Event2() ElseiF iEventID == 3 Type2Event3() ElseiF iEventID == 4 Type2Event4() ElseiF iEventID == 5 Type2Event5() EndIf ElseIf type == 3 int iEventID = RandomNumber(1,iEvent3Count) if iEventID == 1 Type3Event1() ElseiF iEventID == 2 Type3Event2() ElseiF iEventID == 3 Type3Event3() ElseiF iEventID == 4 Type3Event4() ElseiF iEventID == 5 Type3Event5() EndIf ElseIf type == 4 int iEventID = RandomNumber(1,iEvent4Count) if iEventID == 1 Type4Event1() ElseiF iEventID == 2 Type4Event2() ElseiF iEventID == 3 Type4Event3() ElseiF iEventID == 4 Type4Event4() ElseiF iEventID == 5 Type4Event5() EndIf ElseIf type == 5 int iEventID = RandomNumber(1,iEvent5Count) if iEventID == 1 Type5Event1() ElseiF iEventID == 2 Type5Event2() ElseiF iEventID == 3 Type5Event3() ElseiF iEventID == 4 Type5Event4() ElseiF iEventID == 5 Type5Event5() EndIf EndIf EndFunction ;Event Complete Function EventComplete() ;do stuff EventInProgress = false Timer(fMainTimerDuration, 10) ; start the event timer again EndFunction ;---------------------GENERIC EVENTS-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;--------------TYPE 1 EVENTS - MESSAGE BOX------------- Function Type1Event1() sNextEventTag = "ExampleFollowUpEvent" ;do event stuff Debug.MessageBox("Type1Event1") EventComplete() EndFunction Function Type1Event2() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type1Event2") EventComplete() EndFunction Function Type1Event3() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type1Event3") EventComplete() EndFunction Function Type1Event4() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type1Event4") EventComplete() EndFunction Function Type1Event5() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type1Event5") EventComplete() EndFunction ;--------------TYPE 2 EVENTS - DIALOGUE------------- Function Type2Event1() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type2Event1") EventComplete() EndFunction Function Type2Event2() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type2Event2") EventComplete() EndFunction Function Type2Event3() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type2Event3") EventComplete() EndFunction Function Type2Event4() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type2Event4") EventComplete() EndFunction Function Type2Event5() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type2Event5") EventComplete() EndFunction ;--------------TYPE 3 EVENTS - AAF------------- Function Type3Event1() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type3Event1") EventComplete() EndFunction Function Type3Event2() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type3Event2") EventComplete() EndFunction Function Type3Event3() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type3Event3") EventComplete() EndFunction Function Type3Event4() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type3Event4") EventComplete() EndFunction Function Type3Event5() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type3Event5") EventComplete() EndFunction ;--------------TYPE 4 EVENTS - DEVIOUS DEVICES------------- ; EQUIPING/REMOVING/USING DEVIOUS DEVICES Function Type4Event1() ;TALK ABOUT DEVICES sNextEventTag = "none" ;do event stuff Debug.MessageBox("Talk about devices") bDDTalk = true bApproachPlayer = true iQuestStage = 30 EventComplete() EndFunction Function Type4Event2() ; DEVICE REACTIONS sNextEventTag = "none" ;do event stuff If bPlayerCollared == true Debug.Notification("You are suddenly very aware of the collar around your neck") Timer(0.2, 12) EndIf EventComplete() EndFunction Function Type4Event3() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type4Event3") EventComplete() EndFunction Function Type4Event4() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type4Event4") EventComplete() EndFunction Function Type4Event5() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type4Event5") EventComplete() EndFunction ;--------------TYPE 5 EVENTS - PLAYER ACTION OR RESTRICTION------------- ; Function Type5Event1() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type5Event1") EventComplete() EndFunction Function Type5Event2() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type5Event2") EventComplete() EndFunction Function Type5Event3() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type5Event3") EventComplete() EndFunction Function Type5Event4() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type5Event4") EventComplete() EndFunction Function Type5Event5() sNextEventTag = "none" ;do event stuff Debug.MessageBox("Type5Event5") EventComplete() EndFunction ;---------------------FOLLOWUP EVENTS-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;THESE EVENTS BYPASS THE RANDOM SYSTEM WHEN THE PARENT EVENT IS THE LAST ONE RUN Function ExampleFollowUpEvent() iLastEventTypeID = 0 sNextEventTag = "none" ;do event stuff Debug.MessageBox("example followup event selected") EventComplete() EndFunction ;---------------------STANDALONE EVENTS-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;THE CAN BE USED BY SCRIPT FRAGMENTS ETC WHEN A SPECIFIC EVENT IS REQUIRED Function ExampleStandAloneEvent() iLastEventTypeID = 0 sNextEventTag = "none" ;do event stuff Debug.MessageBox("example followup event selected") EventComplete() EndFunction Function DDEquip(string device, bool equip) iLastEventTypeID = 0 sNextEventTag = "none" ;do event stuf If device == "collar" if equip == true debug.notification("collar equipped") DDLibrary.EquipDevice(PlayerRefThatWorks, DDLibrary.DD_Collar_Leather_Black_Inventory) bPlayerCollared = true Timer(0.2, 12) else debug.notification("collar removed") DDLibrary.RemoveDevice(PlayerRefThatWorks, DDLibrary.DD_Collar_Leather_Black_Inventory) bPlayerCollared = false EndIf ElseIf device == "gag" if equip == true debug.notification("gag equipped") DDLibrary.EquipDevice(PlayerRefThatWorks, DDLibrary.DD_Gag_Ball_Harness_Inventory) bPlayerGagged = true Timer(0.2, 12) else debug.notification("collar removed") DDLibrary.RemoveDevice(PlayerRefThatWorks, DDLibrary.DD_Gag_Ball_Harness_Inventory) bPlayerGagged = false endif EndIF DeviousAssessment() EventComplete() EndFunction ;stop giving device comments if none are equipped Function DeviousAssessment() If bPlayerBound == false && bPlayerGagged == false && bPlayerChaste == false && bPlayerChasteBra == false && bPlayerCollared == false CancelTimerGameTime(12) EndIf EndFunction ;---------------------MENU & ACTIONS-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;CONTROLS THE MAIN MOD INTERACTION MENU, ACTIONS PLAYER CAN TAKE AUTONOMOUSLY ; Message Box Template Function MessageBoxMain() Int iButton = MessageBoxMain.Show() If iButton == 0 ConsentManager() return elseif iButton == 1 ConsentManager() return elseif iButton == 2 PlayerKneel() elseif iButton == 3 PlayerKneel() return elseif iButton == 4 AAFStartCouple(PlayerREF, DomREF, 10, true, true, "","DomMood(iDomMood)","Aggressive","Kissing") return elseif iButton == 5 AAFStartSolo(PlayerREF, 20, true, true,"", "F", "Aggressive", "Masturbation,F") return elseif iButton == 6 AAFStartSolo(PlayerRefThatWorks, 20, true, true,"", "F", "Aggressive","SexyDance") return elseif iButton == 7 DDLibrary.EquipDevice(PlayerRefThatWorks, DDLibrary.DD_Collar_Leather_Black_Inventory) return elseif iButton == 8 DDLibrary.RemoveDevice(PlayerRefThatWorks, DDLibrary.DD_Collar_Leather_Black_Inventory) return endif EndFunction ;CONSENT MODE Function ConsentManager() ConsentToggle = !ConsentToggle If ConsentToggle == true Debug.Notification("Consent Given") Timer(0.1, 10) Elseif ConsentToggle == false Debug.Notification("Consent Revoked") CancelTimerGameTime(10) EndIf EndFunction ;PLAYER KNEEL Function PlayerKneel() EventManager() if bPlayerKneeling == false Debug.Notification("You sink to your knees in submission.") Game.ForceThirdPerson() utility.wait(0.2) PlayerRefThatWorks.PlayIdle(SubmissionIdle) bPlayerKneeling = true elseif bPlayerKneeling == true Debug.Notification("You spring to your feet, eager to please.") PlayerRefThatWorks.PlayIdle(StopIdle) bPlayerKneeling = false EndIf EndFunction ;---------------------REACTION EVENTS-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;RESPONDING TO PLAYER ACTIVITY ; Player eats food event example Event Actor.OnItemEquipped(Actor akSource, Form akBaseObject, ObjectReference akReference) if akBaseObject.HasKeyword(ObjectTypeFood) Debug.notification("Player Ate Food") endIf EndEvent ;---------------------AAF MANAGEMENT-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;AAF Couple Template Function AAFStartCouple(actor aSexActor0, actor aSexActor1, float fDuration, Bool bPreventFurniture, Bool bUsePackages, String sPosition, String sIncludeTags, String sExcludeTags, String sCombinedTags) Debug.Notification("started aaf Couple function") Actor[] Actors = new Actor[2] actors[0] = aSexActor0 actors[1] = aSexActor1 AAF:AAF_API:SceneSettings settings = AAF_API.GetSceneSettings() settings.duration = fDuration settings.preventFurniture = bPreventFurniture settings.usePackages = bUsePackages settings.Position = sPosition settings.includeTags = sIncludeTags settings.excludeTags = sExcludeTags settings.combinedTags = sCombinedTags AAF_API.StartScene(actors, settings) EndFunction ;AAF SoloTemplate Function AAFStartSolo(actor aSexActor0, float fDuration, Bool bPreventFurniture, Bool bUsePackages, String sPosition, String sIncludeTags, String sExcludeTags, String sCombinedTags) Debug.Notification("started aaf Solo function") Actor[] Actors = new Actor[1] actors[0] = aSexActor0 AAF:AAF_API:SceneSettings settings = AAF_API.GetSceneSettings() settings.duration = fDuration settings.preventFurniture = bPreventFurniture settings.usePackages = bUsePackages settings.Position = sPosition settings.includeTags = sIncludeTags settings.excludeTags = sExcludeTags settings.combinedTags = sCombinedTags EndFunction
dagobaking Posted October 3, 2019 Posted October 3, 2019 I think the first thing to try is to set up a function for the "OnSceneInit" event and check to see that is getting called. If it is, then there should be some information in there about potential errors.
gammons123 Posted October 3, 2019 Author Posted October 3, 2019 Thanks for the assistance - it is working now! One function was not working because I was calling a position it could not find. This is becuase I used "" is it possible to specifict a empty position? or make arguments on a function optional? The second one was not wokring becuase I apparently deleted the line that actually started AAF... because i'm an idiot. Thanks again.
dagobaking Posted October 3, 2019 Posted October 3, 2019 2 hours ago, gammons123 said: Thanks for the assistance - it is working now! Good to hear! 2 hours ago, gammons123 said: One function was not working because I was calling a position it could not find. This is becuase I used "" is it possible to specifict a empty position? or make arguments on a function optional? I think it would work to use None instead of "" You don't have to enter any of the SceneSettings values. They all are set to defaults initially. So, you just enter the ones that you need to affect in the situation.
Recommended Posts
Archived
This topic is now archived and is closed to further replies.