Tentacus Posted June 27, 2019 Posted June 27, 2019 Hi My name is Tentacus and I was writing (self taught) Papyrus scripts for half a year before I knew "!=" was a thing. Six months later I found out about "||" and "&&" and it blew my fucking mind. What are your shameful amateur coder admissions.
Reginald_001 Posted June 27, 2019 Posted June 27, 2019 I'll just drop this here, then I'll back out gently, pretending I never shared this piece of code... I tried putting this in a spoiler tag but the forum software is bugged and doesn't allow code inside a spoiler tag. And I'm forced to use the CODE tag, otherwise it makes smilies out of half of this code, regardless of 'plain text' settings.. so PUH. What this does is.. set a global variable to a magazine number, so Ivy could remark on magazine pickups by the player. Scriptname _ivyMagFollower extends ReferenceAlias ReferenceAlias Property p_IvyCompQAlias Auto Const Scene Property _ivy_PornMagsQuest_InstallerPatch Auto Const Scene Property p_ivy_PornMagsQuest_Dialogue Auto Const Bool Property IvyIsWaitingToSpeak = False Auto Topic Property _IvysMagazineResponses Auto Const Keyword Property _IvyPornMagKeyword Auto Const Keyword Property _IvyPornMagKeyword_01 Auto Const Keyword Property _IvyPornMagKeyword_02 Auto Const Keyword Property _IvyPornMagKeyword_03 Auto Const Keyword Property _IvyPornMagKeyword_04 Auto Const Keyword Property _IvyPornMagKeyword_05 Auto Const Keyword Property _IvyPornMagKeyword_06 Auto Const Keyword Property _IvyPornMagKeyword_07 Auto Const Keyword Property _IvyPornMagKeyword_08 Auto Const Keyword Property _IvyPornMagKeyword_09 Auto Const Keyword Property _IvyPornMagKeyword_10 Auto Const Keyword Property _IvyPornMagKeyword_11 Auto Const Keyword Property _IvyPornMagKeyword_12 Auto Const Keyword Property _IvyPornMagKeyword_13 Auto Const Keyword Property _IvyPornMagKeyword_14 Auto Const Keyword Property _IvyPornMagKeyword_15 Auto Const Keyword Property _IvyPornMagKeyword_16 Auto Const Keyword Property _IvyPornMagKeyword_17 Auto Const Keyword Property _IvyPornMagKeyword_18 Auto Const Keyword Property _IvyPornMagKeyword_19 Auto Const Keyword Property _IvyPornMagKeyword_20 Auto Const Keyword Property _IvyPornMagKeyword_21 Auto Const Keyword Property _IvyPornMagKeyword_22 Auto Const Keyword Property _IvyPornMagKeyword_23 Auto Const Keyword Property _IvyPornMagKeyword_24 Auto Const Keyword Property _IvyPornMagKeyword_25 Auto Const Keyword Property _IvyPornMagKeyword_26 Auto Const Keyword Property _IvyPornMagKeyword_27 Auto Const Keyword Property _IvyPornMagKeyword_28 Auto Const Keyword Property _IvyPornMagKeyword_29 Auto Const Keyword Property _IvyPornMagKeyword_30 Auto Const Keyword Property _IvyPornMagKeyword_31 Auto Const Keyword Property _IvyPornMagKeyword_32 Auto Const Keyword Property _IvyPornMagKeyword_33 Auto Const Keyword Property _IvyPornMagKeyword_34 Auto Const Keyword Property _IvyPornMagKeyword_35 Auto Const Keyword Property _IvyPornMagKeyword_36 Auto Const Keyword Property _IvyPornMagKeyword_37 Auto Const Keyword Property _IvyPornMagKeyword_38 Auto Const Keyword Property _IvyPornMagKeyword_39 Auto Const Keyword Property _IvyPornMagKeyword_40 Auto Const Keyword Property _IvyPornMagKeyword_41 Auto Const Keyword Property _IvyPornMagKeyword_42 Auto Const Keyword Property _IvyPornMagKeyword_43 Auto Const Keyword Property _IvyPornMagKeyword_44 Auto Const Keyword Property _IvyPornMagKeyword_45 Auto Const Keyword Property _IvyPornMagKeyword_46 Auto Const Keyword Property _IvyPornMagKeyword_47 Auto Const Keyword Property _IvyPornMagKeyword_48 Auto Const Keyword Property _IvyPornMagKeyword_49 Auto Const Keyword Property _IvyPornMagKeyword_50 Auto Const Keyword Property _IvyPornMagKeyword_51 Auto Const Keyword Property _IvyPornMagKeyword_52 Auto Const Keyword Property _IvyPornMagKeyword_53 Auto Const Keyword Property _IvyPornMagKeyword_54 Auto Const Keyword Property _IvyPornMagKeyword_55 Auto Const Keyword Property _IvyPornMagKeyword_56 Auto Const Keyword Property _IvyPornMagKeyword_57 Auto Const Keyword Property _IvyPornMagKeyword_58 Auto Const Keyword Property _IvyPornMagKeyword_59 Auto Const Keyword Property _IvyPornMagKeyword_60 Auto Const Keyword Property _IvyPornMagKeyword_61 Auto Const Keyword Property _IvyPornMagKeyword_62 Auto Const Keyword Property _IvyPornMagKeyword_63 Auto Const Keyword Property _IvyPornMagKeyword_64 Auto Const Keyword Property _IvyPornMagKeyword_65 Auto Const Keyword Property _IvyPornMagKeyword_66 Auto Const Keyword Property _IvyPornMagKeyword_67 Auto Const Keyword Property _IvyPornMagKeyword_68 Auto Const Keyword Property _IvyPornMagKeyword_69 Auto Const Keyword Property _IvyPornMagKeyword_70 Auto Const Keyword Property _IvyPornMagKeyword_71 Auto Const Keyword Property _IvyPornMagKeyword_72 Auto Const GlobalVariable Property _ivy_LasFoundMag Auto Const Event oninit() Addinventoryeventfilter(_IvyPornMagKeyword) Endevent Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) Actor Ivy = p_IvyCompQAlias.GetActorRef() ;Debug.Trace("Ivy sees you picking up a porn magazine") ;'reset' global to -1 as a reset. if akBaseItem.HasKeyword(_IvyPornMagKeyword) Debug.Trace("Ivy is ready to speak about the porn magazine") _ivy_LasFoundMag.SetValueInt(-1) if akBaseItem.HasKeyword(_IvyPornMagKeyword_01) _ivy_LasFoundMag.SetValueInt(1) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_02) _ivy_LasFoundMag.SetValueInt(2) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_03) _ivy_LasFoundMag.SetValueInt(3) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_04) _ivy_LasFoundMag.SetValueInt(4) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_05) _ivy_LasFoundMag.SetValueInt(5) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_06) _ivy_LasFoundMag.SetValueInt(6) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_07) _ivy_LasFoundMag.SetValueInt(7) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_08) _ivy_LasFoundMag.SetValueInt(8) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_09) _ivy_LasFoundMag.SetValueInt(9) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_10) _ivy_LasFoundMag.SetValueInt(10) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_11) _ivy_LasFoundMag.SetValueInt(11) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_12) _ivy_LasFoundMag.SetValueInt(12) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_13) _ivy_LasFoundMag.SetValueInt(13) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_14) _ivy_LasFoundMag.SetValueInt(14) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_15) _ivy_LasFoundMag.SetValueInt(15) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_16) _ivy_LasFoundMag.SetValueInt(16) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_17) _ivy_LasFoundMag.SetValueInt(17) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_18) _ivy_LasFoundMag.SetValueInt(18) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_19) _ivy_LasFoundMag.SetValueInt(19) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_20) _ivy_LasFoundMag.SetValueInt(20) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_21) _ivy_LasFoundMag.SetValueInt(21) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_22) _ivy_LasFoundMag.SetValueInt(22) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_23) _ivy_LasFoundMag.SetValueInt(23) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_24) _ivy_LasFoundMag.SetValueInt(24) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_25) _ivy_LasFoundMag.SetValueInt(25) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_26) _ivy_LasFoundMag.SetValueInt(26) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_27) _ivy_LasFoundMag.SetValueInt(27) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_28) _ivy_LasFoundMag.SetValueInt(28) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_29) _ivy_LasFoundMag.SetValueInt(29) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_30) _ivy_LasFoundMag.SetValueInt(30) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_31) _ivy_LasFoundMag.SetValueInt(31) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_32) _ivy_LasFoundMag.SetValueInt(32) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_33) _ivy_LasFoundMag.SetValueInt(33) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_34) _ivy_LasFoundMag.SetValueInt(34) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_35) _ivy_LasFoundMag.SetValueInt(35) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_36) _ivy_LasFoundMag.SetValueInt(36) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_37) _ivy_LasFoundMag.SetValueInt(37) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_38) _ivy_LasFoundMag.SetValueInt(38) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_39) _ivy_LasFoundMag.SetValueInt(39) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_40) _ivy_LasFoundMag.SetValueInt(40) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_41) _ivy_LasFoundMag.SetValueInt(41) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_42) _ivy_LasFoundMag.SetValueInt(42) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_43) _ivy_LasFoundMag.SetValueInt(43) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_44) _ivy_LasFoundMag.SetValueInt(44) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_45) _ivy_LasFoundMag.SetValueInt(45) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_46) _ivy_LasFoundMag.SetValueInt(46) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_47) _ivy_LasFoundMag.SetValueInt(47) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_48) _ivy_LasFoundMag.SetValueInt(48) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_49) _ivy_LasFoundMag.SetValueInt(49) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_50) _ivy_LasFoundMag.SetValueInt(50) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_51) _ivy_LasFoundMag.SetValueInt(51) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_52) _ivy_LasFoundMag.SetValueInt(52) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_53) _ivy_LasFoundMag.SetValueInt(53) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_54) _ivy_LasFoundMag.SetValueInt(54) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_55) _ivy_LasFoundMag.SetValueInt(55) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_56) _ivy_LasFoundMag.SetValueInt(56) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_57) _ivy_LasFoundMag.SetValueInt(57) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_58) _ivy_LasFoundMag.SetValueInt(58) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_59) _ivy_LasFoundMag.SetValueInt(59) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_60) _ivy_LasFoundMag.SetValueInt(60) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_61) _ivy_LasFoundMag.SetValueInt(61) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_62) _ivy_LasFoundMag.SetValueInt(62) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_63) _ivy_LasFoundMag.SetValueInt(63) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_64) _ivy_LasFoundMag.SetValueInt(64) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_65) _ivy_LasFoundMag.SetValueInt(65) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_66) _ivy_LasFoundMag.SetValueInt(66) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_67) _ivy_LasFoundMag.SetValueInt(67) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_68) _ivy_LasFoundMag.SetValueInt(68) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_69) _ivy_LasFoundMag.SetValueInt(69) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_70) _ivy_LasFoundMag.SetValueInt(70) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_71) _ivy_LasFoundMag.SetValueInt(71) endif if akBaseItem.HasKeyword(_IvyPornMagKeyword_72) _ivy_LasFoundMag.SetValueInt(72) endif IvyIsWaitingToSpeak = True Utility.Wait(2) p_ivy_PornMagsQuest_Dialogue.Start() IvyIsWaitingToSpeak = False endif Endevent Interesting to note that all that became this: Scriptname _ivy_Mag_Pickup extends ObjectReference Const Scene Property p_ivy_PornMagsQuest_Dialogue Auto Const Mandatory {AutoFill} GlobalVariable Property p_ivy_LasFoundMag Auto Const Mandatory {AutoFill} Int Property MagazineNumber Auto Const Mandatory {SET THE MAGAZINE NUMBER HERE} Event OnActivate(ObjectReference akActionRef) p_ivy_LasFoundMag.SetValueInt(MagazineNumber) p_ivy_PornMagsQuest_Dialogue.Start() EndEvent
Nebuchadnezzer2 Posted June 27, 2019 Posted June 27, 2019 @Reginald_001Length: 13276 Lines: 327 Into Length: 448 Lines: 14My god I mean I recently effectively made the Auto-Staged Animations Please's SavageCabbage patch, minus the transition stuff, before checking it again, and realising it's nearly identical. That kinda hurt... That's on a whole 'nother level. I sympathised already, with how much damn script work must have gone into Ivy in her current iteration At least it works consistently now?...
Reginald_001 Posted June 27, 2019 Posted June 27, 2019 3 minutes ago, Nebuchadnezzer2 said: @Reginald_001Length: 13276 Lines: 327 Into Length: 448 Lines: 14 My god I mean I recently effectively made the Auto-Staged Animations Please's SavageCabbage patch, minus the transition stuff, before checking it again, and realising it's nearly identical. That kinda hurt... That's on a whole 'nother level. I sympathised already, with how much damn script work must have gone into Ivy in her current iteration At least it works consistently now?... This? Oh this was NUTS.. So 'OnActivate' just doesn't fire 50% of the time when you pick up a magazine.. PERIOD. (It fires when there's no previous container only). It does fire 100% when you 'pick it up from a display' (e.g. you put it in a rack and are reading them). The PickUp is fired 100% when you follow the players inventory, but isn't fired when the magazine is Displayed. I wanted Ivy to speak when users have it on display, or when they pick it up so I was simply forced to hook into both events. Then the worst part of this all.. you should be able to simply grab a ref to the item that was picked up, but nooo.. it's always 'none'.. so you can't get the keyword in a generic fashion (the only way to distinguish these from each other).
Nebuchadnezzer2 Posted June 27, 2019 Posted June 27, 2019 3 minutes ago, Reginald_001 said: Then the worst part of this all.. you should be able to simply grab a ref to the item that was picked up, but nooo.. it's always 'none'.. so you can't get the keyword in a generic fashion (the only way to distinguish these from each other). What's that saying?"My kingdom for a proper programming language"?
Reginald_001 Posted June 27, 2019 Posted June 27, 2019 2 hours ago, Nebuchadnezzer2 said: What's that saying?"My kingdom for a proper programming language"? I don't really see the script parts of the CK as a programming language. It's more of a console type interface that has rudimentary object programming options. (I'm sure many will disagree with me). The function parts are pretty solid, but the interface towards the kernel and underlying engine are difficult to grasp as it simply lacks proper documentation. This forces developers to try experimentation and with the slowness of loading, the inability to re-initialize scripts in a loaded game and the sheer opaqueness of the engine and it's events and handlers makes it a pretty tough journey for any modder to plow through. In the Doom and Quake engines I had these lovely console commands, which meant you could develop your scripts while playing the game, reload your save, retry with the new scripts in place.. ReloadModels <-- reloaded all changed/updated meshes ReloadTextures <-- Dito ReloadScripts <-- just bloody awesome ReloadEngine <-- a quick reload of all engine related things. ReloadSounds <-- reload all sounds.. I still miss these commands in the CE to this day.
Nebuchadnezzer2 Posted June 27, 2019 Posted June 27, 2019 56 minutes ago, Reginald_001 said: I don't really see the script parts of the CK as a programming language. It's more of a console type interface that has rudimentary object programming options. (I'm sure many will disagree with me). The function parts are pretty solid, but the interface towards the kernel and underlying engine are difficult to grasp as it simply lacks proper documentation. This forces developers to try experimentation and with the slowness of loading, the inability to re-initialize scripts in a loaded game and the sheer opaqueness of the engine and it's events and handlers makes it a pretty tough journey for any modder to plow through. In the Doom and Quake engines I had these lovely console commands, which meant you could develop your scripts while playing the game, reload your save, retry with the new scripts in place.. ReloadModels <-- reloaded all changed/updated meshes ReloadTextures <-- Dito ReloadScripts <-- just bloody awesome ReloadEngine <-- a quick reload of all engine related things. ReloadSounds <-- reload all sounds.. I still miss these commands in the CE to this day. Yeah, in War Thunder it's something like ALT+F9 to reload/refresh the UI/User content, so you can sit in the test drive with a vehicle and fuck around adding/removing various sights and testing them there and then.sad trombone Quote interface towards the kernel and underlying engine are difficult to grasp as it simply lacks proper documentation. This forces developers to try experimentation and with the slowness of loading, the inability to re-initialize scripts in a loaded game and the sheer opaqueness of the engine and it's events and handlers makes it a pretty tough journey for any modder to plow through. Precisely why I get [too] irritated with Bethedsa. "Here, we used this, this and this. Good luck, bye" Most basic of shit's documented and that's about it, the rest is up to experimentation and your own documentation/assistance from others. I've seen in the CK "Save and Push Plugin to PC", which, while I've not fucked with it, would seem to be the closest you'd get to 'hot-loading', except it seems to be the inverse of that...
EgoBallistic Posted June 27, 2019 Posted June 27, 2019 54 minutes ago, Reginald_001 said: I still miss these commands in the CE to this day. You can kind of do those in console in F4, but it isn't super stable. fcf - force close files. This closes open plugin file handles, allowing you to save a plugin in the CK or xEdit while the game is running. hlp - hot load plugin. hlp "foo.esp" will reload it. The hot-loaded plugin is now last in the load order, so if it was losing conflicts before it will win them now, so beware of that. reloadscript - like it says. You use the script name, not the script filename. Generally, stopquest XYZQuest -> reloadscript XYZQuestScript -> resetquest XYZQuest Somewhat less hair-pulling than constantly reloading the game.
Reginald_001 Posted June 28, 2019 Posted June 28, 2019 13 hours ago, EgoBallistic said: You can kind of do those in console in F4, but it isn't super stable. fcf - force close files. This closes open plugin file handles, allowing you to save a plugin in the CK or xEdit while the game is running. hlp - hot load plugin. hlp "foo.esp" will reload it. The hot-loaded plugin is now last in the load order, so if it was losing conflicts before it will win them now, so beware of that. reloadscript - like it says. You use the script name, not the script filename. Generally, stopquest XYZQuest -> reloadscript XYZQuestScript -> resetquest XYZQuest Somewhat less hair-pulling than constantly reloading the game. Going to give this a shot in the weekend. Awesome.
SexDwarf2250 Posted June 29, 2019 Posted June 29, 2019 I enjoy non-structured programming and find object-oriented programming annoying. Comments are extremely optional.
Carabosse Posted June 29, 2019 Posted June 29, 2019 Not knowing about the modulo operator. It's not an over exaggeration to say that it changed my life. Similarly, realising there were functions like floor, ceiling, abs already in the math script. You mean I can do all these things with a simple function call?
Carreau Posted July 10, 2019 Posted July 10, 2019 I made a hud widget a year ago that just absolutely sucked monkey balls. It could track some stats for the player and like one companion, but because I had no clue how flash actually worked, it was all ham fisted into one class object and I was using papyrus calls through Hud framework to hide certain bits and pieces through changing the alpha level of the symbols. The absurd amount of different papyrus commands I made to action and toggle specific items in the wodget was absurd. I think I had like 6 or 7 functions and each passed some kind of flag variable to target the player part or the companion part. i recently remade the whole thing and cut it down to three papyrus functions in total, and made the widget much cleaner and easy to work on. Who knew understanding object oriented programming was a good step to making fetish huds?
Carreau Posted July 10, 2019 Posted July 10, 2019 On 6/27/2019 at 3:08 PM, EgoBallistic said: You can kind of do those in console in F4, but it isn't super stable. fcf - force close files. This closes open plugin file handles, allowing you to save a plugin in the CK or xEdit while the game is running. hlp - hot load plugin. hlp "foo.esp" will reload it. The hot-loaded plugin is now last in the load order, so if it was losing conflicts before it will win them now, so beware of that. reloadscript - like it says. You use the script name, not the script filename. Generally, stopquest XYZQuest -> reloadscript XYZQuestScript -> resetquest XYZQuest Somewhat less hair-pulling than constantly reloading the game. You may have just shaved hours off my workflow. Constant game loads and exits to make changes to the plugin eat up a major chunk of my time
Nordir Posted September 21, 2019 Posted September 21, 2019 My biggest nemesis are typos that will compile. You look over the blocks and loops and functions several times and just can't find them, wondering why the hell something isn't working.
gammons123 Posted September 29, 2019 Posted September 29, 2019 After rebuilding my code in a new .esp I spent 2 hours trying to figure out why the Devious Devices API wasn't working anymore. I hadn't filled the API property. ?
Recommended Posts
Archived
This topic is now archived and is closed to further replies.